diff options
414 files changed, 9320 insertions, 2980 deletions
diff --git a/api/current.txt b/api/current.txt index 28791c463d5c..1287c74e370b 100644 --- a/api/current.txt +++ b/api/current.txt @@ -2112,22 +2112,6 @@ package android { field public static final int Theme_Light_Panel = 16973914; // 0x103005a field public static final int Theme_Light_WallpaperSettings = 16973922; // 0x1030062 field public static final int Theme_Material = 16974372; // 0x1030224 - field public static final int Theme_Material_DayNight = 16974548; // 0x10302d4 - field public static final int Theme_Material_DayNight_DarkActionBar = 16974549; // 0x10302d5 - field public static final int Theme_Material_DayNight_Dialog = 16974550; // 0x10302d6 - field public static final int Theme_Material_DayNight_DialogWhenLarge = 16974556; // 0x10302dc - field public static final int Theme_Material_DayNight_DialogWhenLarge_DarkActionBar = 16974568; // 0x10302e8 - field public static final int Theme_Material_DayNight_DialogWhenLarge_NoActionBar = 16974557; // 0x10302dd - field public static final int Theme_Material_DayNight_Dialog_Alert = 16974551; // 0x10302d7 - field public static final int Theme_Material_DayNight_Dialog_MinWidth = 16974552; // 0x10302d8 - field public static final int Theme_Material_DayNight_Dialog_NoActionBar = 16974553; // 0x10302d9 - field public static final int Theme_Material_DayNight_Dialog_NoActionBar_MinWidth = 16974554; // 0x10302da - field public static final int Theme_Material_DayNight_Dialog_Presentation = 16974555; // 0x10302db - field public static final int Theme_Material_DayNight_NoActionBar = 16974558; // 0x10302de - field public static final int Theme_Material_DayNight_NoActionBar_Fullscreen = 16974559; // 0x10302df - field public static final int Theme_Material_DayNight_NoActionBar_Overscan = 16974560; // 0x10302e0 - field public static final int Theme_Material_DayNight_NoActionBar_TranslucentDecor = 16974561; // 0x10302e1 - field public static final int Theme_Material_DayNight_Panel = 16974562; // 0x10302e2 field public static final int Theme_Material_Dialog = 16974373; // 0x1030225 field public static final int Theme_Material_DialogWhenLarge = 16974379; // 0x103022b field public static final int Theme_Material_DialogWhenLarge_NoActionBar = 16974380; // 0x103022c @@ -2141,7 +2125,6 @@ package android { field public static final int Theme_Material_Light_DarkActionBar = 16974392; // 0x1030238 field public static final int Theme_Material_Light_Dialog = 16974393; // 0x1030239 field public static final int Theme_Material_Light_DialogWhenLarge = 16974399; // 0x103023f - field public static final int Theme_Material_Light_DialogWhenLarge_DarkActionBar = 16974567; // 0x10302e7 field public static final int Theme_Material_Light_DialogWhenLarge_NoActionBar = 16974400; // 0x1030240 field public static final int Theme_Material_Light_Dialog_Alert = 16974394; // 0x103023a field public static final int Theme_Material_Light_Dialog_MinWidth = 16974395; // 0x103023b @@ -2597,6 +2580,21 @@ package android { field public static final int Widget_Toolbar = 16974311; // 0x10301e7 field public static final int Widget_Toolbar_Button_Navigation = 16974312; // 0x10301e8 field public static final int Widget_WebView = 16973875; // 0x1030033 + field public static final int __reserved10 = 16974550; // 0x10302d6 + field public static final int __reserved11 = 16974551; // 0x10302d7 + field public static final int __reserved12 = 16974552; // 0x10302d8 + field public static final int __reserved13 = 16974553; // 0x10302d9 + field public static final int __reserved14 = 16974554; // 0x10302da + field public static final int __reserved15 = 16974555; // 0x10302db + field public static final int __reserved16 = 16974556; // 0x10302dc + field public static final int __reserved17 = 16974557; // 0x10302dd + field public static final int __reserved18 = 16974558; // 0x10302de + field public static final int __reserved19 = 16974559; // 0x10302df + field public static final int __reserved20 = 16974560; // 0x10302e0 + field public static final int __reserved21 = 16974561; // 0x10302e1 + field public static final int __reserved22 = 16974562; // 0x10302e2 + field public static final int __reserved8 = 16974548; // 0x10302d4 + field public static final int __reserved9 = 16974549; // 0x10302d5 } public static final class R.transition { @@ -5699,7 +5697,6 @@ package android.app.admin { field public static final java.lang.String ACTION_PASSWORD_FAILED = "android.app.action.ACTION_PASSWORD_FAILED"; field public static final java.lang.String ACTION_PASSWORD_SUCCEEDED = "android.app.action.ACTION_PASSWORD_SUCCEEDED"; field public static final java.lang.String ACTION_PROFILE_PROVISIONING_COMPLETE = "android.app.action.PROFILE_PROVISIONING_COMPLETE"; - field public static final java.lang.String ACTION_READY_FOR_USER_INITIALIZATION = "android.app.action.READY_FOR_USER_INITIALIZATION"; field public static final java.lang.String DEVICE_ADMIN_META_DATA = "android.app.device_admin"; field public static final java.lang.String EXTRA_DISABLE_WARNING = "android.app.extra.DISABLE_WARNING"; field public static final java.lang.String EXTRA_LOCK_TASK_PACKAGE = "android.app.extra.LOCK_TASK_PACKAGE"; @@ -5711,7 +5708,6 @@ package android.app.admin { method public void addPersistentPreferredActivity(android.content.ComponentName, android.content.IntentFilter, android.content.ComponentName); method public void addUserRestriction(android.content.ComponentName, java.lang.String); method public void clearCrossProfileIntentFilters(android.content.ComponentName); - method public void clearDeviceInitializerApp(android.content.ComponentName); method public void clearDeviceOwnerApp(java.lang.String); method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String); method public void clearUserRestriction(android.content.ComponentName, java.lang.String); @@ -5761,7 +5757,6 @@ package android.app.admin { method public boolean isActivePasswordSufficient(); method public boolean isAdminActive(android.content.ComponentName); method public boolean isApplicationHidden(android.content.ComponentName, java.lang.String); - method public boolean isDeviceInitializerApp(java.lang.String); method public boolean isDeviceOwnerApp(java.lang.String); method public boolean isLockTaskPermitted(java.lang.String); method public boolean isMasterVolumeMuted(android.content.ComponentName); @@ -5780,7 +5775,6 @@ package android.app.admin { method public void setCameraDisabled(android.content.ComponentName, boolean); method public void setCertInstallerPackage(android.content.ComponentName, java.lang.String) throws java.lang.SecurityException; method public void setCrossProfileCallerIdDisabled(android.content.ComponentName, boolean); - method public boolean setDeviceInitializer(android.content.ComponentName, android.content.ComponentName) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setGlobalSetting(android.content.ComponentName, java.lang.String, java.lang.String); method public boolean setKeyguardDisabled(android.content.ComponentName, boolean); method public void setKeyguardDisabledFeatures(android.content.ComponentName, int); @@ -5813,7 +5807,6 @@ package android.app.admin { method public void setSystemUpdatePolicy(android.content.ComponentName, android.app.admin.SystemUpdatePolicy); method public void setTrustAgentConfiguration(android.content.ComponentName, android.content.ComponentName, android.os.PersistableBundle); method public void setUninstallBlocked(android.content.ComponentName, java.lang.String, boolean); - method public boolean setUserEnabled(android.content.ComponentName); method public void setUserIcon(android.content.ComponentName, android.graphics.Bitmap); method public boolean switchUser(android.content.ComponentName, android.os.UserHandle); method public void uninstallAllUserCaCerts(android.content.ComponentName); @@ -5842,17 +5835,10 @@ package android.app.admin { field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION"; field public static final deprecated java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM"; - field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME"; - field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE"; - field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM"; - field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER"; - field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION"; - field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_SIGNATURE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_SIGNATURE_CHECKSUM"; field public static final java.lang.String EXTRA_PROVISIONING_EMAIL_ADDRESS = "android.app.extra.PROVISIONING_EMAIL_ADDRESS"; field public static final java.lang.String EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED = "android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED"; field public static final java.lang.String EXTRA_PROVISIONING_LOCALE = "android.app.extra.PROVISIONING_LOCALE"; field public static final java.lang.String EXTRA_PROVISIONING_LOCAL_TIME = "android.app.extra.PROVISIONING_LOCAL_TIME"; - field public static final java.lang.String EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS = "android.app.extra.PROVISIONING_RESET_PROTECTION_PARAMETERS"; field public static final java.lang.String EXTRA_PROVISIONING_SKIP_ENCRYPTION = "android.app.extra.PROVISIONING_SKIP_ENCRYPTION"; field public static final java.lang.String EXTRA_PROVISIONING_TIME_ZONE = "android.app.extra.PROVISIONING_TIME_ZONE"; field public static final java.lang.String EXTRA_PROVISIONING_WIFI_HIDDEN = "android.app.extra.PROVISIONING_WIFI_HIDDEN"; @@ -15866,6 +15852,10 @@ package android.media { ctor public MediaDrmException(java.lang.String); } + public class MediaDrmResetException extends java.lang.IllegalStateException { + ctor public MediaDrmResetException(java.lang.String); + } + public final class MediaExtractor { ctor public MediaExtractor(); method public boolean advance(); @@ -17697,6 +17687,11 @@ package android.media.tv { public static final class TvContract.Channels implements android.media.tv.TvContract.BaseTvColumns { method public static final java.lang.String getVideoResolution(java.lang.String); + field public static final java.lang.String COLUMN_APP_LINK_COLOR = "app_link_color"; + field public static final java.lang.String COLUMN_APP_LINK_ICON_URI = "app_link_icon_uri"; + field public static final java.lang.String COLUMN_APP_LINK_INTENT_URI = "app_link_intent_uri"; + field public static final java.lang.String COLUMN_APP_LINK_POSTER_ART_URI = "app_link_poster_art_uri"; + field public static final java.lang.String COLUMN_APP_LINK_TEXT = "app_link_text"; field public static final java.lang.String COLUMN_DESCRIPTION = "description"; field public static final java.lang.String COLUMN_DISPLAY_NAME = "display_name"; field public static final java.lang.String COLUMN_DISPLAY_NUMBER = "display_number"; @@ -17783,6 +17778,7 @@ package android.media.tv { field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4"; field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description"; field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri"; + field public static final java.lang.String COLUMN_SEARCHABLE = "searchable"; field public static final java.lang.String COLUMN_SEASON_NUMBER = "season_number"; field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description"; field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis"; @@ -18165,6 +18161,7 @@ package android.net { method public boolean isDefaultNetworkActive(); method public static deprecated boolean isNetworkTypeValid(int); method public void registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback); + method public void registerNetworkCallback(android.net.NetworkRequest, android.app.PendingIntent); method public void releaseNetworkRequest(android.app.PendingIntent); method public void removeDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener); method public deprecated void reportBadNetwork(android.net.Network); @@ -26061,6 +26058,7 @@ package android.provider { field public static final java.lang.String EXTRA_EXCLUDE_SELF = "android.provider.extra.EXCLUDE_SELF"; field public static final java.lang.String EXTRA_INFO = "info"; field public static final java.lang.String EXTRA_LOADING = "loading"; + field public static final java.lang.String EXTRA_PROMPT = "android.provider.extra.PROMPT"; field public static final java.lang.String PROVIDER_INTERFACE = "android.content.action.DOCUMENTS_PROVIDER"; } @@ -27922,8 +27920,6 @@ package android.renderscript { public static final class ScriptGroup.Binding { ctor public ScriptGroup.Binding(android.renderscript.Script.FieldID, java.lang.Object); - method public android.renderscript.Script.FieldID getField(); - method public java.lang.Object getValue(); } public static final deprecated class ScriptGroup.Builder { @@ -28074,18 +28070,6 @@ package android.renderscript { field public static final int UPPER = 121; // 0x79 } - public static abstract class ScriptIntrinsicBLAS.Diag implements java.lang.annotation.Annotation { - } - - public static abstract class ScriptIntrinsicBLAS.Side implements java.lang.annotation.Annotation { - } - - public static abstract class ScriptIntrinsicBLAS.Transpose implements java.lang.annotation.Annotation { - } - - public static abstract class ScriptIntrinsicBLAS.Uplo implements java.lang.annotation.Annotation { - } - public class ScriptIntrinsicBlend extends android.renderscript.ScriptIntrinsic { method public static android.renderscript.ScriptIntrinsicBlend create(android.renderscript.RenderScript, android.renderscript.Element); method public void forEachAdd(android.renderscript.Allocation, android.renderscript.Allocation); @@ -30624,13 +30608,15 @@ package android.telephony { field public static final java.lang.String KEY_CARRIER_VOLTE_AVAILABLE_BOOL = "carrier_volte_available_bool"; field public static final java.lang.String KEY_CARRIER_VOLTE_PROVISIONED_BOOL = "carrier_volte_provisioned_bool"; field public static final java.lang.String KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL = "carrier_volte_tty_supported_bool"; + field public static final java.lang.String KEY_CARRIER_VVM_PACKAGE_NAME_STRING = "carrier_vvm_package_name_string"; field public static final java.lang.String KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL = "carrier_wfc_ims_available_bool"; field public static final java.lang.String KEY_CDMA_NONROAMING_NETWORKS_STRING_ARRAY = "cdma_nonroaming_networks_string_array"; field public static final java.lang.String KEY_CDMA_ROAMING_NETWORKS_STRING_ARRAY = "cdma_roaming_networks_string_array"; + field public static final java.lang.String KEY_CSP_ENABLED_BOOL = "csp_enabled_bool"; field public static final java.lang.String KEY_DEFAULT_SIM_CALL_MANAGER_STRING = "default_sim_call_manager_string"; field public static final java.lang.String KEY_DISABLE_CDMA_ACTIVATION_CODE_BOOL = "disable_cdma_activation_code_bool"; field public static final java.lang.String KEY_DTMF_TYPE_ENABLED_BOOL = "dtmf_type_enabled_bool"; - field public static final java.lang.String KEY_ENABLE_DIALER_KEY_VIBRATION_BOOL = "enable_dialer_vibration_bool"; + field public static final java.lang.String KEY_ENABLE_DIALER_KEY_VIBRATION_BOOL = "enable_dialer_key_vibration_bool"; field public static final java.lang.String KEY_GSM_NONROAMING_NETWORKS_STRING_ARRAY = "gsm_nonroaming_networks_string_array"; field public static final java.lang.String KEY_GSM_ROAMING_NETWORKS_STRING_ARRAY = "gsm_roaming_networks_string_array"; field public static final java.lang.String KEY_HAS_IN_CALL_NOISE_SUPPRESSION_BOOL = "has_in_call_noise_suppression_bool"; @@ -30681,6 +30667,9 @@ package android.telephony { field public static final java.lang.String KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL = "voicemail_notification_persistent_bool"; field public static final java.lang.String KEY_VOICE_PRIVACY_DISABLE_UI_BOOL = "voice_privacy_disable_ui_bool"; field public static final java.lang.String KEY_VOLTE_REPLACEMENT_RAT_INT = "volte_replacement_rat_int"; + field public static final java.lang.String KEY_VVM_DESTINATION_NUMBER_STRING = "vvm_destination_number_string"; + field public static final java.lang.String KEY_VVM_PORT_NUMBER_INT = "vvm_port_number_int"; + field public static final java.lang.String KEY_VVM_TYPE_STRING = "vvm_type_string"; field public static final java.lang.String KEY_WORLD_PHONE_BOOL = "world_phone_bool"; } @@ -31244,6 +31233,8 @@ package android.telephony { field public static final int SIM_STATE_PUK_REQUIRED = 3; // 0x3 field public static final int SIM_STATE_READY = 5; // 0x5 field public static final int SIM_STATE_UNKNOWN = 0; // 0x0 + field public static final java.lang.String VVM_TYPE_CVVM = "vvm_type_cvvm"; + field public static final java.lang.String VVM_TYPE_OMTP = "vvm_type_omtp"; } } @@ -34573,6 +34564,7 @@ package android.view { method public abstract void invalidate(); method public void invalidateContentRect(); method public boolean isTitleOptional(); + method public void onWindowFocusChanged(boolean); method public abstract void setCustomView(android.view.View); method public abstract void setSubtitle(java.lang.CharSequence); method public abstract void setSubtitle(int); @@ -36817,6 +36809,8 @@ package android.view { method public boolean onRequestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent); method public boolean onStartNestedScroll(android.view.View, android.view.View, int); method public void onStopNestedScroll(android.view.View); + method public void onViewAdded(android.view.View); + method public void onViewRemoved(android.view.View); method public void recomputeViewAttributes(android.view.View); method public void removeAllViews(); method public void removeAllViewsInLayout(); diff --git a/api/system-current.txt b/api/system-current.txt index 2dec0c8913aa..1f8f7a39c6c5 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -96,6 +96,7 @@ package android { field public static final java.lang.String FORCE_STOP_PACKAGES = "android.permission.FORCE_STOP_PACKAGES"; field public static final java.lang.String GET_ACCOUNTS = "android.permission.GET_ACCOUNTS"; field public static final java.lang.String GET_APP_OPS_STATS = "android.permission.GET_APP_OPS_STATS"; + field public static final java.lang.String GET_PACKAGE_IMPORTANCE = "android.permission.GET_PACKAGE_IMPORTANCE"; field public static final java.lang.String GET_PACKAGE_SIZE = "android.permission.GET_PACKAGE_SIZE"; field public static final deprecated java.lang.String GET_TASKS = "android.permission.GET_TASKS"; field public static final java.lang.String GET_TOP_ACTIVITY_INFO = "android.permission.GET_TOP_ACTIVITY_INFO"; @@ -2194,22 +2195,6 @@ package android { field public static final int Theme_Light_Panel = 16973914; // 0x103005a field public static final int Theme_Light_WallpaperSettings = 16973922; // 0x1030062 field public static final int Theme_Material = 16974372; // 0x1030224 - field public static final int Theme_Material_DayNight = 16974548; // 0x10302d4 - field public static final int Theme_Material_DayNight_DarkActionBar = 16974549; // 0x10302d5 - field public static final int Theme_Material_DayNight_Dialog = 16974550; // 0x10302d6 - field public static final int Theme_Material_DayNight_DialogWhenLarge = 16974556; // 0x10302dc - field public static final int Theme_Material_DayNight_DialogWhenLarge_DarkActionBar = 16974568; // 0x10302e8 - field public static final int Theme_Material_DayNight_DialogWhenLarge_NoActionBar = 16974557; // 0x10302dd - field public static final int Theme_Material_DayNight_Dialog_Alert = 16974551; // 0x10302d7 - field public static final int Theme_Material_DayNight_Dialog_MinWidth = 16974552; // 0x10302d8 - field public static final int Theme_Material_DayNight_Dialog_NoActionBar = 16974553; // 0x10302d9 - field public static final int Theme_Material_DayNight_Dialog_NoActionBar_MinWidth = 16974554; // 0x10302da - field public static final int Theme_Material_DayNight_Dialog_Presentation = 16974555; // 0x10302db - field public static final int Theme_Material_DayNight_NoActionBar = 16974558; // 0x10302de - field public static final int Theme_Material_DayNight_NoActionBar_Fullscreen = 16974559; // 0x10302df - field public static final int Theme_Material_DayNight_NoActionBar_Overscan = 16974560; // 0x10302e0 - field public static final int Theme_Material_DayNight_NoActionBar_TranslucentDecor = 16974561; // 0x10302e1 - field public static final int Theme_Material_DayNight_Panel = 16974562; // 0x10302e2 field public static final int Theme_Material_Dialog = 16974373; // 0x1030225 field public static final int Theme_Material_DialogWhenLarge = 16974379; // 0x103022b field public static final int Theme_Material_DialogWhenLarge_NoActionBar = 16974380; // 0x103022c @@ -2223,7 +2208,6 @@ package android { field public static final int Theme_Material_Light_DarkActionBar = 16974392; // 0x1030238 field public static final int Theme_Material_Light_Dialog = 16974393; // 0x1030239 field public static final int Theme_Material_Light_DialogWhenLarge = 16974399; // 0x103023f - field public static final int Theme_Material_Light_DialogWhenLarge_DarkActionBar = 16974567; // 0x10302e7 field public static final int Theme_Material_Light_DialogWhenLarge_NoActionBar = 16974400; // 0x1030240 field public static final int Theme_Material_Light_Dialog_Alert = 16974394; // 0x103023a field public static final int Theme_Material_Light_Dialog_MinWidth = 16974395; // 0x103023b @@ -2679,6 +2663,21 @@ package android { field public static final int Widget_Toolbar = 16974311; // 0x10301e7 field public static final int Widget_Toolbar_Button_Navigation = 16974312; // 0x10301e8 field public static final int Widget_WebView = 16973875; // 0x1030033 + field public static final int __reserved10 = 16974550; // 0x10302d6 + field public static final int __reserved11 = 16974551; // 0x10302d7 + field public static final int __reserved12 = 16974552; // 0x10302d8 + field public static final int __reserved13 = 16974553; // 0x10302d9 + field public static final int __reserved14 = 16974554; // 0x10302da + field public static final int __reserved15 = 16974555; // 0x10302db + field public static final int __reserved16 = 16974556; // 0x10302dc + field public static final int __reserved17 = 16974557; // 0x10302dd + field public static final int __reserved18 = 16974558; // 0x10302de + field public static final int __reserved19 = 16974559; // 0x10302df + field public static final int __reserved20 = 16974560; // 0x10302e0 + field public static final int __reserved21 = 16974561; // 0x10302e1 + field public static final int __reserved22 = 16974562; // 0x10302e2 + field public static final int __reserved8 = 16974548; // 0x10302d4 + field public static final int __reserved9 = 16974549; // 0x10302d5 } public static final class R.transition { @@ -5804,7 +5803,6 @@ package android.app.admin { field public static final java.lang.String ACTION_PASSWORD_FAILED = "android.app.action.ACTION_PASSWORD_FAILED"; field public static final java.lang.String ACTION_PASSWORD_SUCCEEDED = "android.app.action.ACTION_PASSWORD_SUCCEEDED"; field public static final java.lang.String ACTION_PROFILE_PROVISIONING_COMPLETE = "android.app.action.PROFILE_PROVISIONING_COMPLETE"; - field public static final java.lang.String ACTION_READY_FOR_USER_INITIALIZATION = "android.app.action.READY_FOR_USER_INITIALIZATION"; field public static final java.lang.String DEVICE_ADMIN_META_DATA = "android.app.device_admin"; field public static final java.lang.String EXTRA_DISABLE_WARNING = "android.app.extra.DISABLE_WARNING"; field public static final java.lang.String EXTRA_LOCK_TASK_PACKAGE = "android.app.extra.LOCK_TASK_PACKAGE"; @@ -5816,7 +5814,6 @@ package android.app.admin { method public void addPersistentPreferredActivity(android.content.ComponentName, android.content.IntentFilter, android.content.ComponentName); method public void addUserRestriction(android.content.ComponentName, java.lang.String); method public void clearCrossProfileIntentFilters(android.content.ComponentName); - method public void clearDeviceInitializerApp(android.content.ComponentName); method public void clearDeviceOwnerApp(java.lang.String); method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String); method public void clearProfileOwner(android.content.ComponentName); @@ -5874,7 +5871,6 @@ package android.app.admin { method public boolean isActivePasswordSufficient(); method public boolean isAdminActive(android.content.ComponentName); method public boolean isApplicationHidden(android.content.ComponentName, java.lang.String); - method public boolean isDeviceInitializerApp(java.lang.String); method public boolean isDeviceOwnerApp(java.lang.String); method public boolean isLockTaskPermitted(java.lang.String); method public boolean isMasterVolumeMuted(android.content.ComponentName); @@ -5895,7 +5891,6 @@ package android.app.admin { method public void setCameraDisabled(android.content.ComponentName, boolean); method public void setCertInstallerPackage(android.content.ComponentName, java.lang.String) throws java.lang.SecurityException; method public void setCrossProfileCallerIdDisabled(android.content.ComponentName, boolean); - method public boolean setDeviceInitializer(android.content.ComponentName, android.content.ComponentName) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setGlobalSetting(android.content.ComponentName, java.lang.String, java.lang.String); method public boolean setKeyguardDisabled(android.content.ComponentName, boolean); method public void setKeyguardDisabledFeatures(android.content.ComponentName, int); @@ -5928,7 +5923,6 @@ package android.app.admin { method public void setSystemUpdatePolicy(android.content.ComponentName, android.app.admin.SystemUpdatePolicy); method public void setTrustAgentConfiguration(android.content.ComponentName, android.content.ComponentName, android.os.PersistableBundle); method public void setUninstallBlocked(android.content.ComponentName, java.lang.String, boolean); - method public boolean setUserEnabled(android.content.ComponentName); method public void setUserIcon(android.content.ComponentName, android.graphics.Bitmap); method public boolean switchUser(android.content.ComponentName, android.os.UserHandle); method public void uninstallAllUserCaCerts(android.content.ComponentName); @@ -5959,17 +5953,10 @@ package android.app.admin { field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION"; field public static final deprecated java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM"; - field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME"; - field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE"; - field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM"; - field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER"; - field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION"; - field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_SIGNATURE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_SIGNATURE_CHECKSUM"; field public static final java.lang.String EXTRA_PROVISIONING_EMAIL_ADDRESS = "android.app.extra.PROVISIONING_EMAIL_ADDRESS"; field public static final java.lang.String EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED = "android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED"; field public static final java.lang.String EXTRA_PROVISIONING_LOCALE = "android.app.extra.PROVISIONING_LOCALE"; field public static final java.lang.String EXTRA_PROVISIONING_LOCAL_TIME = "android.app.extra.PROVISIONING_LOCAL_TIME"; - field public static final java.lang.String EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS = "android.app.extra.PROVISIONING_RESET_PROTECTION_PARAMETERS"; field public static final java.lang.String EXTRA_PROVISIONING_SKIP_ENCRYPTION = "android.app.extra.PROVISIONING_SKIP_ENCRYPTION"; field public static final java.lang.String EXTRA_PROVISIONING_TIME_ZONE = "android.app.extra.PROVISIONING_TIME_ZONE"; field public static final java.lang.String EXTRA_PROVISIONING_WIFI_HIDDEN = "android.app.extra.PROVISIONING_WIFI_HIDDEN"; @@ -17120,6 +17107,10 @@ package android.media { ctor public MediaDrmException(java.lang.String); } + public class MediaDrmResetException extends java.lang.IllegalStateException { + ctor public MediaDrmResetException(java.lang.String); + } + public final class MediaExtractor { ctor public MediaExtractor(); method public boolean advance(); @@ -19033,6 +19024,11 @@ package android.media.tv { public static final class TvContract.Channels implements android.media.tv.TvContract.BaseTvColumns { method public static final java.lang.String getVideoResolution(java.lang.String); + field public static final java.lang.String COLUMN_APP_LINK_COLOR = "app_link_color"; + field public static final java.lang.String COLUMN_APP_LINK_ICON_URI = "app_link_icon_uri"; + field public static final java.lang.String COLUMN_APP_LINK_INTENT_URI = "app_link_intent_uri"; + field public static final java.lang.String COLUMN_APP_LINK_POSTER_ART_URI = "app_link_poster_art_uri"; + field public static final java.lang.String COLUMN_APP_LINK_TEXT = "app_link_text"; field public static final java.lang.String COLUMN_BROWSABLE = "browsable"; field public static final java.lang.String COLUMN_DESCRIPTION = "description"; field public static final java.lang.String COLUMN_DISPLAY_NAME = "display_name"; @@ -19121,6 +19117,7 @@ package android.media.tv { field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4"; field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description"; field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri"; + field public static final java.lang.String COLUMN_SEARCHABLE = "searchable"; field public static final java.lang.String COLUMN_SEASON_NUMBER = "season_number"; field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description"; field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis"; @@ -19665,6 +19662,7 @@ package android.net { method public boolean isDefaultNetworkActive(); method public static deprecated boolean isNetworkTypeValid(int); method public void registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback); + method public void registerNetworkCallback(android.net.NetworkRequest, android.app.PendingIntent); method public void releaseNetworkRequest(android.app.PendingIntent); method public void removeDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener); method public deprecated void reportBadNetwork(android.net.Network); @@ -28005,6 +28003,7 @@ package android.provider { field public static final java.lang.String EXTRA_EXCLUDE_SELF = "android.provider.extra.EXCLUDE_SELF"; field public static final java.lang.String EXTRA_INFO = "info"; field public static final java.lang.String EXTRA_LOADING = "loading"; + field public static final java.lang.String EXTRA_PROMPT = "android.provider.extra.PROMPT"; field public static final java.lang.String PROVIDER_INTERFACE = "android.content.action.DOCUMENTS_PROVIDER"; } @@ -29969,8 +29968,6 @@ package android.renderscript { public static final class ScriptGroup.Binding { ctor public ScriptGroup.Binding(android.renderscript.Script.FieldID, java.lang.Object); - method public android.renderscript.Script.FieldID getField(); - method public java.lang.Object getValue(); } public static final deprecated class ScriptGroup.Builder { @@ -30121,18 +30118,6 @@ package android.renderscript { field public static final int UPPER = 121; // 0x79 } - public static abstract class ScriptIntrinsicBLAS.Diag implements java.lang.annotation.Annotation { - } - - public static abstract class ScriptIntrinsicBLAS.Side implements java.lang.annotation.Annotation { - } - - public static abstract class ScriptIntrinsicBLAS.Transpose implements java.lang.annotation.Annotation { - } - - public static abstract class ScriptIntrinsicBLAS.Uplo implements java.lang.annotation.Annotation { - } - public class ScriptIntrinsicBlend extends android.renderscript.ScriptIntrinsic { method public static android.renderscript.ScriptIntrinsicBlend create(android.renderscript.RenderScript, android.renderscript.Element); method public void forEachAdd(android.renderscript.Allocation, android.renderscript.Allocation); @@ -30917,7 +30902,6 @@ package android.service.persistentdata { method public abstract byte[] read() throws android.os.RemoteException; method public abstract void setOemUnlockEnabled(boolean) throws android.os.RemoteException; method public abstract void wipe() throws android.os.RemoteException; - method public abstract void wipeIfAllowed(android.os.Bundle, android.app.PendingIntent) throws android.os.RemoteException; method public abstract int write(byte[]) throws android.os.RemoteException; } @@ -30929,14 +30913,7 @@ package android.service.persistentdata { method public byte[] read(); method public void setOemUnlockEnabled(boolean); method public void wipe(); - method public void wipeIfAllowed(android.os.Bundle, android.app.PendingIntent); method public int write(byte[]); - field public static final java.lang.String ACTION_WIPE_IF_ALLOWED = "android.service.persistentdata.action.WIPE_IF_ALLOWED"; - field public static final java.lang.String EXTRA_WIPE_IF_ALLOWED_CALLBACK = "android.service.persistentdata.extra.WIPE_IF_ALLOWED_CALLBACK"; - field public static final int STATUS_ERROR_NETWORK_ERROR = 2; // 0x2 - field public static final int STATUS_ERROR_NOT_COMPLIANT = 3; // 0x3 - field public static final int STATUS_ERROR_REMOTE_EXCEPTION = 1; // 0x1 - field public static final int STATUS_SUCCESS = 0; // 0x0 } } @@ -32854,13 +32831,15 @@ package android.telephony { field public static final java.lang.String KEY_CARRIER_VOLTE_AVAILABLE_BOOL = "carrier_volte_available_bool"; field public static final java.lang.String KEY_CARRIER_VOLTE_PROVISIONED_BOOL = "carrier_volte_provisioned_bool"; field public static final java.lang.String KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL = "carrier_volte_tty_supported_bool"; + field public static final java.lang.String KEY_CARRIER_VVM_PACKAGE_NAME_STRING = "carrier_vvm_package_name_string"; field public static final java.lang.String KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL = "carrier_wfc_ims_available_bool"; field public static final java.lang.String KEY_CDMA_NONROAMING_NETWORKS_STRING_ARRAY = "cdma_nonroaming_networks_string_array"; field public static final java.lang.String KEY_CDMA_ROAMING_NETWORKS_STRING_ARRAY = "cdma_roaming_networks_string_array"; + field public static final java.lang.String KEY_CSP_ENABLED_BOOL = "csp_enabled_bool"; field public static final java.lang.String KEY_DEFAULT_SIM_CALL_MANAGER_STRING = "default_sim_call_manager_string"; field public static final java.lang.String KEY_DISABLE_CDMA_ACTIVATION_CODE_BOOL = "disable_cdma_activation_code_bool"; field public static final java.lang.String KEY_DTMF_TYPE_ENABLED_BOOL = "dtmf_type_enabled_bool"; - field public static final java.lang.String KEY_ENABLE_DIALER_KEY_VIBRATION_BOOL = "enable_dialer_vibration_bool"; + field public static final java.lang.String KEY_ENABLE_DIALER_KEY_VIBRATION_BOOL = "enable_dialer_key_vibration_bool"; field public static final java.lang.String KEY_GSM_NONROAMING_NETWORKS_STRING_ARRAY = "gsm_nonroaming_networks_string_array"; field public static final java.lang.String KEY_GSM_ROAMING_NETWORKS_STRING_ARRAY = "gsm_roaming_networks_string_array"; field public static final java.lang.String KEY_HAS_IN_CALL_NOISE_SUPPRESSION_BOOL = "has_in_call_noise_suppression_bool"; @@ -32911,6 +32890,9 @@ package android.telephony { field public static final java.lang.String KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL = "voicemail_notification_persistent_bool"; field public static final java.lang.String KEY_VOICE_PRIVACY_DISABLE_UI_BOOL = "voice_privacy_disable_ui_bool"; field public static final java.lang.String KEY_VOLTE_REPLACEMENT_RAT_INT = "volte_replacement_rat_int"; + field public static final java.lang.String KEY_VVM_DESTINATION_NUMBER_STRING = "vvm_destination_number_string"; + field public static final java.lang.String KEY_VVM_PORT_NUMBER_INT = "vvm_port_number_int"; + field public static final java.lang.String KEY_VVM_TYPE_STRING = "vvm_type_string"; field public static final java.lang.String KEY_WORLD_PHONE_BOOL = "world_phone_bool"; } @@ -33523,6 +33505,8 @@ package android.telephony { field public static final int SIM_STATE_PUK_REQUIRED = 3; // 0x3 field public static final int SIM_STATE_READY = 5; // 0x5 field public static final int SIM_STATE_UNKNOWN = 0; // 0x0 + field public static final java.lang.String VVM_TYPE_CVVM = "vvm_type_cvvm"; + field public static final java.lang.String VVM_TYPE_OMTP = "vvm_type_omtp"; } } @@ -36861,6 +36845,7 @@ package android.view { method public abstract void invalidate(); method public void invalidateContentRect(); method public boolean isTitleOptional(); + method public void onWindowFocusChanged(boolean); method public abstract void setCustomView(android.view.View); method public abstract void setSubtitle(java.lang.CharSequence); method public abstract void setSubtitle(int); @@ -39105,6 +39090,8 @@ package android.view { method public boolean onRequestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent); method public boolean onStartNestedScroll(android.view.View, android.view.View, int); method public void onStopNestedScroll(android.view.View); + method public void onViewAdded(android.view.View); + method public void onViewRemoved(android.view.View); method public void recomputeViewAttributes(android.view.View); method public void removeAllViews(); method public void removeAllViewsInLayout(); diff --git a/cmds/app_process/Android.mk b/cmds/app_process/Android.mk index 359969539691..7ce0846f2e7c 100644 --- a/cmds/app_process/Android.mk +++ b/cmds/app_process/Android.mk @@ -1,5 +1,12 @@ LOCAL_PATH:= $(call my-dir) +# This is a list of libraries that need to be included in order to avoid +# bad apps. This prevents a library from having a mismatch when resolving +# new/delete from an app shared library. +# See b/21032018 for more details. +app_process_common_shared_libs := \ + libwilhelm \ + include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ @@ -13,7 +20,8 @@ LOCAL_SHARED_LIBRARIES := \ libutils \ liblog \ libbinder \ - libandroid_runtime + libandroid_runtime \ + $(app_process_common_shared_libs) \ LOCAL_WHOLE_STATIC_LIBRARIES := libsigchain @@ -44,7 +52,8 @@ LOCAL_SHARED_LIBRARIES := \ libutils \ liblog \ libbinder \ - libandroid_runtime + libandroid_runtime \ + $(app_process_common_shared_libs) \ LOCAL_WHOLE_STATIC_LIBRARIES := libsigchain diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java index 146138007138..e17808744408 100644 --- a/core/java/android/app/ApplicationThreadNative.java +++ b/core/java/android/app/ApplicationThreadNative.java @@ -35,6 +35,9 @@ import android.os.RemoteException; import android.os.IBinder; import android.os.Parcel; import android.os.ParcelFileDescriptor; +import android.os.TransactionTooLargeException; +import android.util.Log; + import com.android.internal.app.IVoiceInteractor; import com.android.internal.content.ReferrerIntent; @@ -921,8 +924,13 @@ class ApplicationThreadProxy implements IApplicationThread { info.writeToParcel(data, 0); compatInfo.writeToParcel(data, 0); data.writeInt(processState); - mRemote.transact(SCHEDULE_CREATE_SERVICE_TRANSACTION, data, null, - IBinder.FLAG_ONEWAY); + try { + mRemote.transact(SCHEDULE_CREATE_SERVICE_TRANSACTION, data, null, + IBinder.FLAG_ONEWAY); + } catch (TransactionTooLargeException e) { + Log.e("CREATE_SERVICE", "Binder failure starting service; service=" + info); + throw e; + } data.recycle(); } diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 33a47b24b79d..5a0d246afc64 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -1371,6 +1371,9 @@ public class Notification implements Parcelable when = parcel.readLong(); if (parcel.readInt() != 0) { mSmallIcon = Icon.CREATOR.createFromParcel(parcel); + if (mSmallIcon.getType() == Icon.TYPE_RESOURCE) { + icon = mSmallIcon.getResId(); + } } number = parcel.readInt(); if (parcel.readInt() != 0) { @@ -1588,13 +1591,17 @@ public class Notification implements Parcelable } /** - * Flatten this notification from a parcel. + * Flatten this notification into a parcel. */ public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(1); parcel.writeLong(when); + if (mSmallIcon == null && icon != 0) { + // you snuck an icon in here without using the builder; let's try to keep it + mSmallIcon = Icon.createWithResource("", icon); + } if (mSmallIcon != null) { parcel.writeInt(1); mSmallIcon.writeToParcel(parcel, 0); @@ -2791,7 +2798,10 @@ public class Notification implements Parcelable return this; } - private void setFlag(int mask, boolean value) { + /** + * @hide + */ + public void setFlag(int mask, boolean value) { if (value) { mFlags |= mask; } else { diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 0904e216d081..605c00613087 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -25,6 +25,7 @@ import android.content.Context; import android.content.pm.ParceledListSlice; import android.graphics.drawable.Icon; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -216,6 +217,12 @@ public class NotificationManager } } fixLegacySmallIcon(notification, pkg); + if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1) { + if (notification.getSmallIcon() == null) { + throw new IllegalArgumentException("Invalid notification (no valid small icon): " + + notification); + } + } if (localLOGV) Log.v(TAG, pkg + ": notify(" + id + ", " + notification + ")"); Notification stripped = notification.clone(); Builder.stripForDelivery(stripped); diff --git a/core/java/android/app/admin/DeviceAdminReceiver.java b/core/java/android/app/admin/DeviceAdminReceiver.java index 87e2f9aba36d..a1bb40c9298d 100644 --- a/core/java/android/app/admin/DeviceAdminReceiver.java +++ b/core/java/android/app/admin/DeviceAdminReceiver.java @@ -19,6 +19,7 @@ package android.app.admin; import android.accounts.AccountManager; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; +import android.annotation.SystemApi; import android.app.Service; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -227,14 +228,15 @@ public class DeviceAdminReceiver extends BroadcastReceiver { "android.app.action.PROFILE_PROVISIONING_COMPLETE"; /** + * @hide * Broadcast Action: This broadcast is sent to indicate that the system is ready for the device * initializer to perform user setup tasks. This is only applicable to devices managed by a * device owner app. * * <p>The broadcast will be limited to the {@link DeviceAdminReceiver} component specified in - * the {@link DevicePolicyManager#EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME} field - * of the original intent or NFC bump that started the provisioning process. You will generally - * handle this in {@link DeviceAdminReceiver#onReadyForUserInitialization}. + * the device initializer field of the original intent or NFC bump that started the provisioning + * process. You will generally handle this in + * {@link DeviceAdminReceiver#onReadyForUserInitialization}. * * <p>Input: Nothing.</p> * <p>Output: Nothing</p> @@ -435,23 +437,22 @@ public class DeviceAdminReceiver extends BroadcastReceiver { * Called during provisioning of a managed device to allow the device initializer to perform * user setup steps. Only device initializers should override this method. * - * <p> Called when the DeviceAdminReceiver receives a - * {@link #ACTION_READY_FOR_USER_INITIALIZATION} broadcast. As a prerequisite for the execution - * of this callback the {@link DeviceAdminReceiver} has - * to declare an intent filter for {@link #ACTION_READY_FOR_USER_INITIALIZATION}. Only the - * component specified in the - * {@link DevicePolicyManager#EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME} field of the + * <p> Called when the DeviceAdminReceiver receives an + * android.app.action.ACTION_READY_FOR_USER_INITIALIZATION broadcast. As a prerequisite for the + * execution of this callback the {@link DeviceAdminReceiver} has + * to declare an intent filter for android.app.action.ACTION_READY_FOR_USER_INITIALIZATION. Only + * the component specified in the device initializer component name field of the * original intent or NFC bump that started the provisioning process will receive this callback. * * <p>It is not assumed that the device initializer is finished when it returns from - * this call, as it may do additional setup asynchronously. The device initializer must call - * {@link DevicePolicyManager#setUserEnabled(ComponentName admin)} when it has finished any - * additional setup (such as adding an account by using the {@link AccountManager}) in order for - * the user to be functional. + * this call, as it may do additional setup asynchronously. The device initializer must enable + * the current user when it has finished any additional setup (such as adding an account by + * using the {@link AccountManager}) in order for the user to be functional. * * @param context The running context as per {@link #onReceive}. * @param intent The received intent as per {@link #onReceive}. */ + @SystemApi public void onReadyForUserInitialization(Context context, Intent intent) { } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index ed2008611b6a..125708a66249 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -468,6 +468,7 @@ public class DevicePolicyManager { "android.app.extra.PROVISIONING_SKIP_ENCRYPTION"; /** + * @hide * On devices managed by a device owner app, a {@link ComponentName} extra indicating the * component of the application that is temporarily granted device owner privileges during * device initialization and profile owner privileges during secondary user initialization. @@ -483,6 +484,7 @@ public class DevicePolicyManager { = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME"; /** + * @hide * A String extra holding an http url that specifies the download location of the device * initializer package. When not provided it is assumed that the device initializer package is * already installed. @@ -494,6 +496,7 @@ public class DevicePolicyManager { = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION"; /** + * @hide * An int extra holding a minimum required version code for the device initializer package. * If the initializer is already installed on the device, it will only be re-downloaded from * {@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION} if the version of @@ -506,6 +509,7 @@ public class DevicePolicyManager { = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE"; /** + * @hide * A String extra holding a http cookie header which should be used in the http request to the * url specified in {@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION}. * @@ -516,6 +520,7 @@ public class DevicePolicyManager { = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER"; /** + * @hide * A String extra holding the URL-safe base64 encoded SHA-256 checksum of the file at download * location specified in * {@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION}. @@ -532,6 +537,7 @@ public class DevicePolicyManager { = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM"; /** + * @hide * A String extra holding the URL-safe base64 encoded SHA-256 checksum of any signature of the * android package archive at the download location specified in {@link * #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION}. @@ -552,19 +558,6 @@ public class DevicePolicyManager { = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_SIGNATURE_CHECKSUM"; /** - * A {@link android.os.Parcelable} extra of type {@link android.os.PersistableBundle} that - * holds data needed by the system to wipe factory reset protection. The data needed to wipe - * the device depend on the installed factory reset protection implementation. For example, - * if an account is needed to unlock a device, this extra may contain data used to - * authenticate that account. - * - * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC_V2} that starts device owner - * provisioning via an NFC bump. - */ - public static final String EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS - = "android.app.extra.PROVISIONING_RESET_PROTECTION_PARAMETERS"; - - /** * This MIME type is used for starting the Device Owner provisioning that does not require * provisioning features introduced in Android API level * {@link android.os.Build.VERSION_CODES#MNC} or later levels. @@ -624,11 +617,6 @@ public class DevicePolicyManager { * {@link #MIME_TYPE_PROVISIONING_NFC}: * <ul> * <li>{@link #EXTRA_PROVISIONING_SKIP_ENCRYPTION}, optional</li> - * <li>{@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME}, optional</li> - * <li>{@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION}, optional</li> - * <li>{@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER}, optional</li> - * <li>{@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM}, optional</li> - * <li>{@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE}, optional</li> * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME}. * Replaces {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME}. The value of the property * should be converted to a String via @@ -2769,6 +2757,7 @@ public class DevicePolicyManager { } /** + * @hide * Sets the given component as the device initializer. The package must already be installed and * set as an active device administrator, and there must not be an existing device initializer, * for this call to succeed. This method can only be called by an app holding the @@ -2797,6 +2786,7 @@ public class DevicePolicyManager { } /** + * @hide * Used to determine if a particular package has been registered as the device initializer. * * @param packageName the package name of the app, to compare with the registered device @@ -2815,6 +2805,7 @@ public class DevicePolicyManager { } /** + * @hide * Removes the device initializer, so that it will not be invoked on user initialization for any * subsequently created users. This method can be called by either the device owner or device * initializer itself. The caller must be an active administrator. @@ -2869,6 +2860,7 @@ public class DevicePolicyManager { /** + * @hide * Sets the enabled state of the user. A user should be enabled only once it is ready to * be used. * diff --git a/core/java/android/app/usage/UsageStatsManagerInternal.java b/core/java/android/app/usage/UsageStatsManagerInternal.java index 7bcc0385c13a..8a31390dbf26 100644 --- a/core/java/android/app/usage/UsageStatsManagerInternal.java +++ b/core/java/android/app/usage/UsageStatsManagerInternal.java @@ -54,6 +54,14 @@ public abstract class UsageStatsManagerInternal { public abstract void reportConfigurationChange(Configuration config, int userId); /** + * Reports that a content provider has been accessed by a foreground app. + * @param name The authority of the content provider + * @param pkgName The package name of the content provider + * @param userId The user in which the content provider was accessed. + */ + public abstract void reportContentProviderUsage(String name, String pkgName, int userId); + + /** * Prepares the UsageStatsService for shutdown. */ public abstract void prepareShutdown(); diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java index 1205708478a7..278c9d6f8699 100644 --- a/core/java/android/appwidget/AppWidgetManager.java +++ b/core/java/android/appwidget/AppWidgetManager.java @@ -20,6 +20,7 @@ import android.annotation.Nullable; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.ParceledListSlice; import android.os.Bundle; import android.os.IBinder; import android.os.Process; @@ -753,16 +754,16 @@ public class AppWidgetManager { } try { - List<AppWidgetProviderInfo> providers = mService.getInstalledProvidersForProfile( + ParceledListSlice<AppWidgetProviderInfo> providers = mService.getInstalledProvidersForProfile( categoryFilter, profile.getIdentifier()); if (providers == null) { return Collections.emptyList(); } - for (AppWidgetProviderInfo info : providers) { + for (AppWidgetProviderInfo info : providers.getList()) { // Converting complex to dp. convertSizesToPixels(info); } - return providers; + return providers.getList(); } catch (RemoteException e) { throw new RuntimeException("system server dead?", e); diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index 057001ca3ff3..d37dda049b6c 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -48,6 +48,7 @@ import android.util.Log; import dalvik.system.CloseGuard; +import com.android.internal.util.ArrayUtils; import com.android.internal.util.Preconditions; import java.io.File; @@ -57,6 +58,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Random; @@ -1936,6 +1938,19 @@ public abstract class ContentResolver { } /** + * @hide + * Returns the package names of syncadapters that match a given user and authority. + */ + public static String[] getSyncAdapterPackagesForAuthorityAsUser(String authority, + int userId) { + try { + return getContentService().getSyncAdapterPackagesForAuthorityAsUser(authority, userId); + } catch (RemoteException e) { + } + return ArrayUtils.emptyArray(String.class); + } + + /** * Check if the provider should be synced when a network tickle is received * <p>This method requires the caller to hold the permission * {@link android.Manifest.permission#READ_SYNC_SETTINGS}. diff --git a/core/java/android/content/IContentService.aidl b/core/java/android/content/IContentService.aidl index 9998f08ff54c..8b471a04f25b 100644 --- a/core/java/android/content/IContentService.aidl +++ b/core/java/android/content/IContentService.aidl @@ -143,6 +143,8 @@ interface IContentService { SyncAdapterType[] getSyncAdapterTypes(); SyncAdapterType[] getSyncAdapterTypesAsUser(int userId); + String[] getSyncAdapterPackagesForAuthorityAsUser(String authority, int userId); + /** * Returns true if there is currently a operation for the given account/authority or service * actively being processed. diff --git a/core/java/android/content/IntentFilter.java b/core/java/android/content/IntentFilter.java index 08c52365c750..d83dfc5eb54f 100644 --- a/core/java/android/content/IntentFilter.java +++ b/core/java/android/content/IntentFilter.java @@ -1480,7 +1480,11 @@ public class IntentFilter implements Parcelable { * Write the contents of the IntentFilter as an XML stream. */ public void writeToXml(XmlSerializer serializer) throws IOException { - serializer.attribute(null, AUTO_VERIFY_STR, Boolean.toString(getAutoVerify())); + + if (getAutoVerify()) { + serializer.attribute(null, AUTO_VERIFY_STR, Boolean.toString(true)); + } + int N = countActions(); for (int i=0; i<N; i++) { serializer.startTag(null, ACTION_STR); diff --git a/core/java/android/content/SyncAdaptersCache.java b/core/java/android/content/SyncAdaptersCache.java index 8bb3ee7f178b..6704b75dff7f 100644 --- a/core/java/android/content/SyncAdaptersCache.java +++ b/core/java/android/content/SyncAdaptersCache.java @@ -20,12 +20,19 @@ import android.content.pm.RegisteredServicesCache; import android.content.pm.XmlSerializerAndParser; import android.content.res.Resources; import android.content.res.TypedArray; +import android.util.ArrayMap; import android.util.AttributeSet; +import android.util.SparseArray; + +import com.android.internal.annotations.GuardedBy; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlSerializer; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; /** * A cache of services that export the {@link android.content.ISyncAdapter} interface. @@ -39,6 +46,10 @@ public class SyncAdaptersCache extends RegisteredServicesCache<SyncAdapterType> private static final String ATTRIBUTES_NAME = "sync-adapter"; private static final MySerializer sSerializer = new MySerializer(); + @GuardedBy("mServicesLock") + private SparseArray<ArrayMap<String,String[]>> mAuthorityToSyncAdapters + = new SparseArray<>(); + public SyncAdaptersCache(Context context) { super(context, SERVICE_INTERFACE, SERVICE_META_DATA, ATTRIBUTES_NAME, sSerializer); } @@ -76,6 +87,57 @@ public class SyncAdaptersCache extends RegisteredServicesCache<SyncAdapterType> } } + @Override + protected void onServicesChangedLocked(int userId) { + synchronized (mServicesLock) { + ArrayMap<String,String[]> adapterMap = mAuthorityToSyncAdapters.get(userId); + if (adapterMap != null) { + adapterMap.clear(); + } + } + + super.onServicesChangedLocked(userId); + } + + public String[] getSyncAdapterPackagesForAuthority(String authority, int userId) { + synchronized (mServicesLock) { + ArrayMap<String,String[]> adapterMap = mAuthorityToSyncAdapters.get(userId); + if (adapterMap == null) { + adapterMap = new ArrayMap<>(); + mAuthorityToSyncAdapters.put(userId, adapterMap); + } + // If the mapping exists, return it + if (adapterMap.containsKey(authority)) { + return adapterMap.get(authority); + } + // Create the mapping and cache it + String[] syncAdapterPackages; + final Collection<RegisteredServicesCache.ServiceInfo<SyncAdapterType>> serviceInfos; + serviceInfos = getAllServices(userId); + ArrayList<String> packages = new ArrayList<>(); + for (RegisteredServicesCache.ServiceInfo<SyncAdapterType> serviceInfo : serviceInfos) { + if (authority.equals(serviceInfo.type.authority) + && serviceInfo.componentName != null) { + packages.add(serviceInfo.componentName.getPackageName()); + } + } + syncAdapterPackages = new String[packages.size()]; + packages.toArray(syncAdapterPackages); + adapterMap.put(authority, syncAdapterPackages); + + return syncAdapterPackages; + } + } + + @Override + protected void onUserRemoved(int userId) { + synchronized (mServicesLock) { + mAuthorityToSyncAdapters.remove(userId); + } + + super.onUserRemoved(userId); + } + static class MySerializer implements XmlSerializerAndParser<SyncAdapterType> { public void writeAsXml(SyncAdapterType item, XmlSerializer out) throws IOException { out.attribute(null, "authority", item.authority); diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 9fb6f4dfa906..6feb86036791 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -962,6 +962,13 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { /** * @hide */ + public boolean isPrivilegedApp() { + return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0; + } + + /** + * @hide + */ public boolean isUpdatedSystemApp() { return (flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; } diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java index 5c21c8ee1569..e9ec77103b1f 100644 --- a/core/java/android/content/pm/LauncherApps.java +++ b/core/java/android/content/pm/LauncherApps.java @@ -294,7 +294,7 @@ public class LauncherApps { */ public void registerCallback(Callback callback, Handler handler) { synchronized (this) { - if (callback != null && !mCallbacks.contains(callback)) { + if (callback != null && findCallbackLocked(callback) < 0) { boolean addedFirstCallback = mCallbacks.size() == 0; addCallbackLocked(callback, handler); if (addedFirstCallback) { @@ -325,17 +325,25 @@ public class LauncherApps { } } - private void removeCallbackLocked(Callback callback) { + /** @return position in mCallbacks for callback or -1 if not present. */ + private int findCallbackLocked(Callback callback) { if (callback == null) { throw new IllegalArgumentException("Callback cannot be null"); } final int size = mCallbacks.size(); for (int i = 0; i < size; ++i) { if (mCallbacks.get(i).mCallback == callback) { - mCallbacks.remove(i); - return; + return i; } } + return -1; + } + + private void removeCallbackLocked(Callback callback) { + int pos = findCallbackLocked(callback); + if (pos >= 0) { + mCallbacks.remove(pos); + } } private void addCallbackLocked(Callback callback, Handler handler) { diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index bd50ca03b5ae..dd1c5c2ab58f 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -2900,7 +2900,7 @@ public abstract class PackageManager { * * @return A List<ResolveInfo> containing one entry for each matching * Receiver. These are ordered from first to last in priority. If - * there are no matching receivers, an empty list is returned. + * there are no matching receivers, an empty list or {@code null} is returned. * * @see #MATCH_DEFAULT_ONLY * @see #GET_INTENT_FILTERS @@ -2936,7 +2936,7 @@ public abstract class PackageManager { * ServiceInfo. These are ordered from best to worst match -- that * is, the first item in the list is what is returned by * resolveService(). If there are no matching services, an empty - * list is returned. + * list or {@code null} is returned. * * @see #GET_INTENT_FILTERS * @see #GET_RESOLVED_FILTER @@ -2955,7 +2955,7 @@ public abstract class PackageManager { * ServiceInfo. These are ordered from best to worst match -- that * is, the first item in the list is what is returned by * resolveService(). If there are no matching services, an empty - * list is returned. + * list or {@code null} is returned. * * @see #GET_INTENT_FILTERS * @see #GET_RESOLVED_FILTER @@ -2977,7 +2977,7 @@ public abstract class PackageManager { * @param flags Additional option flags. * @return A List<ResolveInfo> containing one entry for each matching * ProviderInfo. These are ordered from best to worst match. If - * there are no matching providers, an empty list is returned. + * there are no matching providers, an empty list or {@code null} is returned. * @see #GET_INTENT_FILTERS * @see #GET_RESOLVED_FILTER */ diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java new file mode 100644 index 000000000000..7599bd6795fd --- /dev/null +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.content.pm; + +import android.annotation.NonNull; + +/** + * Package manager local system service interface. + * + * @hide Only for use within the system server. + */ +public abstract class PackageManagerInternal { + + /** + * Provider for package names. + */ + public interface PackagesProvider { + + /** + * Gets the packages for a given user. + * @param userId The user id. + * @return The package names. + */ + public String[] getPackages(int userId); + } + + /** + * Sets the location provider packages provider. + * @param provider The packages provider. + */ + public abstract void setLocationPackagesProvider(PackagesProvider provider); + + /** + * Sets the input method packages provider. + * @param provider The packages provider. + */ + public abstract void setImePackagesProvider(PackagesProvider provider); + + /** + * Sets the voice interaction packages provider. + * @param provider The packages provider. + */ + public abstract void setVoiceInteractionPackagesProvider(PackagesProvider provider); +} diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 287e0c55d1f4..faf71ee90221 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -4508,6 +4508,13 @@ public class PackageParser { /** * @hide */ + public boolean isPrivilegedApp() { + return applicationInfo.isPrivilegedApp(); + } + + /** + * @hide + */ public boolean isUpdatedSystemApp() { return applicationInfo.isUpdatedSystemApp(); } diff --git a/core/java/android/content/pm/RegisteredServicesCache.java b/core/java/android/content/pm/RegisteredServicesCache.java index 0bd2a3b84f06..b293e2a83400 100644 --- a/core/java/android/content/pm/RegisteredServicesCache.java +++ b/core/java/android/content/pm/RegisteredServicesCache.java @@ -84,7 +84,7 @@ public abstract class RegisteredServicesCache<V> { private final String mAttributesName; private final XmlSerializerAndParser<V> mSerializerAndParser; - private final Object mServicesLock = new Object(); + protected final Object mServicesLock = new Object(); @GuardedBy("mServicesLock") private final SparseArray<UserServices<V>> mUserServices = new SparseArray<UserServices<V>>(2); @@ -232,6 +232,7 @@ public abstract class RegisteredServicesCache<V> { synchronized (mServicesLock) { final UserServices<V> user = findOrCreateUserLocked(userId); user.services = null; + onServicesChangedLocked(userId); } } @@ -489,11 +490,16 @@ public abstract class RegisteredServicesCache<V> { } } if (changed) { + onServicesChangedLocked(userId); writePersistentServicesLocked(user, userId); } } } + protected void onServicesChangedLocked(int userId) { + // Feel free to override + } + /** * Returns true if the list of changed uids is null (wildcard) or the specified uid * is contained in the list of changed uids. @@ -687,7 +693,9 @@ public abstract class RegisteredServicesCache<V> { @VisibleForTesting protected void onUserRemoved(int userId) { - mUserServices.remove(userId); + synchronized (mServicesLock) { + mUserServices.remove(userId); + } } @VisibleForTesting diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java index 649fdb46367e..7bab35ce7e8e 100644 --- a/core/java/android/content/pm/ResolveInfo.java +++ b/core/java/android/content/pm/ResolveInfo.java @@ -45,7 +45,7 @@ public class ResolveInfo implements Parcelable { * {@link #providerInfo} will be non-null. */ public ActivityInfo activityInfo; - + /** * The service that corresponds to this resolution match, if this resolution * is for a service. Exactly one of {@link #activityInfo}, @@ -64,21 +64,21 @@ public class ResolveInfo implements Parcelable { * The IntentFilter that was matched for this ResolveInfo. */ public IntentFilter filter; - + /** * The declared priority of this match. Comes from the "priority" * attribute or, if not set, defaults to 0. Higher values are a higher * priority. */ public int priority; - + /** * Order of result according to the user's preference. If the user * has not set a preference for this result, the value is 0; higher * values are a higher priority. */ public int preferredOrder; - + /** * The system's evaluation of how well the activity matches the * IntentFilter. This is a match constant, a combination of @@ -86,7 +86,7 @@ public class ResolveInfo implements Parcelable { * and {@link IntentFilter#MATCH_ADJUSTMENT_MASK IntentFiler.MATCH_ADJUSTMENT_MASK}. */ public int match; - + /** * Only set when returned by * {@link PackageManager#queryIntentActivityOptions}, this tells you @@ -94,29 +94,30 @@ public class ResolveInfo implements Parcelable { * first in the list, < 0 means it came from the generic Intent query. */ public int specificIndex = -1; - + /** * This filter has specified the Intent.CATEGORY_DEFAULT, meaning it * would like to be considered a default action that the user can * perform on this data. */ public boolean isDefault; - + /** * A string resource identifier (in the package's resources) of this * match's label. From the "label" attribute or, if not set, 0. */ public int labelRes; - + /** * The actual string retrieve from <var>labelRes</var> or null if none * was provided. */ public CharSequence nonLocalizedLabel; - + /** * A drawable resource identifier (in the package's resources) of this - * match's icon. From the "icon" attribute or, if not set, 0. + * match's icon. From the "icon" attribute or, if not set, 0. It is + * set only if the icon can be obtained by resource id alone. */ public int icon; @@ -134,11 +135,21 @@ public class ResolveInfo implements Parcelable { public int targetUserId; /** + * Set to true if the icon cannot be obtained by resource ids alone. + * It is set to true for ResolveInfos from the managed profile: They need to + * have their icon badged, so it cannot be obtained by resource ids alone. * @hide */ public boolean noResourceId; /** + * Same as {@link #icon} but it will always correspond to "icon" attribute + * regardless of {@link #noResourceId} value. + * @hide + */ + public int iconResourceId; + + /** * @hide Target comes from system process? */ public boolean system; @@ -159,10 +170,10 @@ public class ResolveInfo implements Parcelable { * Retrieve the current textual label associated with this resolution. This * will call back on the given PackageManager to load the label from * the application. - * + * * @param pm A PackageManager from which the label can be loaded; usually * the PackageManager from which you originally retrieved this item. - * + * * @return Returns a CharSequence containing the resolutions's label. If the * item does not have a label, its name is returned. */ @@ -191,33 +202,30 @@ public class ResolveInfo implements Parcelable { if (data != null) data = data.toString().trim(); return data; } - + /** * Retrieve the current graphical icon associated with this resolution. This * will call back on the given PackageManager to load the icon from * the application. - * + * * @param pm A PackageManager from which the icon can be loaded; usually * the PackageManager from which you originally retrieved this item. - * + * * @return Returns a Drawable containing the resolution's icon. If the * item does not have an icon, the default activity icon is returned. */ public Drawable loadIcon(PackageManager pm) { - Drawable dr; - if (resolvePackageName != null && icon != 0) { - dr = pm.getDrawable(resolvePackageName, icon, null); - if (dr != null) { - return dr; - } + Drawable dr = null; + if (resolvePackageName != null && iconResourceId != 0) { + dr = pm.getDrawable(resolvePackageName, iconResourceId, null); } ComponentInfo ci = getComponentInfo(); - ApplicationInfo ai = ci.applicationInfo; - if (icon != 0) { - dr = pm.getDrawable(ci.packageName, icon, ai); - if (dr != null) { - return dr; - } + if (dr == null && iconResourceId != 0) { + ApplicationInfo ai = ci.applicationInfo; + dr = pm.getDrawable(ci.packageName, iconResourceId, ai); + } + if (dr != null) { + return pm.getUserBadgedIcon(dr, new UserHandle(UserHandle.myUserId())); } return ci.loadIcon(pm); } @@ -231,7 +239,7 @@ public class ResolveInfo implements Parcelable { * @return The icon associated with this match. */ final int getIconResourceInternal() { - if (icon != 0) return icon; + if (iconResourceId != 0) return iconResourceId; final ComponentInfo ci = getComponentInfo(); if (ci != null) { return ci.getIconResource(); @@ -298,6 +306,8 @@ public class ResolveInfo implements Parcelable { nonLocalizedLabel = orig.nonLocalizedLabel; icon = orig.icon; resolvePackageName = orig.resolvePackageName; + noResourceId = orig.noResourceId; + iconResourceId = orig.iconResourceId; system = orig.system; targetUserId = orig.targetUserId; handleAllWebDataURI = orig.handleAllWebDataURI; @@ -362,6 +372,7 @@ public class ResolveInfo implements Parcelable { dest.writeInt(targetUserId); dest.writeInt(system ? 1 : 0); dest.writeInt(noResourceId ? 1 : 0); + dest.writeInt(iconResourceId); dest.writeInt(handleAllWebDataURI ? 1 : 0); } @@ -408,9 +419,10 @@ public class ResolveInfo implements Parcelable { targetUserId = source.readInt(); system = source.readInt() != 0; noResourceId = source.readInt() != 0; + iconResourceId = source.readInt(); handleAllWebDataURI = source.readInt() != 0; } - + public static class DisplayNameComparator implements Comparator<ResolveInfo> { public DisplayNameComparator(PackageManager pm) { diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index f8db6d9e3010..c656fb8b8352 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -667,7 +667,7 @@ public abstract class CameraMetadata<TKey> { * {@link android.hardware.camera2.params.StreamConfigurationMap#getHighSpeedVideoSizes }. * The fps range can be controlled via {@link CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE android.control.aeTargetFpsRange}.</p> * <p>In this capability, the camera device will override aeMode, awbMode, and afMode to - * ON, ON, and CONTINUOUS_VIDEO, respectively. All post-processing block mode + * ON, AUTO, and CONTINUOUS_VIDEO, respectively. All post-processing block mode * controls will be overridden to be FAST. Therefore, no manual control of capture * and post-processing parameters is possible. All other controls operate the * same as when {@link CaptureRequest#CONTROL_MODE android.control.mode} == AUTO. This means that all other @@ -1666,9 +1666,9 @@ public abstract class CameraMetadata<TKey> { * <p>Enabling this disables control.aeMode, control.awbMode and * control.afMode controls; the camera device will ignore * those settings while USE_SCENE_MODE is active (except for - * FACE_PRIORITY scene mode). Other control entries are still - * active. This setting can only be used if scene mode is - * supported (i.e. {@link CameraCharacteristics#CONTROL_AVAILABLE_SCENE_MODES android.control.availableSceneModes} + * FACE_PRIORITY scene mode). Other control entries are still active. + * This setting can only be used if scene mode is supported (i.e. + * {@link CameraCharacteristics#CONTROL_AVAILABLE_SCENE_MODES android.control.availableSceneModes} * contain some modes other than DISABLED).</p> * * @see CameraCharacteristics#CONTROL_AVAILABLE_SCENE_MODES @@ -1940,6 +1940,40 @@ public abstract class CameraMetadata<TKey> { */ public static final int CONTROL_SCENE_MODE_HDR = 18; + /** + * <p>Same as FACE_PRIORITY scene mode, except that the camera + * device will choose higher sensivity values ({@link CaptureRequest#SENSOR_SENSITIVITY android.sensor.sensitivity}) + * under low light conditions.</p> + * <p>The camera device may be tuned to expose the images in a reduced + * sensitivity range to produce the best quality images. For example, + * if the {@link CameraCharacteristics#SENSOR_INFO_SENSITIVITY_RANGE android.sensor.info.sensitivityRange} gives range of [100, 1600], + * the camera device auto-exposure routine tuning process may limit the actual + * exposure sensivity range to [100, 1200] to ensure that the noise level isn't + * exessive to compromise the image quality. Under this situation, the image under + * low light may be under-exposed when the sensor max exposure time (bounded by the + * {@link CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE android.control.aeTargetFpsRange} when {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode} is one of the + * ON_* modes) and effecitve max sensitivity are reached. This scene mode allows the + * camera device auto-exposure routine to increase the sensitivity up to the max + * sensitivity specified by {@link CameraCharacteristics#SENSOR_INFO_SENSITIVITY_RANGE android.sensor.info.sensitivityRange} when the scene is too + * dark and the max exposure time is reached. The captured images may be noisier + * compared with the images captured in normal FACE_PRIORITY mode, therefore, it is + * recommended that the application only use this scene mode when it is capable of + * reducing the noise level of the captured images.</p> + * <p>Unlike the other scene modes, {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode}, + * {@link CaptureRequest#CONTROL_AWB_MODE android.control.awbMode}, and {@link CaptureRequest#CONTROL_AF_MODE android.control.afMode} + * remain active when FACE_PRIORITY_LOW_LIGHT is set.</p> + * + * @see CaptureRequest#CONTROL_AE_MODE + * @see CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE + * @see CaptureRequest#CONTROL_AF_MODE + * @see CaptureRequest#CONTROL_AWB_MODE + * @see CameraCharacteristics#SENSOR_INFO_SENSITIVITY_RANGE + * @see CaptureRequest#SENSOR_SENSITIVITY + * @see CaptureRequest#CONTROL_SCENE_MODE + * @hide + */ + public static final int CONTROL_SCENE_MODE_FACE_PRIORITY_LOW_LIGHT = 19; + // // Enumeration values for CaptureRequest#CONTROL_VIDEO_STABILIZATION_MODE // diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java index bc625dd31168..9fa66879629d 100644 --- a/core/java/android/hardware/camera2/CaptureRequest.java +++ b/core/java/android/hardware/camera2/CaptureRequest.java @@ -1448,9 +1448,9 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p>Scene modes are custom camera modes optimized for a certain set of conditions and * capture settings.</p> * <p>This is the mode that that is active when - * <code>{@link CaptureRequest#CONTROL_MODE android.control.mode} == USE_SCENE_MODE</code>. Aside from FACE_PRIORITY, - * these modes will disable {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode}, - * {@link CaptureRequest#CONTROL_AWB_MODE android.control.awbMode}, and {@link CaptureRequest#CONTROL_AF_MODE android.control.afMode} while in use.</p> + * <code>{@link CaptureRequest#CONTROL_MODE android.control.mode} == USE_SCENE_MODE</code>. Aside from FACE_PRIORITY, these modes will + * disable {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode}, {@link CaptureRequest#CONTROL_AWB_MODE android.control.awbMode}, and {@link CaptureRequest#CONTROL_AF_MODE android.control.afMode} + * while in use.</p> * <p>The interpretation and implementation of these scene modes is left * to the implementor of the camera device. Their behavior will not be * consistent across all devices, and any given device may only implement diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index da216aaa4418..b1fb615821c7 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -1960,9 +1960,9 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p>Scene modes are custom camera modes optimized for a certain set of conditions and * capture settings.</p> * <p>This is the mode that that is active when - * <code>{@link CaptureRequest#CONTROL_MODE android.control.mode} == USE_SCENE_MODE</code>. Aside from FACE_PRIORITY, - * these modes will disable {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode}, - * {@link CaptureRequest#CONTROL_AWB_MODE android.control.awbMode}, and {@link CaptureRequest#CONTROL_AF_MODE android.control.afMode} while in use.</p> + * <code>{@link CaptureRequest#CONTROL_MODE android.control.mode} == USE_SCENE_MODE</code>. Aside from FACE_PRIORITY, these modes will + * disable {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode}, {@link CaptureRequest#CONTROL_AWB_MODE android.control.awbMode}, and {@link CaptureRequest#CONTROL_AF_MODE android.control.afMode} + * while in use.</p> * <p>The interpretation and implementation of these scene modes is left * to the implementor of the camera device. Their behavior will not be * consistent across all devices, and any given device may only implement diff --git a/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java b/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java index f928a55597da..bc80fc114772 100644 --- a/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java +++ b/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java @@ -630,8 +630,6 @@ public class SurfaceTextureRenderer { holder.width = surfaceSize.getWidth(); holder.height = surfaceSize.getHeight(); if (LegacyCameraDevice.needsConversion(s)) { - // Always override to YV12 output for YUV surface formats. - LegacyCameraDevice.setSurfaceFormat(s, ImageFormat.YV12); mConversionSurfaces.add(holder); } else { mSurfaces.add(holder); diff --git a/core/java/android/inputmethodservice/ExtractEditText.java b/core/java/android/inputmethodservice/ExtractEditText.java index f965f5450fbf..8bc28760e745 100644 --- a/core/java/android/inputmethodservice/ExtractEditText.java +++ b/core/java/android/inputmethodservice/ExtractEditText.java @@ -165,6 +165,14 @@ public class ExtractEditText extends EditText { } /** + * @hide + */ + @Override + public boolean isInExtractedMode() { + return true; + } + + /** * {@inheritDoc} * @hide */ diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index a2ca41ca3788..b9f7365d8ce5 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -2461,7 +2461,7 @@ public class ConnectivityManager { * Intent to reserve the network or it will be released shortly after the Intent * is processed. * <p> - * If there is already an request for this Intent registered (with the equality of + * If there is already a request for this Intent registered (with the equality of * two Intents defined by {@link Intent#filterEquals}), then it will be removed and * replaced by this one, effectively releasing the previous {@link NetworkRequest}. * <p> @@ -2521,6 +2521,44 @@ public class ConnectivityManager { } /** + * Registers a PendingIntent to be sent when a network is available which satisfies the given + * {@link NetworkRequest}. + * + * This function behaves identically to the version that takes a NetworkCallback, but instead + * of {@link NetworkCallback} a {@link PendingIntent} is used. This means + * the request may outlive the calling application and get called back when a suitable + * network is found. + * <p> + * The operation is an Intent broadcast that goes to a broadcast receiver that + * you registered with {@link Context#registerReceiver} or through the + * <receiver> tag in an AndroidManifest.xml file + * <p> + * The operation Intent is delivered with two extras, a {@link Network} typed + * extra called {@link #EXTRA_NETWORK} and a {@link NetworkRequest} + * typed extra called {@link #EXTRA_NETWORK_REQUEST} containing + * the original requests parameters. + * <p> + * If there is already a request for this Intent registered (with the equality of + * two Intents defined by {@link Intent#filterEquals}), then it will be removed and + * replaced by this one, effectively releasing the previous {@link NetworkRequest}. + * <p> + * The request may be released normally by calling + * {@link #releaseNetworkRequest(android.app.PendingIntent)}. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. + * @param request {@link NetworkRequest} describing this request. + * @param operation Action to perform when the network is available (corresponds + * to the {@link NetworkCallback#onAvailable} call. Typically + * comes from {@link PendingIntent#getBroadcast}. Cannot be null. + */ + public void registerNetworkCallback(NetworkRequest request, PendingIntent operation) { + checkPendingIntent(operation); + try { + mService.pendingListenForNetwork(request.networkCapabilities, operation); + } catch (RemoteException e) {} + } + + /** * Requests bandwidth update for a given {@link Network} and returns whether the update request * is accepted by ConnectivityService. Once accepted, ConnectivityService will poll underlying * network connection for updated bandwidth information. The caller will be notified via diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java index ecc3fb400610..3f40484b2595 100644 --- a/core/java/android/net/NetworkPolicyManager.java +++ b/core/java/android/net/NetworkPolicyManager.java @@ -61,6 +61,17 @@ public class NetworkPolicyManager { public static final int FIREWALL_RULE_ALLOW = 1; public static final int FIREWALL_RULE_DENY = 2; + public static final int FIREWALL_TYPE_WHITELIST = 0; + public static final int FIREWALL_TYPE_BLACKLIST = 1; + + public static final int FIREWALL_CHAIN_NONE = 0; + public static final int FIREWALL_CHAIN_DOZABLE = 1; + public static final int FIREWALL_CHAIN_STANDBY = 2; + + public static final String FIREWALL_CHAIN_NAME_NONE = "none"; + public static final String FIREWALL_CHAIN_NAME_DOZABLE = "dozable"; + public static final String FIREWALL_CHAIN_NAME_STANDBY = "standby"; + private static final boolean ALLOW_PLATFORM_APP_POLICY = true; /** diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index d165240e2394..7fda30acdf02 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -65,7 +65,7 @@ public abstract class BatteryStats implements Parcelable { * A constant indicating a window wake lock timer. */ public static final int WAKE_TYPE_WINDOW = 2; - + /** * A constant indicating a sensor timer. */ @@ -142,6 +142,11 @@ public abstract class BatteryStats implements Parcelable { public static final int CAMERA_TURNED_ON = 17; /** + * A constant indicating a draw wake lock timer. + */ + public static final int WAKE_TYPE_DRAW = 18; + + /** * Include all of the data in the stats, including previously saved data. */ public static final int STATS_SINCE_CHARGED = 0; @@ -1165,25 +1170,23 @@ public abstract class BatteryStats implements Parcelable { public static final int EVENT_USER_FOREGROUND = 0x0008; // Event for connectivity changed. public static final int EVENT_CONNECTIVITY_CHANGED = 0x0009; - // Event for significant motion taking us out of idle mode. - public static final int EVENT_SIGNIFICANT_MOTION = 0x000a; // Event for becoming active taking us out of idle mode. - public static final int EVENT_ACTIVE = 0x000b; + public static final int EVENT_ACTIVE = 0x000a; // Event for a package being installed. - public static final int EVENT_PACKAGE_INSTALLED = 0x000c; + public static final int EVENT_PACKAGE_INSTALLED = 0x000b; // Event for a package being uninstalled. - public static final int EVENT_PACKAGE_UNINSTALLED = 0x000d; + public static final int EVENT_PACKAGE_UNINSTALLED = 0x000c; // Event for a package being uninstalled. - public static final int EVENT_ALARM = 0x000e; + public static final int EVENT_ALARM = 0x000d; // Record that we have decided we need to collect new stats data. - public static final int EVENT_COLLECT_EXTERNAL_STATS = 0x000f; + public static final int EVENT_COLLECT_EXTERNAL_STATS = 0x000e; // Event for a package becoming inactive due to being unused for a period of time. - public static final int EVENT_PACKAGE_INACTIVE = 0x0010; + public static final int EVENT_PACKAGE_INACTIVE = 0x000f; // Event for a package becoming active due to an interaction. - public static final int EVENT_PACKAGE_ACTIVE = 0x0011; + public static final int EVENT_PACKAGE_ACTIVE = 0x0010; // Number of event types. - public static final int EVENT_COUNT = 0x0012; + public static final int EVENT_COUNT = 0x0011; // Mask to extract out only the type part of the event. public static final int EVENT_TYPE_MASK = ~(EVENT_FLAG_START|EVENT_FLAG_FINISH); @@ -1840,12 +1843,12 @@ public abstract class BatteryStats implements Parcelable { public static final String[] HISTORY_EVENT_NAMES = new String[] { "null", "proc", "fg", "top", "sync", "wake_lock_in", "job", "user", "userfg", "conn", - "motion", "active", "pkginst", "pkgunin", "alarm", "stats", "inactive", "active" + "active", "pkginst", "pkgunin", "alarm", "stats", "inactive", "active" }; public static final String[] HISTORY_EVENT_CHECKIN_NAMES = new String[] { "Enl", "Epr", "Efg", "Etp", "Esy", "Ewl", "Ejb", "Eur", "Euf", "Ecn", - "Esm", "Eac", "Epi", "Epu", "Eal", "Est", "Eai", "Eaa" + "Eac", "Epi", "Epu", "Eal", "Est", "Eai", "Eaa" }; /** @@ -3836,6 +3839,7 @@ public abstract class BatteryStats implements Parcelable { final ArrayMap<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats(); long totalFullWakelock = 0, totalPartialWakelock = 0, totalWindowWakelock = 0; + long totalDrawWakelock = 0; int countWakelock = 0; for (int iw=wakelocks.size()-1; iw>=0; iw--) { final Uid.Wakelock wl = wakelocks.valueAt(iw); @@ -3850,19 +3854,21 @@ public abstract class BatteryStats implements Parcelable { "partial", which, linePrefix); linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), rawRealtime, "window", which, linePrefix); - if (true || !linePrefix.equals(": ")) { - sb.append(" realtime"); - // Only print out wake locks that were held - pw.println(sb.toString()); - uidActivity = true; - countWakelock++; - } + linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_DRAW), rawRealtime, + "draw", which, linePrefix); + sb.append(" realtime"); + pw.println(sb.toString()); + uidActivity = true; + countWakelock++; + totalFullWakelock += computeWakeLock(wl.getWakeTime(WAKE_TYPE_FULL), rawRealtime, which); totalPartialWakelock += computeWakeLock(wl.getWakeTime(WAKE_TYPE_PARTIAL), rawRealtime, which); totalWindowWakelock += computeWakeLock(wl.getWakeTime(WAKE_TYPE_WINDOW), rawRealtime, which); + totalDrawWakelock += computeWakeLock(wl.getWakeTime(WAKE_TYPE_DRAW), + rawRealtime, which); } if (countWakelock > 1) { if (totalFullWakelock != 0 || totalPartialWakelock != 0 @@ -3892,6 +3898,14 @@ public abstract class BatteryStats implements Parcelable { formatTimeMs(sb, totalWindowWakelock); sb.append("window"); } + if (totalDrawWakelock != 0) { + if (needComma) { + sb.append(","); + } + needComma = true; + formatTimeMs(sb, totalDrawWakelock); + sb.append("draw"); + } sb.append(" realtime"); pw.println(sb.toString()); } @@ -4017,8 +4031,10 @@ public abstract class BatteryStats implements Parcelable { if (userCpuTimeUs > 0 || systemCpuTimeUs > 0) { sb.setLength(0); sb.append(prefix); - sb.append(" Total cpu time: "); - formatTimeMs(sb, (userCpuTimeUs + systemCpuTimeUs) / 1000); + sb.append(" Total cpu time: u="); + formatTimeMs(sb, userCpuTimeUs / 1000); + sb.append("s="); + formatTimeMs(sb, systemCpuTimeUs / 1000); pw.println(sb.toString()); } diff --git a/core/java/android/os/IDeviceIdleController.aidl b/core/java/android/os/IDeviceIdleController.aidl index 268295dc40c0..fe4aa13fe968 100644 --- a/core/java/android/os/IDeviceIdleController.aidl +++ b/core/java/android/os/IDeviceIdleController.aidl @@ -28,4 +28,5 @@ interface IDeviceIdleController { int[] getAppIdTempWhitelist(); boolean isPowerSaveWhitelistApp(String name); void addPowerSaveTempWhitelistApp(String name, long duration, int userId); + void exitIdle(String reason); } diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index b29e8d0c92b0..8114155bbd55 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -342,7 +342,9 @@ interface INetworkManagementService void setFirewallInterfaceRule(String iface, boolean allow); void setFirewallEgressSourceRule(String addr, boolean allow); void setFirewallEgressDestRule(String addr, int port, boolean allow); - void setFirewallUidRule(int uid, int rule); + void setFirewallUidRule(int chain, int uid, int rule); + void setFirewallUidRules(int chain, in int[] uids, in int[] rules); + void setFirewallChainEnabled(int chain, boolean enable); /** * Set all packets from users in ranges to go through VPN specified by netId. diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index dbb51464cb87..f9c50f320dbb 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -635,8 +635,8 @@ public class Process { if ((debugFlags & Zygote.DEBUG_ENABLE_JIT) != 0) { argsForZygote.add("--enable-jit"); } - if ((debugFlags & Zygote.DEBUG_GENERATE_CFI) != 0) { - argsForZygote.add("--generate-cfi"); + if ((debugFlags & Zygote.DEBUG_GENERATE_DEBUG_INFO) != 0) { + argsForZygote.add("--generate-debug-info"); } if ((debugFlags & Zygote.DEBUG_ENABLE_ASSERT) != 0) { argsForZygote.add("--enable-assert"); diff --git a/core/java/android/provider/CallLog.java b/core/java/android/provider/CallLog.java index 7d57233b3149..23555d6d998d 100644 --- a/core/java/android/provider/CallLog.java +++ b/core/java/android/provider/CallLog.java @@ -518,11 +518,6 @@ public class CallLog { if (callType == MISSED_TYPE) { values.put(IS_READ, Integer.valueOf(0)); } - if (ci != null) { - values.put(CACHED_NAME, ci.name); - values.put(CACHED_NUMBER_TYPE, ci.numberType); - values.put(CACHED_NUMBER_LABEL, ci.numberLabel); - } if ((ci != null) && (ci.contactIdOrZero > 0)) { // Update usage information for the number associated with the contact ID. diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java index 30535ffbe8ef..c7ba60768a72 100644 --- a/core/java/android/provider/DocumentsContract.java +++ b/core/java/android/provider/DocumentsContract.java @@ -107,6 +107,11 @@ public final class DocumentsContract { */ public static final String EXTRA_ORIENTATION = "android.content.extra.ORIENTATION"; + /** + * Overrides the default prompt text in DocumentsUI when set in an intent. + */ + public static final String EXTRA_PROMPT = "android.provider.extra.PROMPT"; + /** {@hide} */ public static final String ACTION_MANAGE_ROOT = "android.provider.action.MANAGE_ROOT"; /** {@hide} */ diff --git a/core/java/android/security/keymaster/KeymasterDefs.java b/core/java/android/security/keymaster/KeymasterDefs.java index 3fb93c4be250..62c28ac14255 100644 --- a/core/java/android/security/keymaster/KeymasterDefs.java +++ b/core/java/android/security/keymaster/KeymasterDefs.java @@ -81,8 +81,8 @@ public final class KeymasterDefs { public static final int KM_TAG_ASSOCIATED_DATA = KM_BYTES | 1000; public static final int KM_TAG_NONCE = KM_BYTES | 1001; - public static final int KM_TAG_AUTH_TOKEN = KM_BYTES | 1003; - public static final int KM_TAG_MAC_LENGTH = KM_INT | 1004; + public static final int KM_TAG_AUTH_TOKEN = KM_BYTES | 1002; + public static final int KM_TAG_MAC_LENGTH = KM_INT | 1003; // Algorithm values. public static final int KM_ALGORITHM_RSA = 1; @@ -191,8 +191,9 @@ public final class KeymasterDefs { public static final int KM_ERROR_MISSING_NONCE = -51; public static final int KM_ERROR_INVALID_NONCE = -52; public static final int KM_ERROR_MISSING_MAC_LENGTH = -53; - public static final int KM_ERROR_RESCOPABLE_KEY_NOT_USABLE = -54; + public static final int KM_ERROR_KEY_RATE_LIMIT_EXCEEDED = -54; public static final int KM_ERROR_CALLER_NONCE_PROHIBITED = -55; + public static final int KM_ERROR_KEY_MAX_OPS_EXCEEDED = -56; public static final int KM_ERROR_UNIMPLEMENTED = -100; public static final int KM_ERROR_VERSION_MISMATCH = -101; public static final int KM_ERROR_UNKNOWN_ERROR = -1000; diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index 8c6cd09a8144..0309d24c8e56 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -41,6 +41,7 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -463,15 +464,28 @@ public abstract class NotificationListenerService extends Service { ParceledListSlice<StatusBarNotification> parceledList = getNotificationInterface() .getActiveNotificationsFromListener(mWrapper, keys, trim); List<StatusBarNotification> list = parceledList.getList(); - + ArrayList<StatusBarNotification> corruptNotifications = null; int N = list.size(); for (int i = 0; i < N; i++) { - Notification notification = list.get(i).getNotification(); - Builder.rebuild(getContext(), notification); - // convert icon metadata to legacy format for older clients - createLegacyIconExtras(notification); + StatusBarNotification sbn = list.get(i); + Notification notification = sbn.getNotification(); + try { + Builder.rebuild(getContext(), notification); + // convert icon metadata to legacy format for older clients + createLegacyIconExtras(notification); + } catch (IllegalArgumentException e) { + if (corruptNotifications == null) { + corruptNotifications = new ArrayList<>(N); + } + corruptNotifications.add(sbn); + Log.w(TAG, "onNotificationPosted: can't rebuild notification from " + + sbn.getPackageName()); + } } - return list.toArray(new StatusBarNotification[N]); + if (corruptNotifications != null) { + list.removeAll(corruptNotifications); + } + return list.toArray(new StatusBarNotification[list.size()]); } catch (android.os.RemoteException ex) { Log.v(TAG, "Unable to contact notification manager", ex); } @@ -671,16 +685,28 @@ public abstract class NotificationListenerService extends Service { Log.w(TAG, "onNotificationPosted: Error receiving StatusBarNotification", e); return; } - Notification.Builder.rebuild(getContext(), sbn.getNotification()); - // convert icon metadata to legacy format for older clients - createLegacyIconExtras(sbn.getNotification()); + try { + Notification.Builder.rebuild(getContext(), sbn.getNotification()); + // convert icon metadata to legacy format for older clients + createLegacyIconExtras(sbn.getNotification()); + } catch (IllegalArgumentException e) { + // drop corrupt notification + sbn = null; + Log.w(TAG, "onNotificationPosted: can't rebuild notification from " + + sbn.getPackageName()); + } // protect subclass from concurrent modifications of (@link mNotificationKeys}. synchronized (mWrapper) { applyUpdate(update); try { - NotificationListenerService.this.onNotificationPosted(sbn, mRankingMap); + if (sbn != null) { + NotificationListenerService.this.onNotificationPosted(sbn, mRankingMap); + } else { + // still pass along the ranking map, it may contain other information + NotificationListenerService.this.onNotificationRankingUpdate(mRankingMap); + } } catch (Throwable t) { Log.w(TAG, "Error running onNotificationPosted", t); } diff --git a/core/java/android/service/persistentdata/IPersistentDataBlockService.aidl b/core/java/android/service/persistentdata/IPersistentDataBlockService.aidl index 0071a33bbb23..52db22397b65 100644 --- a/core/java/android/service/persistentdata/IPersistentDataBlockService.aidl +++ b/core/java/android/service/persistentdata/IPersistentDataBlockService.aidl @@ -16,8 +16,6 @@ package android.service.persistentdata; -import android.app.PendingIntent; -import android.os.Bundle; import android.os.ParcelFileDescriptor; /** @@ -32,7 +30,6 @@ interface IPersistentDataBlockService { int write(in byte[] data); byte[] read(); void wipe(); - void wipeIfAllowed(in Bundle bundle, in PendingIntent pi); int getDataBlockSize(); long getMaximumDataBlockSize(); diff --git a/core/java/android/service/persistentdata/PersistentDataBlockManager.java b/core/java/android/service/persistentdata/PersistentDataBlockManager.java index 31570c6887a1..0ffdf68c4b30 100644 --- a/core/java/android/service/persistentdata/PersistentDataBlockManager.java +++ b/core/java/android/service/persistentdata/PersistentDataBlockManager.java @@ -17,8 +17,6 @@ package android.service.persistentdata; import android.annotation.SystemApi; -import android.app.PendingIntent; -import android.os.Bundle; import android.os.RemoteException; import android.util.Slog; @@ -43,56 +41,6 @@ import android.util.Slog; @SystemApi public class PersistentDataBlockManager { private static final String TAG = PersistentDataBlockManager.class.getSimpleName(); - - /** - * Broadcast action that will be called when the {@link #wipeIfAllowed(Bundle,PendingIntent)} - * method is called. A broadcast with this action will be sent to the package allowed to write - * to the persistent data block. Packages receiving this broadcasts should respond by using the - * {@link android.app.PendingIntent} sent in the {@link #EXTRA_WIPE_IF_ALLOWED_CALLBACK} extra. - */ - public static final String ACTION_WIPE_IF_ALLOWED - = "android.service.persistentdata.action.WIPE_IF_ALLOWED"; - - /** - * A {@link android.os.Parcelable} extra of type {@link android.app.PendingIntent} used to - * response to {@link #wipeIfAllowed(Bundle,PendingIntent)}. This extra will set in broadcasts - * with an action of {@link #ACTION_WIPE_IF_ALLOWED}. - */ - public static final String EXTRA_WIPE_IF_ALLOWED_CALLBACK - = "android.service.persistentdata.extra.WIPE_IF_ALLOWED_CALLBACK"; - - /** - * Result code indicating that the data block was wiped. - * - * <p>This value is set as result code of the {@link android.app.PendingIntent} argument to - * {@link #wipeIfAllowed(Bundle,PendingIntent)} - */ - public static final int STATUS_SUCCESS = 0; - - /** - * Result code indicating that a remote exception was received while processing the request. - * - * <p>This value is set as result code of the {@link android.app.PendingIntent} argument to - * {@link #wipeIfAllowed(Bundle,PendingIntent)} - */ - public static final int STATUS_ERROR_REMOTE_EXCEPTION = 1; - - /** - * Result code indicating that a network error occurred while processing the request. - * - * <p>This value is set as result code of the {@link android.app.PendingIntent} argument to - * {@link #wipeIfAllowed(Bundle,PendingIntent)} - */ - public static final int STATUS_ERROR_NETWORK_ERROR = 2; - - /** - * Result code indicating that the data block could not be cleared with the provided data. - * - * <p>This value is set as result code of the {@link android.app.PendingIntent} argument to - * {@link #wipeIfAllowed(Bundle,PendingIntent)} - */ - public static final int STATUS_ERROR_NOT_COMPLIANT = 3; - private IPersistentDataBlockService sService; public PersistentDataBlockManager(IPersistentDataBlockService service) { @@ -170,28 +118,6 @@ public class PersistentDataBlockManager { } /** - * Attempt to wipe the data block by sending a broadcast to the package allowed to modify the - * datablock. The allowed package can refuse to wipe the data block based on the contents of - * the specified bundle. This bundle may contain data used by the allowed package to wipe the - * partition such as account credentials or an authorization token. - * @param bundle data used to wipe the data block. The contents of this bundle depend on the - * allowed package receiving the data. - * @param pi intent called when attempt finished. The result code of this intent will be set - * to one of {@link #STATUS_SUCCESS}, {@link #STATUS_ERROR_REMOTE_EXCEPTION}, - * {@link #STATUS_ERROR_NETWORK_ERROR}, or {@link #STATUS_ERROR_NOT_COMPLIANT}. - */ - public void wipeIfAllowed(Bundle bundle, PendingIntent pi) { - if (pi == null) { - throw new NullPointerException(); - } - try { - sService.wipeIfAllowed(bundle, pi); - } catch (RemoteException e) { - onError("wiping persistent partition"); - } - } - - /** * Writes a byte enabling or disabling the ability to "OEM unlock" the device. */ public void setOemUnlockEnabled(boolean enabled) { diff --git a/core/java/android/service/voice/VoiceInteractionSession.java b/core/java/android/service/voice/VoiceInteractionSession.java index 98c684c4ead2..39dd29b671a6 100644 --- a/core/java/android/service/voice/VoiceInteractionSession.java +++ b/core/java/android/service/voice/VoiceInteractionSession.java @@ -1097,7 +1097,8 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall WindowManager.LayoutParams.TYPE_VOICE_INTERACTION, Gravity.BOTTOM, true); mWindow.getWindow().addFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); + WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | + WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); initViews(); mWindow.getWindow().setLayout(MATCH_PARENT, MATCH_PARENT); mWindow.setToken(mToken); diff --git a/core/java/android/view/ActionMode.java b/core/java/android/view/ActionMode.java index 80dcecce8bc2..ea979c8b4621 100644 --- a/core/java/android/view/ActionMode.java +++ b/core/java/android/view/ActionMode.java @@ -261,6 +261,16 @@ public abstract class ActionMode { public abstract MenuInflater getMenuInflater(); /** + * Called when the window containing the view that started this action mode gains or loses + * focus. + * + * @param hasWindowFocus True if the window containing the view that started this action mode + * now has focus, false otherwise. + * + */ + public void onWindowFocusChanged(boolean hasWindowFocus) {} + + /** * Returns whether the UI presenting this action mode can take focus or not. * This is used by internal components within the framework that would otherwise * present an action mode UI that requires focus, such as an EditText as a custom view. diff --git a/core/java/android/view/DisplayListCanvas.java b/core/java/android/view/DisplayListCanvas.java index 52a12f3e4ebc..3c21981af192 100644 --- a/core/java/android/view/DisplayListCanvas.java +++ b/core/java/android/view/DisplayListCanvas.java @@ -323,10 +323,4 @@ public class DisplayListCanvas extends Canvas { } private static native void nDrawRects(long renderer, long region, long paint); - - @Override - public void drawPicture(Picture picture) { - picture.endRecording(); - // TODO: Implement rendering - } } diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 73cfd8c38131..2e2ba881425a 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -4148,24 +4148,38 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager mOnHierarchyChangeListener = listener; } - /** - * @hide - */ - protected void onViewAdded(View child) { + void dispatchViewAdded(View child) { + onViewAdded(child); if (mOnHierarchyChangeListener != null) { mOnHierarchyChangeListener.onChildViewAdded(this, child); } } /** - * @hide + * Called when a new child is added to this ViewGroup. Overrides should always + * call super.onViewAdded. + * + * @param child the added child view */ - protected void onViewRemoved(View child) { + public void onViewAdded(View child) { + } + + void dispatchViewRemoved(View child) { + onViewRemoved(child); if (mOnHierarchyChangeListener != null) { mOnHierarchyChangeListener.onChildViewRemoved(this, child); } } + /** + * Called when a child view is removed from this ViewGroup. Overrides should always + * call super.onViewRemoved. + * + * @param child the removed child view + */ + public void onViewRemoved(View child) { + } + private void clearCachedLayoutMode() { if (!hasBooleanFlag(FLAG_LAYOUT_MODE_WAS_EXPLICITLY_SET)) { mLayoutMode = LAYOUT_MODE_UNDEFINED; @@ -4292,7 +4306,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager child.resetRtlProperties(); } - onViewAdded(child); + dispatchViewAdded(child); if ((child.mViewFlags & DUPLICATE_PARENT_STATE) == DUPLICATE_PARENT_STATE) { mGroupFlags |= FLAG_NOTIFY_CHILDREN_ON_DRAWABLE_STATE_CHANGE; @@ -4554,7 +4568,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } } - onViewRemoved(view); + dispatchViewRemoved(view); if (view.getVisibility() != View.GONE) { notifySubtreeAccessibilityStateChangedIfNeeded(); @@ -4646,7 +4660,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager needGlobalAttributesUpdate(false); - onViewRemoved(view); + dispatchViewRemoved(view); } removeFromArray(start, count); @@ -4729,7 +4743,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager childHasTransientStateChanged(view, false); } - onViewRemoved(view); + dispatchViewRemoved(view); view.mParent = null; children[i] = null; @@ -4788,7 +4802,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager childHasTransientStateChanged(child, false); } - onViewRemoved(child); + dispatchViewRemoved(child); } /** diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java index db78ec5776c2..b49cbc6245ba 100644 --- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java +++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java @@ -186,7 +186,9 @@ public final class AccessibilityInteractionClient if (DEBUG) { Log.i(LOG_TAG, "Window cache miss"); } + final long identityToken = Binder.clearCallingIdentity(); window = connection.getWindow(accessibilityWindowId); + Binder.restoreCallingIdentity(identityToken); if (window != null) { sAccessibilityCache.addWindow(window); return window; @@ -222,7 +224,9 @@ public final class AccessibilityInteractionClient if (DEBUG) { Log.i(LOG_TAG, "Windows cache miss"); } + final long identityToken = Binder.clearCallingIdentity(); windows = connection.getWindows(); + Binder.restoreCallingIdentity(identityToken); if (windows != null) { final int windowCount = windows.size(); for (int i = 0; i < windowCount; i++) { @@ -282,9 +286,11 @@ public final class AccessibilityInteractionClient } } final int interactionId = mInteractionIdCounter.getAndIncrement(); + final long identityToken = Binder.clearCallingIdentity(); final boolean success = connection.findAccessibilityNodeInfoByAccessibilityId( accessibilityWindowId, accessibilityNodeId, interactionId, this, prefetchFlags, Thread.currentThread().getId()); + Binder.restoreCallingIdentity(identityToken); // If the scale is zero the call has failed. if (success) { List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear( @@ -328,9 +334,11 @@ public final class AccessibilityInteractionClient IAccessibilityServiceConnection connection = getConnection(connectionId); if (connection != null) { final int interactionId = mInteractionIdCounter.getAndIncrement(); + final long identityToken = Binder.clearCallingIdentity(); final boolean success = connection.findAccessibilityNodeInfosByViewId( accessibilityWindowId, accessibilityNodeId, viewId, interactionId, this, Thread.currentThread().getId()); + Binder.restoreCallingIdentity(identityToken); if (success) { List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear( interactionId); @@ -374,9 +382,11 @@ public final class AccessibilityInteractionClient IAccessibilityServiceConnection connection = getConnection(connectionId); if (connection != null) { final int interactionId = mInteractionIdCounter.getAndIncrement(); + final long identityToken = Binder.clearCallingIdentity(); final boolean success = connection.findAccessibilityNodeInfosByText( accessibilityWindowId, accessibilityNodeId, text, interactionId, this, Thread.currentThread().getId()); + Binder.restoreCallingIdentity(identityToken); if (success) { List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear( interactionId); @@ -419,9 +429,11 @@ public final class AccessibilityInteractionClient IAccessibilityServiceConnection connection = getConnection(connectionId); if (connection != null) { final int interactionId = mInteractionIdCounter.getAndIncrement(); + final long identityToken = Binder.clearCallingIdentity(); final boolean success = connection.findFocus(accessibilityWindowId, accessibilityNodeId, focusType, interactionId, this, Thread.currentThread().getId()); + Binder.restoreCallingIdentity(identityToken); if (success) { AccessibilityNodeInfo info = getFindAccessibilityNodeInfoResultAndClear( interactionId); @@ -461,9 +473,11 @@ public final class AccessibilityInteractionClient IAccessibilityServiceConnection connection = getConnection(connectionId); if (connection != null) { final int interactionId = mInteractionIdCounter.getAndIncrement(); + final long identityToken = Binder.clearCallingIdentity(); final boolean success = connection.focusSearch(accessibilityWindowId, accessibilityNodeId, direction, interactionId, this, Thread.currentThread().getId()); + Binder.restoreCallingIdentity(identityToken); if (success) { AccessibilityNodeInfo info = getFindAccessibilityNodeInfoResultAndClear( interactionId); @@ -502,9 +516,11 @@ public final class AccessibilityInteractionClient IAccessibilityServiceConnection connection = getConnection(connectionId); if (connection != null) { final int interactionId = mInteractionIdCounter.getAndIncrement(); + final long identityToken = Binder.clearCallingIdentity(); final boolean success = connection.performAccessibilityAction( accessibilityWindowId, accessibilityNodeId, action, arguments, interactionId, this, Thread.currentThread().getId()); + Binder.restoreCallingIdentity(identityToken); if (success) { return getPerformAccessibilityActionResultAndClear(interactionId); } diff --git a/core/java/android/webkit/WebViewClient.java b/core/java/android/webkit/WebViewClient.java index 2f5c9e2d2d45..de8ccc100880 100644 --- a/core/java/android/webkit/WebViewClient.java +++ b/core/java/android/webkit/WebViewClient.java @@ -298,14 +298,27 @@ public class WebViewClient { * Notify the host application to handle a SSL client certificate * request. The host application is responsible for showing the UI * if desired and providing the keys. There are three ways to - * respond: proceed(), cancel() or ignore(). Webview remembers the - * response if proceed() or cancel() is called and does not - * call onReceivedClientCertRequest() again for the same host and port - * pair. Webview does not remember the response if ignore() is called. + * respond: proceed(), cancel() or ignore(). Webview stores the response + * in memory (for the life of the application) if proceed() or cancel() is + * called and does not call onReceivedClientCertRequest() again for the + * same host and port pair. Webview does not store the response if ignore() + * is called. * * This method is called on the UI thread. During the callback, the * connection is suspended. * + * For most use cases, the application program should implement the + * {@link android.security.KeyChainAliasCallback} interface and pass it to + * {@link android.security.KeyChain#choosePrivateKeyAlias} to start an + * activity for the user to choose the proper alias. The keychain activity will + * provide the alias through the callback method in the implemented interface. Next + * the application should create an async task to call + * {@link android.security.KeyChain#getPrivateKey} to receive the key. + * + * An example implementation of client certificates can be seen at + * <A href="https://android.googlesource.com/platform/packages/apps/Browser/+/android-5.1.1_r1/src/com/android/browser/Tab.java"> + * AOSP Browser</a> + * * The default behavior is to cancel, returning no client certificate. * * @param view The WebView that is initiating the callback diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java index b4ef58afb94d..3b9aca8883e3 100644 --- a/core/java/android/webkit/WebViewFactory.java +++ b/core/java/android/webkit/WebViewFactory.java @@ -96,49 +96,27 @@ public final class WebViewFactory { public MissingWebViewPackageException(Exception e) { super(e); } } - /** @hide */ - public static String[] getWebViewPackageNames() { - return AppGlobals.getInitialApplication().getResources().getStringArray( - com.android.internal.R.array.config_webViewPackageNames); - } - - // TODO (gsennton) remove when committing webview xts test change public static String getWebViewPackageName() { - String[] webViewPackageNames = getWebViewPackageNames(); - return webViewPackageNames[webViewPackageNames.length-1]; + return AppGlobals.getInitialApplication().getString( + com.android.internal.R.string.config_webViewPackageName); } - /** - * Return the package info of the first package in the webview priority list that contains - * webview. - * - * @hide - */ - public static PackageInfo findPreferredWebViewPackage() { + private static PackageInfo fetchPackageInfo() { PackageManager pm = AppGlobals.getInitialApplication().getPackageManager(); - - for (String packageName : getWebViewPackageNames()) { - try { - PackageInfo packageInfo = pm.getPackageInfo(packageName, - PackageManager.GET_META_DATA); - ApplicationInfo applicationInfo = packageInfo.applicationInfo; - - // If the correct flag is set the package contains webview. - if (getWebViewLibrary(applicationInfo) != null) { - return packageInfo; - } - } catch (PackageManager.NameNotFoundException e) { - } + try { + return pm.getPackageInfo(getWebViewPackageName(), PackageManager.GET_META_DATA); + } catch (PackageManager.NameNotFoundException e) { + throw new MissingWebViewPackageException(e); } - throw new MissingWebViewPackageException("Could not find a loadable WebView package"); } // throws MissingWebViewPackageException private static ApplicationInfo getWebViewApplicationInfo() { - if (sPackageInfo == null) - return findPreferredWebViewPackage().applicationInfo; - else + if (sPackageInfo == null) { + return fetchPackageInfo().applicationInfo; + } else { return sPackageInfo.applicationInfo; + } } private static String getWebViewLibrary(ApplicationInfo ai) { @@ -153,10 +131,10 @@ public final class WebViewFactory { /** * Load the native library for the given package name iff that package - * name is the same as the one providing the current webview. + * name is the same as the one providing the webview. */ public static int loadWebViewNativeLibraryFromPackage(String packageName) { - sPackageInfo = findPreferredWebViewPackage(); + sPackageInfo = fetchPackageInfo(); if (packageName != null && packageName.equals(sPackageInfo.packageName)) { return loadNativeLibrary(); } @@ -202,7 +180,7 @@ public final class WebViewFactory { private static Class<WebViewFactoryProvider> getProviderClass() { try { // First fetch the package info so we can log the webview package version. - sPackageInfo = findPreferredWebViewPackage(); + sPackageInfo = fetchPackageInfo(); Log.i(LOGTAG, "Loading " + sPackageInfo.packageName + " version " + sPackageInfo.versionName + " (code " + sPackageInfo.versionCode + ")"); @@ -241,8 +219,8 @@ public final class WebViewFactory { try { // Construct a package context to load the Java code into the current app. Context webViewContext = initialApplication.createPackageContext( - sPackageInfo.packageName, - Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); + sPackageInfo.packageName, + Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); initialApplication.getAssets().addAssetPath( webViewContext.getApplicationInfo().sourceDir); ClassLoader clazzLoader = webViewContext.getClassLoader(); diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 6454b57d6619..a96bf71d91ef 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -3113,9 +3113,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } private boolean performStylusButtonPressAction(MotionEvent ev) { - if (ev.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS - && ev.isButtonPressed(MotionEvent.BUTTON_SECONDARY) - && mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL && mChoiceActionMode == null) { + if (mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL && mChoiceActionMode == null) { final View child = getChildAt(mMotionPosition - mFirstPosition); if (child != null) { final int longPressPosition = mMotionPosition; @@ -3785,7 +3783,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } if (mTouchMode == TOUCH_MODE_DOWN && mMotionPosition != INVALID_POSITION - && (performButtonActionOnTouchDown(ev) || performStylusButtonPressAction(ev))) { + && performButtonActionOnTouchDown(ev)) { removeCallbacks(mPendingCheckForTap); } } @@ -3828,11 +3826,6 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te mTouchMode = TOUCH_MODE_DONE_WAITING; updateSelectorState(); } else if (motionView != null) { - if (performStylusButtonPressAction(ev)) { - removeCallbacks(mPendingCheckForTap); - removeCallbacks(mPendingCheckForLongPress); - } - // Still within bounds, update the hotspot. final float[] point = mTmpPoint; point[0] = x; @@ -4072,7 +4065,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te public boolean onGenericMotionEvent(MotionEvent event) { if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) { switch (event.getAction()) { - case MotionEvent.ACTION_SCROLL: { + case MotionEvent.ACTION_SCROLL: if (mTouchMode == TOUCH_MODE_REST) { final float vscroll = event.getAxisValue(MotionEvent.AXIS_VSCROLL); if (vscroll != 0) { @@ -4082,9 +4075,22 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } } } - } + break; + + case MotionEvent.ACTION_BUTTON_PRESS: + int actionButton = event.getActionButton(); + if ((actionButton == MotionEvent.BUTTON_STYLUS_PRIMARY + || actionButton == MotionEvent.BUTTON_SECONDARY) + && (mTouchMode == TOUCH_MODE_DOWN || mTouchMode == TOUCH_MODE_TAP)) { + if (performStylusButtonPressAction(event)) { + removeCallbacks(mPendingCheckForLongPress); + removeCallbacks(mPendingCheckForTap); + } + } + break; } } + return super.onGenericMotionEvent(event); } diff --git a/core/java/android/widget/Chronometer.java b/core/java/android/widget/Chronometer.java index a15080e60331..ebb54ff39d06 100644 --- a/core/java/android/widget/Chronometer.java +++ b/core/java/android/widget/Chronometer.java @@ -17,6 +17,7 @@ package android.widget; import android.content.Context; +import android.content.res.Resources; import android.content.res.TypedArray; import android.os.Handler; import android.os.Message; @@ -24,6 +25,7 @@ import android.os.SystemClock; import android.text.format.DateUtils; import android.util.AttributeSet; import android.util.Log; +import android.view.accessibility.AccessibilityEvent; import android.widget.RemoteViews.RemoteView; import java.util.Formatter; @@ -58,6 +60,7 @@ public class Chronometer extends TextView { } private long mBase; + private long mNow; // the currently displayed time private boolean mVisible; private boolean mStarted; private boolean mRunning; @@ -224,6 +227,7 @@ public class Chronometer extends TextView { } private synchronized void updateText(long now) { + mNow = now; long seconds = now - mBase; seconds /= 1000; String text = DateUtils.formatElapsedTime(mRecycle, seconds); @@ -279,6 +283,60 @@ public class Chronometer extends TextView { } } + private static final int MIN_IN_SEC = 60; + private static final int HOUR_IN_SEC = MIN_IN_SEC*60; + private static String formatDuration(long ms) { + final Resources res = Resources.getSystem(); + final StringBuilder text = new StringBuilder(); + + int duration = (int) (ms / DateUtils.SECOND_IN_MILLIS); + if (duration < 0) { + duration = -duration; + } + + int h = 0; + int m = 0; + + if (duration >= HOUR_IN_SEC) { + h = duration / HOUR_IN_SEC; + duration -= h * HOUR_IN_SEC; + } + if (duration >= MIN_IN_SEC) { + m = duration / MIN_IN_SEC; + duration -= m * MIN_IN_SEC; + } + int s = duration; + + try { + if (h > 0) { + text.append(res.getQuantityString( + com.android.internal.R.plurals.duration_hours, h, h)); + } + if (m > 0) { + if (text.length() > 0) { + text.append(' '); + } + text.append(res.getQuantityString( + com.android.internal.R.plurals.duration_minutes, m, m)); + } + + if (text.length() > 0) { + text.append(' '); + } + text.append(res.getQuantityString( + com.android.internal.R.plurals.duration_seconds, s, s)); + } catch (Resources.NotFoundException e) { + // Ignore; plurals throws an exception for an untranslated quantity for a given locale. + return null; + } + return text.toString(); + } + + @Override + public CharSequence getContentDescription() { + return formatDuration(mNow - mBase); + } + @Override public CharSequence getAccessibilityClassName() { return Chronometer.class.getName(); diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index bde8dcf9ff02..e050bdab63f6 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -623,7 +623,7 @@ public class Editor { // One is the true focus lost where suggestions pop-up (if any) should be dismissed, and the // other is an side effect of showing the suggestions pop-up itself. We use isShowingUp() // to distinguish one from the other. - if (mSuggestionsPopupWindow != null && ((mTextView instanceof ExtractEditText) || + if (mSuggestionsPopupWindow != null && ((mTextView.isInExtractedMode()) || !mSuggestionsPopupWindow.isShowingUp())) { // Should be done before hide insertion point controller since it triggers a show of it mSuggestionsPopupWindow.hide(); @@ -640,7 +640,7 @@ public class Editor { mTextView.removeAdjacentSuggestionSpans(end); if (mTextView.isTextEditable() && mTextView.isSuggestionsEnabled() && - !(mTextView instanceof ExtractEditText)) { + !(mTextView.isInExtractedMode())) { if (mSpellChecker == null && createSpellChecker) { mSpellChecker = new SpellChecker(mTextView); } @@ -1063,7 +1063,7 @@ public class Editor { // ExtractEditText clears focus, which gives focus to the ExtractEditText. // This special case ensure that we keep current selection in that case. // It would be better to know why the DecorView does not have focus at that time. - if (((mTextView instanceof ExtractEditText) || mSelectionMoved) && + if (((mTextView.isInExtractedMode()) || mSelectionMoved) && selStart >= 0 && selEnd >= 0) { /* * Someone intentionally set the selection, so let them @@ -1099,7 +1099,7 @@ public class Editor { // Don't leave us in the middle of a batch edit. mTextView.onEndBatchEdit(); - if (mTextView instanceof ExtractEditText) { + if (mTextView.isInExtractedMode()) { // terminateTextSelectionMode removes selection, which we want to keep when // ExtractEditText goes out of focus. final int selStart = mTextView.getSelectionStart(); @@ -1825,7 +1825,7 @@ public class Editor { } private boolean extractedTextModeWillBeStarted() { - if (!(mTextView instanceof ExtractEditText)) { + if (!(mTextView.isInExtractedMode())) { final InputMethodManager imm = InputMethodManager.peekInstance(); return imm != null && imm.isFullscreenMode(); } @@ -3568,13 +3568,24 @@ public class Editor { } protected void updateDrawable() { + if (mIsDragging) { + // Don't update drawable during dragging. + return; + } final int offset = getCurrentCursorOffset(); final boolean isRtlCharAtOffset = mTextView.getLayout().isRtlCharAt(offset); final Drawable oldDrawable = mDrawable; mDrawable = isRtlCharAtOffset ? mDrawableRtl : mDrawableLtr; mHotspotX = getHotspotX(mDrawable, isRtlCharAtOffset); mHorizontalGravity = getHorizontalGravity(isRtlCharAtOffset); - if (oldDrawable != mDrawable) { + final Layout layout = mTextView.getLayout(); + if (layout != null && oldDrawable != mDrawable && isShowing()) { + // Update popup window position. + mPositionX = (int) (layout.getPrimaryHorizontal(offset) - 0.5f - mHotspotX - + getHorizontalOffset() + getCursorOffset()); + mPositionX += mTextView.viewportToContentHorizontalOffset(); + mPositionHasChanged = true; + updatePosition(mLastParentX, mLastParentY, false, false); postInvalidate(); } } @@ -3848,10 +3859,12 @@ public class Editor { case MotionEvent.ACTION_UP: filterOnTouchUp(); mIsDragging = false; + updateDrawable(); break; case MotionEvent.ACTION_CANCEL: mIsDragging = false; + updateDrawable(); break; } return true; @@ -4144,6 +4157,11 @@ public class Editor { offset = adjustedOffset; } positionCursor = true; + } else if (adjustedOffset < mPreviousOffset) { + // Handle has jumped to the start of the word, and the user is moving + // their finger towards the handle, the delta should be updated. + mTouchWordDelta = mTextView.convertToLocalHorizontalCoordinate(x) + - layout.getPrimaryHorizontal(mPreviousOffset); } } @@ -4278,6 +4296,11 @@ public class Editor { offset = adjustedOffset; } positionCursor = true; + } else if (adjustedOffset > mPreviousOffset) { + // Handle has jumped to the end of the word, and the user is moving + // their finger towards the handle, the delta should be updated. + mTouchWordDelta = layout.getPrimaryHorizontal(mPreviousOffset) + - mTextView.convertToLocalHorizontalCoordinate(x); } } @@ -4634,7 +4657,9 @@ public class Editor { mEndHandle.showAtLocation(endOffset); // No longer the first dragging motion, reset. - startSelectionActionMode(); + if (!(mTextView.isInExtractedMode())) { + startSelectionActionMode(); + } mDragAcceleratorActive = false; mStartOffset = -1; mSwitchedLines = false; diff --git a/core/java/android/widget/GridLayout.java b/core/java/android/widget/GridLayout.java index 6cc4bda43510..258424a2e574 100644 --- a/core/java/android/widget/GridLayout.java +++ b/core/java/android/widget/GridLayout.java @@ -935,22 +935,14 @@ public class GridLayout extends ViewGroup { super.onDebugDraw(canvas); } - // Add/remove - - /** - * @hide - */ @Override - protected void onViewAdded(View child) { + public void onViewAdded(View child) { super.onViewAdded(child); invalidateStructure(); } - /** - * @hide - */ @Override - protected void onViewRemoved(View child) { + public void onViewRemoved(View child) { super.onViewRemoved(child); invalidateStructure(); } diff --git a/core/java/android/widget/ListPopupWindow.java b/core/java/android/widget/ListPopupWindow.java index afc683ad439e..534bfad94e91 100644 --- a/core/java/android/widget/ListPopupWindow.java +++ b/core/java/android/widget/ListPopupWindow.java @@ -105,7 +105,7 @@ public class ListPopupWindow { private final ListSelectorHider mHideSelector = new ListSelectorHider(); private Runnable mShowDropDownRunnable; - private Handler mHandler = new Handler(); + private final Handler mHandler; private Rect mTempRect = new Rect(); @@ -212,6 +212,7 @@ public class ListPopupWindow { */ public ListPopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { mContext = context; + mHandler = new Handler(context.getMainLooper()); final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ListPopupWindow, defStyleAttr, defStyleRes); diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index e7d9226d66bc..b5fae4ed17a9 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -149,6 +149,11 @@ public class NumberPicker extends LinearLayout { private static final int SIZE_UNSPECIFIED = -1; /** + * User choice on whether the selector wheel should be wrapped. + */ + private boolean mWrapSelectorWheelPreferred = true; + + /** * Use a custom NumberPicker formatting callback to use two-digit minutes * strings like "01". Keeping a static formatter etc. is the most efficient * way to do this; it avoids creating temporary objects on every call to @@ -1353,10 +1358,21 @@ public class NumberPicker extends LinearLayout { * @param wrapSelectorWheel Whether to wrap. */ public void setWrapSelectorWheel(boolean wrapSelectorWheel) { + mWrapSelectorWheelPreferred = wrapSelectorWheel; + updateWrapSelectorWheel(); + + } + + /** + * Whether or not the selector wheel should be wrapped is determined by user choice and whether + * the choice is allowed. The former comes from {@link #setWrapSelectorWheel(boolean)}, the + * latter is calculated based on min & max value set vs selector's visual length. Therefore, + * this method should be called any time any of the 3 values (i.e. user choice, min and max + * value) gets updated. + */ + private void updateWrapSelectorWheel() { final boolean wrappingAllowed = (mMaxValue - mMinValue) >= mSelectorIndices.length; - if ((!wrapSelectorWheel || wrappingAllowed) && wrapSelectorWheel != mWrapSelectorWheel) { - mWrapSelectorWheel = wrapSelectorWheel; - } + mWrapSelectorWheel = wrappingAllowed && mWrapSelectorWheelPreferred; } /** @@ -1412,8 +1428,7 @@ public class NumberPicker extends LinearLayout { if (mMinValue > mValue) { mValue = mMinValue; } - boolean wrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length; - setWrapSelectorWheel(wrapSelectorWheel); + updateWrapSelectorWheel(); initializeSelectorWheelIndices(); updateInputTextView(); tryComputeMaxWidth(); @@ -1450,8 +1465,7 @@ public class NumberPicker extends LinearLayout { if (mMaxValue < mValue) { mValue = mMaxValue; } - boolean wrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length; - setWrapSelectorWheel(wrapSelectorWheel); + updateWrapSelectorWheel(); initializeSelectorWheelIndices(); updateInputTextView(); tryComputeMaxWidth(); diff --git a/core/java/android/widget/OverScroller.java b/core/java/android/widget/OverScroller.java index 451e493ccd0e..98bfd7d19872 100644 --- a/core/java/android/widget/OverScroller.java +++ b/core/java/android/widget/OverScroller.java @@ -731,7 +731,7 @@ public class OverScroller { // mStartTime has been set mFinished = false; mState = CUBIC; - mStart = start; + mCurrentPosition = mStart = start; mFinal = end; final int delta = start - end; mDeceleration = getDeceleration(delta); @@ -797,7 +797,9 @@ public class OverScroller { private void fitOnBounceCurve(int start, int end, int velocity) { // Simulate a bounce that started from edge final float durationToApex = - velocity / mDeceleration; - final float distanceToApex = velocity * velocity / 2.0f / Math.abs(mDeceleration); + // The float cast below is necessary to avoid integer overflow. + final float velocitySquared = (float) velocity * velocity; + final float distanceToApex = velocitySquared / 2.0f / Math.abs(mDeceleration); final float distanceToEdge = Math.abs(end - start); final float totalDuration = (float) Math.sqrt( 2.0 * (distanceToApex + distanceToEdge) / Math.abs(mDeceleration)); @@ -848,12 +850,14 @@ public class OverScroller { private void onEdgeReached() { // mStart, mVelocity and mStartTime were adjusted to their values when edge was reached. - float distance = mVelocity * mVelocity / (2.0f * Math.abs(mDeceleration)); + // The float cast below is necessary to avoid integer overflow. + final float velocitySquared = (float) mVelocity * mVelocity; + float distance = velocitySquared / (2.0f * Math.abs(mDeceleration)); final float sign = Math.signum(mVelocity); if (distance > mOver) { // Default deceleration is not sufficient to slow us down before boundary - mDeceleration = - sign * mVelocity * mVelocity / (2.0f * mOver); + mDeceleration = - sign * velocitySquared / (2.0f * mOver); distance = mOver; } diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index 339038eddf3f..affc5daa35f7 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -522,7 +522,7 @@ public class RelativeLayout extends ViewGroup { View baselineView = null; LayoutParams baselineParams = null; for (int i = 0; i < count; i++) { - final View child = views[i]; + final View child = getChildAt(i); if (child.getVisibility() != GONE) { final LayoutParams childParams = (LayoutParams) child.getLayoutParams(); if (baselineView == null || baselineParams == null @@ -548,9 +548,9 @@ public class RelativeLayout extends ViewGroup { if (offsetHorizontalAxis) { for (int i = 0; i < count; i++) { - final View child = views[i]; + View child = getChildAt(i); if (child.getVisibility() != GONE) { - final LayoutParams params = (LayoutParams) child.getLayoutParams(); + LayoutParams params = (LayoutParams) child.getLayoutParams(); final int[] rules = params.getRules(layoutDirection); if (rules[CENTER_IN_PARENT] != 0 || rules[CENTER_HORIZONTAL] != 0) { centerHorizontal(child, params, width); @@ -578,9 +578,9 @@ public class RelativeLayout extends ViewGroup { if (offsetVerticalAxis) { for (int i = 0; i < count; i++) { - final View child = views[i]; + View child = getChildAt(i); if (child.getVisibility() != GONE) { - final LayoutParams params = (LayoutParams) child.getLayoutParams(); + LayoutParams params = (LayoutParams) child.getLayoutParams(); final int[] rules = params.getRules(layoutDirection); if (rules[CENTER_IN_PARENT] != 0 || rules[CENTER_VERTICAL] != 0) { centerVertical(child, params, height); @@ -607,9 +607,9 @@ public class RelativeLayout extends ViewGroup { final int verticalOffset = contentBounds.top - top; if (horizontalOffset != 0 || verticalOffset != 0) { for (int i = 0; i < count; i++) { - final View child = views[i]; + View child = getChildAt(i); if (child.getVisibility() != GONE && child != ignore) { - final LayoutParams params = (LayoutParams) child.getLayoutParams(); + LayoutParams params = (LayoutParams) child.getLayoutParams(); if (horizontalGravity) { params.mLeft += horizontalOffset; params.mRight += horizontalOffset; @@ -626,9 +626,9 @@ public class RelativeLayout extends ViewGroup { if (isLayoutRtl()) { final int offsetWidth = myWidth - width; for (int i = 0; i < count; i++) { - final View child = views[i]; + View child = getChildAt(i); if (child.getVisibility() != GONE) { - final LayoutParams params = (LayoutParams) child.getLayoutParams(); + LayoutParams params = (LayoutParams) child.getLayoutParams(); params.mLeft -= offsetWidth; params.mRight -= offsetWidth; } diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index c538dc2d514c..f733eab42534 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -8637,6 +8637,15 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } /** + * @return true if this TextView is specialized for showing and interacting with the extracted + * text in a full-screen input method. + * @hide + */ + public boolean isInExtractedMode() { + return false; + } + + /** * This is a temporary method. Future versions may support multi-locale text. * Caveat: This method may not return the latest spell checker locale, but this should be * acceptable and it's more important to make this method asynchronous. diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index c1ec6e6907cd..678e92b35db8 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -50,11 +50,13 @@ import android.util.Slog; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; +import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.ListView; import com.android.internal.R; +import com.android.internal.logging.MetricsLogger; import java.util.ArrayList; import java.util.List; @@ -185,6 +187,8 @@ public class ChooserActivity extends ResolverActivity { setSafeForwardingMode(true); super.onCreate(savedInstanceState, target, title, defaultTitleRes, initialIntents, null, false); + + MetricsLogger.action(this, MetricsLogger.ACTION_ACTIVITY_CHOOSER_SHOWN); } @Override @@ -291,6 +295,36 @@ public class ChooserActivity extends ResolverActivity { return super.onTargetSelected(target, alwaysCheck); } + @Override + void startSelected(int which, boolean always, boolean filtered) { + super.startSelected(which, always, filtered); + + if (mChooserListAdapter != null) { + // Log the index of which type of target the user picked. + // Lower values mean the ranking was better. + int cat = 0; + int value = which; + switch (mChooserListAdapter.getPositionTargetType(which)) { + case ChooserListAdapter.TARGET_CALLER: + cat = MetricsLogger.ACTION_ACTIVITY_CHOOSER_PICKED_APP_TARGET; + break; + case ChooserListAdapter.TARGET_SERVICE: + cat = MetricsLogger.ACTION_ACTIVITY_CHOOSER_PICKED_SERVICE_TARGET; + value -= mChooserListAdapter.getCallerTargetCount(); + break; + case ChooserListAdapter.TARGET_STANDARD: + cat = MetricsLogger.ACTION_ACTIVITY_CHOOSER_PICKED_STANDARD_TARGET; + value -= mChooserListAdapter.getCallerTargetCount() + + mChooserListAdapter.getServiceTargetCount(); + break; + } + + if (cat != 0) { + MetricsLogger.action(this, cat, value); + } + } + } + void queryTargetServices(ChooserListAdapter adapter) { final PackageManager pm = getPackageManager(); int targetsToQuery = 0; @@ -613,15 +647,17 @@ public class ChooserActivity extends ResolverActivity { ri.activityInfo = ai; UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE); - if (userManager.isManagedProfile()) { - ri.noResourceId = true; - } if (ii instanceof LabeledIntent) { LabeledIntent li = (LabeledIntent)ii; ri.resolvePackageName = li.getSourcePackage(); ri.labelRes = li.getLabelResource(); ri.nonLocalizedLabel = li.getNonLocalizedLabel(); ri.icon = li.getIconResource(); + ri.iconResourceId = ri.icon; + } + if (userManager.isManagedProfile()) { + ri.noResourceId = true; + ri.icon = 0; } mCallerTargets.add(new DisplayResolveInfo(ii, ri, ri.loadLabel(pm), null, ii)); @@ -849,6 +885,14 @@ public class ChooserActivity extends ResolverActivity { startSelected(itemIndex, false, true); } }); + v.setOnLongClickListener(new OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + showAppDetails( + mChooserListAdapter.resolveInfoForPosition(itemIndex, true)); + return true; + } + }); } else { v.setVisibility(View.GONE); } diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl index 929cacd553f6..6f0cec60bd46 100644 --- a/core/java/com/android/internal/app/IBatteryStats.aidl +++ b/core/java/com/android/internal/app/IBatteryStats.aidl @@ -116,7 +116,7 @@ interface IBatteryStats { void noteWifiRadioPowerState(int powerState, long timestampNs); void noteNetworkInterfaceType(String iface, int type); void noteNetworkStatsEnabled(); - void noteDeviceIdleMode(boolean enabled, boolean fromActive, boolean fromMotion); + void noteDeviceIdleMode(boolean enabled, String activeReason, int activeUid); void setBatteryState(int status, int health, int plugType, int level, int temp, int volt); long getAwakeTimeBattery(); long getAwakeTimePlugged(); diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 39c86f99c55b..e14f0584a0b8 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -1186,15 +1186,17 @@ public class ResolverActivity extends Activity { ri.activityInfo = ai; UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE); - if (userManager.isManagedProfile()) { - ri.noResourceId = true; - } if (ii instanceof LabeledIntent) { LabeledIntent li = (LabeledIntent)ii; ri.resolvePackageName = li.getSourcePackage(); ri.labelRes = li.getLabelResource(); ri.nonLocalizedLabel = li.getNonLocalizedLabel(); ri.icon = li.getIconResource(); + ri.iconResourceId = ri.icon; + } + if (userManager.isManagedProfile()) { + ri.noResourceId = true; + ri.icon = 0; } addResolveInfo(new DisplayResolveInfo(ii, ri, ri.loadLabel(getPackageManager()), null, ii)); diff --git a/core/java/com/android/internal/appwidget/IAppWidgetService.aidl b/core/java/com/android/internal/appwidget/IAppWidgetService.aidl index 7d3db02d6bca..5a195cb7dd20 100644 --- a/core/java/com/android/internal/appwidget/IAppWidgetService.aidl +++ b/core/java/com/android/internal/appwidget/IAppWidgetService.aidl @@ -20,6 +20,7 @@ import android.content.ComponentName; import android.content.Intent; import android.content.IntentSender; import android.content.pm.ApplicationInfo; +import android.content.pm.ParceledListSlice; import android.appwidget.AppWidgetProviderInfo; import com.android.internal.appwidget.IAppWidgetHost; import android.os.Bundle; @@ -54,7 +55,7 @@ interface IAppWidgetService { in RemoteViews views); void updateAppWidgetProvider(in ComponentName provider, in RemoteViews views); void notifyAppWidgetViewDataChanged(String packageName, in int[] appWidgetIds, int viewId); - List<AppWidgetProviderInfo> getInstalledProvidersForProfile(int categoryFilter, + ParceledListSlice getInstalledProvidersForProfile(int categoryFilter, int profileId); AppWidgetProviderInfo getAppWidgetInfo(String callingPackage, int appWidgetId); boolean hasBindAppWidgetPermission(in String packageName, int userId); diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java index 042db7154bee..ac17cbe0bcfc 100644 --- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java +++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java @@ -22,9 +22,10 @@ import android.app.AppOpsManager; import android.content.ContentResolver; import android.content.Context; import android.content.pm.ApplicationInfo; +import android.content.pm.IPackageManager; import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; +import android.os.RemoteException; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.text.TextUtils; @@ -646,7 +647,8 @@ public class InputMethodUtils { } public static void setNonSelectedSystemImesDisabledUntilUsed( - PackageManager packageManager, List<InputMethodInfo> enabledImis) { + IPackageManager packageManager, List<InputMethodInfo> enabledImis, + int userId, String callingPackage) { if (DEBUG) { Slog.d(TAG, "setNonSelectedSystemImesDisabledUntilUsed"); } @@ -685,9 +687,11 @@ public class InputMethodUtils { ApplicationInfo ai = null; try { ai = packageManager.getApplicationInfo(packageName, - PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS); - } catch (NameNotFoundException e) { - Slog.w(TAG, "NameNotFoundException: " + packageName, e); + PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, userId); + } catch (RemoteException e) { + Slog.w(TAG, "getApplicationInfo failed. packageName=" + packageName + + " userId=" + userId, e); + continue; } if (ai == null) { // No app found for packageName @@ -697,19 +701,34 @@ public class InputMethodUtils { if (!isSystemPackage) { continue; } - setDisabledUntilUsed(packageManager, packageName); + setDisabledUntilUsed(packageManager, packageName, userId, callingPackage); } } - private static void setDisabledUntilUsed(PackageManager packageManager, String packageName) { - final int state = packageManager.getApplicationEnabledSetting(packageName); + private static void setDisabledUntilUsed(IPackageManager packageManager, String packageName, + int userId, String callingPackage) { + final int state; + try { + state = packageManager.getApplicationEnabledSetting(packageName, userId); + } catch (RemoteException e) { + Slog.w(TAG, "getApplicationEnabledSetting failed. packageName=" + packageName + + " userId=" + userId, e); + return; + } if (state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT || state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { if (DEBUG) { Slog.d(TAG, "Update state(" + packageName + "): DISABLED_UNTIL_USED"); } - packageManager.setApplicationEnabledSetting(packageName, - PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED, 0); + try { + packageManager.setApplicationEnabledSetting(packageName, + PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED, + 0 /* newState */, userId, callingPackage); + } catch (RemoteException e) { + Slog.w(TAG, "setApplicationEnabledSetting failed. packageName=" + packageName + + " userId=" + userId + " callingPackage=" + callingPackage, e); + return; + } } else { if (DEBUG) { Slog.d(TAG, packageName + " is already DISABLED_UNTIL_USED"); diff --git a/core/java/com/android/internal/logging/MetricsLogger.java b/core/java/com/android/internal/logging/MetricsLogger.java index 230d96dc6f58..e4ccb4bdad7b 100644 --- a/core/java/com/android/internal/logging/MetricsLogger.java +++ b/core/java/com/android/internal/logging/MetricsLogger.java @@ -26,6 +26,17 @@ import android.view.View; * @hide */ public class MetricsLogger implements MetricsConstants { + public static final int VOLUME_DIALOG = 207; + public static final int VOLUME_DIALOG_DETAILS = 208; + public static final int ACTION_VOLUME_SLIDER = 209; + public static final int ACTION_VOLUME_STREAM = 210; + public static final int ACTION_VOLUME_KEY = 211; + public static final int ACTION_VOLUME_ICON = 212; + public static final int ACTION_RINGER_MODE = 213; + public static final int ACTION_ACTIVITY_CHOOSER_SHOWN = 214; + public static final int ACTION_ACTIVITY_CHOOSER_PICKED_APP_TARGET = 215; + public static final int ACTION_ACTIVITY_CHOOSER_PICKED_SERVICE_TARGET = 216; + public static final int ACTION_ACTIVITY_CHOOSER_PICKED_STANDARD_TARGET = 217; // Temporary constants go here, to await migration to MetricsConstants. public static void visible(Context context, int category) throws IllegalArgumentException { diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 07d1fc8624de..1bd821d7154d 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -95,7 +95,8 @@ import java.util.concurrent.locks.ReentrantLock; public final class BatteryStatsImpl extends BatteryStats { private static final String TAG = "BatteryStatsImpl"; private static final boolean DEBUG = false; - private static final boolean DEBUG_ENERGY = false; + public static final boolean DEBUG_ENERGY = false; + private static final boolean DEBUG_ENERGY_CPU = DEBUG_ENERGY || false; private static final boolean DEBUG_HISTORY = false; private static final boolean USE_OLD_HISTORY = false; // for debugging. @@ -105,7 +106,7 @@ public final class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - private static final int VERSION = 127 + (USE_OLD_HISTORY ? 1000 : 0); + private static final int VERSION = 129 + (USE_OLD_HISTORY ? 1000 : 0); // Maximum number of items we will record in the history. private static final int MAX_HISTORY_ITEMS = 2000; @@ -151,6 +152,9 @@ public final class BatteryStatsImpl extends BatteryStats { BatteryCallback cb = mCallback; switch (msg.what) { case MSG_UPDATE_WAKELOCKS: + synchronized (BatteryStatsImpl.this) { + updateCpuTimeLocked(); + } if (cb != null) { cb.batteryNeedsCpuUpdate(); } @@ -178,6 +182,7 @@ public final class BatteryStatsImpl extends BatteryStats { public interface ExternalStatsSync { void scheduleSync(String reason); + void scheduleWifiSync(String reason); } public final MyHandler mHandler; @@ -203,6 +208,7 @@ public final class BatteryStatsImpl extends BatteryStats { final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<>(); final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<>(); final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<>(); + final ArrayList<StopwatchTimer> mDrawTimers = new ArrayList<>(); final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers = new SparseArray<>(); final ArrayList<StopwatchTimer> mWifiRunningTimers = new ArrayList<>(); final ArrayList<StopwatchTimer> mFullWifiLockTimers = new ArrayList<>(); @@ -2503,12 +2509,11 @@ public final class BatteryStatsImpl extends BatteryStats { boolean unpluggedScreenOff = unplugged && screenOff; if (unpluggedScreenOff != mOnBatteryScreenOffTimeBase.isRunning()) { updateKernelWakelocksLocked(); - requestWakelockCpuUpdate(); - if (!unpluggedScreenOff) { - // We are switching to no longer tracking wake locks, but we want - // the next CPU update we receive to take them in to account. - mDistributeWakelockCpu = true; + if (DEBUG_ENERGY_CPU) { + Slog.d(TAG, "Updating cpu time because screen is now " + + (unpluggedScreenOff ? "off" : "on")); } + updateCpuTimeLocked(); mOnBatteryScreenOffTimeBase.setRunning(unpluggedScreenOff, uptime, realtime); } } @@ -2772,10 +2777,14 @@ public final class BatteryStatsImpl extends BatteryStats { mWakeLockNesting++; } if (uid >= 0) { - //if (uid == 0) { - // Slog.wtf(TAG, "Acquiring wake lock from root: " + name); - //} - requestWakelockCpuUpdate(); + if (mOnBatteryScreenOffTimeBase.isRunning()) { + // We only update the cpu time when a wake lock is acquired if the screen is off. + // If the screen is on, we don't distribute the power amongst partial wakelocks. + if (DEBUG_ENERGY_CPU) { + Slog.d(TAG, "Updating cpu time because of +wake_lock"); + } + requestWakelockCpuUpdate(); + } getUidStatsLocked(uid).noteStartWakeLocked(pid, name, type, elapsedRealtime); } } @@ -2805,7 +2814,12 @@ public final class BatteryStatsImpl extends BatteryStats { } } if (uid >= 0) { - requestWakelockCpuUpdate(); + if (mOnBatteryScreenOffTimeBase.isRunning()) { + if (DEBUG_ENERGY_CPU) { + Slog.d(TAG, "Updating cpu time because of -wake_lock"); + } + requestWakelockCpuUpdate(); + } getUidStatsLocked(uid).noteStopWakeLocked(pid, name, type, elapsedRealtime); } } @@ -2874,46 +2888,14 @@ public final class BatteryStatsImpl extends BatteryStats { addHistoryRecordLocked(elapsedRealtime, uptime); } - public int startAddingCpuLocked() { + public boolean startAddingCpuLocked() { mHandler.removeMessages(MSG_UPDATE_WAKELOCKS); - - if (!mOnBatteryInternal) { - return -1; - } - - final int N = mPartialTimers.size(); - if (N == 0) { - mLastPartialTimers.clear(); - mDistributeWakelockCpu = false; - return 0; - } - - if (!mOnBatteryScreenOffTimeBase.isRunning() && !mDistributeWakelockCpu) { - return 0; - } - - mDistributeWakelockCpu = false; - - // How many timers should consume CPU? Only want to include ones - // that have already been in the list. - for (int i=0; i<N; i++) { - StopwatchTimer st = mPartialTimers.get(i); - if (st.mInList) { - Uid uid = st.mUid; - // We don't include the system UID, because it so often - // holds wake locks at one request or another of an app. - if (uid != null && uid.mUid != Process.SYSTEM_UID) { - return 50; - } - } - } - - return 0; + return mOnBatteryInternal; } - public void finishAddingCpuLocked(int perc, int remainUTime, int remainSTtime, - int totalUTime, int totalSTime, int statUserTime, int statSystemTime, - int statIOWaitTime, int statIrqTime, int statSoftIrqTime, int statIdleTime) { + public void finishAddingCpuLocked(int totalUTime, int totalSTime, int statUserTime, + int statSystemTime, int statIOWaitTime, int statIrqTime, + int statSoftIrqTime, int statIdleTime) { if (DEBUG) Slog.d(TAG, "Adding cpu: tuser=" + totalUTime + " tsys=" + totalSTime + " user=" + statUserTime + " sys=" + statSystemTime + " io=" + statIOWaitTime + " irq=" + statIrqTime @@ -2926,70 +2908,6 @@ public final class BatteryStatsImpl extends BatteryStats { mCurStepStatIrqTime += statIrqTime; mCurStepStatSoftIrqTime += statSoftIrqTime; mCurStepStatIdleTime += statIdleTime; - - final int N = mPartialTimers.size(); - if (perc != 0) { - int num = 0; - for (int i=0; i<N; i++) { - StopwatchTimer st = mPartialTimers.get(i); - if (st.mInList) { - Uid uid = st.mUid; - // We don't include the system UID, because it so often - // holds wake locks at one request or another of an app. - if (uid != null && uid.mUid != Process.SYSTEM_UID) { - num++; - } - } - } - if (num != 0) { - for (int i=0; i<N; i++) { - StopwatchTimer st = mPartialTimers.get(i); - if (st.mInList) { - Uid uid = st.mUid; - if (uid != null && uid.mUid != Process.SYSTEM_UID) { - int myUTime = remainUTime/num; - int mySTime = remainSTtime/num; - remainUTime -= myUTime; - remainSTtime -= mySTime; - num--; - Uid.Proc proc = uid.getProcessStatsLocked("*wakelock*"); - proc.addCpuTimeLocked(myUTime, mySTime); - } - } - } - } - - // Just in case, collect any lost CPU time. - if (remainUTime != 0 || remainSTtime != 0) { - Uid uid = getUidStatsLocked(Process.SYSTEM_UID); - if (uid != null) { - Uid.Proc proc = uid.getProcessStatsLocked("*lost*"); - proc.addCpuTimeLocked(remainUTime, remainSTtime); - } - } - } - - final int NL = mLastPartialTimers.size(); - boolean diff = N != NL; - for (int i=0; i<NL && !diff; i++) { - diff |= mPartialTimers.get(i) != mLastPartialTimers.get(i); - } - if (!diff) { - for (int i=0; i<NL; i++) { - mPartialTimers.get(i).mInList = true; - } - return; - } - - for (int i=0; i<NL; i++) { - mLastPartialTimers.get(i).mInList = false; - } - mLastPartialTimers.clear(); - for (int i=0; i<N; i++) { - StopwatchTimer st = mPartialTimers.get(i); - st.mInList = true; - mLastPartialTimers.add(st); - } } public void noteProcessDiedLocked(int uid, int pid) { @@ -3271,11 +3189,11 @@ public final class BatteryStatsImpl extends BatteryStats { } } - public void noteDeviceIdleModeLocked(boolean enabled, boolean fromActive, boolean fromMotion) { + public void noteDeviceIdleModeLocked(boolean enabled, String activeReason, int activeUid) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); boolean nowIdling = enabled; - if (mDeviceIdling && !enabled && !fromActive && !fromMotion) { + if (mDeviceIdling && !enabled && activeReason == null) { // We don't go out of general idling mode until explicitly taken out of // device idle through going active or significant motion. nowIdling = true; @@ -3293,14 +3211,8 @@ public final class BatteryStatsImpl extends BatteryStats { } if (mDeviceIdleModeEnabled != enabled) { mDeviceIdleModeEnabled = enabled; - if (fromMotion) { - addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_SIGNIFICANT_MOTION, - "", 0); - } - if (fromActive) { - addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_ACTIVE, - "", 0); - } + addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_ACTIVE, + activeReason != null ? activeReason : "", activeUid); if (enabled) { mHistoryCur.states2 |= HistoryItem.STATE2_DEVICE_IDLE_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Device idle mode enabled to: " @@ -3580,7 +3492,7 @@ public final class BatteryStatsImpl extends BatteryStats { addHistoryRecordLocked(elapsedRealtime, uptime); mWifiOn = true; mWifiOnTimer.startRunningLocked(elapsedRealtime); - scheduleSyncExternalStatsLocked("wifi-off"); + scheduleSyncExternalWifiStatsLocked("wifi-off"); } } @@ -3594,7 +3506,7 @@ public final class BatteryStatsImpl extends BatteryStats { addHistoryRecordLocked(elapsedRealtime, uptime); mWifiOn = false; mWifiOnTimer.stopRunningLocked(elapsedRealtime); - scheduleSyncExternalStatsLocked("wifi-on"); + scheduleSyncExternalWifiStatsLocked("wifi-on"); } } @@ -3846,7 +3758,7 @@ public final class BatteryStatsImpl extends BatteryStats { int uid = mapUid(ws.get(i)); getUidStatsLocked(uid).noteWifiRunningLocked(elapsedRealtime); } - scheduleSyncExternalStatsLocked("wifi-running"); + scheduleSyncExternalWifiStatsLocked("wifi-running"); } else { Log.w(TAG, "noteWifiRunningLocked -- called while WIFI running"); } @@ -3885,7 +3797,7 @@ public final class BatteryStatsImpl extends BatteryStats { int uid = mapUid(ws.get(i)); getUidStatsLocked(uid).noteWifiStoppedLocked(elapsedRealtime); } - scheduleSyncExternalStatsLocked("wifi-stopped"); + scheduleSyncExternalWifiStatsLocked("wifi-stopped"); } else { Log.w(TAG, "noteWifiStoppedLocked -- called while WIFI not running"); } @@ -3900,7 +3812,7 @@ public final class BatteryStatsImpl extends BatteryStats { } mWifiState = wifiState; mWifiStateTimer[wifiState].startRunningLocked(elapsedRealtime); - scheduleSyncExternalStatsLocked("wifi-state"); + scheduleSyncExternalWifiStatsLocked("wifi-state"); } } @@ -5737,6 +5649,11 @@ public final class BatteryStatsImpl extends BatteryStats { StopwatchTimer mTimerWindow; /** + * How long (in ms) this uid has had a draw wake lock. + */ + StopwatchTimer mTimerDraw; + + /** * Reads a possibly null Timer from a Parcel. The timer is associated with the * proper timer pool from the given BatteryStatsImpl object. * @@ -5763,6 +5680,9 @@ public final class BatteryStatsImpl extends BatteryStats { if (mTimerWindow != null) { wlactive |= !mTimerWindow.reset(false); } + if (mTimerDraw != null) { + wlactive |= !mTimerDraw.reset(false); + } if (!wlactive) { if (mTimerFull != null) { mTimerFull.detach(); @@ -5776,6 +5696,10 @@ public final class BatteryStatsImpl extends BatteryStats { mTimerWindow.detach(); mTimerWindow = null; } + if (mTimerDraw != null) { + mTimerDraw.detach(); + mTimerDraw = null; + } } return !wlactive; } @@ -5783,16 +5707,16 @@ public final class BatteryStatsImpl extends BatteryStats { void readFromParcelLocked(TimeBase timeBase, TimeBase screenOffTimeBase, Parcel in) { mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL, mPartialTimers, screenOffTimeBase, in); - mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL, - mFullTimers, timeBase, in); - mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW, - mWindowTimers, timeBase, in); + mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL, mFullTimers, timeBase, in); + mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW, mWindowTimers, timeBase, in); + mTimerDraw = readTimerFromParcel(WAKE_TYPE_DRAW, mDrawTimers, timeBase, in); } void writeToParcelLocked(Parcel out, long elapsedRealtimeUs) { Timer.writeTimerToParcel(out, mTimerPartial, elapsedRealtimeUs); Timer.writeTimerToParcel(out, mTimerFull, elapsedRealtimeUs); Timer.writeTimerToParcel(out, mTimerWindow, elapsedRealtimeUs); + Timer.writeTimerToParcel(out, mTimerDraw, elapsedRealtimeUs); } @Override @@ -5801,6 +5725,7 @@ public final class BatteryStatsImpl extends BatteryStats { case WAKE_TYPE_FULL: return mTimerFull; case WAKE_TYPE_PARTIAL: return mTimerPartial; case WAKE_TYPE_WINDOW: return mTimerWindow; + case WAKE_TYPE_DRAW: return mTimerDraw; default: throw new IllegalArgumentException("type = " + type); } } @@ -5832,6 +5757,14 @@ public final class BatteryStatsImpl extends BatteryStats { mTimerWindow = t; } return t; + case WAKE_TYPE_DRAW: + t = mTimerDraw; + if (t == null) { + t = new StopwatchTimer(Uid.this, WAKE_TYPE_DRAW, + mDrawTimers, mOnBatteryTimeBase); + mTimerDraw = t; + } + return t; default: throw new IllegalArgumentException("type=" + type); } @@ -6688,6 +6621,9 @@ public final class BatteryStatsImpl extends BatteryStats { if (in.readInt() != 0) { wl.getStopwatchTimer(WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in); } + if (in.readInt() != 0) { + wl.getStopwatchTimer(WAKE_TYPE_DRAW).readSummaryFromParcelLocked(in); + } } public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) { @@ -7632,6 +7568,10 @@ public final class BatteryStatsImpl extends BatteryStats { * @param info The energy information from the WiFi controller. */ public void updateWifiStateLocked(@Nullable final WifiActivityEnergyInfo info) { + if (DEBUG_ENERGY) { + Slog.d(TAG, "Updating wifi stats"); + } + final long elapsedRealtimeMs = SystemClock.elapsedRealtime(); NetworkStats delta = null; try { @@ -7829,6 +7769,10 @@ public final class BatteryStatsImpl extends BatteryStats { * Distribute Cell radio energy info and network traffic to apps. */ public void updateMobileRadioStateLocked(final long elapsedRealtimeMs) { + if (DEBUG_ENERGY) { + Slog.d(TAG, "Updating mobile radio stats"); + } + NetworkStats delta = null; try { if (!ArrayUtils.isEmpty(mMobileIfaces)) { @@ -7901,6 +7845,10 @@ public final class BatteryStatsImpl extends BatteryStats { * @param info The energy information from the bluetooth controller. */ public void updateBluetoothStateLocked(@Nullable final BluetoothActivityEnergyInfo info) { + if (DEBUG_ENERGY) { + Slog.d(TAG, "Updating bluetooth stats"); + } + if (info != null && mOnBatteryInternal) { mHasBluetoothEnergyReporting = true; mBluetoothActivityCounters[CONTROLLER_RX_TIME].addCountLocked( @@ -7959,30 +7907,196 @@ public final class BatteryStatsImpl extends BatteryStats { } } + // We use an anonymous class to access these variables, + // so they can't live on the stack or they'd have to be + // final MutableLong objects (more allocations). + // Used in updateCpuTimeLocked(). + long mTempTotalCpuUserTimeUs; + long mTempTotalCpuSystemTimeUs; + /** - * Read and distribute CPU usage across apps. + * Read and distribute CPU usage across apps. If their are partial wakelocks being held + * and we are on battery with screen off, we give more of the cpu time to those apps holding + * wakelocks. If the screen is on, we just assign the actual cpu time an app used. */ - public void updateCpuTimeLocked(boolean firstTime) { + public void updateCpuTimeLocked() { + if (DEBUG_ENERGY_CPU) { + Slog.d(TAG, "!Cpu updating!"); + } + + // Holding a wakelock costs more than just using the cpu. + // Currently, we assign only half the cpu time to an app that is running but + // not holding a wakelock. The apps holding wakelocks get the rest of the blame. + // If no app is holding a wakelock, then the distribution is normal. + final int wakelockWeight = 50; + + // Read the time spent at various cpu frequencies. final int cpuSpeedSteps = getCpuSpeedSteps(); final long[] cpuSpeeds = mKernelCpuSpeedReader.readDelta(); - KernelUidCpuTimeReader.Callback callback = null; - if (mOnBatteryInternal && !firstTime) { - callback = new KernelUidCpuTimeReader.Callback() { - @Override - public void onUidCpuTime(int uid, long userTimeUs, long systemTimeUs) { - final Uid u = getUidStatsLocked(mapUid(uid)); - u.mUserCpuTime.addCountLocked(userTimeUs); - u.mSystemCpuTime.addCountLocked(systemTimeUs); - for (int i = 0; i < cpuSpeedSteps; i++) { - if (u.mSpeedBins[i] == null) { - u.mSpeedBins[i] = new LongSamplingCounter(mOnBatteryTimeBase); + + int numWakelocks = 0; + + // Calculate how many wakelocks we have to distribute amongst. The system is excluded. + // Only distribute cpu power to wakelocks if the screen is off and we're on battery. + final int numPartialTimers = mPartialTimers.size(); + if (mOnBatteryScreenOffTimeBase.isRunning()) { + for (int i = 0; i < numPartialTimers; i++) { + final StopwatchTimer timer = mPartialTimers.get(i); + if (timer.mInList && timer.mUid != null && timer.mUid.mUid != Process.SYSTEM_UID) { + // Since the collection and blaming of wakelocks can be scheduled to run after + // some delay, the mPartialTimers list may have new entries. We can't blame + // the newly added timer for past cpu time, so we only consider timers that + // were present for one round of collection. Once a timer has gone through + // a round of collection, its mInList field is set to true. + numWakelocks++; + } + } + } + + final int numWakelocksF = numWakelocks; + mTempTotalCpuUserTimeUs = 0; + mTempTotalCpuSystemTimeUs = 0; + + // Read the CPU data for each UID. This will internally generate a snapshot so next time + // we read, we get a delta. If we are to distribute the cpu time, then do so. Otherwise + // we just ignore the data. + final long startTimeMs = SystemClock.elapsedRealtime(); + mKernelUidCpuTimeReader.readDelta(!mOnBatteryInternal ? null : + new KernelUidCpuTimeReader.Callback() { + @Override + public void onUidCpuTime(int uid, long userTimeUs, long systemTimeUs) { + final Uid u = getUidStatsLocked(mapUid(uid)); + + // Accumulate the total system and user time. + mTempTotalCpuUserTimeUs += userTimeUs; + mTempTotalCpuSystemTimeUs += systemTimeUs; + + StringBuilder sb = null; + if (DEBUG_ENERGY_CPU) { + sb = new StringBuilder(); + sb.append(" got time for uid=").append(u.mUid).append(": u="); + TimeUtils.formatDuration(userTimeUs / 1000, sb); + sb.append(" s="); + TimeUtils.formatDuration(systemTimeUs / 1000, sb); + sb.append("\n"); + } + + if (numWakelocksF > 0) { + // We have wakelocks being held, so only give a portion of the + // time to the process. The rest will be distributed among wakelock + // holders. + userTimeUs = (userTimeUs * wakelockWeight) / 100; + systemTimeUs = (systemTimeUs * wakelockWeight) / 100; + } + + if (sb != null) { + sb.append(" adding to uid=").append(u.mUid).append(": u="); + TimeUtils.formatDuration(userTimeUs / 1000, sb); + sb.append(" s="); + TimeUtils.formatDuration(systemTimeUs / 1000, sb); + Slog.d(TAG, sb.toString()); + } + + u.mUserCpuTime.addCountLocked(userTimeUs); + u.mSystemCpuTime.addCountLocked(systemTimeUs); + + // Add the cpu speeds to this UID. These are used as a ratio + // for computing the power this UID used. + for (int i = 0; i < cpuSpeedSteps; i++) { + if (u.mSpeedBins[i] == null) { + u.mSpeedBins[i] = new LongSamplingCounter(mOnBatteryTimeBase); + } + u.mSpeedBins[i].addCountLocked(cpuSpeeds[i]); } - u.mSpeedBins[i].addCountLocked(cpuSpeeds[i]); } + }); + + if (DEBUG_ENERGY_CPU) { + Slog.d(TAG, "Reading cpu stats took " + (SystemClock.elapsedRealtime() - startTimeMs) + + " ms"); + } + + if (mOnBatteryInternal && numWakelocks > 0) { + // Distribute a portion of the total cpu time to wakelock holders. + mTempTotalCpuUserTimeUs = (mTempTotalCpuUserTimeUs * (100 - wakelockWeight)) / 100; + mTempTotalCpuSystemTimeUs = + (mTempTotalCpuSystemTimeUs * (100 - wakelockWeight)) / 100; + + for (int i = 0; i < numPartialTimers; i++) { + final StopwatchTimer timer = mPartialTimers.get(i); + + // The system does not share any blame, as it is usually holding the wakelock + // on behalf of an app. + if (timer.mInList && timer.mUid != null && timer.mUid.mUid != Process.SYSTEM_UID) { + int userTimeUs = (int) (mTempTotalCpuUserTimeUs / numWakelocks); + int systemTimeUs = (int) (mTempTotalCpuSystemTimeUs / numWakelocks); + + if (DEBUG_ENERGY_CPU) { + StringBuilder sb = new StringBuilder(); + sb.append(" Distributing wakelock uid=").append(timer.mUid.mUid) + .append(": u="); + TimeUtils.formatDuration(userTimeUs / 1000, sb); + sb.append(" s="); + TimeUtils.formatDuration(systemTimeUs / 1000, sb); + Slog.d(TAG, sb.toString()); + } + + timer.mUid.mUserCpuTime.addCountLocked(userTimeUs); + timer.mUid.mSystemCpuTime.addCountLocked(systemTimeUs); + + final Uid.Proc proc = timer.mUid.getProcessStatsLocked("*wakelock*"); + proc.addCpuTimeLocked(userTimeUs, systemTimeUs); + + mTempTotalCpuUserTimeUs -= userTimeUs; + mTempTotalCpuSystemTimeUs -= systemTimeUs; + numWakelocks--; } - }; + } + + if (mTempTotalCpuUserTimeUs > 0 || mTempTotalCpuSystemTimeUs > 0) { + // Anything left over is given to the system. + if (DEBUG_ENERGY_CPU) { + StringBuilder sb = new StringBuilder(); + sb.append(" Distributing lost time to system: u="); + TimeUtils.formatDuration(mTempTotalCpuUserTimeUs / 1000, sb); + sb.append(" s="); + TimeUtils.formatDuration(mTempTotalCpuSystemTimeUs / 1000, sb); + Slog.d(TAG, sb.toString()); + } + + final Uid u = getUidStatsLocked(Process.SYSTEM_UID); + u.mUserCpuTime.addCountLocked(mTempTotalCpuUserTimeUs); + u.mSystemCpuTime.addCountLocked(mTempTotalCpuSystemTimeUs); + + final Uid.Proc proc = u.getProcessStatsLocked("*lost*"); + proc.addCpuTimeLocked((int) mTempTotalCpuUserTimeUs, + (int) mTempTotalCpuSystemTimeUs); + } + } + + // See if there is a difference in wakelocks between this collection and the last + // collection. + if (ArrayUtils.referenceEquals(mPartialTimers, mLastPartialTimers)) { + // No difference, so each timer is now considered for the next collection. + for (int i = 0; i < numPartialTimers; i++) { + mPartialTimers.get(i).mInList = true; + } + } else { + // The lists are different, meaning we added (or removed a timer) since the last + // collection. + final int numLastPartialTimers = mLastPartialTimers.size(); + for (int i = 0; i < numLastPartialTimers; i++) { + mLastPartialTimers.get(i).mInList = false; + } + mLastPartialTimers.clear(); + + // Mark the current timers as gone through a collection. + for (int i = 0; i < numPartialTimers; i++) { + final StopwatchTimer timer = mPartialTimers.get(i); + timer.mInList = true; + mLastPartialTimers.add(timer); + } } - mKernelUidCpuTimeReader.readDelta(callback); } boolean setChargingLocked(boolean charging) { @@ -8157,6 +8271,12 @@ public final class BatteryStatsImpl extends BatteryStats { } } + private void scheduleSyncExternalWifiStatsLocked(String reason) { + if (mExternalSync != null) { + mExternalSync.scheduleWifiSync(reason); + } + } + // This should probably be exposed in the API, though it's not critical public static final int BATTERY_PLUGGED_NONE = 0; @@ -9491,6 +9611,12 @@ public final class BatteryStatsImpl extends BatteryStats { } else { out.writeInt(0); } + if (wl.mTimerDraw != null) { + out.writeInt(1); + wl.mTimerDraw.writeSummaryFromParcelLocked(out, NOWREAL_SYS); + } else { + out.writeInt(0); + } } final ArrayMap<String, StopwatchTimer> syncStats = u.mSyncStats.getMap(); diff --git a/core/java/com/android/internal/os/KernelUidCpuTimeReader.java b/core/java/com/android/internal/os/KernelUidCpuTimeReader.java index b2363786029c..62926d170632 100644 --- a/core/java/com/android/internal/os/KernelUidCpuTimeReader.java +++ b/core/java/com/android/internal/os/KernelUidCpuTimeReader.java @@ -16,9 +16,11 @@ package com.android.internal.os; import android.annotation.Nullable; +import android.os.SystemClock; import android.text.TextUtils; import android.util.Slog; import android.util.SparseLongArray; +import android.util.TimeUtils; import java.io.BufferedReader; import java.io.FileReader; @@ -49,6 +51,7 @@ public class KernelUidCpuTimeReader { private SparseLongArray mLastUserTimeUs = new SparseLongArray(); private SparseLongArray mLastSystemTimeUs = new SparseLongArray(); + private long mLastTimeRead = 0; /** * Reads the proc file, calling into the callback with a delta of time for each UID. @@ -57,6 +60,7 @@ public class KernelUidCpuTimeReader { * a fresh delta. */ public void readDelta(@Nullable Callback callback) { + long now = SystemClock.elapsedRealtime(); try (BufferedReader reader = new BufferedReader(new FileReader(sProcFile))) { TextUtils.SimpleStringSplitter splitter = new TextUtils.SimpleStringSplitter(' '); String line; @@ -75,10 +79,32 @@ public class KernelUidCpuTimeReader { userTimeDeltaUs -= mLastUserTimeUs.valueAt(index); systemTimeDeltaUs -= mLastSystemTimeUs.valueAt(index); - if (userTimeDeltaUs < 0 || systemTimeDeltaUs < 0) { - // The UID must have been removed from accounting, then added back. - userTimeDeltaUs = userTimeUs; - systemTimeDeltaUs = systemTimeUs; + final long timeDiffMs = (now - mLastTimeRead) * 1000; + if (userTimeDeltaUs < 0 || systemTimeDeltaUs < 0 || + userTimeDeltaUs > timeDiffMs || systemTimeDeltaUs > timeDiffMs ) { + StringBuilder sb = new StringBuilder("Malformed cpu data!\n"); + sb.append("Time between reads: "); + TimeUtils.formatDuration(timeDiffMs, sb); + sb.append("ms\n"); + sb.append("Previous times: u="); + TimeUtils.formatDuration(mLastUserTimeUs.valueAt(index) / 1000, sb); + sb.append("ms s="); + TimeUtils.formatDuration(mLastSystemTimeUs.valueAt(index) / 1000, sb); + sb.append("ms\n"); + sb.append("Current times: u="); + TimeUtils.formatDuration(userTimeUs / 1000, sb); + sb.append("ms s="); + TimeUtils.formatDuration(systemTimeUs / 1000, sb); + sb.append("ms\n"); + sb.append("Delta for UID=").append(uid).append(": u="); + TimeUtils.formatDuration(userTimeDeltaUs / 1000, sb); + sb.append("ms s="); + TimeUtils.formatDuration(systemTimeDeltaUs / 1000, sb); + sb.append("ms"); + Slog.wtf(TAG, sb.toString()); + + userTimeDeltaUs = 0; + systemTimeDeltaUs = 0; } } @@ -92,6 +118,7 @@ public class KernelUidCpuTimeReader { } catch (IOException e) { Slog.e(TAG, "Failed to read uid_cputime", e); } + mLastTimeRead = now; } /** diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java index 4f6d78187578..c97fdf46cda9 100644 --- a/core/java/com/android/internal/os/Zygote.java +++ b/core/java/com/android/internal/os/Zygote.java @@ -41,8 +41,8 @@ public final class Zygote { public static final int DEBUG_ENABLE_JNI_LOGGING = 1 << 4; /** enable the JIT compiler */ public static final int DEBUG_ENABLE_JIT = 1 << 5; - /** Force generation of CFI code */ - public static final int DEBUG_GENERATE_CFI = 1 << 6; + /** Force generation of native debugging information. */ + public static final int DEBUG_GENERATE_DEBUG_INFO = 1 << 6; /** No external storage should be mounted. */ public static final int MOUNT_EXTERNAL_NONE = 0; diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java index 1a0345bcac04..fa870b9ddedf 100644 --- a/core/java/com/android/internal/os/ZygoteConnection.java +++ b/core/java/com/android/internal/os/ZygoteConnection.java @@ -322,7 +322,7 @@ class ZygoteConnection { /** * From --enable-debugger, --enable-checkjni, --enable-assert, - * --enable-safemode, --enable-jit, --generate-cfi and --enable-jni-logging. + * --enable-safemode, --enable-jit, --generate-debug-info and --enable-jni-logging. */ int debugFlags; @@ -434,8 +434,8 @@ class ZygoteConnection { debugFlags |= Zygote.DEBUG_ENABLE_CHECKJNI; } else if (arg.equals("--enable-jit")) { debugFlags |= Zygote.DEBUG_ENABLE_JIT; - } else if (arg.equals("--generate-cfi")) { - debugFlags |= Zygote.DEBUG_GENERATE_CFI; + } else if (arg.equals("--generate-debug-info")) { + debugFlags |= Zygote.DEBUG_GENERATE_DEBUG_INFO; } else if (arg.equals("--enable-jni-logging")) { debugFlags |= Zygote.DEBUG_ENABLE_JNI_LOGGING; } else if (arg.equals("--enable-assert")) { diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 66f6079b47e9..15ed5bd0b539 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -3223,12 +3223,11 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { cb.onWindowFocusChanged(hasWindowFocus); } - if (mFloatingToolbar != null) { - if (hasWindowFocus) { - mFloatingToolbar.show(); - } else { - mFloatingToolbar.dismiss(); - } + if (mPrimaryActionMode != null) { + mPrimaryActionMode.onWindowFocusChanged(hasWindowFocus); + } + if (mFloatingActionMode != null) { + mFloatingActionMode.onWindowFocusChanged(hasWindowFocus); } } @@ -3441,8 +3440,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { mFloatingActionMode = mode; mFloatingToolbar = new FloatingToolbar(mContext, PhoneWindow.this); ((FloatingActionMode) mFloatingActionMode).setFloatingToolbar(mFloatingToolbar); - mFloatingActionMode.invalidate(); - mFloatingToolbar.show(); + mFloatingActionMode.invalidate(); // Will show the floating toolbar if necessary. mFloatingActionModeOriginatingView.getViewTreeObserver() .addOnPreDrawListener(mFloatingToolbarPreDrawListener); } diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index 9f99f6235787..0732addb7356 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -64,5 +64,7 @@ oneway interface IStatusBar * bar caused by this app transition in millis */ void appTransitionStarting(long statusBarAnimationsStartTime, long statusBarAnimationsDuration); + + void showAssistDisclosure(); } diff --git a/core/java/com/android/internal/statusbar/StatusBarIcon.java b/core/java/com/android/internal/statusbar/StatusBarIcon.java index 4693d4b7c840..1d626235c4d2 100644 --- a/core/java/com/android/internal/statusbar/StatusBarIcon.java +++ b/core/java/com/android/internal/statusbar/StatusBarIcon.java @@ -20,17 +20,27 @@ import android.graphics.drawable.Icon; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; +import android.text.TextUtils; public class StatusBarIcon implements Parcelable { public UserHandle user; + public String pkg; public Icon icon; public int iconLevel; public boolean visible = true; public int number; public CharSequence contentDescription; - public StatusBarIcon(UserHandle user, Icon icon, int iconLevel, int number, + public StatusBarIcon(UserHandle user, String resPackage, Icon icon, int iconLevel, int number, CharSequence contentDescription) { + if (icon.getType() == Icon.TYPE_RESOURCE + && TextUtils.isEmpty(icon.getResPackage())) { + // This is an odd situation where someone's managed to hand us an icon without a + // package inside, probably by mashing an int res into a Notification object. + // Now that we have the correct package name handy, let's fix it. + icon = Icon.createWithResource(resPackage, icon.getResId()); + } + this.pkg = resPackage; this.user = user; this.icon = icon; this.iconLevel = iconLevel; @@ -41,21 +51,23 @@ public class StatusBarIcon implements Parcelable { public StatusBarIcon(String iconPackage, UserHandle user, int iconId, int iconLevel, int number, CharSequence contentDescription) { - this(user, Icon.createWithResource(iconPackage, iconId), + this(user, iconPackage, Icon.createWithResource(iconPackage, iconId), iconLevel, number, contentDescription); } @Override public String toString() { - return "StatusBarIcon(icon=" + this.icon + return "StatusBarIcon(icon=" + icon + + ((iconLevel != 0)?(" level=" + iconLevel):"") + + (visible?" visible":"") + " user=" + user.getIdentifier() - + " level=" + this.iconLevel + " visible=" + visible - + " num=" + this.number + " )"; + + ((number != 0)?(" num=" + number):"") + + " )"; } @Override public StatusBarIcon clone() { - StatusBarIcon that = new StatusBarIcon(this.user, this.icon, + StatusBarIcon that = new StatusBarIcon(this.user, this.pkg, this.icon, this.iconLevel, this.number, this.contentDescription); that.visible = this.visible; return that; @@ -70,6 +82,7 @@ public class StatusBarIcon implements Parcelable { public void readFromParcel(Parcel in) { this.icon = (Icon) in.readParcelable(null); + this.pkg = in.readString(); this.user = (UserHandle) in.readParcelable(null); this.iconLevel = in.readInt(); this.visible = in.readInt() != 0; @@ -79,6 +92,7 @@ public class StatusBarIcon implements Parcelable { public void writeToParcel(Parcel out, int flags) { out.writeParcelable(this.icon, 0); + out.writeString(this.pkg); out.writeParcelable(this.user, 0); out.writeInt(this.iconLevel); out.writeInt(this.visible ? 1 : 0); diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java index 62e724aba553..9d0636a744d8 100644 --- a/core/java/com/android/internal/util/ArrayUtils.java +++ b/core/java/com/android/internal/util/ArrayUtils.java @@ -387,4 +387,26 @@ public class ArrayUtils { public static <T> boolean contains(ArrayList<T> cur, T val) { return (cur != null) ? cur.contains(val) : false; } + + /** + * Returns true if the two ArrayLists are equal with respect to the objects they contain. + * The objects must be in the same order and be reference equal (== not .equals()). + */ + public static <T> boolean referenceEquals(ArrayList<T> a, ArrayList<T> b) { + if (a == b) { + return true; + } + + final int sizeA = a.size(); + final int sizeB = b.size(); + if (a == null || b == null || sizeA != sizeB) { + return false; + } + + boolean diff = false; + for (int i = 0; i < sizeA && !diff; i++) { + diff |= a.get(i) != b.get(i); + } + return !diff; + } } diff --git a/core/java/com/android/internal/view/FloatingActionMode.java b/core/java/com/android/internal/view/FloatingActionMode.java index 99c12776d8c1..863506b0a63a 100644 --- a/core/java/com/android/internal/view/FloatingActionMode.java +++ b/core/java/com/android/internal/view/FloatingActionMode.java @@ -25,6 +25,7 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewConfiguration; +import com.android.internal.R; import com.android.internal.util.Preconditions; import com.android.internal.view.menu.MenuBuilder; import com.android.internal.widget.FloatingToolbar; @@ -44,6 +45,7 @@ public class FloatingActionMode extends ActionMode { private final Rect mViewRect; private final Rect mScreenRect; private final View mOriginatingView; + private final int mBottomAllowance; private final Runnable mMovingOff = new Runnable() { public void run() { @@ -77,6 +79,10 @@ public class FloatingActionMode extends ActionMode { mScreenRect = new Rect(); mOriginatingView = Preconditions.checkNotNull(originatingView); mOriginatingView.getLocationInWindow(mViewPosition); + // Allow the content rect to overshoot a little bit beyond the + // bottom view bound if necessary. + mBottomAllowance = context.getResources() + .getDimensionPixelSize(R.dimen.content_rect_bottom_clip_allowance); } public void setFloatingToolbar(FloatingToolbar floatingToolbar) { @@ -141,7 +147,7 @@ public class FloatingActionMode extends ActionMode { Math.max(mContentRectOnWindow.left, mViewRect.left), Math.max(mContentRectOnWindow.top, mViewRect.top), Math.min(mContentRectOnWindow.right, mViewRect.right), - Math.min(mContentRectOnWindow.bottom, mViewRect.bottom)); + Math.min(mContentRectOnWindow.bottom, mViewRect.bottom + mBottomAllowance)); if (!mContentRectOnWindow.equals(mPreviousContentRectOnWindow)) { // Content rect is moving. @@ -191,6 +197,13 @@ public class FloatingActionMode extends ActionMode { } @Override + public void onWindowFocusChanged(boolean hasWindowFocus) { + checkToolbarInitialized(); + mFloatingToolbarVisibilityHelper.setWindowFocused(hasWindowFocus); + mFloatingToolbarVisibilityHelper.updateToolbarVisibility(); + } + + @Override public void finish() { checkToolbarInitialized(); reset(); @@ -231,6 +244,7 @@ public class FloatingActionMode extends ActionMode { } private void reset() { + mFloatingToolbar.dismiss(); mFloatingToolbarVisibilityHelper.deactivate(); mOriginatingView.removeCallbacks(mMovingOff); mOriginatingView.removeCallbacks(mHideOff); @@ -247,6 +261,7 @@ public class FloatingActionMode extends ActionMode { private boolean mHideRequested; private boolean mMoving; private boolean mOutOfBounds; + private boolean mWindowFocused = true; private boolean mActive; @@ -258,6 +273,7 @@ public class FloatingActionMode extends ActionMode { mHideRequested = false; mMoving = false; mOutOfBounds = false; + mWindowFocused = true; mActive = true; } @@ -279,12 +295,16 @@ public class FloatingActionMode extends ActionMode { mOutOfBounds = outOfBounds; } + public void setWindowFocused(boolean windowFocused) { + mWindowFocused = windowFocused; + } + public void updateToolbarVisibility() { if (!mActive) { return; } - if (mHideRequested || mMoving || mOutOfBounds) { + if (mHideRequested || mMoving || mOutOfBounds || !mWindowFocused) { mToolbar.hide(); } else { mToolbar.show(); diff --git a/core/java/com/android/internal/view/IInputConnectionWrapper.java b/core/java/com/android/internal/view/IInputConnectionWrapper.java index e19b2b60be5d..85ec29c4634c 100644 --- a/core/java/com/android/internal/view/IInputConnectionWrapper.java +++ b/core/java/com/android/internal/view/IInputConnectionWrapper.java @@ -409,8 +409,8 @@ public class IInputConnectionWrapper extends IInputContext.Stub { } case DO_REPORT_FULLSCREEN_MODE: { InputConnection ic = mInputConnection.get(); - if (ic == null || !isActive()) { - Log.w(TAG, "showStatusIcon on inactive InputConnection"); + if (ic == null) { + Log.w(TAG, "reportFullscreenMode on inexistent InputConnection"); return; } ic.reportFullscreenMode(msg.arg1 == 1); diff --git a/core/java/com/android/internal/widget/FloatingToolbar.java b/core/java/com/android/internal/widget/FloatingToolbar.java index 53ebc23bc3c1..523663c0e6e4 100644 --- a/core/java/com/android/internal/widget/FloatingToolbar.java +++ b/core/java/com/android/internal/widget/FloatingToolbar.java @@ -20,7 +20,9 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; +import android.content.ComponentCallbacks; import android.content.Context; +import android.content.res.Configuration; import android.graphics.Color; import android.graphics.Point; import android.graphics.Rect; @@ -89,6 +91,19 @@ public final class FloatingToolbar { private int mSuggestedWidth; private boolean mWidthChanged = true; + private final ComponentCallbacks mOrientationChangeHandler = new ComponentCallbacks() { + @Override + public void onConfigurationChanged(Configuration newConfig) { + if (mPopup.isShowing() && mPopup.viewPortHasChanged()) { + mWidthChanged = true; + updateLayout(); + } + } + + @Override + public void onLowMemory() {} + }; + /** * Initializes a floating toolbar. */ @@ -151,6 +166,8 @@ public final class FloatingToolbar { * Shows this floating toolbar. */ public FloatingToolbar show() { + mContext.unregisterComponentCallbacks(mOrientationChangeHandler); + mContext.registerComponentCallbacks(mOrientationChangeHandler); List<MenuItem> menuItems = getVisibleAndEnabledMenuItems(mMenu); if (!isCurrentlyShowing(menuItems) || mWidthChanged) { mPopup.dismiss(); @@ -181,6 +198,7 @@ public final class FloatingToolbar { * Dismisses this floating toolbar. */ public void dismiss() { + mContext.unregisterComponentCallbacks(mOrientationChangeHandler); mPopup.dismiss(); } @@ -329,6 +347,7 @@ public final class FloatingToolbar { private final Rect mViewPort = new Rect(); private final Point mCoords = new Point(); + private final Rect mTmpRect = new Rect(); private final Region mTouchableRegion = new Region(); private final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer = @@ -527,25 +546,25 @@ public final class FloatingToolbar { private void refreshCoordinatesAndOverflowDirection(Rect contentRect) { refreshViewPort(); - int availableHeightAboveContent = - contentRect.top - mViewPort.top - 2 * mMarginVertical; - int availableHeightBelowContent = - mViewPort.bottom - contentRect.bottom - 2 * mMarginVertical; - int availableHeightThroughContent = - mViewPort.bottom - contentRect.top + getToolbarHeightWithVerticalMargin(); - int x = contentRect.centerX() - getWidth() / 2; // Update x so that the toolbar isn't rendered behind the nav bar in landscape. x = Math.max(0, Math.min(x, mViewPort.right - getWidth())); int y; + + int availableHeightAboveContent = contentRect.top - mViewPort.top; + int availableHeightBelowContent = mViewPort.bottom - contentRect.bottom; + if (mOverflowPanel == null) { // There is no overflow. - if (availableHeightAboveContent > getToolbarHeightWithVerticalMargin()) { + if (availableHeightAboveContent >= getToolbarHeightWithVerticalMargin()) { // There is enough space at the top of the content. y = contentRect.top - getToolbarHeightWithVerticalMargin(); - } else if (availableHeightBelowContent > getToolbarHeightWithVerticalMargin()) { + } else if (availableHeightBelowContent >= getToolbarHeightWithVerticalMargin()) { // There is enough space at the bottom of the content. y = contentRect.bottom; + } else if (availableHeightBelowContent >= getEstimatedToolbarHeight(getContext())) { + // Just enough space to fit the toolbar with no vertical margins. + y = contentRect.bottom - mMarginVertical; } else { // Not enough space. Prefer to position as high as possible. y = Math.max( @@ -553,32 +572,47 @@ public final class FloatingToolbar { contentRect.top - getToolbarHeightWithVerticalMargin()); } } else { // There is an overflow. - if (availableHeightAboveContent > mOverflowPanel.getMinimumHeight()) { + int margin = 2 * mMarginVertical; + int minimumOverflowHeightWithMargin = mOverflowPanel.getMinimumHeight() + margin; + int availableHeightThroughContentDown = + mViewPort.bottom - contentRect.top + getToolbarHeightWithVerticalMargin(); + int availableHeightThroughContentUp = + contentRect.bottom - mViewPort.top + getToolbarHeightWithVerticalMargin(); + + if (availableHeightAboveContent >= minimumOverflowHeightWithMargin) { // There is enough space at the top of the content rect for the overflow. // Position above and open upwards. - updateOverflowHeight(availableHeightAboveContent); + updateOverflowHeight(availableHeightAboveContent - margin); y = contentRect.top - getHeight(); mOverflowDirection = OVERFLOW_DIRECTION_UP; - } else if (availableHeightAboveContent > getToolbarHeightWithVerticalMargin() - && availableHeightThroughContent > mOverflowPanel.getMinimumHeight()) { + } else if (availableHeightAboveContent >= getToolbarHeightWithVerticalMargin() + && availableHeightThroughContentDown >= minimumOverflowHeightWithMargin) { // There is enough space at the top of the content rect for the main panel // but not the overflow. // Position above but open downwards. - updateOverflowHeight(availableHeightThroughContent); + updateOverflowHeight(availableHeightThroughContentDown - margin); y = contentRect.top - getToolbarHeightWithVerticalMargin(); mOverflowDirection = OVERFLOW_DIRECTION_DOWN; - } else if (availableHeightBelowContent > mOverflowPanel.getMinimumHeight()) { + } else if (availableHeightBelowContent >= minimumOverflowHeightWithMargin) { // There is enough space at the bottom of the content rect for the overflow. // Position below and open downwards. - updateOverflowHeight(availableHeightBelowContent); + updateOverflowHeight(availableHeightBelowContent - margin); y = contentRect.bottom; mOverflowDirection = OVERFLOW_DIRECTION_DOWN; + } else if (availableHeightBelowContent >= getToolbarHeightWithVerticalMargin() + && mViewPort.height() >= minimumOverflowHeightWithMargin) { + // There is enough space at the bottom of the content rect for the main panel + // but not the overflow. + // Position below but open upwards. + updateOverflowHeight(availableHeightThroughContentUp - margin); + y = contentRect.bottom + getToolbarHeightWithVerticalMargin() - getHeight(); + mOverflowDirection = OVERFLOW_DIRECTION_UP; } else { // Not enough space. - // Position at the bottom of the view port and open upwards. - updateOverflowHeight(mViewPort.height()); - y = mViewPort.bottom - getHeight(); - mOverflowDirection = OVERFLOW_DIRECTION_UP; + // Position at the top of the view port and open downwards. + updateOverflowHeight(mViewPort.height() - margin); + y = mViewPort.top; + mOverflowDirection = OVERFLOW_DIRECTION_DOWN; } mOverflowPanel.setOverflowDirection(mOverflowDirection); } @@ -873,6 +907,11 @@ public final class FloatingToolbar { mParent.getWindowVisibleDisplayFrame(mViewPort); } + private boolean viewPortHasChanged() { + mParent.getWindowVisibleDisplayFrame(mTmpRect); + return !mTmpRect.equals(mViewPort); + } + private int getToolbarWidth(int suggestedWidth) { int width = suggestedWidth; refreshViewPort(); @@ -1398,7 +1437,6 @@ public final class FloatingToolbar { PopupWindow popupWindow = new PopupWindow(popupContentHolder); popupWindow.setWindowLayoutType( WindowManager.LayoutParams.TYPE_APPLICATION_ABOVE_SUB_PANEL); - popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); popupWindow.setAnimationStyle(0); popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); content.setLayoutParams(new ViewGroup.LayoutParams( diff --git a/core/java/com/android/internal/widget/ResolverDrawerLayout.java b/core/java/com/android/internal/widget/ResolverDrawerLayout.java index be727f17ce9e..585cbc943788 100644 --- a/core/java/com/android/internal/widget/ResolverDrawerLayout.java +++ b/core/java/com/android/internal/widget/ResolverDrawerLayout.java @@ -127,6 +127,8 @@ public class ResolverDrawerLayout extends ViewGroup { final ViewConfiguration vc = ViewConfiguration.get(context); mTouchSlop = vc.getScaledTouchSlop(); mMinFlingVelocity = vc.getScaledMinimumFlingVelocity(); + + setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); } public void setSmallCollapsed(boolean smallCollapsed) { @@ -593,11 +595,6 @@ public class ResolverDrawerLayout extends ViewGroup { } @Override - public CharSequence getAccessibilityClassName() { - return ResolverDrawerLayout.class.getName(); - } - - @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); if (isEnabled()) { diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 7c2b28dcc2b1..2c35a8be98c2 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -876,16 +876,16 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv) "-Xzygote-max-boot-retry="); /* - * When running with debug.gencfi, add --include-cfi to the compiler options so that the boot - * image, if it is compiled on device, will include CFI info, as well as other compilations - * started by the runtime. + * When running with debug.generate-debug-info, add --generate-debug-info to + * the compiler options so that the boot image, if it is compiled on device, + * will include native debugging information. */ - property_get("debug.gencfi", propBuf, ""); + property_get("debug.generate-debug-info", propBuf, ""); if (strcmp(propBuf, "true") == 0) { addOption("-Xcompiler-option"); - addOption("--include-cfi"); + addOption("--generate-debug-info"); addOption("-Ximage-compiler-option"); - addOption("--include-cfi"); + addOption("--generate-debug-info"); } initArgs.version = JNI_VERSION_1_4; diff --git a/core/jni/android/graphics/Region.cpp b/core/jni/android/graphics/Region.cpp index 3bab2dfc0e2e..e99bdfcc63fa 100644 --- a/core/jni/android/graphics/Region.cpp +++ b/core/jni/android/graphics/Region.cpp @@ -231,15 +231,24 @@ static jlong Region_createFromParcel(JNIEnv* env, jobject clazz, jobject parcel) static jboolean Region_writeToParcel(JNIEnv* env, jobject clazz, jlong regionHandle, jobject parcel) { const SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle); - if (parcel == NULL) { + if (parcel == nullptr) { return JNI_FALSE; } android::Parcel* p = android::parcelForJavaObject(env, parcel); - size_t size = region->writeToMemory(NULL); + const size_t size = region->writeToMemory(nullptr); p->writeInt32(size); - region->writeToMemory(p->writeInplace(size)); + void* dst = p->writeInplace(size); + if (dst == nullptr) { + ALOGE("Region.writeToParcel could not write %zi bytes", size); + return JNI_FALSE; + } + const size_t sizeWritten = region->writeToMemory(dst); + if (sizeWritten != size) { + ALOGE("SkRegion::writeToMemory should have written %zi bytes but wrote %zi", + size, sizeWritten); + } return JNI_TRUE; } diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 9f2181f0a791..91b3278c2e2b 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -856,7 +856,8 @@ static jint convertAudioPortFromNative(JNIEnv *env, bool useInMask; size_t numPositionMasks = 0; size_t numIndexMasks = 0; - size_t numUniqueFormats; + size_t numUniqueFormats = 0; + ALOGV("convertAudioPortFromNative id %d role %d type %d name %s", nAudioPort->id, nAudioPort->role, nAudioPort->type, nAudioPort->name); @@ -907,12 +908,13 @@ static jint convertAudioPortFromNative(JNIEnv *env, } // formats - cFormats = new int[nAudioPort->num_formats]; - numUniqueFormats = 0; - for (size_t index = 0; index < nAudioPort->num_formats; index++) { - int format = audioFormatFromNative(nAudioPort->formats[index]); - if (!hasFormat(cFormats, numUniqueFormats, format)) { - cFormats[numUniqueFormats++] = format; + if (nAudioPort->num_formats != 0) { + cFormats = new int[nAudioPort->num_formats]; + for (size_t index = 0; index < nAudioPort->num_formats; index++) { + int format = audioFormatFromNative(nAudioPort->formats[index]); + if (!hasFormat(cFormats, numUniqueFormats, format)) { + cFormats[numUniqueFormats++] = format; + } } } jFormats = env->NewIntArray(numUniqueFormats); @@ -920,7 +922,9 @@ static jint convertAudioPortFromNative(JNIEnv *env, jStatus = (jint)AUDIO_JAVA_ERROR; goto exit; } - env->SetIntArrayRegion(jFormats, 0, numUniqueFormats, cFormats); + if (numUniqueFormats != 0) { + env->SetIntArrayRegion(jFormats, 0, numUniqueFormats, cFormats); + } // gains jGains = env->NewObjectArray(nAudioPort->num_gains, diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 65c064b0c5cb..b1b772ae7e7e 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -242,6 +242,7 @@ <protected-broadcast android:name="android.intent.action.DATA_CONNECTION_CONNECTED_TO_PROVISIONING_APN" /> <protected-broadcast android:name="com.android.server.WifiManager.action.START_SCAN" /> + <protected-broadcast android:name="com.android.server.WifiManager.action.START_PNO" /> <protected-broadcast android:name="com.android.server.WifiManager.action.DELAYED_DRIVER_STOP" /> <protected-broadcast android:name="android.net.wifi.WIFI_STATE_CHANGED" /> <protected-broadcast android:name="android.net.wifi.WIFI_AP_STATE_CHANGED" /> @@ -316,8 +317,6 @@ <protected-broadcast android:name="android.intent.action.ACTION_SET_RADIO_CAPABILITY_FAILED" /> <protected-broadcast android:name="android.internal.policy.action.BURN_IN_PROTECTION" /> - <protected-broadcast android:name="android.service.persistentdata.action.WIPE_IF_ALLOWED" /> - <protected-broadcast android:name="android.app.action.SYSTEM_UPDATE_POLICY_CHANGED" /> <!-- ====================================================================== --> <!-- RUNTIME PERMISSIONS --> @@ -491,7 +490,7 @@ android:permissionGroup="android.permission-group.STORAGE" android:label="@string/permlab_sdcardRead" android:description="@string/permdesc_sdcardRead" - android:protectionLevel="normal" /> + android:protectionLevel="dangerous" /> <!-- Allows an application to write to external storage. <p class="note"><strong>Note:</strong> If <em>both</em> your <a @@ -1342,6 +1341,11 @@ android:description="@string/permdesc_killBackgroundProcesses" android:protectionLevel="normal" /> + <!-- @SystemApi @hide Allows an application to retrieve a package's importance. + This permission is not available to third party applications. --> + <permission android:name="android.permission.GET_PACKAGE_IMPORTANCE" + android:protectionLevel="signature|system" /> + <!-- ================================== --> <!-- Permissions affecting the display of other applications --> <!-- ================================== --> @@ -1410,13 +1414,13 @@ <permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" android:label="@string/permlab_install_shortcut" android:description="@string/permdesc_install_shortcut" - android:protectionLevel="dangerous"/> + android:protectionLevel="normal"/> <!-- Allows an application to uninstall a shortcut in Launcher --> <permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" android:label="@string/permlab_uninstall_shortcut" android:description="@string/permdesc_uninstall_shortcut" - android:protectionLevel="dangerous"/> + android:protectionLevel="normal"/> <!-- ==================================================== --> <!-- Permissions related to accessing sync settings --> @@ -2423,6 +2427,13 @@ <permission android:name="android.permission.LOCAL_MAC_ADDRESS" android:protectionLevel="signatureOrSystem" /> + <!-- Allows the Nfc stack to dispatch Nfc messages to applications. Applications + can use this permission to ensure incoming Nfc messages are from the Nfc stack + and not simulated by another application. + @hide --> + <permission android:name="android.permission.DISPATCH_NFC_MESSAGE" + android:protectionLevel="signatureOrSystem" /> + <!-- The system process is explicitly the only one allowed to launch the confirmation UI for full backup/restore --> <uses-permission android:name="android.permission.CONFIRM_FULL_BACKUP"/> @@ -2435,8 +2446,7 @@ android:backupAgent="com.android.server.backup.SystemBackupAgent" android:killAfterRestore="false" android:icon="@drawable/ic_launcher_android" - android:supportsRtl="true" - android:theme="@style/Theme.Material.DayNight.DarkActionBar"> + android:supportsRtl="true"> <activity android:name="com.android.internal.app.ChooserActivity" android:theme="@style/Theme.DeviceDefault.Resolver" android:finishOnCloseSystemDialogs="true" @@ -2469,7 +2479,7 @@ android:label="@string/managed_profile_label"> </activity-alias> <activity android:name="com.android.internal.app.HeavyWeightSwitcherActivity" - android:theme="@style/Theme.Material.DayNight.Dialog" + android:theme="@style/Theme.Material.Light.Dialog" android:label="@string/heavy_weight_switcher_title" android:finishOnCloseSystemDialogs="true" android:excludeFromRecents="true" @@ -2502,7 +2512,7 @@ <activity android:name="android.accounts.ChooseAccountActivity" android:excludeFromRecents="true" android:exported="true" - android:theme="@style/Theme.Material.DayNight.Dialog" + android:theme="@style/Theme.Material.Light.Dialog" android:label="@string/choose_account_label" android:process=":ui"> </activity> @@ -2510,14 +2520,14 @@ <activity android:name="android.accounts.ChooseTypeAndAccountActivity" android:excludeFromRecents="true" android:exported="true" - android:theme="@style/Theme.Material.DayNight.Dialog" + android:theme="@style/Theme.Material.Light.Dialog" android:label="@string/choose_account_label" android:process=":ui"> </activity> <activity android:name="android.accounts.ChooseAccountTypeActivity" android:excludeFromRecents="true" - android:theme="@style/Theme.Material.DayNight.Dialog" + android:theme="@style/Theme.Material.Light.Dialog" android:label="@string/choose_account_label" android:process=":ui"> </activity> @@ -2525,19 +2535,19 @@ <activity android:name="android.accounts.CantAddAccountActivity" android:excludeFromRecents="true" android:exported="true" - android:theme="@style/Theme.Material.DayNight.Dialog.NoActionBar" + android:theme="@style/Theme.Material.Light.Dialog.NoActionBar" android:process=":ui"> </activity> <activity android:name="android.accounts.GrantCredentialsPermissionActivity" android:excludeFromRecents="true" android:exported="true" - android:theme="@style/Theme.Material.DayNight.DialogWhenLarge" + android:theme="@style/Theme.Material.Light.DialogWhenLarge" android:process=":ui"> </activity> <activity android:name="android.content.SyncActivityTooManyDeletes" - android:theme="@style/Theme.Material.DayNight.Dialog" + android:theme="@style/Theme.Material.Light.Dialog" android:label="@string/sync_too_many_deletes" android:process=":ui"> </activity> @@ -2557,7 +2567,7 @@ </activity> <activity android:name="com.android.internal.app.NetInitiatedActivity" - android:theme="@style/Theme.Material.DayNight.Dialog.Alert" + android:theme="@style/Theme.Material.Light.Dialog.Alert" android:excludeFromRecents="true" android:process=":ui"> </activity> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 03cee7d53448..aa025b9cb2de 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dae"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Veiligmodus"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-stelsel"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Persoonlike programme"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Persoonlik"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Werk"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakte"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"gaan by jou kontakte in"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index a676a3d5ef1a..887f5bc37027 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ቀኖች"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ቀን <xliff:g id="HOURS">%2$d</xliff:g> ሰዓ"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ቀን <xliff:g id="HOURS">%2$d</xliff:g> ሰዓ"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"የሚያስተማምን ሁነታ"</string> <string name="android_system_label" msgid="6577375335728551336">"Android ስርዓት"</string> - <string name="user_owner_label" msgid="6465364741001216388">"የግል መተግበሪያዎች"</string> + <string name="user_owner_label" msgid="2804351898001038951">"የግል"</string> <string name="managed_profile_label" msgid="6260850669674791528">"ስራ"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"ዕውቂያዎች"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"የእርስዎ እውቂያዎች ላይ ይድረሱባቸው"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 4d5e79865522..19bc8f609694 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"غيغابايت"</string> <string name="terabyteShort" msgid="231613018159186962">"تيرابايت"</string> <string name="petabyteShort" msgid="5637816680144990219">"بيتابايت"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> يوم"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> يوم <xliff:g id="HOURS">%2$d</xliff:g> ساعة"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> يوم <xliff:g id="HOURS">%2$d</xliff:g> ساعة"</string> @@ -229,7 +228,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"الوضع الآمن"</string> <string name="android_system_label" msgid="6577375335728551336">"نظام Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"التطبيقات الشخصية"</string> + <string name="user_owner_label" msgid="2804351898001038951">"شخصي"</string> <string name="managed_profile_label" msgid="6260850669674791528">"عمل"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"جهات الاتصال"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"الوصول إلى جهات اتصالك"</string> diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml index 3f2e6af04ca4..de6dce42acb3 100644 --- a/core/res/res/values-az-rAZ/strings.xml +++ b/core/res/res/values-az-rAZ/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> gün"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> gan <xliff:g id="HOURS">%2$d</xliff:g> saat"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> gün <xliff:g id="HOURS">%2$d</xliff:g> saat"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Təhlükəsiz rejim"</string> <string name="android_system_label" msgid="6577375335728551336">"Android sistemi"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Şəxsi tətbiqlər"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Şəxsi"</string> <string name="managed_profile_label" msgid="6260850669674791528">"İş"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktlar"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"kontaktlarınıza daxil olun"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 21969d0539d8..c72225640178 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string> <string name="terabyteShort" msgid="231613018159186962">"ТБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дни"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Безопасен режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Системно от Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Лични приложения"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Личен"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Служебен"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакти"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"достъп до контактите ви"</string> diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml index 3d4d800d1fa8..b8a204baec53 100644 --- a/core/res/res/values-bn-rBD/strings.xml +++ b/core/res/res/values-bn-rBD/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> দিন"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> দিন <xliff:g id="HOURS">%2$d</xliff:g> ঘন্টা"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> দিন <xliff:g id="HOURS">%2$d</xliff:g> ঘন্টা"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"৯৯৯+"</string> <string name="safeMode" msgid="2788228061547930246">"নিরাপদ মোড"</string> <string name="android_system_label" msgid="6577375335728551336">"Android সিস্টেম"</string> - <string name="user_owner_label" msgid="6465364741001216388">"ব্যক্তিগত অ্যাপ্লিকেশানগুলি"</string> + <string name="user_owner_label" msgid="2804351898001038951">"ব্যক্তিগত"</string> <string name="managed_profile_label" msgid="6260850669674791528">"কর্মক্ষেত্র"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"পরিচিতি"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"আপনার পরিচিতিগুলিতে অ্যাক্সেস করুন"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 81ced84c57c9..abe460e894b9 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dies"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"+999"</string> <string name="safeMode" msgid="2788228061547930246">"Mode segur"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Aplicacions personals"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Feina"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactes"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"accedir als contactes"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 8b92c8466c13..1a80267856b2 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -227,7 +226,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Nouzový režim"</string> <string name="android_system_label" msgid="6577375335728551336">"Systém Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Osobní aplikace"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Osobní"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Práce"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakty"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"přístup ke kontaktům"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index af6aa5aae3b7..f91a069a295a 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"Tb"</string> <string name="petabyteShort" msgid="5637816680144990219">"Pb"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dage"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t."</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Sikker tilstand"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-system"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Personlige apps"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personlig"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Arbejde"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktpersoner"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"have adgang til dine kontaktpersoner"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 8e9a6accde7b..978a2b771394 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> Tage"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> Tag <xliff:g id="HOURS">%2$d</xliff:g> Std."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> Tag <xliff:g id="HOURS">%2$d</xliff:g> Std."</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Abgesicherter Modus"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-System"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Private Apps"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Privat"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Geschäftlich"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakte"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"Auf Kontakte zuzugreifen"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 8d1779cb1816..a5e8ddd3f024 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ημέρες"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ημ. <xliff:g id="HOURS">%2$d</xliff:g> ώρες"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ημ. <xliff:g id="HOURS">%2$d</xliff:g> ώρα"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Ασφαλής λειτουργία"</string> <string name="android_system_label" msgid="6577375335728551336">"Σύστημα Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Προσωπικές εφαρμογές"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Προσωπικό"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Εργασία"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Επαφές"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"πρόσβαση στις επαφές σας"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 7e89393e3d2f..ef20cec66e9f 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> days"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string> <string name="android_system_label" msgid="6577375335728551336">"Android System"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Personal apps"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Work"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"access your contacts"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 7e89393e3d2f..ef20cec66e9f 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> days"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string> <string name="android_system_label" msgid="6577375335728551336">"Android System"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Personal apps"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Work"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"access your contacts"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 7e89393e3d2f..ef20cec66e9f 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> days"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string> <string name="android_system_label" msgid="6577375335728551336">"Android System"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Personal apps"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Work"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"access your contacts"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index d3a4d6114a43..d0a0c70ece5b 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> días"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Aplicaciones personales"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Trabajo"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactos"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"acceder a los contactos"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index baf4601e917a..3839d86dfe59 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> días"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"> 999"</string> <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Aplicaciones personales"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Trabajo"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactos"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"acceder a tus contactos"</string> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index 0eb270c19c25..3c8a0ca6aafb 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> päeva"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> päev <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> päev <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Turvarežiim"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-süsteem"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Isiklikud rakendused"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Isiklik"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Töö"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktid"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"juurdepääs kontaktidele"</string> diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml index 0a2e8b3e0ff8..27275bc91120 100644 --- a/core/res/res/values-eu-rES/strings.xml +++ b/core/res/res/values-eu-rES/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> egun"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> egun <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> egun <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Modu segurua"</string> <string name="android_system_label" msgid="6577375335728551336">"Android sistema"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Aplikazio pertsonalak"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Pertsonalak"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Lana"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktuak"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"Atzitu kontaktuak"</string> @@ -729,7 +728,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Eredua marrazten hasi zara"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Eredua garbitu da"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Gelaxka gehitu da"</string> - <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Gehitu da <xliff:g id="CELL_INDEX">%1$s</xliff:g> konexio zelularra"</string> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Gehitu da <xliff:g id="CELL_INDEX">%1$s</xliff:g> puntua"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Eredua osatu da"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %2$d/%3$d widgeta."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Gehitu widgeta."</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 4a6e425855b8..5efbd5ce2b1b 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"گیگابایت"</string> <string name="terabyteShort" msgid="231613018159186962">"ترابایت"</string> <string name="petabyteShort" msgid="5637816680144990219">"پتابایت"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> روز"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> روز و <xliff:g id="HOURS">%2$d</xliff:g> ساعت"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> روز و <xliff:g id="HOURS">%2$d</xliff:g> ساعت"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"بیشتر از 999"</string> <string name="safeMode" msgid="2788228061547930246">"حالت ایمن"</string> <string name="android_system_label" msgid="6577375335728551336">"سیستم Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"برنامههای شخصی"</string> + <string name="user_owner_label" msgid="2804351898001038951">"شخصی"</string> <string name="managed_profile_label" msgid="6260850669674791528">"محل کار"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"مخاطبین"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"دسترسی به مخاطبین شما"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 295028e567f9..981f11736d97 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"Gt"</string> <string name="terabyteShort" msgid="231613018159186962">"Tt"</string> <string name="petabyteShort" msgid="5637816680144990219">"Pt"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> päivää"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> päivä <xliff:g id="HOURS">%2$d</xliff:g> t"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> päivä <xliff:g id="HOURS">%2$d</xliff:g> t"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Suojattu tila"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-järjestelmä"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Omat sovellukset"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Henkilökoht."</string> <string name="managed_profile_label" msgid="6260850669674791528">"Työ"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktit"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"käyttää yhteystietoja"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 3f4f64e927af..bfa55b95dd72 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"Go"</string> <string name="terabyteShort" msgid="231613018159186962">"To"</string> <string name="petabyteShort" msgid="5637816680144990219">"Po"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> jours"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string> <string name="safeMode" msgid="2788228061547930246">"Mode sécurisé"</string> <string name="android_system_label" msgid="6577375335728551336">"Système Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Applications personnelles"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personnel"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Travail"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"accéder à vos contacts"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index bac4417f605e..5a9b8ca8c439 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"Go"</string> <string name="terabyteShort" msgid="231613018159186962">"To"</string> <string name="petabyteShort" msgid="5637816680144990219">"Po"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> jours"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string> <string name="safeMode" msgid="2788228061547930246">"Mode sécurisé"</string> <string name="android_system_label" msgid="6577375335728551336">"Système Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Applications personnelles"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personnel"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Professionnel"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"accéder à vos contacts"</string> diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml index c2dcd0c7d5b3..6a79b89ce2c3 100644 --- a/core/res/res/values-gl-rES/strings.xml +++ b/core/res/res/values-gl-rES/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> días"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string> <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Aplicacións persoais"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Persoal"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Traballo"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactos"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"acceder aos teus contactos"</string> diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml index 8a75dbe9a87d..51f985593e70 100644 --- a/core/res/res/values-gu-rIN/strings.xml +++ b/core/res/res/values-gu-rIN/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> દિવસ"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> દિવસ <xliff:g id="HOURS">%2$d</xliff:g> કલાક"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> દિવસ <xliff:g id="HOURS">%2$d</xliff:g> કલાક"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"સુરક્ષિત મોડ"</string> <string name="android_system_label" msgid="6577375335728551336">"Android સિસ્ટમ"</string> - <string name="user_owner_label" msgid="6465364741001216388">"વ્યક્તિગત એપ્લિકેશન્સ"</string> + <string name="user_owner_label" msgid="2804351898001038951">"વ્યક્તિગત"</string> <string name="managed_profile_label" msgid="6260850669674791528">"કાર્યાલય"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"સંપર્કો"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"તમારા સંપર્કોને ઍક્સેસ કરો"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 90ac65388a40..fff0377652c8 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> दिन"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> दिन <xliff:g id="HOURS">%2$d</xliff:g> घंटे"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> दिन <xliff:g id="HOURS">%2$d</xliff:g> घंटा"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string> <string name="android_system_label" msgid="6577375335728551336">"Android सिस्टम"</string> - <string name="user_owner_label" msgid="6465364741001216388">"व्यक्तिगत ऐप्स"</string> + <string name="user_owner_label" msgid="2804351898001038951">"व्यक्तिगत"</string> <string name="managed_profile_label" msgid="6260850669674791528">"कार्यालय"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"संपर्क"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"अपने संपर्कों को ऐक्सेस करें"</string> @@ -1272,7 +1271,7 @@ <string name="validity_period" msgid="8818886137545983110">"मान्यता:"</string> <string name="issued_on" msgid="5895017404361397232">"जारी करने का दिनांक:"</string> <string name="expires_on" msgid="3676242949915959821">"समय समाप्ति दिनांक:"</string> - <string name="serial_number" msgid="758814067660862493">"क्रमांक:"</string> + <string name="serial_number" msgid="758814067660862493">"सीरियल नंबर:"</string> <string name="fingerprints" msgid="4516019619850763049">"फ़िंगरप्रिंट:"</string> <string name="sha256_fingerprint" msgid="4391271286477279263">"SHA-256 फ़िंगरप्रिंट:"</string> <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 फ़िंगरप्रिंट:"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 7ada3f0d94d9..a18bc4b1a8bb 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -226,7 +225,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Siguran način rada"</string> <string name="android_system_label" msgid="6577375335728551336">"Sustav Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Osobne aplikacije"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Osobno"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Posao"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakti"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"pristupati vašim kontaktima"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 70f006e7dfea..bd48e8cd6ade 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> nap"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> nap <xliff:g id="HOURS">%2$d</xliff:g> óra"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> nap <xliff:g id="HOURS">%2$d</xliff:g> óra"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Biztonsági üzemmód"</string> <string name="android_system_label" msgid="6577375335728551336">"Android rendszer"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Személyes alkalmazások"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Személyes"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Munkahelyi"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Névjegyek"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"hozzáférés a névjegyekhez"</string> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index 806d70a35c73..535f7a693188 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"ԳԲ"</string> <string name="terabyteShort" msgid="231613018159186962">"Տբ"</string> <string name="petabyteShort" msgid="5637816680144990219">"Պբ"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> օր"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> օր <xliff:g id="HOURS">%2$d</xliff:g> ժ"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> օր <xliff:g id="HOURS">%2$d</xliff:g> ժ"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Անվտանգ ռեժիմ"</string> <string name="android_system_label" msgid="6577375335728551336">"Android համակարգ"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Անձնական ծրագրեր"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Անձնական"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Աշխատանքային"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Կոնտակտներ"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"կոնտակտների հասանելիություն"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index ffbf564b0d58..fe61d550c470 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> hari"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Mode aman"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Aplikasi pribadi"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Pribadi"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Kantor"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontak"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"mengakses kontak"</string> diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml index cfc3ea4e2373..3b52f61d384d 100644 --- a/core/res/res/values-is-rIS/strings.xml +++ b/core/res/res/values-is-rIS/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dagar"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> klst."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> klst."</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Örugg stilling"</string> <string name="android_system_label" msgid="6577375335728551336">"Android kerfið"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Persónuleg forrit"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Persónulegt"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Vinna"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Tengiliðir"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"fá aðgang að tengiliðunum þínum"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 3e18bcdbe188..4f074bc33f02 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> giorni"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> giorno <xliff:g id="HOURS">%2$d</xliff:g> ore"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> giorno <xliff:g id="HOURS">%2$d</xliff:g> ora"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Modalità provvisoria"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"App personali"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personale"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Lavoro"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contatti"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"accesso ai contatti"</string> @@ -1547,7 +1546,7 @@ <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Altre opzioni"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Chiudi overflow"</string> <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elemento selezionato</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> elementi selezionati</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elementi selezionati</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> elemento selezionato</item> </plurals> </resources> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 1e3f8cd43e94..01030496bb47 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ימים"</string> <string name="durationDayHours" msgid="2713107458736744435">"יום <xliff:g id="DAYS">%1$d</xliff:g> <xliff:g id="HOURS">%2$d</xliff:g> שע\'"</string> <string name="durationDayHour" msgid="7293789639090958917">"יום <xliff:g id="DAYS">%1$d</xliff:g> שעה <xliff:g id="HOURS">%2$d</xliff:g>"</string> @@ -227,7 +226,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"מצב בטוח"</string> <string name="android_system_label" msgid="6577375335728551336">"מערכת Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"אפליקציות אישיות"</string> + <string name="user_owner_label" msgid="2804351898001038951">"אישי"</string> <string name="managed_profile_label" msgid="6260850669674791528">"עבודה"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"אנשי קשר"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"גישה אל אנשי הקשר"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 009f4f0bf4f1..d3e1e7f5f2b1 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g>日"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g>日<xliff:g id="HOURS">%2$d</xliff:g>時間"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g>日<xliff:g id="HOURS">%2$d</xliff:g>時間"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"セーフモード"</string> <string name="android_system_label" msgid="6577375335728551336">"Androidシステム"</string> - <string name="user_owner_label" msgid="6465364741001216388">"プライベートアプリ"</string> + <string name="user_owner_label" msgid="2804351898001038951">"プライベート"</string> <string name="managed_profile_label" msgid="6260850669674791528">"職場"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"連絡先"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"連絡先へのアクセス"</string> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index 0224308fa77f..bfeac1d73940 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"გბაიტი"</string> <string name="terabyteShort" msgid="231613018159186962">"ტბაიტი"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> დღე"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> დღე <xliff:g id="HOURS">%2$d</xliff:g> სთ"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> დღე <xliff:g id="HOURS">%2$d</xliff:g> სთ"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"უსაფრთხო რეჟიმი"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-ის სისტემა"</string> - <string name="user_owner_label" msgid="6465364741001216388">"პერსონალური აპები"</string> + <string name="user_owner_label" msgid="2804351898001038951">"პირადი"</string> <string name="managed_profile_label" msgid="6260850669674791528">"სამსახური"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"კონტაქტები"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"თქვენს კონტაქტებზე წვდომა"</string> diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml index f2d15fe4f8c8..e9b3709669f2 100644 --- a/core/res/res/values-kk-rKZ/strings.xml +++ b/core/res/res/values-kk-rKZ/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string> <string name="terabyteShort" msgid="231613018159186962">"TБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> күн"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> күн <xliff:g id="HOURS">%2$d</xliff:g> сағ."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> күн <xliff:g id="HOURS">%2$d</xliff:g> сағ."</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Қауіпсіз режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Android жүйесі"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Жеке қолданбалар"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Жеке"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Жұмыс"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Контактілер"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"контактілерге кіру"</string> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index e9c2a05ba0c6..d437294cef08 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"ជីកាបៃ"</string> <string name="terabyteShort" msgid="231613018159186962">"តេរ៉ាបៃ"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ថ្ងៃ"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ថ្ងៃ <xliff:g id="HOURS">%2$d</xliff:g> ម៉ោង"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ថ្ងៃ <xliff:g id="HOURS">%2$d</xliff:g> ម៉ោង"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"របៀបសុវត្ថិភាព"</string> <string name="android_system_label" msgid="6577375335728551336">"ប្រព័ន្ធ Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"កម្មវិធីផ្ទាល់ខ្លួន"</string> + <string name="user_owner_label" msgid="2804351898001038951">"ផ្ទាល់ខ្លួន"</string> <string name="managed_profile_label" msgid="6260850669674791528">"កន្លែងធ្វើការ"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"ទំនាក់ទំនង"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"ចូលប្រើទំនាក់ទំនងរបស់អ្នក"</string> diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml index 9b7e4a9743d9..325f3772c336 100644 --- a/core/res/res/values-kn-rIN/strings.xml +++ b/core/res/res/values-kn-rIN/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ದಿನಗಳು"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ದಿನ <xliff:g id="HOURS">%2$d</xliff:g> ಗಂಟೆಗಳು"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ದಿನ <xliff:g id="HOURS">%2$d</xliff:g> ಗಂ"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"ಸುರಕ್ಷಿತ ಮೋಡ್"</string> <string name="android_system_label" msgid="6577375335728551336">"Android ಸಿಸ್ಟಂ"</string> - <string name="user_owner_label" msgid="6465364741001216388">"ವೈಯಕ್ತಿಕ ಅಪ್ಲಿಕೇಶನ್ಗಳು"</string> + <string name="user_owner_label" msgid="2804351898001038951">"ವೈಯಕ್ತಿಕ"</string> <string name="managed_profile_label" msgid="6260850669674791528">"ಕಚೇರಿ"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"ಸಂಪರ್ಕಗಳು"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string> @@ -902,7 +901,7 @@ <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ಜೊತೆಗೆ ತೆರೆಯಿರಿ"</string> <string name="whichEditApplication" msgid="144727838241402655">"ಇವರ ಜೊತೆಗೆ ಸಂಪಾದಿಸಿ"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ಜೊತೆಗೆ ಸಂಪಾದಿಸಿ"</string> - <string name="whichSendApplication" msgid="6902512414057341668">"ಇದರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ"</string> + <string name="whichSendApplication" msgid="6902512414057341668">"ಹಂಚಿಕೊಳ್ಳಿ"</string> <string name="whichSendApplicationNamed" msgid="2799370240005424391">"%1$s ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಿ"</string> <string name="whichHomeApplication" msgid="4307587691506919691">"ಹೋಮ್ ಅಪ್ಲಿಕೇಶನ್ ಆಯ್ಕೆಮಾಡಿ"</string> <string name="whichHomeApplicationNamed" msgid="4493438593214760979">"ಹೋಮ್ ಎಂಬಂತೆ %1$s ಅನ್ನು ಬಳಸಿ"</string> @@ -1066,8 +1065,8 @@ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"ನಿಮ್ಮ USB ಸಂಗ್ರಹಣೆಯಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾದ ಎಲ್ಲಾ ಫೈಲ್ಗಳನ್ನು ಅಳಿಸಿಹಾಕಲಾಗುವುದು. ಈ ಕ್ರಿಯೆಯನ್ನು ಹಿಂತಿರುಗಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ!"</string> <string name="extmedia_format_message" product="default" msgid="14131895027543830">"ನಿಮ್ಮ ಕಾರ್ಡ್ನಲ್ಲಿರುವ ಎಲ್ಲಾ ಡೇಟಾ ಕಳೆದುಹೋಗುತ್ತದೆ."</string> <string name="extmedia_format_button_format" msgid="4131064560127478695">"ಸ್ವರೂಪಿಸು"</string> - <string name="adb_active_notification_title" msgid="6729044778949189918">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string> - <string name="adb_active_notification_message" msgid="1016654627626476142">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಸ್ಪರ್ಶಿಸಿ."</string> + <string name="adb_active_notification_title" msgid="6729044778949189918">"USB ಡೀಬಗಿಂಗ್ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string> + <string name="adb_active_notification_message" msgid="1016654627626476142">"USB ಡೀಬಗಿಂಗ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಸ್ಪರ್ಶಿಸಿ."</string> <string name="select_input_method" msgid="8547250819326693584">"ಕೀಬೋರ್ಡ್ ಬದಲಿಸಿ"</string> <string name="configure_input_methods" msgid="4769971288371946846">"ಕೀಬೋರ್ಡ್ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string> <string name="show_ime" msgid="9157568568695230830">"ಇನ್ಪುಟ್ ವಿಧಾನವನ್ನು ತೋರಿಸು"</string> @@ -1231,7 +1230,7 @@ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"ನಮೂದಿಸು"</string> <string name="activitychooserview_choose_application" msgid="2125168057199941199">"ಅಪ್ಲಿಕೇಶನ್ವೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string> <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ಪ್ರಾರಂಭಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ"</string> - <string name="shareactionprovider_share_with" msgid="806688056141131819">"ಇದರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ"</string> + <string name="shareactionprovider_share_with" msgid="806688056141131819">"ಹಂಚಿಕೊಳ್ಳಿ"</string> <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ನೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ"</string> <string name="content_description_sliding_handle" msgid="415975056159262248">"ಸ್ಲೈಡಿಂಗ್ ಹ್ಯಾಂಡಲ್. ಸ್ಪರ್ಶಿಸಿ & ಇರಿಸಿ."</string> <string name="description_target_unlock_tablet" msgid="3833195335629795055">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಸ್ವೈಪ್ ಮಾಡಿ."</string> @@ -1278,7 +1277,7 @@ <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 ಫಿಂಗರ್ಪ್ರಿಂಟ್:"</string> <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"ಎಲ್ಲವನ್ನೂ ನೋಡಿ"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"ಚಟುವಟಿಕೆಯನ್ನು ಆರಿಸಿ"</string> - <string name="share_action_provider_share_with" msgid="5247684435979149216">"ಇದರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ"</string> + <string name="share_action_provider_share_with" msgid="5247684435979149216">"ಹಂಚಿಕೊಳ್ಳಿ"</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"ಬ್ರೌಸರ್ ಪ್ರಾರಂಭಿಸುವುದೇ?"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 471da5f7ccb1..3766ec0ef9f1 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g>일"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g>일 <xliff:g id="HOURS">%2$d</xliff:g>시간"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g>일 <xliff:g id="HOURS">%2$d</xliff:g>시간"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"안전 모드"</string> <string name="android_system_label" msgid="6577375335728551336">"Android 시스템"</string> - <string name="user_owner_label" msgid="6465364741001216388">"개인 앱"</string> + <string name="user_owner_label" msgid="2804351898001038951">"개인"</string> <string name="managed_profile_label" msgid="6260850669674791528">"직장"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"주소록"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"주소록 액세스"</string> diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index 7076ee062195..91eaab60d7f4 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -32,8 +32,7 @@ <skip /> <!-- no translation found for petabyteShort (5637816680144990219) --> <skip /> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> күн"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> күн <xliff:g id="HOURS">%2$d</xliff:g> с"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> күн <xliff:g id="HOURS">%2$d</xliff:g> с"</string> @@ -333,7 +332,7 @@ <skip /> <!-- no translation found for android_system_label (6577375335728551336) --> <skip /> - <string name="user_owner_label" msgid="6465364741001216388">"Жеке колдономолор"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Жеке"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Жумуш"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Байланыштар"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"байланыштарыңызга уруксат"</string> diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml index a0384c232805..767defba141b 100644 --- a/core/res/res/values-lo-rLA/strings.xml +++ b/core/res/res/values-lo-rLA/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ມື້"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ມື້ <xliff:g id="HOURS">%2$d</xliff:g> ຊມ"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ມື້ <xliff:g id="HOURS">%2$d</xliff:g> ຊມ"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string> <string name="android_system_label" msgid="6577375335728551336">"ລະບົບ Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"ແອັບຯສ່ວນໂຕ"</string> + <string name="user_owner_label" msgid="2804351898001038951">"ສ່ວນໂຕ"</string> <string name="managed_profile_label" msgid="6260850669674791528">"ບ່ອນເຮັດວຽກ"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"ລາຍຊື່"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"ເຂົ້າຫາລາຍຊື່ຂອງທ່ານ"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index f5d35d3d06c3..bd59ebfb5e4d 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d."</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> val."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> val."</string> @@ -227,7 +226,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Saugos režimas"</string> <string name="android_system_label" msgid="6577375335728551336">"„Android“ sistema"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Asmeninės programos"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Asmeninė"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Darbo"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktai"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"pasiekti kontaktus"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 9e4cd5fbee6a..fe6d530fea0d 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d."</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -226,7 +225,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"Pārsniedz"</string> <string name="safeMode" msgid="2788228061547930246">"Drošais režīms"</string> <string name="android_system_label" msgid="6577375335728551336">"Android sistēma"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Personīgās lietotnes"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personisks"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Darba"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktpersonas"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"piekļūt jūsu kontaktpersonu datiem"</string> diff --git a/core/res/res/values-mcc302-mnc220/config.xml b/core/res/res/values-mcc302-mnc220/config.xml index 9147cbf661c4..09a63aac27fd 100644 --- a/core/res/res/values-mcc302-mnc220/config.xml +++ b/core/res/res/values-mcc302-mnc220/config.xml @@ -38,7 +38,8 @@ note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" --> <string-array translatable="false" name="config_tether_apndata"> <item>[ApnSettingV3]TELUS ISP,isp.telus.com,,,,,,,,,302,220,,DUN,,,true,0,,,,,,,gid,54</item> - <item>[ApnSettingV3]Tethered PC Mobile,isp.mb.com,,,,,,,,,302,220,,DUN,,,true,0,,,,,,,gid,50</item> + <item>[ApnSettingV3]Tethered Mobile Internet,isp.mb.com,,,,,,,,,302,220,,DUN,,,true,0,,,,,,,gid,50</item> + <item>[ApnSettingV3]Tethered Public Mobile,isp.mb.com,,,,,,,,,302,220,,DUN,,,true,0,,,,,,,gid,4D4F</item> </string-array> </resources> diff --git a/core/res/res/values-mcc302-mnc720/config.xml b/core/res/res/values-mcc302-mnc720/config.xml index a83107aab650..dcfa5c546156 100644 --- a/core/res/res/values-mcc302-mnc720/config.xml +++ b/core/res/res/values-mcc302-mnc720/config.xml @@ -29,6 +29,8 @@ <string-array translatable="false" name="config_tether_apndata"> <item>Rogers LTE Tethering,ltedata.apn,,,,,,,,,302,720,,DUN</item> <item>[ApnSettingV3]chatr Tethering,chatrisp.apn,,,,,,,,,302,720,,DUN,,,true,0,,,,,,,imsi,302720x94</item> + <item>[ApnSettingV3]Tbaytel Tethering,ltedata.apn,,,,,,,,,302,720,,DUN,IPV4V6,IP,true,0,,,,,,,gid,BA</item> + <item>[ApnSettingV3]Cityfone Tethering,ltedata.apn,,,,,,,,,302,720,,DUN,IPV4V6,IP,true,0,,,,,,,spn,CITYFONE</item> </string-array> <!-- Configure mobile network MTU. Carrier specific value is set here. diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml index 25d92646ccd8..e7f2970a580e 100644 --- a/core/res/res/values-mk-rMK/strings.xml +++ b/core/res/res/values-mk-rMK/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string> <string name="terabyteShort" msgid="231613018159186962">"ТБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дена"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч."</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Безбеден режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Систем Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Лични апликации"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Лични"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Работа"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакти"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"пристапи до контактите"</string> diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml index 7b73a486a455..1372ea6d54b9 100644 --- a/core/res/res/values-ml-rIN/strings.xml +++ b/core/res/res/values-ml-rIN/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ദിവസം"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ദിവസം <xliff:g id="HOURS">%2$d</xliff:g> മണിക്കൂർ"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ദിവസം <xliff:g id="HOURS">%2$d</xliff:g> മണിക്കൂർ"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"സുരക്ഷിത മോഡ്"</string> <string name="android_system_label" msgid="6577375335728551336">"Android സിസ്റ്റം"</string> - <string name="user_owner_label" msgid="6465364741001216388">"വ്യക്തിഗത അപ്ലിക്കേഷനുകൾ"</string> + <string name="user_owner_label" msgid="2804351898001038951">"വ്യക്തിഗതം"</string> <string name="managed_profile_label" msgid="6260850669674791528">"ഔദ്യോഗിക പ്രൊഫൈൽ"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"കോൺടാക്റ്റുകൾ"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"നിങ്ങളുടെ കോൺടാക്റ്റുകൾ ആക്സസ്സ് ചെയ്യുക"</string> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index 42b89029a777..a287a46c0a8f 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string> <string name="terabyteShort" msgid="231613018159186962">"TБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> өдөр"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> өдөр <xliff:g id="HOURS">%2$d</xliff:g> цаг"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> өдөр <xliff:g id="HOURS">%2$d</xliff:g> цаг"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Аюулгүй горим"</string> <string name="android_system_label" msgid="6577375335728551336">"Андройд систем"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Хувийн апп-ууд"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Хувийн"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Ажил"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Харилцагчдын хаяг"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"харилцагч руугаа хандах"</string> diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml index 80a1d617b7e8..64db2beca3ff 100644 --- a/core/res/res/values-mr-rIN/strings.xml +++ b/core/res/res/values-mr-rIN/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> दिवस"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> दिवस <xliff:g id="HOURS">%2$d</xliff:g> तास"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> दिवस <xliff:g id="HOURS">%2$d</xliff:g> तास"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string> <string name="android_system_label" msgid="6577375335728551336">"Android सिस्टम"</string> - <string name="user_owner_label" msgid="6465364741001216388">"वैयक्तिक अॅप्स"</string> + <string name="user_owner_label" msgid="2804351898001038951">"वैयक्तिक"</string> <string name="managed_profile_label" msgid="6260850669674791528">"कार्य"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"संपर्क"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"आपल्या संपर्कांवर प्रवेश करा"</string> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index 60685c4fb9bf..9a576e19a579 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> hari"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Mod selamat"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Apl peribadi"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Peribadi"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Tempat Kerja"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kenalan"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"akses kenalan anda"</string> diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml index 3885d976f2aa..8c5bf1437e49 100644 --- a/core/res/res/values-my-rMM/strings.xml +++ b/core/res/res/values-my-rMM/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ရက်"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ရက် <xliff:g id="HOURS">%2$d</xliff:g> နာရီ"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ရက်<xliff:g id="HOURS">%2$d</xliff:g> နာရီ"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"၉၉၉+"</string> <string name="safeMode" msgid="2788228061547930246">"အန္တရာယ်ကင်းမှု စနစ်(Safe mode)"</string> <string name="android_system_label" msgid="6577375335728551336">"Android စနစ်"</string> - <string name="user_owner_label" msgid="6465364741001216388">"ကိုယ်ပိုင် appများ"</string> + <string name="user_owner_label" msgid="2804351898001038951">"ကိုယ်ရေး"</string> <string name="managed_profile_label" msgid="6260850669674791528">"အလုပ်"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"အဆက်အသွယ်များ"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"သင့် အဆက်အသွယ်များအား ဝင်ရောက်သုံးရန်"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 77880d86b312..6a2fb12ba60c 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dager"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Sikkermodus"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-system"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Personlige apper"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personlig"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Jobb"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakter"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"få tilgang til kontaktene dine"</string> diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml index 04dc8069474b..081286683a35 100644 --- a/core/res/res/values-ne-rNP/strings.xml +++ b/core/res/res/values-ne-rNP/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> दिन"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> दिन<xliff:g id="HOURS">%2$d</xliff:g> घन्टा"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> दिन<xliff:g id="HOURS">%2$d</xliff:g> घन्टा"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"९९९+"</string> <string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string> <string name="android_system_label" msgid="6577375335728551336">"एन्ड्रोइड प्रणाली"</string> - <string name="user_owner_label" msgid="6465364741001216388">"व्यक्तिगत अनुप्रयोगहरू"</string> + <string name="user_owner_label" msgid="2804351898001038951">"व्यक्तिगत"</string> <string name="managed_profile_label" msgid="6260850669674791528">"काम"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"सम्पर्कहरू"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"तपाईँको सम्पर्कमा पहुँच गर्नुहोस्"</string> diff --git a/core/res/res/values-night/themes_material_daynight.xml b/core/res/res/values-night/themes_material_daynight.xml deleted file mode 100644 index b34458295ba3..000000000000 --- a/core/res/res/values-night/themes_material_daynight.xml +++ /dev/null @@ -1,117 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2015 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<!-- -=============================================================== - PLEASE READ -=============================================================== - -The Material themes must not be modified in order to pass CTS. -Many related themes and styles depend on other values defined in this file. -If you would like to provide custom themes and styles for your device, -please see themes_device_defaults.xml. - -=============================================================== - PLEASE READ -=============================================================== - --> -<resources> - - <!-- Material theme (day/night version) for activities. --> - <style name="Theme.Material.DayNight" parent="Theme.Material" /> - - <!-- Variant of Material.DayNight that has a solid (opaque) action bar - with an inverse color profile. The dark action bar sharply stands out against - the light content (when applicable). --> - <style name="Theme.Material.DayNight.DarkActionBar" parent="Theme.Material" /> - - <!-- Variant of Material.DayNight with no action bar. --> - <style name="Theme.Material.DayNight.NoActionBar" parent="Theme.Material.NoActionBar" /> - - <!-- Variant of Material.DayNight that has no title bar and fills - the entire screen. This theme - sets {@link android.R.attr#windowFullscreen} to true. --> - <style name="Theme.Material.DayNight.NoActionBar.Fullscreen" parent="Theme.Material.NoActionBar.Fullscreen" /> - - <!-- Variant of Material.DayNight that has no title bar and fills - the entire screen and extends into the display overscan region. This theme - sets {@link android.R.attr#windowFullscreen} and {@link android.R.attr#windowOverscan} - to true. --> - <style name="Theme.Material.DayNight.NoActionBar.Overscan" parent="Theme.Material.NoActionBar.Overscan" /> - - <!-- Variant of Material.DayNight that has no title bar and translucent - system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and - {@link android.R.attr#windowTranslucentNavigation} to true. --> - <style name="Theme.Material.DayNight.NoActionBar.TranslucentDecor" parent="Theme.Material.NoActionBar.TranslucentDecor" /> - - <!-- Default Material.DayNight theme for panel windows. This removes all extraneous - window decorations, so you basically have an empty rectangle in which - to place your content. It makes the window floating, with a transparent - background, and turns off dimming behind the window. --> - <style name="Theme.Material.DayNight.Panel" parent="Theme.Material.Panel" /> - - <!-- Material theme (day/night version) for dialog windows and activities, - which is used by the {@link android.app.Dialog} class. This changes - the window to be floating (not fill the entire screen), and puts a - frame around its contents. You can set this theme on an activity if - you would like to make an activity that looks like a Dialog. --> - <style name="Theme.Material.DayNight.Dialog" parent="Theme.Material.DayNight.BaseDialog" /> - <style name="Theme.Material.DayNight.BaseDialog" parent="Theme.Material.BaseDialog" /> - - <!-- Variant of Theme.Material.DayNight.Dialog that has a nice minimum width for - a regular dialog. --> - <style name="Theme.Material.DayNight.Dialog.MinWidth" parent="Theme.Material.Dialog.MinWidth" /> - - <!-- Variant of Theme.Material.DayNight.Dialog that does not include a title bar. --> - <style name="Theme.Material.DayNight.Dialog.NoActionBar" parent="Theme.Material.Dialog.NoActionBar" /> - - <!-- Variant of Theme.Material.DayNight.Dialog.NoActionBar that has a nice minimum width for - a regular dialog. --> - <style name="Theme.Material.DayNight.Dialog.NoActionBar.MinWidth" parent="Theme.Material.Dialog.NoActionBar.MinWidth" /> - - <!-- Variant of Theme.Material.DayNight.Dialog that has a fixed size. --> - <style name="Theme.Material.DayNight.Dialog.FixedSize" parent="Theme.Material.Dialog.FixedSize" /> - - <!-- Variant of Theme.Material.DayNight.Dialog.NoActionBar that has a fixed size. --> - <style name="Theme.Material.DayNight.Dialog.NoActionBar.FixedSize" parent="Theme.Material.Dialog.NoActionBar.FixedSize" /> - - <!-- Theme for a window that will be displayed either full-screen on - smaller screens (small, normal) or as a dialog on larger screens - (large, xlarge). --> - <style name="Theme.Material.DayNight.DialogWhenLarge" parent="Theme.Material.DialogWhenLarge" /> - - <!-- Theme for a window with a dark action bar that will be displayed - either full-screen on smaller screens (small, normal) or as a dialog - on larger screens (large, xlarge). --> - <style name="Theme.Material.DayNight.DialogWhenLarge.DarkActionBar" parent="Theme.Material.DialogWhenLarge" /> - - <!-- Theme for a window without an action bar that will be displayed either full-screen - on smaller screens (small, normal) or as a dialog on larger screens - (large, xlarge). --> - <style name="Theme.Material.DayNight.DialogWhenLarge.NoActionBar" parent="Theme.Material.DialogWhenLarge.NoActionBar" /> - - <!-- Theme for a presentation window on a secondary display. --> - <style name="Theme.Material.DayNight.Dialog.Presentation" parent="Theme.Material.Dialog.Presentation" /> - - <!-- Material user theme for alert dialog windows, which is used by the - {@link android.app.AlertDialog} class. --> - <style name="Theme.Material.DayNight.Dialog.Alert" parent="Theme.Material.DayNight.Dialog.BaseAlert" /> - <style name="Theme.Material.DayNight.Dialog.BaseAlert" parent="Theme.Material.Dialog.BaseAlert" /> - - <style name="Theme.Material.DayNight.SearchBar" parent="Theme.Material.SearchBar" /> - <style name="Theme.Material.DayNight.CompactMenu" parent="Theme.Material.CompactMenu" /> - -</resources> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 28d86c84954b..23a4ca2b80bb 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dagen"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999 +"</string> <string name="safeMode" msgid="2788228061547930246">"Veilige modus"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-systeem"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Persoonlijke apps"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Persoonlijk"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Werk"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacten"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"toegang krijgen tot uw contacten"</string> diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml index 8ce1a9b93cd9..fba7a8113f3f 100644 --- a/core/res/res/values-pa-rIN/strings.xml +++ b/core/res/res/values-pa-rIN/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ਦਿਨ"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ਦਿਨ <xliff:g id="HOURS">%2$d</xliff:g> ਘੰਟੇ"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ਦਿਨ <xliff:g id="HOURS">%2$d</xliff:g> ਘੰਟਾ"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"ਸੁਰੱਖਿਅਤ ਮੋਡ"</string> <string name="android_system_label" msgid="6577375335728551336">"Android System"</string> - <string name="user_owner_label" msgid="6465364741001216388">"ਨਿੱਜੀ ਐਪਸ"</string> + <string name="user_owner_label" msgid="2804351898001038951">"ਨਿੱਜੀ"</string> <string name="managed_profile_label" msgid="6260850669674791528">"ਕੰਮ"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"ਸੰਪਰਕ"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"ਆਪਣੇ ਸੰਪਰਕਾਂ ਨੂੰ ਐਕਸੈਸ ਕਰੋ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 1737626a6525..3c895ccb6af4 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dni"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dzień <xliff:g id="HOURS">%2$d</xliff:g> godz."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dzień <xliff:g id="HOURS">%2$d</xliff:g> godz."</string> @@ -227,7 +226,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string> <string name="safeMode" msgid="2788228061547930246">"Tryb awaryjny"</string> <string name="android_system_label" msgid="6577375335728551336">"System Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Aplikacje osobiste"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Osobiste"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Praca"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakty"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"dostęp do kontaktów"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 7ec15e3686a0..a9968ccec258 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dias"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Aplicações pessoais"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Pessoal"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Trabalho"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactos"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"aceder aos contactos"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index a4e93ada79fa..1112bdb566fa 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dias"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string> <string name="safeMode" msgid="2788228061547930246">"Modo de segurança"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Apps pessoais"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Pessoal"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Trabalho"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contatos"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"acessar seus contatos"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index b2031c6e46cb..347439cdc6c2 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TO"</string> <string name="petabyteShort" msgid="5637816680144990219">"PO"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> (de) zile"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> zile <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> zi <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -226,7 +225,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"˃999"</string> <string name="safeMode" msgid="2788228061547930246">"Mod sigur"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistemul Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Aplicații personale"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Serviciu"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Persoane de contact"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"accesează persoanele de contact"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 58ffa3b56895..253285256de8 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string> <string name="terabyteShort" msgid="231613018159186962">"TБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дн."</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> день <xliff:g id="HOURS">%2$d</xliff:g> ч."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> день <xliff:g id="HOURS">%2$d</xliff:g> ч."</string> @@ -227,7 +226,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string> <string name="safeMode" msgid="2788228061547930246">"Безопасный режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Система Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Персональные приложения"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Личные данные"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Работа"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакты"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"доступ к контактам"</string> diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml index 58cb2ea4bbfd..b866db2d96eb 100644 --- a/core/res/res/values-si-rLK/strings.xml +++ b/core/res/res/values-si-rLK/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"දින <xliff:g id="DAYS">%1$d</xliff:g>"</string> <string name="durationDayHours" msgid="2713107458736744435">"දින <xliff:g id="DAYS">%1$d</xliff:g> පැය <xliff:g id="HOURS">%2$d</xliff:g>"</string> <string name="durationDayHour" msgid="7293789639090958917">"දින <xliff:g id="DAYS">%1$d</xliff:g> පැය <xliff:g id="HOURS">%2$d</xliff:g>"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"ආරක්ෂිත ආකාරය"</string> <string name="android_system_label" msgid="6577375335728551336">"Android පද්ධතිය"</string> - <string name="user_owner_label" msgid="6465364741001216388">"පුද්ගලික යෙදුම්"</string> + <string name="user_owner_label" msgid="2804351898001038951">"පෞද්ගලික"</string> <string name="managed_profile_label" msgid="6260850669674791528">"කාර්යාලය"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"සම්බන්ධතා"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"ඔබේ සම්බන්ධතාවලට පිවිසෙන්න"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 124bef9721fc..73b9be763155 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d."</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> hod."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> hod."</string> @@ -227,7 +226,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Núdzový režim"</string> <string name="android_system_label" msgid="6577375335728551336">"Systém Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Osobné aplikácie"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Osobné"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Práca"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakty"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"prístup k vašim kontaktom"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index efcdee902095..2296350c79df 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"Št. dni: <xliff:g id="DAYS">%1$d</xliff:g>"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -227,7 +226,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999 +"</string> <string name="safeMode" msgid="2788228061547930246">"Varni način"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Osebne aplikacije"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Osebno"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Služba"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Stiki"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"dostop do stikov"</string> diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml index 26dee97603f3..d5ec38cab04c 100644 --- a/core/res/res/values-sq-rAL/strings.xml +++ b/core/res/res/values-sq-rAL/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"terabajt"</string> <string name="petabyteShort" msgid="5637816680144990219">"petabajt"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ditë"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ditë e <xliff:g id="HOURS">%2$d</xliff:g> orë"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ditë e <xliff:g id="HOURS">%2$d</xliff:g> orë"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Modaliteti i sigurisë"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistemi \"android\""</string> - <string name="user_owner_label" msgid="6465364741001216388">"Aplikacione personale"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Puna"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktet"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"qasu te kontaktet e tua"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index e2209e6d508c..3a158ae41a7d 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дана"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> дан <xliff:g id="HOURS">%2$d</xliff:g> с"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> дан <xliff:g id="HOURS">%2$d</xliff:g> с"</string> @@ -226,7 +225,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Безбедни режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Android систем"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Личне апликације"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Лично"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Посао"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакти"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"приступ контактима"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 3f7de17447dc..7f223231d6f7 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dagar"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> tim"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> tim"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Säkert läge"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-system"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Personliga appar"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personligt"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Arbetet"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakter"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"få tillgång till dina kontakter"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 1dd01bc1ef5b..20a750ec9289 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"Siku <xliff:g id="DAYS">%1$d</xliff:g>"</string> <string name="durationDayHours" msgid="2713107458736744435">"Siku <xliff:g id="DAYS">%1$d</xliff:g> saa <xliff:g id="HOURS">%2$d</xliff:g>"</string> <string name="durationDayHour" msgid="7293789639090958917">"Siku <xliff:g id="DAYS">%1$d</xliff:g> saa <xliff:g id="HOURS">%2$d</xliff:g>"</string> @@ -227,7 +226,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Mtindo salama"</string> <string name="android_system_label" msgid="6577375335728551336">"Mfumo wa Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Programu binafsi"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Binafsi"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Kazini"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Anwani"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"fikia anwani zako"</string> diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml index 1140cc16257d..1acab809e09d 100644 --- a/core/res/res/values-ta-rIN/strings.xml +++ b/core/res/res/values-ta-rIN/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"ஜி.பை."</string> <string name="terabyteShort" msgid="231613018159186962">"டெ.பை."</string> <string name="petabyteShort" msgid="5637816680144990219">"பெ.பை."</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> நாட்கள்"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> நாள் <xliff:g id="HOURS">%2$d</xliff:g> ம.நே."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> நாள் <xliff:g id="HOURS">%2$d</xliff:g> ம.நே."</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"பாதுகாப்பு பயன்முறை"</string> <string name="android_system_label" msgid="6577375335728551336">"Android அமைப்பு"</string> - <string name="user_owner_label" msgid="6465364741001216388">"தனிப்பட்ட பயன்பாடுகள்"</string> + <string name="user_owner_label" msgid="2804351898001038951">"தனிப்பட்ட"</string> <string name="managed_profile_label" msgid="6260850669674791528">"பணியிடம்"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"தொடர்புகள்"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"தொடர்புகளை அணுகும்"</string> diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml index 115c1cc836fa..69b24654e1ca 100644 --- a/core/res/res/values-te-rIN/strings.xml +++ b/core/res/res/values-te-rIN/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> రోజులు"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> రో <xliff:g id="HOURS">%2$d</xliff:g> గం"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> రో <xliff:g id="HOURS">%2$d</xliff:g> గం"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"సురక్షిత మోడ్"</string> <string name="android_system_label" msgid="6577375335728551336">"Android సిస్టమ్"</string> - <string name="user_owner_label" msgid="6465364741001216388">"వ్యక్తిగత అనువర్తనాలు"</string> + <string name="user_owner_label" msgid="2804351898001038951">"వ్యక్తిగతం"</string> <string name="managed_profile_label" msgid="6260850669674791528">"కార్యాలయం"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"పరిచయాలు"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"మీ పరిచయాలను ప్రాప్యత చేస్తుంది"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 0b37f2743c76..0f1733412ba9 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> วัน"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> วัน <xliff:g id="HOURS">%2$d</xliff:g> ชม."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> วัน <xliff:g id="HOURS">%2$d</xliff:g> ชม."</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"โหมดปลอดภัย"</string> <string name="android_system_label" msgid="6577375335728551336">"ระบบ Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"แอปส่วนตัว"</string> + <string name="user_owner_label" msgid="2804351898001038951">"ส่วนตัว"</string> <string name="managed_profile_label" msgid="6260850669674791528">"ที่ทำงาน"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"รายชื่อติดต่อ"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"เข้าถึงรายชื่อติดต่อ"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 6dd35d43ea76..7c91b0909938 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> (na) araw"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string> <string name="android_system_label" msgid="6577375335728551336">"Android System"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Mga personal na app"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Trabaho"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Mga Contact"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"ina-access ang iyong mga contact"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 7fd1fc254e68..192adb91317f 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> gün"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> gün <xliff:g id="HOURS">%2$d</xliff:g> sa."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> gün <xliff:g id="HOURS">%2$d</xliff:g> sa."</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Güvenli mod"</string> <string name="android_system_label" msgid="6577375335728551336">"Android Sistemi"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Kişisel uygulamalar"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Kişisel"</string> <string name="managed_profile_label" msgid="6260850669674791528">"İş"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kişiler"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"kişilerinize erişme"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 61e487c155b8..7ad6f1d5faf2 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"Гб"</string> <string name="terabyteShort" msgid="231613018159186962">"Тб"</string> <string name="petabyteShort" msgid="5637816680144990219">"Пб"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дн."</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> день <xliff:g id="HOURS">%2$d</xliff:g> год"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> дн. <xliff:g id="HOURS">%2$d</xliff:g> год"</string> @@ -227,7 +226,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Безп. режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Система Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Особисті додатки"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Особисті дані"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Службовий профіль"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакти"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"отримувати доступ до контактів"</string> @@ -731,7 +730,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Малювання ключа розпочалося"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Ключ очищено"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Телефон додано"</string> - <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Додано клітинку <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Додано крапку <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Малювання ключа закінчено"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Віджет %2$d з %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Додати віджет."</string> diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml index 38bdec8ff6cd..bee9998a46a0 100644 --- a/core/res/res/values-ur-rPK/strings.xml +++ b/core/res/res/values-ur-rPK/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> دن"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> دن <xliff:g id="HOURS">%2$d</xliff:g> گھنٹے"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> دن <xliff:g id="HOURS">%2$d</xliff:g> گھنٹہ"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"حفاظتی وضع"</string> <string name="android_system_label" msgid="6577375335728551336">"Android سسٹم"</string> - <string name="user_owner_label" msgid="6465364741001216388">"ذاتی ایپس"</string> + <string name="user_owner_label" msgid="2804351898001038951">"ذاتی"</string> <string name="managed_profile_label" msgid="6260850669674791528">"دفتر"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"رابطے"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"اپنے رابطوں تک رسائی حاصل کریں"</string> diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml index e3eb789b5b38..d817e115cf44 100644 --- a/core/res/res/values-uz-rUZ/strings.xml +++ b/core/res/res/values-uz-rUZ/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> kun"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> kun <xliff:g id="HOURS">%2$d</xliff:g> soat"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> kun <xliff:g id="HOURS">%2$d</xliff:g> soat"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Xavfsiz usul"</string> <string name="android_system_label" msgid="6577375335728551336">"Android tizimi"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Shaxsiy ilovalar"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Shaxsiy"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Ish"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktlar"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"kontaktlarga kirish"</string> @@ -729,7 +728,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Chizma namunasi ishga tushirildi"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Chizma namunasi tozalandi"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Katak qo‘shildi"</string> - <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> qo‘shildi"</string> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> katak qo‘shildi"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Chizma namunasi tugatildi"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Vidjet %2$d / %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Vidjet qo‘shish."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 1a2c8d375510..f00bd889a793 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ngày"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ngày <xliff:g id="HOURS">%2$d</xliff:g> giờ"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ngày <xliff:g id="HOURS">%2$d</xliff:g> giờ"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Chế độ an toàn"</string> <string name="android_system_label" msgid="6577375335728551336">"Hệ thống Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Ứng dụng cá nhân"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Cá nhân"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Cơ quan"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Danh bạ"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"truy cập vào danh bạ của bạn"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index a7b4344b141c..9e42c8c47eed 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g>天"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g>天<xliff:g id="HOURS">%2$d</xliff:g>小时"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g>天<xliff:g id="HOURS">%2$d</xliff:g>小时"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"安全模式"</string> <string name="android_system_label" msgid="6577375335728551336">"Android系统"</string> - <string name="user_owner_label" msgid="6465364741001216388">"个人应用"</string> + <string name="user_owner_label" msgid="2804351898001038951">"个人"</string> <string name="managed_profile_label" msgid="6260850669674791528">"工作"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"通讯录"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"使用您的通讯录"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 097acfa9bf15..5d54d76ee44f 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> 天"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"安全模式"</string> <string name="android_system_label" msgid="6577375335728551336">"Android 系統"</string> - <string name="user_owner_label" msgid="6465364741001216388">"個人應用程式"</string> + <string name="user_owner_label" msgid="2804351898001038951">"個人"</string> <string name="managed_profile_label" msgid="6260850669674791528">"公司"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"通訊錄"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"存取您的通訊錄"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index a64ff187dd84..b96f2d0039bc 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> 天"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"超過 999"</string> <string name="safeMode" msgid="2788228061547930246">"安全模式"</string> <string name="android_system_label" msgid="6577375335728551336">"Android 系統"</string> - <string name="user_owner_label" msgid="6465364741001216388">"個人應用程式"</string> + <string name="user_owner_label" msgid="2804351898001038951">"個人"</string> <string name="managed_profile_label" msgid="6260850669674791528">"公司"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"聯絡人"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"存取您的聯絡人"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 5794daf34064..92839d1d3d8b 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -26,8 +26,7 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <!-- no translation found for fileSizeSuffix (8897567456150907538) --> - <skip /> + <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> izinsuku"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> usuku <xliff:g id="HOURS">%2$d</xliff:g> amahora"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> usuku <xliff:g id="HOURS">%2$d</xliff:g> ihora"</string> @@ -225,7 +224,7 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Imodi ephephile"</string> <string name="android_system_label" msgid="6577375335728551336">"Uhlelo lwe-Android"</string> - <string name="user_owner_label" msgid="6465364741001216388">"Izinhlelo zokusebenza zomuntu siqu"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Okomuntu siqu"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Umsebenzi"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Oxhumana nabo"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"finyelela koxhumana nabo"</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 7272ae304384..edbe1304d910 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -157,6 +157,15 @@ ActivityManager based on screen size. --> <integer name="config_extraFreeKbytesAdjust">0</integer> + <!-- Set this to true to enable the platform's auto-power-save modes like doze and + app standby. These are not enabled by default because they require a standard + cloud-to-device messaging service for apps to interact correctly with the modes + (such as to be able to deliver an instant message to the device even when it is + dozing). This should be enabled if you have such services and expect apps to + correctly use them when installed on your device. Otherwise, keep this disabled + so that applications can still use their own mechanisms. --> + <bool name="config_enableAutoPowerModes">false</bool> + <!-- The duration (in milliseconds) that the radio will scan for a signal when there's no network connection. If the scan doesn't timeout, use zero --> <integer name="config_radioScanningTimeout">0</integer> @@ -2031,10 +2040,8 @@ string that's stored in 8-bit unpacked format) characters.--> <bool translatable="false" name="config_sms_decode_gsm_8bit_data">false</bool> - <!-- List of package names (ordered by preference) providing WebView implementations. --> - <string-array name="config_webViewPackageNames" translatable="false"> - <item>com.android.webview</item> - </string-array> + <!-- Package name providing WebView implementation. --> + <string name="config_webViewPackageName" translatable="false">com.android.webview</string> <!-- If EMS is not supported, framework breaks down EMS into single segment SMS and adds page info " x/y". This config is used to set which carrier doesn't diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index e60a48de33d0..7e74680255d2 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -399,6 +399,7 @@ <dimen name="floating_toolbar_maximum_overflow_height">192dp</dimen> <dimen name="floating_toolbar_horizontal_margin">16dp</dimen> <dimen name="floating_toolbar_vertical_margin">8dp</dimen> + <dimen name="content_rect_bottom_clip_allowance">20dp</dimen> <dimen name="chooser_grid_padding">0dp</dimen> </resources> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 65fa36b854b8..ab798bbb24b6 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2631,27 +2631,41 @@ <public type="attr" name="fullBackupContent" /> <public type="style" name="Widget.Material.Button.Colored" /> - <public type="style" name="Theme.Material.DayNight" /> - <public type="style" name="Theme.Material.DayNight.DarkActionBar" /> - <public type="style" name="Theme.Material.DayNight.Dialog" /> - <public type="style" name="Theme.Material.DayNight.Dialog.Alert" /> - <public type="style" name="Theme.Material.DayNight.Dialog.MinWidth" /> - <public type="style" name="Theme.Material.DayNight.Dialog.NoActionBar" /> - <public type="style" name="Theme.Material.DayNight.Dialog.NoActionBar.MinWidth" /> - <public type="style" name="Theme.Material.DayNight.Dialog.Presentation" /> - <public type="style" name="Theme.Material.DayNight.DialogWhenLarge" /> - <public type="style" name="Theme.Material.DayNight.DialogWhenLarge.NoActionBar" /> - <public type="style" name="Theme.Material.DayNight.NoActionBar" /> - <public type="style" name="Theme.Material.DayNight.NoActionBar.Fullscreen" /> - <public type="style" name="Theme.Material.DayNight.NoActionBar.Overscan" /> - <public type="style" name="Theme.Material.DayNight.NoActionBar.TranslucentDecor" /> - <public type="style" name="Theme.Material.DayNight.Panel" /> + + <style name="__reserved8" /> + <public type="style" name="__reserved8" /> + <style name="__reserved9" /> + <public type="style" name="__reserved9" /> + <style name="__reserved10" /> + <public type="style" name="__reserved10" /> + <style name="__reserved11" /> + <public type="style" name="__reserved11" /> + <style name="__reserved12" /> + <public type="style" name="__reserved12" /> + <style name="__reserved13" /> + <public type="style" name="__reserved13" /> + <style name="__reserved14" /> + <public type="style" name="__reserved14" /> + <style name="__reserved15" /> + <public type="style" name="__reserved15" /> + <style name="__reserved16" /> + <public type="style" name="__reserved16" /> + <style name="__reserved17" /> + <public type="style" name="__reserved17" /> + <style name="__reserved18" /> + <public type="style" name="__reserved18" /> + <style name="__reserved19" /> + <public type="style" name="__reserved19" /> + <style name="__reserved20" /> + <public type="style" name="__reserved20" /> + <style name="__reserved21" /> + <public type="style" name="__reserved21" /> + <style name="__reserved22" /> + <public type="style" name="__reserved22" /> <public type="style" name="Theme.Material.Light.LightStatusBar" /> <public type="style" name="ThemeOverlay.Material.Dialog" /> <public type="style" name="TextAppearance.Material.Widget.Button.Inverse" /> <public type="style" name="ThemeOverlay.Material.Dialog.Alert" /> - <public type="style" name="Theme.Material.Light.DialogWhenLarge.DarkActionBar" /> - <public type="style" name="Theme.Material.DayNight.DialogWhenLarge.DarkActionBar" /> <public type="id" name="pasteAsPlainText" /> <public type="id" name="undo" /> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 5ba57c48025f..e6f54eecd866 100755 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -251,6 +251,7 @@ <java-symbol type="bool" name="config_bluetooth_le_peripheral_mode_supported" /> <java-symbol type="bool" name="config_cellBroadcastAppLinks" /> <java-symbol type="bool" name="config_duplicate_port_omadm_wappush" /> + <java-symbol type="bool" name="config_enableAutoPowerModes" /> <java-symbol type="bool" name="config_enable_emergency_call_while_sim_locked" /> <java-symbol type="bool" name="config_enable_puk_unlock_screen" /> <java-symbol type="bool" name="config_enableBurnInProtection" /> @@ -2018,7 +2019,7 @@ <java-symbol type="attr" name="actionModeWebSearchDrawable" /> <java-symbol type="string" name="websearch" /> <java-symbol type="drawable" name="ic_media_video_poster" /> - <java-symbol type="array" name="config_webViewPackageNames" /> + <java-symbol type="string" name="config_webViewPackageName" /> <!-- From SubtitleView --> <java-symbol type="dimen" name="subtitle_corner_radius" /> @@ -2274,6 +2275,7 @@ <java-symbol type="dimen" name="floating_toolbar_maximum_overflow_height" /> <java-symbol type="dimen" name="floating_toolbar_horizontal_margin" /> <java-symbol type="dimen" name="floating_toolbar_vertical_margin" /> + <java-symbol type="dimen" name="content_rect_bottom_clip_allowance" /> <java-symbol type="string" name="date_picker_prev_month_button" /> <java-symbol type="string" name="date_picker_next_month_button" /> diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml index 295b453fb0b7..9d3a7ef3e9fd 100644 --- a/core/res/res/values/themes_material.xml +++ b/core/res/res/values/themes_material.xml @@ -1281,7 +1281,7 @@ please see themes_device_defaults.xml. </style> <!-- Default theme for Settings and activities launched from Settings. --> - <style name="Theme.Material.Settings" parent="Theme.Material.DayNight.DarkActionBar"> + <style name="Theme.Material.Settings" parent="Theme.Material.Light.DarkActionBar"> <item name="colorPrimary">@color/material_blue_grey_900</item> <item name="colorPrimaryDark">@color/material_blue_grey_950</item> @@ -1291,7 +1291,7 @@ please see themes_device_defaults.xml. </style> <!-- Default theme for Settings and activities launched from Settings. --> - <style name="Theme.Material.Settings.NoActionBar" parent="Theme.Material.DayNight.NoActionBar"> + <style name="Theme.Material.Settings.NoActionBar" parent="Theme.Material.Light.NoActionBar"> <item name="colorPrimary">@color/material_blue_grey_900</item> <item name="colorPrimaryDark">@color/material_blue_grey_950</item> @@ -1299,42 +1299,40 @@ please see themes_device_defaults.xml. <item name="searchDialogTheme">@style/Theme.Material.Settings.SearchBar</item> <item name="panelMenuListTheme">@style/Theme.Material.Settings.CompactMenu</item> </style> - - <style name="Theme.Material.Settings.BaseDialog" parent="Theme.Material.DayNight.BaseDialog"> + <style name="Theme.Material.Settings.BaseDialog" parent="Theme.Material.Light.BaseDialog"> <item name="colorPrimary">@color/material_blue_grey_900</item> <item name="colorPrimaryDark">@color/material_blue_grey_950</item> </style> <style name="Theme.Material.Settings.Dialog" parent="Theme.Material.Settings.BaseDialog" /> - <style name="Theme.Material.Settings.Dialog.BaseAlert" parent="Theme.Material.DayNight.Dialog.BaseAlert"> + <style name="Theme.Material.Settings.Dialog.BaseAlert" parent="Theme.Material.Light.Dialog.BaseAlert"> <item name="colorPrimary">@color/material_blue_grey_900</item> <item name="colorPrimaryDark">@color/material_blue_grey_950</item> </style> <style name="Theme.Material.Settings.Dialog.Alert" parent="Theme.Material.Settings.Dialog.BaseAlert" /> - <style name="Theme.Material.Settings.DialogWhenLarge" parent="Theme.Material.DayNight.DialogWhenLarge.DarkActionBar"> + <style name="Theme.Material.Settings.DialogWhenLarge" parent="Theme.Material.Light.DialogWhenLarge.DarkActionBar"> <item name="colorPrimary">@color/material_blue_grey_900</item> <item name="colorPrimaryDark">@color/material_blue_grey_950</item> </style> - <style name="Theme.Material.Settings.DialogWhenLarge.NoActionBar" parent="Theme.Material.DayNight.DialogWhenLarge.NoActionBar"> + <style name="Theme.Material.Settings.DialogWhenLarge.NoActionBar" parent="Theme.Material.Light.DialogWhenLarge.NoActionBar"> <item name="colorPrimary">@color/material_blue_grey_900</item> <item name="colorPrimaryDark">@color/material_blue_grey_950</item> </style> - - <style name="Theme.Material.Settings.Dialog.Presentation" parent="Theme.Material.DayNight.Dialog.Presentation"> + <style name="Theme.Material.Settings.Dialog.Presentation" parent="Theme.Material.Light.Dialog.Presentation"> <item name="colorPrimary">@color/material_blue_grey_900</item> <item name="colorPrimaryDark">@color/material_blue_grey_950</item> </style> - <style name="Theme.Material.Settings.SearchBar" parent="Theme.Material.DayNight.SearchBar"> + <style name="Theme.Material.Settings.SearchBar" parent="Theme.Material.Light.SearchBar"> <item name="colorPrimary">@color/material_blue_grey_900</item> <item name="colorPrimaryDark">@color/material_blue_grey_950</item> </style> - <style name="Theme.Material.Settings.CompactMenu" parent="Theme.Material.DayNight.CompactMenu"> + <style name="Theme.Material.Settings.CompactMenu" parent="Theme.Material.Light.CompactMenu"> <item name="colorPrimary">@color/material_blue_grey_900</item> <item name="colorPrimaryDark">@color/material_blue_grey_950</item> </style> diff --git a/core/res/res/values/themes_material_daynight.xml b/core/res/res/values/themes_material_daynight.xml deleted file mode 100644 index 4ecca6be0b70..000000000000 --- a/core/res/res/values/themes_material_daynight.xml +++ /dev/null @@ -1,117 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2015 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<!-- -=============================================================== - PLEASE READ -=============================================================== - -The Material themes must not be modified in order to pass CTS. -Many related themes and styles depend on other values defined in this file. -If you would like to provide custom themes and styles for your device, -please see themes_device_defaults.xml. - -=============================================================== - PLEASE READ -=============================================================== - --> -<resources> - - <!-- Material theme (day/night vesion) for activities. --> - <style name="Theme.Material.DayNight" parent="Theme.Material.Light" /> - - <!-- Variant of Material.DayNight that has a solid (opaque) action bar - with an inverse color profile. The dark action bar sharply stands out against - the light content (when applicable). --> - <style name="Theme.Material.DayNight.DarkActionBar" parent="Theme.Material.Light.DarkActionBar" /> - - <!-- Variant of Material.DayNight with no action bar. --> - <style name="Theme.Material.DayNight.NoActionBar" parent="Theme.Material.Light.NoActionBar" /> - - <!-- Variant of Material.DayNight that has no title bar and fills - the entire screen. This theme - sets {@link android.R.attr#windowFullscreen} to true. --> - <style name="Theme.Material.DayNight.NoActionBar.Fullscreen" parent="Theme.Material.Light.NoActionBar.Fullscreen" /> - - <!-- Variant of Material.DayNight that has no title bar and fills - the entire screen and extends into the display overscan region. This theme - sets {@link android.R.attr#windowFullscreen} and {@link android.R.attr#windowOverscan} - to true. --> - <style name="Theme.Material.DayNight.NoActionBar.Overscan" parent="Theme.Material.Light.NoActionBar.Overscan" /> - - <!-- Variant of Material.DayNight that has no title bar and translucent - system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and - {@link android.R.attr#windowTranslucentNavigation} to true. --> - <style name="Theme.Material.DayNight.NoActionBar.TranslucentDecor" parent="Theme.Material.Light.NoActionBar.TranslucentDecor" /> - - <!-- Default Material.DayNight theme for panel windows. This removes all extraneous - window decorations, so you basically have an empty rectangle in which - to place your content. It makes the window floating, with a transparent - background, and turns off dimming behind the window. --> - <style name="Theme.Material.DayNight.Panel" parent="Theme.Material.Light.Panel" /> - - <!-- Material theme (day/night vesion) for dialog windows and activities, - which is used by the {@link android.app.Dialog} class. This changes - the window to be floating (not fill the entire screen), and puts a - frame around its contents. You can set this theme on an activity if - you would like to make an activity that looks like a Dialog. --> - <style name="Theme.Material.DayNight.Dialog" parent="Theme.Material.DayNight.BaseDialog" /> - <style name="Theme.Material.DayNight.BaseDialog" parent="Theme.Material.Light.BaseDialog" /> - - <!-- Variant of Theme.Material.DayNight.Dialog that has a nice minimum width for - a regular dialog. --> - <style name="Theme.Material.DayNight.Dialog.MinWidth" parent="Theme.Material.Light.Dialog.MinWidth" /> - - <!-- Variant of Theme.Material.DayNight.Dialog that does not include a title bar. --> - <style name="Theme.Material.DayNight.Dialog.NoActionBar" parent="Theme.Material.Light.Dialog.NoActionBar" /> - - <!-- Variant of Theme.Material.DayNight.Dialog.NoActionBar that has a nice minimum width for - a regular dialog. --> - <style name="Theme.Material.DayNight.Dialog.NoActionBar.MinWidth" parent="Theme.Material.Light.Dialog.NoActionBar.MinWidth" /> - - <!-- Variant of Theme.Material.DayNight.Dialog that has a fixed size. --> - <style name="Theme.Material.DayNight.Dialog.FixedSize" parent="Theme.Material.Light.Dialog.FixedSize" /> - - <!-- Variant of Theme.Material.DayNight.Dialog.NoActionBar that has a fixed size. --> - <style name="Theme.Material.DayNight.Dialog.NoActionBar.FixedSize" parent="Theme.Material.Light.Dialog.NoActionBar.FixedSize" /> - - <!-- Theme for a window that will be displayed either full-screen on - smaller screens (small, normal) or as a dialog on larger screens - (large, xlarge). --> - <style name="Theme.Material.DayNight.DialogWhenLarge" parent="Theme.Material.Light.DialogWhenLarge" /> - - <!-- Theme for a window with a dark action bar that will be displayed - either full-screen on smaller screens (small, normal) or as a dialog - on larger screens (large, xlarge). --> - <style name="Theme.Material.DayNight.DialogWhenLarge.DarkActionBar" parent="Theme.Material.Light.DialogWhenLarge.DarkActionBar" /> - - <!-- Theme for a window without an action bar that will be displayed either full-screen - on smaller screens (small, normal) or as a dialog on larger screens - (large, xlarge). --> - <style name="Theme.Material.DayNight.DialogWhenLarge.NoActionBar" parent="Theme.Material.Light.DialogWhenLarge.NoActionBar" /> - - <!-- Theme for a presentation window on a secondary display. --> - <style name="Theme.Material.DayNight.Dialog.Presentation" parent="Theme.Material.Light.Dialog.Presentation" /> - - <!-- Material user theme for alert dialog windows, which is used by the - {@link android.app.AlertDialog} class. --> - <style name="Theme.Material.DayNight.Dialog.Alert" parent="Theme.Material.DayNight.Dialog.BaseAlert" /> - <style name="Theme.Material.DayNight.Dialog.BaseAlert" parent="Theme.Material.Light.Dialog.BaseAlert" /> - - <style name="Theme.Material.DayNight.SearchBar" parent="Theme.Material.Light.SearchBar" /> - <style name="Theme.Material.DayNight.CompactMenu" parent="Theme.Material.Light.CompactMenu" /> - -</resources> diff --git a/docs/html/design/tv/index.jd b/docs/html/design/tv/index.jd index def1286a45ac..38e5b7932483 100644 --- a/docs/html/design/tv/index.jd +++ b/docs/html/design/tv/index.jd @@ -4,6 +4,12 @@ page.metaDescription=Guidelines to help you create a great leanback experience o page.image=design/tv/images/apps-games-rows.jpg @jd:body +<a class="notice-designers" style="clear:none" href="http://www.google.com/design/spec-tv"> + <div> + <h3>Material Design</h3> + <p>Android TV Design Guidelines</p> + </div> +</a> <p>The Android TV platform user interface provides the launch pad for your app's big screen experience. It's important to understand how your app is presented in the main user interface and diff --git a/docs/html/design/wear/context.jd b/docs/html/design/wear/context.jd index 688806fbd645..7a0baf80533b 100644 --- a/docs/html/design/wear/context.jd +++ b/docs/html/design/wear/context.jd @@ -2,19 +2,19 @@ page.title=Context Awareness on Android Wear @jd:body <style> -div.slide-wrapper { +.slide-wrapper { width:780px; overflow:visible; } -div.slide { +.slide { width:370px; float:left; margin:0 20px 0 0; } -div.slide p { +.slide p { height:40px; } -div.slide img { +.slide img { height: 208px; } </style> @@ -140,8 +140,8 @@ app.</p> <div class="slide"> <h2>Location-based Query</h2> -<p>Ask things like, "Are there any picnic tables free at the park?" and get answers from -people who are there.</p> +<p>Ask questions like, "Are there any picnic tables free at the park?" and get answers in real-time +from people in the area.</p> <img src="{@docRoot}design/media/wear/ContextualExample.015.png" alt="" srcset="{@docRoot}design/media/wear/ContextualExample.015.png 1x, {@docRoot}design/media/wear/ContextualExample.015_2x.png 2x" /> @@ -149,4 +149,6 @@ people who are there.</p> -</div>
\ No newline at end of file +</div> + +<p style="clear:both;height:0"> </p>
\ No newline at end of file diff --git a/docs/html/design/wear/creative-vision.jd b/docs/html/design/wear/creative-vision.jd index 09552409b3d9..36a87eb33028 100644 --- a/docs/html/design/wear/creative-vision.jd +++ b/docs/html/design/wear/creative-vision.jd @@ -25,34 +25,29 @@ Wear experiences are:</p> <div class="page-vision"> - <img src="{@docRoot}design/media/wear/vision_traffic.png" width="147" height="147" /> - <h2 id="Launched">Launched automatically</h2> + <img src="{@docRoot}design/media/wear/vision_traffic.png" width="147" height="147" /> <p>Most people are used to launching apps by clicking an icon. Android Wear is different. Wearable apps are aware of the user’s context - time, location, physical activity, and so on. The apps use this information to insert cards into the stream when they become relevant. This makes Android Wear timely, relevant and very specific.</p> </div> <div class="page-vision"> - <img src="{@docRoot}design/media/wear/vision_navigation.png" width="147" height="147" /> - <h2 id="Glanceable">Glanceable</h2> + <img src="{@docRoot}design/media/wear/vision_navigation.png" width="147" height="147" /> <p>A classic wrist watch is designed to let you see the time in a split second and get on with what you were doing. Designing for Android Wear is no different. The less time it takes to use your software, the more time the user can be present in whatever they are doing. Android wear is fast, sharp, and immediate.</p> </div> <div class="page-vision"> - <img src="{@docRoot}design/media/wear/vision_voice.png" width="147" height="147" style="border: 1px solid #ddd;" /> - <h2 id="SuggestDemand">All about suggest and demand</h2> + <img src="{@docRoot}design/media/wear/vision_voice.png" width="147" height="147" style="border: 1px solid #ddd;" /> <p>Android Wear is like a great personal assistant: it knows you and your preferences, it only interrupts you when absolutely necessary, and it’s always on hand to provide a ready answer. Android Wear is helpful, respectful, and responsive.</p> </div> <div class="page-vision"> - <img src="{@docRoot}design/media/wear/vision_music.png" width="147" height="147" /> - <h2 id="Interaction">Zero or low interaction</h2> + <img src="{@docRoot}design/media/wear/vision_music.png" width="147" height="147" /> <p>Staying true to the strengths afforded by a smaller form factor, Android Wear focuses on simple interactions, only requiring input by the user when absolutely necessary. Most inputs are based around touch swipes or voice, and inputs requiring fine-grained finger movements are avoided. Android Wear is gestural, simple, and fast.</p> </div> <p>By providing a smart connection to the rest of the world while respecting the user’s attention, Android Wear feels personal and global, simple and smart, unobtrusive and ever-ready. Applications that represent these principles will feel most at home in the overall Android Wear experience.</p> <p>Third party apps extend Android Wear to be more specialized and helpful throughout the day. Installing apps are a way for the user to tell the Android Wear how to do that.</p> - diff --git a/docs/html/design/wear/patterns.jd b/docs/html/design/wear/patterns.jd index e56ac2db8a72..0436cf594402 100644 --- a/docs/html/design/wear/patterns.jd +++ b/docs/html/design/wear/patterns.jd @@ -46,11 +46,9 @@ page.title=UI Patterns for Android Wear <h2 id="Dismissing" style="clear:both">Dismissing cards</h2> - <img src="{@docRoot}design/media/wear/dismiss_cards.png" height="147"> - <p>Swiping from left to right on a card causes it to be dismissed from the stream. Dismissed cards may return when they next have relevant information. State is synced between the Android Wear context stream and the notifications on the Android handheld device, so dismissing from one causes an automatic dismissal from the other.</p> - +<img src="{@docRoot}design/media/wear/dismiss_cards.png" height="147"> <h2 id="Actions" style="clear:both">Action buttons</h2> @@ -162,12 +160,11 @@ to check-in to.</p> <h2 id="Selection" style="clear:both">Selection List</h2> - <img src="{@docRoot}design/media/wear/selection_list.png" width="147" height="147" style="float:right;margin:0 0 20px 40px;border:1px solid #ddd"> + <img src="{@docRoot}design/media/wear/selection_list.png" width="147" height="147" style="float:left;margin:0 0 20px 40px;border:1px solid #ddd"> <p>Choosing an item from a list is a common interaction. The Selection List pattern (available as the <a href="{@docRoot}training/wearables/apps/layouts.html#UiLibrary"><code>WearableListView</code></a> component) creates a simple list optimized for ease of use on a small screen where the focused item snaps to the center of the screen and a single tap selects. This widget is recommended as a common pattern for selecting items. It is used throughout the system UI, including in the list that can be accessed by swiping up on the cue card.</p> - <p>Of course, it is possible for Android Wear apps to extend themselves beyond the familiarities of these patterns. For a deeper look at the options available, see the <a href="{@docRoot}design/wear/structure.html">App Structure</a> guide.</p> <a class="notice-developers left" href="{@docRoot}training/wearables/ui/lists.html"> @@ -176,3 +173,5 @@ href="{@docRoot}training/wearables/apps/layouts.html#UiLibrary"><code>WearableLi <p>Creating Lists</p> </div> </a> + +<p style="clear:both;height:0"> </p> diff --git a/docs/html/design/wear/style.jd b/docs/html/design/wear/style.jd index bb559fe9246a..75bd65f76317 100644 --- a/docs/html/design/wear/style.jd +++ b/docs/html/design/wear/style.jd @@ -48,19 +48,18 @@ href="{@docRoot}training/wearables/apps/layouts.html#UiLibrary"><code>WatchViewS </div> - - <img src="{@docRoot}design/media/wear/low_info_card.png" width="147" height="147" - style="float:right;margin:29px 0 20px 40px"> - <h2 id="InfoDensity" style="margin-top:0" >Low Information Density</h2> +<img src="{@docRoot}design/media/wear/low_info_card.png" width="147" height="147" +style="float:left;margin:5px 20px 20px 0"> + <p>Cards should be designed to be glanceable in a split second, just like reading the time on a traditional watch. In most cases a pairing of an icon and value, or a title and short caption should be enough to convey a meaningful message. Note that the background photo should also be used to convey information; backgrounds that change to reflect and support the primary message in the card work great. For example, in the case illustrated to the right, a suitable background image is chosen to reflect the severity of current traffic conditions. This is not just a nice piece of attention to detail; the background actually reinforces the message and makes the content more glanceable.</p> -<img src="{@docRoot}design/media/wear/separate_info_cards.jpg" height="147" - style="float:right;margin:29px 0 20px 40px"> <h2 id="Chunks">Separate Information into Chunks</h2> +<img src="{@docRoot}design/media/wear/separate_info_cards.jpg" height="147" + style="float:right;margin:5px 0 20px 20px"> <p>In cases where additional information is absolutely necessary, don’t crowd out a card layout to the point where glanceability is affected. Instead, add an additional <a href="{@docRoot}design/wear/patterns.html#Pages">page</a> (or multiple pages, if needed) to the right of the main card in the stream to which the user can swipe for more information. See also <a href="{@docRoot}design/wear/patterns.html#Continuing">Continuing activities on phone</a>.</p> @@ -73,21 +72,19 @@ href="{@docRoot}design/wear/patterns.html#Continuing">Continuing activities on p -<img src="{@docRoot}design/media/wear/clear_bold_type.jpg" height="147" - style="float:left;margin:19px 40px 20px 0"> - <h2 id="Typography" >Use Clear, Bold Typography</h2> +<img src="{@docRoot}design/media/wear/clear_bold_type.jpg" height="147" + style="float:left;margin:5px 20px 20px 0"> <p>The system font is Roboto Condensed, with Regular and Light variants. Text should adhere to the size and color recommendations (see the UI Toolkit in the <a href="{@docRoot}design/downloads/index.html#Wear">Downloads</a> page). In general, text should be displayed as large as possible. Your goal should be to convey maximum information with minimum fuss.</p> <h2 id="Branding" style="clear:both" >Use Consistent Branding and Color</h2> -<p>The app icon is used to identify and brand your application. The icon is optional but when present always appears in the same location, overhanging the top right edge of the card. Note that app icons or branding should not be displayed in the background photo, which is reserved to display an image relevant to the information on the card.</p> - - <img src="{@docRoot}design/media/wear/copywrite.png" height="147" - style="float:left;margin:19px 40px 20px 0"> + style="float:right;margin:0 20px 0 20px"> + +<p style="margin-bottom: 60px">The app icon is used to identify and brand your application. The icon is optional but when present always appears in the same location, overhanging the top right edge of the card. Note that app icons or branding should not be displayed in the background photo, which is reserved to display an image relevant to the information on the card.</p> <h2 id="Copywrite" >Copywrite Sparingly</h2> @@ -98,18 +95,11 @@ href="{@docRoot}design/wear/patterns.html#Continuing">Continuing activities on p <p>Wearables are personal devices by nature, but they are not completely private. If your notification serves content that may be particularly sensitive or embarrassing (such as notifications from a dating app or a medical status report), consider not displaying all of the information in a peek card. A notification could place the sensitive information on a second page that must be swiped to, or an application could show different amounts of detail in peek and focused card positions.</p> - - <img src="{@docRoot}design/media/wear/confirmation.png" height="147" - style="float:left;margin:29px 40px 20px 0"> - - <h2 id="ConfirmAnim">Confirmation Animations</h2> -<p>If your app allows the user to perform an action, it is necessary to provide positive feedback. Show a generic confirmation animation or create your own. A confirmation animation is an opportunity to express your app’s character and insert a moment of delight for your user. Keep animations short (less than 1000ms) and simple. Animating the confirmation icon is an effective way of transitioning the user to a new state after completing an action.</p> - - - - - +<img src="{@docRoot}design/media/wear/confirmation.png" height="147" + style="float:left;margin:5px 20px 20px 0"> +<p>If your app allows the user to perform an action, it is necessary to provide positive feedback. Show a generic confirmation animation or create your own. A confirmation animation is an opportunity to express your app’s character and insert a moment of delight for your user. Keep animations short (less than 1000ms) and simple. Animating the confirmation icon is an effective way of transitioning the user to a new state after completing an action.</p> +<p style="clear:both;height:0"> </p>
\ No newline at end of file diff --git a/docs/html/design/wear/watchfaces.jd b/docs/html/design/wear/watchfaces.jd index 2def05bfa01c..e01852346b03 100644 --- a/docs/html/design/wear/watchfaces.jd +++ b/docs/html/design/wear/watchfaces.jd @@ -4,7 +4,7 @@ page.title=Watch Faces for Android Wear <!-- developer docs box --> <a class="notice-developers right" href="{@docRoot}training/wearables/watch-faces/index.html" - style="clear:left;margin-bottom:90px"> + style="clear:left"> <div> <h3>Developer Docs</h3> <p>Creating Watch Faces</p> @@ -22,7 +22,7 @@ ambient modes, and consider how system user interface elements will interact wit <p>Follow the guidelines in this page to design your custom watch faces.</p> <!-- H2 creative vision --> -<div style="float:right;margin-top:-100px;margin-bottom:20px;margin-left:20px"> +<div style="float:right;margin-bottom:20px;margin-left:20px"> <img src="{@docRoot}design/media/wear/Render_Next.png" width="200" height="195" alt="" style="margin-right:5px"/><br/> <img src="{@docRoot}design/media/wear/Render_Interactive.png" @@ -137,44 +137,39 @@ You can configure your watch face to display different ambient designs depending of screen available on the device. Consider the best design for your watch faces on all screens.</p> -<div class="cols" style="margin-top:20px"> -<div class="col-9"> - <h3>Reduced color space</h3> - <p>Some displays use a reduced color space in ambient mode to save power.</p> - <p>One reduced color space power saving method is to use a "low-bit" mode. In low-bit mode, - the available colors are limited to black, white, blue, red, magenta, green, cyan, and yellow. - When designing for low-bit ambient mode, use a black or a white background. For OLED screens, - you must use a black background. Non-background pixels must be less than 10 percent of total - pixels. You can use low-bit color for up to 5 percent of pixels on screens that support it. - You should also disable antialiasing in your paint styles for this mode. Make sure to test - your design on devices with low-bit ambient mode.</p> - <p>Other displays save power in ambient mode by not producing any color. When designing for - displays which do not use color in ambient mode, the background may be either black or - white.</p> -</div> -<div class="col-4"> +<div style="float:right;margin-bottom:20px;margin-left:20px"> <img src="{@docRoot}design/media/wear/Render_LowBit.png" width="200" height="" alt="" style="margin-top:45px;margin-left:13px"> </div> -</div> +<h3>Reduced color space</h3> -<div class="cols" style="margin-top:20px"> -<div class="col-9"> - <h3>Burn protection techniques</h3> - <p>When designing for OLED screens, you should consider power efficiency and the screen - burn-in effect. When these screens are in ambient mode, the system shifts the contents of - the screen periodically by a few pixels to avoid pixel burn-in. Do not use large blocks of - pixels in your ambient mode designs and keep 95% of the pixels black. Replace solid shapes in - your regular ambient mode designs with outlined shapes in burn-protected ambient mode. Also - replace filled images with pixel patterns. For analog watch face designs, hollow out the center - where the hands meet to avoid pixel burn-in in this mode.</p> -</div> -<div class="col-4"> +<p>Some displays use a reduced color space in ambient mode to save power.</p> +<p>One reduced color space power saving method is to use a "low-bit" mode. In low-bit mode, +the available colors are limited to black, white, blue, red, magenta, green, cyan, and yellow. +When designing for low-bit ambient mode, use a black or a white background. For OLED screens, +you must use a black background. Non-background pixels must be less than 10 percent of total +pixels. You can use low-bit color for up to 5 percent of pixels on screens that support it. +You should also disable antialiasing in your paint styles for this mode. Make sure to test +your design on devices with low-bit ambient mode.</p> +<p>Other displays save power in ambient mode by not producing any color. When designing for +displays which do not use color in ambient mode, the background may be either black or +white.</p> + + +<h3>Burn protection techniques</h3> + +<div style="float:right;margin-bottom:20px;margin-left:20px"> <img src="{@docRoot}design/media/wear/Render_1Bit.png" width="200" height="" alt="" style="margin-top:-10px;margin-left:13px"> </div> -</div> +<p>When designing for OLED screens, you should consider power efficiency and the screen +burn-in effect. When these screens are in ambient mode, the system shifts the contents of +the screen periodically by a few pixels to avoid pixel burn-in. Do not use large blocks of +pixels in your ambient mode designs and keep 95% of the pixels black. Replace solid shapes in +your regular ambient mode designs with outlined shapes in burn-protected ambient mode. Also +replace filled images with pixel patterns. For analog watch face designs, hollow out the center +where the hands meet to avoid pixel burn-in in this mode.</p> <h2 id="SystemUI">Accomodate System UI Elements</h2> @@ -183,9 +178,11 @@ screens.</p> user the status of the wearable and show notifications from services on the user's phone. Try to keep critical elements in your watch face designs from being obscured by the UI elements.</p> -<div class="cols" style="margin-top:20px"> -<div class="col-9"> - <h3>Cards</h3> +<div style="float:right;margin-bottom:20px;margin-left:20px"> + <img src="{@docRoot}design/media/wear/CardsRender_Build.png" width="200" + height="" alt="" style="margin-top:20px;margin-left:13px"> +</div> +<h3>Cards</h3> <p>Cards are the notification system that bridges information between the wearable and a mobile device. Cards are also how most applications communicate with users. The user will be notified on the wearable about items such as emails and messages. As a watch face developer, @@ -201,16 +198,13 @@ variable peek card is that it displays more notification information. Faces with the bottom half of the face should leverage the small peek card instead.</p> <p>The system notifies your watch face when the bounds of a peek card change, so you can rearrange the elements in your design if necessary.</p> -</div> -<div class="col-4"> - <img src="{@docRoot}design/media/wear/CardsRender_Build.png" width="200" - height="" alt="" style="margin-top:20px;margin-left:13px"> -</div> -</div> -<div class="cols" style="margin-top:20px"> -<div class="col-9"> - <h3>Indicators</h3> + +<div style="float:right;margin-bottom:20px;margin-left:20px"> + <img src="{@docRoot}design/media/wear/Indicators_Cropped.png" width="200" + height="" alt="" style="margin-top:0px;margin-left:13px"> +</div> +<h3>Indicators</h3> <p>Indicators tell the user the status of the wearable, such as charging and airplane mode. When designing a watch face, consider how the indicator will fall over the watch face.</p> <p>The indicators can be placed in several fixed locations on the wearable. If you have a @@ -218,16 +212,12 @@ large peek card, the indicators should go on the top or on the center of the scr position the status icons or the hotword on the bottom of the screen, the system forces small peek cards. If the edge of the watch face contains strong visual elements, such as ticks or numbers, place the indicators on the center of the screen.</p> -</div> -<div class="col-4"> - <img src="{@docRoot}design/media/wear/Indicators_Cropped.png" width="200" + +<div style="float:right;margin-bottom:20px;margin-left:20px"> + <img src="{@docRoot}design/media/wear/Hotword_Cropped.png" width="200" height="" alt="" style="margin-top:0px;margin-left:13px"> </div> -</div> - -<div class="cols" style="margin-top:20px"> -<div class="col-9"> - <h3>The hotword</h3> +<h3>The hotword</h3> <p>The hotword is the phrase "OK Google", which tells the user that they can interact with the watch using voice commands. When a user turns on the wearable, the hotword appears on the screen for a few seconds.</p> @@ -236,12 +226,6 @@ this element is not as critical. You should still avoid covering up elements of watch face. Finally, background protection for the hotword and the indicators should be turned on unless your design is tailored to have these elements appear on top of them, for example using dark solid colors with no patterns.</p> -</div> -<div class="col-4"> - <img src="{@docRoot}design/media/wear/Hotword_Cropped.png" width="200" - height="" alt="" style="margin-top:0px;margin-left:13px"> -</div> -</div> <p>For more information about measurements and positioning of system UI elements, see <a href="#SpecsAssets">Specifications and Assets</a>.</p> @@ -253,24 +237,27 @@ using dark solid colors with no patterns.</p> <p>Your watch face can show users contextually relevant data and react to it by changing styles and colors in your design.</p> -<div class="cols" style="margin-top:20px"> -<div class="col-9"> - <h3>What do you want your user to know?</h3> +<h3>What do you want your user to know?</h3> + +<div style="float:right;margin-bottom:20px;margin-left:20px"> + <img src="{@docRoot}design/media/wear/Render_Saturn.png" width="200" + height="" alt="" style="margin-top:-10px;margin-left:13px"> +</div> + <p>The first step in designing a data-integrated watch face is to define a conceptual user outcome based on available data. First, generate a strong concept or outcome you believe is supported by real user needs. What do you want your users to know after they have glanced at your design? Once you have identified your outcome, you need to determine how to obtain the required data.</p> -</div> -<div class="col-4"> - <img src="{@docRoot}design/media/wear/Render_Saturn.png" width="200" + +<div style="clear:both;"/> + +<div style="float:right;margin-bottom:20px;margin-left:20px"> + <img src="{@docRoot}design/media/wear/Render_Episode.png" width="200" height="" alt="" style="margin-top:-10px;margin-left:13px"> </div> -</div> -<div class="cols" style="margin-top:20px"> -<div class="col-9"> - <h3>A watch dial is a timeline; add data to it</h3> +<h3>A watch dial is a timeline; add data to it</h3> <p>Your watch face concept may include use of data beyond time, such as weather, calendar and fitness data. Consider the inclusion of data integration creatively. Avoid simply overlaying a time-based watch face with extra data. Rather, think about how the data can @@ -278,16 +265,13 @@ be expressed through the lens of time. For example, instead of designing a weath watch face as a clock with an indication of the current temperature in degrees overlayed, you might design a watch face that describes how the temperature will change over the course of the day.</p> -</div> -<div class="col-4"> - <img src="{@docRoot}design/media/wear/Render_Episode.png" width="200" + +<div style="float:right;margin-bottom:20px;margin-left:20px"> + <img src="{@docRoot}design/media/wear/Render_Albumem.png" width="200" height="" alt="" style="margin-top:-10px;margin-left:13px"> </div> -</div> -<div class="cols" style="margin-top:20px"> -<div class="col-9"> - <h3>Stick to one message</h3> +<h3>Stick to one message</h3> <p>Once you have solidified your conceptual direction or desired outcome, you will need to begin visualizing your watch face. The strongest watch face designs are highly glanceable and deliver a singular expression of data. In order to identify your singular message, you @@ -295,12 +279,6 @@ must identify the most important supporting data point. For instance, instead of an entire month of calendar events, you might decide to display only the next upcoming event. By a process of reduction, you should arrive at a powerful singular expression of data to include in your design.</p> -</div> -<div class="col-4"> - <img src="{@docRoot}design/media/wear/Render_Albumem.png" width="200" - height="" alt="" style="margin-top:-10px;margin-left:13px"> -</div> -</div> <h3>Begin with some insight and test as you go</h3> <p>Make sure your approach begins with insight into the needs and expectations of your users. diff --git a/docs/html/guide/topics/graphics/hardware-accel.jd b/docs/html/guide/topics/graphics/hardware-accel.jd index 3d1935af5215..e3f1d9e7769f 100644 --- a/docs/html/guide/topics/graphics/hardware-accel.jd +++ b/docs/html/guide/topics/graphics/hardware-accel.jd @@ -284,7 +284,7 @@ changed.</li> </tr> <tr> <td class="label_neg">drawPicture()</td> - <td class="value_neg">✗</td> + <td class="value_neg">23</td> </tr> <tr> <td class="label_pos">drawPosText()</td> diff --git a/docs/html/guide/topics/ui/controls/text.jd b/docs/html/guide/topics/ui/controls/text.jd index 9474dee8e148..c11dc3298727 100644 --- a/docs/html/guide/topics/ui/controls/text.jd +++ b/docs/html/guide/topics/ui/controls/text.jd @@ -172,7 +172,7 @@ android:imeOptions}</a> attribute. For example, here's how you can specify the S are any subsequent <a href="{@docRoot}reference/android/view/View.html#attr_android:focusable">{@code android:focusable}</a> fields. If any focusable fields are found following this one, the system -applies the (@code actionNext} action to the current {@link android.widget.EditText} so the user can +applies the {@code "actionNext"} action to the current {@link android.widget.EditText} so the user can select Next to move to the next field. If there's no subsequent focusable field, the system applies the {@code "actionDone"} action. You can override this by setting the <a href="{@docRoot}reference/android/widget/TextView.html#attr_android:imeOptions">{@code @@ -263,7 +263,7 @@ disabled with {@code android:imeOptions="flagNoExtractUi"}.</p> <p>If you want to provide suggestions to users as they type, you can use a subclass of {@link android.widget.EditText} called {@link android.widget.AutoCompleteTextView}. To implement -auto-complete, you must specify an (@link android.widget.Adapter) that provides the text +auto-complete, you must specify an {@link android.widget.Adapter} that provides the text suggestions. There are several kinds of adapters available, depending on where the data is coming from, such as from a database or an array.</p> diff --git a/docs/html/sdk/index.jd b/docs/html/sdk/index.jd index 9a8345067c5d..7b1169f8e34b 100644 --- a/docs/html/sdk/index.jd +++ b/docs/html/sdk/index.jd @@ -30,21 +30,22 @@ studio.win_notools_exe_checksum=ae09797db2537afb572a00b7eacc292bb66d539e -sdk.linux_download=android-sdk_r24.3.2-linux.tgz -sdk.linux_bytes=309138263 -sdk.linux_checksum=4a10e62c5d88fd6c2a69db12348cbe168228b98f +sdk.linux_download=android-sdk_r24.3.3-linux.tgz +sdk.linux_bytes=309109716 +sdk.linux_checksum=cd4cab76c2e3d926b3495c26ec56c831ba77d0d0 -sdk.mac_download=android-sdk_r24.3.2-macosx.zip -sdk.mac_bytes=98329772 -sdk.mac_checksum=8609b92e26e9bd5796f771138c6b222b6c0cb474 +sdk.mac_download=android-sdk_r24.3.3-macosx.zip +sdk.mac_bytes=98330824 +sdk.mac_checksum=41f0f3e76d6868018740e654aefb04fd765c357d -sdk.win_download=android-sdk_r24.3.2-windows.zip -sdk.win_bytes=187488291 -sdk.win_checksum=bcfe3c41ea7e33a29ad6f358adbdf977008be80a +sdk.win_download=android-sdk_r24.3.3-windows.zip +sdk.win_bytes=187480692 +sdk.win_checksum=b6a4899efbf20fc593042f1515446c6630ba502e -sdk.win_installer=installer_r24.3.2-windows.exe -sdk.win_installer_bytes=139471724 -sdk.win_installer_checksum=8f9d0ae9fdb37973ed62d6e93975ff375beb5542 + +sdk.win_installer=installer_r24.3.3-windows.exe +sdk.win_installer_bytes=139463749 +sdk.win_installer_checksum=bbdae40a7665e55b3cdb1fbae865986e6cd3df14 diff --git a/docs/html/tools/building/building-cmdline.jd b/docs/html/tools/building/building-cmdline.jd index 0e4c8b2631e1..bf3e873cb8bc 100644 --- a/docs/html/tools/building/building-cmdline.jd +++ b/docs/html/tools/building/building-cmdline.jd @@ -353,13 +353,6 @@ adb -d install <em>path/to/your/app</em>.apk to publish your application, you <strong>must</strong> sign the application with your own private key, rather than the debug key generated by the SDK tools.</p> - <p>Android Studio helps you get started quickly by signing your .apk files with a debug key, - prior to installing them on an emulator or development device. This means that you can quickly - run your application from Android Studio without having to generate your own private key. No - specific action on your part is needed, provided ADT has access to Keytool. However, please note - that if you intend to publish your application, you <strong>must</strong> sign the application - with your own private key, rather than the debug key generated by the SDK tools.</p> - <p>Please read <a href="{@docRoot}tools/publishing/app-signing.html">Signing Your Applications</a>, which provides a thorough guide to application signing on Android and what it means to you as an Android application developer. The document also includes a guide to publishing diff --git a/docs/html/tools/sdk/tools-notes.jd b/docs/html/tools/sdk/tools-notes.jd index 326fbe29fe6a..934b262b67a6 100644 --- a/docs/html/tools/sdk/tools-notes.jd +++ b/docs/html/tools/sdk/tools-notes.jd @@ -25,6 +25,36 @@ href="http://tools.android.com/knownissues">http://tools.android.com/knownissues <div class="toggle-content opened"> <p><a href="#" onclick="return toggleContent(this)"> <img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img" + alt=""/>SDK Tools, Revision 24.3.3</a> <em>(June 2015)</em> + </p> + + <div class="toggle-content-toggleme"> + + <dl> + <dt>Dependencies:</dt> + + <dd> + <ul> + <li>Android SDK Platform-tools revision 19 or later.</li> + </ul> + </dd> + + <dt>General Notes:</dt> + <dd> + <ul> + <li>Fixed issues with using Ant build tasks with the Eclipse ADT build structure. </li> + <li>Fixed the emulator boot problem on Mac OS X 10.8.5.</li> + </ul> + </dd> + </div> +</div> + + + + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" alt=""/>SDK Tools, Revision 24.3.2</a> <em>(June 2015)</em> </p> diff --git a/docs/html/training/tv/discovery/recommendations.jd b/docs/html/training/tv/discovery/recommendations.jd index a74ee5683699..ffe33f28bb00 100644 --- a/docs/html/training/tv/discovery/recommendations.jd +++ b/docs/html/training/tv/discovery/recommendations.jd @@ -10,6 +10,7 @@ trainingnavtop=true <div id="tb"> <h2>This lesson teaches you to</h2> <ol> + <li><a href="#best-practices">Best Practices for Recommendations</a></li> <li><a href="#service">Create a Recommendations Service</a></li> <li><a href="#build">Build Recommendations</a></li> <li><a href="#run-service">Run Recommendations Service</a></li> @@ -47,6 +48,46 @@ trainingnavtop=true Leanback sample app</a>. </p> +<h2 id="best-practices">Best Practices for Recommendations</h2> + +<p>Recommendations help users quickly find the content and apps they enjoy. Creating +recommendations that are high-quality and relevant to users is an important factor in creating a +great user experience with your TV app. For this reason, you should carefully consider what +recommendations you present to the user and manage them closely.</p> + +<h3 id="types">Types of Recommendations</h3> + +<p>When you create recommendations, you should link users back to incomplete viewing activities or +suggest activities that extend that to related content. Here are some specific type of +recommendations you should consider:</p> + +<ul> +<li><strong>Continuation content</strong> recommendations for the next episode for users to resume +watching a series.</li> +<li><strong>New content</strong> recommendations, such as for a new first-run episode, if the user +finished watching another series. +<li><strong>Related content</strong> recommendations based on the users historic viewing behavior. +</ul> + +<p>For more information on how to design recommendation cards for the best user experience, see +<a href="https://www.google.com/design/spec-tv/system-overview/recommendation-row.html#recommendation-row-types-of-recommendations" +class="external-link">Recommendation Row</a> in the Android TV Design Spec.</p> + +<h3 id="refreshing">Refreshing Recommendations</h3> + +<p>When refreshing recommendations, don't just remove and repost them, because doing so causes +the recommendations to appear at the end of the recommendations row. Once a content item, such as a +movie, has been played, <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Removing"> +remove it</a> from the recommendations.</p> + +<h3 id="customization">Customizing Recommendations</h3> + +<p>You can customize recommendation cards to convey branding information, by setting user interface +elements such as the card's foreground and background image, color, app icon, title, and subtitle. +To learn more, see +<a href="https://www.google.com/design/spec-tv/system-overview/recommendation-row.html#recommendation-row-card-customization" +class="external-link">Recommendation Row</a> in the Android TV Design Spec.</p> + <h2 id="service">Create a Recommendations Service</h2> @@ -116,8 +157,8 @@ public class UpdateRecommendationsService extends IntentService { TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(DetailsActivity.class); stackBuilder.addNextIntent(detailsIntent); - // Ensure a unique PendingIntents, otherwise all recommendations end up with the same - // PendingIntent + // Ensure a unique PendingIntents, otherwise all + // recommendations end up with the same PendingIntent detailsIntent.setAction(Long.toString(movie.getId())); PendingIntent intent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); @@ -143,19 +184,6 @@ public class UpdateRecommendationsService extends IntentService { </manifest> </pre> -<h3 id="refreshing">Refreshing Recommendations</h3> - -<p>Base your recommendations on user behavior and data such as play lists, wish lists, and associated -content. When refreshing recommendations, don't just remove and repost them, because doing so causes -the recommendations to appear at the end of the recommendations row. Once a content item, such as a -movie, has been played, <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Removing"> -remove it</a> from the recommendations.</p> - -<p>The order of an app's recommendations is preserved according to the order in which the app -provides them. The framework interleaves app recommendations based on recommendation quality, -as measured by user behavior. Better recommendations make an app's recommendations more likely -to appear near the front of the list.</p> - <h2 id="build">Build Recommendations</h2> <p> diff --git a/graphics/java/android/graphics/Picture.java b/graphics/java/android/graphics/Picture.java index 39272b92fc11..0e55089b795a 100644 --- a/graphics/java/android/graphics/Picture.java +++ b/graphics/java/android/graphics/Picture.java @@ -135,8 +135,8 @@ public class Picture { * properly and are highly discouraged. * * <p> - * <strong>Note:</strong> a picture created from an input stream cannot be - * replayed on a hardware accelerated canvas. + * <strong>Note:</strong> Prior to API level 23 a picture created from an + * input stream cannot be replayed on a hardware accelerated canvas. * * @see #writeToStream(java.io.OutputStream) * @deprecated The recommended alternative is to not use writeToStream and @@ -155,8 +155,8 @@ public class Picture { * there is no guarantee that the Picture can be successfully reconstructed. * * <p> - * <strong>Note:</strong> a picture created from an input stream cannot be - * replayed on a hardware accelerated canvas. + * <strong>Note:</strong> Prior to API level 23 a picture created from an + * input stream cannot be replayed on a hardware accelerated canvas. * * @see #createFromStream(java.io.InputStream) * @deprecated The recommended alternative is to draw the picture into a diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java index 6090cf0b8add..5e62aeac6054 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -433,7 +433,7 @@ public abstract class Drawable { /** * Set the layout direction for this drawable. Should be a resolved - * layout direction, as the Drawable as no capacity to do the resolution on + * layout direction, as the Drawable has no capacity to do the resolution on * its own. * * @param layoutDirection the resolved layout direction for the drawable, diff --git a/graphics/java/android/graphics/drawable/Icon.java b/graphics/java/android/graphics/drawable/Icon.java index 7b4329a519b7..85db6a1e006e 100644 --- a/graphics/java/android/graphics/drawable/Icon.java +++ b/graphics/java/android/graphics/drawable/Icon.java @@ -29,6 +29,7 @@ import android.os.Handler; import android.os.Message; import android.os.Parcel; import android.os.Parcelable; +import android.text.TextUtils; import android.util.Log; import java.io.DataInputStream; @@ -258,16 +259,21 @@ public final class Icon implements Parcelable { return new BitmapDrawable(context.getResources(), getBitmap()); case TYPE_RESOURCE: if (getResources() == null) { - if (getResPackage() == null || "android".equals(getResPackage())) { + // figure out where to load resources from + String resPackage = getResPackage(); + if (TextUtils.isEmpty(resPackage)) { + // if none is specified, try the given context + resPackage = context.getPackageName(); + } + if ("android".equals(resPackage)) { mObj1 = Resources.getSystem(); } else { final PackageManager pm = context.getPackageManager(); try { - mObj1 = pm.getResourcesForApplication(getResPackage()); + mObj1 = pm.getResourcesForApplication(resPackage); } catch (PackageManager.NameNotFoundException e) { - Log.e(TAG, String.format("Unable to find pkg=%s", - getResPackage()), - e); + Log.e(TAG, String.format("Unable to find pkg=%s for icon %s", + resPackage, this), e); break; } } @@ -320,12 +326,15 @@ public final class Icon implements Parcelable { */ public Drawable loadDrawableAsUser(Context context, int userId) { if (mType == TYPE_RESOURCE) { - if (getResources() == null - && getResPackage() != null - && !(getResPackage().equals("android"))) { + String resPackage = getResPackage(); + if (TextUtils.isEmpty(resPackage)) { + resPackage = context.getPackageName(); + } + if (getResources() == null && !(getResPackage().equals("android"))) { final PackageManager pm = context.getPackageManager(); try { - mObj1 = pm.getResourcesForApplicationAsUser(getResPackage(), userId); + // assign getResources() as the correct user + mObj1 = pm.getResourcesForApplicationAsUser(resPackage, userId); } catch (PackageManager.NameNotFoundException e) { Log.e(TAG, String.format("Unable to find pkg=%s user=%d", getResPackage(), @@ -410,6 +419,9 @@ public final class Icon implements Parcelable { * @param resId ID of the drawable resource */ public static Icon createWithResource(Context context, @DrawableRes int resId) { + if (context == null) { + throw new IllegalArgumentException("Context must not be null."); + } final Icon rep = new Icon(TYPE_RESOURCE); rep.mInt1 = resId; rep.mString1 = context.getPackageName(); diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java index 134451b41890..636983375f8f 100644 --- a/graphics/java/android/graphics/drawable/RippleDrawable.java +++ b/graphics/java/android/graphics/drawable/RippleDrawable.java @@ -423,6 +423,7 @@ public class RippleDrawable extends LayerDrawable { if (super.setDrawableByLayerId(id, drawable)) { if (id == R.id.mask) { mMask = drawable; + mHasValidMask = false; } return true; diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreBCWorkaroundProvider.java b/keystore/java/android/security/keystore/AndroidKeyStoreBCWorkaroundProvider.java index 06b76fa487a7..156f45f6db99 100644 --- a/keystore/java/android/security/keystore/AndroidKeyStoreBCWorkaroundProvider.java +++ b/keystore/java/android/security/keystore/AndroidKeyStoreBCWorkaroundProvider.java @@ -132,52 +132,52 @@ class AndroidKeyStoreBCWorkaroundProvider extends Provider { putSignatureImpl("MD5withRSA", PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$MD5WithPKCS1Padding"); - put("Alg.Alias.Signature.MD5WithRSAEncryption", "MD5WithRSA"); - put("Alg.Alias.Signature.MD5/RSA", "MD5WithRSA"); - put("Alg.Alias.Signature.1.2.840.113549.1.1.4", "MD5WithRSA"); - put("Alg.Alias.Signature.1.2.840.113549.2.5with1.2.840.113549.1.1.1", "MD5WithRSA"); + put("Alg.Alias.Signature.MD5WithRSAEncryption", "MD5withRSA"); + put("Alg.Alias.Signature.MD5/RSA", "MD5withRSA"); + put("Alg.Alias.Signature.1.2.840.113549.1.1.4", "MD5withRSA"); + put("Alg.Alias.Signature.1.2.840.113549.2.5with1.2.840.113549.1.1.1", "MD5withRSA"); putSignatureImpl("SHA1withRSA", PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$SHA1WithPKCS1Padding"); - put("Alg.Alias.Signature.SHA1WithRSAEncryption", "SHA1WithRSA"); - put("Alg.Alias.Signature.SHA1/RSA", "SHA1WithRSA"); - put("Alg.Alias.Signature.SHA-1/RSA", "SHA1WithRSA"); - put("Alg.Alias.Signature.1.2.840.113549.1.1.5", "SHA1WithRSA"); - put("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.113549.1.1.1", "SHA1WithRSA"); - put("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.113549.1.1.5", "SHA1WithRSA"); - put("Alg.Alias.Signature.1.3.14.3.2.29", "SHA1WithRSA"); + put("Alg.Alias.Signature.SHA1WithRSAEncryption", "SHA1withRSA"); + put("Alg.Alias.Signature.SHA1/RSA", "SHA1withRSA"); + put("Alg.Alias.Signature.SHA-1/RSA", "SHA1withRSA"); + put("Alg.Alias.Signature.1.2.840.113549.1.1.5", "SHA1withRSA"); + put("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.113549.1.1.1", "SHA1withRSA"); + put("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.113549.1.1.5", "SHA1withRSA"); + put("Alg.Alias.Signature.1.3.14.3.2.29", "SHA1withRSA"); putSignatureImpl("SHA224withRSA", PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$SHA224WithPKCS1Padding"); - put("Alg.Alias.Signature.SHA224WithRSAEncryption", "SHA224WithRSA"); - put("Alg.Alias.Signature.1.2.840.113549.1.1.11", "SHA224WithRSA"); + put("Alg.Alias.Signature.SHA224WithRSAEncryption", "SHA224withRSA"); + put("Alg.Alias.Signature.1.2.840.113549.1.1.11", "SHA224withRSA"); put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.4with1.2.840.113549.1.1.1", - "SHA224WithRSA"); + "SHA224withRSA"); put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.4with1.2.840.113549.1.1.11", - "SHA224WithRSA"); + "SHA224withRSA"); putSignatureImpl("SHA256withRSA", PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$SHA256WithPKCS1Padding"); - put("Alg.Alias.Signature.SHA256WithRSAEncryption", "SHA256WithRSA"); - put("Alg.Alias.Signature.1.2.840.113549.1.1.11", "SHA256WithRSA"); + put("Alg.Alias.Signature.SHA256WithRSAEncryption", "SHA256withRSA"); + put("Alg.Alias.Signature.1.2.840.113549.1.1.11", "SHA256withRSA"); put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.1with1.2.840.113549.1.1.1", - "SHA256WithRSA"); + "SHA256withRSA"); put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.1with1.2.840.113549.1.1.11", - "SHA256WithRSA"); + "SHA256withRSA"); putSignatureImpl("SHA384withRSA", PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$SHA384WithPKCS1Padding"); - put("Alg.Alias.Signature.SHA384WithRSAEncryption", "SHA384WithRSA"); - put("Alg.Alias.Signature.1.2.840.113549.1.1.12", "SHA384WithRSA"); + put("Alg.Alias.Signature.SHA384WithRSAEncryption", "SHA384withRSA"); + put("Alg.Alias.Signature.1.2.840.113549.1.1.12", "SHA384withRSA"); put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.2with1.2.840.113549.1.1.1", - "SHA384WithRSA"); + "SHA384withRSA"); putSignatureImpl("SHA512withRSA", PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$SHA512WithPKCS1Padding"); - put("Alg.Alias.Signature.SHA512WithRSAEncryption", "SHA512WithRSA"); - put("Alg.Alias.Signature.1.2.840.113549.1.1.13", "SHA512WithRSA"); + put("Alg.Alias.Signature.SHA512WithRSAEncryption", "SHA512withRSA"); + put("Alg.Alias.Signature.1.2.840.113549.1.1.13", "SHA512withRSA"); put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.3with1.2.840.113549.1.1.1", - "SHA512WithRSA"); + "SHA512withRSA"); putSignatureImpl("SHA1withRSA/PSS", PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$SHA1WithPSSPadding"); diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreCipherSpiBase.java b/keystore/java/android/security/keystore/AndroidKeyStoreCipherSpiBase.java index fc5345199a6c..83131ed2b0f1 100644 --- a/keystore/java/android/security/keystore/AndroidKeyStoreCipherSpiBase.java +++ b/keystore/java/android/security/keystore/AndroidKeyStoreCipherSpiBase.java @@ -446,7 +446,7 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor inputLen = input.length; src.get(input); } - super.engineUpdateAAD(input, inputOffset, inputLen); + engineUpdateAAD(input, inputOffset, inputLen); } @Override diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreKeyFactorySpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreKeyFactorySpi.java index 20db41b3f84e..250bad797406 100644 --- a/keystore/java/android/security/keystore/AndroidKeyStoreKeyFactorySpi.java +++ b/keystore/java/android/security/keystore/AndroidKeyStoreKeyFactorySpi.java @@ -24,9 +24,12 @@ import java.security.Key; import java.security.KeyFactorySpi; import java.security.PrivateKey; import java.security.PublicKey; +import java.security.spec.ECPublicKeySpec; import java.security.spec.InvalidKeySpecException; import java.security.spec.KeySpec; import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.RSAPublicKeySpec; +import java.security.spec.X509EncodedKeySpec; /** * {@link KeyFactorySpi} backed by Android KeyStore. @@ -40,32 +43,83 @@ public class AndroidKeyStoreKeyFactorySpi extends KeyFactorySpi { @Override protected <T extends KeySpec> T engineGetKeySpec(Key key, Class<T> keySpecClass) throws InvalidKeySpecException { - if (keySpecClass == null) { - throw new InvalidKeySpecException("keySpecClass == null"); - } - if (!(key instanceof AndroidKeyStorePrivateKey)) { - throw new InvalidKeySpecException("Only Android KeyStore private keys supported: " + - ((key != null) ? key.getClass().getName() : "null")); - } - if (PKCS8EncodedKeySpec.class.isAssignableFrom(keySpecClass)) { + if (key == null) { + throw new InvalidKeySpecException("key == null"); + } else if ((!(key instanceof AndroidKeyStorePrivateKey)) + && (!(key instanceof AndroidKeyStorePublicKey))) { throw new InvalidKeySpecException( - "Key material export of Android KeyStore keys is not supported"); - } - if (!KeyInfo.class.equals(keySpecClass)) { - throw new InvalidKeySpecException("Unsupported key spec: " + keySpecClass.getName()); + "Unsupported key type: " + key.getClass().getName() + + ". This KeyFactory supports only Android Keystore asymmetric keys"); } - String keyAliasInKeystore = ((AndroidKeyStoreKey) key).getAlias(); - String entryAlias; - if (keyAliasInKeystore.startsWith(Credentials.USER_PRIVATE_KEY)) { - entryAlias = keyAliasInKeystore.substring(Credentials.USER_PRIVATE_KEY.length()); + + // key is an Android Keystore private or public key + + if (keySpecClass == null) { + throw new InvalidKeySpecException("keySpecClass == null"); + } else if (KeyInfo.class.equals(keySpecClass)) { + if (!(key instanceof AndroidKeyStorePrivateKey)) { + throw new InvalidKeySpecException( + "Unsupported key type: " + key.getClass().getName() + + ". KeyInfo can be obtained only for Android Keystore private keys"); + } + String keyAliasInKeystore = ((AndroidKeyStorePrivateKey) key).getAlias(); + String entryAlias; + if (keyAliasInKeystore.startsWith(Credentials.USER_PRIVATE_KEY)) { + entryAlias = keyAliasInKeystore.substring(Credentials.USER_PRIVATE_KEY.length()); + } else { + throw new InvalidKeySpecException("Invalid key alias: " + keyAliasInKeystore); + } + @SuppressWarnings("unchecked") + T result = (T) AndroidKeyStoreSecretKeyFactorySpi.getKeyInfo( + mKeyStore, entryAlias, keyAliasInKeystore); + return result; + } else if (X509EncodedKeySpec.class.equals(keySpecClass)) { + if (!(key instanceof AndroidKeyStorePublicKey)) { + throw new InvalidKeySpecException( + "Unsupported key type: " + key.getClass().getName() + + ". X509EncodedKeySpec can be obtained only for Android Keystore public" + + " keys"); + } + @SuppressWarnings("unchecked") + T result = (T) new X509EncodedKeySpec(((AndroidKeyStorePublicKey) key).getEncoded()); + return result; + } else if (PKCS8EncodedKeySpec.class.equals(keySpecClass)) { + if (key instanceof AndroidKeyStorePrivateKey) { + throw new InvalidKeySpecException( + "Key material export of Android Keystore private keys is not supported"); + } else { + throw new InvalidKeySpecException( + "Cannot export key material of public key in PKCS#8 format." + + " Only X.509 format (X509EncodedKeySpec) supported for public keys."); + } + } else if (RSAPublicKeySpec.class.equals(keySpecClass)) { + if (key instanceof AndroidKeyStoreRSAPublicKey) { + AndroidKeyStoreRSAPublicKey rsaKey = (AndroidKeyStoreRSAPublicKey) key; + @SuppressWarnings("unchecked") + T result = + (T) new RSAPublicKeySpec(rsaKey.getModulus(), rsaKey.getPublicExponent()); + return result; + } else { + throw new InvalidKeySpecException( + "Obtaining RSAPublicKeySpec not supported for " + key.getAlgorithm() + " " + + ((key instanceof AndroidKeyStorePrivateKey) ? "private" : "public") + + " key"); + } + } else if (ECPublicKeySpec.class.equals(keySpecClass)) { + if (key instanceof AndroidKeyStoreECPublicKey) { + AndroidKeyStoreECPublicKey ecKey = (AndroidKeyStoreECPublicKey) key; + @SuppressWarnings("unchecked") + T result = (T) new ECPublicKeySpec(ecKey.getW(), ecKey.getParams()); + return result; + } else { + throw new InvalidKeySpecException( + "Obtaining RSAPublicKeySpec not supported for " + key.getAlgorithm() + " " + + ((key instanceof AndroidKeyStorePrivateKey) ? "private" : "public") + + " key"); + } } else { - throw new InvalidKeySpecException("Invalid key alias: " + keyAliasInKeystore); + throw new InvalidKeySpecException("Unsupported key spec: " + keySpecClass.getName()); } - - @SuppressWarnings("unchecked") - T result = (T) AndroidKeyStoreSecretKeyFactorySpi.getKeyInfo( - mKeyStore, entryAlias, keyAliasInKeystore); - return result; } @Override diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl index a3ea89653380..f3d755ce34e8 100644 --- a/location/java/android/location/ILocationManager.aidl +++ b/location/java/android/location/ILocationManager.aidl @@ -75,6 +75,7 @@ interface ILocationManager String getBestProvider(in Criteria criteria, boolean enabledOnly); boolean providerMeetsCriteria(String provider, in Criteria criteria); ProviderProperties getProviderProperties(String provider); + String getNetworkProviderPackage(); boolean isProviderEnabled(String provider); void addTestProvider(String name, in ProviderProperties properties, String opPackageName); diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 8e9621875f30..c75c7e5ef9b8 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -40,7 +40,7 @@ import android.view.KeyEvent; */ interface IAudioService { - void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags, + oneway void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags, String callingPackage, String caller); void adjustStreamVolume(int streamType, int direction, int flags, String callingPackage); diff --git a/media/java/android/media/MediaDrm.java b/media/java/android/media/MediaDrm.java index 9acfee2d2309..ab61e2bfcbd3 100644 --- a/media/java/android/media/MediaDrm.java +++ b/media/java/android/media/MediaDrm.java @@ -89,10 +89,23 @@ import android.util.Log; * encrypted content, the samples returned from the extractor remain encrypted, they * are only decrypted when the samples are delivered to the decoder. * <p> - * MediaDrm methods throw {@link java.lang.IllegalStateException} - * when a method is called on a MediaDrm object that is in an invalid or inoperable - * state. This is typically due to incorrect application API usage, but may also - * be due to an unrecoverable failure in the DRM plugin or security hardware. + * MediaDrm methods throw {@link android.media.MediaDrm.MediaDrmStateException} + * when a method is called on a MediaDrm object that has had an unrecoverable failure + * in the DRM plugin or security hardware. + * {@link android.media.MediaDrm.MediaDrmStateException} extends + * {@link java.lang.IllegalStateException} with the addition of a developer-readable + * diagnostic information string associated with the exception. + * <p> + * In the event of a mediaserver process crash or restart while a MediaDrm object + * is active, MediaDrm methods may throw {@link android.media.MediaDrmResetException}. + * To recover, the app must release the MediaDrm object, then create and initialize + * a new one. + * <p> + * As {@link android.media.MediaDrmResetException} and + * {@link android.media.MediaDrm.MediaDrmStateException} both extend + * {@link java.lang.IllegalStateException}, they should be in an earlier catch() + * block than {@link java.lang.IllegalStateException} if handled separately. + * <p> * <a name="Callbacks"></a> * <h3>Callbacks</h3> * <p>Applications should register for informational events in order diff --git a/media/java/android/media/MediaDrmResetException.java b/media/java/android/media/MediaDrmResetException.java new file mode 100644 index 000000000000..3b2da1e8bd25 --- /dev/null +++ b/media/java/android/media/MediaDrmResetException.java @@ -0,0 +1,28 @@ +/* + * Copyright 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.media; + +/** + * This exception is thrown when the MediaDrm instance has become unusable + * due to a restart of the mediaserver process. To continue, the app must + * release the MediaDrm object, then create and initialize a new one. + */ +public class MediaDrmResetException extends IllegalStateException { + public MediaDrmResetException(String detailMessage) { + super(detailMessage); + } +} diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index 13714d3517ca..6dd855d4dc41 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -3264,6 +3264,13 @@ public class MediaPlayer implements SubtitleController.Listener /** Some operation takes too long to complete, usually more than 3-5 seconds. */ public static final int MEDIA_ERROR_TIMED_OUT = -110; + /** Unspecified low-level system error. This value originated from UNKNOWN_ERROR in + * system/core/include/utils/Errors.h + * @see android.media.MediaPlayer.OnErrorListener + * @hide + */ + public static final int MEDIA_ERROR_SYSTEM = -2147483648; + /** * Interface definition of a callback to be invoked when there * has been an error during an asynchronous operation (other errors @@ -3287,6 +3294,7 @@ public class MediaPlayer implements SubtitleController.Listener * <li>{@link #MEDIA_ERROR_MALFORMED} * <li>{@link #MEDIA_ERROR_UNSUPPORTED} * <li>{@link #MEDIA_ERROR_TIMED_OUT} + * <li><code>MEDIA_ERROR_SYSTEM (-2147483648)</code> - low-level system error. * </ul> * @return True if the method handled the error, false if it didn't. * Returning false, or not having an OnErrorListener at all, will @@ -3346,6 +3354,14 @@ public class MediaPlayer implements SubtitleController.Listener */ public static final int MEDIA_INFO_BUFFERING_END = 702; + /** Estimated network bandwidth information (kbps) is available; currently this event fires + * simultaneously as {@link #MEDIA_INFO_BUFFERING_START} and {@link #MEDIA_INFO_BUFFERING_END} + * when playing network files. + * @see android.media.MediaPlayer.OnInfoListener + * @hide + */ + public static final int MEDIA_INFO_NETWORK_BANDWIDTH = 703; + /** Bad interleaving means that a media has been improperly interleaved or * not interleaved at all, e.g has all the video samples first then all the * audio ones. Video is playing but a lot of disk seeks may be happening. @@ -3403,6 +3419,8 @@ public class MediaPlayer implements SubtitleController.Listener * <li>{@link #MEDIA_INFO_VIDEO_RENDERING_START} * <li>{@link #MEDIA_INFO_BUFFERING_START} * <li>{@link #MEDIA_INFO_BUFFERING_END} + * <li><code>MEDIA_INFO_NETWORK_BANDWIDTH (703)</code> - + * bandwidth information is available (as <code>extra</code> kbps) * <li>{@link #MEDIA_INFO_BAD_INTERLEAVING} * <li>{@link #MEDIA_INFO_NOT_SEEKABLE} * <li>{@link #MEDIA_INFO_METADATA_UPDATE} diff --git a/media/java/android/media/midi/MidiDevice.java b/media/java/android/media/midi/MidiDevice.java index 7998a924c1ac..93fb6d2960da 100644 --- a/media/java/android/media/midi/MidiDevice.java +++ b/media/java/android/media/midi/MidiDevice.java @@ -50,21 +50,43 @@ public final class MidiDevice implements Closeable { * Close this object to terminate the connection. */ public class MidiConnection implements Closeable { - private final IBinder mToken; - private final MidiInputPort mInputPort; - - MidiConnection(IBinder token, MidiInputPort inputPort) { - mToken = token; - mInputPort = inputPort; + private final IMidiDeviceServer mInputPortDeviceServer; + private final IBinder mInputPortToken; + private final IBinder mOutputPortToken; + private final CloseGuard mGuard = CloseGuard.get(); + private boolean mIsClosed; + + MidiConnection(IBinder outputPortToken, MidiInputPort inputPort) { + mInputPortDeviceServer = inputPort.getDeviceServer(); + mInputPortToken = inputPort.getToken(); + mOutputPortToken = outputPortToken; + mGuard.open("close"); } @Override public void close() throws IOException { + synchronized (mGuard) { + if (mIsClosed) return; + mGuard.close(); + try { + // close input port + mInputPortDeviceServer.closePort(mInputPortToken); + // close output port + mDeviceServer.closePort(mOutputPortToken); + } catch (RemoteException e) { + Log.e(TAG, "RemoteException in MidiConnection.close"); + } + mIsClosed = true; + } + } + + @Override + protected void finalize() throws Throwable { try { - mDeviceServer.closePort(mToken); - IoUtils.closeQuietly(mInputPort); - } catch (RemoteException e) { - Log.e(TAG, "RemoteException in MidiConnection.close"); + mGuard.warnIfOpen(); + close(); + } finally { + super.finalize(); } } } diff --git a/media/java/android/media/midi/MidiDeviceServer.java b/media/java/android/media/midi/MidiDeviceServer.java index 1212b647d0d1..19ff62460155 100644 --- a/media/java/android/media/midi/MidiDeviceServer.java +++ b/media/java/android/media/midi/MidiDeviceServer.java @@ -257,7 +257,14 @@ public final class MidiDeviceServer implements Closeable { public void connectPorts(IBinder token, ParcelFileDescriptor pfd, int outputPortNumber) { MidiInputPort inputPort = new MidiInputPort(pfd, outputPortNumber); - mOutputPortDispatchers[outputPortNumber].getSender().connect(inputPort); + MidiDispatcher dispatcher = mOutputPortDispatchers[outputPortNumber]; + synchronized (dispatcher) { + dispatcher.getSender().connect(inputPort); + int openCount = dispatcher.getReceiverCount(); + mOutputPortOpenCount[outputPortNumber] = openCount; + updateDeviceStatus(); + } + mInputPorts.add(inputPort); OutputPortClient client = new OutputPortClient(token, inputPort); synchronized (mPortClients) { diff --git a/media/java/android/media/midi/MidiInputPort.java b/media/java/android/media/midi/MidiInputPort.java index af5a86ca8bd8..db41b10a7d59 100644 --- a/media/java/android/media/midi/MidiInputPort.java +++ b/media/java/android/media/midi/MidiInputPort.java @@ -103,17 +103,33 @@ public final class MidiInputPort extends MidiReceiver implements Closeable { // used by MidiDevice.connectInputPort() to connect our socket directly to another device /* package */ ParcelFileDescriptor claimFileDescriptor() { - synchronized (mBuffer) { - ParcelFileDescriptor pfd = mParcelFileDescriptor; - if (pfd != null) { + synchronized (mGuard) { + ParcelFileDescriptor pfd; + synchronized (mBuffer) { + pfd = mParcelFileDescriptor; + if (pfd == null) return null; IoUtils.closeQuietly(mOutputStream); mParcelFileDescriptor = null; mOutputStream = null; } + + // Set mIsClosed = true so we will not call mDeviceServer.closePort() in close(). + // MidiDevice.MidiConnection.close() will do the cleanup instead. + mIsClosed = true; return pfd; } } + // used by MidiDevice.MidiConnection to close this port after the connection is closed + /* package */ IBinder getToken() { + return mToken; + } + + // used by MidiDevice.MidiConnection to close this port after the connection is closed + /* package */ IMidiDeviceServer getDeviceServer() { + return mDeviceServer; + } + @Override public void close() throws IOException { synchronized (mGuard) { diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java index 91b1a49d9a7e..da5f33e4352c 100644 --- a/media/java/android/media/tv/TvContract.java +++ b/media/java/android/media/tv/TvContract.java @@ -21,6 +21,7 @@ import android.annotation.SystemApi; import android.content.ComponentName; import android.content.ContentResolver; import android.content.ContentUris; +import android.content.Intent; import android.net.Uri; import android.os.IBinder; import android.provider.BaseColumns; @@ -281,12 +282,12 @@ public final class TvContract { return ContentUris.withAppendedId(WatchedPrograms.CONTENT_URI, watchedProgramId); } - private static final boolean isTvUri(Uri uri) { + private static boolean isTvUri(Uri uri) { return uri != null && ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()) && AUTHORITY.equals(uri.getAuthority()); } - private static final boolean isTwoSegmentUriStartingWith(Uri uri, String pathSegment) { + private static boolean isTwoSegmentUriStartingWith(Uri uri, String pathSegment) { List<String> pathSegments = uri.getPathSegments(); return pathSegments.size() == 2 && pathSegment.equals(pathSegments.get(0)); } @@ -332,15 +333,15 @@ public final class TvContract { */ public interface BaseTvColumns extends BaseColumns { /** - * The name of the package that owns a row in each table. + * The name of the package that owns the current row. * - * <p>The TV provider fills it in with the name of the package that provides the initial data - * of that row. If the package is later uninstalled, the rows it owns are automatically - * removed from the tables. + * <p>The TV provider fills in this column with the name of the package that provides the + * initial data of the row. If the package is later uninstalled, the rows it owns are + * automatically removed from the tables. * * <p>Type: TEXT */ - public static final String COLUMN_PACKAGE_NAME = "package_name"; + String COLUMN_PACKAGE_NAME = "package_name"; } /** Column definitions for the TV channels table. */ @@ -564,7 +565,7 @@ public final class TvContract { * defined there (e.g. ETSI EN 300 468/TR 101 211 and ARIB STD-B10). If channels cannot be * globally identified by 2-tuple {{@link #COLUMN_TRANSPORT_STREAM_ID}, * {@link #COLUMN_SERVICE_ID}}, one must carefully assign a value to this field to form a - * unique 3-tuple identification {{@link #COLUMN_ORIGINAL_NETWORK_ID}, + * unique 3-tuple identification {{@code COLUMN_ORIGINAL_NETWORK_ID}, * {@link #COLUMN_TRANSPORT_STREAM_ID}, {@link #COLUMN_SERVICE_ID}} for its channels. * * <p>This is a required field if the channel cannot be uniquely identified by a 2-tuple @@ -680,12 +681,13 @@ public final class TvContract { /** * The flag indicating whether this TV channel is searchable or not. * - * <p>In some regions, it is not allowed to surface search results for a given channel - * without broadcaster's consent. This is used to impose such restriction. Channels marked - * with "not searchable" cannot be used by other services except for the system service that - * shows the TV content. A value of 1 indicates the channel is searchable and can be - * included in search results, a value of 0 indicates the channel and its TV programs are - * hidden from search. If not specified, this value is set to 1 (searchable) by default. + * <p>The columns of searchable channels can be read by other applications that have proper + * permission. Care must be taken not to open sensitive data. + * + * <p>A value of 1 indicates that the channel is searchable and its columns can be read by + * other applications, a value of 0 indicates that the channel is hidden and its columns can + * be read only by the package that owns the channel and the system. If not specified, this + * value is set to 1 (searchable) by default. * * <p>Type: INTEGER (boolean) */ @@ -708,6 +710,109 @@ public final class TvContract { public static final String COLUMN_LOCKED = "locked"; /** + * The app badge icon of the app link template for this channel. + * + * <p>This small icon is overlaid at the bottom of the poster art specified by + * {@link #COLUMN_APP_LINK_POSTER_ART_URI}. The data in the column must be a URI in one of + * the following formats: + * + * <ul> + * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li> + * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE}) + * </li> + * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li> + * </ul> + * + * <p>The app-linking allows channel input sources to provide activity links from their live + * channel programming to another activity. This enables content providers to increase user + * engagement by offering the viewer other content or actions. + * + * <p>Type: TEXT + * @see #COLUMN_APP_LINK_COLOR + * @see #COLUMN_APP_LINK_INTENT_URI + * @see #COLUMN_APP_LINK_POSTER_ART_URI + * @see #COLUMN_APP_LINK_TEXT + */ + public static final String COLUMN_APP_LINK_ICON_URI = "app_link_icon_uri"; + + /** + * The poster art used as the background of the app link template for this channel. + * + * <p>The data in the column must be a URL or a URI in one of the following formats: + * + * <ul> + * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li> + * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE}) + * </li> + * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li> + * </ul> + * + * <p>The app-linking allows channel input sources to provide activity links from their live + * channel programming to another activity. This enables content providers to increase user + * engagement by offering the viewer other content or actions. + * + * <p>Type: TEXT + * @see #COLUMN_APP_LINK_COLOR + * @see #COLUMN_APP_LINK_ICON_URI + * @see #COLUMN_APP_LINK_INTENT_URI + * @see #COLUMN_APP_LINK_TEXT + */ + public static final String COLUMN_APP_LINK_POSTER_ART_URI = "app_link_poster_art_uri"; + + /** + * The link text of the app link template for this channel. + * + * <p>This provides a short description of the action that happens when the corresponding + * app link is clicked. + * + * <p>The app-linking allows channel input sources to provide activity links from their live + * channel programming to another activity. This enables content providers to increase user + * engagement by offering the viewer other content or actions. + * + * <p>Type: TEXT + * @see #COLUMN_APP_LINK_COLOR + * @see #COLUMN_APP_LINK_ICON_URI + * @see #COLUMN_APP_LINK_INTENT_URI + * @see #COLUMN_APP_LINK_POSTER_ART_URI + */ + public static final String COLUMN_APP_LINK_TEXT = "app_link_text"; + + /** + * The accent color of the app link template for this channel. This is primarily used for + * the background color of the text box in the template. + * + * <p>The app-linking allows channel input sources to provide activity links from their live + * channel programming to another activity. This enables content providers to increase user + * engagement by offering the viewer other content or actions. + * + * <p>Type: INTEGER (color value) + * @see #COLUMN_APP_LINK_ICON_URI + * @see #COLUMN_APP_LINK_INTENT_URI + * @see #COLUMN_APP_LINK_POSTER_ART_URI + * @see #COLUMN_APP_LINK_TEXT + */ + public static final String COLUMN_APP_LINK_COLOR = "app_link_color"; + + /** + * The intent URI of the app link for this channel. + * + * <p>The URI is created using {@link Intent#toUri} with {@link Intent#URI_INTENT_SCHEME} + * and converted back to the original intent with {@link Intent#parseUri}. The intent is + * launched when the user clicks the corresponding app link for the current channel. + * + * <p>The app-linking allows channel input sources to provide activity links from their live + * channel programming to another activity. This enables content providers to increase user + * engagement by offering the viewer other content or actions. + * + * <p>Type: TEXT + * @see #COLUMN_APP_LINK_COLOR + * @see #COLUMN_APP_LINK_ICON_URI + * @see #COLUMN_APP_LINK_POSTER_ART_URI + * @see #COLUMN_APP_LINK_TEXT + */ + public static final String COLUMN_APP_LINK_INTENT_URI = "app_link_intent_uri"; + + /** * Internal data used by individual TV input services. * * <p>This is internal to the provider that inserted it, and should not be decoded by other @@ -1011,6 +1116,21 @@ public final class TvContract { public static final String COLUMN_THUMBNAIL_URI = "thumbnail_uri"; /** + * The flag indicating whether this TV program is searchable or not. + * + * <p>The columns of searchable programs can be read by other applications that have proper + * permission. Care must be taken not to open sensitive data. + * + * <p>A value of 1 indicates that the program is searchable and its columns can be read by + * other applications, a value of 0 indicates that the program is hidden and its columns can + * be read only by the package that owns the program and the system. If not specified, this + * value is set to 1 (searchable) by default. + * + * <p>Type: INTEGER (boolean) + */ + public static final String COLUMN_SEARCHABLE = "searchable"; + + /** * Internal data used by individual TV input services. * * <p>This is internal to the provider that inserted it, and should not be decoded by other diff --git a/media/java/android/media/tv/TvInputInfo.java b/media/java/android/media/tv/TvInputInfo.java index 5d1aa149aa64..ce72c2fa4a25 100644 --- a/media/java/android/media/tv/TvInputInfo.java +++ b/media/java/android/media/tv/TvInputInfo.java @@ -106,7 +106,7 @@ public final class TvInputInfo implements Parcelable { */ public static final String EXTRA_INPUT_ID = "android.media.tv.extra.INPUT_ID"; - private static SparseIntArray sHardwareTypeToTvInputType = new SparseIntArray(); + private static final SparseIntArray sHardwareTypeToTvInputType = new SparseIntArray(); private static final String XML_START_TAG_NAME = "tv-input"; private static final String DELIMITER_INFO_IN_ID = "/"; @@ -594,7 +594,7 @@ public final class TvInputInfo implements Parcelable { * @param name the component name for generating an input id. * @return the generated input id for the given {@code name}. */ - private static final String generateInputIdForComponentName(ComponentName name) { + private static String generateInputIdForComponentName(ComponentName name) { return name.flattenToShortString(); } @@ -605,7 +605,7 @@ public final class TvInputInfo implements Parcelable { * @param deviceInfo HdmiDeviceInfo describing this TV input. * @return the generated input id for the given {@code name} and {@code deviceInfo}. */ - private static final String generateInputIdForHdmiDevice( + private static String generateInputIdForHdmiDevice( ComponentName name, HdmiDeviceInfo deviceInfo) { // Example of the format : "/HDMI%04X%02X" String format = DELIMITER_INFO_IN_ID + PREFIX_HDMI_DEVICE @@ -622,7 +622,7 @@ public final class TvInputInfo implements Parcelable { * @param hardwareInfo TvInputHardwareInfo describing this TV input. * @return the generated input id for the given {@code name} and {@code hardwareInfo}. */ - private static final String generateInputIdForHardware( + private static String generateInputIdForHardware( ComponentName name, TvInputHardwareInfo hardwareInfo) { return name.flattenToShortString() + DELIMITER_INFO_IN_ID + PREFIX_HARDWARE_DEVICE + hardwareInfo.getDeviceId(); @@ -648,13 +648,13 @@ public final class TvInputInfo implements Parcelable { mSetupActivity = in.readString(); mSettingsActivity = in.readString(); mType = in.readInt(); - mIsHardwareInput = in.readByte() == 1 ? true : false; + mIsHardwareInput = in.readByte() == 1; mHdmiDeviceInfo = in.readParcelable(null); mIcon = in.readParcelable(null); mIconUri = in.readParcelable(null); mLabelRes = in.readInt(); mLabel = in.readString(); - mIsConnectedToHdmiSwitch = in.readByte() == 1 ? true : false; + mIsConnectedToHdmiSwitch = in.readByte() == 1; } /** diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java index 01de8983cdc3..e9c94c07dde4 100644 --- a/media/java/android/media/tv/TvInputManager.java +++ b/media/java/android/media/tv/TvInputManager.java @@ -29,6 +29,7 @@ import android.os.Looper; import android.os.Message; import android.os.ParcelFileDescriptor; import android.os.RemoteException; +import android.text.TextUtils; import android.util.ArrayMap; import android.util.Log; import android.util.Pools.Pool; @@ -1652,14 +1653,16 @@ public final class TvInputManager { */ boolean updateTrackSelection(int type, String trackId) { synchronized (mMetadataLock) { - if (type == TvTrackInfo.TYPE_AUDIO && trackId != mSelectedAudioTrackId) { + if (type == TvTrackInfo.TYPE_AUDIO + && !TextUtils.equals(trackId, mSelectedAudioTrackId)) { mSelectedAudioTrackId = trackId; return true; - } else if (type == TvTrackInfo.TYPE_VIDEO && trackId != mSelectedVideoTrackId) { + } else if (type == TvTrackInfo.TYPE_VIDEO + && !TextUtils.equals(trackId, mSelectedVideoTrackId)) { mSelectedVideoTrackId = trackId; return true; } else if (type == TvTrackInfo.TYPE_SUBTITLE - && trackId != mSelectedSubtitleTrackId) { + && !TextUtils.equals(trackId, mSelectedSubtitleTrackId)) { mSelectedSubtitleTrackId = trackId; return true; } @@ -1929,7 +1932,7 @@ public final class TvInputManager { * @param handled {@code true} if the dispatched input event was handled properly. * {@code false} otherwise. */ - public void onFinishedInputEvent(Object token, boolean handled); + void onFinishedInputEvent(Object token, boolean handled); } // Must be called on the main looper @@ -1978,7 +1981,7 @@ public final class TvInputManager { mPendingEvents.removeAt(index); if (timeout) { - Log.w(TAG, "Timeout waiting for seesion to handle input event after " + Log.w(TAG, "Timeout waiting for session to handle input event after " + INPUT_SESSION_NOT_RESPONDING_TIMEOUT + " ms: " + mToken); } else { mHandler.removeMessages(InputEventHandler.MSG_TIMEOUT_INPUT_EVENT, p); diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java index f52ccc9bb334..35037bbe18f4 100644 --- a/media/java/android/media/tv/TvInputService.java +++ b/media/java/android/media/tv/TvInputService.java @@ -233,10 +233,7 @@ public abstract class TvInputService extends Service { mTvInputManager = (TvInputManager) getSystemService(Context.TV_INPUT_SERVICE); } TvInputInfo info = mTvInputManager.getTvInputInfo(inputId); - if (info != null && info.isPassthroughInput()) { - return true; - } - return false; + return info != null && info.isPassthroughInput(); } /** @@ -1383,7 +1380,7 @@ public abstract class TvInputService extends Service { } } - private final void executeOrPostRunnable(Runnable action) { + private void executeOrPostRunnable(Runnable action) { synchronized(mLock) { if (mSessionCallback == null) { // The session is not initialized yet. @@ -1651,13 +1648,13 @@ public abstract class TvInputService extends Service { if (sessionImpl instanceof HardwareSession) { HardwareSession proxySession = ((HardwareSession) sessionImpl); - String harewareInputId = proxySession.getHardwareInputId(); - if (TextUtils.isEmpty(harewareInputId) || - !isPassthroughInput(harewareInputId)) { - if (TextUtils.isEmpty(harewareInputId)) { + String hardwareInputId = proxySession.getHardwareInputId(); + if (TextUtils.isEmpty(hardwareInputId) || + !isPassthroughInput(hardwareInputId)) { + if (TextUtils.isEmpty(hardwareInputId)) { Log.w(TAG, "Hardware input id is not setup yet."); } else { - Log.w(TAG, "Invalid hardware input id : " + harewareInputId); + Log.w(TAG, "Invalid hardware input id : " + hardwareInputId); } sessionImpl.onRelease(); try { @@ -1672,7 +1669,7 @@ public abstract class TvInputService extends Service { proxySession.mServiceHandler = mServiceHandler; TvInputManager manager = (TvInputManager) getSystemService( Context.TV_INPUT_SERVICE); - manager.createSession(harewareInputId, + manager.createSession(hardwareInputId, proxySession.mHardwareSessionCallback, mServiceHandler); } else { SomeArgs someArgs = SomeArgs.obtain(); diff --git a/media/java/android/media/tv/TvStreamConfig.java b/media/java/android/media/tv/TvStreamConfig.java index 1bdc63eb0e97..0c2f3fec26a4 100644 --- a/media/java/android/media/tv/TvStreamConfig.java +++ b/media/java/android/media/tv/TvStreamConfig.java @@ -89,12 +89,8 @@ public class TvStreamConfig implements Parcelable { @Override public String toString() { - StringBuilder b = new StringBuilder(128); - b.append("TvStreamConfig {"); - b.append("mStreamId=").append(mStreamId).append(";"); - b.append("mType=").append(mType).append(";"); - b.append("mGeneration=").append(mGeneration).append("}"); - return b.toString(); + return "TvStreamConfig {mStreamId=" + mStreamId + ";" + "mType=" + mType + ";mGeneration=" + + mGeneration + "}"; } // Parcelable diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java index e7ce1dd7613b..64333ad6e8f9 100644 --- a/media/java/android/media/tv/TvView.java +++ b/media/java/android/media/tv/TvView.java @@ -191,7 +191,7 @@ public class TvView extends ViewGroup { * the active source. * * <p>First tuned {@link TvView} becomes main automatically, and keeps to be main until either - * {@link #reset} is called for the main {@link TvView} or {@link #setMain} is called for other + * {@link #reset} is called for the main {@link TvView} or {@code setMain()} is called for other * {@link TvView}. * @hide */ @@ -337,8 +337,14 @@ public class TvView extends ViewGroup { } private void resetInternal() { + mPendingAppPrivateCommands.clear(); if (mSession != null) { - release(); + setSessionSurface(null); + removeSessionOverlayView(); + mUseRequestedSurfaceLayout = false; + mSession.release(); + mSession = null; + mSessionCallback = null; resetSurfaceView(); } } @@ -738,17 +744,6 @@ public class TvView extends ViewGroup { addView(mSurfaceView); } - private void release() { - mPendingAppPrivateCommands.clear(); - - setSessionSurface(null); - removeSessionOverlayView(); - mUseRequestedSurfaceLayout = false; - mSession.release(); - mSession = null; - mSessionCallback = null; - } - private void setSessionSurface(Surface surface) { if (mSession == null) { return; diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp index 635fa11c6b44..0034b07762a8 100644 --- a/media/jni/android_media_ImageReader.cpp +++ b/media/jni/android_media_ImageReader.cpp @@ -1240,8 +1240,11 @@ static jint Image_getFormat(JNIEnv* env, jobject thiz, jint readerFormat) return static_cast<jint>(PublicFormat::PRIVATE); } else { CpuConsumer::LockedBuffer* buffer = Image_getLockedBuffer(env, thiz); + int readerHalFormat = android_view_Surface_mapPublicFormatToHalFormat( + static_cast<PublicFormat>(readerFormat)); + int32_t fmt = applyFormatOverrides(buffer->flexFormat, readerHalFormat); PublicFormat publicFmt = android_view_Surface_mapHalFormatDataspaceToPublicFormat( - buffer->flexFormat, buffer->dataSpace); + fmt, buffer->dataSpace); return static_cast<jint>(publicFmt); } } diff --git a/media/jni/android_media_ImageWriter.cpp b/media/jni/android_media_ImageWriter.cpp index 634ba64dcf79..ba7634cd3276 100644 --- a/media/jni/android_media_ImageWriter.cpp +++ b/media/jni/android_media_ImageWriter.cpp @@ -361,8 +361,7 @@ static void ImageWriter_close(JNIEnv* env, jobject thiz, jlong nativeCtx) { ALOGV("%s:", __FUNCTION__); JNIImageWriterContext* const ctx = reinterpret_cast<JNIImageWriterContext *>(nativeCtx); if (ctx == NULL || thiz == NULL) { - jniThrowException(env, "java/lang/IllegalStateException", - "ImageWriterContext is not initialized"); + // ImageWriter is already closed. return; } diff --git a/media/jni/android_media_MediaDrm.cpp b/media/jni/android_media_MediaDrm.cpp index d456dc1080d2..9ec0312d0f2a 100644 --- a/media/jni/android_media_MediaDrm.cpp +++ b/media/jni/android_media_MediaDrm.cpp @@ -308,6 +308,10 @@ static bool throwExceptionAsNecessary( } else if (err == ERROR_DRM_DEVICE_REVOKED) { jniThrowException(env, "android/media/DeniedByServerException", msg); return true; + } else if (err == DEAD_OBJECT) { + jniThrowException(env, "android/media/MediaDrmResetException", + "mediaserver died"); + return true; } else if (err != OK) { String8 errbuf; if (drmMessage != NULL) { diff --git a/media/jni/audioeffect/android_media_AudioEffect.cpp b/media/jni/audioeffect/android_media_AudioEffect.cpp index fdc586b8a175..aba4bbeb1e70 100644 --- a/media/jni/audioeffect/android_media_AudioEffect.cpp +++ b/media/jni/audioeffect/android_media_AudioEffect.cpp @@ -472,6 +472,8 @@ static void android_media_AudioEffect_native_release(JNIEnv *env, jobject thiz) if (lpJniStorage) { ALOGV("deleting pJniStorage: %p\n", lpJniStorage); + env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioEffect_class); + env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioEffect_ref); delete lpJniStorage; } } diff --git a/media/jni/audioeffect/android_media_Visualizer.cpp b/media/jni/audioeffect/android_media_Visualizer.cpp index 6098b4a47fa9..05570195752b 100644 --- a/media/jni/audioeffect/android_media_Visualizer.cpp +++ b/media/jni/audioeffect/android_media_Visualizer.cpp @@ -450,6 +450,8 @@ static void android_media_visualizer_native_release(JNIEnv *env, jobject thiz) if (lpJniStorage) { ALOGV("deleting pJniStorage: %p\n", lpJniStorage); + env->DeleteGlobalRef(lpJniStorage->mCallbackData.visualizer_class); + env->DeleteGlobalRef(lpJniStorage->mCallbackData.visualizer_ref); delete lpJniStorage; } } diff --git a/packages/DocumentsUI/res/values-sw720dp/styles.xml b/packages/DocumentsUI/res/values-sw720dp/styles.xml index 0b03a94f294d..d7c031e143ca 100644 --- a/packages/DocumentsUI/res/values-sw720dp/styles.xml +++ b/packages/DocumentsUI/res/values-sw720dp/styles.xml @@ -16,7 +16,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android"> - <style name="DialogWhenReallyLarge" parent="@*android:style/Theme.Material.DayNight.Dialog"> + <style name="DialogWhenReallyLarge" parent="@*android:style/Theme.DeviceDefault.Light.Dialog"> <!-- We do not specify width of window here because the max size of floating window specified by windowFixedWidthis is limited. --> <item name="*android:windowFixedHeightMajor">80%</item> diff --git a/packages/DocumentsUI/res/values/styles.xml b/packages/DocumentsUI/res/values/styles.xml index 6d741aae8786..8c4b77707fc1 100644 --- a/packages/DocumentsUI/res/values/styles.xml +++ b/packages/DocumentsUI/res/values/styles.xml @@ -16,7 +16,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android"> - <style name="DialogWhenReallyLarge" parent="@android:style/Theme.Material.DayNight.DarkActionBar" /> + <style name="DialogWhenReallyLarge" parent="@android:style/Theme.DeviceDefault.Light.DarkActionBar" /> <style name="DocumentsTheme" parent="@style/DialogWhenReallyLarge"> <item name="android:actionBarWidgetTheme">@null</item> diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java index 90ccf9153199..fe148daf8f74 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java @@ -393,25 +393,23 @@ public class DocumentsActivity extends BaseActivity { @Override public void updateActionBar() { if (mRootsToolbar != null) { - if (mState.action == ACTION_OPEN || - mState.action == ACTION_GET_CONTENT || - mState.action == ACTION_OPEN_TREE) { - mRootsToolbar.setTitle(R.string.title_open); - } else if (mState.action == ACTION_CREATE || - mState.action == ACTION_OPEN_COPY_DESTINATION) { - mRootsToolbar.setTitle(R.string.title_save); + final String prompt = getIntent().getStringExtra(DocumentsContract.EXTRA_PROMPT); + if (prompt != null) { + mRootsToolbar.setTitle(prompt); + } else { + if (mState.action == ACTION_OPEN || + mState.action == ACTION_GET_CONTENT || + mState.action == ACTION_OPEN_TREE) { + mRootsToolbar.setTitle(R.string.title_open); + } else if (mState.action == ACTION_CREATE || + mState.action == ACTION_OPEN_COPY_DESTINATION) { + mRootsToolbar.setTitle(R.string.title_save); + } } } - final RootInfo root = getCurrentRoot(); - final boolean showRootIcon = mShowAsDialog - || (mState.action == ACTION_MANAGE || mState.action == ACTION_BROWSE); - if (showRootIcon) { - mToolbar.setNavigationIcon( - root != null ? root.loadToolbarIcon(mToolbar.getContext()) : null); - mToolbar.setNavigationContentDescription(R.string.drawer_open); - mToolbar.setNavigationOnClickListener(null); - } else { + if (!mShowAsDialog && mDrawerLayout.getDrawerLockMode(mRootsDrawer) == + DrawerLayout.LOCK_MODE_UNLOCKED) { mToolbar.setNavigationIcon(R.drawable.ic_hamburger); mToolbar.setNavigationContentDescription(R.string.drawer_open); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @@ -420,6 +418,10 @@ public class DocumentsActivity extends BaseActivity { setRootsDrawerOpen(true); } }); + } else { + mToolbar.setNavigationIcon(null); + mToolbar.setNavigationContentDescription(R.string.drawer_open); + mToolbar.setNavigationOnClickListener(null); } if (mSearchManager.isExpanded()) { @@ -428,7 +430,7 @@ public class DocumentsActivity extends BaseActivity { mToolbarStack.setAdapter(null); } else { if (mState.stack.size() <= 1) { - mToolbar.setTitle(root.title); + mToolbar.setTitle(getCurrentRoot().title); mToolbarStack.setVisibility(View.GONE); mToolbarStack.setAdapter(null); } else { diff --git a/packages/Keyguard/res/values-ta-rIN/strings.xml b/packages/Keyguard/res/values-ta-rIN/strings.xml index 43673eda28d1..911611f77fb1 100644 --- a/packages/Keyguard/res/values-ta-rIN/strings.xml +++ b/packages/Keyguard/res/values-ta-rIN/strings.xml @@ -115,16 +115,16 @@ <string name="kg_prompt_reason_switch_profiles_pin" msgid="8108020184731052246">"சுயவிவரங்களுக்கு இடையே மாறும் போது, பின் தேவை."</string> <string name="kg_prompt_reason_switch_profiles_password" msgid="6755997057852042672">"சுயவிவரங்களுக்கு இடையே மாறும் போது, கடவுச்சொல் தேவை."</string> <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="2697444392228541853"> - <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> மணிநேரத்திற்குச் சாதனம் திறக்கப்படவில்லை. வடிவத்தை உறுதிப்படுத்தவும்.</item> - <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> மணிநேரத்திற்குச் சாதனம் திறக்கப்படவில்லை. வடிவத்தை உறுதிப்படுத்தவும்.</item> + <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> மணிநேரமாகச் சாதனம் திறக்கப்படவில்லை. வடிவத்தை உறுதிப்படுத்தவும்.</item> + <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> மணிநேரமாகச் சாதனம் திறக்கப்படவில்லை. வடிவத்தை உறுதிப்படுத்தவும்.</item> </plurals> <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="2118758475374354849"> - <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> மணிநேரத்திற்குச் சாதனம் திறக்கப்படவில்லை. பின்னை உறுதிப்படுத்தவும்.</item> - <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> மணிநேரத்திற்குச் சாதனம் திறக்கப்படவில்லை. பின்னை உறுதிப்படுத்தவும்.</item> + <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> மணிநேரமாகச் சாதனம் திறக்கப்படவில்லை. பின்னை உறுதிப்படுத்தவும்.</item> + <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> மணிநேரமாகச் சாதனம் திறக்கப்படவில்லை. பின்னை உறுதிப்படுத்தவும்.</item> </plurals> <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="5132693663364913675"> - <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> மணிநேரத்திற்குச் சாதனம் திறக்கப்படவில்லை. கடவுச்சொல்லை உறுதிப்படுத்தவும்.</item> - <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> மணிநேரத்திற்குச் சாதனம் திறக்கப்படவில்லை. கடவுச்சொல்லை உறுதிப்படுத்தவும்.</item> + <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> மணிநேரமாகச் சாதனம் திறக்கப்படவில்லை. கடவுச்சொல்லை உறுதிப்படுத்தவும்.</item> + <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> மணிநேரமாகச் சாதனம் திறக்கப்படவில்லை. கடவுச்சொல்லை உறுதிப்படுத்தவும்.</item> </plurals> <string name="fingerprint_not_recognized" msgid="2690661881608146617">"அறியப்படவில்லை"</string> </resources> diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java index aa99a7bfeb72..0c6837fcc60c 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java @@ -216,6 +216,19 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout return mCallback; } + @Override + public void showPromptReason(int reason) { + if (reason != PROMPT_REASON_NONE) { + int promtReasonStringRes = getPromtReasonStringRes(reason); + if (promtReasonStringRes != 0) { + mSecurityMessageDisplay.setMessage(promtReasonStringRes, + true /* important */); + } + } + } + + protected abstract int getPromtReasonStringRes(int reason); + // Cause a VIRTUAL_KEY vibration public void doHapticKeyClick() { if (mEnableHaptics) { diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java index cd4b24a9e178..ff4e8154d0f5 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java @@ -160,6 +160,17 @@ public class KeyguardHostView extends FrameLayout implements SecurityCallback { } /** + * Show a string explaining why the security view needs to be solved. + * + * @param reason a flag indicating which string should be shown, see + * {@link KeyguardSecurityView#PROMPT_REASON_NONE} + * and {@link KeyguardSecurityView#PROMPT_REASON_RESTART} + */ + public void showPromptReason(int reason) { + mSecurityContainer.showPromptReason(reason); + } + + /** * Dismisses the keyguard by going to the next screen or making it gone. * * @return True if the keyguard is done. diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java index c9ad7286d9f6..2db87b330077 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java @@ -111,6 +111,16 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView } @Override + protected int getPromtReasonStringRes(int reason) { + switch (reason) { + case PROMPT_REASON_RESTART: + return R.string.kg_prompt_reason_restart_password; + default: + return 0; + } + } + + @Override public void onPause() { super.onPause(); mImm.hideSoftInputFromWindow(getWindowToken(), 0); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java index 1bd0bb4dcec5..59a8ad576ebb 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java @@ -85,10 +85,9 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit } }; private Rect mTempRect = new Rect(); - private SecurityMessageDisplay mSecurityMessageDisplay; + private KeyguardMessageArea mSecurityMessageDisplay; private View mEcaView; private ViewGroup mContainer; - private KeyguardMessageArea mHelpMessage; private int mDisappearYTranslation; enum FooterMode { @@ -141,10 +140,10 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit // vibrate mode will be the same for the life of this screen mLockPatternView.setTactileFeedbackEnabled(mLockPatternUtils.isTactileFeedbackEnabled()); - mSecurityMessageDisplay = KeyguardMessageArea.findSecurityMessageDisplay(this); + mSecurityMessageDisplay = + (KeyguardMessageArea) KeyguardMessageArea.findSecurityMessageDisplay(this); mEcaView = findViewById(R.id.keyguard_selector_fade_container); mContainer = (ViewGroup) findViewById(R.id.container); - mHelpMessage = (KeyguardMessageArea) findViewById(R.id.keyguard_message_area); EmergencyButton button = (EmergencyButton) findViewById(R.id.emergency_call_button); if (button != null) { @@ -320,6 +319,17 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit } @Override + public void showPromptReason(int reason) { + switch (reason) { + case PROMPT_REASON_RESTART: + mSecurityMessageDisplay.setMessage(R.string.kg_prompt_reason_restart_pattern, + true /* important */); + break; + default: + } + } + + @Override public void startAppearAnimation() { enableClipping(false); setAlpha(1f); @@ -337,8 +347,8 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit } }, this); - if (!TextUtils.isEmpty(mHelpMessage.getText())) { - mAppearAnimationUtils.createAnimation(mHelpMessage, 0, + if (!TextUtils.isEmpty(mSecurityMessageDisplay.getText())) { + mAppearAnimationUtils.createAnimation(mSecurityMessageDisplay, 0, AppearAnimationUtils.DEFAULT_APPEAR_DURATION, mAppearAnimationUtils.getStartTranslation(), true /* appearing */, @@ -366,8 +376,8 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit } } }, KeyguardPatternView.this); - if (!TextUtils.isEmpty(mHelpMessage.getText())) { - mDisappearAnimationUtils.createAnimation(mHelpMessage, 0, + if (!TextUtils.isEmpty(mSecurityMessageDisplay.getText())) { + mDisappearAnimationUtils.createAnimation(mSecurityMessageDisplay, 0, 200, - mDisappearAnimationUtils.getStartTranslation() * 3, false /* appearing */, diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java index 23834a31923c..07947b182d46 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java @@ -93,6 +93,16 @@ public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView return super.onKeyDown(keyCode, event); } + @Override + protected int getPromtReasonStringRes(int reason) { + switch (reason) { + case PROMPT_REASON_RESTART: + return R.string.kg_prompt_reason_restart_pin; + default: + return 0; + } + } + private void performClick(View view) { view.performClick(); } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java index d17b25a6a87c..f529ac0f3497 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -509,6 +509,13 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe } @Override + public void showPromptReason(int reason) { + if (mCurrentSecuritySelection != SecurityMode.None) { + getSecurityView(mCurrentSecuritySelection).showPromptReason(reason); + } + } + + @Override public void showUsabilityHint() { mSecurityViewFlipper.showUsabilityHint(); } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java index 5b5023602010..5658a7492d93 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java @@ -21,6 +21,9 @@ public interface KeyguardSecurityView { static public final int SCREEN_ON = 1; static public final int VIEW_REVEALED = 2; + int PROMPT_REASON_NONE = 0; + int PROMPT_REASON_RESTART = 1; + /** * Interface back to keyguard to tell it when security * @param callback @@ -66,6 +69,14 @@ public interface KeyguardSecurityView { KeyguardSecurityCallback getCallback(); /** + * Show a string explaining why the security view needs to be solved. + * + * @param reason a flag indicating which string should be shown, see {@link #PROMPT_REASON_NONE} + * and {@link #PROMPT_REASON_RESTART} + */ + void showPromptReason(int reason); + + /** * Instruct the view to show usability hints, if any. * */ diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewFlipper.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewFlipper.java index 54467f3863cf..a0ff21b1fd51 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewFlipper.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewFlipper.java @@ -131,6 +131,14 @@ public class KeyguardSecurityViewFlipper extends ViewFlipper implements Keyguard } @Override + public void showPromptReason(int reason) { + KeyguardSecurityView ksv = getSecurityView(); + if (ksv != null) { + ksv.showPromptReason(reason); + } + } + + @Override public void showUsabilityHint() { KeyguardSecurityView ksv = getSecurityView(); if (ksv != null) { diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java index f4acff8beb2b..aeac91215be6 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java @@ -95,6 +95,12 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { } } + @Override + protected int getPromtReasonStringRes(int reason) { + // No message on SIM Pin + return 0; + } + private String getPinPasswordErrorMessage(int attemptsRemaining) { String displayMessage; diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java index b85d96608f2c..af882395ee79 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java @@ -140,6 +140,12 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { } } + @Override + protected int getPromtReasonStringRes(int reason) { + // No message on SIM Puk + return 0; + } + private String getPukPasswordErrorMessage(int attemptsRemaining) { String displayMessage; diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index 273f166888e6..022338dab34c 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -804,8 +804,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private void startListeningForFingerprint() { if (DEBUG) Log.v(TAG, "startListeningForFingerprint()"); int userId = ActivityManager.getCurrentUser(); - if (mFpm != null && mFpm.isHardwareDetected() && !isFingerprintDisabled(userId) - && mFpm.getEnrolledFingerprints(userId).size() > 0) { + if (isUnlockWithFingerPrintPossible(userId)) { if (mFingerprintCancelSignal != null) { mFingerprintCancelSignal.cancel(); } @@ -815,6 +814,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } } + public boolean isUnlockWithFingerPrintPossible(int userId) { + return mFpm != null && mFpm.isHardwareDetected() && !isFingerprintDisabled(userId) + && mFpm.getEnrolledFingerprints(userId).size() > 0; + } + private void stopListeningForFingerprint() { if (DEBUG) Log.v(TAG, "stopListeningForFingerprint()"); if (isFingerprintDetectionRunning()) { diff --git a/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java b/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java index f5c809a61db1..ff463c6c8312 100644 --- a/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java +++ b/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java @@ -81,4 +81,12 @@ public interface ViewMediatorCallback { * @return true if the screen is on */ boolean isScreenOn(); + + /** + * @return one of the reasons why the bouncer needs to be shown right now and the user can't use + * his normal unlock method like fingerprint or trust agents. See + * {@link KeyguardSecurityView#PROMPT_REASON_NONE} + * and {@link KeyguardSecurityView#PROMPT_REASON_RESTART}. + */ + int getBouncerPromptReason(); } diff --git a/packages/PrintSpooler/res/values/themes.xml b/packages/PrintSpooler/res/values/themes.xml index 05de5b79a6f9..11fa99117c8b 100644 --- a/packages/PrintSpooler/res/values/themes.xml +++ b/packages/PrintSpooler/res/values/themes.xml @@ -17,6 +17,9 @@ <resources> <style name="PrintActivity" parent="@android:style/Theme.DeviceDefault"> + <item name="android:colorPrimary">@*android:color/material_blue_grey_900</item> + <item name="android:colorPrimaryDark">@*android:color/material_blue_grey_950</item> + <item name="android:colorAccent">@*android:color/material_deep_teal_500</item> <item name="android:windowIsTranslucent">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowContentOverlay">@null</item> diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index b0429ef43cf9..249eaa5d44d3 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -808,7 +808,7 @@ public final class CachedBluetoothDevice implements Comparable<CachedBluetoothDe // The pairing dialog now warns of phone-book access for paired devices. // No separate prompt is displayed after pairing. if (getPhonebookPermissionChoice() == CachedBluetoothDevice.ACCESS_UNKNOWN) { - setPhonebookPermissionChoice(CachedBluetoothDevice.ACCESS_ALLOWED); + setPhonebookPermissionChoice(CachedBluetoothDevice.ACCESS_REJECTED); } } } diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index 4cef28693c03..0180a30ad458 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -46,6 +46,7 @@ import android.util.LruCache; import com.android.settingslib.R; +import java.util.ArrayList; import java.util.Map; @@ -79,10 +80,15 @@ public class AccessPoint implements Comparable<AccessPoint> { * For now this data is used only with Verbose Logging so as to show the band and number * of BSSIDs on which that network is seen. */ - public LruCache<String, ScanResult> mScanResultCache; + public LruCache<String, ScanResult> mScanResultCache = new LruCache<String, ScanResult>(32); + private static final String KEY_NETWORKINFO = "key_networkinfo"; private static final String KEY_WIFIINFO = "key_wifiinfo"; private static final String KEY_SCANRESULT = "key_scanresult"; + private static final String KEY_SSID = "key_ssid"; + private static final String KEY_SECURITY = "key_security"; + private static final String KEY_PSKTYPE = "key_psktype"; + private static final String KEY_SCANRESULTCACHE = "key_scanresultcache"; private static final String KEY_CONFIG = "key_config"; /** @@ -108,7 +114,6 @@ public class AccessPoint implements Comparable<AccessPoint> { private int pskType = PSK_UNKNOWN; private WifiConfiguration mConfig; - private ScanResult mScanResult; private int mRssi = Integer.MAX_VALUE; private long mSeen = 0; @@ -125,20 +130,35 @@ public class AccessPoint implements Comparable<AccessPoint> { if (mConfig != null) { loadConfig(mConfig); } - mScanResult = (ScanResult) savedState.getParcelable(KEY_SCANRESULT); - if (mScanResult != null) { - loadResult(mScanResult); + if (savedState.containsKey(KEY_SSID)) { + ssid = savedState.getString(KEY_SSID); + } + if (savedState.containsKey(KEY_SECURITY)) { + security = savedState.getInt(KEY_SECURITY); + } + if (savedState.containsKey(KEY_PSKTYPE)) { + pskType = savedState.getInt(KEY_PSKTYPE); } mInfo = (WifiInfo) savedState.getParcelable(KEY_WIFIINFO); if (savedState.containsKey(KEY_NETWORKINFO)) { mNetworkInfo = savedState.getParcelable(KEY_NETWORKINFO); } + if (savedState.containsKey(KEY_SCANRESULTCACHE)) { + ArrayList<ScanResult> scanResultArrayList = + savedState.getParcelableArrayList(KEY_SCANRESULTCACHE); + mScanResultCache.evictAll(); + for (ScanResult result : scanResultArrayList) { + mScanResultCache.put(result.BSSID, result); + } + } update(mInfo, mNetworkInfo); + mRssi = getRssi(); + mSeen = getSeen(); } AccessPoint(Context context, ScanResult result) { mContext = context; - loadResult(result); + initWithScanResult(result); } AccessPoint(Context context, WifiConfiguration config) { @@ -240,6 +260,28 @@ public class AccessPoint implements Comparable<AccessPoint> { return WifiManager.calculateSignalLevel(mRssi, 4); } + public int getRssi() { + int rssi = Integer.MIN_VALUE; + for (ScanResult result : mScanResultCache.snapshot().values()) { + if (result.level > rssi) { + rssi = result.level; + } + } + + return rssi; + } + + public long getSeen() { + long seen = 0; + for (ScanResult result : mScanResultCache.snapshot().values()) { + if (result.timestamp > seen) { + seen = result.timestamp; + } + } + + return seen; + } + public NetworkInfo getNetworkInfo() { return mNetworkInfo; } @@ -455,120 +497,109 @@ public class AccessPoint implements Comparable<AccessPoint> { visibility.append(String.format("rx=%.1f", mInfo.rxSuccessRate)); } - if (mScanResultCache != null) { - int rssi5 = WifiConfiguration.INVALID_RSSI; - int rssi24 = WifiConfiguration.INVALID_RSSI; - int num5 = 0; - int num24 = 0; - int numBlackListed = 0; - int n24 = 0; // Number scan results we included in the string - int n5 = 0; // Number scan results we included in the string - Map<String, ScanResult> list = mScanResultCache.snapshot(); - // TODO: sort list by RSSI or age - for (ScanResult result : list.values()) { - if (result.seen == 0) - continue; - - if (result.autoJoinStatus != ScanResult.ENABLED) numBlackListed++; - - if (result.frequency >= LOWER_FREQ_5GHZ - && result.frequency <= HIGHER_FREQ_5GHZ) { - // Strictly speaking: [4915, 5825] - // number of known BSSID on 5GHz band - num5 = num5 + 1; - } else if (result.frequency >= LOWER_FREQ_24GHZ - && result.frequency <= HIGHER_FREQ_24GHZ) { - // Strictly speaking: [2412, 2482] - // number of known BSSID on 2.4Ghz band - num24 = num24 + 1; - } + int rssi5 = WifiConfiguration.INVALID_RSSI; + int rssi24 = WifiConfiguration.INVALID_RSSI; + int num5 = 0; + int num24 = 0; + int numBlackListed = 0; + int n24 = 0; // Number scan results we included in the string + int n5 = 0; // Number scan results we included in the string + Map<String, ScanResult> list = mScanResultCache.snapshot(); + // TODO: sort list by RSSI or age + for (ScanResult result : list.values()) { + if (result.seen == 0) + continue; + + if (result.autoJoinStatus != ScanResult.ENABLED) numBlackListed++; + + if (result.frequency >= LOWER_FREQ_5GHZ + && result.frequency <= HIGHER_FREQ_5GHZ) { + // Strictly speaking: [4915, 5825] + // number of known BSSID on 5GHz band + num5 = num5 + 1; + } else if (result.frequency >= LOWER_FREQ_24GHZ + && result.frequency <= HIGHER_FREQ_24GHZ) { + // Strictly speaking: [2412, 2482] + // number of known BSSID on 2.4Ghz band + num24 = num24 + 1; + } - // Ignore results seen, older than 20 seconds - if (now - result.seen > VISIBILITY_OUTDATED_AGE_IN_MILLI) continue; + // Ignore results seen, older than 20 seconds + if (now - result.seen > VISIBILITY_OUTDATED_AGE_IN_MILLI) continue; - if (result.frequency >= LOWER_FREQ_5GHZ - && result.frequency <= HIGHER_FREQ_5GHZ) { - if (result.level > rssi5) { - rssi5 = result.level; - } - if (n5 < 4) { - if (scans5GHz == null) scans5GHz = new StringBuilder(); - scans5GHz.append(" \n{").append(result.BSSID); - if (bssid != null && result.BSSID.equals(bssid)) scans5GHz.append("*"); - scans5GHz.append("=").append(result.frequency); - scans5GHz.append(",").append(result.level); - if (result.autoJoinStatus != 0) { - scans5GHz.append(",st=").append(result.autoJoinStatus); - } - if (result.numIpConfigFailures != 0) { - scans5GHz.append(",ipf=").append(result.numIpConfigFailures); - } - scans5GHz.append("}"); - n5++; - } - } else if (result.frequency >= LOWER_FREQ_24GHZ - && result.frequency <= HIGHER_FREQ_24GHZ) { - if (result.level > rssi24) { - rssi24 = result.level; + if (result.frequency >= LOWER_FREQ_5GHZ + && result.frequency <= HIGHER_FREQ_5GHZ) { + if (result.level > rssi5) { + rssi5 = result.level; + } + if (n5 < 4) { + if (scans5GHz == null) scans5GHz = new StringBuilder(); + scans5GHz.append(" \n{").append(result.BSSID); + if (bssid != null && result.BSSID.equals(bssid)) scans5GHz.append("*"); + scans5GHz.append("=").append(result.frequency); + scans5GHz.append(",").append(result.level); + if (result.autoJoinStatus != 0) { + scans5GHz.append(",st=").append(result.autoJoinStatus); } - if (n24 < 4) { - if (scans24GHz == null) scans24GHz = new StringBuilder(); - scans24GHz.append(" \n{").append(result.BSSID); - if (bssid != null && result.BSSID.equals(bssid)) scans24GHz.append("*"); - scans24GHz.append("=").append(result.frequency); - scans24GHz.append(",").append(result.level); - if (result.autoJoinStatus != 0) { - scans24GHz.append(",st=").append(result.autoJoinStatus); - } - if (result.numIpConfigFailures != 0) { - scans24GHz.append(",ipf=").append(result.numIpConfigFailures); - } - scans24GHz.append("}"); - n24++; + if (result.numIpConfigFailures != 0) { + scans5GHz.append(",ipf=").append(result.numIpConfigFailures); } + scans5GHz.append("}"); + n5++; } - } - visibility.append(" ["); - if (num24 > 0) { - visibility.append("(").append(num24).append(")"); - if (n24 <= 4) { - if (scans24GHz != null) { - visibility.append(scans24GHz.toString()); + } else if (result.frequency >= LOWER_FREQ_24GHZ + && result.frequency <= HIGHER_FREQ_24GHZ) { + if (result.level > rssi24) { + rssi24 = result.level; + } + if (n24 < 4) { + if (scans24GHz == null) scans24GHz = new StringBuilder(); + scans24GHz.append(" \n{").append(result.BSSID); + if (bssid != null && result.BSSID.equals(bssid)) scans24GHz.append("*"); + scans24GHz.append("=").append(result.frequency); + scans24GHz.append(",").append(result.level); + if (result.autoJoinStatus != 0) { + scans24GHz.append(",st=").append(result.autoJoinStatus); } - } else { - visibility.append("max=").append(rssi24); - if (scans24GHz != null) { - visibility.append(",").append(scans24GHz.toString()); + if (result.numIpConfigFailures != 0) { + scans24GHz.append(",ipf=").append(result.numIpConfigFailures); } + scans24GHz.append("}"); + n24++; } } - visibility.append(";"); - if (num5 > 0) { - visibility.append("(").append(num5).append(")"); - if (n5 <= 4) { - if (scans5GHz != null) { - visibility.append(scans5GHz.toString()); - } - } else { - visibility.append("max=").append(rssi5); - if (scans5GHz != null) { - visibility.append(",").append(scans5GHz.toString()); - } + } + visibility.append(" ["); + if (num24 > 0) { + visibility.append("(").append(num24).append(")"); + if (n24 <= 4) { + if (scans24GHz != null) { + visibility.append(scans24GHz.toString()); + } + } else { + visibility.append("max=").append(rssi24); + if (scans24GHz != null) { + visibility.append(",").append(scans24GHz.toString()); } } - if (numBlackListed > 0) - visibility.append("!").append(numBlackListed); - visibility.append("]"); - } else { - if (mRssi != Integer.MAX_VALUE) { - visibility.append(" rssi="); - visibility.append(mRssi); - if (mScanResult != null) { - visibility.append(", f="); - visibility.append(mScanResult.frequency); + } + visibility.append(";"); + if (num5 > 0) { + visibility.append("(").append(num5).append(")"); + if (n5 <= 4) { + if (scans5GHz != null) { + visibility.append(scans5GHz.toString()); + } + } else { + visibility.append("max=").append(rssi5); + if (scans5GHz != null) { + visibility.append(",").append(scans5GHz.toString()); } } } + if (numBlackListed > 0) + visibility.append("!").append(numBlackListed); + visibility.append("]"); return visibility.toString(); } @@ -635,28 +666,29 @@ public class AccessPoint implements Comparable<AccessPoint> { ssid = config.providerFriendlyName; else ssid = (config.SSID == null ? "" : removeDoubleQuotes(config.SSID)); - + security = getSecurity(config); networkId = config.networkId; mConfig = config; } - private void loadResult(ScanResult result) { + private void initWithScanResult(ScanResult result) { ssid = result.SSID; security = getSecurity(result); if (security == SECURITY_PSK) pskType = getPskType(result); mRssi = result.level; - mScanResult = result; - if (result.seen > mSeen) { - mSeen = result.seen; - } + mSeen = result.timestamp; } public void saveWifiState(Bundle savedState) { - savedState.putParcelable(KEY_CONFIG, mConfig); - savedState.putParcelable(KEY_SCANRESULT, mScanResult); + if (ssid != null) savedState.putString(KEY_SSID, getSsidStr()); + savedState.putInt(KEY_SECURITY, security); + savedState.putInt(KEY_PSKTYPE, pskType); + if (mConfig != null) savedState.putParcelable(KEY_CONFIG, mConfig); savedState.putParcelable(KEY_WIFIINFO, mInfo); + savedState.putParcelableArrayList(KEY_SCANRESULTCACHE, + new ArrayList<ScanResult>(mScanResultCache.snapshot().values())); if (mNetworkInfo != null) { savedState.putParcelable(KEY_NETWORKINFO, mNetworkInfo); } @@ -667,32 +699,31 @@ public class AccessPoint implements Comparable<AccessPoint> { } boolean update(ScanResult result) { - if (result.seen > mSeen) { - mSeen = result.seen; - } - if (WifiTracker.sVerboseLogging > 0) { - if (mScanResultCache == null) { - mScanResultCache = new LruCache<String, ScanResult>(32); - } + if (ssid.equals(result.SSID) && security == getSecurity(result)) { + /* Update the LRU timestamp, if BSSID exists */ + mScanResultCache.get(result.BSSID); + + /* Add or update the scan result for the BSSID */ mScanResultCache.put(result.BSSID, result); - } - if (ssid.equals(result.SSID) && security == getSecurity(result)) { - if (WifiManager.compareSignalLevel(result.level, mRssi) > 0) { - int oldLevel = getLevel(); - mRssi = result.level; - if (getLevel() != oldLevel && mAccessPointListener != null) { - mAccessPointListener.onLevelChanged(this); - } + int oldLevel = getLevel(); + int oldRssi = getRssi(); + mSeen = getSeen(); + mRssi = (getRssi() + oldRssi)/2; + int newLevel = getLevel(); + + if (newLevel > 0 && newLevel != oldLevel && mAccessPointListener != null) { + mAccessPointListener.onLevelChanged(this); } // This flag only comes from scans, is not easily saved in config if (security == SECURITY_PSK) { pskType = getPskType(result); } - mScanResult = result; + if (mAccessPointListener != null) { mAccessPointListener.onAccessPointChanged(this); } + return true; } return false; diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java index 19be4a5f91fa..f4e4ea16c7ff 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java @@ -28,6 +28,7 @@ import android.net.wifi.WifiManager; import android.os.Handler; import android.os.Looper; import android.os.Message; +import android.util.Log; import android.widget.Toast; import com.android.internal.annotations.VisibleForTesting; @@ -35,9 +36,12 @@ import com.android.settingslib.R; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; /** @@ -45,6 +49,7 @@ import java.util.concurrent.atomic.AtomicBoolean; */ public class WifiTracker { private static final String TAG = "WifiTracker"; + private static final boolean DBG = false; /** verbose logging flag. this flag is set thru developer debugging options * and used so as to assist with in-the-field WiFi connectivity debugging */ @@ -70,6 +75,10 @@ public class WifiTracker { private boolean mSavedNetworksExist; private boolean mRegistered; private ArrayList<AccessPoint> mAccessPoints = new ArrayList<>(); + private HashMap<String, Integer> mSeenBssids = new HashMap<>(); + private HashMap<String, ScanResult> mScanResultCache = new HashMap<>(); + private Integer mScanId = 0; + private static final int NUM_SCANS_TO_CONFIRM_AP_LOSS = 3; private NetworkInfo mLastNetworkInfo; private WifiInfo mLastInfo; @@ -166,6 +175,11 @@ public class WifiTracker { if (mScanner == null) { mScanner = new Scanner(); } + + mScanResultCache.clear(); + mSeenBssids.clear(); + mScanId = 0; + if (mWifiManager.isWifiEnabled()) { mScanner.resume(); } @@ -237,6 +251,33 @@ public class WifiTracker { } } + private Collection<ScanResult> fetchScanResults() { + mScanId++; + final List<ScanResult> newResults = mWifiManager.getScanResults(); + for (ScanResult newResult : newResults) { + mScanResultCache.put(newResult.BSSID, newResult); + mSeenBssids.put(newResult.BSSID, mScanId); + } + + if (mScanId > NUM_SCANS_TO_CONFIRM_AP_LOSS) { + if (DBG) Log.d(TAG, "------ Dumping SSIDs that were expired on this scan ------"); + Integer threshold = mScanId - NUM_SCANS_TO_CONFIRM_AP_LOSS; + for (Iterator<Map.Entry<String, Integer>> it = mSeenBssids.entrySet().iterator(); + it.hasNext(); /* nothing */) { + Map.Entry<String, Integer> e = it.next(); + if (e.getValue() < threshold) { + ScanResult result = mScanResultCache.get(e.getKey()); + if (DBG) Log.d(TAG, "Removing " + e.getKey() + ":(" + result.SSID + ")"); + mScanResultCache.remove(e.getKey()); + it.remove(); + } + } + if (DBG) Log.d(TAG, "---- Done Dumping SSIDs that were expired on this scan ----"); + } + + return mScanResultCache.values(); + } + private void updateAccessPoints() { // Swap the current access points into a cached list. List<AccessPoint> cachedAccessPoints = getAccessPoints(); @@ -283,7 +324,7 @@ public class WifiTracker { } } - final List<ScanResult> results = mWifiManager.getScanResults(); + final Collection<ScanResult> results = fetchScanResults(); if (results != null) { for (ScanResult result : results) { // Ignore hidden and ad-hoc networks. @@ -328,6 +369,24 @@ public class WifiTracker { // Pre-sort accessPoints to speed preference insertion Collections.sort(accessPoints); + + // Log accesspoints that were deleted + if (DBG) Log.d(TAG, "------ Dumping SSIDs that were not seen on this scan ------"); + for (AccessPoint prevAccessPoint : mAccessPoints) { + if (prevAccessPoint.getSsid() == null) continue; + String prevSsid = prevAccessPoint.getSsidStr(); + boolean found = false; + for (AccessPoint newAccessPoint : accessPoints) { + if (newAccessPoint.getSsid() != null && newAccessPoint.getSsid().equals(prevSsid)) { + found = true; + break; + } + } + if (!found) + if (DBG) Log.d(TAG, "Did not find " + prevSsid + " in this scan"); + } + if (DBG) Log.d(TAG, "---- Done dumping SSIDs that were not seen on this scan ----"); + mAccessPoints = accessPoints; mMainHandler.sendEmptyMessage(MainHandler.MSG_ACCESS_POINT_CHANGED); } diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 640fb2922f29..9832b45d8ab3 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -128,7 +128,7 @@ <activity android:name=".BugreportWarningActivity" - android:theme="@*android:style/Theme.Material.DayNight.Dialog.Alert" + android:theme="@*android:style/Theme.DeviceDefault.Light.Dialog.Alert" android:finishOnCloseSystemDialogs="true" android:excludeFromRecents="true" android:exported="false" /> diff --git a/packages/Shell/src/com/android/shell/BugreportReceiver.java b/packages/Shell/src/com/android/shell/BugreportReceiver.java index 13747ed99820..0c84fa148e7f 100644 --- a/packages/Shell/src/com/android/shell/BugreportReceiver.java +++ b/packages/Shell/src/com/android/shell/BugreportReceiver.java @@ -27,6 +27,7 @@ import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.content.res.Configuration; import android.net.Uri; import android.os.AsyncTask; import android.os.FileUtils; @@ -77,21 +78,12 @@ public class BugreportReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { + final Configuration conf = context.getResources().getConfiguration(); final File bugreportFile = getFileExtra(intent, EXTRA_BUGREPORT); final File screenshotFile = getFileExtra(intent, EXTRA_SCREENSHOT); - // Files are kept on private storage, so turn into Uris that we can - // grant temporary permissions for. - final Uri bugreportUri = FileProvider.getUriForFile(context, AUTHORITY, bugreportFile); - final Uri screenshotUri = FileProvider.getUriForFile(context, AUTHORITY, screenshotFile); - - boolean isPlainText = bugreportFile.getName().toLowerCase().endsWith(".txt"); - if (!isPlainText) { - // Already zipped, send it right away. - sendBugreportNotification(context, bugreportFile, screenshotFile); - } else { - // Asynchronously zip the file first, then send it. - sendZippedBugreportNotification(context, bugreportFile, screenshotFile); + if ((conf.uiMode & Configuration.UI_MODE_TYPE_MASK) != Configuration.UI_MODE_TYPE_WATCH) { + triggerLocalNotification(context, bugreportFile, screenshotFile); } // Clean up older bugreports in background @@ -107,6 +99,29 @@ public class BugreportReceiver extends BroadcastReceiver { }.execute(); } + /** + * Responsible for triggering a notification that allows the user to start a + * "share" intent with the bug report. On watches we have other methods to allow the user to + * start this intent (usually by triggering it on another connected device); we don't need to + * display the notification in this case. + */ + private void triggerLocalNotification(final Context context, final File bugreportFile, + final File screenshotFile) { + // Files are kept on private storage, so turn into Uris that we can + // grant temporary permissions for. + final Uri bugreportUri = FileProvider.getUriForFile(context, AUTHORITY, bugreportFile); + final Uri screenshotUri = FileProvider.getUriForFile(context, AUTHORITY, screenshotFile); + + boolean isPlainText = bugreportFile.getName().toLowerCase().endsWith(".txt"); + if (!isPlainText) { + // Already zipped, send it right away. + sendBugreportNotification(context, bugreportFile, screenshotFile); + } else { + // Asynchronously zip the file first, then send it. + sendZippedBugreportNotification(context, bugreportFile, screenshotFile); + } + } + private static Intent buildWarningIntent(Context context, Intent sendIntent) { final Intent intent = new Intent(context, BugreportWarningActivity.class); intent.putExtra(Intent.EXTRA_INTENT, sendIntent); diff --git a/packages/SystemUI/res/drawable/managed_profile_toast_background.xml b/packages/SystemUI/res/drawable/managed_profile_toast_background.xml deleted file mode 100644 index 5c77b9a1f660..000000000000 --- a/packages/SystemUI/res/drawable/managed_profile_toast_background.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Copyright (C) 2015 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <corners android:radius="2dp" /> - <solid android:color="@color/managed_profile_toast_background" /> -</shape> diff --git a/packages/SystemUI/res/interpolator/assist_disclosure_trace.xml b/packages/SystemUI/res/interpolator/assist_disclosure_trace.xml new file mode 100644 index 000000000000..6b5cd37b7bf3 --- /dev/null +++ b/packages/SystemUI/res/interpolator/assist_disclosure_trace.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2015 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> + +<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android" + android:controlX1="0.6" + android:controlY1="0" + android:controlX2="0.7" + android:controlY2="1"/>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/keyguard_bottom_area.xml b/packages/SystemUI/res/layout/keyguard_bottom_area.xml index 48af5657ef1c..1488ad6342bc 100644 --- a/packages/SystemUI/res/layout/keyguard_bottom_area.xml +++ b/packages/SystemUI/res/layout/keyguard_bottom_area.xml @@ -68,7 +68,6 @@ android:layout_height="@dimen/keyguard_affordance_height" android:layout_gravity="bottom|center_horizontal" android:src="@drawable/ic_lock_24dp" - android:scaleType="center" - android:contentDescription="@string/accessibility_unlock_button" /> + android:scaleType="center" /> </com.android.systemui.statusbar.phone.KeyguardBottomAreaView> diff --git a/packages/SystemUI/res/layout/managed_profile_toast.xml b/packages/SystemUI/res/layout/managed_profile_toast.xml deleted file mode 100644 index 5a01ca7f16a6..000000000000 --- a/packages/SystemUI/res/layout/managed_profile_toast.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2015 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:paddingTop="16dp" - android:paddingBottom="16dp" - android:paddingLeft="32dp" - android:paddingRight="32dp" - android:background="@drawable/managed_profile_toast_background"> - <ImageView - android:layout_width="32dp" - android:layout_height="32dp" - android:layout_gravity="center_horizontal" - android:layout_marginBottom="16dp" - android:src="@drawable/stat_sys_managed_profile_status"/> - <TextView android:text="@string/managed_profile_foreground_toast" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textColor="@android:color/white" - android:textSize="14sp" - android:layout_gravity="center_horizontal" /> -</LinearLayout> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 55d4c16200f3..444f438fea4f 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Foon"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Stembystand"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Ontsluit"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"ontsluit"</string> <string name="phone_label" msgid="2320074140205331708">"maak foon oop"</string> <string name="voice_assist_label" msgid="3956854378310019854">"maak stembystand oop"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Gly links vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Jy sal nie deur klanke en vibrasies gesteur word nie, afgesien van wekkers, onthounotas, gebeurtenisse en bellers wat jy spesifiseer."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Pasmaak"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Dit blokkeer ALLE klanke en virbrasies, insluitend van wekkers, musiek, video\'s en speletjies af. Jy sal steeds foonoproepe kan maak."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Minder dringende kennisgewings hieronder"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Raak weer om oop te maak"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index e8a12eb01536..9a68f1ef0ff9 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"ስልክ"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"የድምጽ እርዳታ"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"ክፈት"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"ክፈት"</string> <string name="phone_label" msgid="2320074140205331708">"ስልክ ክፈት"</string> <string name="voice_assist_label" msgid="3956854378310019854">"የድምጽ ረዳትን ክፈት"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ግራ አንሸራትት።"</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"እርስዎ ከገለጿቸው ማንቂያዎች፣ አስታዋሾች፣ ክስተቶች እና ደዋዮች በስተቀር በድምጾች እና ንዝረቶች አይረበሹም።"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"አብጅ"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"ይሄ ከማንቂያዎች፣ ሙዚቃ፣ ቪዲዮዎች እና ጨዋታዎች የመጡትንም ጨምሮ ሁሉንም ድምጾች እና ንዝረቶች ያግዳል። አሁንም የድምጽ ጥሪዎችን ማድረግ ይችላሉ።"</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"በጣም አስቸካይ ያልሆኑ ማሳወቂያዎች ከታች"</string> <string name="notification_tap_again" msgid="8524949573675922138">"ለመክፈት ዳግም ይንኩ"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 59b1bb375e54..e0fb2f00697a 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -91,6 +91,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"الهاتف"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"المساعد الصوتي"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"إلغاء القفل"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"إلغاء القفل"</string> <string name="phone_label" msgid="2320074140205331708">"فتح الهاتف"</string> <string name="voice_assist_label" msgid="3956854378310019854">"فتح المساعد الصوتي"</string> @@ -316,7 +320,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"تمرير لليسار لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"لن يتم إزعاجك بأصوات أو اهتزاز، عدا من التنبيهات والتذكيرات والأحداث والمتصلين الذين تحددهم."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"تخصيص"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"سيؤدي هذا إلى حظر جميع الأصوات والاهتزازات، بما في ذلك ما يرد من التنبيهات والموسيقى والفيديو والألعاب. إلا أنه سيظل بإمكانك إجراء مكالمات هاتفية."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"الإشعارات الأقل إلحاحًا أدناه"</string> <string name="notification_tap_again" msgid="8524949573675922138">"المس مرة أخرى للفتح"</string> diff --git a/packages/SystemUI/res/values-az-rAZ/strings.xml b/packages/SystemUI/res/values-az-rAZ/strings.xml index d67192b2906a..6f0eb1f933ee 100644 --- a/packages/SystemUI/res/values-az-rAZ/strings.xml +++ b/packages/SystemUI/res/values-az-rAZ/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Səs Yardımçısı"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Kiliddən çıxarın"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"kiliddən çıxarın"</string> <string name="phone_label" msgid="2320074140205331708">"telefonu açın"</string> <string name="voice_assist_label" msgid="3956854378310019854">"səs yardımçısını açın"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün sola sürüşdür."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Zəng, xatırlatma, hadisə və seçdiyiniz zəng edənlər istisna olmaqla səs və vibrasiya Sizi narahat etməyəcək."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Fərdiləşdirin"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Bu, zəng, musiqi, video və oyunlar daxil olmaqla BÜTÜN səs və vibrasiyanı bloklayır."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Daha az təcili bildirişlər aşağıdadır"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Touch again to open"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 0f04afe3811f..e542b20f5330 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Телефон"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Гласова помощ"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Отключване"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"отключване"</string> <string name="phone_label" msgid="2320074140205331708">"отваряне на телефона"</string> <string name="voice_assist_label" msgid="3956854378310019854">"отваряне на гласовата помощ"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Плъзнете наляво за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Няма да бъдете обезпокоявани от звуци и вибрирания, различни от будилници, напомняния, събития и обаждания от посочени от вас контакти."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Персонализиране"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Този режим блокира ВСИЧКИ звуци и вибрирания, включително от будилници, музика, видеоклипове и игри. Пак ще можете да извършвате телефонни обаждания."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Ппоказване на по-малко спешните известия по-долу"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Докоснете отново за отваряне"</string> diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml index a1fc870b8add..bb3375bee3c5 100644 --- a/packages/SystemUI/res/values-bn-rBD/strings.xml +++ b/packages/SystemUI/res/values-bn-rBD/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"ফোন"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"ভয়েস সহায়তা"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"আনলক করুন"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"আনলক করুন"</string> <string name="phone_label" msgid="2320074140205331708">"ফোন খুলুন"</string> <string name="voice_assist_label" msgid="3956854378310019854">"ভয়েস সহায়তা খুলুন"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য বাম দিকে স্লাইড করুন৷"</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"আপনার নির্দিষ্ট অ্যালার্ম, অনুস্মারক, ইভেন্ট, এবং কলারগুলি ব্যতীত আপনাকে শব্দ এবং কম্পনগুলির দ্বারা বিরক্ত করা হবে না৷"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"কাস্টমাইজ করুন"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"এটি অ্যালার্ম, সংগীত, ভিডিও এবং গেমগুলি থেকে আসা সমস্ত রকমের ধ্বনি এবং কম্পনগুলিকে বন্ধ করে৷ আপনি এখনও ফোন কলগুলি করতে পারবেন৷"</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"নিচে অপেক্ষাকৃত কম জরুরী বিজ্ঞপ্তিগুলি"</string> <string name="notification_tap_again" msgid="8524949573675922138">"খোলার জন্য আবার স্পর্শ করুন"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 7c25000c501f..33efaebce381 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telèfon"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Assistència per veu"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Desbloqueja"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"desbloqueja"</string> <string name="phone_label" msgid="2320074140205331708">"obre el telèfon"</string> <string name="voice_assist_label" msgid="3956854378310019854">"obre l\'assistència per veu"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Llisca cap a l\'esquerra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"No t\'interromprà cap so ni cap vibració, tret dels que produeixin les alarmes, els recordatoris, els esdeveniments i les trucades de les persones que especifiquis."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalitza"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Es bloquejaran TOTS els sons i totes les vibracions, inclosos les alarmes, la música, els vídeos i els jocs. Tot i això, encara podràs fer trucades."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificacions menys urgents a continuació"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Torna a tocar per obrir"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index fc90efce6ef2..c7f19a3133ea 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -89,6 +89,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Hlasová asistence"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Odemknout"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"odemknout"</string> <string name="phone_label" msgid="2320074140205331708">"otevřít telefon"</string> <string name="voice_assist_label" msgid="3956854378310019854">"otevřít hlasovou asistenci"</string> @@ -316,7 +320,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Přejeďte prstem doleva: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Nebudou vás rušit zvuky ani vibrace s výjimkou budíků, upozornění, událostí a volajících, které zadáte."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Přizpůsobit"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"V tomto režimu budou blokovány VŠECHNY zvuky a vibrace, včetně těch z budíků, hudby, videí a her. Telefonovat budete moci i nadále."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Méně urgentní oznámení níže"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Otevřete opětovným klepnutím"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 0832ab7d54ef..88b85267c292 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Voice Assist"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Lås op"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"lås op"</string> <string name="phone_label" msgid="2320074140205331708">"åbn telefon"</string> <string name="voice_assist_label" msgid="3956854378310019854">"åbn voice assist"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Glid til venstre for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Du bliver ikke forstyrret af lyde og vibrationer undtagen fra de alarmer, påmindelser, begivenheder og opkaldere, som du angiver."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Tilpas"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Dette blokerer ALLE lyde og vibrationer, herunder fra alarmer, musik, videoer og spil. Du vil stadig kunne foretage telefonopkald."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Mindre presserende underretninger nedenfor"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Tryk igen for at åbne"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 38fa55eafe09..a87eec058963 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefonnummer"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Sprachassistent"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Entsperren"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"Entsperren"</string> <string name="phone_label" msgid="2320074140205331708">"Telefon öffnen"</string> <string name="voice_assist_label" msgid="3956854378310019854">"Sprachassistent öffnen"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach links schieben"</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Klingeltöne und die Vibration werden deaktiviert, außer für Weckrufe, Erinnerungen, Termine sowie Anrufe von zuvor von Ihnen festgelegten Personen."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Anpassen"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Hierdurch werden alle Klingeltöne und Vibrationsalarme stummgeschaltet, auch für Weckrufe, Musik, Videos und Spiele. Anrufe können Sie jedoch weiterhin tätigen."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Weniger dringende Benachrichtigungen unten"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Zum Öffnen erneut berühren"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index c78690244db7..cacf3b83fd2b 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Τηλέφωνο"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Φωνητική υποβοήθηση"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Ξεκλείδωμα"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"ξεκλείδωμα"</string> <string name="phone_label" msgid="2320074140205331708">"άνοιγμα τηλεφώνου"</string> <string name="voice_assist_label" msgid="3956854378310019854">"άνοιγμα φωνητικής υποβοήθησης"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Κύλιση προς τα αριστερά για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Δεν θα διακόπτεστε από ήχους και δονήσεις, με εξαίρεση τα ξυπνητήρια, τις υπενθυμίσεις, τα συμβάντα και τους καλούντες που έχετε ορίσει."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Προσαρμογή"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Αυτή η επιλογή αποκλείει ΟΛΟΥΣ τους ήχους και τις δονήσεις, μεταξύ των οποίων των ξυπνητηριών, της μουσικής, των βίντεο και των παιχνιδιών. Θα εξακολουθείτε να είστε σε θέση να πραγματοποιήσετε τηλεφωνικές κλήσεις."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Λιγότερο επείγουσες ειδοποιήσεις παρακάτω"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Αγγίξτε ξανά για άνοιγμα"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 02b7b0a89c50..07ac57af0d0a 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Phone"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Voice Assist"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Unlock"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"unlock"</string> <string name="phone_label" msgid="2320074140205331708">"open phone"</string> <string name="voice_assist_label" msgid="3956854378310019854">"open voice assist"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"You won’t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers that you specify."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Customise"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"This blocks ALL sounds and vibrations, including from alarms, music, videos and games. You’ll still be able to make phone calls."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Less urgent notifications below"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Touch again to open"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 02b7b0a89c50..07ac57af0d0a 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Phone"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Voice Assist"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Unlock"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"unlock"</string> <string name="phone_label" msgid="2320074140205331708">"open phone"</string> <string name="voice_assist_label" msgid="3956854378310019854">"open voice assist"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"You won’t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers that you specify."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Customise"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"This blocks ALL sounds and vibrations, including from alarms, music, videos and games. You’ll still be able to make phone calls."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Less urgent notifications below"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Touch again to open"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 02b7b0a89c50..07ac57af0d0a 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Phone"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Voice Assist"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Unlock"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"unlock"</string> <string name="phone_label" msgid="2320074140205331708">"open phone"</string> <string name="voice_assist_label" msgid="3956854378310019854">"open voice assist"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"You won’t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers that you specify."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Customise"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"This blocks ALL sounds and vibrations, including from alarms, music, videos and games. You’ll still be able to make phone calls."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Less urgent notifications below"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Touch again to open"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index f8d55fe18646..7ccb0ae049d2 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Teléfono"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Asistente voz"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Desbloquear"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"desbloquear"</string> <string name="phone_label" msgid="2320074140205331708">"abrir teléfono"</string> <string name="voice_assist_label" msgid="3956854378310019854">"abrir el asistente de voz"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Desliza el dedo hacia la izquierda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"No te molestarán los sonidos ni las vibraciones, excepto que se trate de alarmas, recordatorios, eventos y emisores que especifiques."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Esta acción bloquea TODOS los sonidos y las vibraciones, incluidas las que provienen de alarmas, videos y juegos. Podrás realizar llamadas telefónicas."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificaciones menos urgentes abajo"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Vuelve a tocar para abrir."</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 2ef2ab48cd2b..35637123f9cf 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Teléfono"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Asistente voz"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Desbloquear"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"desbloquear"</string> <string name="phone_label" msgid="2320074140205331708">"abrir teléfono"</string> <string name="voice_assist_label" msgid="3956854378310019854">"abrir el asistente de voz"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Desliza el dedo hacia la izquierda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"No te interrumpirán sonidos ni vibraciones, salvo los de las alarmas, los recordatorios, los eventos y las llamadas que especifiques."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Esta opción bloqueará TODOS los sonidos y todas las vibraciones, por ejemplo, los vídeos, los juegos, las alarmas y la música. Seguirás pudiendo hacer llamadas de teléfono."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificaciones menos urgente abajo"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Vuelve a tocar para abrir"</string> diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml index 4126325e3e45..6da66934a5b3 100644 --- a/packages/SystemUI/res/values-et-rEE/strings.xml +++ b/packages/SystemUI/res/values-et-rEE/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Häälabi"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Luku avamine"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"ava lukk"</string> <string name="phone_label" msgid="2320074140205331708">"ava telefon"</string> <string name="voice_assist_label" msgid="3956854378310019854">"ava häälabi"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Lohistage vasakule: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Teid segatakse helide ja värinaga vaid teie määratud alarmide, meeldetuletuste, sündmuste ning helistajate puhul."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Kohanda"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"See blokeerib KÕIK helid ja värinad, sh alarmide, muusika, videote ja mängude omad. Saate siiski helistada."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Vähem kiireloomulised märguanded on allpool"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Avamiseks puudutage uuesti"</string> diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml index 42a285b491b5..ef8f6e2febc3 100644 --- a/packages/SystemUI/res/values-eu-rES/strings.xml +++ b/packages/SystemUI/res/values-eu-rES/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefonoa"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Ahots-laguntza"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Desblokeatu"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"desblokeatu"</string> <string name="phone_label" msgid="2320074140205331708">"ireki telefonoan"</string> <string name="voice_assist_label" msgid="3956854378310019854">"ireki ahots-laguntza"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Lerratu ezkerrera hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Soinuek eta dardarek ez zaituzte eragotziko, zehazten dituzun alarmek, abisuek, gertaerek eta deitzaileek izan ezik."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Pertsonalizatu"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Soinu eta dardara GUZTIAK blokeatzen dira, besteak beste, alarmak, musika, bideoak eta jokoak. Telefono-deiak egiteko aukera izaten jarraituko duzu."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Horren premiazkoak ez diren jakinarazpenak daude behean"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Irekitzeko, ukitu berriro"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 9b0195a83343..ce005e310f6a 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"تلفن"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"دستیار صوتی"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"باز کردن قفل"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"بازکردن قفل"</string> <string name="phone_label" msgid="2320074140205331708">"باز کردن تلفن"</string> <string name="voice_assist_label" msgid="3956854378310019854">"«دستیار صوتی» را باز کنید"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"لغزاندن به چپ برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"صداها و لرزشهایی به جز هشدارها، یادآوریها، رویدادها و تماسگیرندههایی که مشخص میکنید، مزاحم شما نمیشوند."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"سفارشی کردن"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"این کار «همه» صداها و لرزشها از جمله هشدارها، موسیقی، ویدیوها و بازیها را مسدود میکند. همچنان میتوانید تماس تلفنی برقرار کنید."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"اعلانهای کمتر فوری در زیر"</string> <string name="notification_tap_again" msgid="8524949573675922138">"برای باز کردن دوباره لمس کنید"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 2d2cd024a6fb..633484c8f711 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Puhelin"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Ääniapuri"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Avaa lukitus"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"avaa lukitus"</string> <string name="phone_label" msgid="2320074140205331708">"avaa puhelin"</string> <string name="voice_assist_label" msgid="3956854378310019854">"Avaa ääniapuri"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Liu\'uta vasemmalle ja <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Äänet ja värinät eivät häiritse sinua, paitsi jos ne ovat hälytyksiä, muistutuksia, tapahtumia tai määrittämiäsi soittajia."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Muokkaa"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Tämä estää KAIKKI äänet ja värinät, mukaan lukien hälytysten, musiikin, videoiden ja pelien äänet ja värinät. Voit kuitenkin soittaa puheluita."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Vähemmän kiireelliset ilmoitukset ovat alla"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Avaa koskettamalla uudelleen"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index d9bbfe5586ed..aa2f7d9caab8 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Téléphone"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Assistance vocale"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Déverrouiller"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"déverrouiller"</string> <string name="phone_label" msgid="2320074140205331708">"Ouvrir le téléphone"</string> <string name="voice_assist_label" msgid="3956854378310019854">"ouvrir l\'assistance vocale"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Faites glisser votre doigt vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Vous ne serez pas dérangé par les sonneries ni les vibrations, sauf pour les alarmes, les rappels, les événements et les appels des personnes que vous spécifiez."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personnaliser"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Cette option permet de bloquer TOUS les sons et vibrations, y compris pour les alarmes, la musique, les vidéos et les jeux. Vous pourrez quand même faire des appels téléphoniques."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notifications moins urgentes affichées ci-dessous"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Touchez à nouveau pour ouvrir"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 9b916d804bdc..0e0f1bbb7d49 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Téléphoner"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Assistance vocale"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Déverrouiller"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"déverrouiller"</string> <string name="phone_label" msgid="2320074140205331708">"ouvrir le téléphone"</string> <string name="voice_assist_label" msgid="3956854378310019854">"ouvrir l\'assistance vocale"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Faites glisser vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Vous ne serez pas dérangé par les sonneries ni les vibrations, sauf pour les alarmes, les rappels, les événements et les appels des personnes que vous spécifiez."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personnaliser"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"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 passer des appels téléphoniques."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notifications moins urgentes ci-dessous"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Appuyer à nouveau pour ouvrir"</string> diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml index c076a69c40e3..5c039cbbc999 100644 --- a/packages/SystemUI/res/values-gl-rES/strings.xml +++ b/packages/SystemUI/res/values-gl-rES/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Teléfono"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Asistente de voz"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Desbloquear"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"desbloquear"</string> <string name="phone_label" msgid="2320074140205331708">"abrir teléfono"</string> <string name="voice_assist_label" msgid="3956854378310019854">"abrir asistente de voz"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Pasa o dedo cara a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Non te molestará ningún son nin vibración, agás os procedentes de alarmas, recordatorios, eventos de emisores de chamada especificados."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Esta acción bloquea TODOS os sons e vibracións, incluídos os das alarmas, música, vídeos e xogos. Aínda podes facer chamadas de teléfono."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificacións menos urxentes abaixo"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Toca outra vez para abrir o elemento"</string> diff --git a/packages/SystemUI/res/values-gu-rIN/strings.xml b/packages/SystemUI/res/values-gu-rIN/strings.xml index fbd409e198e3..c6193d82d0e1 100644 --- a/packages/SystemUI/res/values-gu-rIN/strings.xml +++ b/packages/SystemUI/res/values-gu-rIN/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"ફોન"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"વૉઇસ સહાય"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"અનલૉક કરો"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"અનલૉક કરો"</string> <string name="phone_label" msgid="2320074140205331708">"ફોન ખોલો"</string> <string name="voice_assist_label" msgid="3956854378310019854">"વૉઇસ સહાય ખોલો"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> માટે ડાબે સ્લાઇડ કરો."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"તમને તમે ઉલ્લેખિત એલાર્મ્સ, સ્મૃતિપત્રો, ઇવેન્ટ્સ અને કૉલર્સ સિવાયના ધ્વનિઓ અને વાઇબ્રેશન્સથી ખલેલ પહોંચાડવામાં આવશે નહીં."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"કસ્ટમાઇઝ કરો"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"આ એલાર્મ્સ, સંગીત, વિડિઓઝ અને રમતો સહિત બધા ધ્વનિઓ અને વાઇબ્રેશન્સને અવરોધિત કરે છે. તમે હજુ પણ ફોન કૉલ્સ કરવા માટે સમર્થ હશો."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"નીચે ઓછી તાકીદની સૂચનાઓ"</string> <string name="notification_tap_again" msgid="8524949573675922138">"ખોલવા માટે ફરી ટચ કરો"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 7502d64bc008..cd2e8865c5a6 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"फ़ोन"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"वॉइस सहायक"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"अनलॉक करें"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"अनलॉक करें"</string> <string name="phone_label" msgid="2320074140205331708">"फ़ोन खोलें"</string> <string name="voice_assist_label" msgid="3956854378310019854">"वॉइस सहायक खोलें"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> के लिए बाएं स्लाइड करें."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"आपको आपके द्वारा निर्दिष्ट किए गए अलार्म, रिमाइंडर्स, ईवेंट और कॉलर को छोड़कर अन्य ध्वनियों और कंपनों के द्वारा परेशान नहीं किया जाएगा."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"कस्टमाइज़ करें"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"इससे अलार्म, संगीत, वीडियो और गेम सहित सभी ध्वनियां और कंपन अवरुद्ध हो जाते हैं. आप अभी भी फ़ोन काॅल कर सकेंगे."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"कम अत्यावश्यक सूचनाएं नीचे दी गई हैं"</string> <string name="notification_tap_again" msgid="8524949573675922138">"खोलने के लिए पुन: स्पर्श करें"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 12d121ee9b91..52c01fa1ec55 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -88,6 +88,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Glasovna pomoć"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Otključavanje"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"otključavanje"</string> <string name="phone_label" msgid="2320074140205331708">"otvaranje telefona"</string> <string name="voice_assist_label" msgid="3956854378310019854">"otvaranje glasovne pomoći"</string> @@ -313,7 +317,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Kliznite lijevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Neće vas prekidati zvukovi i vibracije, osim alarma, podsjetnika, događaja i pozivatelja koje navedete."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Prilagodi"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"To blokira SVE zvukove i vibracije, uključujući alarme, glazbu, videozapise i igre. I dalje ćete moći telefonirati."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Manje hitne obavijesti pri dnu"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Dodirnite ponovo da biste otvorili"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 4ddcfc455d44..b8db72ae7a9b 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Hangsegéd"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Feloldás"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"feloldás"</string> <string name="phone_label" msgid="2320074140205331708">"telefon megnyitása"</string> <string name="voice_assist_label" msgid="3956854378310019854">"hangsegéd megnyitása"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa balra."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Nem zavarják majd hanghatások, sem rezgés, kivéve az ébresztéseket, emlékeztetőket, eseményeket és az Ön által megjelölt hívókat."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Személyre szabás"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Ez letiltja az ÖSSZES hanghatást és rezgést, beleértve az ébresztések, zeneszámok, videók és játékok hangjait is. Telefonhívást továbbra is fog tudni indítani."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"A kevésbé sürgős értesítések lentebb vannak"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Érintse meg ismét a megnyitáshoz"</string> diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml index 0ea11f98bf8c..ea39d8b146ac 100644 --- a/packages/SystemUI/res/values-hy-rAM/strings.xml +++ b/packages/SystemUI/res/values-hy-rAM/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Հեռախոս"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Ձայնային հուշումներ"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Ապակողպել"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"ապակողպել"</string> <string name="phone_label" msgid="2320074140205331708">"բացել հեռախոսը"</string> <string name="voice_assist_label" msgid="3956854378310019854">"բացեք ձայնային հուշումը"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Սահեցրեք ձախ` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ի համար:"</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Ոչ մի ձայն և թրթռում չի անհանգստացնի ձեզ, բացառությամբ ձեր ընտրած զարթուցիչներից, հիշեցումներից, իրադարձություններից և զանգողներից:"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Հարմարեցնել"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Այս գործողությունն արգելափակում է ԲՈԼՈՐ ձայներն ու թրթռումները, այդ թվում նաև զարթուցիչների, երաժշտության, տեսանյութերի և խաղերի ձայները: Սակայն կկարողանաք կատարել հեռախոսազանգեր:"</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Պակաս հրատապ ծանուցումները ստորև"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Կրկին հպեք՝ բացելու համար"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 13decf96d50f..1a771a33a22c 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telepon"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Bantuan Suara"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Buka kunci"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"buka kunci"</string> <string name="phone_label" msgid="2320074140205331708">"buka ponsel"</string> <string name="voice_assist_label" msgid="3956854378310019854">"buka bantuan suara"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Geser ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Anda tidak akan diganggu oleh suara dan getaran, kecuali dari alarm, pengingat, acara, dan penelepon tertentu."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Sesuaikan"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"SEMUA suara dan getaran, termasuk dari alarm, musik, video, dan game akan diblokir. Anda tetap dapat melakukan panggilan telepon."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notifikasi kurang darurat di bawah"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Sentuh lagi untuk membuka"</string> diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml index ea396eeb66ff..03ed3e87f348 100644 --- a/packages/SystemUI/res/values-is-rIS/strings.xml +++ b/packages/SystemUI/res/values-is-rIS/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Sími"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Raddaðstoð"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Taka úr lás"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"taka úr lás"</string> <string name="phone_label" msgid="2320074140205331708">"opna síma"</string> <string name="voice_assist_label" msgid="3956854378310019854">"opna raddaðstoð"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Strjúktu til vinstri til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Þú verður ekki fyrir truflunum af hljóðmerkjum og titringi, fyrir utan vekjara, áminningar, viðburði og símtöl sem þú leyfir fyrir fram."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Sérsníða"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Þetta lokar á ÖLL hljóðmerki og titring, þ.m.t. frá vekjurum, tónlist, myndskeiðum og leikjum. Þú getur áfram hringt símtöl."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Minna áríðandi tilkynningar fyrir neðan"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Snertu aftur til að opna"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 74b5705f7716..d9fdd465f90a 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefono"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Voice Assist"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Sblocca"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"sblocca"</string> <string name="phone_label" msgid="2320074140205331708">"apri telefono"</string> <string name="voice_assist_label" msgid="3956854378310019854">"apri Voice Assist"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"A sinistra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Non verrai disturbato da suoni e vibrazioni, ad eccezione di sveglie, promemoria, eventi e chiamate da contatti da te specificati."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizza"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Verranno bloccati TUTTI i suoni e le vibrazioni, anche di sveglie, musica, video e giochi. Potrai ancora telefonare."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notifiche meno urgenti in basso"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Tocca di nuovo per aprire"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 2eea2591c0c6..92188d3b8cf3 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -89,6 +89,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"טלפון"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"מסייע קולי"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"ביטול נעילה"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"בטל את הנעילה"</string> <string name="phone_label" msgid="2320074140205331708">"פתח את הטלפון"</string> <string name="voice_assist_label" msgid="3956854378310019854">"פתח את המסייע הקולי"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"הסט שמאלה כדי להציג <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"צלילים ורטט לא יופעלו, פרט להתראות, תזכורות, אירועים ומתקשרים שתציין."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"התאם אישית"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"פעולה זו חוסמת את כל הצלילים והרטט, כולל התראות, מוזיקה, סרטונים ומשחקים. תוכל עדיין להתקשר."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"הודעות בדחיפות נמוכה יותר בהמשך"</string> <string name="notification_tap_again" msgid="8524949573675922138">"גע שוב כדי לפתוח"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 124db15740d7..5ea8ef91088a 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"電話"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"音声アシスト"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"ロック解除"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"ロック解除"</string> <string name="phone_label" msgid="2320074140205331708">"電話を起動"</string> <string name="voice_assist_label" msgid="3956854378310019854">"音声アシストを開く"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"左にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"アラーム、リマインダー、予定、指定した人からの着信以外で音やバイブレーションに煩わされることはありません。"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"カスタマイズ"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"アラーム、音楽、動画、ゲームを含むすべての音とバイブレーションがブロックされます。電話をかけることはできます。"</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"緊急度の低い通知を下に表示"</string> <string name="notification_tap_again" msgid="8524949573675922138">"開くにはもう一度タップしてください"</string> diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml index f9aa9112bbaf..0dbc85e84280 100644 --- a/packages/SystemUI/res/values-ka-rGE/strings.xml +++ b/packages/SystemUI/res/values-ka-rGE/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"ტელეფონი"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"ხმოვანი დახმარება"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"განბლოკვა"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"განბლოკვა"</string> <string name="phone_label" msgid="2320074140205331708">"ტელეფონის გახსნა"</string> <string name="voice_assist_label" msgid="3956854378310019854">"ხმოვანი დახმარების გახსნა"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"გაასრიალეთ მარცხნივ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"თქვენ მიერ მითითებული გაფრთხილებების, შეხსენებების, ღონისძიებებისა და აბონენტების გარდა, არავითარი ხმა და ვიბრაცია არ შეგაწუხებთ."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"მორგება"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"ეს ბლოკავს ყველა ხმაურს და ვიბრაციას, მათ შორის, გაფრთხილებებით, მუსიკით, ვიდეოებით და თამაშებით შექმნილს. მიუხედავად ამისა, თქვენ შეძლებთ სატელეფონო ზარების განხორციელებას."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"ქვემოთ მითითებულია ნაკლებად სასწრაფო შეტყობინებები"</string> <string name="notification_tap_again" msgid="8524949573675922138">"შეეხეთ ისევ გასახსნელად"</string> diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml index 8e35f68d3059..6d22c3ddd099 100644 --- a/packages/SystemUI/res/values-kk-rKZ/strings.xml +++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Телефон"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Дауыс көмекшісі"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Бекітпесін ашу"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"бекітпесін ашу"</string> <string name="phone_label" msgid="2320074140205331708">"телефонды ашу"</string> <string name="voice_assist_label" msgid="3956854378310019854">"ашық дауыс көмекшісі"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін солға сырғыту."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Дабылдар, еске салғыштар, оқиғалар мен өзіңіз көрсеткен контактілердің қоңырауларынан басқа дыбыстар мен дірілдер мазаламайтын болады."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Реттеу"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Дабыл, музыка, бейнелер мен ойындарды қоса алғанда, барлық дыбыстар мен дірілдер тыйылатын болады. Қоңырау шала беруіңізге болады."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Шұғылдығы азырақ хабарландырулар төменде"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Ашу үшін қайтадан түртіңіз"</string> diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml index 62ea93c9617e..0a6b62c44b8a 100644 --- a/packages/SystemUI/res/values-km-rKH/strings.xml +++ b/packages/SystemUI/res/values-km-rKH/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"ទូរស័ព្ទ"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"ជំនួយសំឡេង"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"ដោះសោ"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"ដោះសោ"</string> <string name="phone_label" msgid="2320074140205331708">"បើកទូរស័ព្ទ"</string> <string name="voice_assist_label" msgid="3956854378310019854">"បើកជំនួយសំឡេង"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"រុញទៅឆ្វេងដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"អ្នកនឹងមិនរំខានដោយសម្លេង និងរំញ័រឡើយ លើកលែងតែសម្លេងរោទិ៍ ការរំលឹក ព្រឹត្តិការណ៍ និងអ្នកហៅដែលអ្នកបានបញ្ជាក់ប៉ុណ្ណោះ។"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"ប្ដូរតាមបំណង"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"វារារាំងសំឡេង និងរំញ័រទាំងអស់ ដោយរួមបញ្ចូលទាំងសំឡេងរោទិ៍ តន្ត្រី វីដេអូ និងហ្គេម។ អ្នកនឹងនៅតែអាចធ្វើការហៅទូរស័ព្ទបានដដែល។"</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"ការជូនដំណឹងមិនសូវបន្ទាន់ខាងក្រោម"</string> <string name="notification_tap_again" msgid="8524949573675922138">"ប៉ះម្ដងទៀតដើម្បីបើក"</string> diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml index 61348bc957df..5a904391f46f 100644 --- a/packages/SystemUI/res/values-kn-rIN/strings.xml +++ b/packages/SystemUI/res/values-kn-rIN/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"ಫೋನ್"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"ಧ್ವನಿ ಸಹಾಯಕ"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"ಅನ್ಲಾಕ್"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"ಅನ್ಲಾಕ್ ಮಾಡು"</string> <string name="phone_label" msgid="2320074140205331708">"ಫೋನ್ ತೆರೆಯಿರಿ"</string> <string name="voice_assist_label" msgid="3956854378310019854">"ಧ್ವನಿ ಸಹಾಯಕವನ್ನು ತೆರೆ"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಎಡಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"ಅಲಾರಮ್ಗಳು, ಜ್ಞಾಪನೆಗಳು, ಈವೆಂಟ್ಗಳು ಮತ್ತು ನೀವು ಸೂಚಿಸುವ ಕರೆದಾರರನ್ನು ಹೊರತುಪಡಿಸಿ, ಧ್ವನಿಗಳು ಮತ್ತು ವೈಬ್ರೇಶನ್ಗಳಿಂದ ನಿಮಗೆ ತೊಂದರೆ ಆಗುವುದಿಲ್ಲ."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"ಕಸ್ಟಮೈಸ್ ಮಾಡು"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"ಇದು ಅಲಾರಮ್ಗಳು, ಸಂಗೀತ, ವೀಡಿಯೊಗಳು, ಮತ್ತು ಗೇಮ್ಗಳು ಸೇರಿದಂತೆ ಎಲ್ಲಾ ಧ್ವನಿಗಳು ಮತ್ತು ವೈಬ್ರೇಶನ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"ಕೆಳಗೆ ಕಡಿಮೆ ಅವಸರದ ಅಧಿಸೂಚನೆಗಳು"</string> <string name="notification_tap_again" msgid="8524949573675922138">"ತೆರೆಯಲು ಮತ್ತೊಮ್ಮೆ ಸ್ಪರ್ಶಿಸಿ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index f154261ea477..2895fdff2851 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"전화"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"음성 지원"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"잠금 해제"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"잠금 해제"</string> <string name="phone_label" msgid="2320074140205331708">"휴대전화 열기"</string> <string name="voice_assist_label" msgid="3956854378310019854">"음성 지원 열기"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 왼쪽으로 슬라이드"</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"지정한 알람, 알림, 이벤트, 발신자를 제외하고 소리와 진동을 끕니다."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"맞춤설정"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"알람, 음악, 동영상, 게임을 포함하여 모든 소리와 진동을 끕니다. 전화는 걸 수 있습니다."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"아래에 덜 급한 알림 표시"</string> <string name="notification_tap_again" msgid="8524949573675922138">"다시 터치하여 열기"</string> diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml index 16ca9a0de5a2..c48b6bb8df4a 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings.xml @@ -111,6 +111,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Телефон"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Үн жардамчысы"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Кулпусун ачуу"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"кулпуну ачуу"</string> <string name="phone_label" msgid="2320074140205331708">"телефонду ачуу"</string> <string name="voice_assist_label" msgid="3956854378310019854">"үн жардамчысысын ачуу"</string> @@ -337,7 +341,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн солго жылмыштырыңыз."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Көрсөтүлгөн эскертүүлөрдөн, эскерткичтерден, окуялардан жана чалуучулардан тышкары башка үндөр жана дирилдөөлөр тынчыңызды албайт."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Ыңгайлаштыруу"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Ушуну менен эскертүүлөрдүн, музыканын, видеолордун жана оюндардын үндөрү жана дирилдөөлөрү сыяктуу нерселердин баары өчүрүлөт. Бирок телефон чала бересиз."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Анчейин шашылыш эмес эскертмелер төмөндө"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Ачуу үчүн кайра тийиңиз"</string> diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml index c3be29a95d12..1316a4a049eb 100644 --- a/packages/SystemUI/res/values-lo-rLA/strings.xml +++ b/packages/SystemUI/res/values-lo-rLA/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"ໂທລະສັບ"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"ຊ່ວຍເຫຼືອທາງສຽງ"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"ປົດລັອກ"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"ປົດລັອກ"</string> <string name="phone_label" msgid="2320074140205331708">"ເປີດແປ້ນໂທລະສັບ"</string> <string name="voice_assist_label" msgid="3956854378310019854">"ຊ່ວເຫຼືອເປີດສຽງ"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"ເລື່ອນໄປທາງຊ້າຍເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"ທ່ານຈະບໍ່ຖືກລົບກວນຈາກສຽງ ແລະການສັ່ນ, ຍົກເວັ້ນຈາກໂມງປຸກ, ການເຕືອນ, ເຫດການ, ແລະຜູ້ໂທທີ່ທ່ານລະບຸ."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"ປັບແຕ່ງ"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"ອັນນີ້ບລັອກທຸກສຽງ ແລະການສັ່ນ, ລວມທັງຈາກໂມງປຸກ, ເພງ, ວິດີໂອ, ແລະເກມ. ທ່ານຍັງຈະສາມາດໂທລະສັບໄດ້."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"ການແຈ້ງເຕືອນທີ່ສຳຄັນໜ້ອຍກວ່າຢູ່ດ້ານລຸ່ມ"</string> <string name="notification_tap_again" msgid="8524949573675922138">"ແຕະອີກເທື່ອນຶ່ງເພື່ອເປີດ"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index ba522919b404..bbe008f0d70f 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -89,6 +89,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefonas"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Voice Assist"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Atrakinti"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"atrakinti"</string> <string name="phone_label" msgid="2320074140205331708">"atidaryti telefoną"</string> <string name="voice_assist_label" msgid="3956854378310019854">"atidaryti „Voice Assist“"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Slyskite į kairę link <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Jūsų netrikdys garsai ir vibravimas, išskyrus nurodytų signalų, priminimų, įvykių ir skambintojų garsus ir vibravimą."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Tinkinti"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Taip bus užblokuoti VISI garsai ir vibravimas, įskaitant signalų, muzikos, vaizdo įrašų ir žaidimų garsus ir vibravimą. Vis tiek galėsite skambinti telefonu."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Mažiau skubūs pranešimai toliau"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Palieskite dar kartą, kad atidarytumėte"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index dd1ec141e2bc..2350e35935c6 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -88,6 +88,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Tālruņa numurs"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Balss palīgs"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Atbloķēt"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"atbloķēt"</string> <string name="phone_label" msgid="2320074140205331708">"atvērt tālruni"</string> <string name="voice_assist_label" msgid="3956854378310019854">"atvērt balss palīgu"</string> @@ -313,7 +317,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Velciet pa kreisi, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Jūs netraucēs skaņas un vibrosignāli, ja vien tie nebūs modinātāji, atgādinājumi, pasākumi vai konkrēti zvanītāji, kurus būsiet norādījis."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Pielāgot"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Tiks bloķētas VISAS skaņas un vibrosignāli, tostarp modinātāja, mūzikas, videoklipu un spēļu skaņas un signāli. Jūs joprojām varēsiet veikt tālruņa zvanus."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Mazāk steidzami paziņojumi tiek rādīti tālāk"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Pieskarieties vēlreiz, lai atvērtu."</string> diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml index 9ab5f3643677..30da026cbe60 100644 --- a/packages/SystemUI/res/values-mk-rMK/strings.xml +++ b/packages/SystemUI/res/values-mk-rMK/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Телефон"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Гласовна помош"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Отклучување"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"отклучи"</string> <string name="phone_label" msgid="2320074140205331708">"отвори телефон"</string> <string name="voice_assist_label" msgid="3956854378310019854">"отвори гласовна помош"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Лизгај налево за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Нема да ви пречат звуци и вибрации, освен од аларми, потсетници, настани и повикувачи што ќе ги наведете."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Приспособи"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Ова ги блокира СИТЕ звуци и вибрации, вклучувајќи ги и оние од алармите, музиката, видеата и игрите. Сѐ уште ќе може да воспоставувате телефонски повици."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Долу се помалку итни известувања"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Допрете повторно за да отворите"</string> diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml index ba779869b620..7c8fdc19254e 100644 --- a/packages/SystemUI/res/values-ml-rIN/strings.xml +++ b/packages/SystemUI/res/values-ml-rIN/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"ഫോണ്"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"വോയ്സ് സഹായം"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"അണ്ലോക്ക് ചെയ്യുക"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"അൺലോക്കുചെയ്യുക"</string> <string name="phone_label" msgid="2320074140205331708">"ഫോൺ തുറക്കുക"</string> <string name="voice_assist_label" msgid="3956854378310019854">"വോയ്സ് അസിസ്റ്റ് തുറക്കുക"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി ഇടത്തേയ്ക്ക് സ്ലൈഡുചെയ്യുക."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"നിങ്ങൾ വ്യക്തമാക്കിയിട്ടുള്ള അലാറങ്ങൾ, ഓർമ്മപ്പെടുത്തലുകൾ, ഇവന്റുകൾ, കോളർമാർ എന്നിവ ഒഴികെയുള്ള ശബ്ദങ്ങളോ വൈബ്രേഷനുകളോ കാരണം നിങ്ങൾക്ക് ശല്യമുണ്ടാകില്ല."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"ഇഷ്ടാനുസൃതമാക്കുക"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"ഇത് അലാറങ്ങൾ, സംഗീതം, വീഡിയോകൾ, ഗെയിമുകൾ എന്നിവയിൽ നിന്നുൾപ്പെടെ എല്ലാ ശബ്ദങ്ങളും വൈബ്രേഷനുകളും തടയുന്നു. നിങ്ങൾക്ക് തുടർന്നും ഫോൺ വിളിക്കാനാകും."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"ആവശ്യം കുറഞ്ഞ അറിയിപ്പുകൾ ചുവടെ നൽകിയിരിക്കുന്നു"</string> <string name="notification_tap_again" msgid="8524949573675922138">"തുറക്കുന്നതിന് വീണ്ടും സ്പർശിക്കുക"</string> diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml index f5fe7b8d7e68..bcfe68752b56 100644 --- a/packages/SystemUI/res/values-mn-rMN/strings.xml +++ b/packages/SystemUI/res/values-mn-rMN/strings.xml @@ -85,6 +85,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Утас"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Дуут туслах"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Тайлах"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"тайлах"</string> <string name="phone_label" msgid="2320074140205331708">"утас нээх"</string> <string name="voice_assist_label" msgid="3956854378310019854">"дуут туслахыг нээнэ"</string> @@ -310,7 +314,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх зүүнлүү гулсуулах."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Танд сэрүүлгэ, сануулга, үйл явдлын сануулга, таны сануулсан дуудлага зэргээс бусад дуу чимээ, чичиргээ танд садаа болохгүй."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Тохируулах"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Энэ нь сануулга, хөгжим, видео, тоглоом зэргийг оруулаад зэрэг БҮХ дуу, чичиргээг блоклодог. Та дуудлага хийх боломжтой хэвээр л байна."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Яаралтай биш мэдэгдлүүдийг доор"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Нээхийн тулд дахин хүрнэ үү"</string> diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml index 253e6079cf72..ee509f4536c8 100644 --- a/packages/SystemUI/res/values-mr-rIN/strings.xml +++ b/packages/SystemUI/res/values-mr-rIN/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"फोन"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"व्हॉइस सहाय्य"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"अनलॉक करा"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"अनलॉक करा"</string> <string name="phone_label" msgid="2320074140205331708">"फोन उघडा"</string> <string name="voice_assist_label" msgid="3956854378310019854">"व्हॉइस सहाय्य उघडा"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी डावीकडे स्लाइड करा."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"आपण निर्दिष्ट करता ते अलार्म, स्मरणपत्रे, इव्हेंट आणि कॉलर व्यतिरिक्त, आपल्याला आवाज आणि कंपनांमुळे व्यत्यय येणार नाही."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"सानुकूलित करा"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"हे अलार्म, संगीत, व्हिडिओ आणि गेम यासह, सर्व आवाज आणि कंपने अवरोधित करते. आपण तरीही फोन कॉल करण्यात सक्षम व्हाल."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"खाली कमी तातडीच्या सूचना"</string> <string name="notification_tap_again" msgid="8524949573675922138">"उघडण्यासाठी पुन्हा स्पर्श करा"</string> diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml index bdde8ee38806..aef1def0a1b1 100644 --- a/packages/SystemUI/res/values-ms-rMY/strings.xml +++ b/packages/SystemUI/res/values-ms-rMY/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Bantuan Suara"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Buka kunci"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"buka kunci"</string> <string name="phone_label" msgid="2320074140205331708">"buka telefon"</string> <string name="voice_assist_label" msgid="3956854378310019854">"buka bantuan suara"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Luncurkan ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Anda tidak akan diganggu oleh bunyi dan getaran kecuali daripada penggera, peringatan, acara dan pemanggil yang anda tentukan."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Peribadikan"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Mesej ini menyekat SEMUA bunyi dan getaran, termasuk daripada penggera, muzik, video dan permainan. Anda masih boleh membuat panggilan telefon."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Pemberitahuan kurang penting di bawah"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Sentuh sekali lagi untuk membuka"</string> diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml index 0149130fc0b8..332592bfb08a 100644 --- a/packages/SystemUI/res/values-my-rMM/strings.xml +++ b/packages/SystemUI/res/values-my-rMM/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"ဖုန်း"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"အသံ အကူအညီ"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"သော့ဖွင့်ရန်"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"သော့ဖွင့်ရန်"</string> <string name="phone_label" msgid="2320074140205331708">"ဖုန်းကို ဖွင့်ရန်"</string> <string name="voice_assist_label" msgid="3956854378310019854">"အသံ အကူအညီအား ဖွင့်ရန်"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် ဖယ်ဘက်ကို ပွတ်ဆွဲပါ"</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"နှိုးစက်များ၊ အသိပေးချက်များ၊ ဖြစ်ရပ်များ နှင့် သင်သတ်မှတ်ထားသည့် ခေါ်ဆိုသူများမှ လွဲ၍ အသံများနှင့် တုန်ခါမှုများသည် သင့်အား နှောင့်ယှက်မည် မဟုတ်ပါ။"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"စိတ်ကြိုက် ပြုလုပ်ရန်"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"ဤအရာမှ နှိုးစက်၊ ဂီတ၊ ဗွီဒီယိုများနှင့် ဂိမ်းများ အပါအဝင်၊ အသံအားလုံးနှင့် တုန်ခါမှုများအား တားဆီးပေးသည်။ ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်နိုင်ဆဲဖြစ်မည်။"</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"အရေးပါမှု နည်းသည့် အကြောင်းကြားချက်များ အောက်မှာ"</string> <string name="notification_tap_again" msgid="8524949573675922138">"ဖွင့်ရန် ထပ်ပြီး ထိပါ"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 3f1d1849fcc8..a7d34741c751 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefonnummer"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Talehjelp"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Lås opp"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"lås opp"</string> <string name="phone_label" msgid="2320074140205331708">"åpne telefonen"</string> <string name="voice_assist_label" msgid="3956854378310019854">"åpne talehjelp"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Dra til venstre for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Du blir ikke forstyrret av lyder og vibrasjoner, bortsett fra alarmer, påminnelser, aktiviteter og oppringere du angir."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Tilpass"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Dette blokkerer ALLE lyder og vibrasjoner, inkludert fra alarmer, musikk, videoer og spill. Du kan fremdeles ringe."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Mindre presserende varsler nedenfor"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Trykk på nytt for å åpne"</string> diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml index 5100f43d6470..7cf0ed0cf48c 100644 --- a/packages/SystemUI/res/values-ne-rNP/strings.xml +++ b/packages/SystemUI/res/values-ne-rNP/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"फोन"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"आवाज सहायता"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"खोल्नुहोस्"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"खोल्नुहोस्"</string> <string name="phone_label" msgid="2320074140205331708">"फोन खोल्नुहोस्"</string> <string name="voice_assist_label" msgid="3956854378310019854">"आवाज सहायता खोल्नुहोस्"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"स्लाइड <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि बायाँ।"</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"अलार्म, रिमाइन्डर, घटना, र तपाईँले निर्दिष्ट गर्नुहुने कलरहरू देखि बाहेक, आवाज र कम्पनले तपाईँ लाई वाधा गर्ने छैन।"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"अनुकूलन गर्नुहोस्"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"यसले अलार्म, संगीत, भिडियो, र खेलहरू लगायतका सबै ध्वनि र कम्पन निषेध गर्छ। तपाईँ अझै पनि फोन कल गर्न सक्षम हुनुहुन्छ।"</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"तल कम जरुरी सूचनाहरू"</string> <string name="notification_tap_again" msgid="8524949573675922138">"खोल्न फेरि छुनुहोस्"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 7585fb87be03..ded227ae59d2 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefoon"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Spraakassistent"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Ontgrendelen"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"ontgrendelen"</string> <string name="phone_label" msgid="2320074140205331708">"telefoon openen"</string> <string name="voice_assist_label" msgid="3956854378310019854">"spraakassistent openen"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Veeg naar links voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"U wordt niet gestoord door geluiden en trillingen, behalve voor alarmen, herinneringen, afspraken en bellers die u specificeert."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Aanpassen"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Hiermee worden ALLE geluiden en trillingen geblokkeerd, waaronder die voor alarmen, muziek, video\'s en games. U kunt wel nog steeds bellen."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Minder urgente meldingen onderaan"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Raak opnieuw aan om te openen"</string> diff --git a/packages/SystemUI/res/values-pa-rIN/strings.xml b/packages/SystemUI/res/values-pa-rIN/strings.xml index 91fb6d49d520..45f852c0c0ef 100644 --- a/packages/SystemUI/res/values-pa-rIN/strings.xml +++ b/packages/SystemUI/res/values-pa-rIN/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"ਫੋਨ"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"ਵੌਇਸ ਅਸਿਸਟ"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"ਅਨਲੌਕ ਕਰੋ"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"ਅਨਲੌਕ ਕਰੋ"</string> <string name="phone_label" msgid="2320074140205331708">"ਫੋਨ ਖੋਲ੍ਹੋ"</string> <string name="voice_assist_label" msgid="3956854378310019854">"ਵੌਇਸ ਅਸਿਸਟ ਖੋਲ੍ਹੋ"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ਤੱਕ ਖੱਬੇ ਪਾਸੇ ਸਲਾਈਡ ਕਰੋ।"</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"ਤੁਹਾਨੂੰ ਤੁਹਾਡੇ ਦੁਆਰਾ ਨਿਰਦਿਸ਼ਟ ਅਲਾਰਮ, ਰਿਮਾਈਂਡਰ, ਇਵੈਂਟਸ, ਅਤੇ ਕਾਲਰਸ ਤੋਂ ਇਲਾਵਾ, ਧੁਨੀ ਅਤੇ ਵਾਇਬ੍ਰੇਸ਼ਨ ਤੋਂ ਪਰੇਸ਼ਾਨ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ।"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"ਅਨੁਕੂਲਿਤ ਕਰੋ"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"ਇਹ ਅਲਾਰਮ, ਸੰਗੀਤ, ਵੀਡੀਓਜ਼, ਅਤੇ ਗੇਮਸ ਸਮੇਤ, ਸਾਰੀ ਦੁਨੀ ਅਤੇ ਵਾਇਬ੍ਰੇਸ਼ਨ ਨੂੰ ਬਲੌਕ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ ਅਜੇ ਵੀ ਫ਼ੋਨ ਕਾਲ ਕਰਨ ਦੇ ਯੋਗ ਹੋਵੋਗੇ।"</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"ਹੇਠਾਂ ਘੱਟ ਲਾਜ਼ਮੀ ਸੂਚਨਾਵਾਂ"</string> <string name="notification_tap_again" msgid="8524949573675922138">"ਖੋਲ੍ਹਣ ਲਈ ਦੁਬਾਰਾ ਛੋਹਵੋ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index d8bec72f4bfa..75ea440e9eb9 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -89,6 +89,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Asystent głosowy"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Odblokuj"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"odblokuj"</string> <string name="phone_label" msgid="2320074140205331708">"otwórz telefon"</string> <string name="voice_assist_label" msgid="3956854378310019854">"otwórz pomoc głosową"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Przesuń w lewo: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Urządzenie nie będzie odtwarzać dźwięków ani włączać wibracji, z wyjątkiem wybranych przez Ciebie alarmów, przypomnień, wydarzeń i kontaktów."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Dostosuj"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Zablokuje WSZYSTKIE dźwięki i wibracje, także alarmy, muzykę, filmy i gry. Nadal będzie można wykonywać połączenia."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Poniżej widać mniej pilne powiadomienia"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Kliknij ponownie, by otworzyć"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index a1351ddcce24..1741c1c4ee07 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telemóvel"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Assistente de voz"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Desbloquear"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"desbloquear"</string> <string name="phone_label" msgid="2320074140205331708">"abrir telemóvel"</string> <string name="voice_assist_label" msgid="3956854378310019854">"abrir assistente de voz"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Deslize para a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Não é incomodado por sons e vibrações, exceto de alarmes, lembretes, eventos e autores de chamadas que especificar."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Esta ação bloqueia TODOS os sons e as vibrações, incluindo de alarmes, músicas, vídeos e jogos. Continua a poder telefonar."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificações menos urgentes abaixo"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Tocar novamente para abrir"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 5f2603ec02c0..4ba9ec196f70 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefone"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Assistência de voz"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Desbloquear"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"desbloquear"</string> <string name="phone_label" msgid="2320074140205331708">"abrir telefone"</string> <string name="voice_assist_label" msgid="3956854378310019854">"abrir assistência de voz"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para a esquerda."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Você não será perturbado por sons e vibrações, com exceção de alarmes, lembretes, eventos e autores de chamadas que você especificar."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Isso bloqueia TODOS os sons e vibrações, incluindo alarmes, músicas, vídeos e jogos. Você ainda poderá fazer chamadas telefônicas."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificações menos urgentes abaixo"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Toque novamente para abrir"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 9b5a7859fcdd..24e2a58acda0 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -88,6 +88,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Asistent vocal"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Deblocați"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"deblocați"</string> <string name="phone_label" msgid="2320074140205331708">"deschideți telefonul"</string> <string name="voice_assist_label" msgid="3956854378310019854">"deschideți asistentul vocal"</string> @@ -313,7 +317,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Glisaţi spre stânga pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Nu veți fi deranjat(ă) de sunete și vibrații, exceptând alarmele, mementourile, evenimentele și apelanții pe care îi menționați."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizați"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Această opțiune blochează TOATE sunetele și vibrațiile, inclusiv cele ale alarmelor, muzicii, videoclipurilor și jocurilor. Totuși, veți putea iniția apeluri."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificările mai puțin urgente mai jos"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Atingeți din nou pentru a deschide"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index fd239caafecc..f16d59e76fce 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -89,6 +89,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Телефон."</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Аудиоподсказки"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Разблокировать."</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"Разблокировать."</string> <string name="phone_label" msgid="2320074140205331708">"Открыть телефон."</string> <string name="voice_assist_label" msgid="3956854378310019854">"включить аудиоподсказки"</string> @@ -316,7 +320,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Проведите влево, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Вибрация и звуки будут отключены. Вы услышите только сигналы будильника, напоминания, уведомления о мероприятиях и звонки от выбранных абонентов."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Настроить"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Этот режим заблокирует все звуки и вибрацию, в том числе для будильника, музыки, видео и игр. Вы сможете разговаривать по телефону."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Показать менее важные оповещения"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Нажмите ещё раз, чтобы открыть"</string> diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml index a7ac3cfd3d07..3d7dc479cfbe 100644 --- a/packages/SystemUI/res/values-si-rLK/strings.xml +++ b/packages/SystemUI/res/values-si-rLK/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"දුරකථනය"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"හඬ සහාය"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"අඟුල අරින්න"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"අඟුල අරින්න"</string> <string name="phone_label" msgid="2320074140205331708">"දුරකථනය විවෘත කරන්න"</string> <string name="voice_assist_label" msgid="3956854378310019854">"විවෘත හඬ සහාය"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා වමට සර්පණය කරන්න."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"එලාම, සිහි කැඳවීම්, සිදුවීම් සහ ඔබ සඳහන් කරන අමතන්නන් වෙතින් හැර, වෙනත් ශබ්ද සහ කම්පනවලින් ඔබට බාධා නොවනු ඇත."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"අභිරුචිකරණය"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"මෙය එලාම, සංගීතය, වීඩියෝ, සහ ක්රීඩා ඇතුළු, සියලු ශබ්ද සහ කම්පන අවහිර කරයි. ඔබට තවමත් දුරකථන ඇමතුම් සිදු කිරීමේ හැකියාව ඇත."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"හදිසිය අඩු දැනුම් දීම් පහත"</string> <string name="notification_tap_again" msgid="8524949573675922138">"විවෘත කිරීමට නැවත ස්පර්ශ කරන්න"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 57fa578274e0..ce92e4ab48b9 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -89,6 +89,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefón"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Hlasový asistent"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Odomknúť"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"odomknúť"</string> <string name="phone_label" msgid="2320074140205331708">"otvoriť telefón"</string> <string name="voice_assist_label" msgid="3956854378310019854">"otvoriť hlasového asistenta"</string> @@ -316,7 +320,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Prejdite prstom doľava: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Nebudú vás rušiť zvuky ani vibrácie s výnimkou budíkov, pripomenutí, udalostí a volajúcich, ktoré špecifikujete."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Prispôsobiť"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Zablokujú sa tým VŠETKY zvuky a vibrácie vrátane zvukov budíkov, hudby, videí a hier. Naďalej budete môcť telefonovať."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Menej naliehavé upozornenia sa nachádzajú nižšie"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Otvorte opätovným klepnutím"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index f2b48016d23a..3ca6edb330a8 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -89,6 +89,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Glasovni pomočnik"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Odkleni"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"odkleni"</string> <string name="phone_label" msgid="2320074140205331708">"odpri telefon"</string> <string name="voice_assist_label" msgid="3956854378310019854">"odpri glasovnega pomočnika"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Povlecite v levo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Ne bodo vas motili zvoki in vibriranje, razen od alarmov, opomnikov, dogodkov in klicateljev, ki jih določite."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Prilagodi"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"S tem so blokirani VSI zvoki in vibriranje – tudi od alarmov, glasbe, videoposnetkov in iger. Še vedno boste lahko opravljali telefonske klice."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Manj nujna obvestila spodaj"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Dotaknite se znova, če želite odpreti"</string> diff --git a/packages/SystemUI/res/values-sq-rAL/strings.xml b/packages/SystemUI/res/values-sq-rAL/strings.xml index 1747964744ec..388280271c38 100644 --- a/packages/SystemUI/res/values-sq-rAL/strings.xml +++ b/packages/SystemUI/res/values-sq-rAL/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefoni"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Ndihma zanore"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Shkyç"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"shkyç"</string> <string name="phone_label" msgid="2320074140205331708">"hap telefonin"</string> <string name="voice_assist_label" msgid="3956854378310019854">"hap ndihmën zanore"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Rrëshqit majtas për <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Nuk do të shqetësohesh nga tingujt dhe dridhjet, përveç atyre nga alarmet, rikujtesat, ngjarjet dhe telefonuesit që specifikon."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizo"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Kjo bllokon TË GJITHË tingujt dhe dridhjet, duke përfshirë edhe nga alarmet, muzika, videot dhe lojërat. Përsëri do të mund të bësh telefonata."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Njoftimet më pak urgjente, më poshtë!"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Prek sërish për ta hapur"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index d63e0df5db85..dd7921888a4b 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -88,6 +88,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Телефон"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Гласовна помоћ"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Откључајте"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"откључај"</string> <string name="phone_label" msgid="2320074140205331708">"отвори телефон"</string> <string name="voice_assist_label" msgid="3956854378310019854">"отвори гласовну помоћ"</string> @@ -313,7 +317,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Превуците улево за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Неће вас узнемиравати звукови и вибрације, осим за аларме, подсетнике, догађаје и позиваоце које изаберете."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Прилагоди"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Ово блокира СВЕ звукове и вибрације укључујући аларме, музику, видео снимке и игре. И даље ћете моћи да упућујете позиве."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Мање хитна обавештења су у наставку"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Додирните поново да бисте отворили"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index c2c47273dae6..23a61cabf787 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Mobil"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Röstassistent"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Lås upp"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"lås upp"</string> <string name="phone_label" msgid="2320074140205331708">"öppna mobilen"</string> <string name="voice_assist_label" msgid="3956854378310019854">"öppna röstassistenten"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Dra åt vänster för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Du blir inte störd av ljud och vibrationer, förutom från alarm, påminnelser, event och specifika samtal."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Anpassa"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Detta blockerar ALLA ljud och vibrationer, inklusive alarm, musik, videor och spel. Du kan fortfarande ringa."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Mindre brådskande aviseringar nedan"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Tryck igen för att öppna"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index f9148b908cf6..975f269fd3d3 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Simu"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Mapendekezo ya Sauti"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Fungua"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"fungua"</string> <string name="phone_label" msgid="2320074140205331708">"fungua simu"</string> <string name="voice_assist_label" msgid="3956854378310019854">"fungua mapendekezo ya sauti"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Sogeza kushoto kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Hutasumbuliwa na sauti na mitetemo, isipokuwa kengele, vikumbusho, matukio na wapigaji simu utakaobainisha."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Badilisha kukufaa"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Hatua hii huzuia sauti na mitetemo YOTE, ikiwa na pamoja na inayotoka kwenye kengele, muziki, video na michezo. Bado utaweza kupiga simu."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>+"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Arifa zisizo za dharura sana ziko hapo chini"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Gusa tena ili ufungue"</string> diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml index 31c3fcc90618..e79eb4a2cfb5 100644 --- a/packages/SystemUI/res/values-ta-rIN/strings.xml +++ b/packages/SystemUI/res/values-ta-rIN/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"ஃபோன்"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"குரல் உதவி"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"திற"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"திற"</string> <string name="phone_label" msgid="2320074140205331708">"ஃபோனைத் திற"</string> <string name="voice_assist_label" msgid="3956854378310019854">"குரல் உதவியைத் திற"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> க்கு இடதுபக்கமாக இழுக்கவும்."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"அலாரங்கள், நினைவூட்டல்கள், நிகழ்வுகள், குறிப்பிட்ட அழைப்புகள் தவிர, ஒலிகளினாலும் அதிர்வினாலும் தொந்தரவு இருக்காது."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"தனிப்பயனாக்கு"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"இது அலாரங்கள், இசை, வீடியோக்கள் மற்றும் கேம்கள் உட்பட எல்லா சத்தங்களையும் அதிர்வுகளையும் தடுக்கும். இருப்பினும் நீங்கள் அழைப்புகளைச் செய்யலாம்."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"அவசர நிலைக் குறைவான அறிவிப்புகள் கீழே உள்ளன"</string> <string name="notification_tap_again" msgid="8524949573675922138">"திறக்க, மீண்டும் தட்டவும்"</string> diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml index 67010829fd40..7aaa6e228e98 100644 --- a/packages/SystemUI/res/values-te-rIN/strings.xml +++ b/packages/SystemUI/res/values-te-rIN/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"ఫోన్"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"వాయిస్ సహాయకం"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"అన్లాక్ చేయి"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"అన్లాక్ చేయి"</string> <string name="phone_label" msgid="2320074140205331708">"ఫోన్ను తెరువు"</string> <string name="voice_assist_label" msgid="3956854378310019854">"వాయిస్ సహాయకం తెరువు"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం ఎడమవైపుకు స్లైడ్ చేయండి."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"మీరు అలారాలు, రిమైండర్లు, ఈవెంట్లు మరియు పేర్కొనే కాలర్ల నుండి మినహా మరే ఇతర ధ్వనులు మరియు వైబ్రేషన్లతో మీకు అంతరాయం కలగదు."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"అనుకూలీకరించు"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"ఇది అలారాలు, సంగీతం, వీడియోలు మరియు గేమ్లతో సహా అన్ని ధ్వనులు మరియు వైబ్రేషన్లను బ్లాక్ చేస్తుంది. మీరు ఇప్పటికీ ఫోన్ కాల్లు చేయగలుగుతారు."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"తక్కువ అత్యవసర నోటిఫికేషన్లు దిగువన"</string> <string name="notification_tap_again" msgid="8524949573675922138">"తెరవడానికి మళ్లీ తాకండి"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index ad5e551dd1ce..52afa6a422c7 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"โทรศัพท์"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"ตัวช่วยเสียง"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"ปลดล็อก"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"ปลดล็อก"</string> <string name="phone_label" msgid="2320074140205331708">"เปิดโทรศัพท์"</string> <string name="voice_assist_label" msgid="3956854378310019854">"เปิดตัวช่วยเสียง"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"เลื่อนไปทางซ้ายเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"คุณจะไม่ถูกรบกวนจากเสียงและการสั่น ยกเว้นการปลุก การเตือนความจำ กิจกรรม และผู้โทรที่คุณระบุ"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"กำหนดค่า"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"การตั้งค่านี้จะบล็อกเสียงและการสั่นทั้งหมด ซึ่งรวมถึงเสียงปลุก เพลง วิดีโอ และเกม คุณจะยังสามารถโทรออกได้อยู่"</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"การแจ้งเตือนที่เร่งด่วนน้อยด้านล่าง"</string> <string name="notification_tap_again" msgid="8524949573675922138">"แตะอีกครั้งเพื่อเปิด"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index fbedb5d1c223..db8957184a0c 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telepono"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Voice Assist"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"I-unlock"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"i-unlock"</string> <string name="phone_label" msgid="2320074140205331708">"buksan ang telepono"</string> <string name="voice_assist_label" msgid="3956854378310019854">"buksan ang voice assist"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Mag-slide pakaliwa para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Hindi ka magagambala ng mga tunog at pag-vibrate, maliban mula sa mga alarm, paalala, kaganapan at mga tinukoy mong tumatawag."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"I-customize"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Bina-block nito ang LAHAT ng tunog at pag-vibrate, kabilang ang mula sa mga alarm, musika, video at laro. Magagawa mo pa ring makatawag."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Nasa ibaba ang mga notification na hindi masyadong mahalaga"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Pinduting muli upang buksan"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index b638556dec33..177c1bcdf4e0 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Sesli Yardım"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Kilidi aç"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"kilidi aç"</string> <string name="phone_label" msgid="2320074140205331708">"telefonu aç"</string> <string name="voice_assist_label" msgid="3956854378310019854">"sesli yardımı aç"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için sola kaydırın."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Belirttiğiniz alarmlar, hatırlatıcılar, etkinlikler ve arayanlar hariç olmak üzere, sesler ve titreşimlerle rahatsız edilmeyeceksiniz."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Özelleştir"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Bu seçenek TÜM sesleri ve titreşimleri engeller. Buna alarmlar, müzik, videolar ve oyunlar dahildir. Telefon aramaları yapmaya devam edebileceksiniz."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Daha az acil bildirimler aşağıdadır"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Açmak için tekrar dokunun"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 2946ad1adad9..220937453602 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -89,6 +89,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Номер телефону"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Голосові підказки"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Розблокувати"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"розблокувати"</string> <string name="phone_label" msgid="2320074140205331708">"відкрити телефон"</string> <string name="voice_assist_label" msgid="3956854378310019854">"запустити голосові підказки"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Проведіть пальцем ліворуч, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Ви отримуватимете звукові й вібросигнали лише для вибраних сповіщень, нагадувань, повідомлень про події та викликів абонентів."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Налаштувати"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Блокуватимуться ВСІ звукові та вібросигнали, зокрема сповіщення, музика, відео й ігри. Ви зможете телефонувати."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Менше термінових сповіщень нижче"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Торкніться знову, щоб відкрити"</string> diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml index 2bb7dffc04dd..0c1c32c364fc 100644 --- a/packages/SystemUI/res/values-ur-rPK/strings.xml +++ b/packages/SystemUI/res/values-ur-rPK/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"فون"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"صوتی معاون"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"غیر مقفل کریں"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"غیر مقفل کریں"</string> <string name="phone_label" msgid="2320074140205331708">"فون کھولیں"</string> <string name="voice_assist_label" msgid="3956854378310019854">"صوتی معاون کھولیں"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے بائیں سلائیڈ کریں۔"</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"الارمز، یاد دہانیوں، ایونٹس اور آپ کے متعین کردہ کالرز کے علاوہ، آپ آوازوں اور وائبریشنز سے ڈسٹرب نہیں ہوں گے۔"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"حسب ضرورت بنائیں"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"یہ الارمز، موسیقی، ویڈیوز اور گیمز کی آوازوں اور وائبریشنز سمیت سبھی آوازیں اور وائبریشنز مسدود کر دیتا ہے۔ آپ ابھی بھی فون کالز کر سکیں گے۔"</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"کم اہم اطلاعات ذیل میں ہیں"</string> <string name="notification_tap_again" msgid="8524949573675922138">"کھولنے کیلئے دوبارہ ٹچ کریں"</string> diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml index 55ca4b5cbfb0..b65485d7b59f 100644 --- a/packages/SystemUI/res/values-uz-rUZ/strings.xml +++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Ovozli yordam"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Qulfdan chiqarish"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"qulfdan chiqarish"</string> <string name="phone_label" msgid="2320074140205331708">"telefonni ochish"</string> <string name="voice_assist_label" msgid="3956854378310019854">"ovozli yordamni yoqish"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun chapga suring."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Turli ovoz va tebranishlar endi sizni bezovta qilmaydi. Biroq uyg‘otkich signallari, eslatmalar, tadbirlar haqidagi bildirishnomalar va siz tanlagan abonentlardan kelgan qo‘ng‘iroqlar bundan mustasno."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Sozlash"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Ushbu rejimda BARCHA ovoz va tebranishlar, jumladan, uyg‘otkich signallari, musiqa va o‘yinlar ovozlari ham o‘chirib qo‘yiladi. Shunday bo‘lsa-da, qo‘ng‘iroqlarni bemalol amalga oshirishingiz mumkin."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Kam ahamiyatli bildirishnomalarni pastda ko‘rsatish"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Ochish uchun yana bosing"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 7a6bef5fe792..2e1b9789c16d 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Điện thoại"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Trợ lý thoại"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Mở khóa"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"mở khóa"</string> <string name="phone_label" msgid="2320074140205331708">"mở điện thoại"</string> <string name="voice_assist_label" msgid="3956854378310019854">"mở trợ lý thoại"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Trượt sang trái để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Bạn sẽ không bị làm phiền bởi âm thanh và tiếng rung, ngoại trừ báo thức, nhắc nhở, sự kiện và người gọi mà bạn chỉ định."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Tùy chỉnh"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Chế độ này sẽ chặn TẤT CẢ âm thanh và tiếng rung, bao gồm báo thức, âm nhạc, video và trò chơi. Bạn vẫn có thể gọi điện thoại."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Thông báo ít khẩn cấp hơn bên dưới"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Chạm lại để mở"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index b34d547e952f..d77147f66d03 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"电话"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"语音助理"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"解锁"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"解锁"</string> <string name="phone_label" msgid="2320074140205331708">"打开电话"</string> <string name="voice_assist_label" msgid="3956854378310019854">"打开语音助理"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"向左滑动以<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"您将不会受声音和振动的打扰,但闹钟、提醒、活动和您指定的来电者除外。"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"自定义"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"这会阻止所有声音和振动(包括闹钟、音乐、视频和游戏)打扰您。您仍然可以拨打电话。"</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"不太紧急的通知会显示在下方"</string> <string name="notification_tap_again" msgid="8524949573675922138">"再次触摸即可打开"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 02187b351935..9ce90e33817e 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"電話"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"語音助手"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"解鎖"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"解鎖"</string> <string name="phone_label" msgid="2320074140205331708">"開啟電話"</string> <string name="voice_assist_label" msgid="3956854378310019854">"開啟語音助手"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"向左滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"除了指定的鬧鐘、提醒、活動及來電者,您將不會受到其他聲音和震動騷擾。"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"自訂"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"這會封鎖所有聲音和震動,包括鬧鐘、音樂、影片及遊戲,但您仍可撥打電話。"</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"還有 <xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g> 則通知"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"不太緊急的通知會在下方顯示"</string> <string name="notification_tap_again" msgid="8524949573675922138">"再次輕觸即可開啟"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index e58b04365e19..367b4a3d6403 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"電話"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"語音小幫手"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"解除鎖定"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"解除鎖定"</string> <string name="phone_label" msgid="2320074140205331708">"開啟電話"</string> <string name="voice_assist_label" msgid="3956854378310019854">"開啟語音小幫手"</string> @@ -314,7 +318,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"向左滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"您不會受到聲音和震動干擾,但鬧鐘、提醒、活動和指定來電者除外。"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"自訂"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"這會封鎖「所有」聲音和震動干擾,包括鬧鐘、音樂、影片和遊戲在內。您仍可以撥打電話。"</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"還有 <xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g> 則通知"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"較不緊急的通知會顯示在下方"</string> <string name="notification_tap_again" msgid="8524949573675922138">"再次輕觸即可開啟"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 23010b129515..7ad977f82207 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -87,6 +87,10 @@ <string name="accessibility_phone_button" msgid="6738112589538563574">"Ifoni"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Isisekeli sezwi"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Vula"</string> + <!-- no translation found for accessibility_unlock_button_fingerprint (8214125623493923751) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> <string name="unlock_label" msgid="8779712358041029439">"vula"</string> <string name="phone_label" msgid="2320074140205331708">"vula ifoni"</string> <string name="voice_assist_label" msgid="3956854378310019854">"vula isilekeleli sezwi"</string> @@ -312,7 +316,10 @@ <string name="description_direction_left" msgid="7207478719805562165">"Shelelisela ngakwesokunxele ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Ngeke uze uphazanyiswe yimisindo nokudlidliza, ngaphandle kokuvela kuma-alamu, izikhumbuzi, imicimbi, nabashayi obacacisayo."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Enza ngendlela oyifisayo"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Lokhu kuvimbela YONKE imisindo nokudludliza, kufaka phakathi ama-alamu, umculo, amavidiyo, namageyimu. Usazokwazi ukwenza amkholi wefoni."</string> + <!-- no translation found for zen_silence_introduction_voice (2284540992298200729) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Izaziso ezingasheshi kakhulu ezingezansi"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Thinta futhi ukuze uvule"</string> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 9a96939f700d..0dcbe884b30f 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -143,6 +143,4 @@ <color name="volume_icon_color">#ffffffff</color> <color name="volume_settings_icon_color">#7fffffff</color> <color name="volume_slider_inactive">#FFB0BEC5</color><!-- blue grey 200 --> - - <color name="managed_profile_toast_background">#E5000000</color><!-- 90% black --> </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index b0e71f916f20..869b03a8a7b5 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -575,4 +575,13 @@ <!-- Standard image button size for volume dialog buttons --> <dimen name="volume_button_size">48dp</dimen> + + <!-- Padding between icon and text for managed profile toast --> + <dimen name="managed_profile_toast_padding">4dp</dimen> + + <!-- Thickness of the assist disclosure beams --> + <dimen name="assist_disclosure_thickness">4dp</dimen> + + <!-- Thickness of the shadows of the assist disclosure beams --> + <dimen name="assist_disclosure_shadow_thickness">1.5dp</dimen> </resources> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 47c642dc9ccf..d32ce55d8495 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -215,6 +215,10 @@ <string name="accessibility_voice_assist_button">Voice Assist</string> <!-- Content description of the unlock button for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_unlock_button">Unlock</string> + <!-- Content description of the unlock button when fingerpint is on (not shown on the screen). [CHAR LIMIT=NONE] --> + <string name="accessibility_unlock_button_fingerprint">Unlock button, waiting for fingerprint</string> + <!-- Accessibility action of the unlock button when fingerpint is on (not shown on the screen). [CHAR LIMIT=NONE] --> + <string name="accessibility_unlock_without_fingerprint">Unlock without using your fingerprint</string> <!-- Click action label for accessibility for the unlock button. [CHAR LIMIT=NONE] --> <string name="unlock_label">unlock</string> <!-- Click action label for accessibility for the phone button. [CHAR LIMIT=NONE] --> @@ -751,8 +755,11 @@ <!-- Zen mode: Priority only customization button label --> <string name="zen_priority_customize_button">Customize</string> - <!-- Zen mode: Total silence introduction message on first use --> - <string name="zen_silence_introduction">This blocks ALL sounds and vibrations, including from alarms, music, videos, and games. You’ll still be able to make phone calls.</string> + <!-- Zen mode: Total silence introduction message on first use (voice capable devices) --> + <string name="zen_silence_introduction_voice">This blocks ALL sounds and vibrations, including from alarms, music, videos, and games. You’ll still be able to make phone calls.</string> + + <!-- Zen mode: Total silence introduction message on first use (non-voice capable devices) --> + <string name="zen_silence_introduction">This blocks ALL sounds and vibrations, including from alarms, music, videos, and games.</string> <!-- Text for overflow card on Keyguard when there is not enough space for all notifications on Keyguard. [CHAR LIMIT=1] --> <string name="keyguard_more_overflow_text">+<xliff:g id="number_of_notifications" example="5">%d</xliff:g></string> diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java b/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java new file mode 100644 index 000000000000..585f9ba63fce --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java @@ -0,0 +1,261 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.assist; + +import com.android.systemui.R; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ValueAnimator; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PixelFormat; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.os.Handler; +import android.view.View; +import android.view.WindowManager; +import android.view.animation.AnimationUtils; + +/** + * Visually discloses that contextual data was provided to an assistant. + */ +public class AssistDisclosure { + private final Context mContext; + private final WindowManager mWm; + private final Handler mHandler; + + private AssistDisclosureView mView; + private boolean mViewAdded; + + public AssistDisclosure(Context context, Handler handler) { + mContext = context; + mHandler = handler; + mWm = mContext.getSystemService(WindowManager.class); + } + + public void postShow() { + mHandler.removeCallbacks(mShowRunnable); + mHandler.post(mShowRunnable); + } + + private void show() { + if (mView == null) { + mView = new AssistDisclosureView(mContext); + } + if (!mViewAdded) { + WindowManager.LayoutParams lp = new WindowManager.LayoutParams( + WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED + | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_FULLSCREEN + | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED, + PixelFormat.TRANSLUCENT); + lp.setTitle("AssistDisclosure"); + + mWm.addView(mView, lp); + mViewAdded = true; + } + } + + private void hide() { + if (mViewAdded) { + mWm.removeView(mView); + mViewAdded = false; + } + } + + private Runnable mShowRunnable = new Runnable() { + @Override + public void run() { + show(); + } + }; + + private class AssistDisclosureView extends View + implements ValueAnimator.AnimatorUpdateListener { + + public static final int TRACING_ANIMATION_DURATION = 600; + public static final int ALPHA_IN_ANIMATION_DURATION = 450; + public static final int ALPHA_OUT_ANIMATION_DURATION = 400; + + private float mThickness; + private float mShadowThickness; + private final Paint mPaint = new Paint(); + private final Paint mShadowPaint = new Paint(); + + private final ValueAnimator mTracingAnimator; + private final ValueAnimator mAlphaOutAnimator; + private final ValueAnimator mAlphaInAnimator; + private final AnimatorSet mAnimator; + + private float mTracingProgress = 0; + private int mAlpha = 0; + + public AssistDisclosureView(Context context) { + super(context); + + mTracingAnimator = ValueAnimator.ofFloat(0, 1).setDuration(TRACING_ANIMATION_DURATION); + mTracingAnimator.addUpdateListener(this); + mTracingAnimator.setInterpolator(AnimationUtils.loadInterpolator(mContext, + R.interpolator.assist_disclosure_trace)); + mAlphaInAnimator = ValueAnimator.ofInt(0, 255).setDuration(ALPHA_IN_ANIMATION_DURATION); + mAlphaInAnimator.addUpdateListener(this); + mAlphaInAnimator.setInterpolator(AnimationUtils.loadInterpolator(mContext, + android.R.interpolator.fast_out_slow_in)); + mAlphaOutAnimator = ValueAnimator.ofInt(255, 0).setDuration( + ALPHA_OUT_ANIMATION_DURATION); + mAlphaOutAnimator.addUpdateListener(this); + mAlphaOutAnimator.setInterpolator(AnimationUtils.loadInterpolator(mContext, + android.R.interpolator.fast_out_linear_in)); + mAnimator = new AnimatorSet(); + mAnimator.play(mAlphaInAnimator).with(mTracingAnimator); + mAnimator.play(mAlphaInAnimator).before(mAlphaOutAnimator); + mAnimator.addListener(new AnimatorListenerAdapter() { + boolean mCancelled; + + @Override + public void onAnimationStart(Animator animation) { + mCancelled = false; + } + + @Override + public void onAnimationCancel(Animator animation) { + mCancelled = true; + } + + @Override + public void onAnimationEnd(Animator animation) { + if (!mCancelled) { + hide(); + } + } + }); + + PorterDuffXfermode srcMode = new PorterDuffXfermode(PorterDuff.Mode.SRC); + mPaint.setColor(Color.WHITE); + mPaint.setXfermode(srcMode); + mShadowPaint.setColor(Color.DKGRAY); + mShadowPaint.setXfermode(srcMode); + + mThickness = getResources().getDimension(R.dimen.assist_disclosure_thickness); + mShadowThickness = getResources().getDimension( + R.dimen.assist_disclosure_shadow_thickness); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + + startAnimation(); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + + mAnimator.cancel(); + + mTracingProgress = 0; + mAlpha = 0; + } + + private void startAnimation() { + mAnimator.cancel(); + mAnimator.start(); + } + + @Override + protected void onDraw(Canvas canvas) { + mPaint.setAlpha(mAlpha); + mShadowPaint.setAlpha(mAlpha / 4); + + drawGeometry(canvas, mShadowPaint, mShadowThickness); + drawGeometry(canvas, mPaint, 0); + } + + private void drawGeometry(Canvas canvas, Paint paint, float padding) { + final int width = getWidth(); + final int height = getHeight(); + float thickness = mThickness; + final float pixelProgress = mTracingProgress * (width + height - 2 * thickness); + + float bottomProgress = Math.min(pixelProgress, width / 2f); + if (bottomProgress > 0) { + drawBeam(canvas, + width / 2f - bottomProgress, + height - thickness, + width / 2f + bottomProgress, + height, paint, padding); + } + + float sideProgress = Math.min(pixelProgress - bottomProgress, height - thickness); + if (sideProgress > 0) { + drawBeam(canvas, + 0, + (height - thickness) - sideProgress, + thickness, + height - thickness, paint, padding); + drawBeam(canvas, + width - thickness, + (height - thickness) - sideProgress, + width, + height - thickness, paint, padding); + } + + float topProgress = Math.min(pixelProgress - bottomProgress - sideProgress, + width / 2 - thickness); + if (sideProgress > 0 && topProgress > 0) { + drawBeam(canvas, + thickness, + 0, + thickness + topProgress, + thickness, paint, padding); + drawBeam(canvas, + (width - thickness) - topProgress, + 0, + width - thickness, + thickness, paint, padding); + } + } + + private void drawBeam(Canvas canvas, float left, float top, float right, float bottom, + Paint paint, float padding) { + canvas.drawRect(left - padding, + top - padding, + right + padding, + bottom + padding, + paint); + } + + @Override + public void onAnimationUpdate(ValueAnimator animation) { + if (animation == mAlphaOutAnimator) { + mAlpha = (int) mAlphaOutAnimator.getAnimatedValue(); + } else if (animation == mAlphaInAnimator) { + mAlpha = (int) mAlphaInAnimator.getAnimatedValue(); + } else if (animation == mTracingAnimator) { + mTracingProgress = (float) mTracingAnimator.getAnimatedValue(); + } + invalidate(); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java index 445ecb659a63..674356b0f866 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java @@ -55,6 +55,8 @@ public class AssistManager { private final Context mContext; private final WindowManager mWindowManager; + private final AssistDisclosure mAssistDisclosure; + private AssistOrbContainer mView; private final PhoneStatusBar mBar; private final AssistUtils mAssistUtils; @@ -100,6 +102,7 @@ public class AssistManager { Settings.Secure.getUriFor(Settings.Secure.ASSISTANT), false, mAssistSettingsObserver); mAssistSettingsObserver.onChange(false); + mAssistDisclosure = new AssistDisclosure(context, new Handler()); } public void onConfigurationChanged() { @@ -187,8 +190,11 @@ public class AssistManager { mBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL | CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL); + boolean structureEnabled = Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1, UserHandle.USER_CURRENT) != 0; + final Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) - .getAssistIntent(mContext, true, UserHandle.USER_CURRENT); + .getAssistIntent(mContext, structureEnabled, UserHandle.USER_CURRENT); if (intent == null) { return; } @@ -196,6 +202,10 @@ public class AssistManager { intent.setComponent(mAssistComponent); } + if (structureEnabled) { + showDisclosure(); + } + try { final ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext, R.anim.search_launch_enter, R.anim.search_launch_exit); @@ -297,4 +307,8 @@ public class AssistManager { pw.println("AssistManager state:"); pw.print(" mAssistComponent="); pw.println(mAssistComponent); } + + public void showDisclosure() { + mAssistDisclosure.postShow(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index c06b34fa1ffb..80761d80fa99 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -62,6 +62,7 @@ import com.android.internal.telephony.IccCardConstants; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardConstants; import com.android.keyguard.KeyguardDisplayManager; +import com.android.keyguard.KeyguardSecurityView; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.keyguard.ViewMediatorCallback; @@ -526,6 +527,17 @@ public class KeyguardViewMediator extends SystemUI { public boolean isScreenOn() { return mDeviceInteractive; } + + @Override + public int getBouncerPromptReason() { + int currentUser = ActivityManager.getCurrentUser(); + if ((mUpdateMonitor.getUserTrustIsManaged(currentUser) + || mUpdateMonitor.isUnlockWithFingerPrintPossible(currentUser)) + && !mTrustManager.hasUserAuthenticatedSinceBoot(currentUser)) { + return KeyguardSecurityView.PROMPT_REASON_RESTART; + } + return KeyguardSecurityView.PROMPT_REASON_NONE; + } }; public void userActivity() { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 9761cd19e195..4b1453d09ed8 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -390,7 +390,7 @@ public class QSPanel extends ViewGroup { mDetailSettingsButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - mHost.startSettingsActivity(settingsIntent); + mHost.startActivityDismissingKeyguard(settingsIntent); } }); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java index 72bb136bcc99..38fade21390f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java @@ -306,7 +306,7 @@ public abstract class QSTile<TState extends State> implements Listenable { } public interface Host { - void startSettingsActivity(Intent intent); + void startActivityDismissingKeyguard(Intent intent); void warn(String message, Throwable t); void collapsePanels(); Looper getLooper(); 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 a9e8b383a8a0..07406b98f8be 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java @@ -82,7 +82,7 @@ public class CellularTile extends QSTile<QSTile.SignalState> { if (mDataController.isMobileDataSupported()) { showDetail(true); } else { - mHost.startSettingsActivity(CELLULAR_SETTINGS); + mHost.startActivityDismissingKeyguard(CELLULAR_SETTINGS); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java index f97f519cafc2..1b74eb6cd3be 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java @@ -263,7 +263,7 @@ public class DndTile extends QSTile<QSTile.BooleanState> { private final ZenModePanel.Callback mZenModePanelCallback = new ZenModePanel.Callback() { @Override public void onPrioritySettings() { - mHost.startSettingsActivity(ZEN_PRIORITY_SETTINGS); + mHost.startActivityDismissingKeyguard(ZEN_PRIORITY_SETTINGS); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java index 19f4df6ba06c..f7f7acb8a072 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java @@ -96,7 +96,11 @@ public class IntentTile extends QSTile<QSTile.State> { private void sendIntent(String type, PendingIntent pi, String uri) { try { if (pi != null) { - pi.send(); + if (pi.isActivity()) { + getHost().startActivityDismissingKeyguard(pi.getIntent()); + } else { + pi.send(); + } } else if (uri != null) { final Intent intent = Intent.parseUri(uri, Intent.URI_INTENT_SCHEME); mContext.sendBroadcastAsUser(intent, new UserHandle(mCurrentUserId)); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java index 9bc5b75632f7..c33ef7caeeab 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java @@ -104,7 +104,7 @@ public class WifiTile extends QSTile<QSTile.SignalState> { @Override protected void handleSecondaryClick() { if (!mWifiController.canConfigWifi()) { - mHost.startSettingsActivity(new Intent(Settings.ACTION_WIFI_SETTINGS)); + mHost.startActivityDismissingKeyguard(new Intent(Settings.ACTION_WIFI_SETTINGS)); return; } if (!mState.enabled) { @@ -290,7 +290,7 @@ public class WifiTile extends QSTile<QSTile.SignalState> { @Override public void onSettingsActivityTriggered(Intent settingsIntent) { - mHost.startSettingsActivity(settingsIntent); + mHost.startActivityDismissingKeyguard(settingsIntent); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java index 442af9060b8b..89c456ca42a5 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java @@ -316,14 +316,12 @@ public class Recents extends SystemUI void hideRecentsInternal(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) { if (mBootCompleted) { - ActivityManager.RunningTaskInfo topTask = mSystemServicesProxy.getTopMostTask(); - if (topTask != null && mSystemServicesProxy.isRecentsTopMost(topTask, null)) { - // Notify recents to hide itself - Intent intent = createLocalBroadcastIntent(mContext, ACTION_HIDE_RECENTS_ACTIVITY); - intent.putExtra(EXTRA_TRIGGERED_FROM_ALT_TAB, triggeredFromAltTab); - intent.putExtra(EXTRA_TRIGGERED_FROM_HOME_KEY, triggeredFromHomeKey); - mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT); - } + // Defer to the activity to handle hiding recents, if it handles it, then it must still + // be visible + Intent intent = createLocalBroadcastIntent(mContext, ACTION_HIDE_RECENTS_ACTIVITY); + intent.putExtra(EXTRA_TRIGGERED_FROM_ALT_TAB, triggeredFromAltTab); + intent.putExtra(EXTRA_TRIGGERED_FROM_HOME_KEY, triggeredFromHomeKey); + mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT); } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java index 38857995f050..3cd769eb43a9 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java @@ -134,9 +134,9 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView dismissRecentsToFocusedTaskOrHome(false); } else if (intent.getBooleanExtra(Recents.EXTRA_TRIGGERED_FROM_HOME_KEY, false)) { // Otherwise, dismiss Recents to Home - dismissRecentsToHome(true); + dismissRecentsToHomeRaw(true); } else { - // Do nothing, another activity is being launched on top of Recents + // Do nothing } } else if (action.equals(Recents.ACTION_TOGGLE_RECENTS_ACTIVITY)) { // If we are toggling Recents, then first unfilter any filtered stacks first diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsAppWidgetHost.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsAppWidgetHost.java index 02a7b94b93c1..d4e50f8ad1f7 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsAppWidgetHost.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsAppWidgetHost.java @@ -70,6 +70,7 @@ public class RecentsAppWidgetHost extends AppWidgetHost { @Override protected void onProviderChanged(int appWidgetId, AppWidgetProviderInfo appWidgetInfo) { if (mCb == null) return; + if (mContext == null) return; SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy(); if (appWidgetId > -1 && appWidgetId == mConfig.searchBarAppWidgetId) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 79761ec79028..295fdc81e775 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -41,6 +41,7 @@ import android.content.res.Resources; import android.database.ContentObserver; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; import android.os.AsyncTask; import android.os.Build; import android.os.Handler; @@ -392,13 +393,16 @@ public abstract class BaseStatusBar extends SystemUI implements if (recentTask != null && recentTask.size() > 0) { UserInfo user = mUserManager.getUserInfo(recentTask.get(0).userId); if (user != null && user.isManagedProfile()) { - LayoutInflater inflater = (LayoutInflater) mContext.getSystemService( - Context.LAYOUT_INFLATER_SERVICE); - View layout = inflater.inflate(R.layout.managed_profile_toast, null); - Toast toast = new Toast(mContext); - toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); - toast.setDuration(Toast.LENGTH_SHORT); - toast.setView(layout); + Toast toast = Toast.makeText(mContext, + R.string.managed_profile_foreground_toast, + Toast.LENGTH_SHORT); + TextView text = (TextView) toast.getView().findViewById( + android.R.id.message); + text.setCompoundDrawablesRelativeWithIntrinsicBounds( + R.drawable.stat_sys_managed_profile_status, 0, 0, 0); + int paddingPx = mContext.getResources().getDimensionPixelSize( + R.dimen.managed_profile_toast_padding); + text.setCompoundDrawablePadding(paddingPx); toast.show(); } } @@ -1396,6 +1400,7 @@ public abstract class BaseStatusBar extends SystemUI implements final StatusBarIcon ic = new StatusBarIcon( entry.notification.getUser(), + entry.notification.getPackageName(), entry.notification.getNotification().getSmallIcon(), entry.notification.getNotification().iconLevel, entry.notification.getNotification().number, @@ -1682,10 +1687,11 @@ public abstract class BaseStatusBar extends SystemUI implements final StatusBarIcon ic = new StatusBarIcon( sbn.getUser(), - n.getSmallIcon(), - n.iconLevel, - n.number, - n.tickerText); + sbn.getPackageName(), + n.getSmallIcon(), + n.iconLevel, + n.number, + n.tickerText); if (!iconView.set(ic)) { handleNotificationError(sbn, "Couldn't create icon: " + ic); return null; @@ -1825,6 +1831,7 @@ public abstract class BaseStatusBar extends SystemUI implements // Update the icon final StatusBarIcon ic = new StatusBarIcon( notification.getUser(), + notification.getPackageName(), n.getSmallIcon(), n.iconLevel, n.number, @@ -1847,6 +1854,7 @@ public abstract class BaseStatusBar extends SystemUI implements if (DEBUG) Log.d(TAG, "not reusing notification for key: " + key); final StatusBarIcon ic = new StatusBarIcon( notification.getUser(), + notification.getPackageName(), n.getSmallIcon(), n.iconLevel, n.number, @@ -2093,4 +2101,11 @@ public abstract class BaseStatusBar extends SystemUI implements } return mStatusBarKeyguardViewManager.isSecure(); } + + @Override + public void showAssistDisclosure() { + if (mAssistManager != null) { + mAssistManager.showDisclosure(); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 80fdd288781e..0deff08367f0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -61,6 +61,7 @@ public class CommandQueue extends IStatusBar.Stub { private static final int MSG_APP_TRANSITION_PENDING = 19 << MSG_SHIFT; private static final int MSG_APP_TRANSITION_CANCELLED = 20 << MSG_SHIFT; private static final int MSG_APP_TRANSITION_STARTING = 21 << MSG_SHIFT; + private static final int MSG_ASSIST_DISCLOSURE = 22 << MSG_SHIFT; public static final int FLAG_EXCLUDE_NONE = 0; public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0; @@ -104,6 +105,7 @@ public class CommandQueue extends IStatusBar.Stub { public void appTransitionPending(); public void appTransitionCancelled(); public void appTransitionStarting(long startTime, long duration); + public void showAssistDisclosure(); } public CommandQueue(Callbacks callbacks, StatusBarIconList list) { @@ -274,6 +276,13 @@ public class CommandQueue extends IStatusBar.Stub { } } + public void showAssistDisclosure() { + synchronized (mList) { + mHandler.removeMessages(MSG_ASSIST_DISCLOSURE); + mHandler.obtainMessage(MSG_ASSIST_DISCLOSURE).sendToTarget(); + } + } + private final class H extends Handler { public void handleMessage(Message msg) { final int what = msg.what & MSG_MASK; @@ -366,6 +375,9 @@ public class CommandQueue extends IStatusBar.Stub { Pair<Long, Long> data = (Pair<Long, Long>) msg.obj; mCallbacks.appTransitionStarting(data.first, data.second); break; + case MSG_ASSIST_DISCLOSURE: + mCallbacks.showAssistDisclosure(); + break; } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java index dbabe3f61025..aedae521a7d4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java @@ -125,16 +125,22 @@ public class NotificationData { @Override public int compare(Entry a, Entry b) { - String mediaNotification = mEnvironment.getCurrentMediaNotificationKey(); - boolean aMedia = a.key.equals(mediaNotification); - boolean bMedia = b.key.equals(mediaNotification); - final StatusBarNotification na = a.notification; final StatusBarNotification nb = b.notification; + final int aPriority = na.getNotification().priority; + final int bPriority = nb.getNotification().priority; + + String mediaNotification = mEnvironment.getCurrentMediaNotificationKey(); + + // PRIORITY_MIN media streams are allowed to drift to the bottom + final boolean aMedia = a.key.equals(mediaNotification) + && aPriority > Notification.PRIORITY_MIN; + final boolean bMedia = b.key.equals(mediaNotification) + && bPriority > Notification.PRIORITY_MIN; - boolean aSystemMax = na.getNotification().priority >= Notification.PRIORITY_MAX && + boolean aSystemMax = aPriority >= Notification.PRIORITY_MAX && isSystemNotification(na); - boolean bSystemMax = nb.getNotification().priority >= Notification.PRIORITY_MAX && + boolean bSystemMax = bPriority >= Notification.PRIORITY_MAX && isSystemNotification(nb); int d = nb.getScore() - na.getScore(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java index 26d1c867ab08..fcdd4b7cd24b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java @@ -124,6 +124,9 @@ public class DemoStatusIcons extends LinearLayout implements DemoMode { private void updateSlot(String slot, String iconPkg, int iconId) { if (!mDemoMode) return; + if (iconPkg == null) { + iconPkg = mContext.getPackageName(); + } int removeIndex = -1; for (int i = 0; i < getChildCount(); i++) { StatusBarIconView v = (StatusBarIconView) getChildAt(i); @@ -143,10 +146,10 @@ public class DemoStatusIcons extends LinearLayout implements DemoMode { if (iconId == 0) { if (removeIndex != -1) { removeViewAt(removeIndex); - return; } + return; } - StatusBarIcon icon = new StatusBarIcon(iconPkg, UserHandle.CURRENT, iconId, 0, 0, "Demo"); + StatusBarIcon icon = new StatusBarIcon(iconPkg, UserHandle.OWNER, iconId, 0, 0, "Demo"); StatusBarIconView v = new StatusBarIconView(getContext(), null, null); v.setTag(slot); v.set(icon); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java index 3258a9f93201..815e1235f854 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -614,6 +614,13 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL } }; + private final Runnable mHideTransientIndicationRunnable = new Runnable() { + @Override + public void run() { + mIndicationController.hideTransientIndication(); + } + }; + private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { @Override @@ -657,6 +664,10 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL @Override public void onFingerprintError(int msgId, String errString) { // TODO: Go to bouncer if this is "too many attempts" (lockout) error. + mIndicationController.showTransientIndication(errString, + getResources().getColor(R.color.system_warning_color, null)); + removeCallbacks(mHideTransientIndicationRunnable); + postDelayed(mHideTransientIndicationRunnable, 5000); } }; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index 3737d0581761..a3bb1296dccd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -26,6 +26,7 @@ import android.view.accessibility.AccessibilityEvent; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardHostView; +import com.android.keyguard.KeyguardSecurityView; import com.android.keyguard.R; import com.android.keyguard.ViewMediatorCallback; @@ -46,6 +47,7 @@ public class KeyguardBouncer { private ViewGroup mRoot; private boolean mShowingSoon; private Choreographer mChoreographer = Choreographer.getInstance(); + private int mBouncerPromptReason; public KeyguardBouncer(Context context, ViewMediatorCallback callback, LockPatternUtils lockPatternUtils, StatusBarWindowManager windowManager, @@ -68,6 +70,8 @@ public class KeyguardBouncer { return; } + mBouncerPromptReason = mCallback.getBouncerPromptReason(); + // Try to dismiss the Keyguard. If no security pattern is set, this will dismiss the whole // Keyguard. If we need to authenticate, show the bouncer. if (!mKeyguardView.dismiss()) { @@ -84,12 +88,24 @@ public class KeyguardBouncer { public void run() { mRoot.setVisibility(View.VISIBLE); mKeyguardView.onResume(); + showPromptReason(mBouncerPromptReason); mKeyguardView.startAppearAnimation(); mShowingSoon = false; mKeyguardView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); } }; + /** + * Show a string explaining why the security view needs to be solved. + * + * @param reason a flag indicating which string should be shown, see + * {@link KeyguardSecurityView#PROMPT_REASON_NONE} + * and {@link KeyguardSecurityView#PROMPT_REASON_RESTART} + */ + public void showPromptReason(int reason) { + mKeyguardView.showPromptReason(reason); + } + private void cancelShowRunnable() { mChoreographer.removeCallbacks(Choreographer.CALLBACK_ANIMATION, mShowRunnable, null); mShowingSoon = false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index 2063b2699ca1..f5fdf4876389 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -16,14 +16,13 @@ package com.android.systemui.statusbar.phone; -import android.annotation.NonNull; -import android.annotation.Nullable; import android.content.Context; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.InsetDrawable; import android.util.AttributeSet; import android.view.View; +import android.view.accessibility.AccessibilityNodeInfo; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.R; @@ -54,6 +53,7 @@ public class LockIcon extends KeyguardAffordanceView { private final TrustDrawable mTrustDrawable; private final UnlockMethodCache mUnlockMethodCache; private AccessibilityController mAccessibilityController; + private boolean mHasFingerPrintIcon; public LockIcon(Context context, AttributeSet attrs) { super(context, attrs); @@ -128,6 +128,11 @@ public class LockIcon extends KeyguardAffordanceView { setRestingAlpha( anyFingerprintIcon ? 1f : KeyguardAffordanceHelper.SWIPE_RESTING_ALPHA_AMOUNT); setImageDrawable(icon); + String contentDescription = getResources().getString(anyFingerprintIcon + ? R.string.accessibility_unlock_button_fingerprint + : R.string.accessibility_unlock_button); + setContentDescription(contentDescription); + mHasFingerPrintIcon = anyFingerprintIcon; if (animation != null) { // If we play the draw on animation, delay it by one frame when the screen is @@ -167,6 +172,20 @@ public class LockIcon extends KeyguardAffordanceView { setFocusable(mAccessibilityController.isAccessibilityEnabled()); } + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + if (mHasFingerPrintIcon) { + // Avoid that the button description is also spoken + info.setClassName(LockIcon.class.getName()); + AccessibilityNodeInfo.AccessibilityAction unlock + = new AccessibilityNodeInfo.AccessibilityAction( + AccessibilityNodeInfo.ACTION_CLICK, + getContext().getString(R.string.accessibility_unlock_without_fingerprint)); + info.addAction(unlock); + } + } + public void setAccessibilityController(AccessibilityController accessibilityController) { mAccessibilityController = accessibilityController; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 495f0fda8007..c30cb34592cb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -491,7 +491,7 @@ public class NotificationPanelView extends PanelView implements } public void closeQs() { - cancelAnimation(); + cancelQsAnimation(); setQsExpansion(mQsMinExpansionHeight); } @@ -508,7 +508,7 @@ public class NotificationPanelView extends PanelView implements } public void openQs() { - cancelAnimation(); + cancelQsAnimation(); if (mQsExpansionEnabled) { setQsExpansion(mQsMaxExpansionHeight); } @@ -921,7 +921,7 @@ public class NotificationPanelView extends PanelView implements @Override public void onOverscrollTopChanged(float amount, boolean isRubberbanded) { - cancelAnimation(); + cancelQsAnimation(); if (!mQsExpansionEnabled) { amount = 0f; } @@ -953,7 +953,8 @@ public class NotificationPanelView extends PanelView implements } private void onQsExpansionStarted(int overscrollAmount) { - cancelAnimation(); + cancelQsAnimation(); + cancelHeightAnimator(); // Reset scroll position and apply that position to the expanded height. float height = mQsExpansionHeight - mScrollView.getScrollY() - overscrollAmount; @@ -1391,7 +1392,7 @@ public class NotificationPanelView extends PanelView implements return mVelocityTracker.getYVelocity(); } - private void cancelAnimation() { + private void cancelQsAnimation() { if (mQsExpansionAnimator != null) { mQsExpansionAnimator.cancel(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index 9d4997c48a66..094d5f0b7601 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -535,7 +535,7 @@ public abstract class PanelView extends FrameLayout { */ protected abstract boolean isInContentBounds(float x, float y); - private void cancelHeightAnimator() { + protected void cancelHeightAnimator() { if (mHeightAnimator != null) { mHeightAnimator.cancel(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 69198ed6d6bf..ade40e507173 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -3101,16 +3101,16 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, || (mDisabled1 & StatusBarManager.DISABLE_SEARCH) != 0; } - public void postStartSettingsActivity(final Intent intent, int delay) { + public void postStartActivityDismissingKeyguard(final Intent intent, int delay) { mHandler.postDelayed(new Runnable() { @Override public void run() { - handleStartSettingsActivity(intent, true /*onlyProvisioned*/); + handleStartActivityDismissingKeyguard(intent, true /*onlyProvisioned*/); } }, delay); } - private void handleStartSettingsActivity(Intent intent, boolean onlyProvisioned) { + private void handleStartActivityDismissingKeyguard(Intent intent, boolean onlyProvisioned) { startActivityDismissingKeyguard(intent, onlyProvisioned, true /* dismissShade */); } @@ -3460,6 +3460,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mKeyguardIndicationController.setVisible(true); mNotificationPanel.resetViews(); mKeyguardUserSwitcher.setKeyguard(true, fromShadeLocked); + mStatusBarView.removePendingHideExpandedRunnables(); } else { mKeyguardIndicationController.setVisible(false); mKeyguardUserSwitcher.setKeyguard(false, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index dfd280aa09b6..6a469243c565 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -42,6 +42,12 @@ public class PhoneStatusBarView extends PanelBar { private ScrimController mScrimController; private float mMinFraction; private float mPanelFraction; + private Runnable mHideExpandedRunnable = new Runnable() { + @Override + public void run() { + mBar.makeExpandedInvisible(); + } + }; public PhoneStatusBarView(Context context, AttributeSet attrs) { super(context, attrs); @@ -118,15 +124,14 @@ public class PhoneStatusBarView extends PanelBar { + Log.getStackTraceString(new Throwable())); } // Close the status bar in the next frame so we can show the end of the animation. - postOnAnimation(new Runnable() { - @Override - public void run() { - mBar.makeExpandedInvisible(); - } - }); + postOnAnimation(mHideExpandedRunnable); mLastFullyOpenedPanel = null; } + public void removePendingHideExpandedRunnables() { + removeCallbacks(mHideExpandedRunnable); + } + @Override public void onPanelFullyOpened(PanelView openPanel) { super.onPanelFullyOpened(openPanel); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java index 25a93ddfd819..12434ac2af5b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java @@ -129,8 +129,8 @@ public class QSTileHost implements QSTile.Host, Tunable { } @Override - public void startSettingsActivity(final Intent intent) { - mStatusBar.postStartSettingsActivity(intent, 0); + public void startActivityDismissingKeyguard(final Intent intent) { + mStatusBar.postStartActivityDismissingKeyguard(intent, 0); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java index 0eb719767979..d1e4963f18ec 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java @@ -116,7 +116,7 @@ public class AccessPointControllerImpl // Unknown network, need to add it. if (ap.getSecurity() != AccessPoint.SECURITY_NONE) { Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); - intent.putExtra(EXTRA_START_CONNECT_SSID, ap.getSsid()); + intent.putExtra(EXTRA_START_CONNECT_SSID, ap.getSsidStr()); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); fireSettingsIntentCallback(intent); return true; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java index 3cc92978d393..daa84ad80ccf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java @@ -154,6 +154,12 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa } private void updateConnected() { + // Make sure our connection state is up to date. + int state = mLocalBluetoothManager.getBluetoothAdapter().getConnectionState(); + if (state != mConnectionState) { + mConnectionState = state; + mHandler.sendEmptyMessage(H.MSG_STATE_CHANGED); + } if (mLastDevice != null && mLastDevice.isConnected()) { // Our current device is still valid. return; @@ -203,9 +209,9 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa @Override public void onConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) { - mConnectionState = state; mLastDevice = cachedDevice; updateConnected(); + mConnectionState = state; mHandler.sendEmptyMessage(H.MSG_STATE_CHANGED); } 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 0aa0b4a3dded..b21767b1a262 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -191,6 +191,7 @@ public class MobileSignalController extends SignalController< } else { mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE, TelephonyIcons.LTE); } + mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_IWLAN, TelephonyIcons.FOUR_G); } @Override 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 18b582040db1..1ba87dad7af5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -408,7 +408,7 @@ public class NetworkControllerImpl extends BroadcastReceiver boolean hasNoSims = mHasMobileDataFeature && mMobileSignalControllers.size() == 0; if (hasNoSims != mHasNoSims) { mHasNoSims = hasNoSims; - notifyListeners(); + mCallbackHandler.setNoSims(mHasNoSims); } } @@ -660,8 +660,8 @@ public class NetworkControllerImpl extends BroadcastReceiver } String nosim = args.getString("nosim"); if (nosim != null) { - boolean show = nosim.equals("show"); - mCallbackHandler.setNoSims(show); + mHasNoSims = nosim.equals("show"); + mCallbackHandler.setNoSims(mHasNoSims); } String mobile = args.getString("mobile"); if (mobile != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index 1bf4547c61db..57007321f7d1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -228,6 +228,7 @@ public class NotificationStackScrollLayout extends ViewGroup private ScrimController mScrimController; private boolean mForceNoOverlappingRendering; private NotificationOverflowContainer mOverflowContainer; + private final ArrayList<Pair<ExpandableNotificationRow, Boolean>> mTmpList = new ArrayList<>(); public NotificationStackScrollLayout(Context context) { this(context, null); @@ -1608,7 +1609,7 @@ public class NotificationStackScrollLayout extends ViewGroup } @Override - protected void onViewRemoved(View child) { + public void onViewRemoved(View child) { super.onViewRemoved(child); // we only call our internal methods if this is actually a removal and not just a // notification which becomes a child notification @@ -1651,8 +1652,7 @@ public class NotificationStackScrollLayout extends ViewGroup * @return Whether an animation was generated. */ private boolean generateRemoveAnimation(View child) { - if (mAddedHeadsUpChildren.contains(child)) { - removeChildFromHeadsUpChangeAnimations(child); + if (removeRemovedChildFromHeadsUpChangeAnimations(child)) { mAddedHeadsUpChildren.remove(child); return false; } @@ -1671,15 +1671,27 @@ public class NotificationStackScrollLayout extends ViewGroup return false; } - private void removeChildFromHeadsUpChangeAnimations(View child) { - ArrayList<Pair<ExpandableNotificationRow, Boolean> > toRemove = new ArrayList<>(); + /** + * Remove a removed child view from the heads up animations if it was just added there + * + * @return whether any child was removed from the list to animate + */ + private boolean removeRemovedChildFromHeadsUpChangeAnimations(View child) { + boolean hasAddEvent = false; for (Pair<ExpandableNotificationRow, Boolean> eventPair : mHeadsUpChangeAnimations) { ExpandableNotificationRow row = eventPair.first; + boolean isHeadsUp = eventPair.second; if (child == row) { - toRemove.add(eventPair); + mTmpList.add(eventPair); + hasAddEvent |= isHeadsUp; } } - mHeadsUpChangeAnimations.removeAll(toRemove); + if (hasAddEvent) { + // This child was just added lets remove all events. + mHeadsUpChangeAnimations.removeAll(mTmpList); + } + mTmpList.clear(); + return hasAddEvent; } /** @@ -1745,7 +1757,7 @@ public class NotificationStackScrollLayout extends ViewGroup } @Override - protected void onViewAdded(View child) { + public void onViewAdded(View child) { super.onViewAdded(child); onViewAddedInternal(child); } diff --git a/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java index d9f05986efd1..ca6aaeba8c0a 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java @@ -131,11 +131,14 @@ public class DemoModeFragment extends PreferenceFragment implements OnPreference intent.putExtra("mobile", "show"); intent.putExtra("sims", "1"); intent.putExtra("nosim", "false"); - intent.putExtra("fully", "true"); intent.putExtra("level", "4"); intent.putExtra("datatypel", ""); getContext().sendBroadcast(intent); + // Need to send this after so that the sim controller already exists. + intent.putExtra("fully", "true"); + getContext().sendBroadcast(intent); + intent.putExtra(DemoMode.EXTRA_COMMAND, DemoMode.COMMAND_BATTERY); intent.putExtra("level", "100"); intent.putExtra("plugged", "false"); diff --git a/packages/SystemUI/src/com/android/systemui/volume/Events.java b/packages/SystemUI/src/com/android/systemui/volume/Events.java index 12dca94614ab..893c9395f23f 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/Events.java +++ b/packages/SystemUI/src/com/android/systemui/volume/Events.java @@ -16,11 +16,13 @@ package com.android.systemui.volume; +import android.content.Context; import android.media.AudioManager; import android.media.AudioSystem; import android.provider.Settings.Global; import android.util.Log; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.volume.VolumeDialogController.State; import java.util.Arrays; @@ -47,6 +49,7 @@ public class Events { public static final int EVENT_ZEN_MODE_CHANGED = 13; // (mode|int) public static final int EVENT_SUPPRESSOR_CHANGED = 14; // (component|string) (name|string) public static final int EVENT_MUTE_CHANGED = 15; // (stream|int) (muted|bool) + public static final int EVENT_TOUCH_LEVEL_DONE = 16; // (stream|int) (level|bool) private static final String[] EVENT_TAGS = { "show_dialog", @@ -65,6 +68,7 @@ public class Events { "zen_mode_changed", "suppressor_changed", "mute_changed", + "touch_level_done", }; public static final int DISMISS_REASON_UNKNOWN = 0; @@ -100,36 +104,59 @@ public class Events { public static Callback sCallback; - public static void writeEvent(int tag, Object... list) { + public static void writeEvent(Context context, int tag, Object... list) { final long time = System.currentTimeMillis(); final StringBuilder sb = new StringBuilder("writeEvent ").append(EVENT_TAGS[tag]); if (list != null && list.length > 0) { sb.append(" "); switch (tag) { case EVENT_SHOW_DIALOG: + MetricsLogger.visible(context, MetricsLogger.VOLUME_DIALOG); + MetricsLogger.histogram(context, "volume_from_keyguard", + (Boolean) list[1] ? 1 : 0); sb.append(SHOW_REASONS[(Integer) list[0]]).append(" keyguard=").append(list[1]); break; case EVENT_EXPAND: + MetricsLogger.visibility(context, MetricsLogger.VOLUME_DIALOG_DETAILS, + (Boolean) list[0]); sb.append(list[0]); break; case EVENT_DISMISS_DIALOG: + MetricsLogger.hidden(context, MetricsLogger.VOLUME_DIALOG); sb.append(DISMISS_REASONS[(Integer) list[0]]); break; case EVENT_ACTIVE_STREAM_CHANGED: + MetricsLogger.action(context, MetricsLogger.ACTION_VOLUME_STREAM, + (Integer) list[0]); sb.append(AudioSystem.streamToString((Integer) list[0])); break; case EVENT_ICON_CLICK: + MetricsLogger.action(context, MetricsLogger.ACTION_VOLUME_ICON, + (Integer) list[1]); sb.append(AudioSystem.streamToString((Integer) list[0])).append(' ') .append(iconStateToString((Integer) list[1])); break; + case EVENT_TOUCH_LEVEL_DONE: + MetricsLogger.action(context, MetricsLogger.ACTION_VOLUME_SLIDER, + (Integer) list[1]); + // fall through case EVENT_TOUCH_LEVEL_CHANGED: case EVENT_LEVEL_CHANGED: case EVENT_MUTE_CHANGED: sb.append(AudioSystem.streamToString((Integer) list[0])).append(' ') .append(list[1]); break; - case EVENT_INTERNAL_RINGER_MODE_CHANGED: + case EVENT_KEY: + MetricsLogger.action(context, MetricsLogger.ACTION_VOLUME_KEY, + (Integer) list[1]); + sb.append(AudioSystem.streamToString((Integer) list[0])).append(' ') + .append(list[1]); + break; case EVENT_EXTERNAL_RINGER_MODE_CHANGED: + MetricsLogger.action(context, MetricsLogger.ACTION_RINGER_MODE, + (Integer) list[0]); + // fall through + case EVENT_INTERNAL_RINGER_MODE_CHANGED: sb.append(ringerModeToString((Integer) list[0])); break; case EVENT_ZEN_MODE_CHANGED: diff --git a/packages/SystemUI/src/com/android/systemui/volume/Util.java b/packages/SystemUI/src/com/android/systemui/volume/Util.java index 421409156a38..a46a44d9c8e3 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/Util.java +++ b/packages/SystemUI/src/com/android/systemui/volume/Util.java @@ -16,11 +16,13 @@ package com.android.systemui.volume; +import android.content.Context; import android.media.AudioManager; import android.media.MediaMetadata; import android.media.VolumeProvider; import android.media.session.MediaController.PlaybackInfo; import android.media.session.PlaybackState; +import android.telephony.TelephonyManager; import android.view.View; import android.widget.TextView; @@ -164,4 +166,9 @@ class Util { v.setVisibility(vis ? View.VISIBLE : View.INVISIBLE); } + public static boolean isVoiceCapable(Context context) { + final TelephonyManager telephony = + (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + return telephony != null && telephony.isVoiceCapable(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java index aa891b6faf67..5b2eb848afa8 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java @@ -369,7 +369,7 @@ public class VolumeDialog { row.icon.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - Events.writeEvent(Events.EVENT_ICON_CLICK, row.stream, row.iconState); + Events.writeEvent(mContext, Events.EVENT_ICON_CLICK, row.stream, row.iconState); mController.setActiveStream(row.stream); if (row.stream == AudioManager.STREAM_RING) { final boolean hasVibrator = mController.hasVibrator(); @@ -417,7 +417,7 @@ public class VolumeDialog { if (mShowing) return; mShowing = true; mDialog.show(); - Events.writeEvent(Events.EVENT_SHOW_DIALOG, reason, mKeyguard.isKeyguardLocked()); + Events.writeEvent(mContext, Events.EVENT_SHOW_DIALOG, reason, mKeyguard.isKeyguardLocked()); mController.notifyVisible(true); } @@ -444,7 +444,7 @@ public class VolumeDialog { if (!mShowing) return; mShowing = false; mDialog.dismiss(); - Events.writeEvent(Events.EVENT_DISMISS_DIALOG, reason); + Events.writeEvent(mContext, Events.EVENT_DISMISS_DIALOG, reason); setExpandedH(false); mController.notifyVisible(false); synchronized (mSafetyWarningLock) { @@ -834,7 +834,7 @@ public class VolumeDialog { public void onClick(View v) { if (mExpanding) return; final boolean newExpand = !mExpanded; - Events.writeEvent(Events.EVENT_EXPAND, v); + Events.writeEvent(mContext, Events.EVENT_EXPAND, newExpand); setExpandedH(newExpand); } }; @@ -845,7 +845,7 @@ public class VolumeDialog { mSettingsButton.postDelayed(new Runnable() { @Override public void run() { - Events.writeEvent(Events.EVENT_SETTINGS_CLICK); + Events.writeEvent(mContext, Events.EVENT_SETTINGS_CLICK); if (mCallback != null) { mCallback.onSettingsClicked(); } @@ -933,7 +933,8 @@ public class VolumeDialog { if (mRow.requestedLevel != userLevel) { mController.setStreamVolume(mRow.stream, userLevel); mRow.requestedLevel = userLevel; - Events.writeEvent(Events.EVENT_TOUCH_LEVEL_CHANGED, mRow.stream, userLevel); + Events.writeEvent(mContext, Events.EVENT_TOUCH_LEVEL_CHANGED, mRow.stream, + userLevel); } } } @@ -951,6 +952,7 @@ public class VolumeDialog { mRow.tracking = false; mRow.userAttempt = SystemClock.uptimeMillis(); int userLevel = getImpliedLevel(seekBar, seekBar.getProgress()); + Events.writeEvent(mContext, Events.EVENT_TOUCH_LEVEL_DONE, mRow.stream, userLevel); if (mRow.ss.level != userLevel) { mHandler.sendMessageDelayed(mHandler.obtainMessage(H.RECHECK, mRow), USER_ATTEMPT_GRACE_PERIOD); diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java index c6d9e466c2a4..9a59a2af9886 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java @@ -104,7 +104,7 @@ public class VolumeDialogController { public VolumeDialogController(Context context, ComponentName component) { mContext = context.getApplicationContext(); - Events.writeEvent(Events.EVENT_COLLECTION_STARTED); + Events.writeEvent(mContext, Events.EVENT_COLLECTION_STARTED); mComponent = component; mWorkerThread = new HandlerThread(VolumeDialogController.class.getSimpleName()); mWorkerThread.start(); @@ -168,7 +168,7 @@ public class VolumeDialogController { if (D.BUG) Log.d(TAG, "destroy"); if (mDestroyed) return; mDestroyed = true; - Events.writeEvent(Events.EVENT_COLLECTION_STOPPED); + Events.writeEvent(mContext, Events.EVENT_COLLECTION_STOPPED); mMediaSessions.destroy(); mObserver.destroy(); mReceiver.destroy(); @@ -293,7 +293,8 @@ public class VolumeDialogController { if (showUI) { changed |= updateActiveStreamW(stream); } - changed |= updateStreamLevelW(stream, mAudio.getLastAudibleStreamVolume(stream)); + int lastAudibleStreamVolume = mAudio.getLastAudibleStreamVolume(stream); + changed |= updateStreamLevelW(stream, lastAudibleStreamVolume); changed |= checkRoutedToBluetoothW(showUI ? AudioManager.STREAM_MUSIC : stream); if (changed) { mCallbacks.onStateChanged(mState); @@ -308,14 +309,14 @@ public class VolumeDialogController { mCallbacks.onShowSilentHint(); } if (changed && fromKey) { - Events.writeEvent(Events.EVENT_KEY); + Events.writeEvent(mContext, Events.EVENT_KEY, stream, lastAudibleStreamVolume); } } private boolean updateActiveStreamW(int activeStream) { if (activeStream == mState.activeStream) return false; mState.activeStream = activeStream; - Events.writeEvent(Events.EVENT_ACTIVE_STREAM_CHANGED, activeStream); + Events.writeEvent(mContext, Events.EVENT_ACTIVE_STREAM_CHANGED, activeStream); if (D.BUG) Log.d(TAG, "updateActiveStreamW " + activeStream); final int s = activeStream < DYNAMIC_STREAM_START_INDEX ? activeStream : -1; if (D.BUG) Log.d(TAG, "forceVolumeControlStream " + s); @@ -364,7 +365,7 @@ public class VolumeDialogController { if (ss.level == level) return false; ss.level = level; if (isLogWorthy(stream)) { - Events.writeEvent(Events.EVENT_LEVEL_CHANGED, stream, level); + Events.writeEvent(mContext, Events.EVENT_LEVEL_CHANGED, stream, level); } return true; } @@ -387,7 +388,7 @@ public class VolumeDialogController { if (ss.muted == muted) return false; ss.muted = muted; if (isLogWorthy(stream)) { - Events.writeEvent(Events.EVENT_MUTE_CHANGED, stream, muted); + Events.writeEvent(mContext, Events.EVENT_MUTE_CHANGED, stream, muted); } if (muted && isRinger(stream)) { updateRingerModeInternalW(mAudio.getRingerModeInternal()); @@ -410,7 +411,7 @@ public class VolumeDialogController { if (Objects.equals(mState.effectsSuppressor, effectsSuppressor)) return false; mState.effectsSuppressor = effectsSuppressor; mState.effectsSuppressorName = getApplicationName(mContext, mState.effectsSuppressor); - Events.writeEvent(Events.EVENT_SUPPRESSOR_CHANGED, mState.effectsSuppressor, + Events.writeEvent(mContext, Events.EVENT_SUPPRESSOR_CHANGED, mState.effectsSuppressor, mState.effectsSuppressorName); return true; } @@ -434,21 +435,21 @@ public class VolumeDialogController { Settings.Global.ZEN_MODE, Settings.Global.ZEN_MODE_OFF); if (mState.zenMode == zen) return false; mState.zenMode = zen; - Events.writeEvent(Events.EVENT_ZEN_MODE_CHANGED, zen); + Events.writeEvent(mContext, Events.EVENT_ZEN_MODE_CHANGED, zen); return true; } private boolean updateRingerModeExternalW(int rm) { if (rm == mState.ringerModeExternal) return false; mState.ringerModeExternal = rm; - Events.writeEvent(Events.EVENT_EXTERNAL_RINGER_MODE_CHANGED, rm); + Events.writeEvent(mContext, Events.EVENT_EXTERNAL_RINGER_MODE_CHANGED, rm); return true; } private boolean updateRingerModeInternalW(int rm) { if (rm == mState.ringerModeInternal) return false; mState.ringerModeInternal = rm; - Events.writeEvent(Events.EVENT_INTERNAL_RINGER_MODE_CHANGED, rm); + Events.writeEvent(mContext, Events.EVENT_INTERNAL_RINGER_MODE_CHANGED, rm); return true; } diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java index a0eb61fc50e3..8035cd3a2d5e 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java @@ -118,6 +118,7 @@ public class ZenModePanel extends LinearLayout { private Condition mSessionExitCondition; private Condition[] mConditions; private Condition mTimeCondition; + private boolean mVoiceCapable; public ZenModePanel(Context context, AttributeSet attrs) { super(context, attrs); @@ -127,6 +128,7 @@ public class ZenModePanel extends LinearLayout { mIconPulser = new IconPulser(mContext); mForeverId = Condition.newId(mContext).appendPath("forever").build(); mSpTexts = new SpTexts(mContext); + mVoiceCapable = Util.isVoiceCapable(mContext); if (DEBUG) Log.d(mTag, "new ZenModePanel"); } @@ -144,6 +146,7 @@ public class ZenModePanel extends LinearLayout { pw.println(mPrefs.mConfirmedPriorityIntroduction); pw.print(" mConfirmedSilenceIntroduction="); pw.println(mPrefs.mConfirmedSilenceIntroduction); + pw.print(" mVoiceCapable="); pw.println(mVoiceCapable); mTransitionHelper.dump(fd, pw, args); } @@ -444,6 +447,7 @@ public class ZenModePanel extends LinearLayout { mZenIntroduction.setVisibility(introduction ? VISIBLE : GONE); if (introduction) { mZenIntroductionMessage.setText(zenImportant ? R.string.zen_priority_introduction + : mVoiceCapable ? R.string.zen_silence_introduction_voice : R.string.zen_silence_introduction); mZenIntroductionCustomize.setVisibility(zenImportant ? VISIBLE : GONE); } diff --git a/packages/VpnDialogs/AndroidManifest.xml b/packages/VpnDialogs/AndroidManifest.xml index 32e1e6de687f..375c5d8aeda9 100644 --- a/packages/VpnDialogs/AndroidManifest.xml +++ b/packages/VpnDialogs/AndroidManifest.xml @@ -24,7 +24,7 @@ <application android:label="VpnDialogs" android:allowBackup="false" > <activity android:name=".ConfirmDialog" - android:theme="@*android:style/Theme.Material.DayNight.Dialog.Alert"> + android:theme="@*android:style/Theme.DeviceDefault.Light.Dialog.Alert"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.DEFAULT"/> @@ -32,7 +32,7 @@ </activity> <activity android:name=".ManageDialog" - android:theme="@*android:style/Theme.Material.DayNight.Dialog.Alert" + android:theme="@*android:style/Theme.DeviceDefault.Light.Dialog.Alert" android:noHistory="true"> <intent-filter> <action android:name="android.intent.action.MAIN"/> diff --git a/packages/WallpaperCropper/res/values/styles.xml b/packages/WallpaperCropper/res/values/styles.xml index e438c84027db..a34b25a8dc31 100644 --- a/packages/WallpaperCropper/res/values/styles.xml +++ b/packages/WallpaperCropper/res/values/styles.xml @@ -15,13 +15,13 @@ --> <resources> - <style name="Theme.WallpaperCropper" parent="@android:style/Theme.Material.DayNight"> + <style name="Theme.WallpaperCropper" parent="@android:style/Theme.DeviceDefault"> <item name="android:actionBarStyle">@style/WallpaperCropperActionBar</item> <item name="android:windowFullscreen">true</item> <item name="android:windowActionBarOverlay">true</item> </style> - <style name="WallpaperCropperActionBar" parent="@android:style/Widget.Material.ActionBar"> + <style name="WallpaperCropperActionBar" parent="android:style/Widget.DeviceDefault.ActionBar"> <item name="android:displayOptions">showCustom</item> <item name="android:background">#88000000</item> </style> diff --git a/preloaded-classes b/preloaded-classes index 41a88579389e..4d7a6e19d011 100644 --- a/preloaded-classes +++ b/preloaded-classes @@ -1,7 +1,4 @@ # Classes which are preloaded by com.android.internal.os.ZygoteInit. -# Automatically generated by frameworks/base/tools/preload/WritePreloadedClassFile.java. -# MIN_LOAD_TIME_MICROS=1250 -# MIN_PROCESSES=10 [B [C [D @@ -12,12 +9,13 @@ [Landroid.animation.Animator; [Landroid.animation.Keyframe$FloatKeyframe; [Landroid.animation.Keyframe$IntKeyframe; +[Landroid.animation.Keyframe$ObjectKeyframe; [Landroid.animation.PropertyValuesHolder; -[Landroid.app.FragmentState; [Landroid.app.LoaderManagerImpl; [Landroid.content.ContentProviderResult; [Landroid.content.ContentValues; [Landroid.content.Intent; +[Landroid.content.UndoOwner; [Landroid.content.pm.ActivityInfo; [Landroid.content.pm.ConfigurationInfo; [Landroid.content.pm.FeatureGroupInfo; @@ -30,9 +28,9 @@ [Landroid.content.pm.Signature; [Landroid.content.res.StringBlock; [Landroid.content.res.XmlBlock; +[Landroid.database.CursorWindow; [Landroid.database.sqlite.SQLiteConnection$Operation; [Landroid.database.sqlite.SQLiteConnectionPool$AcquiredConnectionStatus; -[Landroid.graphics.Bitmap$CompressFormat; [Landroid.graphics.Bitmap$Config; [Landroid.graphics.Canvas$EdgeType; [Landroid.graphics.FontFamily; @@ -51,13 +49,39 @@ [Landroid.graphics.drawable.Drawable; [Landroid.graphics.drawable.GradientDrawable$Orientation; [Landroid.graphics.drawable.LayerDrawable$ChildDrawable; -[Landroid.graphics.drawable.Ripple; +[Landroid.graphics.drawable.RippleForeground; [Landroid.hardware.soundtrigger.SoundTrigger$ConfidenceLevel; [Landroid.hardware.soundtrigger.SoundTrigger$Keyphrase; [Landroid.hardware.soundtrigger.SoundTrigger$KeyphraseRecognitionExtra; +[Landroid.icu.impl.ICUResourceBundle$OpenType; +[Landroid.icu.impl.Trie2$ValueWidth; +[Landroid.icu.impl.UCharacterProperty$BinaryProperty; +[Landroid.icu.impl.UCharacterProperty$IntProperty; +[Landroid.icu.lang.UScript$ScriptUsage; +[Landroid.icu.text.DateFormat$BooleanAttribute; +[Landroid.icu.text.DateFormat$Field; +[Landroid.icu.text.DateFormatSymbols$CapitalizationContextUsage; +[Landroid.icu.text.DateTimePatternGenerator$DTPGflags; +[Landroid.icu.text.DisplayContext$Type; +[Landroid.icu.text.DisplayContext; +[Landroid.icu.text.MessagePattern$ApostropheMode; +[Landroid.icu.text.MessagePattern$ArgType; +[Landroid.icu.text.MessagePattern$Part$Type; +[Landroid.icu.text.UnicodeSet; +[Landroid.icu.util.BytesTrie$Result; +[Landroid.icu.util.Calendar$CalType; +[Landroid.icu.util.ULocale$Category; +[Landroid.icu.util.ULocale; +[Landroid.media.AudioDeviceInfo; [Landroid.media.AudioGain; +[Landroid.media.AudioPatch; +[Landroid.media.AudioPort; +[Landroid.media.AudioPortConfig; +[Landroid.media.MediaTimeProvider$OnMediaTimeListener; [Landroid.net.NetworkInfo$DetailedState; [Landroid.net.NetworkInfo$State; +[Landroid.net.Uri; +[Landroid.net.wifi.SupplicantState; [Landroid.os.AsyncTask$Status; [Landroid.os.MessageQueue$IdleHandler; [Landroid.os.Parcel; @@ -86,51 +110,92 @@ [Landroid.text.style.ReplacementSpan; [Landroid.text.style.SpellCheckSpan; [Landroid.text.style.SuggestionSpan; +[Landroid.text.style.TabStopSpan; +[Landroid.text.style.URLSpan; [Landroid.text.style.WrapTogetherSpan; [Landroid.util.LongSparseArray; [Landroid.util.PathParser$PathDataNode; [Landroid.view.Choreographer$CallbackQueue; +[Landroid.view.Display$Mode; +[Landroid.view.MenuItem; [Landroid.view.View; -[Landroid.widget.Editor$TextDisplayList; +[Landroid.widget.Editor$TextRenderNode; [Landroid.widget.Editor$TextViewPositionListener; [Landroid.widget.ImageView$ScaleType; +[Landroid.widget.SpellChecker$SpellParser; [Landroid.widget.TextView$BufferType; [Landroid.widget.TextView$ChangeWatcher; [Lcom.android.dex.TableOfContents$Section; -[Lcom.android.internal.policy.impl.PhoneWindow$PanelFeatureState; +[Lcom.android.internal.policy.PhoneWindow$PanelFeatureState; [Lcom.android.internal.telephony.PhoneConstants$State; +[Lcom.android.okhttp.CipherSuite; +[Lcom.android.okhttp.ConnectionSpec; [Lcom.android.okhttp.Protocol; -[Lcom.android.okhttp.ResponseSource; -[Lcom.android.okhttp.internal.http.HttpURLConnectionImpl$Retry; +[Lcom.android.okhttp.TlsVersion; [Lcom.android.org.bouncycastle.asn1.ASN1ObjectIdentifier; +[Lcom.android.org.bouncycastle.asn1.x500.RDN; [Lcom.android.org.bouncycastle.asn1.x509.GeneralName; [Lcom.android.org.conscrypt.OpenSSLX509CertPath$Encoding; [Lcom.android.org.conscrypt.OpenSSLX509Certificate; +[Ldalvik.system.DexPathList$Element; +[Ljava.io.File; [Ljava.io.FileDescriptor; +[Ljava.io.IOException; +[Ljava.io.ObjectStreamField; +[Ljava.lang.Byte; [Ljava.lang.CharSequence; +[Ljava.lang.Character$UnicodeBlock; +[Ljava.lang.Character; [Ljava.lang.Class; +[Ljava.lang.Enum; [Ljava.lang.Integer; +[Ljava.lang.Long; [Ljava.lang.Object; +[Ljava.lang.Package; [Ljava.lang.Runnable; +[Ljava.lang.Short; +[Ljava.lang.StackTraceElement; [Ljava.lang.String; +[Ljava.lang.Thread$State; +[Ljava.lang.Thread; +[Ljava.lang.ThreadGroup; +[Ljava.lang.Throwable; [Ljava.lang.Void; +[Ljava.lang.annotation.Annotation; +[Ljava.lang.reflect.AccessibleObject; +[Ljava.lang.reflect.Constructor; +[Ljava.lang.reflect.Field; +[Ljava.lang.reflect.Method; +[Ljava.lang.reflect.Type; +[Ljava.lang.reflect.TypeVariable; [Ljava.math.BigDecimal; [Ljava.math.BigInteger; [Ljava.math.RoundingMode; [Ljava.net.InetAddress; [Ljava.net.Proxy$Type; +[Ljava.security.Provider; +[Ljava.security.cert.Certificate; [Ljava.security.cert.X509Certificate; [Ljava.text.Format$Field; [Ljava.util.ArrayList; +[Ljava.util.HashMap$HashMapEntry; +[Ljava.util.Hashtable$HashtableEntry; +[Ljava.util.Locale; [Ljava.util.Map$Entry; [Ljava.util.TimerTask; +[Ljava.util.TreeMap$Bound; [Ljava.util.TreeMap$Relation; +[Ljava.util.WeakHashMap$Entry; [Ljava.util.concurrent.ConcurrentHashMap$Node; [Ljava.util.concurrent.ConcurrentHashMap$Segment; +[Ljava.util.concurrent.RunnableScheduledFuture; [Ljava.util.concurrent.TimeUnit; [Ljava.util.logging.Handler; +[Ljava.util.regex.Pattern; +[Ljavax.crypto.Cipher$NeedToSet; [Ljavax.net.ssl.KeyManager; [Ljavax.net.ssl.TrustManager; +[Ljavax.security.cert.X509Certificate; [Llibcore.reflect.AnnotationMember$DefaultValues; [Llibcore.reflect.AnnotationMember; [Lorg.apache.harmony.security.asn1.ASN1Type; @@ -142,20 +207,25 @@ [Lorg.apache.http.conn.routing.RouteInfo$TunnelType; [Lorg.json.JSONStringer$Scope; [Lorg.kxml2.io.KXmlParser$ValueContext; +[S [Z [[B +[[C [[I [[Lcom.android.org.bouncycastle.asn1.ASN1ObjectIdentifier; +[[Ljava.lang.Class; [[Ljava.lang.Object; [[Ljava.lang.String; +[[Ljava.lang.annotation.Annotation; [[Lorg.apache.harmony.security.utils.ObjectIdentifier; -[[[B +[[S +[[[I android.R$styleable android.accounts.Account android.accounts.Account$1 android.accounts.AccountManager -android.accounts.AccountManager$16 -android.accounts.AccountManager$8 +android.accounts.AccountManager$1 +android.accounts.AccountManager$11 android.accounts.AccountManager$AmsTask android.accounts.AccountManager$AmsTask$1 android.accounts.AccountManager$AmsTask$Response @@ -171,6 +241,7 @@ android.accounts.IAccountManagerResponse$Stub android.accounts.OnAccountsUpdateListener android.accounts.OperationCanceledException android.animation.Animator +android.animation.Animator$AnimatorConstantState android.animation.Animator$AnimatorListener android.animation.Animator$AnimatorPauseListener android.animation.AnimatorInflater @@ -181,6 +252,7 @@ android.animation.AnimatorSet$Builder android.animation.AnimatorSet$Dependency android.animation.AnimatorSet$DependencyListener android.animation.AnimatorSet$Node +android.animation.ArgbEvaluator android.animation.FloatEvaluator android.animation.FloatKeyframeSet android.animation.IntEvaluator @@ -188,6 +260,7 @@ android.animation.IntKeyframeSet android.animation.Keyframe android.animation.Keyframe$FloatKeyframe android.animation.Keyframe$IntKeyframe +android.animation.Keyframe$ObjectKeyframe android.animation.KeyframeSet android.animation.Keyframes android.animation.Keyframes$FloatKeyframes @@ -195,22 +268,30 @@ android.animation.Keyframes$IntKeyframes android.animation.LayoutTransition android.animation.LayoutTransition$TransitionListener android.animation.ObjectAnimator +android.animation.PathKeyframes +android.animation.PathKeyframes$1 +android.animation.PathKeyframes$2 +android.animation.PathKeyframes$FloatKeyframesBase +android.animation.PathKeyframes$SimpleKeyframes android.animation.PropertyValuesHolder android.animation.PropertyValuesHolder$FloatPropertyValuesHolder android.animation.PropertyValuesHolder$IntPropertyValuesHolder android.animation.RectEvaluator android.animation.StateListAnimator android.animation.StateListAnimator$1 +android.animation.StateListAnimator$StateListAnimatorConstantState android.animation.StateListAnimator$Tuple android.animation.TimeInterpolator android.animation.TypeEvaluator android.animation.ValueAnimator android.animation.ValueAnimator$AnimationHandler +android.animation.ValueAnimator$AnimationHandler$1 +android.animation.ValueAnimator$AnimationHandler$2 android.animation.ValueAnimator$AnimatorUpdateListener android.app.ActionBar android.app.ActionBar$LayoutParams android.app.Activity -android.app.Activity$1 +android.app.Activity$HostCallbacks android.app.ActivityManager android.app.ActivityManager$RunningAppProcessInfo android.app.ActivityManager$RunningAppProcessInfo$1 @@ -244,6 +325,7 @@ android.app.ActivityThread$ServiceArgsData android.app.ActivityThread$StopInfo android.app.ActivityTransitionState android.app.AlertDialog +android.app.AlertDialog$Builder android.app.AppGlobals android.app.AppOpsManager android.app.Application @@ -257,91 +339,21 @@ android.app.BackStackRecord android.app.BackStackRecord$Op android.app.BackStackRecord$TransitionState android.app.ContextImpl -android.app.ContextImpl$1 -android.app.ContextImpl$10 -android.app.ContextImpl$11 -android.app.ContextImpl$12 -android.app.ContextImpl$13 -android.app.ContextImpl$14 -android.app.ContextImpl$15 -android.app.ContextImpl$16 -android.app.ContextImpl$17 -android.app.ContextImpl$18 -android.app.ContextImpl$19 -android.app.ContextImpl$2 -android.app.ContextImpl$20 -android.app.ContextImpl$21 -android.app.ContextImpl$22 -android.app.ContextImpl$23 -android.app.ContextImpl$24 -android.app.ContextImpl$25 -android.app.ContextImpl$26 -android.app.ContextImpl$27 -android.app.ContextImpl$28 -android.app.ContextImpl$29 -android.app.ContextImpl$3 -android.app.ContextImpl$30 -android.app.ContextImpl$31 -android.app.ContextImpl$32 -android.app.ContextImpl$33 -android.app.ContextImpl$34 -android.app.ContextImpl$35 -android.app.ContextImpl$36 -android.app.ContextImpl$37 -android.app.ContextImpl$38 -android.app.ContextImpl$39 -android.app.ContextImpl$4 -android.app.ContextImpl$40 -android.app.ContextImpl$41 -android.app.ContextImpl$42 -android.app.ContextImpl$43 -android.app.ContextImpl$44 -android.app.ContextImpl$45 -android.app.ContextImpl$46 -android.app.ContextImpl$47 -android.app.ContextImpl$48 -android.app.ContextImpl$49 -android.app.ContextImpl$5 -android.app.ContextImpl$50 -android.app.ContextImpl$51 -android.app.ContextImpl$52 -android.app.ContextImpl$53 -android.app.ContextImpl$54 -android.app.ContextImpl$55 -android.app.ContextImpl$56 -android.app.ContextImpl$57 -android.app.ContextImpl$58 -android.app.ContextImpl$59 -android.app.ContextImpl$6 -android.app.ContextImpl$60 -android.app.ContextImpl$61 -android.app.ContextImpl$62 -android.app.ContextImpl$7 -android.app.ContextImpl$8 -android.app.ContextImpl$9 android.app.ContextImpl$ApplicationContentResolver -android.app.ContextImpl$ServiceFetcher -android.app.ContextImpl$StaticServiceFetcher android.app.Dialog android.app.Dialog$1 android.app.Dialog$ListenersHandler -android.app.DialogFragment +android.app.DownloadManager android.app.Fragment android.app.Fragment$1 -android.app.FragmentBreadCrumbs android.app.FragmentContainer +android.app.FragmentController +android.app.FragmentHostCallback android.app.FragmentManager android.app.FragmentManager$BackStackEntry android.app.FragmentManagerImpl android.app.FragmentManagerImpl$1 -android.app.FragmentManagerState -android.app.FragmentManagerState$1 -android.app.FragmentState -android.app.FragmentState$1 android.app.FragmentTransaction -android.app.IActivityContainer -android.app.IActivityContainer$Stub -android.app.IActivityContainer$Stub$Proxy android.app.IActivityManager android.app.IActivityManager$ContentProviderHolder android.app.IActivityManager$ContentProviderHolder$1 @@ -362,6 +374,7 @@ android.app.Instrumentation android.app.IntentReceiverLeaked android.app.IntentService android.app.IntentService$ServiceHandler +android.app.KeyguardManager android.app.ListActivity android.app.LoadedApk android.app.LoadedApk$ReceiverDispatcher @@ -385,7 +398,6 @@ android.app.OnActivityPausedListener android.app.PendingIntent android.app.PendingIntent$1 android.app.PendingIntent$CanceledException -android.app.ProgressDialog android.app.QueuedWork android.app.ReceiverRestrictedContext android.app.ResourcesManager @@ -402,8 +414,83 @@ android.app.SharedPreferencesImpl$EditorImpl android.app.SharedPreferencesImpl$EditorImpl$1 android.app.SharedPreferencesImpl$EditorImpl$2 android.app.SharedPreferencesImpl$MemoryCommitResult +android.app.StatusBarManager android.app.SystemServiceRegistry +android.app.SystemServiceRegistry$1 +android.app.SystemServiceRegistry$10 +android.app.SystemServiceRegistry$11 +android.app.SystemServiceRegistry$12 +android.app.SystemServiceRegistry$13 +android.app.SystemServiceRegistry$14 +android.app.SystemServiceRegistry$15 +android.app.SystemServiceRegistry$16 +android.app.SystemServiceRegistry$17 +android.app.SystemServiceRegistry$18 +android.app.SystemServiceRegistry$19 +android.app.SystemServiceRegistry$2 +android.app.SystemServiceRegistry$20 +android.app.SystemServiceRegistry$21 +android.app.SystemServiceRegistry$22 +android.app.SystemServiceRegistry$23 +android.app.SystemServiceRegistry$24 +android.app.SystemServiceRegistry$25 +android.app.SystemServiceRegistry$26 +android.app.SystemServiceRegistry$27 +android.app.SystemServiceRegistry$28 +android.app.SystemServiceRegistry$29 +android.app.SystemServiceRegistry$3 +android.app.SystemServiceRegistry$30 +android.app.SystemServiceRegistry$31 +android.app.SystemServiceRegistry$32 +android.app.SystemServiceRegistry$33 +android.app.SystemServiceRegistry$34 +android.app.SystemServiceRegistry$35 +android.app.SystemServiceRegistry$36 +android.app.SystemServiceRegistry$37 +android.app.SystemServiceRegistry$38 +android.app.SystemServiceRegistry$39 +android.app.SystemServiceRegistry$4 +android.app.SystemServiceRegistry$40 +android.app.SystemServiceRegistry$41 +android.app.SystemServiceRegistry$42 +android.app.SystemServiceRegistry$43 +android.app.SystemServiceRegistry$44 +android.app.SystemServiceRegistry$45 +android.app.SystemServiceRegistry$46 +android.app.SystemServiceRegistry$47 +android.app.SystemServiceRegistry$48 +android.app.SystemServiceRegistry$49 +android.app.SystemServiceRegistry$5 +android.app.SystemServiceRegistry$50 +android.app.SystemServiceRegistry$51 +android.app.SystemServiceRegistry$52 +android.app.SystemServiceRegistry$53 +android.app.SystemServiceRegistry$54 +android.app.SystemServiceRegistry$55 +android.app.SystemServiceRegistry$56 +android.app.SystemServiceRegistry$57 +android.app.SystemServiceRegistry$58 +android.app.SystemServiceRegistry$59 +android.app.SystemServiceRegistry$6 +android.app.SystemServiceRegistry$60 +android.app.SystemServiceRegistry$61 +android.app.SystemServiceRegistry$62 +android.app.SystemServiceRegistry$63 +android.app.SystemServiceRegistry$64 +android.app.SystemServiceRegistry$65 +android.app.SystemServiceRegistry$66 +android.app.SystemServiceRegistry$67 +android.app.SystemServiceRegistry$68 +android.app.SystemServiceRegistry$7 +android.app.SystemServiceRegistry$8 +android.app.SystemServiceRegistry$9 +android.app.SystemServiceRegistry$CachedServiceFetcher +android.app.SystemServiceRegistry$ServiceFetcher +android.app.SystemServiceRegistry$StaticServiceFetcher +android.app.UiModeManager +android.app.WallpaperManager android.app.admin.DevicePolicyManager +android.app.admin.IDevicePolicyManager android.app.admin.IDevicePolicyManager$Stub android.app.admin.IDevicePolicyManager$Stub$Proxy android.app.backup.BackupDataInput @@ -411,19 +498,44 @@ android.app.backup.BackupDataInput$EntityHeader android.app.backup.BackupDataOutput android.app.backup.BackupHelperDispatcher android.app.backup.BackupHelperDispatcher$Header +android.app.backup.BackupManager android.app.backup.FileBackupHelperBase android.app.backup.FullBackup -android.appwidget.AppWidgetHostView +android.app.backup.FullBackupDataOutput +android.app.backup.IBackupManager +android.app.backup.IBackupManager$Stub +android.app.backup.IBackupManager$Stub$Proxy +android.app.job.JobScheduler +android.app.trust.ITrustManager +android.app.trust.ITrustManager$Stub +android.app.trust.ITrustManager$Stub$Proxy +android.app.trust.TrustManager +android.app.usage.NetworkStatsManager +android.app.usage.UsageStatsManager android.appwidget.AppWidgetManager android.appwidget.AppWidgetProvider -android.bluetooth.BluetoothDevice -android.bluetooth.BluetoothUuid +android.bluetooth.BluetoothAdapter +android.bluetooth.BluetoothAdapter$1 +android.bluetooth.BluetoothManager +android.bluetooth.IBluetooth +android.bluetooth.IBluetooth$Stub +android.bluetooth.IBluetooth$Stub$Proxy +android.bluetooth.IBluetoothManager +android.bluetooth.IBluetoothManager$Stub +android.bluetooth.IBluetoothManager$Stub$Proxy +android.bluetooth.IBluetoothManagerCallback +android.bluetooth.IBluetoothManagerCallback$Stub android.content.AbstractThreadedSyncAdapter android.content.AbstractThreadedSyncAdapter$ISyncAdapterImpl android.content.AbstractThreadedSyncAdapter$SyncThread android.content.ActivityNotFoundException android.content.BroadcastReceiver android.content.BroadcastReceiver$PendingResult +android.content.BroadcastReceiver$PendingResult$1 +android.content.ClipData +android.content.ClipDescription +android.content.ClipDescription$1 +android.content.ClipboardManager android.content.ComponentCallbacks android.content.ComponentCallbacks2 android.content.ComponentName @@ -468,8 +580,10 @@ android.content.Intent$1 android.content.IntentFilter android.content.IntentFilter$1 android.content.IntentFilter$MalformedMimeTypeException +android.content.IntentSender android.content.IntentSender$SendIntentException android.content.OperationApplicationException +android.content.RestrictionsManager android.content.ServiceConnection android.content.SharedPreferences android.content.SharedPreferences$Editor @@ -482,6 +596,10 @@ android.content.SyncResult android.content.SyncResult$1 android.content.SyncStats android.content.SyncStats$1 +android.content.UndoManager +android.content.UndoManager$UndoState +android.content.UndoOperation +android.content.UndoOwner android.content.UriMatcher android.content.pm.ActivityInfo android.content.pm.ActivityInfo$1 @@ -499,12 +617,15 @@ android.content.pm.IPackageManager$Stub android.content.pm.IPackageManager$Stub$Proxy android.content.pm.InstrumentationInfo android.content.pm.InstrumentationInfo$1 +android.content.pm.LauncherApps android.content.pm.PackageInfo android.content.pm.PackageInfo$1 android.content.pm.PackageItemInfo android.content.pm.PackageManager android.content.pm.PackageManager$NameNotFoundException android.content.pm.PackageParser$PackageParserException +android.content.pm.ParceledListSlice +android.content.pm.ParceledListSlice$1 android.content.pm.PathPermission android.content.pm.PathPermission$1 android.content.pm.PermissionInfo @@ -530,14 +651,20 @@ android.content.res.CompatibilityInfo$1 android.content.res.CompatibilityInfo$2 android.content.res.Configuration android.content.res.Configuration$1 +android.content.res.ConfigurationBoundResourceCache +android.content.res.ConstantState +android.content.res.DrawableCache android.content.res.ObbInfo android.content.res.ObbInfo$1 android.content.res.ObbScanner android.content.res.Resources android.content.res.Resources$NotFoundException android.content.res.Resources$Theme +android.content.res.Resources$ThemeKey android.content.res.ResourcesKey android.content.res.StringBlock +android.content.res.StringBlock$StyleIDs +android.content.res.ThemedResourceCache android.content.res.TypedArray android.content.res.XmlBlock android.content.res.XmlBlock$Parser @@ -619,9 +746,7 @@ android.emoji.EmojiFactory android.graphics.AvoidXfermode android.graphics.Bitmap android.graphics.Bitmap$1 -android.graphics.Bitmap$2 android.graphics.Bitmap$BitmapFinalizer -android.graphics.Bitmap$CompressFormat android.graphics.Bitmap$Config android.graphics.BitmapFactory android.graphics.BitmapFactory$Options @@ -709,13 +834,14 @@ android.graphics.Typeface android.graphics.Xfermode android.graphics.YuvImage android.graphics.drawable.Animatable +android.graphics.drawable.Animatable2 android.graphics.drawable.AnimatedStateListDrawable android.graphics.drawable.AnimatedStateListDrawable$AnimatedStateListState -android.graphics.drawable.AnimatedStateListDrawable$AnimationDrawableTransition -android.graphics.drawable.AnimatedStateListDrawable$FrameInterpolator android.graphics.drawable.AnimatedStateListDrawable$Transition android.graphics.drawable.AnimatedVectorDrawable +android.graphics.drawable.AnimatedVectorDrawable$1 android.graphics.drawable.AnimatedVectorDrawable$AnimatedVectorDrawableState +android.graphics.drawable.AnimatedVectorDrawable$AnimatedVectorDrawableState$PendingAnimator android.graphics.drawable.AnimationDrawable android.graphics.drawable.AnimationDrawable$AnimationState android.graphics.drawable.BitmapDrawable @@ -728,10 +854,13 @@ android.graphics.drawable.Drawable$ConstantState android.graphics.drawable.DrawableContainer android.graphics.drawable.DrawableContainer$DrawableContainerState android.graphics.drawable.DrawableContainer$DrawableContainerState$ConstantStateFuture +android.graphics.drawable.DrawableWrapper +android.graphics.drawable.DrawableWrapper$DrawableWrapperState android.graphics.drawable.GradientDrawable -android.graphics.drawable.GradientDrawable$1 android.graphics.drawable.GradientDrawable$GradientState android.graphics.drawable.GradientDrawable$Orientation +android.graphics.drawable.Icon +android.graphics.drawable.Icon$1 android.graphics.drawable.InsetDrawable android.graphics.drawable.InsetDrawable$InsetState android.graphics.drawable.LayerDrawable @@ -739,14 +868,19 @@ android.graphics.drawable.LayerDrawable$ChildDrawable android.graphics.drawable.LayerDrawable$LayerState android.graphics.drawable.NinePatchDrawable android.graphics.drawable.NinePatchDrawable$NinePatchState -android.graphics.drawable.Ripple -android.graphics.drawable.Ripple$1 -android.graphics.drawable.Ripple$LogInterpolator android.graphics.drawable.RippleBackground android.graphics.drawable.RippleBackground$1 -android.graphics.drawable.RippleBackground$2 +android.graphics.drawable.RippleBackground$BackgroundProperty +android.graphics.drawable.RippleComponent +android.graphics.drawable.RippleComponent$RenderNodeAnimatorSet android.graphics.drawable.RippleDrawable android.graphics.drawable.RippleDrawable$RippleState +android.graphics.drawable.RippleForeground +android.graphics.drawable.RippleForeground$1 +android.graphics.drawable.RippleForeground$2 +android.graphics.drawable.RippleForeground$3 +android.graphics.drawable.RippleForeground$4 +android.graphics.drawable.RippleForeground$LogDecelerateInterpolator android.graphics.drawable.RotateDrawable android.graphics.drawable.RotateDrawable$RotateState android.graphics.drawable.ScaleDrawable @@ -763,6 +897,7 @@ android.graphics.drawable.VectorDrawable$VGroup android.graphics.drawable.VectorDrawable$VPath android.graphics.drawable.VectorDrawable$VPathRenderer android.graphics.drawable.VectorDrawable$VectorDrawableState +android.graphics.drawable.shapes.OvalShape android.graphics.drawable.shapes.RectShape android.graphics.drawable.shapes.Shape android.graphics.pdf.PdfDocument @@ -771,17 +906,15 @@ android.graphics.pdf.PdfRenderer android.hardware.Camera android.hardware.Camera$CameraInfo android.hardware.Camera$Face -android.hardware.Camera$Parameters -android.hardware.Camera$PreviewCallback +android.hardware.ConsumerIrManager android.hardware.Sensor android.hardware.SensorEventListener android.hardware.SensorManager +android.hardware.SerialManager android.hardware.SerialPort android.hardware.SystemSensorManager android.hardware.SystemSensorManager$BaseEventQueue -android.hardware.camera2.CameraCharacteristics -android.hardware.camera2.CaptureRequest -android.hardware.camera2.CaptureResult +android.hardware.camera2.CameraManager android.hardware.camera2.DngCreator android.hardware.camera2.impl.CameraMetadataNative android.hardware.camera2.legacy.LegacyCameraDevice @@ -796,6 +929,8 @@ android.hardware.display.IDisplayManager$Stub android.hardware.display.IDisplayManager$Stub$Proxy android.hardware.display.IDisplayManagerCallback android.hardware.display.IDisplayManagerCallback$Stub +android.hardware.fingerprint.FingerprintManager +android.hardware.hdmi.HdmiControlManager android.hardware.input.IInputDevicesChangedListener android.hardware.input.IInputDevicesChangedListener$Stub android.hardware.input.IInputManager @@ -805,6 +940,27 @@ android.hardware.input.InputDeviceIdentifier android.hardware.input.InputDeviceIdentifier$1 android.hardware.input.InputManager android.hardware.input.InputManager$InputDevicesChangedListener +android.hardware.radio.RadioManager +android.hardware.radio.RadioManager$AmBandConfig +android.hardware.radio.RadioManager$AmBandConfig$1 +android.hardware.radio.RadioManager$AmBandDescriptor +android.hardware.radio.RadioManager$AmBandDescriptor$1 +android.hardware.radio.RadioManager$BandConfig +android.hardware.radio.RadioManager$BandConfig$1 +android.hardware.radio.RadioManager$BandDescriptor +android.hardware.radio.RadioManager$BandDescriptor$1 +android.hardware.radio.RadioManager$FmBandConfig +android.hardware.radio.RadioManager$FmBandConfig$1 +android.hardware.radio.RadioManager$FmBandDescriptor +android.hardware.radio.RadioManager$FmBandDescriptor$1 +android.hardware.radio.RadioManager$ModuleProperties +android.hardware.radio.RadioManager$ModuleProperties$1 +android.hardware.radio.RadioManager$ProgramInfo +android.hardware.radio.RadioManager$ProgramInfo$1 +android.hardware.radio.RadioMetadata +android.hardware.radio.RadioMetadata$1 +android.hardware.radio.RadioModule +android.hardware.radio.RadioTuner android.hardware.soundtrigger.SoundTrigger android.hardware.soundtrigger.SoundTrigger$ConfidenceLevel android.hardware.soundtrigger.SoundTrigger$ConfidenceLevel$1 @@ -828,19 +984,220 @@ android.hardware.soundtrigger.SoundTrigger$SoundModelEvent$1 android.hardware.soundtrigger.SoundTriggerModule android.hardware.usb.UsbDevice android.hardware.usb.UsbDeviceConnection +android.hardware.usb.UsbManager android.hardware.usb.UsbRequest -# Initializing android.icu.impl.ICUBinary loads the ICU data. -# Opening the files in the Zygote avoids StrictMode violations. -# It also ensures the ICU data files are mapped on boot and all -# apps will be consistent (even if files are added to /data). +android.icu.impl.BMPSet +android.icu.impl.CacheBase +android.icu.impl.CalendarData +android.icu.impl.CalendarUtil +android.icu.impl.ClassLoaderUtil +android.icu.impl.CurrencyData +android.icu.impl.CurrencyData$CurrencyDisplayInfo +android.icu.impl.CurrencyData$CurrencyDisplayInfoProvider +android.icu.impl.CurrencyData$CurrencySpacingInfo +android.icu.impl.DateNumberFormat +android.icu.impl.Grego android.icu.impl.ICUBinary +android.icu.impl.ICUBinary$Authenticate +android.icu.impl.ICUBinary$DatPackageReader +android.icu.impl.ICUBinary$DatPackageReader$IsAcceptable +android.icu.impl.ICUBinary$DataFile +android.icu.impl.ICUBinary$PackageDataFile +android.icu.impl.ICUCache +android.icu.impl.ICUConfig +android.icu.impl.ICUCurrencyDisplayInfoProvider +android.icu.impl.ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo +android.icu.impl.ICUCurrencyMetaInfo +android.icu.impl.ICUCurrencyMetaInfo$Collector +android.icu.impl.ICUCurrencyMetaInfo$CurrencyCollector +android.icu.impl.ICUCurrencyMetaInfo$UniqueList +android.icu.impl.ICUData +android.icu.impl.ICUDebug +android.icu.impl.ICUResourceBundle +android.icu.impl.ICUResourceBundle$1 +android.icu.impl.ICUResourceBundle$OpenType +android.icu.impl.ICUResourceBundle$WholeBundle +android.icu.impl.ICUResourceBundleImpl +android.icu.impl.ICUResourceBundleImpl$ResourceArray +android.icu.impl.ICUResourceBundleImpl$ResourceBinary +android.icu.impl.ICUResourceBundleImpl$ResourceContainer +android.icu.impl.ICUResourceBundleImpl$ResourceInt +android.icu.impl.ICUResourceBundleImpl$ResourceIntVector +android.icu.impl.ICUResourceBundleImpl$ResourceString +android.icu.impl.ICUResourceBundleImpl$ResourceTable +android.icu.impl.ICUResourceBundleReader +android.icu.impl.ICUResourceBundleReader$Array +android.icu.impl.ICUResourceBundleReader$Array16 +android.icu.impl.ICUResourceBundleReader$Container +android.icu.impl.ICUResourceBundleReader$IsAcceptable +android.icu.impl.ICUResourceBundleReader$ReaderCache +android.icu.impl.ICUResourceBundleReader$ReaderInfo +android.icu.impl.ICUResourceBundleReader$ResourceCache +android.icu.impl.ICUResourceBundleReader$ResourceCache$Level +android.icu.impl.ICUResourceBundleReader$Table +android.icu.impl.ICUResourceBundleReader$Table16 +android.icu.impl.ICUResourceBundleReader$Table1632 +android.icu.impl.JavaTimeZone +android.icu.impl.LocaleIDParser +android.icu.impl.LocaleIDs +android.icu.impl.OlsonTimeZone +android.icu.impl.Pair +android.icu.impl.PatternProps +android.icu.impl.PatternTokenizer +android.icu.impl.ReplaceableUCharacterIterator +android.icu.impl.RuleCharacterIterator +android.icu.impl.SimpleCache +android.icu.impl.SoftCache +android.icu.impl.SoftCache$SettableSoftReference +android.icu.impl.Trie2 +android.icu.impl.Trie2$1 +android.icu.impl.Trie2$Range +android.icu.impl.Trie2$Trie2Iterator +android.icu.impl.Trie2$UTrie2Header +android.icu.impl.Trie2$ValueMapper +android.icu.impl.Trie2$ValueWidth +android.icu.impl.Trie2_16 +android.icu.impl.UCharacterProperty +android.icu.impl.UCharacterProperty$1 +android.icu.impl.UCharacterProperty$10 +android.icu.impl.UCharacterProperty$11 +android.icu.impl.UCharacterProperty$12 +android.icu.impl.UCharacterProperty$13 +android.icu.impl.UCharacterProperty$14 +android.icu.impl.UCharacterProperty$15 +android.icu.impl.UCharacterProperty$16 +android.icu.impl.UCharacterProperty$17 +android.icu.impl.UCharacterProperty$18 +android.icu.impl.UCharacterProperty$19 +android.icu.impl.UCharacterProperty$2 +android.icu.impl.UCharacterProperty$20 +android.icu.impl.UCharacterProperty$21 +android.icu.impl.UCharacterProperty$22 +android.icu.impl.UCharacterProperty$23 +android.icu.impl.UCharacterProperty$3 +android.icu.impl.UCharacterProperty$4 +android.icu.impl.UCharacterProperty$5 +android.icu.impl.UCharacterProperty$6 +android.icu.impl.UCharacterProperty$7 +android.icu.impl.UCharacterProperty$8 +android.icu.impl.UCharacterProperty$9 +android.icu.impl.UCharacterProperty$BiDiIntProperty +android.icu.impl.UCharacterProperty$BinaryProperty +android.icu.impl.UCharacterProperty$CaseBinaryProperty +android.icu.impl.UCharacterProperty$CombiningClassIntProperty +android.icu.impl.UCharacterProperty$IntProperty +android.icu.impl.UCharacterProperty$IsAcceptable +android.icu.impl.UCharacterProperty$NormInertBinaryProperty +android.icu.impl.UCharacterProperty$NormQuickCheckIntProperty +android.icu.impl.UPropertyAliases +android.icu.impl.UPropertyAliases$IsAcceptable +android.icu.impl.Utility +android.icu.impl.ZoneMeta +android.icu.impl.ZoneMeta$CustomTimeZoneCache +android.icu.impl.ZoneMeta$SystemTimeZoneCache +android.icu.impl.locale.AsciiUtil +android.icu.impl.locale.BaseLocale +android.icu.impl.locale.BaseLocale$Cache +android.icu.impl.locale.BaseLocale$Key +android.icu.impl.locale.LocaleObjectCache +android.icu.impl.locale.LocaleObjectCache$CacheEntry +android.icu.impl.locale.LocaleSyntaxException +android.icu.lang.UCharacter +android.icu.lang.UCharacterEnums$ECharacterCategory +android.icu.lang.UCharacterEnums$ECharacterDirection +android.icu.lang.UScript +android.icu.lang.UScript$ScriptUsage +android.icu.text.CurrencyDisplayNames +android.icu.text.CurrencyMetaInfo +android.icu.text.CurrencyMetaInfo$CurrencyDigits +android.icu.text.CurrencyMetaInfo$CurrencyFilter +android.icu.text.DateFormat +android.icu.text.DateFormat$BooleanAttribute +android.icu.text.DateFormat$Field +android.icu.text.DateFormatSymbols +android.icu.text.DateFormatSymbols$CapitalizationContextUsage +android.icu.text.DateIntervalFormat +android.icu.text.DateIntervalFormat$BestMatchInfo +android.icu.text.DateIntervalInfo +android.icu.text.DateIntervalInfo$PatternInfo +android.icu.text.DateTimePatternGenerator +android.icu.text.DateTimePatternGenerator$DTPGflags +android.icu.text.DateTimePatternGenerator$DateTimeMatcher +android.icu.text.DateTimePatternGenerator$DistanceInfo +android.icu.text.DateTimePatternGenerator$FormatParser +android.icu.text.DateTimePatternGenerator$PatternInfo +android.icu.text.DateTimePatternGenerator$PatternWithMatcher +android.icu.text.DateTimePatternGenerator$PatternWithSkeletonFlag +android.icu.text.DateTimePatternGenerator$VariableField +android.icu.text.DecimalFormat +android.icu.text.DecimalFormatSymbols +android.icu.text.DisplayContext +android.icu.text.DisplayContext$Type +android.icu.text.MessageFormat +android.icu.text.MessageFormat$AppendableWrapper +android.icu.text.MessageFormat$Field +android.icu.text.MessagePattern +android.icu.text.MessagePattern$ApostropheMode +android.icu.text.MessagePattern$ArgType +android.icu.text.MessagePattern$Part +android.icu.text.MessagePattern$Part$Type +android.icu.text.NumberFormat +android.icu.text.NumberingSystem +android.icu.text.Replaceable +android.icu.text.ReplaceableString +android.icu.text.SimpleDateFormat +android.icu.text.SimpleDateFormat$PatternItem +android.icu.text.UCharacterIterator +android.icu.text.UFormat +android.icu.text.UForwardCharacterIterator +android.icu.text.UTF16 +android.icu.text.UnicodeFilter +android.icu.text.UnicodeMatcher +android.icu.text.UnicodeSet +android.icu.text.UnicodeSet$Filter +android.icu.text.UnicodeSet$GeneralCategoryMaskFilter +android.icu.text.UnicodeSet$IntPropertyFilter +android.icu.util.BasicTimeZone +android.icu.util.BytesTrie +android.icu.util.BytesTrie$Result +android.icu.util.Calendar +android.icu.util.Calendar$CalType +android.icu.util.Calendar$FormatConfiguration +android.icu.util.Calendar$PatternData +android.icu.util.Calendar$WeekData +android.icu.util.Calendar$WeekDataCache +android.icu.util.Currency +android.icu.util.Currency$EquivalenceRelation +android.icu.util.Freezable +android.icu.util.GregorianCalendar +android.icu.util.MeasureUnit +android.icu.util.MeasureUnit$1 +android.icu.util.MeasureUnit$2 +android.icu.util.MeasureUnit$3 +android.icu.util.MeasureUnit$Factory +android.icu.util.SimpleTimeZone +android.icu.util.TimeUnit +android.icu.util.TimeZone +android.icu.util.TimeZone$ConstantZone +android.icu.util.ULocale +android.icu.util.ULocale$Category +android.icu.util.ULocale$JDKLocaleHelper +android.icu.util.ULocale$Type +android.icu.util.UResourceBundle +android.icu.util.UResourceBundle$ResourceCacheKey +android.icu.util.UResourceBundleIterator +android.icu.util.UResourceTypeMismatchException +android.icu.util.VersionInfo android.inputmethodservice.ExtractEditText +android.location.CountryDetector android.location.Location android.location.Location$1 +android.location.LocationManager android.media.AmrInputStream android.media.AudioAttributes android.media.AudioAttributes$1 android.media.AudioAttributes$Builder +android.media.AudioDeviceInfo android.media.AudioDevicePort android.media.AudioDevicePortConfig android.media.AudioFormat @@ -851,7 +1208,8 @@ android.media.AudioManager android.media.AudioManager$1 android.media.AudioManager$FocusEventHandlerDelegate android.media.AudioManager$FocusEventHandlerDelegate$1 -android.media.AudioManager$OnAudioFocusChangeListener +android.media.AudioManager$OnAmPortUpdateListener +android.media.AudioManager$OnAudioPortUpdateListener android.media.AudioMixPort android.media.AudioMixPortConfig android.media.AudioPatch @@ -876,33 +1234,46 @@ android.media.IMediaHTTPConnection$Stub android.media.Image android.media.ImageReader android.media.ImageReader$SurfaceImage +android.media.ImageWriter +android.media.ImageWriter$WriterSurfaceImage android.media.JetPlayer android.media.MediaCodec android.media.MediaCodecList android.media.MediaCrypto android.media.MediaDrm android.media.MediaExtractor -android.media.MediaFormat android.media.MediaHTTPConnection -android.media.MediaMetadata android.media.MediaMetadataRetriever android.media.MediaMuxer android.media.MediaPlayer -android.media.MediaPlayer$OnBufferingUpdateListener +android.media.MediaPlayer$1 +android.media.MediaPlayer$EventHandler android.media.MediaPlayer$OnCompletionListener android.media.MediaPlayer$OnErrorListener -android.media.MediaPlayer$OnPreparedListener android.media.MediaPlayer$OnSeekCompleteListener -android.media.MediaPlayer$OnVideoSizeChangedListener +android.media.MediaPlayer$OnSubtitleDataListener +android.media.MediaPlayer$TimeProvider +android.media.MediaPlayer$TimeProvider$EventHandler android.media.MediaRecorder +android.media.MediaRouter android.media.MediaScanner +android.media.MediaSync +android.media.MediaTimeProvider +android.media.MediaTimeProvider$OnMediaTimeListener +android.media.PlaybackParams +android.media.PlaybackParams$1 android.media.RemoteDisplay android.media.ResampleInputStream -android.media.SoundPool$SoundPoolImpl android.media.SubtitleController$Listener +android.media.SyncParams android.media.ToneGenerator -android.media.audiofx.AudioEffect -android.media.audiofx.LoudnessEnhancer +android.media.audiopolicy.AudioMix +android.media.audiopolicy.AudioMixingRule +android.media.audiopolicy.AudioMixingRule$AttributeMatchCriterion +android.media.midi.MidiManager +android.media.projection.MediaProjectionManager +android.media.session.MediaSessionManager +android.media.tv.TvInputManager android.mtp.MtpDatabase android.mtp.MtpDevice android.mtp.MtpDeviceInfo @@ -916,9 +1287,16 @@ android.net.ConnectivityManager android.net.Credentials android.net.DhcpResults android.net.DhcpResults$1 +android.net.EthernetManager android.net.IConnectivityManager android.net.IConnectivityManager$Stub android.net.IConnectivityManager$Stub$Proxy +android.net.IpPrefix +android.net.IpPrefix$1 +android.net.LinkAddress +android.net.LinkAddress$1 +android.net.LinkProperties +android.net.LinkProperties$1 android.net.LocalServerSocket android.net.LocalSocket android.net.LocalSocketImpl @@ -928,11 +1306,16 @@ android.net.NetworkInfo android.net.NetworkInfo$1 android.net.NetworkInfo$DetailedState android.net.NetworkInfo$State +android.net.NetworkPolicyManager +android.net.NetworkScoreManager android.net.NetworkStats android.net.NetworkStats$1 android.net.NetworkUtils android.net.Proxy android.net.ProxyInfo +android.net.ProxyInfo$1 +android.net.RouteInfo +android.net.RouteInfo$1 android.net.SSLCertificateSocketFactory android.net.SSLCertificateSocketFactory$1 android.net.SSLSessionCache @@ -952,16 +1335,25 @@ android.net.Uri$PathPart android.net.Uri$PathSegments android.net.Uri$PathSegmentsBuilder android.net.Uri$StringUri -android.net.WebAddress android.net.http.AndroidHttpClient android.net.http.AndroidHttpClient$1 -android.net.http.AndroidHttpClient$2 +android.net.nsd.NsdManager android.net.wifi.IWifiManager android.net.wifi.IWifiManager$Stub android.net.wifi.IWifiManager$Stub$Proxy +android.net.wifi.RttManager +android.net.wifi.SupplicantState +android.net.wifi.SupplicantState$1 android.net.wifi.WifiInfo +android.net.wifi.WifiInfo$1 android.net.wifi.WifiManager +android.net.wifi.WifiManager$ServiceHandler android.net.wifi.WifiManager$WifiLock +android.net.wifi.WifiScanner +android.net.wifi.WifiSsid +android.net.wifi.WifiSsid$1 +android.net.wifi.p2p.WifiP2pManager +android.net.wifi.passpoint.WifiPasspointManager android.nfc.IAppCallback android.nfc.IAppCallback$Stub android.nfc.INfcAdapter @@ -973,11 +1365,9 @@ android.nfc.INfcCardEmulation$Stub$Proxy android.nfc.INfcTag android.nfc.INfcTag$Stub android.nfc.INfcTag$Stub$Proxy -android.nfc.NdefRecord android.nfc.NfcActivityManager android.nfc.NfcAdapter android.nfc.NfcAdapter$1 -android.nfc.NfcEvent android.nfc.NfcManager android.opengl.EGL14 android.opengl.EGLConfig @@ -995,7 +1385,7 @@ android.opengl.GLES20 android.opengl.GLES30 android.opengl.GLES31 android.opengl.GLES31Ext -android.opengl.GLSurfaceView +android.opengl.GLUtils android.opengl.Matrix android.opengl.Visibility android.os.AsyncTask$1 @@ -1009,7 +1399,7 @@ android.os.AsyncTask$Status android.os.AsyncTask$WorkerRunnable android.os.BadParcelableException android.os.BaseBundle -android.os.BatteryStats +android.os.BatteryManager android.os.Binder android.os.BinderProxy android.os.Build @@ -1019,7 +1409,6 @@ android.os.Bundle$1 android.os.CancellationSignal android.os.CancellationSignal$OnCancelListener android.os.CancellationSignal$Transport -android.os.ConditionVariable android.os.DeadObjectException android.os.Debug android.os.Debug$MemoryInfo @@ -1040,6 +1429,8 @@ android.os.ICancellationSignal$Stub android.os.IInterface android.os.IMessenger android.os.IMessenger$Stub +android.os.IMessenger$Stub$Proxy +android.os.INetworkManagementService android.os.INetworkManagementService$Stub android.os.INetworkManagementService$Stub$Proxy android.os.IPowerManager @@ -1065,8 +1456,12 @@ android.os.ParcelFileDescriptor$AutoCloseInputStream android.os.Parcelable android.os.Parcelable$ClassLoaderCreator android.os.Parcelable$Creator +android.os.ParcelableParcel +android.os.ParcelableParcel$1 android.os.PatternMatcher android.os.PatternMatcher$1 +android.os.PersistableBundle +android.os.PersistableBundle$1 android.os.PowerManager android.os.PowerManager$WakeLock android.os.PowerManager$WakeLock$1 @@ -1110,59 +1505,75 @@ android.os.UEventObserver android.os.UserHandle android.os.UserHandle$1 android.os.UserManager +android.os.Vibrator android.os.ZygoteStartFailedEx android.os.storage.IMountService android.os.storage.IMountService$Stub android.os.storage.IMountService$Stub$Proxy +android.os.storage.StorageManager android.os.storage.StorageVolume android.os.storage.StorageVolume$1 -android.preference.ListPreference android.preference.PreferenceActivity android.preference.PreferenceFragment$OnPreferenceStartFragmentCallback -android.preference.PreferenceFrameLayout -android.preference.PreferenceGroup android.preference.PreferenceManager android.preference.PreferenceManager$OnPreferenceTreeClickListener -android.preference.PreferenceScreen +android.print.PrintManager android.provider.BaseColumns -android.provider.CallLog$Calls android.provider.ContactsContract +android.provider.ContactsContract$CommonDataKinds$BaseTypes +android.provider.ContactsContract$CommonDataKinds$CommonColumns +android.provider.ContactsContract$CommonDataKinds$Email android.provider.ContactsContract$CommonDataKinds$Phone android.provider.ContactsContract$ContactCounts android.provider.ContactsContract$ContactNameColumns android.provider.ContactsContract$ContactOptionsColumns android.provider.ContactsContract$ContactStatusColumns +android.provider.ContactsContract$Contacts android.provider.ContactsContract$ContactsColumns android.provider.ContactsContract$Data android.provider.ContactsContract$DataColumns android.provider.ContactsContract$DataColumnsWithJoins android.provider.ContactsContract$DataUsageStatColumns -android.provider.ContactsContract$PhoneLookup android.provider.ContactsContract$RawContactsColumns android.provider.ContactsContract$StatusColumns -android.provider.DocumentsProvider -android.provider.Downloads$Impl -android.provider.SearchIndexablesContract -android.provider.Settings +android.provider.MediaStore$MediaColumns android.provider.Settings$Global android.provider.Settings$NameValueCache android.provider.Settings$NameValueTable android.provider.Settings$Secure android.provider.Settings$SettingNotFoundException android.provider.Settings$System -android.provider.Telephony$Mms -android.renderscript.RenderScript +android.provider.Settings$System$1 +android.provider.Settings$System$2 +android.provider.Settings$System$3 +android.provider.Settings$System$4 +android.provider.Settings$System$5 +android.provider.Settings$System$6 +android.provider.Settings$System$7 +android.provider.Settings$System$8 +android.provider.Settings$System$9 +android.provider.Settings$System$DiscreteValueValidator +android.provider.Settings$System$InclusiveFloatRangeValidator +android.provider.Settings$System$InclusiveIntegerRangeValidator +android.provider.Settings$System$Validator +android.renderscript.RenderScriptCacheDir +android.security.IKeystoreService +android.security.IKeystoreService$Stub +android.security.IKeystoreService$Stub$Proxy +android.security.KeyStore +android.security.KeyStoreException +android.security.NetworkSecurityPolicy android.security.keystore.AndroidKeyStoreBCWorkaroundProvider +android.security.keystore.AndroidKeyStoreKey android.security.keystore.AndroidKeyStoreProvider -android.speech.tts.TextToSpeechService -android.speech.tts.TextToSpeechService$SpeechItemV1 -android.speech.tts.TextToSpeechService$SynthesisSpeechItemV1 -android.speech.tts.TextToSpeechService$SynthesisToFileOutputStreamSpeechItemV1 -android.speech.tts.TextToSpeechService$UtteranceSpeechItem -android.speech.tts.TtsEngines +android.security.keystore.KeyStoreCryptoOperation +android.service.persistentdata.PersistentDataBlockManager +android.system.ErrnoException android.system.GaiException +android.system.NetlinkSocketAddress android.system.Os android.system.OsConstants +android.system.PacketSocketAddress android.system.StructAddrinfo android.system.StructFlock android.system.StructGroupReq @@ -1170,28 +1581,32 @@ android.system.StructGroupSourceReq android.system.StructLinger android.system.StructPasswd android.system.StructPollfd +android.system.StructStat android.system.StructStatVfs android.system.StructTimeval android.system.StructUcred android.system.StructUtsname -android.telecom.InCallService +android.telecom.TelecomManager +android.telephony.CarrierConfigManager android.telephony.PhoneNumberUtils android.telephony.Rlog -android.telephony.SignalStrength android.telephony.SubscriptionManager android.telephony.TelephonyManager android.text.AndroidBidi android.text.AndroidCharacter -android.text.BidiFormatter$DirectionalityEstimator android.text.BoringLayout android.text.BoringLayout$Metrics +android.text.ClipboardManager android.text.DynamicLayout android.text.DynamicLayout$ChangeWatcher android.text.Editable android.text.Editable$Factory android.text.GetChars android.text.GraphicsOperations +android.text.Html android.text.Html$HtmlParser +android.text.HtmlToSpannedConverter +android.text.Hyphenator android.text.InputFilter android.text.InputType android.text.Layout @@ -1217,6 +1632,8 @@ android.text.SpannableStringInternal android.text.Spanned android.text.SpannedString android.text.StaticLayout +android.text.StaticLayout$Builder +android.text.StaticLayout$LineBreaks android.text.TextDirectionHeuristic android.text.TextDirectionHeuristics android.text.TextDirectionHeuristics$AnyStrong @@ -1233,6 +1650,7 @@ android.text.TextUtils$EllipsizeCallback android.text.TextUtils$TruncateAt android.text.TextWatcher android.text.format.DateFormat +android.text.format.DateUtils android.text.format.Time android.text.format.Time$TimeCalculator android.text.method.AllCapsTransformationMethod @@ -1240,13 +1658,14 @@ android.text.method.ArrowKeyMovementMethod android.text.method.BaseKeyListener android.text.method.BaseMovementMethod android.text.method.KeyListener +android.text.method.LinkMovementMethod android.text.method.MetaKeyKeyListener android.text.method.MovementMethod android.text.method.PasswordTransformationMethod -android.text.method.QwertyKeyListener android.text.method.ReplacementTransformationMethod android.text.method.ReplacementTransformationMethod$ReplacementCharSequence android.text.method.ReplacementTransformationMethod$SpannedReplacementCharSequence +android.text.method.ScrollingMovementMethod android.text.method.SingleLineTransformationMethod android.text.method.TextKeyListener android.text.method.TextKeyListener$Capitalize @@ -1256,6 +1675,7 @@ android.text.style.AlignmentSpan android.text.style.CharacterStyle android.text.style.ClickableSpan android.text.style.EasyEditSpan +android.text.style.ForegroundColorSpan android.text.style.LeadingMarginSpan android.text.style.LineBackgroundSpan android.text.style.LineHeightSpan @@ -1265,6 +1685,7 @@ android.text.style.ReplacementSpan android.text.style.SpellCheckSpan android.text.style.StyleSpan android.text.style.SuggestionSpan +android.text.style.TabStopSpan android.text.style.URLSpan android.text.style.UpdateAppearance android.text.style.UpdateLayout @@ -1272,14 +1693,21 @@ android.text.style.WrapTogetherSpan android.transition.AutoTransition android.transition.ChangeBounds android.transition.ChangeBounds$1 +android.transition.ChangeBounds$2 +android.transition.ChangeBounds$3 +android.transition.ChangeBounds$4 +android.transition.ChangeBounds$5 +android.transition.ChangeBounds$6 android.transition.ChangeClipBounds android.transition.ChangeImageTransform android.transition.ChangeImageTransform$1 android.transition.ChangeImageTransform$2 android.transition.ChangeTransform android.transition.ChangeTransform$1 +android.transition.ChangeTransform$2 android.transition.Fade android.transition.PathMotion +android.transition.Scene android.transition.Transition android.transition.Transition$1 android.transition.TransitionInflater @@ -1301,7 +1729,6 @@ android.util.ContainerHelpers android.util.DisplayMetrics android.util.EventLog android.util.EventLog$Event -android.util.FloatMath android.util.FloatProperty android.util.IntProperty android.util.Log @@ -1313,6 +1740,7 @@ android.util.LruCache android.util.MapCollections android.util.MapCollections$ArrayIterator android.util.MapCollections$KeySet +android.util.MapCollections$ValuesCollection android.util.MathUtils android.util.MutableInt android.util.MutableLong @@ -1324,8 +1752,11 @@ android.util.Patterns android.util.Pools$Pool android.util.Pools$SimplePool android.util.Pools$SynchronizedPool +android.util.Printer android.util.Property android.util.Singleton +android.util.Size +android.util.SizeF android.util.Slog android.util.SparseArray android.util.SparseBooleanArray @@ -1339,45 +1770,51 @@ android.view.AbsSavedState$1 android.view.AbsSavedState$2 android.view.ActionMode android.view.ActionMode$Callback +android.view.ActionProvider android.view.ActionProvider$SubUiVisibilityListener android.view.Choreographer android.view.Choreographer$1 android.view.Choreographer$2 android.view.Choreographer$CallbackQueue android.view.Choreographer$CallbackRecord +android.view.Choreographer$FrameCallback android.view.Choreographer$FrameDisplayEventReceiver android.view.Choreographer$FrameHandler android.view.ContextMenu android.view.ContextMenu$ContextMenuInfo android.view.ContextThemeWrapper android.view.Display +android.view.Display$Mode +android.view.Display$Mode$1 android.view.DisplayAdjustments android.view.DisplayEventReceiver android.view.DisplayInfo android.view.DisplayInfo$1 +android.view.DisplayListCanvas android.view.FallbackEventHandler android.view.FocusFinder android.view.FocusFinder$1 android.view.FocusFinder$SequentialFocusComparator +android.view.FrameInfo android.view.FrameStats -android.view.GLES20Canvas -android.view.GLES20Canvas$CanvasFinalizer -android.view.GLES20RecordingCanvas android.view.GestureDetector android.view.GestureDetector$GestureHandler +android.view.GestureDetector$OnContextClickListener android.view.GestureDetector$OnDoubleTapListener android.view.GestureDetector$OnGestureListener android.view.GestureDetector$SimpleOnGestureListener android.view.GraphicBuffer android.view.GraphicBuffer$1 android.view.Gravity -android.view.HardwareCanvas android.view.HardwareLayer android.view.HardwareRenderer android.view.HardwareRenderer$HardwareDrawCallbacks android.view.IAssetAtlas android.view.IAssetAtlas$Stub android.view.IAssetAtlas$Stub$Proxy +android.view.IGraphicsStats +android.view.IGraphicsStats$Stub +android.view.IGraphicsStats$Stub$Proxy android.view.IRotationWatcher android.view.IRotationWatcher$Stub android.view.IWindow @@ -1420,6 +1857,7 @@ android.view.MenuInflater android.view.MenuInflater$MenuState android.view.MenuItem android.view.MenuItem$OnActionExpandListener +android.view.MenuItem$OnMenuItemClickListener android.view.MotionEvent android.view.MotionEvent$1 android.view.MotionEvent$PointerCoords @@ -1429,6 +1867,7 @@ android.view.PointerIcon$1 android.view.RenderNode android.view.RenderNodeAnimator android.view.RenderNodeAnimator$1 +android.view.SearchEvent android.view.SubMenu android.view.Surface android.view.Surface$1 @@ -1439,18 +1878,17 @@ android.view.SurfaceControl$PhysicalDisplayInfo android.view.SurfaceHolder$Callback android.view.SurfaceHolder$Callback2 android.view.SurfaceSession -android.view.SurfaceView android.view.TextureView android.view.ThreadedRenderer -android.view.ThreadedRenderer$AtlasInitializer +android.view.ThreadedRenderer$ProcessInitializer android.view.VelocityTracker android.view.VelocityTracker$Estimator android.view.View +android.view.View$1 android.view.View$10 android.view.View$11 android.view.View$12 -android.view.View$13 -android.view.View$14 +android.view.View$2 android.view.View$3 android.view.View$4 android.view.View$5 @@ -1464,8 +1902,10 @@ android.view.View$AttachInfo$Callbacks android.view.View$BaseSavedState android.view.View$BaseSavedState$1 android.view.View$CheckForTap +android.view.View$ForegroundInfo android.view.View$ListenerInfo android.view.View$MeasureSpec +android.view.View$OnApplyWindowInsetsListener android.view.View$OnAttachStateChangeListener android.view.View$OnClickListener android.view.View$OnCreateContextMenuListener @@ -1479,8 +1919,10 @@ android.view.View$ScrollabilityCache android.view.View$TransformationInfo android.view.View$UnsetPressedState android.view.ViewConfiguration +android.view.ViewDebug$HierarchyHandler android.view.ViewGroup -android.view.ViewGroup$3 +android.view.ViewGroup$1 +android.view.ViewGroup$2 android.view.ViewGroup$LayoutParams android.view.ViewGroup$MarginLayoutParams android.view.ViewGroup$OnHierarchyChangeListener @@ -1490,8 +1932,12 @@ android.view.ViewOutlineProvider android.view.ViewOutlineProvider$1 android.view.ViewOutlineProvider$2 android.view.ViewOutlineProvider$3 -android.view.ViewOverlay$OverlayViewGroup android.view.ViewParent +android.view.ViewPropertyAnimator +android.view.ViewPropertyAnimator$1 +android.view.ViewPropertyAnimator$AnimatorEventListener +android.view.ViewPropertyAnimator$NameValuesHolder +android.view.ViewPropertyAnimator$PropertyBundle android.view.ViewRootImpl android.view.ViewRootImpl$1 android.view.ViewRootImpl$4 @@ -1527,6 +1973,7 @@ android.view.ViewTreeObserver android.view.ViewTreeObserver$CopyOnWriteArray android.view.ViewTreeObserver$CopyOnWriteArray$Access android.view.ViewTreeObserver$InternalInsetsInfo +android.view.ViewTreeObserver$OnGlobalFocusChangeListener android.view.ViewTreeObserver$OnGlobalLayoutListener android.view.ViewTreeObserver$OnPreDrawListener android.view.ViewTreeObserver$OnScrollChangedListener @@ -1535,6 +1982,8 @@ android.view.Window android.view.Window$Callback android.view.Window$OnWindowDismissedCallback android.view.WindowAnimationFrameStats +android.view.WindowAnimationFrameStats$1 +android.view.WindowContentFrameStats android.view.WindowContentFrameStats$1 android.view.WindowInsets android.view.WindowLeaked @@ -1546,6 +1995,7 @@ android.view.WindowManagerGlobal$1 android.view.WindowManagerGlobal$2 android.view.WindowManagerImpl android.view.accessibility.AccessibilityEvent +android.view.accessibility.AccessibilityEventSource android.view.accessibility.AccessibilityManager android.view.accessibility.AccessibilityManager$1 android.view.accessibility.AccessibilityManager$AccessibilityStateChangeListener @@ -1554,6 +2004,7 @@ android.view.accessibility.AccessibilityManager$MyHandler android.view.accessibility.AccessibilityNodeInfo android.view.accessibility.AccessibilityNodeProvider android.view.accessibility.AccessibilityRecord +android.view.accessibility.CaptioningManager android.view.accessibility.IAccessibilityManager android.view.accessibility.IAccessibilityManager$Stub android.view.accessibility.IAccessibilityManager$Stub$Proxy @@ -1561,14 +2012,20 @@ android.view.accessibility.IAccessibilityManagerClient android.view.accessibility.IAccessibilityManagerClient$Stub android.view.animation.AccelerateDecelerateInterpolator android.view.animation.AccelerateInterpolator +android.view.animation.AlphaAnimation android.view.animation.Animation +android.view.animation.Animation$1 +android.view.animation.Animation$2 +android.view.animation.Animation$3 android.view.animation.Animation$AnimationListener android.view.animation.AnimationUtils +android.view.animation.BaseInterpolator android.view.animation.DecelerateInterpolator android.view.animation.Interpolator android.view.animation.LinearInterpolator android.view.animation.PathInterpolator android.view.animation.Transformation +android.view.animation.TranslateAnimation android.view.inputmethod.BaseInputConnection android.view.inputmethod.ComposingText android.view.inputmethod.CursorAnchorInfo @@ -1586,24 +2043,39 @@ android.view.inputmethod.InputMethodManager$FinishedInputEventCallback android.view.inputmethod.InputMethodManager$H android.view.inputmethod.InputMethodManager$ImeInputEventSender android.view.inputmethod.InputMethodManager$PendingEvent +android.view.textservice.SpellCheckerSession$SpellCheckerSessionListener +android.view.textservice.SpellCheckerSubtype +android.view.textservice.SpellCheckerSubtype$1 +android.view.textservice.TextServicesManager +android.webkit.IWebViewUpdateService +android.webkit.IWebViewUpdateService$Stub +android.webkit.WebView android.webkit.WebViewFactory +android.webkit.WebViewFactory$MissingWebViewPackageException android.widget.AbsListView +android.widget.AbsListView$3 android.widget.AbsListView$AdapterDataSetObserver android.widget.AbsListView$CheckForTap android.widget.AbsListView$LayoutParams android.widget.AbsListView$OnScrollListener +android.widget.AbsListView$PerformClick android.widget.AbsListView$RecycleBin android.widget.AbsListView$SavedState android.widget.AbsListView$SavedState$1 -android.widget.AbsSeekBar +android.widget.AbsListView$SelectionBoundsAdjuster +android.widget.AbsListView$WindowRunnnable android.widget.AbsSpinner +android.widget.AbsSpinner$RecycleBin android.widget.AbsoluteLayout android.widget.ActionMenuPresenter +android.widget.ActionMenuPresenter$1 +android.widget.ActionMenuPresenter$2 android.widget.ActionMenuPresenter$OverflowMenuButton android.widget.ActionMenuPresenter$OverflowMenuButton$1 android.widget.ActionMenuPresenter$PopupPresenterCallback android.widget.ActionMenuView android.widget.ActionMenuView$ActionMenuChildView +android.widget.ActionMenuView$LayoutParams android.widget.ActionMenuView$OnMenuItemClickListener android.widget.Adapter android.widget.AdapterView @@ -1611,46 +2083,41 @@ android.widget.AdapterView$AdapterDataSetObserver android.widget.AdapterView$OnItemClickListener android.widget.AdapterView$OnItemSelectedListener android.widget.ArrayAdapter -android.widget.AutoCompleteTextView android.widget.BaseAdapter android.widget.Button -android.widget.CheckBox android.widget.Checkable -android.widget.CheckedTextView android.widget.CompoundButton android.widget.CompoundButton$OnCheckedChangeListener -android.widget.DatePicker android.widget.EdgeEffect android.widget.EditText android.widget.Editor +android.widget.Editor$1 +android.widget.Editor$2 +android.widget.Editor$Blink android.widget.Editor$CursorAnchorInfoNotifier -android.widget.Editor$HandleView +android.widget.Editor$EditOperation +android.widget.Editor$EditOperation$1 android.widget.Editor$InputContentType android.widget.Editor$InputMethodState -android.widget.Editor$InsertionHandleView android.widget.Editor$PositionListener android.widget.Editor$SpanController -android.widget.Editor$TextDisplayList +android.widget.Editor$TextRenderNode android.widget.Editor$TextViewPositionListener -android.widget.FastScroller +android.widget.Editor$UndoInputFilter android.widget.Filter android.widget.Filter$FilterListener android.widget.Filterable android.widget.FrameLayout android.widget.FrameLayout$LayoutParams -android.widget.GridLayout -android.widget.GridView android.widget.HeaderViewListAdapter android.widget.HorizontalScrollView android.widget.ImageButton -android.widget.ImageSwitcher android.widget.ImageView android.widget.ImageView$ScaleType android.widget.LinearLayout android.widget.LinearLayout$LayoutParams android.widget.ListAdapter android.widget.ListPopupWindow -android.widget.ListPopupWindow$DropDownListView android.widget.ListPopupWindow$ForwardingListener android.widget.ListPopupWindow$ListSelectorHider android.widget.ListPopupWindow$PopupDataSetObserver @@ -1659,25 +2126,22 @@ android.widget.ListPopupWindow$PopupTouchInterceptor android.widget.ListPopupWindow$ResizePopupRunnable android.widget.ListView android.widget.ListView$ArrowScrollFocusResult -android.widget.MediaController -android.widget.MultiAutoCompleteTextView +android.widget.ListView$FixedViewInfo android.widget.OverScroller android.widget.OverScroller$SplineOverScroller android.widget.PopupWindow android.widget.PopupWindow$1 -android.widget.PopupWindow$PopupViewContainer +android.widget.PopupWindow$OnDismissListener android.widget.ProgressBar android.widget.ProgressBar$SavedState android.widget.ProgressBar$SavedState$1 -android.widget.QuickContactBadge -android.widget.RatingBar android.widget.RelativeLayout android.widget.RelativeLayout$DependencyGraph android.widget.RelativeLayout$DependencyGraph$Node android.widget.RelativeLayout$LayoutParams android.widget.RemoteViews android.widget.RemoteViews$1 -android.widget.RemoteViews$3 +android.widget.RemoteViews$2 android.widget.RemoteViews$Action android.widget.RemoteViews$ActionException android.widget.RemoteViews$BitmapCache @@ -1687,20 +2151,25 @@ android.widget.RemoteViews$OnClickHandler android.widget.RemoteViews$ReflectionAction android.widget.RemoteViews$SetDrawableParameters android.widget.RemoteViews$TextViewSizeAction +android.widget.RemoteViews$ViewPaddingAction android.widget.RemoteViewsAdapter$RemoteAdapterConnectionCallback android.widget.RtlSpacingHelper android.widget.ScrollBarDrawable android.widget.ScrollView +android.widget.ScrollView$SavedState +android.widget.ScrollView$SavedState$1 android.widget.Scroller android.widget.Scroller$ViscousFluidInterpolator android.widget.SectionIndexer -android.widget.SeekBar -android.widget.SimpleCursorAdapter +android.widget.Space +android.widget.SpellChecker +android.widget.SpellChecker$SpellParser +android.widget.Spinner +android.widget.Spinner$SpinnerPopup android.widget.SpinnerAdapter -android.widget.Switch -android.widget.TableLayout android.widget.TextView -android.widget.TextView$4 +android.widget.TextView$2 +android.widget.TextView$3 android.widget.TextView$BufferType android.widget.TextView$ChangeWatcher android.widget.TextView$CharWrapper @@ -1708,37 +2177,63 @@ android.widget.TextView$Drawables android.widget.TextView$OnEditorActionListener android.widget.TextView$SavedState android.widget.TextView$SavedState$1 -android.widget.TimePicker -android.widget.ToggleButton +android.widget.ThemedSpinnerAdapter android.widget.Toolbar android.widget.Toolbar$1 android.widget.Toolbar$2 android.widget.Toolbar$ExpandedActionViewMenuPresenter android.widget.Toolbar$LayoutParams -android.widget.ViewAnimator -android.widget.ViewFlipper -android.widget.ViewSwitcher android.widget.WrapperListAdapter com.android.dex.Annotation +com.android.dex.ClassData +com.android.dex.ClassData$Method +com.android.dex.ClassDef +com.android.dex.Code +com.android.dex.Dex +com.android.dex.Dex$ClassDefIterable +com.android.dex.Dex$FieldIdTable +com.android.dex.Dex$MethodIdTable +com.android.dex.Dex$ProtoIdTable +com.android.dex.Dex$Section +com.android.dex.Dex$StringTable +com.android.dex.Dex$TypeIndexToDescriptorIndexTable +com.android.dex.Dex$TypeIndexToDescriptorTable +com.android.dex.DexException com.android.dex.DexFormat com.android.dex.EncodedValue com.android.dex.EncodedValueCodec com.android.dex.EncodedValueReader +com.android.dex.FieldId com.android.dex.Leb128 +com.android.dex.MethodId com.android.dex.Mutf8 +com.android.dex.TableOfContents +com.android.dex.TableOfContents$Section +com.android.dex.TypeList com.android.dex.util.ByteArrayByteInput -com.android.i18n.phonenumbers.AsYouTypeFormatter -com.android.i18n.phonenumbers.PhoneNumberMatcher +com.android.dex.util.ByteInput +com.android.dex.util.ByteOutput +com.android.dex.util.ExceptionWithContext +com.android.dex.util.FileUtils +com.android.i18n.phonenumbers.CountryCodeToRegionCodeMap +com.android.i18n.phonenumbers.MetadataLoader +com.android.i18n.phonenumbers.NumberParseException com.android.i18n.phonenumbers.PhoneNumberUtil -com.android.i18n.phonenumbers.Phonemetadata$PhoneMetadata +com.android.i18n.phonenumbers.PhoneNumberUtil$1 +com.android.i18n.phonenumbers.RegexCache +com.android.i18n.phonenumbers.RegexCache$LRUCache +com.android.i18n.phonenumbers.RegexCache$LRUCache$1 com.android.internal.R$styleable +com.android.internal.app.AlertController +com.android.internal.app.AlertController$1 +com.android.internal.app.AlertController$2 +com.android.internal.app.AlertController$AlertParams +com.android.internal.app.AlertController$ButtonHandler com.android.internal.app.IAppOpsService com.android.internal.app.IAppOpsService$Stub com.android.internal.app.IAppOpsService$Stub$Proxy -com.android.internal.app.IBatteryStats$Stub com.android.internal.app.IVoiceInteractor com.android.internal.app.IVoiceInteractor$Stub -com.android.internal.app.ResolverActivity$ResolveListAdapter com.android.internal.app.WindowDecorActionBar com.android.internal.app.WindowDecorActionBar$1 com.android.internal.app.WindowDecorActionBar$2 @@ -1747,18 +2242,15 @@ com.android.internal.appwidget.IAppWidgetService com.android.internal.appwidget.IAppWidgetService$Stub com.android.internal.appwidget.IAppWidgetService$Stub$Proxy com.android.internal.content.NativeLibraryHelper +com.android.internal.content.ReferrerIntent +com.android.internal.content.ReferrerIntent$1 com.android.internal.logging.AndroidConfig com.android.internal.logging.AndroidHandler com.android.internal.logging.AndroidHandler$1 com.android.internal.net.NetworkStatsFactory com.android.internal.os.AndroidPrintStream -com.android.internal.os.BatteryStatsImpl -com.android.internal.os.BatteryStatsImpl$Uid com.android.internal.os.BinderInternal com.android.internal.os.BinderInternal$GcWatcher -com.android.internal.os.IDropBoxManagerService -com.android.internal.os.IDropBoxManagerService$Stub -com.android.internal.os.IDropBoxManagerService$Stub$Proxy com.android.internal.os.LoggingPrintStream com.android.internal.os.LoggingPrintStream$1 com.android.internal.os.RuntimeInit @@ -1773,21 +2265,19 @@ com.android.internal.os.ZygoteConnection$Arguments com.android.internal.os.ZygoteInit com.android.internal.os.ZygoteInit$MethodAndArgsCaller com.android.internal.os.ZygoteSecurityException -com.android.internal.policy.IPolicy -com.android.internal.policy.PolicyManager -com.android.internal.policy.impl.PhoneFallbackEventHandler -com.android.internal.policy.impl.PhoneLayoutInflater -com.android.internal.policy.impl.PhoneWindow -com.android.internal.policy.impl.PhoneWindow$1 -com.android.internal.policy.impl.PhoneWindow$ActionMenuPresenterCallback -com.android.internal.policy.impl.PhoneWindow$DecorView -com.android.internal.policy.impl.PhoneWindow$DialogMenuCallback -com.android.internal.policy.impl.PhoneWindow$PanelFeatureState -com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState -com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState$1 -com.android.internal.policy.impl.PhoneWindow$RotationWatcher -com.android.internal.policy.impl.PhoneWindow$RotationWatcher$1 -com.android.internal.policy.impl.Policy +com.android.internal.policy.PhoneFallbackEventHandler +com.android.internal.policy.PhoneLayoutInflater +com.android.internal.policy.PhoneWindow +com.android.internal.policy.PhoneWindow$1 +com.android.internal.policy.PhoneWindow$ActionMenuPresenterCallback +com.android.internal.policy.PhoneWindow$ColorViewState +com.android.internal.policy.PhoneWindow$DecorView +com.android.internal.policy.PhoneWindow$DialogMenuCallback +com.android.internal.policy.PhoneWindow$PanelFeatureState +com.android.internal.policy.PhoneWindow$PanelFeatureState$SavedState +com.android.internal.policy.PhoneWindow$PanelFeatureState$SavedState$1 +com.android.internal.policy.PhoneWindow$RotationWatcher +com.android.internal.policy.PhoneWindow$RotationWatcher$1 com.android.internal.telephony.ISub com.android.internal.telephony.ISub$Stub com.android.internal.telephony.ISub$Stub$Proxy @@ -1798,14 +2288,23 @@ com.android.internal.telephony.ITelephonyRegistry com.android.internal.telephony.ITelephonyRegistry$Stub com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy com.android.internal.telephony.PhoneConstants$State +com.android.internal.textservice.ITextServicesManager +com.android.internal.textservice.ITextServicesManager$Stub +com.android.internal.textservice.ITextServicesManager$Stub$Proxy +com.android.internal.transition.EpicenterTranslateClipReveal +com.android.internal.transition.TransitionConstants com.android.internal.util.ArrayUtils +com.android.internal.util.AsyncChannel +com.android.internal.util.AsyncChannel$DeathMonitor +com.android.internal.util.FastMath com.android.internal.util.FastPrintWriter -com.android.internal.util.FastPrintWriter$1 +com.android.internal.util.FastPrintWriter$DummyWriter com.android.internal.util.FastXmlSerializer com.android.internal.util.GrowingArrayUtils com.android.internal.util.Preconditions com.android.internal.util.VirtualRefBasePtr com.android.internal.util.XmlUtils +com.android.internal.util.XmlUtils$WriteMapCallback com.android.internal.view.ActionBarPolicy com.android.internal.view.IInputConnectionWrapper com.android.internal.view.IInputConnectionWrapper$MyHandler @@ -1853,88 +2352,104 @@ com.android.internal.widget.ActionBarOverlayLayout$5 com.android.internal.widget.ActionBarOverlayLayout$ActionBarVisibilityCallback com.android.internal.widget.ActionBarOverlayLayout$LayoutParams com.android.internal.widget.BackgroundFallback +com.android.internal.widget.ButtonBarLayout com.android.internal.widget.DecorContentParent com.android.internal.widget.DecorToolbar +com.android.internal.widget.DialogTitle com.android.internal.widget.EditableInputConnection -com.android.internal.widget.LockPatternUtils -com.android.internal.widget.ScrollingTabContainerView -com.android.internal.widget.ScrollingTabContainerView$TabView com.android.internal.widget.ToolbarWidgetWrapper com.android.internal.widget.ToolbarWidgetWrapper$1 com.android.okhttp.Address +com.android.okhttp.Authenticator com.android.okhttp.CacheControl +com.android.okhttp.CacheControl$Builder +com.android.okhttp.CertificatePinner +com.android.okhttp.CertificatePinner$Builder +com.android.okhttp.CipherSuite com.android.okhttp.ConfigAwareConnectionPool com.android.okhttp.ConfigAwareConnectionPool$1 com.android.okhttp.Connection com.android.okhttp.ConnectionPool com.android.okhttp.ConnectionPool$1 +com.android.okhttp.ConnectionSpec +com.android.okhttp.ConnectionSpec$Builder com.android.okhttp.Dispatcher com.android.okhttp.Handshake com.android.okhttp.Headers com.android.okhttp.Headers$Builder -com.android.okhttp.HostResolver -com.android.okhttp.HostResolver$1 com.android.okhttp.HttpHandler com.android.okhttp.HttpsHandler -com.android.okhttp.OkAuthenticator com.android.okhttp.OkHttpClient -com.android.okhttp.OkResponseCache +com.android.okhttp.OkHttpClient$1 +com.android.okhttp.OkUrlFactory com.android.okhttp.Protocol com.android.okhttp.Request com.android.okhttp.Request$Builder -com.android.okhttp.Request$ParsedHeaders +com.android.okhttp.RequestBody +com.android.okhttp.RequestBody$2 com.android.okhttp.Response -com.android.okhttp.Response$Body com.android.okhttp.Response$Builder -com.android.okhttp.ResponseSource +com.android.okhttp.ResponseBody com.android.okhttp.Route -com.android.okhttp.RouteDatabase -com.android.okhttp.TunnelRequest +com.android.okhttp.TlsVersion +com.android.okhttp.internal.ConnectionSpecSelector +com.android.okhttp.internal.Internal +com.android.okhttp.internal.Network +com.android.okhttp.internal.Network$1 +com.android.okhttp.internal.OptionalMethod com.android.okhttp.internal.Platform +com.android.okhttp.internal.RouteDatabase com.android.okhttp.internal.Util com.android.okhttp.internal.Util$1 +com.android.okhttp.internal.http.AuthenticatorAdapter com.android.okhttp.internal.http.CacheStrategy -com.android.okhttp.internal.http.CacheStrategy$1 com.android.okhttp.internal.http.CacheStrategy$Factory -com.android.okhttp.internal.http.DelegatingHttpsURLConnection -com.android.okhttp.internal.http.HttpAuthenticator -com.android.okhttp.internal.http.HttpAuthenticator$1 com.android.okhttp.internal.http.HttpConnection com.android.okhttp.internal.http.HttpConnection$AbstractSource com.android.okhttp.internal.http.HttpConnection$ChunkedSource com.android.okhttp.internal.http.HttpConnection$FixedLengthSource com.android.okhttp.internal.http.HttpEngine +com.android.okhttp.internal.http.HttpEngine$1 com.android.okhttp.internal.http.HttpMethod com.android.okhttp.internal.http.HttpTransport -com.android.okhttp.internal.http.HttpURLConnectionImpl -com.android.okhttp.internal.http.HttpURLConnectionImpl$Retry -com.android.okhttp.internal.http.HttpsURLConnectionImpl com.android.okhttp.internal.http.OkHeaders com.android.okhttp.internal.http.OkHeaders$1 +com.android.okhttp.internal.http.RealResponseBody +com.android.okhttp.internal.http.RequestException com.android.okhttp.internal.http.RequestLine com.android.okhttp.internal.http.RetryableSink +com.android.okhttp.internal.http.RouteException com.android.okhttp.internal.http.RouteSelector +com.android.okhttp.internal.http.SocketConnector +com.android.okhttp.internal.http.SocketConnector$ConnectedSocket com.android.okhttp.internal.http.StatusLine com.android.okhttp.internal.http.Transport +com.android.okhttp.internal.huc.DelegatingHttpsURLConnection +com.android.okhttp.internal.huc.HttpURLConnectionImpl +com.android.okhttp.internal.huc.HttpsURLConnectionImpl com.android.okhttp.internal.tls.OkHostnameVerifier -com.android.okio.BufferedSink -com.android.okio.BufferedSource -com.android.okio.ByteString -com.android.okio.Deadline -com.android.okio.Deadline$1 -com.android.okio.OkBuffer -com.android.okio.Okio -com.android.okio.Okio$1 -com.android.okio.Okio$2 -com.android.okio.RealBufferedSink -com.android.okio.RealBufferedSink$1 -com.android.okio.RealBufferedSource -com.android.okio.RealBufferedSource$1 -com.android.okio.Segment -com.android.okio.SegmentPool -com.android.okio.Sink -com.android.okio.Source -com.android.okio.Util +com.android.okhttp.okio.AsyncTimeout +com.android.okhttp.okio.AsyncTimeout$1 +com.android.okhttp.okio.AsyncTimeout$2 +com.android.okhttp.okio.AsyncTimeout$Watchdog +com.android.okhttp.okio.Buffer +com.android.okhttp.okio.BufferedSink +com.android.okhttp.okio.BufferedSource +com.android.okhttp.okio.Okio +com.android.okhttp.okio.Okio$1 +com.android.okhttp.okio.Okio$2 +com.android.okhttp.okio.Okio$3 +com.android.okhttp.okio.RealBufferedSink +com.android.okhttp.okio.RealBufferedSink$1 +com.android.okhttp.okio.RealBufferedSource +com.android.okhttp.okio.RealBufferedSource$1 +com.android.okhttp.okio.Segment +com.android.okhttp.okio.SegmentPool +com.android.okhttp.okio.Sink +com.android.okhttp.okio.Source +com.android.okhttp.okio.Timeout +com.android.okhttp.okio.Timeout$1 +com.android.okhttp.okio.Util com.android.org.bouncycastle.asn1.ASN1Boolean com.android.org.bouncycastle.asn1.ASN1Choice com.android.org.bouncycastle.asn1.ASN1Encodable @@ -1946,8 +2461,10 @@ com.android.org.bouncycastle.asn1.ASN1Object com.android.org.bouncycastle.asn1.ASN1ObjectIdentifier com.android.org.bouncycastle.asn1.ASN1OctetString com.android.org.bouncycastle.asn1.ASN1OctetStringParser +com.android.org.bouncycastle.asn1.ASN1OutputStream com.android.org.bouncycastle.asn1.ASN1Primitive com.android.org.bouncycastle.asn1.ASN1Sequence +com.android.org.bouncycastle.asn1.ASN1SequenceParser com.android.org.bouncycastle.asn1.ASN1Set com.android.org.bouncycastle.asn1.ASN1StreamParser com.android.org.bouncycastle.asn1.ASN1String @@ -1955,19 +2472,16 @@ com.android.org.bouncycastle.asn1.ASN1TaggedObject com.android.org.bouncycastle.asn1.ASN1TaggedObjectParser com.android.org.bouncycastle.asn1.BERTags com.android.org.bouncycastle.asn1.DERBitString -com.android.org.bouncycastle.asn1.DERBoolean com.android.org.bouncycastle.asn1.DERFactory com.android.org.bouncycastle.asn1.DERIA5String -com.android.org.bouncycastle.asn1.DERInteger com.android.org.bouncycastle.asn1.DERNull -com.android.org.bouncycastle.asn1.DERObjectIdentifier com.android.org.bouncycastle.asn1.DEROctetString +com.android.org.bouncycastle.asn1.DEROutputStream com.android.org.bouncycastle.asn1.DERPrintableString com.android.org.bouncycastle.asn1.DERSequence com.android.org.bouncycastle.asn1.DERSet com.android.org.bouncycastle.asn1.DERTaggedObject com.android.org.bouncycastle.asn1.DERUTF8String -com.android.org.bouncycastle.asn1.DERUniversalString com.android.org.bouncycastle.asn1.DLSequence com.android.org.bouncycastle.asn1.DLSet com.android.org.bouncycastle.asn1.DefiniteLengthInputStream @@ -1980,6 +2494,12 @@ com.android.org.bouncycastle.asn1.iana.IANAObjectIdentifiers com.android.org.bouncycastle.asn1.nist.NISTObjectIdentifiers com.android.org.bouncycastle.asn1.oiw.OIWObjectIdentifiers com.android.org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers +com.android.org.bouncycastle.asn1.x500.AttributeTypeAndValue +com.android.org.bouncycastle.asn1.x500.RDN +com.android.org.bouncycastle.asn1.x500.X500Name +com.android.org.bouncycastle.asn1.x500.X500NameStyle +com.android.org.bouncycastle.asn1.x500.style.AbstractX500NameStyle +com.android.org.bouncycastle.asn1.x500.style.BCStyle com.android.org.bouncycastle.asn1.x509.AlgorithmIdentifier com.android.org.bouncycastle.asn1.x509.BasicConstraints com.android.org.bouncycastle.asn1.x509.Extension @@ -1988,8 +2508,6 @@ com.android.org.bouncycastle.asn1.x509.GeneralNames com.android.org.bouncycastle.asn1.x509.PolicyInformation com.android.org.bouncycastle.asn1.x509.SubjectPublicKeyInfo com.android.org.bouncycastle.asn1.x509.X509Extension -com.android.org.bouncycastle.asn1.x509.X509Extensions -com.android.org.bouncycastle.asn1.x509.X509Name com.android.org.bouncycastle.asn1.x509.X509ObjectIdentifiers com.android.org.bouncycastle.asn1.x9.X9ObjectIdentifiers com.android.org.bouncycastle.crypto.Digest @@ -1999,6 +2517,8 @@ com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryInterface com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryOpenSSL com.android.org.bouncycastle.crypto.digests.OpenSSLDigest com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA1 +com.android.org.bouncycastle.jcajce.PKIXExtendedParameters +com.android.org.bouncycastle.jcajce.PKIXExtendedParameters$Builder com.android.org.bouncycastle.jcajce.provider.asymmetric.DH$Mappings com.android.org.bouncycastle.jcajce.provider.asymmetric.DSA$Mappings com.android.org.bouncycastle.jcajce.provider.asymmetric.EC$Mappings @@ -2032,7 +2552,6 @@ com.android.org.bouncycastle.jcajce.provider.keystore.PKCS12$Mappings com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$Std com.android.org.bouncycastle.jcajce.provider.symmetric.AES -com.android.org.bouncycastle.jcajce.provider.symmetric.AES$ECB com.android.org.bouncycastle.jcajce.provider.symmetric.AES$Mappings com.android.org.bouncycastle.jcajce.provider.symmetric.ARC4 com.android.org.bouncycastle.jcajce.provider.symmetric.ARC4$Mappings @@ -2052,6 +2571,9 @@ com.android.org.bouncycastle.jcajce.provider.symmetric.Twofish$Mappings com.android.org.bouncycastle.jcajce.provider.util.AlgorithmProvider com.android.org.bouncycastle.jcajce.provider.util.AsymmetricAlgorithmProvider com.android.org.bouncycastle.jcajce.provider.util.AsymmetricKeyInfoConverter +com.android.org.bouncycastle.jcajce.util.BCJcaJceHelper +com.android.org.bouncycastle.jcajce.util.JcaJceHelper +com.android.org.bouncycastle.jcajce.util.ProviderJcaJceHelper com.android.org.bouncycastle.jce.exception.ExtException com.android.org.bouncycastle.jce.interfaces.BCKeyStore com.android.org.bouncycastle.jce.provider.AnnotatedException @@ -2065,8 +2587,10 @@ com.android.org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi com.android.org.bouncycastle.jce.provider.PKIXNameConstraintValidator com.android.org.bouncycastle.jce.provider.PKIXNameConstraintValidatorException com.android.org.bouncycastle.jce.provider.PKIXPolicyNode +com.android.org.bouncycastle.jce.provider.PrincipalUtils com.android.org.bouncycastle.jce.provider.RFC3280CertPathUtilities com.android.org.bouncycastle.util.Arrays +com.android.org.bouncycastle.util.Encodable com.android.org.bouncycastle.util.Strings com.android.org.bouncycastle.util.encoders.Encoder com.android.org.bouncycastle.util.encoders.Hex @@ -2075,6 +2599,7 @@ com.android.org.bouncycastle.util.io.Streams com.android.org.bouncycastle.x509.ExtendedPKIXParameters com.android.org.conscrypt.AbstractSessionContext com.android.org.conscrypt.AbstractSessionContext$1 +com.android.org.conscrypt.AddressUtils com.android.org.conscrypt.ByteArray com.android.org.conscrypt.CertPinManager com.android.org.conscrypt.ChainStrengthAnalyzer @@ -2088,17 +2613,23 @@ com.android.org.conscrypt.KeyManagerFactoryImpl com.android.org.conscrypt.KeyManagerImpl com.android.org.conscrypt.NativeCrypto com.android.org.conscrypt.NativeCrypto$SSLHandshakeCallbacks +com.android.org.conscrypt.NativeCryptoJni +com.android.org.conscrypt.NativeRef +com.android.org.conscrypt.NativeRef$EC_GROUP +com.android.org.conscrypt.NativeRef$EC_POINT +com.android.org.conscrypt.NativeRef$EVP_MD_CTX +com.android.org.conscrypt.NativeRef$EVP_PKEY com.android.org.conscrypt.OpenSSLBIOInputStream -com.android.org.conscrypt.OpenSSLCipher$AES$CBC$PKCS5Padding com.android.org.conscrypt.OpenSSLContextImpl -com.android.org.conscrypt.OpenSSLDigestContext +com.android.org.conscrypt.OpenSSLContextImpl$TLSv12 +com.android.org.conscrypt.OpenSSLECGroupContext +com.android.org.conscrypt.OpenSSLECPointContext +com.android.org.conscrypt.OpenSSLECPublicKey com.android.org.conscrypt.OpenSSLKey com.android.org.conscrypt.OpenSSLKeyHolder com.android.org.conscrypt.OpenSSLMessageDigestJDK com.android.org.conscrypt.OpenSSLMessageDigestJDK$MD5 com.android.org.conscrypt.OpenSSLMessageDigestJDK$SHA1 -com.android.org.conscrypt.OpenSSLMessageDigestJDK$SHA512 -com.android.org.conscrypt.OpenSSLNativeReference com.android.org.conscrypt.OpenSSLProvider com.android.org.conscrypt.OpenSSLRSAPublicKey com.android.org.conscrypt.OpenSSLRandom @@ -2117,7 +2648,6 @@ com.android.org.conscrypt.OpenSSLX509CertificateFactory$2 com.android.org.conscrypt.OpenSSLX509CertificateFactory$Parser com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException com.android.org.conscrypt.PinEntryException -com.android.org.conscrypt.PinListEntry com.android.org.conscrypt.PinManagerException com.android.org.conscrypt.Platform com.android.org.conscrypt.Platform$OpenSSLMapper @@ -2135,7 +2665,7 @@ com.android.org.conscrypt.TrustedCertificateStore com.android.org.conscrypt.TrustedCertificateStore$1 com.android.org.conscrypt.TrustedCertificateStore$2 com.android.org.conscrypt.TrustedCertificateStore$CertSelector -com.android.org.conscrypt.util.Arrays +com.android.org.conscrypt.util.ArrayUtils com.android.server.NetworkManagementSocketTagger com.android.server.NetworkManagementSocketTagger$1 com.android.server.NetworkManagementSocketTagger$SocketTags @@ -2143,17 +2673,27 @@ com.google.android.collect.Lists com.google.android.collect.Maps com.google.android.gles_jni.EGLImpl com.google.android.gles_jni.GLImpl +dalvik.system.BaseDexClassLoader dalvik.system.BlockGuard dalvik.system.BlockGuard$1 dalvik.system.BlockGuard$2 dalvik.system.BlockGuard$BlockGuardPolicyException dalvik.system.BlockGuard$Policy +dalvik.system.CloseGuard +dalvik.system.CloseGuard$DefaultReporter +dalvik.system.CloseGuard$Reporter dalvik.system.DalvikLogHandler dalvik.system.DalvikLogging +dalvik.system.DexFile +dalvik.system.DexFile$DFEnum +dalvik.system.DexPathList +dalvik.system.DexPathList$Element +dalvik.system.PathClassLoader dalvik.system.SocketTagger dalvik.system.SocketTagger$1 dalvik.system.VMDebug dalvik.system.VMRuntime +dalvik.system.VMStack dalvik.system.ZygoteHooks java.beans.PropertyChangeEvent java.beans.PropertyChangeSupport @@ -2162,40 +2702,73 @@ java.io.BufferedOutputStream java.io.BufferedReader java.io.BufferedWriter java.io.ByteArrayInputStream +java.io.ByteArrayOutputStream java.io.Closeable +java.io.DataInput java.io.DataInputStream +java.io.DataOutput +java.io.DataOutputStream java.io.EOFException java.io.Externalizable java.io.File java.io.FileDescriptor +java.io.FileFilter java.io.FileInputStream java.io.FileNotFoundException java.io.FileOutputStream java.io.FileReader java.io.FilterInputStream +java.io.FilterOutputStream +java.io.FilterReader +java.io.Flushable java.io.IOException java.io.InputStream java.io.InputStreamReader java.io.InterruptedIOException +java.io.InvalidObjectException +java.io.ObjectInput java.io.ObjectInputStream +java.io.ObjectOutput +java.io.ObjectOutputStream +java.io.ObjectOutputStream$PutField java.io.ObjectStreamClass +java.io.ObjectStreamClass$5 +java.io.ObjectStreamConstants +java.io.ObjectStreamException +java.io.ObjectStreamField java.io.OutputStream java.io.OutputStreamWriter +java.io.PrintStream java.io.PrintWriter java.io.PushbackInputStream +java.io.PushbackReader java.io.RandomAccessFile java.io.Reader java.io.Serializable +java.io.SerializablePermission +java.io.SerializationHandleMap java.io.StringReader java.io.StringWriter +java.io.UTFDataFormatException java.io.UnsupportedEncodingException +java.io.Writer java.lang.AbstractMethodError +java.lang.AbstractStringBuilder +java.lang.Appendable java.lang.ArrayIndexOutOfBoundsException +java.lang.AssertionError +java.lang.AutoCloseable java.lang.Boolean +java.lang.BootClassLoader java.lang.Byte +java.lang.CaseMapper +java.lang.CaseMapper$1 java.lang.CharSequence java.lang.Character +java.lang.Character$Subset +java.lang.Character$UnicodeBlock java.lang.Class +java.lang.Class$Caches java.lang.ClassCastException java.lang.ClassLoader java.lang.ClassLoader$SystemClassLoader @@ -2207,23 +2780,32 @@ java.lang.Daemons java.lang.Daemons$Daemon java.lang.Daemons$FinalizerDaemon java.lang.Daemons$FinalizerWatchdogDaemon -java.lang.Daemons$GCDaemon -java.lang.Daemons$HeapTrimmerDaemon +java.lang.Daemons$HeapTaskDaemon java.lang.Daemons$ReferenceQueueDaemon +java.lang.DexCache java.lang.Double java.lang.Enum +java.lang.Enum$1 java.lang.Error java.lang.Exception java.lang.Float java.lang.IllegalAccessException java.lang.IllegalArgumentException java.lang.IllegalStateException +java.lang.IllegalThreadStateException +java.lang.IncompatibleClassChangeError +java.lang.IndexOutOfBoundsException java.lang.InstantiationException java.lang.Integer +java.lang.IntegralToString +java.lang.IntegralToString$1 +java.lang.InternalError java.lang.InterruptedException java.lang.Iterable +java.lang.LinkageError java.lang.Long java.lang.Math +java.lang.Math$NoImagePreloadHolder java.lang.NoClassDefFoundError java.lang.NoSuchFieldError java.lang.NoSuchFieldException @@ -2234,41 +2816,78 @@ java.lang.Number java.lang.NumberFormatException java.lang.Object java.lang.OutOfMemoryError +java.lang.Package +java.lang.Readable +java.lang.RealToString +java.lang.RealToString$1 +java.lang.ReflectiveOperationException java.lang.Runnable java.lang.Runtime java.lang.RuntimeException java.lang.RuntimePermission java.lang.SecurityException java.lang.Short +java.lang.StackOverflowError +java.lang.StackTraceElement java.lang.StrictMath java.lang.String +java.lang.String$CaseInsensitiveComparator +java.lang.StringBuffer java.lang.StringBuilder +java.lang.StringFactory +java.lang.StringIndexOutOfBoundsException +java.lang.StringToReal java.lang.StringToReal$StringExponentPair java.lang.System java.lang.System$PropertiesWithNonOverrideableDefaults java.lang.Thread +java.lang.Thread$State java.lang.Thread$UncaughtExceptionHandler +java.lang.ThreadDeath +java.lang.ThreadGroup java.lang.ThreadLocal +java.lang.ThreadLocal$Values java.lang.Throwable +java.lang.TwoEnumerationsInOne java.lang.UnsatisfiedLinkError java.lang.UnsupportedOperationException +java.lang.VMClassLoader +java.lang.VirtualMachineError java.lang.Void java.lang.annotation.Annotation java.lang.annotation.Inherited +java.lang.ref.FinalizerReference +java.lang.ref.FinalizerReference$Sentinel +java.lang.ref.PhantomReference +java.lang.ref.Reference +java.lang.ref.ReferenceQueue java.lang.ref.SoftReference java.lang.ref.WeakReference +java.lang.reflect.AbstractMethod +java.lang.reflect.AbstractMethod$GenericInfo +java.lang.reflect.AccessibleObject +java.lang.reflect.AnnotatedElement +java.lang.reflect.Array +java.lang.reflect.Constructor java.lang.reflect.Field +java.lang.reflect.Field$1 java.lang.reflect.GenericArrayType +java.lang.reflect.GenericDeclaration +java.lang.reflect.InvocationHandler java.lang.reflect.InvocationTargetException +java.lang.reflect.Member java.lang.reflect.Method +java.lang.reflect.Method$1 +java.lang.reflect.Modifier java.lang.reflect.ParameterizedType +java.lang.reflect.Proxy +java.lang.reflect.Proxy$1 java.lang.reflect.Type +java.lang.reflect.TypeVariable java.lang.reflect.WildcardType java.math.BigDecimal java.math.BigInt java.math.BigInteger -java.math.Conversion -java.math.Multiplication java.math.NativeBN java.math.RoundingMode java.net.AddressCache @@ -2286,18 +2905,24 @@ java.net.InetUnixAddress java.net.JarURLConnection java.net.MalformedURLException java.net.PlainSocketImpl +java.net.ProtocolException java.net.Proxy java.net.Proxy$Type java.net.ProxySelector java.net.ProxySelectorImpl java.net.ResponseCache +java.net.ServerSocket java.net.Socket java.net.SocketAddress java.net.SocketException java.net.SocketImpl java.net.SocketOptions java.net.SocketTimeoutException +java.net.URI +java.net.URI$1 +java.net.URI$PartEncoder java.net.URISyntaxException +java.net.URL java.net.URLConnection java.net.URLConnection$DefaultContentHandler java.net.URLEncoder @@ -2305,19 +2930,47 @@ java.net.URLEncoder$1 java.net.URLStreamHandler java.net.URLStreamHandlerFactory java.net.UnknownHostException +java.nio.Buffer +java.nio.BufferOverflowException +java.nio.BufferUnderflowException +java.nio.ByteArrayBuffer +java.nio.ByteBuffer +java.nio.ByteBufferAsCharBuffer +java.nio.ByteBufferAsDoubleBuffer +java.nio.ByteBufferAsFloatBuffer +java.nio.ByteBufferAsIntBuffer +java.nio.ByteBufferAsLongBuffer +java.nio.ByteBufferAsShortBuffer java.nio.ByteOrder java.nio.CharArrayBuffer +java.nio.CharBuffer java.nio.CharSequenceAdapter +java.nio.DirectByteBuffer +java.nio.DoubleBuffer java.nio.FileChannelImpl java.nio.FileChannelImpl$1 +java.nio.FileChannelImpl$FileLockImpl +java.nio.FloatBuffer +java.nio.IntBuffer +java.nio.InvalidMarkException +java.nio.LongBuffer +java.nio.MappedByteBuffer +java.nio.MemoryBlock +java.nio.MemoryBlock$MemoryMappedBlock +java.nio.MemoryBlock$NonMovableHeapBlock java.nio.MemoryBlock$UnmanagedBlock java.nio.NIOAccess +java.nio.NioUtils +java.nio.ReadOnlyBufferException +java.nio.ShortBuffer java.nio.channels.AsynchronousCloseException java.nio.channels.ByteChannel java.nio.channels.Channel java.nio.channels.ClosedByInterruptException java.nio.channels.ClosedChannelException java.nio.channels.FileChannel +java.nio.channels.FileChannel$MapMode +java.nio.channels.FileLock java.nio.channels.GatheringByteChannel java.nio.channels.InterruptibleChannel java.nio.channels.ReadableByteChannel @@ -2325,33 +2978,44 @@ java.nio.channels.ScatteringByteChannel java.nio.channels.WritableByteChannel java.nio.channels.spi.AbstractInterruptibleChannel java.nio.channels.spi.AbstractInterruptibleChannel$1 +java.nio.charset.CharacterCodingException java.nio.charset.Charset java.nio.charset.CharsetDecoder +java.nio.charset.CharsetDecoderICU java.nio.charset.CharsetEncoder java.nio.charset.CharsetEncoderICU java.nio.charset.CharsetICU java.nio.charset.CoderResult +java.nio.charset.CodingErrorAction +java.nio.charset.IllegalCharsetNameException java.nio.charset.ModifiedUtf8 java.nio.charset.StandardCharsets +java.nio.charset.UnsupportedCharsetException +java.security.AccessControlException java.security.AccessController +java.security.BasicPermission java.security.DigestException java.security.GeneralSecurityException +java.security.Guard java.security.InvalidAlgorithmParameterException java.security.InvalidKeyException java.security.Key java.security.KeyException java.security.KeyFactorySpi java.security.KeyManagementException -java.security.KeyPairGeneratorSpi java.security.KeyStore java.security.KeyStoreException java.security.KeyStoreSpi java.security.MessageDigest java.security.MessageDigest$MessageDigestImpl +java.security.MessageDigestSpi java.security.NoSuchAlgorithmException java.security.NoSuchProviderException +java.security.Permission java.security.Principal +java.security.PrivateKey java.security.PrivilegedAction +java.security.ProtectionDomain java.security.Provider java.security.Provider$Service java.security.PublicKey @@ -2359,8 +3023,13 @@ java.security.SecureRandom java.security.SecureRandomSpi java.security.Security java.security.Security$SecurityDoor +java.security.Signature +java.security.Signature$SignatureImpl +java.security.SignatureException +java.security.SignatureSpi java.security.UnrecoverableEntryException java.security.UnrecoverableKeyException +java.security.cert.CRL java.security.cert.CRLException java.security.cert.CertPath java.security.cert.CertPathBuilderException @@ -2390,13 +3059,25 @@ java.security.cert.X509Certificate java.security.cert.X509Extension java.security.interfaces.DSAKey java.security.interfaces.DSAPublicKey +java.security.interfaces.ECKey +java.security.interfaces.ECPrivateKey +java.security.interfaces.ECPublicKey java.security.interfaces.RSAKey +java.security.interfaces.RSAPrivateKey java.security.interfaces.RSAPublicKey java.security.spec.AlgorithmParameterSpec +java.security.spec.ECField +java.security.spec.ECFieldFp +java.security.spec.ECParameterSpec +java.security.spec.ECPoint +java.security.spec.EllipticCurve java.security.spec.InvalidKeySpecException +java.security.spec.InvalidParameterSpecException +java.security.spec.KeySpec java.text.AttributedCharacterIterator$Attribute java.text.Bidi java.text.Bidi$Run +java.text.Collator java.text.DateFormat java.text.DateFormat$Field java.text.DateFormatSymbols @@ -2409,47 +3090,115 @@ java.text.NumberFormat java.text.NumberFormat$Field java.text.ParseException java.text.ParsePosition +java.text.RuleBasedCollator java.text.SimpleDateFormat java.util.AbstractCollection +java.util.AbstractList +java.util.AbstractList$FullListIterator +java.util.AbstractList$SimpleListIterator +java.util.AbstractList$SubAbstractList +java.util.AbstractList$SubAbstractListRandomAccess java.util.AbstractMap +java.util.AbstractMap$1 +java.util.AbstractMap$2 +java.util.AbstractMap$2$1 +java.util.AbstractQueue java.util.AbstractSequentialList java.util.AbstractSet java.util.ArrayDeque java.util.ArrayList +java.util.ArrayList$ArrayListIterator java.util.Arrays java.util.Arrays$ArrayList java.util.BitSet java.util.Calendar java.util.Collection java.util.Collections +java.util.Collections$1 +java.util.Collections$2 +java.util.Collections$3 +java.util.Collections$AsLIFOQueue +java.util.Collections$CheckedCollection +java.util.Collections$CheckedList +java.util.Collections$CheckedMap +java.util.Collections$CheckedRandomAccessList +java.util.Collections$CheckedSet +java.util.Collections$CheckedSortedMap +java.util.Collections$CheckedSortedSet +java.util.Collections$CopiesList +java.util.Collections$EmptyList +java.util.Collections$EmptyMap +java.util.Collections$EmptySet +java.util.Collections$ReverseComparator +java.util.Collections$ReverseComparator2 +java.util.Collections$SetFromMap +java.util.Collections$SingletonList +java.util.Collections$SingletonMap +java.util.Collections$SingletonSet java.util.Collections$SingletonSet$1 +java.util.Collections$SynchronizedCollection +java.util.Collections$SynchronizedList +java.util.Collections$SynchronizedMap +java.util.Collections$SynchronizedRandomAccessList +java.util.Collections$SynchronizedSet +java.util.Collections$SynchronizedSortedMap +java.util.Collections$SynchronizedSortedSet +java.util.Collections$UnmodifiableCollection java.util.Collections$UnmodifiableCollection$1 +java.util.Collections$UnmodifiableList +java.util.Collections$UnmodifiableMap java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet$1 java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableMapEntry +java.util.Collections$UnmodifiableRandomAccessList +java.util.Collections$UnmodifiableSet +java.util.Collections$UnmodifiableSortedMap +java.util.Collections$UnmodifiableSortedSet java.util.ComparableTimSort java.util.Comparator +java.util.ConcurrentModificationException java.util.Currency java.util.Date +java.util.Deque +java.util.Dictionary java.util.DualPivotQuicksort java.util.EnumMap java.util.EnumSet +java.util.Enumeration +java.util.EventListener java.util.EventObject java.util.Formattable +java.util.Formatter +java.util.Formatter$1 +java.util.Formatter$CachedDecimalFormat java.util.Formatter$FormatSpecifierParser java.util.Formatter$FormatToken java.util.GregorianCalendar java.util.HashMap +java.util.HashMap$EntryIterator +java.util.HashMap$EntrySet +java.util.HashMap$HashIterator +java.util.HashMap$HashMapEntry +java.util.HashMap$KeyIterator +java.util.HashMap$KeySet +java.util.HashMap$ValueIterator +java.util.HashMap$Values java.util.HashSet +java.util.Hashtable java.util.Hashtable$HashIterator +java.util.Hashtable$HashtableEntry java.util.Hashtable$KeyEnumeration java.util.Hashtable$ValueIterator java.util.Hashtable$Values java.util.IdentityHashMap +java.util.IdentityHashMap$IdentityHashMapIterator +java.util.IllegalFormatException +java.util.IllformedLocaleException java.util.Iterator java.util.LinkedHashMap java.util.LinkedHashMap$EntryIterator java.util.LinkedHashMap$KeyIterator +java.util.LinkedHashMap$LinkedEntry java.util.LinkedHashMap$LinkedHashIterator java.util.LinkedHashMap$ValueIterator java.util.LinkedHashSet @@ -2460,6 +3209,7 @@ java.util.List java.util.ListIterator java.util.Locale java.util.Locale$Builder +java.util.Locale$NoImagePreloadHolder java.util.Map java.util.Map$Entry java.util.MapEntry @@ -2476,7 +3226,8 @@ java.util.Properties java.util.Queue java.util.Random java.util.RandomAccess -java.util.Scanner +java.util.ResourceBundle +java.util.ResourceBundle$MissingBundle java.util.Set java.util.SimpleTimeZone java.util.SortedMap @@ -2492,11 +3243,12 @@ java.util.Timer$TimerImpl$TimerHeap java.util.TimerTask java.util.TreeMap java.util.TreeMap$1 -java.util.TreeMap$2 java.util.TreeMap$Bound java.util.TreeMap$Bound$1 java.util.TreeMap$Bound$2 java.util.TreeMap$Bound$3 +java.util.TreeMap$BoundedMap +java.util.TreeMap$BoundedMap$BoundedIterator java.util.TreeMap$EntrySet java.util.TreeMap$EntrySet$1 java.util.TreeMap$KeySet @@ -2528,31 +3280,41 @@ java.util.concurrent.ConcurrentHashMap$KeySetView java.util.concurrent.ConcurrentHashMap$Node java.util.concurrent.ConcurrentHashMap$Segment java.util.concurrent.ConcurrentHashMap$Traverser +java.util.concurrent.ConcurrentHashMap$TreeBin +java.util.concurrent.ConcurrentHashMap$TreeNode java.util.concurrent.ConcurrentLinkedQueue java.util.concurrent.ConcurrentLinkedQueue$Node java.util.concurrent.ConcurrentMap -java.util.concurrent.ConcurrentSkipListMap java.util.concurrent.CopyOnWriteArrayList java.util.concurrent.CopyOnWriteArrayList$CowIterator +java.util.concurrent.CopyOnWriteArraySet java.util.concurrent.CountDownLatch java.util.concurrent.CountDownLatch$Sync +java.util.concurrent.Delayed java.util.concurrent.ExecutionException java.util.concurrent.Executor java.util.concurrent.ExecutorService java.util.concurrent.Executors java.util.concurrent.Executors$DefaultThreadFactory java.util.concurrent.Executors$DelegatedExecutorService +java.util.concurrent.Executors$DelegatedScheduledExecutorService java.util.concurrent.Executors$FinalizableDelegatedExecutorService java.util.concurrent.Executors$RunnableAdapter java.util.concurrent.Future java.util.concurrent.FutureTask java.util.concurrent.FutureTask$WaitNode -java.util.concurrent.LinkedBlockingDeque java.util.concurrent.LinkedBlockingQueue java.util.concurrent.LinkedBlockingQueue$Node +java.util.concurrent.PriorityBlockingQueue +java.util.concurrent.RejectedExecutionException java.util.concurrent.RejectedExecutionHandler java.util.concurrent.RunnableFuture +java.util.concurrent.RunnableScheduledFuture java.util.concurrent.ScheduledExecutorService +java.util.concurrent.ScheduledFuture +java.util.concurrent.ScheduledThreadPoolExecutor +java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue +java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask java.util.concurrent.Semaphore java.util.concurrent.Semaphore$NonfairSync java.util.concurrent.Semaphore$Sync @@ -2594,9 +3356,13 @@ java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock java.util.concurrent.locks.ReentrantReadWriteLock$Sync java.util.concurrent.locks.ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock +java.util.jar.Attributes +java.util.jar.Attributes$Name java.util.jar.JarEntry java.util.jar.JarFile java.util.jar.JarFile$JarFileEnumerator +java.util.jar.Manifest +java.util.jar.ManifestReader java.util.jar.StrictJarFile java.util.logging.ConsoleHandler java.util.logging.ErrorManager @@ -2611,21 +3377,39 @@ java.util.logging.Logger$1 java.util.logging.LoggingPermission java.util.logging.SimpleFormatter java.util.logging.StreamHandler +java.util.regex.MatchResult +java.util.regex.Matcher java.util.regex.Pattern java.util.regex.PatternSyntaxException +java.util.regex.Splitter +java.util.zip.Adler32 java.util.zip.CRC32 +java.util.zip.Checksum +java.util.zip.DataFormatException java.util.zip.Deflater java.util.zip.DeflaterOutputStream java.util.zip.GZIPInputStream java.util.zip.GZIPOutputStream java.util.zip.Inflater java.util.zip.InflaterInputStream +java.util.zip.Zip64 +java.util.zip.ZipConstants +java.util.zip.ZipEntry +java.util.zip.ZipFile java.util.zip.ZipFile$1 +java.util.zip.ZipFile$EocdRecord java.util.zip.ZipFile$RAFStream +java.util.zip.ZipFile$ZipInflaterInputStream javax.crypto.BadPaddingException +javax.crypto.Cipher +javax.crypto.Cipher$NeedToSet +javax.crypto.CipherSpi javax.crypto.IllegalBlockSizeException javax.crypto.NoSuchPaddingException -javax.crypto.spec.GCMParameterSpec +javax.crypto.SecretKey +javax.crypto.ShortBufferException +javax.crypto.spec.IvParameterSpec +javax.crypto.spec.SecretKeySpec javax.microedition.khronos.egl.EGL javax.microedition.khronos.egl.EGL10 javax.microedition.khronos.opengles.GL @@ -2635,17 +3419,22 @@ javax.microedition.khronos.opengles.GL11 javax.microedition.khronos.opengles.GL11Ext javax.microedition.khronos.opengles.GL11ExtensionPack javax.net.DefaultSocketFactory +javax.net.ServerSocketFactory javax.net.SocketFactory javax.net.ssl.DistinguishedNameParser +javax.net.ssl.HandshakeCompletedListener javax.net.ssl.HostnameVerifier javax.net.ssl.HttpsURLConnection javax.net.ssl.KeyManager javax.net.ssl.KeyManagerFactory javax.net.ssl.KeyManagerFactorySpi +javax.net.ssl.SSLContext javax.net.ssl.SSLContextSpi +javax.net.ssl.SSLEngine javax.net.ssl.SSLException javax.net.ssl.SSLPeerUnverifiedException javax.net.ssl.SSLProtocolException +javax.net.ssl.SSLServerSocketFactory javax.net.ssl.SSLSession javax.net.ssl.SSLSessionContext javax.net.ssl.SSLSocket @@ -2657,14 +3446,17 @@ javax.net.ssl.X509ExtendedKeyManager javax.net.ssl.X509KeyManager javax.net.ssl.X509TrustManager javax.security.auth.x500.X500Principal +javax.security.cert.Certificate javax.security.cert.CertificateException +javax.security.cert.X509Certificate javax.xml.parsers.ParserConfigurationException libcore.icu.AlphabeticIndex libcore.icu.AlphabeticIndex$ImmutableIndex libcore.icu.DateIntervalFormat +libcore.icu.DateIntervalFormat$FormatterCache +libcore.icu.DateUtilsBridge libcore.icu.ICU libcore.icu.LocaleData -libcore.icu.NativeBreakIterator libcore.icu.NativeCollation libcore.icu.NativeConverter libcore.icu.NativeDecimalFormat @@ -2672,10 +3464,12 @@ libcore.icu.NativeDecimalFormat$FieldPositionIterator libcore.icu.NativeIDN libcore.icu.NativeNormalizer libcore.icu.NativePluralRules +libcore.icu.RuleBasedCollatorICU libcore.icu.TimeZoneNames libcore.icu.Transliterator libcore.internal.StringPool libcore.io.AsynchronousCloseMonitor +libcore.io.BlockGuardOs libcore.io.BufferIterator libcore.io.DropBox libcore.io.DropBox$DefaultReporter @@ -2683,14 +3477,21 @@ libcore.io.DropBox$Reporter libcore.io.EventLogger libcore.io.EventLogger$DefaultReporter libcore.io.EventLogger$Reporter +libcore.io.ForwardingOs libcore.io.HeapBufferIterator libcore.io.IoBridge +libcore.io.IoUtils libcore.io.IoUtils$FileReader +libcore.io.Libcore +libcore.io.Memory libcore.io.MemoryMappedFile libcore.io.NioBufferIterator +libcore.io.Os +libcore.io.Posix libcore.io.Streams libcore.math.MathUtils -libcore.net.MimeUtils +libcore.net.NetworkSecurityPolicy +libcore.net.UriCodec libcore.net.event.NetworkEventDispatcher libcore.net.event.NetworkEventListener libcore.net.url.FileHandler @@ -2700,11 +3501,23 @@ libcore.net.url.JarHandler libcore.net.url.JarURLConnectionImpl libcore.net.url.JarURLConnectionImpl$JarURLConnectionInputStream libcore.net.url.UrlUtils +libcore.reflect.AnnotationAccess libcore.reflect.AnnotationFactory libcore.reflect.AnnotationMember libcore.reflect.AnnotationMember$DefaultValues +libcore.reflect.GenericSignatureParser +libcore.reflect.InternalNames +libcore.reflect.ListOfTypes libcore.reflect.ListOfVariables libcore.reflect.ParameterizedTypeImpl +libcore.reflect.Types +libcore.util.BasicLruCache +libcore.util.CharsetUtils +libcore.util.CollectionUtils +libcore.util.CollectionUtils$1 +libcore.util.CollectionUtils$1$1 +libcore.util.EmptyArray +libcore.util.Objects libcore.util.ZoneInfo libcore.util.ZoneInfo$CheckedArithmeticException libcore.util.ZoneInfo$WallTime @@ -2716,6 +3529,9 @@ org.apache.commons.logging.LogFactory org.apache.commons.logging.impl.Jdk14Logger org.apache.commons.logging.impl.WeakHashtable org.apache.harmony.dalvik.NativeTestTarget +org.apache.harmony.dalvik.ddmc.Chunk +org.apache.harmony.dalvik.ddmc.ChunkHandler +org.apache.harmony.dalvik.ddmc.DdmServer org.apache.harmony.dalvik.ddmc.DdmVmInternal org.apache.harmony.luni.internal.util.TimezoneGetter org.apache.harmony.security.asn1.ASN1Any @@ -2744,12 +3560,11 @@ org.apache.harmony.security.asn1.BerInputStream org.apache.harmony.security.asn1.BerOutputStream org.apache.harmony.security.asn1.DerInputStream org.apache.harmony.security.asn1.DerOutputStream +org.apache.harmony.security.fortress.Engine org.apache.harmony.security.fortress.Engine$ServiceCacheEntry org.apache.harmony.security.fortress.Engine$SpiAndProvider org.apache.harmony.security.fortress.SecurityAccess org.apache.harmony.security.fortress.Services -org.apache.harmony.security.pkcs7.ContentInfo$1 -org.apache.harmony.security.pkcs7.SignedData org.apache.harmony.security.provider.crypto.CryptoProvider org.apache.harmony.security.utils.AlgNameMapper org.apache.harmony.security.utils.AlgNameMapperSource @@ -2763,11 +3578,8 @@ org.apache.harmony.security.x501.DirectoryString org.apache.harmony.security.x501.DirectoryString$1 org.apache.harmony.security.x501.Name org.apache.harmony.security.x501.Name$1 -org.apache.harmony.security.x509.TBSCertificate org.apache.harmony.xml.ExpatAttributes org.apache.harmony.xml.ExpatParser -org.apache.harmony.xml.dom.DocumentImpl -org.apache.harmony.xml.dom.InnerNodeImpl org.apache.http.ConnectionReuseStrategy org.apache.http.FormattedHeader org.apache.http.Header @@ -2859,7 +3671,6 @@ org.apache.http.conn.ssl.BrowserCompatHostnameVerifier org.apache.http.conn.ssl.SSLSocketFactory org.apache.http.conn.ssl.StrictHostnameVerifier org.apache.http.conn.ssl.X509HostnameVerifier -org.apache.http.conn.util.InetAddressUtils org.apache.http.cookie.CookieSpecFactory org.apache.http.cookie.CookieSpecRegistry org.apache.http.cookie.MalformedCookieException @@ -2870,9 +3681,7 @@ org.apache.http.entity.ContentLengthStrategy org.apache.http.entity.HttpEntityWrapper org.apache.http.impl.AbstractHttpClientConnection org.apache.http.impl.DefaultConnectionReuseStrategy -org.apache.http.impl.DefaultHttpClientConnection org.apache.http.impl.DefaultHttpResponseFactory -org.apache.http.impl.DefaultHttpServerConnection org.apache.http.impl.EnglishReasonPhraseCatalog org.apache.http.impl.HttpConnectionMetricsImpl org.apache.http.impl.SocketHttpClientConnection @@ -2903,7 +3712,6 @@ org.apache.http.impl.conn.DefaultResponseParser org.apache.http.impl.conn.IdleConnectionHandler org.apache.http.impl.conn.IdleConnectionHandler$TimeValues org.apache.http.impl.conn.ProxySelectorRoutePlanner -org.apache.http.impl.conn.ProxySelectorRoutePlanner$1 org.apache.http.impl.conn.tsccm.AbstractConnPool org.apache.http.impl.conn.tsccm.BasicPoolEntry org.apache.http.impl.conn.tsccm.BasicPoolEntryRef @@ -2932,7 +3740,6 @@ org.apache.http.impl.io.AbstractMessageWriter org.apache.http.impl.io.AbstractSessionInputBuffer org.apache.http.impl.io.AbstractSessionOutputBuffer org.apache.http.impl.io.ChunkedInputStream -org.apache.http.impl.io.ContentLengthInputStream org.apache.http.impl.io.ContentLengthOutputStream org.apache.http.impl.io.HttpRequestWriter org.apache.http.impl.io.HttpTransportMetricsImpl @@ -2984,8 +3791,18 @@ org.apache.http.protocol.RequestUserAgent org.apache.http.util.ByteArrayBuffer org.apache.http.util.CharArrayBuffer org.apache.http.util.LangUtils +org.ccil.cowan.tagsoup.AttributesImpl +org.ccil.cowan.tagsoup.AutoDetector +org.ccil.cowan.tagsoup.Element +org.ccil.cowan.tagsoup.ElementType +org.ccil.cowan.tagsoup.HTMLModels org.ccil.cowan.tagsoup.HTMLScanner +org.ccil.cowan.tagsoup.HTMLSchema org.ccil.cowan.tagsoup.Parser +org.ccil.cowan.tagsoup.Parser$1 +org.ccil.cowan.tagsoup.ScanHandler +org.ccil.cowan.tagsoup.Scanner +org.ccil.cowan.tagsoup.Schema org.json.JSON org.json.JSONArray org.json.JSONException @@ -3007,7 +3824,9 @@ org.xml.sax.SAXException org.xml.sax.SAXNotRecognizedException org.xml.sax.SAXNotSupportedException org.xml.sax.XMLReader +org.xml.sax.ext.LexicalHandler org.xml.sax.helpers.DefaultHandler org.xmlpull.v1.XmlPullParser org.xmlpull.v1.XmlPullParserException org.xmlpull.v1.XmlSerializer +sun.misc.Unsafe diff --git a/rs/java/android/renderscript/ScriptGroup.java b/rs/java/android/renderscript/ScriptGroup.java index 82d9a2f4403f..9000d4d9c50c 100644 --- a/rs/java/android/renderscript/ScriptGroup.java +++ b/rs/java/android/renderscript/ScriptGroup.java @@ -851,13 +851,13 @@ public final class ScriptGroup extends BaseObj { * Returns the field ID */ - public Script.FieldID getField() { return mField; } + Script.FieldID getField() { return mField; } /** * Returns the value */ - public Object getValue() { return mValue; } + Object getValue() { return mValue; } } /** diff --git a/rs/java/android/renderscript/ScriptIntrinsicBLAS.java b/rs/java/android/renderscript/ScriptIntrinsicBLAS.java index f7e81b01cf64..aa72fba6cd69 100644 --- a/rs/java/android/renderscript/ScriptIntrinsicBLAS.java +++ b/rs/java/android/renderscript/ScriptIntrinsicBLAS.java @@ -22,7 +22,12 @@ import java.lang.annotation.RetentionPolicy; /** * - * BLAS + * ScriptIntrinsicBLAS class provides high performance RenderScript APIs to BLAS. + * + * The BLAS (Basic Linear Algebra Subprograms) are routines that provide standard + * building blocks for performing basic vector and matrix operations. + * + * For detailed description of BLAS, please refer to http://www.netlib.org/blas/ * **/ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { @@ -179,24 +184,40 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { private static final int RsBlas_bnnm = 1000; /** + * Create an intrinsic to access BLAS subroutines. + * + * @param rs The RenderScript context + * @return ScriptIntrinsicBLAS */ public static ScriptIntrinsicBLAS create(RenderScript rs) { long id = rs.nScriptIntrinsicCreate(13, Element.U32(rs).getID(rs)); return new ScriptIntrinsicBLAS(id, rs); } + /** + * @hide + */ @IntDef({NO_TRANSPOSE, TRANSPOSE, CONJ_TRANSPOSE}) @Retention(RetentionPolicy.SOURCE) public @interface Transpose {} + /** + * @hide + */ @IntDef({UPPER, LOWER}) @Retention(RetentionPolicy.SOURCE) public @interface Uplo {} + /** + * @hide + */ @IntDef({NON_UNIT, UNIT}) @Retention(RetentionPolicy.SOURCE) public @interface Diag {} + /** + * @hide + */ @IntDef({LEFT, RIGHT}) @Retention(RetentionPolicy.SOURCE) public @interface Side {} @@ -280,24 +301,88 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { throw new RSRuntimeException("Incorrect vector dimensions for GEMV"); } } + + /** + * SGEMV performs one of the matrix-vector operations + * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/db/d58/sgemv_8f.html + * + * @param TransA The type of transpose applied to matrix A. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void SGEMV(@Transpose int TransA, float alpha, Allocation A, Allocation X, int incX, float beta, Allocation Y, int incY) { validateGEMV(Element.F32(mRS), TransA, A, X, incX, Y, incY); int M = A.getType().getY(); int N = A.getType().getX(); mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_sgemv, TransA, 0, 0, 0, 0, M, N, 0, alpha, A.getID(mRS), X.getID(mRS), beta, Y.getID(mRS), incX, incY, 0, 0); } + + /** + * DGEMV performs one of the matrix-vector operations + * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/dc/da8/dgemv_8f.html + * + * @param TransA The type of transpose applied to matrix A. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void DGEMV(@Transpose int TransA, double alpha, Allocation A, Allocation X, int incX, double beta, Allocation Y, int incY) { validateGEMV(Element.F64(mRS), TransA, A, X, incX, Y, incY); int M = A.getType().getY(); int N = A.getType().getX(); mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dgemv, TransA, 0, 0, 0, 0, M, N, 0, alpha, A.getID(mRS), X.getID(mRS), beta, Y.getID(mRS), incX, incY, 0, 0); } + + /** + * CGEMV performs one of the matrix-vector operations + * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y or y := alpha*A**H*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/d4/d8a/cgemv_8f.html + * + * @param TransA The type of transpose applied to matrix A. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void CGEMV(@Transpose int TransA, Float2 alpha, Allocation A, Allocation X, int incX, Float2 beta, Allocation Y, int incY) { validateGEMV(Element.F32_2(mRS), TransA, A, X, incX, Y, incY); int M = A.getType().getY(); int N = A.getType().getX(); mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cgemv, TransA, 0, 0, 0, 0, M, N, 0, alpha.x, alpha.y, A.getID(mRS), X.getID(mRS), beta.x, beta.y, Y.getID(mRS), incX, incY, 0, 0); } + + /** + * ZGEMV performs one of the matrix-vector operations + * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y or y := alpha*A**H*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/db/d40/zgemv_8f.html + * + * @param TransA The type of transpose applied to matrix A. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void ZGEMV(@Transpose int TransA, Double2 alpha, Allocation A, Allocation X, int incX, Double2 beta, Allocation Y, int incY) { validateGEMV(Element.F64_2(mRS), TransA, A, X, incX, Y, incY); int M = A.getType().getY(); @@ -305,6 +390,30 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zgemv, TransA, 0, 0, 0, 0, M, N, 0, alpha.x, alpha.y, A.getID(mRS), X.getID(mRS), beta.x, beta.y, Y.getID(mRS), incX, incY, 0, 0); } + /** + * SGBMV performs one of the matrix-vector operations + * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/d6/d46/sgbmv_8f.html + * + * Note: For a M*N matrix, the input Allocation should also be of size M*N (dimY = M, dimX = N), + * but only the region M*(KL+KU+1) will be referenced. The following subroutine can is an + * example showing how to convert the original matrix 'a' to row-based band matrix 'b'. + * for i in range(0, m): + * for j in range(max(0, i-kl), min(i+ku+1, n)): + * b[i, j-i+kl] = a[i, j] + * + * @param TransA The type of transpose applied to matrix A. + * @param KL The number of sub-diagonals of the matrix A. + * @param KU The number of super-diagonals of the matrix A. + * @param alpha The scalar alpha. + * @param A The input allocation contains the band matrix A, supported elements type {@link Element#F32}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void SGBMV(@Transpose int TransA, int KL, int KU, float alpha, Allocation A, Allocation X, int incX, float beta, Allocation Y, int incY) { // GBMV has the same validation requirements as GEMV + KL and KU >= 0 validateGEMV(Element.F32(mRS), TransA, A, X, incX, Y, incY); @@ -315,6 +424,31 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { int N = A.getType().getX(); mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_sgbmv, TransA, 0, 0, 0, 0, M, N, 0, alpha, A.getID(mRS), X.getID(mRS), beta, Y.getID(mRS), incX, incY, KL, KU); } + + /** + * DGBMV performs one of the matrix-vector operations + * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/d2/d3f/dgbmv_8f.html + * + * Note: For a M*N matrix, the input Allocation should also be of size M*N (dimY = M, dimX = N), + * but only the region M*(KL+KU+1) will be referenced. The following subroutine can is an + * example showing how to convert the original matrix 'a' to row-based band matrix 'b'. + * for i in range(0, m): + * for j in range(max(0, i-kl), min(i+ku+1, n)): + * b[i, j-i+kl] = a[i, j] + * + * @param TransA The type of transpose applied to matrix A. + * @param KL The number of sub-diagonals of the matrix A. + * @param KU The number of super-diagonals of the matrix A. + * @param alpha The scalar alpha. + * @param A The input allocation contains the band matrix A, supported elements type {@link Element#F64}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void DGBMV(@Transpose int TransA, int KL, int KU, double alpha, Allocation A, Allocation X, int incX, double beta, Allocation Y, int incY) { // GBMV has the same validation requirements as GEMV + KL and KU >= 0 validateGEMV(Element.F64(mRS), TransA, A, X, incX, Y, incY); @@ -325,6 +459,31 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { int N = A.getType().getX(); mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dgbmv, TransA, 0, 0, 0, 0, M, N, 0, alpha, A.getID(mRS), X.getID(mRS), beta, Y.getID(mRS), incX, incY, KL, KU); } + + /** + * CGBMV performs one of the matrix-vector operations + * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y or y := alpha*A**H*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/d0/d75/cgbmv_8f.html + * + * Note: For a M*N matrix, the input Allocation should also be of size M*N (dimY = M, dimX = N), + * but only the region M*(KL+KU+1) will be referenced. The following subroutine can is an + * example showing how to convert the original matrix 'a' to row-based band matrix 'b'. + * for i in range(0, m): + * for j in range(max(0, i-kl), min(i+ku+1, n)): + * b[i, j-i+kl] = a[i, j] + * + * @param TransA The type of transpose applied to matrix A. + * @param KL The number of sub-diagonals of the matrix A. + * @param KU The number of super-diagonals of the matrix A. + * @param alpha The scalar alpha. + * @param A The input allocation contains the band matrix A, supported elements type {@link Element#F32_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void CGBMV(@Transpose int TransA, int KL, int KU, Float2 alpha, Allocation A, Allocation X, int incX, Float2 beta, Allocation Y, int incY) { // GBMV has the same validation requirements as GEMV + KL and KU >= 0 validateGEMV(Element.F32_2(mRS), TransA, A, X, incX, Y, incY); @@ -335,6 +494,31 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { int N = A.getType().getX(); mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cgbmv, TransA, 0, 0, 0, 0, M, N, 0, alpha.x, alpha.y, A.getID(mRS), X.getID(mRS), beta.x, beta.y, Y.getID(mRS), incX, incY, KL, KU); } + + /** + * ZGBMV performs one of the matrix-vector operations + * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y or y := alpha*A**H*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/d9/d46/zgbmv_8f.html + * + * Note: For a M*N matrix, the input Allocation should also be of size M*N (dimY = M, dimX = N), + * but only the region M*(KL+KU+1) will be referenced. The following subroutine can is an + * example showing how to convert the original matrix 'a' to row-based band matrix 'b'. + * for i in range(0, m): + * for j in range(max(0, i-kl), min(i+ku+1, n)): + * b[i, j-i+kl] = a[i, j] + * + * @param TransA The type of transpose applied to matrix A. + * @param KL The number of sub-diagonals of the matrix A. + * @param KU The number of super-diagonals of the matrix A. + * @param alpha The scalar alpha. + * @param A The input allocation contains the band matrix A, supported elements type {@link Element#F64_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void ZGBMV(@Transpose int TransA, int KL, int KU, Double2 alpha, Allocation A, Allocation X, int incX, Double2 beta, Allocation Y, int incY) { // GBMV has the same validation requirements as GEMV + KL and KU >= 0 validateGEMV(Element.F64_2(mRS), TransA, A, X, incX, Y, incY); @@ -403,27 +587,103 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { return N; } + /** + * STRMV performs one of the matrix-vector operations + * x := A*x or x := A**T*x + * + * Details: http://www.netlib.org/lapack/explore-html/de/d45/strmv_8f.html + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void STRMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) { validateTRMV(Element.F32(mRS), Uplo, TransA, Diag, A, X, incX); int N = A.getType().getY(); mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_strmv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, A.getID(mRS), X.getID(mRS), 0, 0, incX, 0, 0, 0); } + + /** + * DTRMV performs one of the matrix-vector operations + * x := A*x or x := A**T*x + * + * Details: http://www.netlib.org/lapack/explore-html/dc/d7e/dtrmv_8f.html + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void DTRMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) { validateTRMV(Element.F64(mRS), Uplo, TransA, Diag, A, X, incX); int N = A.getType().getY(); mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dtrmv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, A.getID(mRS), X.getID(mRS), 0, 0, incX, 0, 0, 0); } + + /** + * CTRMV performs one of the matrix-vector operations + * x := A*x or x := A**T*x or x := A**H*x + * + * Details: http://www.netlib.org/lapack/explore-html/df/d78/ctrmv_8f.html + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void CTRMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) { validateTRMV(Element.F32_2(mRS), Uplo, TransA, Diag, A, X, incX); int N = A.getType().getY(); mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_ctrmv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, 0, A.getID(mRS), X.getID(mRS), 0, 0, 0, incX, 0, 0, 0); } + + /** + * ZTRMV performs one of the matrix-vector operations + * x := A*x or x := A**T*x or x := A**H*x + * + * Details: http://www.netlib.org/lapack/explore-html/d0/dd1/ztrmv_8f.html + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void ZTRMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) { validateTRMV(Element.F64_2(mRS), Uplo, TransA, Diag, A, X, incX); int N = A.getType().getY(); mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_ztrmv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, 0, A.getID(mRS), X.getID(mRS), 0, 0, 0, incX, 0, 0, 0); } + /** + * STBMV performs one of the matrix-vector operations + * x := A*x or x := A**T*x + * + * Details: http://www.netlib.org/lapack/explore-html/d6/d7d/stbmv_8f.html + * + * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), + * but only the region N*(K+1) will be referenced. The following subroutine can is an + * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. + * for i in range(0, n): + * for j in range(i, min(i+k+1, n)): + * b[i, j-i] = a[i, j] + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param K The number of off-diagonals of the matrix A + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void STBMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, int K, Allocation A, Allocation X, int incX) { // TBMV has the same requirements as TRMV + K >= 0 if (K < 0) { @@ -433,6 +693,28 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { int N = A.getType().getY(); mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_stbmv, TransA, 0, 0, Uplo, Diag, 0, N, K, 0, A.getID(mRS), X.getID(mRS), 0, 0, incX, 0, 0, 0); } + + /** + * DTBMV performs one of the matrix-vector operations + * x := A*x or x := A**T*x + * + * Details: http://www.netlib.org/lapack/explore-html/df/d29/dtbmv_8f.html + * + * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), + * but only the region N*(K+1) will be referenced. The following subroutine can is an + * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. + * for i in range(0, n): + * for j in range(i, min(i+k+1, n)): + * b[i, j-i] = a[i, j] + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param K The number of off-diagonals of the matrix A + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void DTBMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, int K, Allocation A, Allocation X, int incX) { // TBMV has the same requirements as TRMV + K >= 0 if (K < 0) { @@ -442,6 +724,28 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { int N = A.getType().getY(); mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dtbmv, TransA, 0, 0, Uplo, Diag, 0, N, K, 0, A.getID(mRS), X.getID(mRS), 0, 0, incX, 0, 0, 0); } + + /** + * CTBMV performs one of the matrix-vector operations + * x := A*x or x := A**T*x or x := A**H*x + * + * Details: http://www.netlib.org/lapack/explore-html/d3/dcd/ctbmv_8f.html + * + * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), + * but only the region N*(K+1) will be referenced. The following subroutine can is an + * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. + * for i in range(0, n): + * for j in range(i, min(i+k+1, n)): + * b[i, j-i] = a[i, j] + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param K The number of off-diagonals of the matrix A + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void CTBMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, int K, Allocation A, Allocation X, int incX) { // TBMV has the same requirements as TRMV + K >= 0 if (K < 0) { @@ -451,6 +755,28 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { int N = A.getType().getY(); mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_ctbmv, TransA, 0, 0, Uplo, Diag, 0, N, K, 0, 0, A.getID(mRS), X.getID(mRS), 0, 0, 0, incX, 0, 0, 0); } + + /** + * ZTBMV performs one of the matrix-vector operations + * x := A*x or x := A**T*x or x := A**H*x + * + * Details: http://www.netlib.org/lapack/explore-html/d3/d39/ztbmv_8f.html + * + * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), + * but only the region N*(K+1) will be referenced. The following subroutine can is an + * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. + * for i in range(0, n): + * for j in range(i, min(i+k+1, n)): + * b[i, j-i] = a[i, j] + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param K The number of off-diagonals of the matrix A + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void ZTBMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, int K, Allocation A, Allocation X, int incX) { // TBMV has the same requirements as TRMV + K >= 0 if (K < 0) { @@ -460,22 +786,124 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { int N = A.getType().getY(); mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_ztbmv, TransA, 0, 0, Uplo, Diag, 0, N, K, 0, 0, A.getID(mRS), X.getID(mRS), 0, 0, 0, incX, 0, 0, 0); } + + /** + * STPMV performs one of the matrix-vector operations + * x := A*x or x := A**T*x + * + * Details: http://www.netlib.org/lapack/explore-html/db/db1/stpmv_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param Ap The input allocation contains packed matrix A, supported elements type {@link Element#F32}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void STPMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) { int N = validateTPMV(Element.F32(mRS), Uplo, TransA, Diag, Ap, X, incX); mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_stpmv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, Ap.getID(mRS), X.getID(mRS), 0, 0, incX, 0, 0, 0); } + + /** + * DTPMV performs one of the matrix-vector operations + * x := A*x or x := A**T*x + * + * Details: http://www.netlib.org/lapack/explore-html/dc/dcd/dtpmv_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param Ap The input allocation contains packed matrix A, supported elements type {@link Element#F64}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void DTPMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) { int N = validateTPMV(Element.F64(mRS), Uplo, TransA, Diag, Ap, X, incX); mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dtpmv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, Ap.getID(mRS), X.getID(mRS), 0, 0, incX, 0, 0, 0); } + + /** + * CTPMV performs one of the matrix-vector operations + * x := A*x or x := A**T*x or x := A**H*x + * + * Details: http://www.netlib.org/lapack/explore-html/d4/dbb/ctpmv_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param Ap The input allocation contains packed matrix A, supported elements type {@link Element#F32_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void CTPMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) { int N = validateTPMV(Element.F32_2(mRS), Uplo, TransA, Diag, Ap, X, incX); mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_ctpmv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, 0, Ap.getID(mRS), X.getID(mRS), 0, 0, 0, incX, 0, 0, 0); } + + /** + * ZTPMV performs one of the matrix-vector operations + * x := A*x or x := A**T*x or x := A**H*x + * + * Details: http://www.netlib.org/lapack/explore-html/d2/d9e/ztpmv_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param Ap The input allocation contains packed matrix A, supported elements type {@link Element#F64_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void ZTPMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) { int N = validateTPMV(Element.F64_2(mRS), Uplo, TransA, Diag, Ap, X, incX); mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_ztpmv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, 0, Ap.getID(mRS), X.getID(mRS), 0, 0, 0, incX, 0, 0, 0); } + + /** + * STRSV solves one of the systems of equations + * A*x = b or A**T*x = b + * + * Details: http://www.netlib.org/lapack/explore-html/d0/d2a/strsv_8f.html + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void STRSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) { // TRSV is the same as TRMV validateTRMV(Element.F32(mRS), Uplo, TransA, Diag, A, X, incX); @@ -483,6 +911,20 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_strsv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, A.getID(mRS), X.getID(mRS), 0, 0, incX, 0, 0, 0); } + + /** + * DTRSV solves one of the systems of equations + * A*x = b or A**T*x = b + * + * Details: http://www.netlib.org/lapack/explore-html/d6/d96/dtrsv_8f.html + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void DTRSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) { // TRSV is the same as TRMV validateTRMV(Element.F64(mRS), Uplo, TransA, Diag, A, X, incX); @@ -490,6 +932,20 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dtrsv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, A.getID(mRS), X.getID(mRS), 0, 0, incX, 0, 0, 0); } + + /** + * CTRSV solves one of the systems of equations + * A*x = b or A**T*x = b or A**H*x = b + * + * Details: http://www.netlib.org/lapack/explore-html/d4/dc8/ctrsv_8f.html + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void CTRSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) { // TRSV is the same as TRMV validateTRMV(Element.F32_2(mRS), Uplo, TransA, Diag, A, X, incX); @@ -497,6 +953,20 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_ctrsv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, 0, A.getID(mRS), X.getID(mRS), 0, 0, 0, incX, 0, 0, 0); } + + /** + * ZTRSV solves one of the systems of equations + * A*x = b or A**T*x = b or A**H*x = b + * + * Details: http://www.netlib.org/lapack/explore-html/d1/d2f/ztrsv_8f.html + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void ZTRSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) { // TRSV is the same as TRMV validateTRMV(Element.F64_2(mRS), Uplo, TransA, Diag, A, X, incX); @@ -504,6 +974,28 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_ztrsv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, 0, A.getID(mRS), X.getID(mRS), 0, 0, 0, incX, 0, 0, 0); } + + /** + * STBSV solves one of the systems of equations + * A*x = b or A**T*x = b + * + * Details: http://www.netlib.org/lapack/explore-html/d0/d1f/stbsv_8f.html + * + * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), + * but only the region N*(K+1) will be referenced. The following subroutine can is an + * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. + * for i in range(0, n): + * for j in range(i, min(i+k+1, n)): + * b[i, j-i] = a[i, j] + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param K The number of off-diagonals of the matrix A + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void STBSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, int K, Allocation A, Allocation X, int incX) { // TBSV is the same as TRMV + K >= 0 validateTRMV(Element.F32(mRS), Uplo, TransA, Diag, A, X, incX); @@ -513,6 +1005,28 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { } mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_stbsv, TransA, 0, 0, Uplo, Diag, 0, N, K, 0, A.getID(mRS), X.getID(mRS), 0, 0, incX, 0, 0, 0); } + + /** + * DTBSV solves one of the systems of equations + * A*x = b or A**T*x = b + * + * Details: http://www.netlib.org/lapack/explore-html/d4/dcf/dtbsv_8f.html + * + * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), + * but only the region N*(K+1) will be referenced. The following subroutine can is an + * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. + * for i in range(0, n): + * for j in range(i, min(i+k+1, n)): + * b[i, j-i] = a[i, j] + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param K The number of off-diagonals of the matrix A + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void DTBSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, int K, Allocation A, Allocation X, int incX) { // TBSV is the same as TRMV + K >= 0 validateTRMV(Element.F64(mRS), Uplo, TransA, Diag, A, X, incX); @@ -522,6 +1036,28 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { } mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dtbsv, TransA, 0, 0, Uplo, Diag, 0, N, K, 0, A.getID(mRS), X.getID(mRS), 0, 0, incX, 0, 0, 0); } + + /** + * CTBSV solves one of the systems of equations + * A*x = b or A**T*x = b or A**H*x = b + * + * Details: http://www.netlib.org/lapack/explore-html/d9/d5f/ctbsv_8f.html + * + * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), + * but only the region N*(K+1) will be referenced. The following subroutine can is an + * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. + * for i in range(0, n): + * for j in range(i, min(i+k+1, n)): + * b[i, j-i] = a[i, j] + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param K The number of off-diagonals of the matrix A + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void CTBSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, int K, Allocation A, Allocation X, int incX) { // TBSV is the same as TRMV + K >= 0 validateTRMV(Element.F32_2(mRS), Uplo, TransA, Diag, A, X, incX); @@ -531,6 +1067,28 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { } mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_ctbsv, TransA, 0, 0, Uplo, Diag, 0, N, K, 0, 0, A.getID(mRS), X.getID(mRS), 0, 0, 0, incX, 0, 0, 0); } + + /** + * ZTBSV solves one of the systems of equations + * A*x = b or A**T*x = b or A**H*x = b + * + * Details: http://www.netlib.org/lapack/explore-html/d4/d5a/ztbsv_8f.html + * + * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), + * but only the region N*(K+1) will be referenced. The following subroutine can is an + * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. + * for i in range(0, n): + * for j in range(i, min(i+k+1, n)): + * b[i, j-i] = a[i, j] + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param K The number of off-diagonals of the matrix A + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void ZTBSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, int K, Allocation A, Allocation X, int incX) { // TBSV is the same as TRMV + K >= 0 validateTRMV(Element.F64_2(mRS), Uplo, TransA, Diag, A, X, incX); @@ -540,21 +1098,109 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { } mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_ztbsv, TransA, 0, 0, Uplo, Diag, 0, N, K, 0, 0, A.getID(mRS), X.getID(mRS), 0, 0, 0, incX, 0, 0, 0); } + + /** + * STPSV solves one of the systems of equations + * A*x = b or A**T*x = b + * + * Details: http://www.netlib.org/lapack/explore-html/d0/d7c/stpsv_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param Ap The input allocation contains packed matrix A, supported elements type {@link Element#F32}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void STPSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) { // TPSV is same as TPMV int N = validateTPMV(Element.F32(mRS), Uplo, TransA, Diag, Ap, X, incX); mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_stpsv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, Ap.getID(mRS), X.getID(mRS), 0, 0, incX, 0, 0, 0); } + + /** + * DTPSV solves one of the systems of equations + * A*x = b or A**T*x = b + * + * Details: http://www.netlib.org/lapack/explore-html/d9/d84/dtpsv_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param Ap The input allocation contains packed matrix A, supported elements type {@link Element#F64}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void DTPSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) { // TPSV is same as TPMV int N = validateTPMV(Element.F64(mRS), Uplo, TransA, Diag, Ap, X, incX); mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dtpsv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, Ap.getID(mRS), X.getID(mRS), 0, 0, incX, 0, 0, 0); } + + /** + * CTPSV solves one of the systems of equations + * A*x = b or A**T*x = b or A**H*x = b + * + * Details: http://www.netlib.org/lapack/explore-html/d8/d56/ctpsv_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param Ap The input allocation contains packed matrix A, supported elements type {@link Element#F32_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void CTPSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) { // TPSV is same as TPMV int N = validateTPMV(Element.F32_2(mRS), Uplo, TransA, Diag, Ap, X, incX); mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_ctpsv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, 0, Ap.getID(mRS), X.getID(mRS), 0, 0, 0, incX, 0, 0, 0); } + + /** + * ZTPSV solves one of the systems of equations + * A*x = b or A**T*x = b or A**H*x = b + * + * Details: http://www.netlib.org/lapack/explore-html/da/d57/ztpsv_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param Ap The input allocation contains packed matrix A, supported elements type {@link Element#F64_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + */ public void ZTPSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) { // TPSV is same as TPMV int N = validateTPMV(Element.F64_2(mRS), Uplo, TransA, Diag, Ap, X, incX); @@ -768,10 +1414,49 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { return N; } + /** + * SSYMV performs the matrix-vector operation + * y := alpha*A*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/d2/d94/ssymv_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void SSYMV(@Uplo int Uplo, float alpha, Allocation A, Allocation X, int incX, float beta, Allocation Y, int incY) { int N = validateSYMV(Element.F32(mRS), Uplo, A, X, Y, incX, incY); mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_ssymv, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, A.getID(mRS), X.getID(mRS), beta, Y.getID(mRS), incX, incY, 0, 0); } + + /** + * SSBMV performs the matrix-vector operation + * y := alpha*A*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/d3/da1/ssbmv_8f.html + * + * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), + * but only the region N*(K+1) will be referenced. The following subroutine can is an + * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. + * for i in range(0, n): + * for j in range(i, min(i+k+1, n)): + * b[i, j-i] = a[i, j] + * + * @param Uplo Specifies whether the upper or lower triangular part of the band matrix A is being supplied. + * @param K The number of off-diagonals of the matrix A + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void SSBMV(@Uplo int Uplo, int K, float alpha, Allocation A, Allocation X, int incX, float beta, Allocation Y, int incY) { // SBMV is the same as SYMV + K >= 0 if (K < 0) { @@ -780,36 +1465,186 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { int N = validateSYMV(Element.F32(mRS), Uplo, A, X, Y, incX, incY); mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_ssbmv, 0, 0, 0, Uplo, 0, 0, N, K, alpha, A.getID(mRS), X.getID(mRS), beta, Y.getID(mRS), incX, incY, 0, 0); } + + /** + * SSPMV performs the matrix-vector operation + * y := alpha*A*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/d8/d68/sspmv_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the upper or lower triangular part of the matrix A is supplied in packed form. + * @param alpha The scalar alpha. + * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F32}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void SSPMV(@Uplo int Uplo, float alpha, Allocation Ap, Allocation X, int incX, float beta, Allocation Y, int incY) { int N = validateSPMV(Element.F32(mRS), Uplo, Ap, X, incX, Y, incY); mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_sspmv, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, Ap.getID(mRS), X.getID(mRS), beta, Y.getID(mRS), incX, incY, 0, 0); } + + /** + * SGER performs the rank 1 operation + * A := alpha*x*y**T + A + * + * Details: http://www.netlib.org/lapack/explore-html/db/d5c/sger_8f.html + * + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32}. + * @param incY The increment for the elements of vector y, must be larger than zero. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}. + */ public void SGER(float alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) { int M = A.getType().getY(); int N = A.getType().getX(); validateGER(Element.F32(mRS), X, incX, Y, incY, A); mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_sger, 0, 0, 0, 0, 0, M, N, 0, alpha, X.getID(mRS), Y.getID(mRS), 0.f, A.getID(mRS), incX, incY, 0, 0); } + + /** + * SSYR performs the rank 1 operation + * A := alpha*x*x**T + A + * + * Details: http://www.netlib.org/lapack/explore-html/d6/dac/ssyr_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}. + */ public void SSYR(@Uplo int Uplo, float alpha, Allocation X, int incX, Allocation A) { int N = validateSYR(Element.F32(mRS), Uplo, X, incX, A); mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_ssyr, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, X.getID(mRS), A.getID(mRS), 0.f, 0, incX, 0, 0, 0); } + + /** + * SSPR performs the rank 1 operation + * A := alpha*x*x**T + A + * + * Details: http://www.netlib.org/lapack/explore-html/d2/d9b/sspr_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form. + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F32}. + */ public void SSPR(@Uplo int Uplo, float alpha, Allocation X, int incX, Allocation Ap) { int N = validateSPR(Element.F32(mRS), Uplo, X, incX, Ap); mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_sspr, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, X.getID(mRS), Ap.getID(mRS), 0.f, 0, incX, 0, 0, 0); } + + /** + * SSYR2 performs the symmetric rank 2 operation + * A := alpha*x*y**T + alpha*y*x**T + A + * + * Details: http://www.netlib.org/lapack/explore-html/db/d99/ssyr2_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32}. + * @param incY The increment for the elements of vector y, must be larger than zero. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}. + */ public void SSYR2(@Uplo int Uplo, float alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) { int N = validateSYR2(Element.F32(mRS), Uplo, X, incX, Y, incY, A); mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_ssyr2, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, X.getID(mRS), Y.getID(mRS), 0, A.getID(mRS), incX, incY, 0, 0); } + + /** + * SSPR2 performs the symmetric rank 2 operation + * A := alpha*x*y**T + alpha*y*x**T + A + * + * Details: http://www.netlib.org/lapack/explore-html/db/d3e/sspr2_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form. + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32}. + * @param incY The increment for the elements of vector y, must be larger than zero. + * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F32}. + */ public void SSPR2(@Uplo int Uplo, float alpha, Allocation X, int incX, Allocation Y, int incY, Allocation Ap) { int N = validateSPR2(Element.F32(mRS), Uplo, X, incX, Y, incY, Ap); mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_sspr2, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, X.getID(mRS), Y.getID(mRS), 0, Ap.getID(mRS), incX, incY, 0, 0); } + + /** + * DSYMV performs the matrix-vector operation + * y := alpha*A*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/d8/dbe/dsymv_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void DSYMV(@Uplo int Uplo, double alpha, Allocation A, Allocation X, int incX, double beta, Allocation Y, int incY) { int N = validateSYMV(Element.F64(mRS), Uplo, A, X, Y, incX, incY); mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dsymv, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, A.getID(mRS), X.getID(mRS), beta, Y.getID(mRS), incX, incY, 0, 0); } + + /** + * DSBMV performs the matrix-vector operation + * y := alpha*A*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/d8/d1e/dsbmv_8f.html + * + * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), + * but only the region N*(K+1) will be referenced. The following subroutine can is an + * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. + * for i in range(0, n): + * for j in range(i, min(i+k+1, n)): + * b[i, j-i] = a[i, j] + * + * @param Uplo Specifies whether the upper or lower triangular part of the band matrix A is being supplied. + * @param K The number of off-diagonals of the matrix A + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void DSBMV(@Uplo int Uplo, int K, double alpha, Allocation A, Allocation X, int incX, double beta, Allocation Y, int incY) { // SBMV is the same as SYMV + K >= 0 if (K < 0) { @@ -818,28 +1653,138 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { int N = validateSYMV(Element.F64(mRS), Uplo, A, X, Y, incX, incY); mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dsbmv, 0, 0, 0, Uplo, 0, 0, N, K, alpha, A.getID(mRS), X.getID(mRS), beta, Y.getID(mRS), incX, incY, 0, 0); } + + /** + * DSPMV performs the matrix-vector operation + * y := alpha*A*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/d4/d85/dspmv_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the upper or lower triangular part of the matrix A is supplied in packed form. + * @param alpha The scalar alpha. + * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F64}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void DSPMV(@Uplo int Uplo, double alpha, Allocation Ap, Allocation X, int incX, double beta, Allocation Y, int incY) { int N = validateSPMV(Element.F64(mRS), Uplo, Ap, X, incX, Y, incY); mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dspmv, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, Ap.getID(mRS), X.getID(mRS), beta, Y.getID(mRS), incX, incY, 0, 0); } + + /** + * DGER performs the rank 1 operation + * A := alpha*x*y**T + A + * + * Details: http://www.netlib.org/lapack/explore-html/dc/da8/dger_8f.html + * + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64}. + * @param incY The increment for the elements of vector y, must be larger than zero. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}. + */ public void DGER(double alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) { int M = A.getType().getY(); int N = A.getType().getX(); validateGER(Element.F64(mRS), X, incX, Y, incY, A); mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dger, 0, 0, 0, 0, 0, M, N, 0, alpha, X.getID(mRS), Y.getID(mRS), 0.f, A.getID(mRS), incX, incY, 0, 0); } + + /** + * DSYR performs the rank 1 operation + * A := alpha*x*x**T + A + * + * Details: http://www.netlib.org/lapack/explore-html/d3/d60/dsyr_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}. + */ public void DSYR(@Uplo int Uplo, double alpha, Allocation X, int incX, Allocation A) { int N = validateSYR(Element.F64(mRS), Uplo, X, incX, A); mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dsyr, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, X.getID(mRS), A.getID(mRS), 0.f, 0, incX, 0, 0, 0); } + + /** + * DSPR performs the rank 1 operation + * A := alpha*x*x**T + A + * + * Details: http://www.netlib.org/lapack/explore-html/dd/dba/dspr_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form. + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F64}. + */ public void DSPR(@Uplo int Uplo, double alpha, Allocation X, int incX, Allocation Ap) { int N = validateSPR(Element.F64(mRS), Uplo, X, incX, Ap); mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dspr, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, X.getID(mRS), Ap.getID(mRS), 0.f, 0, incX, 0, 0, 0); } + + /** + * DSYR2 performs the symmetric rank 2 operation + * A := alpha*x*y**T + alpha*y*x**T + A + * + * Details: http://www.netlib.org/lapack/explore-html/de/d41/dsyr2_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64}. + * @param incY The increment for the elements of vector y, must be larger than zero. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}. + */ public void DSYR2(@Uplo int Uplo, double alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) { int N = validateSYR2(Element.F64(mRS), Uplo, X, incX, Y, incY, A); mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dsyr2, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, X.getID(mRS), Y.getID(mRS), 0, A.getID(mRS), incX, incY, 0, 0); } + + /** + * DSPR2 performs the symmetric rank 2 operation + * A := alpha*x*y**T + alpha*y*x**T + A + * + * Details: http://www.netlib.org/lapack/explore-html/dd/d9e/dspr2_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form. + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64}. + * @param incY The increment for the elements of vector y, must be larger than zero. + * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F64}. + */ public void DSPR2(@Uplo int Uplo, double alpha, Allocation X, int incX, Allocation Y, int incY, Allocation Ap) { int N = validateSPR2(Element.F64(mRS), Uplo, X, incX, Y, incY, Ap); mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dspr2, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, X.getID(mRS), Y.getID(mRS), 0, Ap.getID(mRS), incX, incY, 0, 0); @@ -876,11 +1821,50 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { } + /** + * CHEMV performs the matrix-vector operation + * y := alpha*A*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/d7/d51/chemv_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void CHEMV(@Uplo int Uplo, Float2 alpha, Allocation A, Allocation X, int incX, Float2 beta, Allocation Y, int incY) { // HEMV is the same as SYR2 validation-wise int N = validateSYR2(Element.F32_2(mRS), Uplo, X, incX, Y, incY, A); mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_chemv, 0, 0, 0, Uplo, 0, 0, N, 0, alpha.x, alpha.y, A.getID(mRS), X.getID(mRS), beta.x, beta.y, Y.getID(mRS), incX, incY, 0, 0); } + + /** + * CHBMV performs the matrix-vector operation + * y := alpha*A*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/db/dc2/chbmv_8f.html + * + * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), + * but only the region N*(K+1) will be referenced. The following subroutine can is an + * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. + * for i in range(0, n): + * for j in range(i, min(i+k+1, n)): + * b[i, j-i] = a[i, j] + * + * @param Uplo Specifies whether the upper or lower triangular part of the band matrix A is being supplied. + * @param K The number of off-diagonals of the matrix A + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void CHBMV(@Uplo int Uplo, int K, Float2 alpha, Allocation A, Allocation X, int incX, Float2 beta, Allocation Y, int incY) { // HBMV is the same as SYR2 validation-wise int N = validateSYR2(Element.F32_2(mRS), Uplo, X, incX, Y, incY, A); @@ -889,17 +1873,69 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { } mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_chbmv, 0, 0, 0, Uplo, 0, 0, N, K, alpha.x, alpha.y, A.getID(mRS), X.getID(mRS), beta.x, beta.y, Y.getID(mRS), incX, incY, 0, 0); } + + /** + * CHPMV performs the matrix-vector operation + * y := alpha*A*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/d2/d06/chpmv_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the upper or lower triangular part of the matrix A is supplied in packed form. + * @param alpha The scalar alpha. + * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void CHPMV(@Uplo int Uplo, Float2 alpha, Allocation Ap, Allocation X, int incX, Float2 beta, Allocation Y, int incY) { // HPMV is the same as SPR2 int N = validateSPR2(Element.F32_2(mRS), Uplo, X, incX, Y, incY, Ap); mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_chpmv, 0, 0, 0, Uplo, 0, 0, N, 0, alpha.x, alpha.y, Ap.getID(mRS), X.getID(mRS), beta.x, beta.y, Y.getID(mRS), incX, incY, 0, 0); } + + /** + * CGERU performs the rank 1 operation + * A := alpha*x*y**T + A + * + * Details: http://www.netlib.org/lapack/explore-html/db/d5f/cgeru_8f.html + * + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + */ public void CGERU(Float2 alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) { validateGERU(Element.F32_2(mRS), X, incX, Y, incY, A); int M = A.getType().getY(); int N = A.getType().getX(); mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cgeru, 0, 0, 0, 0, 0, M, N, 0, alpha.x, alpha.y, X.getID(mRS), Y.getID(mRS), 0, 0, A.getID(mRS), incX, incY, 0, 0); } + + /** + * CGERC performs the rank 1 operation + * A := alpha*x*y**H + A + * + * Details: http://www.netlib.org/lapack/explore-html/dd/d84/cgerc_8f.html + * + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + */ public void CGERC(Float2 alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) { // same as GERU validateGERU(Element.F32_2(mRS), X, incX, Y, incY, A); @@ -907,31 +1943,143 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { int N = A.getType().getX(); mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cgerc, 0, 0, 0, 0, 0, M, N, 0, alpha.x, alpha.y, X.getID(mRS), Y.getID(mRS), 0, 0, A.getID(mRS), incX, incY, 0, 0); } + + /** + * CHER performs the rank 1 operation + * A := alpha*x*x**H + A + * + * Details: http://www.netlib.org/lapack/explore-html/d3/d6d/cher_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + */ public void CHER(@Uplo int Uplo, float alpha, Allocation X, int incX, Allocation A) { // same as SYR int N = validateSYR(Element.F32_2(mRS), Uplo, X, incX, A); mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cher, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, 0, X.getID(mRS), 0, 0, 0, A.getID(mRS), incX, 0, 0, 0); } + + /** + * CHPR performs the rank 1 operation + * A := alpha*x*x**H + A + * + * Details: http://www.netlib.org/lapack/explore-html/db/dcd/chpr_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form. + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + */ public void CHPR(@Uplo int Uplo, float alpha, Allocation X, int incX, Allocation Ap) { // equivalent to SPR for validation int N = validateSPR(Element.F32_2(mRS), Uplo, X, incX, Ap); mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_chpr, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, 0, X.getID(mRS), 0, 0, 0, Ap.getID(mRS), incX, 0, 0, 0); } + + /** + * CHER2 performs the symmetric rank 2 operation + * A := alpha*x*y**H + alpha*y*x**H + A + * + * Details: http://www.netlib.org/lapack/explore-html/db/d87/cher2_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + */ public void CHER2(@Uplo int Uplo, Float2 alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) { // same as SYR2 int N = validateSYR2(Element.F32_2(mRS), Uplo, X, incX, Y, incY, A); mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cher2, 0, 0, 0, Uplo, 0, 0, N, 0, alpha.x, alpha.y, X.getID(mRS), Y.getID(mRS), 0, 0, A.getID(mRS), incX, incY, 0, 0); } + + /** + * CHPR2 performs the symmetric rank 2 operation + * A := alpha*x*y**H + alpha*y*x**H + A + * + * Details: http://www.netlib.org/lapack/explore-html/d6/d44/chpr2_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form. + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + */ public void CHPR2(@Uplo int Uplo, Float2 alpha, Allocation X, int incX, Allocation Y, int incY, Allocation Ap) { // same as SPR2 int N = validateSPR2(Element.F32_2(mRS), Uplo, X, incX, Y, incY, Ap); mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_chpr2, 0, 0, 0, Uplo, 0, 0, N, 0, alpha.x, alpha.y, X.getID(mRS), Y.getID(mRS), 0, 0, Ap.getID(mRS), incX, incY, 0, 0); } + + /** + * ZHEMV performs the matrix-vector operation + * y := alpha*A*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/d0/ddd/zhemv_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void ZHEMV(@Uplo int Uplo, Double2 alpha, Allocation A, Allocation X, int incX, Double2 beta, Allocation Y, int incY) { // HEMV is the same as SYR2 validation-wise int N = validateSYR2(Element.F64_2(mRS), Uplo, X, incX, Y, incY, A); mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zhemv, 0, 0, 0, Uplo, 0, 0, N, 0, alpha.x, alpha.y, A.getID(mRS), X.getID(mRS), beta.x, beta.y, Y.getID(mRS), incX, incY, 0, 0); } + + /** + * ZHBMV performs the matrix-vector operation + * y := alpha*A*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/d3/d1a/zhbmv_8f.html + * + * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), + * but only the region N*(K+1) will be referenced. The following subroutine can is an + * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. + * for i in range(0, n): + * for j in range(i, min(i+k+1, n)): + * b[i, j-i] = a[i, j] + * + * @param Uplo Specifies whether the upper or lower triangular part of the band matrix A is being supplied. + * @param K The number of off-diagonals of the matrix A + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void ZHBMV(@Uplo int Uplo, int K, Double2 alpha, Allocation A, Allocation X, int incX, Double2 beta, Allocation Y, int incY) { // HBMV is the same as SYR2 validation-wise int N = validateSYR2(Element.F64_2(mRS), Uplo, X, incX, Y, incY, A); @@ -940,17 +2088,69 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { } mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zhbmv, 0, 0, 0, Uplo, 0, 0, N, K, alpha.x, alpha.y, A.getID(mRS), X.getID(mRS), beta.x, beta.y, Y.getID(mRS), incX, incY, 0, 0); } + + /** + * ZHPMV performs the matrix-vector operation + * y := alpha*A*x + beta*y + * + * Details: http://www.netlib.org/lapack/explore-html/d0/d60/zhpmv_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the upper or lower triangular part of the matrix A is supplied in packed form. + * @param alpha The scalar alpha. + * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param beta The scalar beta. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + */ public void ZHPMV(@Uplo int Uplo, Double2 alpha, Allocation Ap, Allocation X, int incX, Double2 beta, Allocation Y, int incY) { // HPMV is the same as SPR2 int N = validateSPR2(Element.F64_2(mRS), Uplo, X, incX, Y, incY, Ap); mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zhpmv, 0, 0, 0, Uplo, 0, 0, N, 0, alpha.x, alpha.y, Ap.getID(mRS), X.getID(mRS), beta.x, beta.y, Y.getID(mRS), incX, incY, 0, 0); } + + /** + * ZGERU performs the rank 1 operation + * A := alpha*x*y**T + A + * + * Details: http://www.netlib.org/lapack/explore-html/d7/d12/zgeru_8f.html + * + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + */ public void ZGERU(Double2 alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) { validateGERU(Element.F64_2(mRS), X, incX, Y, incY, A); int M = A.getType().getY(); int N = A.getType().getX(); mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zgeru, 0, 0, 0, 0, 0, M, N, 0, alpha.x, alpha.y, X.getID(mRS), Y.getID(mRS), 0, 0, A.getID(mRS), incX, incY, 0, 0); } + + /** + * ZGERC performs the rank 1 operation + * A := alpha*x*y**H + A + * + * Details: http://www.netlib.org/lapack/explore-html/d3/dad/zgerc_8f.html + * + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + */ public void ZGERC(Double2 alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) { // same as GERU validateGERU(Element.F64_2(mRS), X, incX, Y, incY, A); @@ -958,21 +2158,93 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { int N = A.getType().getX(); mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zgerc, 0, 0, 0, 0, 0, M, N, 0, alpha.x, alpha.y, X.getID(mRS), Y.getID(mRS), 0, 0, A.getID(mRS), incX, incY, 0, 0); } + + /** + * ZHER performs the rank 1 operation + * A := alpha*x*x**H + A + * + * Details: http://www.netlib.org/lapack/explore-html/de/d0e/zher_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + */ public void ZHER(@Uplo int Uplo, double alpha, Allocation X, int incX, Allocation A) { // same as SYR int N = validateSYR(Element.F64_2(mRS), Uplo, X, incX, A); mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zher, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, 0, X.getID(mRS), 0, 0, 0, A.getID(mRS), incX, 0, 0, 0); } + + /** + * ZHPR performs the rank 1 operation + * A := alpha*x*x**H + A + * + * Details: http://www.netlib.org/lapack/explore-html/de/de1/zhpr_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form. + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + */ public void ZHPR(@Uplo int Uplo, double alpha, Allocation X, int incX, Allocation Ap) { // equivalent to SPR for validation int N = validateSPR(Element.F64_2(mRS), Uplo, X, incX, Ap); mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zhpr, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, 0, X.getID(mRS), 0, 0, 0, Ap.getID(mRS), incX, 0, 0, 0); } + + /** + * ZHER2 performs the symmetric rank 2 operation + * A := alpha*x*y**H + alpha*y*x**H + A + * + * Details: http://www.netlib.org/lapack/explore-html/da/d8a/zher2_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + */ public void ZHER2(@Uplo int Uplo, Double2 alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) { // same as SYR2 int N = validateSYR2(Element.F64_2(mRS), Uplo, X, incX, Y, incY, A); mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zher2, 0, 0, 0, Uplo, 0, 0, N, 0, alpha.x, alpha.y, X.getID(mRS), Y.getID(mRS), 0, 0, A.getID(mRS), incX, incY, 0, 0); } + + /** + * ZHPR2 performs the symmetric rank 2 operation + * A := alpha*x*y**H + alpha*y*x**H + A + * + * Details: http://www.netlib.org/lapack/explore-html/d5/d52/zhpr2_8f.html + * + * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, + * The following subroutine can is an example showing how to convert a UPPER trianglar matrix + * 'a' to packed matrix 'b'. + * k = 0 + * for i in range(0, n): + * for j in range(i, n): + * b[k++] = a[i, j] + * + * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form. + * @param alpha The scalar alpha. + * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}. + * @param incX The increment for the elements of vector x, must be larger than zero. + * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}. + * @param incY The increment for the elements of vector y, must be larger than zero. + * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + */ public void ZHPR2(@Uplo int Uplo, Double2 alpha, Allocation X, int incX, Allocation Y, int incY, Allocation Ap) { // same as SPR2 int N = validateSPR2(Element.F64_2(mRS), Uplo, X, incX, Y, incY, Ap); @@ -1051,6 +2323,20 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { } + /** + * SGEMM performs one of the matrix-matrix operations + * C := alpha*op(A)*op(B) + beta*C where op(X) is one of op(X) = X or op(X) = X**T + * + * Details: http://www.netlib.org/lapack/explore-html/d4/de2/sgemm_8f.html + * + * @param TransA The type of transpose applied to matrix A. + * @param TransB The type of transpose applied to matrix B. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F32}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F32}. + */ public void SGEMM(@Transpose int TransA, @Transpose int TransB, float alpha, Allocation A, Allocation B, float beta, Allocation C) { validateTranspose(TransA); @@ -1073,6 +2359,21 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_sgemm, TransA, TransB, 0, 0, 0, M, N, K, alpha, A.getID(mRS), B.getID(mRS), beta, C.getID(mRS), 0, 0, 0, 0); } + + /** + * DGEMM performs one of the matrix-matrix operations + * C := alpha*op(A)*op(B) + beta*C where op(X) is one of op(X) = X or op(X) = X**T + * + * Details: http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html + * + * @param TransA The type of transpose applied to matrix A. + * @param TransB The type of transpose applied to matrix B. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F64}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F64}. + */ public void DGEMM(@Transpose int TransA, @Transpose int TransB, double alpha, Allocation A, Allocation B, double beta, Allocation C) { validateTranspose(TransA); @@ -1094,6 +2395,21 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dgemm, TransA, TransB, 0, 0, 0, M, N, K, alpha, A.getID(mRS), B.getID(mRS), beta, C.getID(mRS), 0, 0, 0, 0); } + + /** + * CGEMM performs one of the matrix-matrix operations + * C := alpha*op(A)*op(B) + beta*C where op(X) is one of op(X) = X or op(X) = X**T or op(X) = X**H + * + * Details: http://www.netlib.org/lapack/explore-html/d6/d5b/cgemm_8f.html + * + * @param TransA The type of transpose applied to matrix A. + * @param TransB The type of transpose applied to matrix B. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F32_2}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F32_2}. + */ public void CGEMM(@Transpose int TransA, @Transpose int TransB, Float2 alpha, Allocation A, Allocation B, Float2 beta, Allocation C) { validateTranspose(TransA); @@ -1116,6 +2432,20 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { beta.x, beta.y, C.getID(mRS), 0, 0, 0, 0); } + /** + * ZGEMM performs one of the matrix-matrix operations + * C := alpha*op(A)*op(B) + beta*C where op(X) is one of op(X) = X or op(X) = X**T or op(X) = X**H + * + * Details: http://www.netlib.org/lapack/explore-html/d7/d76/zgemm_8f.html + * + * @param TransA The type of transpose applied to matrix A. + * @param TransB The type of transpose applied to matrix B. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2 + * @param B The input allocation contains matrix B, supported elements type {@link Element#F64_2 + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F64_2 + */ public void ZGEMM(@Transpose int TransA, @Transpose int TransB, Double2 alpha, Allocation A, Allocation B, Double2 beta, Allocation C) { validateTranspose(TransA); @@ -1138,6 +2468,20 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { beta.x, beta.y, C.getID(mRS), 0, 0, 0, 0); } + /** + * SSYMM performs one of the matrix-matrix operations + * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/d7/d42/ssymm_8f.html + * + * @param Side Specifies whether the symmetric matrix A appears on the left or right. + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F32}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F32}. + */ public void SSYMM(@Side int Side, @Uplo int Uplo, float alpha, Allocation A, Allocation B, float beta, Allocation C) { validateSide(Side); @@ -1150,6 +2494,21 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_ssymm, 0, 0, Side, Uplo, 0, C.getType().getY(), C.getType().getX(), 0, alpha, A.getID(mRS), B.getID(mRS), beta, C.getID(mRS), 0, 0, 0, 0); } + + /** + * DSYMM performs one of the matrix-matrix operations + * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/d8/db0/dsymm_8f.html + * + * @param Side Specifies whether the symmetric matrix A appears on the left or right. + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F64}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F64}. + */ public void DSYMM(@Side int Side, @Uplo int Uplo, double alpha, Allocation A, Allocation B, double beta, Allocation C) { validateSide(Side); @@ -1161,6 +2520,21 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dsymm, 0, 0, Side, Uplo, 0, C.getType().getY(), C.getType().getX(), 0, alpha, A.getID(mRS), B.getID(mRS), beta, C.getID(mRS), 0, 0, 0, 0); } + + /** + * CSYMM performs one of the matrix-matrix operations + * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/db/d59/csymm_8f.html + * + * @param Side Specifies whether the symmetric matrix A appears on the left or right. + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F32_2}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F32_2}. + */ public void CSYMM(@Side int Side, @Uplo int Uplo, Float2 alpha, Allocation A, Allocation B, Float2 beta, Allocation C) { validateSide(Side); @@ -1172,6 +2546,21 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_csymm, 0, 0, Side, Uplo, 0, C.getType().getY(), C.getType().getX(), 0, alpha.x, alpha.y, A.getID(mRS), B.getID(mRS), beta.x, beta.y, C.getID(mRS), 0, 0, 0, 0); } + + /** + * ZSYMM performs one of the matrix-matrix operations + * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/df/d51/zsymm_8f.html + * + * @param Side Specifies whether the symmetric matrix A appears on the left or right. + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F64_2}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F64_2}. + */ public void ZSYMM(@Side int Side, @Uplo int Uplo, Double2 alpha, Allocation A, Allocation B, Double2 beta, Allocation C) { validateSide(Side); @@ -1184,6 +2573,19 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { beta.x, beta.y, C.getID(mRS), 0, 0, 0, 0); } + /** + * SSYRK performs one of the symmetric rank k operations + * C := alpha*A*A**T + beta*C or C := alpha*A**T*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/d0/d40/ssyrk_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. + * @param Trans The type of transpose applied to the operation. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F32}. + */ public void SSYRK(@Uplo int Uplo, @Transpose int Trans, float alpha, Allocation A, float beta, Allocation C) { validateTranspose(Trans); validateUplo(Uplo); @@ -1198,6 +2600,19 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_ssyrk, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), K, alpha, A.getID(mRS), 0, beta, C.getID(mRS), 0, 0, 0, 0); } + /** + * DSYRK performs one of the symmetric rank k operations + * C := alpha*A*A**T + beta*C or C := alpha*A**T*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/dc/d05/dsyrk_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. + * @param Trans The type of transpose applied to the operation. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F64}. + */ public void DSYRK(@Uplo int Uplo, @Transpose int Trans, double alpha, Allocation A, double beta, Allocation C) { validateTranspose(Trans); validateUplo(Uplo); @@ -1210,6 +2625,20 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { } mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dsyrk, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), K, alpha, A.getID(mRS), 0, beta, C.getID(mRS), 0, 0, 0, 0); } + + /** + * CSYRK performs one of the symmetric rank k operations + * C := alpha*A*A**T + beta*C or C := alpha*A**T*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/d3/d6a/csyrk_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. + * @param Trans The type of transpose applied to the operation. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F32_2}. + */ public void CSYRK(@Uplo int Uplo, @Transpose int Trans, Float2 alpha, Allocation A, Float2 beta, Allocation C) { validateTranspose(Trans); validateUplo(Uplo); @@ -1223,6 +2652,20 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_csyrk, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), K, alpha.x, alpha.y, A.getID(mRS), 0, beta.x, beta.y, C.getID(mRS), 0, 0, 0, 0); } + + /** + * ZSYRK performs one of the symmetric rank k operations + * C := alpha*A*A**T + beta*C or C := alpha*A**T*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/de/d54/zsyrk_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. + * @param Trans The type of transpose applied to the operation. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F64_2}. + */ public void ZSYRK(@Uplo int Uplo, @Transpose int Trans, Double2 alpha, Allocation A, Double2 beta, Allocation C) { validateTranspose(Trans); validateUplo(Uplo); @@ -1262,6 +2705,21 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { throw new RSRuntimeException("Invalid A and B in SYR2K"); } } + + /** + * SSYR2K performs one of the symmetric rank 2k operations + * C := alpha*A*B**T + alpha*B*A**T + beta*C or C := alpha*A**T*B + alpha*B**T*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/df/d3d/ssyr2k_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. + * @param Trans The type of transpose applied to the operation. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F32}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F32}. + */ public void SSYR2K(@Uplo int Uplo, @Transpose int Trans, float alpha, Allocation A, Allocation B, float beta, Allocation C) { validateUplo(Uplo); validateSYR2K(Element.F32(mRS), Trans, A, B, C); @@ -1273,6 +2731,21 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { } mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_ssyr2k, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), K, alpha, A.getID(mRS), B.getID(mRS), beta, C.getID(mRS), 0, 0, 0, 0); } + + /** + * DSYR2K performs one of the symmetric rank 2k operations + * C := alpha*A*B**T + alpha*B*A**T + beta*C or C := alpha*A**T*B + alpha*B**T*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/d1/dec/dsyr2k_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. + * @param Trans The type of transpose applied to the operation. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F64}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F64}. + */ public void DSYR2K(@Uplo int Uplo, @Transpose int Trans, double alpha, Allocation A, Allocation B, double beta, Allocation C) { validateUplo(Uplo); validateSYR2K(Element.F64(mRS), Trans, A, B, C); @@ -1284,6 +2757,21 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { } mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dsyr2k, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), K, alpha, A.getID(mRS), B.getID(mRS), beta, C.getID(mRS), 0, 0, 0, 0); } + + /** + * CSYR2K performs one of the symmetric rank 2k operations + * C := alpha*A*B**T + alpha*B*A**T + beta*C or C := alpha*A**T*B + alpha*B**T*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/de/d7e/csyr2k_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. + * @param Trans The type of transpose applied to the operation. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F32_2}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F32_2}. + */ public void CSYR2K(@Uplo int Uplo, @Transpose int Trans, Float2 alpha, Allocation A, Allocation B, Float2 beta, Allocation C) { validateUplo(Uplo); validateSYR2K(Element.F32_2(mRS), Trans, A, B, C); @@ -1295,6 +2783,21 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { } mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_csyr2k, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), K, alpha.x, alpha.y, A.getID(mRS), B.getID(mRS), beta.x, beta.y, C.getID(mRS), 0, 0, 0, 0); } + + /** + * ZSYR2K performs one of the symmetric rank 2k operations + * C := alpha*A*B**T + alpha*B*A**T + beta*C or C := alpha*A**T*B + alpha*B**T*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/df/d20/zsyr2k_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. + * @param Trans The type of transpose applied to the operation. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F64_2}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F64_2}. + */ public void ZSYR2K(@Uplo int Uplo, @Transpose int Trans, Double2 alpha, Allocation A, Allocation B, Double2 beta, Allocation C) { validateUplo(Uplo); validateSYR2K(Element.F64_2(mRS), Trans, A, B, C); @@ -1334,6 +2837,22 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { } } } + + /** + * STRMM performs one of the matrix-matrix operations + * B := alpha*op(A)*B or B := alpha*B*op(A) + * op(A) is one of op(A) = A or op(A) = A**T + * + * Details: http://www.netlib.org/lapack/explore-html/df/d01/strmm_8f.html + * + * @param Side Specifies whether the symmetric matrix A appears on the left or right. + * @param Uplo Specifies whether matrix A is upper or lower triangular. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F32}. + */ public void STRMM(@Side int Side, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, float alpha, Allocation A, Allocation B) { validateUplo(Uplo); validateDiag(Diag); @@ -1341,6 +2860,22 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_strmm, TransA, 0, Side, Uplo, Diag, B.getType().getY(), B.getType().getX(), 0, alpha, A.getID(mRS), B.getID(mRS), 0.f, 0, 0, 0, 0, 0); } + + /** + * DTRMM performs one of the matrix-matrix operations + * B := alpha*op(A)*B or B := alpha*B*op(A) + * op(A) is one of op(A) = A or op(A) = A**T + * + * Details: http://www.netlib.org/lapack/explore-html/dd/d19/dtrmm_8f.html + * + * @param Side Specifies whether the symmetric matrix A appears on the left or right. + * @param Uplo Specifies whether matrix A is upper or lower triangular. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F64}. + */ public void DTRMM(@Side int Side, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, double alpha, Allocation A, Allocation B) { validateUplo(Uplo); validateDiag(Diag); @@ -1348,6 +2883,22 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dtrmm, TransA, 0, Side, Uplo, Diag, B.getType().getY(), B.getType().getX(), 0, alpha, A.getID(mRS), B.getID(mRS), 0, 0, 0, 0, 0, 0); } + + /** + * CTRMM performs one of the matrix-matrix operations + * B := alpha*op(A)*B or B := alpha*B*op(A) + * op(A) is one of op(A) = A or op(A) = A**T or op(A) = A**H + * + * Details: http://www.netlib.org/lapack/explore-html/d4/d9b/ctrmm_8f.html + * + * @param Side Specifies whether the symmetric matrix A appears on the left or right. + * @param Uplo Specifies whether matrix A is upper or lower triangular. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F32_2}. + */ public void CTRMM(@Side int Side, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Float2 alpha, Allocation A, Allocation B) { validateUplo(Uplo); validateDiag(Diag); @@ -1355,6 +2906,22 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_ctrmm, TransA, 0, Side, Uplo, Diag, B.getType().getY(), B.getType().getX(), 0, alpha.x, alpha.y, A.getID(mRS), B.getID(mRS), 0, 0, 0, 0, 0, 0, 0); } + + /** + * ZTRMM performs one of the matrix-matrix operations + * B := alpha*op(A)*B or B := alpha*B*op(A) + * op(A) is one of op(A) = A or op(A) = A**T or op(A) = A**H + * + * Details: http://www.netlib.org/lapack/explore-html/d8/de1/ztrmm_8f.html + * + * @param Side Specifies whether the symmetric matrix A appears on the left or right. + * @param Uplo Specifies whether matrix A is upper or lower triangular. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F64_2}. + */ public void ZTRMM(@Side int Side, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Double2 alpha, Allocation A, Allocation B) { validateUplo(Uplo); validateDiag(Diag); @@ -1392,6 +2959,22 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { } } } + + /** + * STRSM solves one of the matrix equations + * op(A)*X := alpha*B or X*op(A) := alpha*B + * op(A) is one of op(A) = A or op(A) = A**T + * + * Details: http://www.netlib.org/lapack/explore-html/d2/d8b/strsm_8f.html + * + * @param Side Specifies whether the symmetric matrix A appears on the left or right. + * @param Uplo Specifies whether matrix A is upper or lower triangular. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F32}. + */ public void STRSM(@Side int Side, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, float alpha, Allocation A, Allocation B) { validateUplo(Uplo); validateDiag(Diag); @@ -1399,6 +2982,22 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_strsm, TransA, 0, Side, Uplo, Diag, B.getType().getY(), B.getType().getX(), 0, alpha, A.getID(mRS), B.getID(mRS), 0, 0, 0, 0, 0, 0); } + + /** + * DTRSM solves one of the matrix equations + * op(A)*X := alpha*B or X*op(A) := alpha*B + * op(A) is one of op(A) = A or op(A) = A**T + * + * Details: http://www.netlib.org/lapack/explore-html/de/da7/dtrsm_8f.html + * + * @param Side Specifies whether the symmetric matrix A appears on the left or right. + * @param Uplo Specifies whether matrix A is upper or lower triangular. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F64}. + */ public void DTRSM(@Side int Side, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, double alpha, Allocation A, Allocation B) { validateUplo(Uplo); validateDiag(Diag); @@ -1406,6 +3005,22 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dtrsm, TransA, 0, Side, Uplo, Diag, B.getType().getY(), B.getType().getX(), 0, alpha, A.getID(mRS), B.getID(mRS), 0, 0, 0, 0, 0, 0); } + + /** + * CTRSM solves one of the matrix equations + * op(A)*X := alpha*B or X*op(A) := alpha*B + * op(A) is one of op(A) = A or op(A) = A**T or op(A) = A**H + * + * Details: http://www.netlib.org/lapack/explore-html/de/d30/ctrsm_8f.html + * + * @param Side Specifies whether the symmetric matrix A appears on the left or right. + * @param Uplo Specifies whether matrix A is upper or lower triangular. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F32_2}. + */ public void CTRSM(@Side int Side, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Float2 alpha, Allocation A, Allocation B) { validateUplo(Uplo); validateDiag(Diag); @@ -1413,6 +3028,22 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_ctrsm, TransA, 0, Side, Uplo, Diag, B.getType().getY(), B.getType().getX(), 0, alpha.x, alpha.y, A.getID(mRS), B.getID(mRS), 0, 0, 0, 0, 0, 0, 0); } + + /** + * ZTRSM solves one of the matrix equations + * op(A)*X := alpha*B or X*op(A) := alpha*B + * op(A) is one of op(A) = A or op(A) = A**T or op(A) = A**H + * + * Details: http://www.netlib.org/lapack/explore-html/d1/d39/ztrsm_8f.html + * + * @param Side Specifies whether the symmetric matrix A appears on the left or right. + * @param Uplo Specifies whether matrix A is upper or lower triangular. + * @param TransA The type of transpose applied to matrix A. + * @param Diag Specifies whether or not A is unit triangular. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F64_2}. + */ public void ZTRSM(@Side int Side, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Double2 alpha, Allocation A, Allocation B) { validateUplo(Uplo); validateDiag(Diag); @@ -1444,12 +3075,42 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { throw new RSRuntimeException("Called HEMM with mismatched B and C"); } } + + /** + * CHEMM performs one of the matrix-matrix operations + * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/d3/d66/chemm_8f.html + * + * @param Side Specifies whether the symmetric matrix A appears on the left or right. + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F32_2}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F32_2}. + */ public void CHEMM(@Side int Side, @Uplo int Uplo, Float2 alpha, Allocation A, Allocation B, Float2 beta, Allocation C) { validateUplo(Uplo); validateHEMM(Element.F32_2(mRS), Side, A, B, C); mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_chemm, 0, 0, Side, Uplo, 0, C.getType().getY(), C.getType().getX(), 0, alpha.x, alpha.y, A.getID(mRS), B.getID(mRS), beta.x, beta.y, C.getID(mRS), 0, 0, 0, 0); } + + /** + * ZHEMM performs one of the matrix-matrix operations + * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/d6/d3e/zhemm_8f.html + * + * @param Side Specifies whether the symmetric matrix A appears on the left or right. + * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F64_2}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F64_2}. + */ public void ZHEMM(@Side int Side, @Uplo int Uplo, Double2 alpha, Allocation A, Allocation B, Double2 beta, Allocation C) { validateUplo(Uplo); validateHEMM(Element.F64_2(mRS), Side, A, B, C); @@ -1477,6 +3138,20 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { } } } + + /** + * CHERK performs one of the hermitian rank k operations + * C := alpha*A*A**H + beta*C or C := alpha*A**H*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/d8/d52/cherk_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. + * @param Trans The type of transpose applied to the operation. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F32_2}. + */ public void CHERK(@Uplo int Uplo, @Transpose int Trans, float alpha, Allocation A, float beta, Allocation C) { validateUplo(Uplo); validateHERK(Element.F32_2(mRS), Trans, A, C); @@ -1489,6 +3164,20 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cherk, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), k, alpha, 0, A.getID(mRS), 0, beta, 0, C.getID(mRS), 0, 0, 0, 0); } + + /** + * ZHERK performs one of the hermitian rank k operations + * C := alpha*A*A**H + beta*C or C := alpha*A**H*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/d1/db1/zherk_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. + * @param Trans The type of transpose applied to the operation. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F64_2}. + */ public void ZHERK(@Uplo int Uplo, @Transpose int Trans, double alpha, Allocation A, double beta, Allocation C) { validateUplo(Uplo); validateHERK(Element.F64_2(mRS), Trans, A, C); @@ -1526,6 +3215,21 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { throw new RSRuntimeException("Called HER2K with invalid A and B matrices"); } } + + /** + * CHER2K performs one of the hermitian rank 2k operations + * C := alpha*A*B**H + conjg( alpha )*B*A**H + beta*C or C := alpha*A**H*B + conjg( alpha )*B**H*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/d1/d82/cher2k_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. + * @param Trans The type of transpose applied to the operation. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F32_2}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F32_2}. + */ public void CHER2K(@Uplo int Uplo, @Transpose int Trans, Float2 alpha, Allocation A, Allocation B, float beta, Allocation C) { validateUplo(Uplo); validateHER2K(Element.F32_2(mRS), Trans, A, B, C); @@ -1538,6 +3242,21 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cher2k, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), k, alpha.x, alpha.y, A.getID(mRS), B.getID(mRS), beta, 0, C.getID(mRS), 0, 0, 0, 0); } + + /** + * ZHER2K performs one of the hermitian rank 2k operations + * C := alpha*A*B**H + conjg( alpha )*B*A**H + beta*C or C := alpha*A**H*B + conjg( alpha )*B**H*A + beta*C + * + * Details: http://www.netlib.org/lapack/explore-html/d7/dfa/zher2k_8f.html + * + * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. + * @param Trans The type of transpose applied to the operation. + * @param alpha The scalar alpha. + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F64_2}. + * @param beta The scalar beta. + * @param C The input allocation contains matrix C, supported elements type {@link Element#F64_2}. + */ public void ZHER2K(@Uplo int Uplo, @Transpose int Trans, Double2 alpha, Allocation A, Allocation B, double beta, Allocation C) { validateUplo(Uplo); validateHER2K(Element.F64_2(mRS), Trans, A, B, C); @@ -1553,9 +3272,19 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { /** - * - * 8-bit GEMM-like operation for neural networks - * + * 8-bit GEMM-like operation for neural networks: C = B.transposed() * A + * Calculations are done in 1.10.21 fixed-point format for the final output, + * just before there's a shift down to drop the fractional parts. The output + * values are gated to 0 to 255 to fit in a byte, but the 10-bit format + * gives some headroom to avoid wrapping around on small overflows. + * + * @param A The input allocation contains matrix A, supported elements type {@link Element#U8}. + * @param a_offset The offset for all values in matrix A, e.g A[i,j] = A[i,j] - a_offset. + * @param B The input allocation contains matrix B, supported elements type {@link Element#U8}. + * @param b_offset The offset for all values in matrix B, e.g B[i,j] = B[i,j] - b_offset. + * @param C The input allocation contains matrix C, supported elements type {@link Element#U8}. + * @param c_offset The offset for all values in matrix C. + * @param c_mult The multiplier for all values in matrix C, e.g C[i,j] = (C[i,j] + c_offset) * c_mult. **/ public void BNNM(Allocation A, int a_offset, Allocation B, int b_offset, Allocation C, int c_offset, int c_mult) { validateL3(Element.U8(mRS), NO_TRANSPOSE, TRANSPOSE, 0, A, B, C); diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index 17d70789c782..30680ed1a0f3 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -37,6 +37,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.ParceledListSlice; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.UserInfo; @@ -1281,7 +1282,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } @Override - public List<AppWidgetProviderInfo> getInstalledProvidersForProfile(int categoryFilter, + public ParceledListSlice<AppWidgetProviderInfo> getInstalledProvidersForProfile(int categoryFilter, int profileId) { final int userId = UserHandle.getCallingUserId(); @@ -1297,7 +1298,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku synchronized (mLock) { ensureGroupStateLoadedLocked(userId); - ArrayList<AppWidgetProviderInfo> result = null; + ArrayList<AppWidgetProviderInfo> result = new ArrayList<AppWidgetProviderInfo>(); final int providerCount = mProviders.size(); for (int i = 0; i < providerCount; i++) { @@ -1314,14 +1315,11 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku if (providerProfileId == profileId && mSecurityPolicy.isProviderInCallerOrInProfileAndWhitelListed( provider.id.componentName.getPackageName(), providerProfileId)) { - if (result == null) { - result = new ArrayList<>(); - } result.add(cloneIfLocalBinder(info)); } } - return result; + return new ParceledListSlice<AppWidgetProviderInfo>(result); } } diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index fbb6dc9bb969..b33b10bc7abc 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -61,7 +61,7 @@ import java.util.HashMap; import java.util.Map; class BluetoothManagerService extends IBluetoothManager.Stub { private static final String TAG = "BluetoothManagerService"; - private static final boolean DBG = true; + private static final boolean DBG = false; private static final String BLUETOOTH_ADMIN_PERM = android.Manifest.permission.BLUETOOTH_ADMIN; private static final String BLUETOOTH_PERM = android.Manifest.permission.BLUETOOTH; @@ -227,15 +227,23 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } } } else if (Intent.ACTION_USER_SWITCHED.equals(action)) { + if (DBG) Log.d(TAG, "Bluetooth user switched"); mHandler.sendMessage(mHandler.obtainMessage(MESSAGE_USER_SWITCHED, intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0), 0)); } else if (Intent.ACTION_BOOT_COMPLETED.equals(action)) { + if (DBG) Log.d(TAG, "Bluetooth boot completed"); synchronized(mReceiver) { if (mEnableExternal && isBluetoothPersistedStateOnBluetooth()) { //Enable if (DBG) Log.d(TAG, "Auto-enabling Bluetooth."); sendEnableMsg(mQuietEnableExternal); } + if (!isNameAndAddressSet()) { + // Sync the Bluetooth name and address from the + // Bluetooth Adapter + if (DBG) Log.d(TAG, "Retrieving Bluetooth Adapter name and address..."); + getNameAndAddress(); + } } } } @@ -1093,7 +1101,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { boolean unbind = false; if (DBG) Log.d(TAG,"MESSAGE_SAVE_NAME_AND_ADDRESS"); synchronized(mConnection) { - if (!mEnable && mBluetooth != null) { + if (!mEnable && mBluetooth != null && !mConnection.isGetNameAddressOnly()) { try { mBluetooth.enable(); } catch (RemoteException e) { @@ -1101,7 +1109,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } } } - if (mBluetooth != null) waitForOnOff(true, false); + if (mBluetooth != null && !mConnection.isGetNameAddressOnly()) waitForOnOff(true, false); synchronized(mConnection) { if (mBluetooth != null) { String name = null; @@ -1131,7 +1139,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } } } - if (!mEnable) { + if (!mEnable && !mConnection.isGetNameAddressOnly()) { try { mBluetooth.disable(); } catch (RemoteException e) { @@ -1146,7 +1154,9 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mHandler.sendMessage(getMsg); } } - if (!mEnable && mBluetooth != null) waitForOnOff(false, true); + if (!mEnable && mBluetooth != null && !mConnection.isGetNameAddressOnly()) { + waitForOnOff(false, true); + } if (unbind) { unbindAndFinish(); } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 82399da92f46..25d4d5ec01e0 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -136,11 +136,13 @@ import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; import java.net.Inet4Address; +import java.net.Inet6Address; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -324,7 +326,7 @@ public class ConnectivityService extends IConnectivityManager.Stub /** * used to add a network request with a pending intent - * includes a NetworkRequestInfo + * obj = NetworkRequestInfo */ private static final int EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT = 26; @@ -354,6 +356,12 @@ public class ConnectivityService extends IConnectivityManager.Stub */ private static final int EVENT_CONFIGURE_MOBILE_DATA_ALWAYS_ON = 30; + /** + * used to add a network listener with a pending intent + * obj = NetworkRequestInfo + */ + private static final int EVENT_REGISTER_NETWORK_LISTENER_WITH_INTENT = 31; + /** Handler used for internal events. */ final private InternalHandler mHandler; /** Handler used for incoming {@link NetworkStateTracker} events. */ @@ -2066,15 +2074,6 @@ public class ConnectivityService extends IConnectivityManager.Stub log(nai.name() + " got DISCONNECTED, was satisfying " + nai.networkRequests.size()); } // A network agent has disconnected. - if (nai.created) { - // Tell netd to clean up the configuration for this network - // (routing rules, DNS, etc). - try { - mNetd.removeNetwork(nai.network.netId); - } catch (Exception e) { - loge("Exception removing network: " + e); - } - } // TODO - if we move the logic to the network agent (have them disconnect // because they lost all their requests or because their score isn't good) // then they would disconnect organically, report their new state and then @@ -2093,8 +2092,9 @@ public class ConnectivityService extends IConnectivityManager.Stub mNetworkAgentInfos.remove(msg.replyTo); updateClat(null, nai.linkProperties, nai); synchronized (mNetworkForNetId) { + // Remove the NetworkAgent, but don't mark the netId as + // available until we've told netd to delete it below. mNetworkForNetId.remove(nai.network.netId); - mNetIdInUse.delete(nai.network.netId); } // Since we've lost the network, go through all the requests that // it was satisfying and see if any other factory can satisfy them. @@ -2136,9 +2136,28 @@ public class ConnectivityService extends IConnectivityManager.Stub rematchNetworkAndRequests(networkToActivate, NascentState.NOT_JUST_VALIDATED, ReapUnvalidatedNetworks.DONT_REAP); } + if (nai.created) { + // Tell netd to clean up the configuration for this network + // (routing rules, DNS, etc). + // This may be slow as it requires a lot of netd shelling out to ip and + // ip[6]tables to flush routes and remove the incoming packet mark rule, so do it + // after we've rematched networks with requests which should make a potential + // fallback network the default or requested a new network from the + // NetworkFactories, so network traffic isn't interrupted for an unnecessarily + // long time. + try { + mNetd.removeNetwork(nai.network.netId); + } catch (Exception e) { + loge("Exception removing network: " + e); + } + } + synchronized (mNetworkForNetId) { + mNetIdInUse.delete(nai.network.netId); + } + } else { + NetworkFactoryInfo nfi = mNetworkFactoryInfos.remove(msg.replyTo); + if (DBG && nfi != null) log("unregisterNetworkFactory for " + nfi.name); } - NetworkFactoryInfo nfi = mNetworkFactoryInfos.remove(msg.replyTo); - if (DBG && nfi != null) log("unregisterNetworkFactory for " + nfi.name); } // If this method proves to be too slow then we can maintain a separate @@ -2183,7 +2202,9 @@ public class ConnectivityService extends IConnectivityManager.Stub // Not setting bestNetwork here as a listening NetworkRequest may be // satisfied by multiple Networks. Instead the request is added to // each satisfying Network and notified about each. - network.addRequest(nri.request); + if (!network.addRequest(nri.request)) { + Slog.wtf(TAG, "BUG: " + network.name() + " already has " + nri.request); + } notifyNetworkCallback(network, nri); } else if (bestNetwork == null || bestNetwork.getCurrentScore() < network.getCurrentScore()) { @@ -2194,7 +2215,9 @@ public class ConnectivityService extends IConnectivityManager.Stub if (bestNetwork != null) { if (DBG) log("using " + bestNetwork.name()); unlinger(bestNetwork); - bestNetwork.addRequest(nri.request); + if (!bestNetwork.addRequest(nri.request)) { + Slog.wtf(TAG, "BUG: " + bestNetwork.name() + " already has " + nri.request); + } mNetworkForRequestId.put(nri.request.requestId, bestNetwork); notifyNetworkCallback(bestNetwork, nri); if (nri.request.legacyType != TYPE_NONE) { @@ -2478,7 +2501,8 @@ public class ConnectivityService extends IConnectivityManager.Stub handleRegisterNetworkRequest((NetworkRequestInfo) msg.obj); break; } - case EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT: { + case EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT: + case EVENT_REGISTER_NETWORK_LISTENER_WITH_INTENT: { handleRegisterNetworkRequestWithIntent(msg); break; } @@ -3687,6 +3711,18 @@ public class ConnectivityService extends IConnectivityManager.Stub @Override public void pendingListenForNetwork(NetworkCapabilities networkCapabilities, PendingIntent operation) { + checkNotNull(operation, "PendingIntent cannot be null."); + if (!hasWifiNetworkListenPermission(networkCapabilities)) { + enforceAccessPermission(); + } + + NetworkRequest networkRequest = new NetworkRequest(new NetworkCapabilities( + networkCapabilities), TYPE_NONE, nextNetworkRequestId()); + if (DBG) log("pendingListenForNetwork for " + networkRequest + " to trigger " + operation); + NetworkRequestInfo nri = new NetworkRequestInfo(networkRequest, operation, + NetworkRequestInfo.LISTEN); + + mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_LISTENER, nri)); } @Override @@ -3920,10 +3956,52 @@ public class ConnectivityService extends IConnectivityManager.Stub } return !routeDiff.added.isEmpty() || !routeDiff.removed.isEmpty(); } + + // TODO: investigate moving this into LinkProperties, if only to make more accurate + // the isProvisioned() checks. + private static Collection<InetAddress> getLikelyReachableDnsServers(LinkProperties lp) { + final ArrayList<InetAddress> dnsServers = new ArrayList<InetAddress>(); + final List<RouteInfo> allRoutes = lp.getAllRoutes(); + for (InetAddress nameserver : lp.getDnsServers()) { + // If the LinkProperties doesn't include a route to the nameserver, ignore it. + final RouteInfo bestRoute = RouteInfo.selectBestRoute(allRoutes, nameserver); + if (bestRoute == null) { + continue; + } + + // TODO: better source address evaluation for destination addresses. + if (nameserver instanceof Inet4Address) { + if (!lp.hasIPv4Address()) { + continue; + } + } else if (nameserver instanceof Inet6Address) { + if (nameserver.isLinkLocalAddress()) { + if (((Inet6Address)nameserver).getScopeId() == 0) { + // For now, just make sure link-local DNS servers have + // scopedIds set, since DNS lookups will fail otherwise. + // TODO: verify the scopeId matches that of lp's interface. + continue; + } + } else { + if (bestRoute.isIPv6Default() && !lp.hasGlobalIPv6Address()) { + // TODO: reconsider all corner cases (disconnected ULA networks, ...). + continue; + } + } + } + + dnsServers.add(nameserver); + } + return Collections.unmodifiableList(dnsServers); + } + private void updateDnses(LinkProperties newLp, LinkProperties oldLp, int netId, boolean flush, boolean useDefaultDns) { + // TODO: consider comparing the getLikelyReachableDnsServers() lists, in case the + // route to a DNS server has been removed (only really applicable in special cases + // where there is no default route). if (oldLp == null || (newLp.isIdenticalDnses(oldLp) == false)) { - Collection<InetAddress> dnses = newLp.getDnsServers(); + Collection<InetAddress> dnses = getLikelyReachableDnsServers(newLp); if (dnses.size() == 0 && mDefaultDns != null && useDefaultDns) { dnses = new ArrayList(); dnses.add(mDefaultDns); @@ -4153,6 +4231,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // Find and migrate to this Network any NetworkRequests for // which this network is now the best. ArrayList<NetworkAgentInfo> affectedNetworks = new ArrayList<NetworkAgentInfo>(); + ArrayList<NetworkRequestInfo> addedRequests = new ArrayList<NetworkRequestInfo>(); if (VDBG) log(" network has: " + newNetwork.networkCapabilities); for (NetworkRequestInfo nri : mNetworkRequests.values()) { NetworkAgentInfo currentNetwork = mNetworkForRequestId.get(nri.request.requestId); @@ -4171,7 +4250,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (!nri.isRequest) { // This is not a request, it's a callback listener. // Add it to newNetwork regardless of score. - newNetwork.addRequest(nri.request); + if (newNetwork.addRequest(nri.request)) addedRequests.add(nri); continue; } @@ -4194,7 +4273,10 @@ public class ConnectivityService extends IConnectivityManager.Stub } unlinger(newNetwork); mNetworkForRequestId.put(nri.request.requestId, newNetwork); - newNetwork.addRequest(nri.request); + if (!newNetwork.addRequest(nri.request)) { + Slog.wtf(TAG, "BUG: " + newNetwork.name() + " already has " + nri.request); + } + addedRequests.add(nri); keep = true; // Tell NetworkFactories about the new score, so they can stop // trying to connect if they know they cannot match it. @@ -4237,7 +4319,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // do this after the default net is switched, but // before LegacyTypeTracker sends legacy broadcasts - notifyNetworkCallbacks(newNetwork, ConnectivityManager.CALLBACK_AVAILABLE); + for (NetworkRequestInfo nri : addedRequests) notifyNetworkCallback(newNetwork, nri); if (isNewDefault) { // Maintain the illusion: since the legacy API only diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index 8dd087a135ff..dc203ffaee33 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -45,6 +45,7 @@ import android.os.Looper; import android.os.Message; import android.os.PowerManager; import android.os.PowerManagerInternal; +import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; @@ -96,9 +97,6 @@ public class DeviceIdleController extends SystemService private static final String ACTION_STEP_IDLE_STATE = "com.android.server.device_idle.STEP_IDLE_STATE"; - private static final String ACTION_ENTER_INACTIVE_STATE = - "com.android.server.device_idle.ENTER_INACTIVE_STATE"; - private AlarmManager mAlarmManager; private IBatteryStats mBatteryStats; private PowerManagerInternal mLocalPowerManager; @@ -111,7 +109,7 @@ public class DeviceIdleController extends SystemService private Intent mIdleIntent; private Display mCurDisplay; private AnyMotionDetector mAnyMotionDetector; - private boolean mIdleDisabled; + private boolean mEnabled; private boolean mScreenOn; private boolean mCharging; private boolean mSigMotionActive; @@ -190,10 +188,6 @@ public class DeviceIdleController extends SystemService synchronized (DeviceIdleController.this) { stepIdleStateLocked(); } - } else if (ACTION_ENTER_INACTIVE_STATE.equals(intent.getAction())) { - synchronized (DeviceIdleController.this) { - enterInactiveStateLocked(); - } } } }; @@ -487,7 +481,7 @@ public class DeviceIdleController extends SystemService mLocalPowerManager.setDeviceIdleMode(true); try { mNetworkPolicyManager.setDeviceIdleMode(true); - mBatteryStats.noteDeviceIdleMode(true, false, false); + mBatteryStats.noteDeviceIdleMode(true, null, Process.myUid()); } catch (RemoteException e) { } getContext().sendBroadcastAsUser(mIdleIntent, UserHandle.ALL); @@ -496,18 +490,19 @@ public class DeviceIdleController extends SystemService mLocalPowerManager.setDeviceIdleMode(false); try { mNetworkPolicyManager.setDeviceIdleMode(false); - mBatteryStats.noteDeviceIdleMode(false, false, false); + mBatteryStats.noteDeviceIdleMode(false, null, Process.myUid()); } catch (RemoteException e) { } getContext().sendBroadcastAsUser(mIdleIntent, UserHandle.ALL); } break; case MSG_REPORT_ACTIVE: { - boolean fromMotion = msg.arg1 != 0; + String activeReason = (String)msg.obj; + int activeUid = msg.arg1; boolean needBroadcast = msg.arg2 != 0; mLocalPowerManager.setDeviceIdleMode(false); try { mNetworkPolicyManager.setDeviceIdleMode(false); - mBatteryStats.noteDeviceIdleMode(false, !fromMotion, fromMotion); + mBatteryStats.noteDeviceIdleMode(false, activeReason, activeUid); } catch (RemoteException e) { } if (needBroadcast) { @@ -578,6 +573,12 @@ public class DeviceIdleController extends SystemService } } + @Override public void exitIdle(String reason) { + getContext().enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, + null); + exitIdleInternal(reason); + } + @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { DeviceIdleController.this.dump(fd, pw, args); } @@ -604,6 +605,8 @@ public class DeviceIdleController extends SystemService final PackageManager pm = getContext().getPackageManager(); synchronized (this) { + mEnabled = getContext().getResources().getBoolean( + com.android.internal.R.bool.config_enableAutoPowerModes); SystemConfig sysConfig = SystemConfig.getInstance(); ArraySet<String> allowPower = sysConfig.getAllowInPowerSave(); for (int i=0; i<allowPower.size(); i++) { @@ -818,6 +821,12 @@ public class DeviceIdleController extends SystemService } } + public void exitIdleInternal(String reason) { + synchronized (this) { + becomeActiveLocked(reason, Binder.getCallingUid()); + } + } + void updateDisplayLocked() { mCurDisplay = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY); // We consider any situation where the display is showing something to be it on, @@ -830,7 +839,7 @@ public class DeviceIdleController extends SystemService becomeInactiveIfAppropriateLocked(); } else if (screenOn) { mScreenOn = true; - becomeActiveLocked("screen"); + becomeActiveLocked("screen", Process.myUid()); } } @@ -841,21 +850,21 @@ public class DeviceIdleController extends SystemService becomeInactiveIfAppropriateLocked(); } else if (charging) { mCharging = charging; - becomeActiveLocked("charging"); + becomeActiveLocked("charging", Process.myUid()); } } - void scheduleReportActiveLocked(boolean fromMotion) { - Message msg = mHandler.obtainMessage(MSG_REPORT_ACTIVE, fromMotion ? 1 : 0, - mState == STATE_IDLE ? 1 : 0); + void scheduleReportActiveLocked(String activeReason, int activeUid) { + Message msg = mHandler.obtainMessage(MSG_REPORT_ACTIVE, activeUid, + mState == STATE_IDLE ? 1 : 0, activeReason); mHandler.sendMessage(msg); } - void becomeActiveLocked(String reason) { - if (DEBUG) Slog.i(TAG, "becomeActiveLocked, reason = " + reason); + void becomeActiveLocked(String activeReason, int activeUid) { + if (DEBUG) Slog.i(TAG, "becomeActiveLocked, reason = " + activeReason); if (mState != STATE_ACTIVE) { - EventLogTags.writeDeviceIdle(STATE_ACTIVE, reason); - scheduleReportActiveLocked(false); + EventLogTags.writeDeviceIdle(STATE_ACTIVE, activeReason); + scheduleReportActiveLocked(activeReason, activeUid); mState = STATE_ACTIVE; mInactiveTimeout = mConstants.INACTIVE_TIMEOUT; mNextIdlePendingDelay = 0; @@ -867,7 +876,7 @@ public class DeviceIdleController extends SystemService void becomeInactiveIfAppropriateLocked() { if (DEBUG) Slog.d(TAG, "becomeInactiveIfAppropriateLocked()"); - if (!mScreenOn && !mCharging && !mIdleDisabled && mState == STATE_ACTIVE) { + if (!mScreenOn && !mCharging && mEnabled && mState == STATE_ACTIVE) { // Screen has turned off; we are now going to become inactive and start // waiting to see if we will ultimately go idle. mState = STATE_INACTIVE; @@ -896,7 +905,7 @@ public class DeviceIdleController extends SystemService if ((now+mConstants.MIN_TIME_TO_ALARM) > mAlarmManager.getNextWakeFromIdleTime()) { // Whoops, there is an upcoming alarm. We don't actually want to go idle. if (mState != STATE_ACTIVE) { - becomeActiveLocked("alarm"); + becomeActiveLocked("alarm", Process.myUid()); } return; } @@ -954,7 +963,7 @@ public class DeviceIdleController extends SystemService // state to wait again for no motion. Note that we only monitor for significant // motion after moving out of the inactive state, so no need to worry about that. if (mState != STATE_ACTIVE) { - scheduleReportActiveLocked(true); + scheduleReportActiveLocked("motion", Process.myUid()); mState = STATE_ACTIVE; mInactiveTimeout = mConstants.MOTION_INACTIVE_TIMEOUT; EventLogTags.writeDeviceIdle(mState, "motion"); @@ -1202,8 +1211,12 @@ public class DeviceIdleController extends SystemService pw.println(" Completely disable device idle mode."); pw.println(" enable"); pw.println(" Re-enable device idle mode after it had previously been disabled."); - pw.println(" whitelist"); + pw.println(" enabled"); + pw.println(" Print 1 if device idle mode is currently enabled, else 0."); + pw.println(" whitelist [package ...]"); pw.println(" Add (prefix with +) or remove (prefix with -) packages."); + pw.println(" tempwhitelist [package ..]"); + pw.println(" Temporarily place packages in whitelist for 10 seconds."); } void dump(FileDescriptor fd, PrintWriter pw, String[] args) { @@ -1238,22 +1251,27 @@ public class DeviceIdleController extends SystemService return; } else if ("disable".equals(arg)) { synchronized (this) { - if (!mIdleDisabled) { - mIdleDisabled = true; - becomeActiveLocked("disabled"); + if (mEnabled) { + mEnabled = false; + becomeActiveLocked("disabled", Process.myUid()); pw.println("Idle mode disabled"); } } return; } else if ("enable".equals(arg)) { synchronized (this) { - if (mIdleDisabled) { - mIdleDisabled = false; + if (!mEnabled) { + mEnabled = true; becomeInactiveIfAppropriateLocked(); pw.println("Idle mode enabled"); } } return; + } else if ("enabled".equals(arg)) { + synchronized (this) { + pw.println(mEnabled ? "1" : " 0"); + } + return; } else if ("whitelist".equals(arg)) { i++; while (i < args.length) { @@ -1350,9 +1368,9 @@ public class DeviceIdleController extends SystemService } } + pw.print(" mEnabled="); pw.println(mEnabled); pw.print(" mSigMotionSensor="); pw.println(mSigMotionSensor); pw.print(" mCurDisplay="); pw.println(mCurDisplay); - pw.print(" mIdleDisabled="); pw.println(mIdleDisabled); pw.print(" mScreenOn="); pw.println(mScreenOn); pw.print(" mCharging="); pw.println(mCharging); pw.print(" mSigMotionActive="); pw.println(mSigMotionActive); diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java index a5d536eee825..dbe878183e92 100644 --- a/services/core/java/com/android/server/InputMethodManagerService.java +++ b/services/core/java/com/android/server/InputMethodManagerService.java @@ -16,6 +16,7 @@ package com.android.server; import android.annotation.NonNull; +import android.content.pm.PackageManagerInternal; import com.android.internal.content.PackageMonitor; import com.android.internal.inputmethod.InputMethodSubtypeSwitchingController; import com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem; @@ -31,6 +32,7 @@ import com.android.internal.view.IInputMethodClient; import com.android.internal.view.IInputMethodManager; import com.android.internal.view.IInputMethodSession; import com.android.internal.view.InputBindResult; +import com.android.server.pm.UserManagerService; import com.android.server.statusbar.StatusBarManagerService; import com.android.server.wm.WindowManagerService; @@ -859,6 +861,38 @@ public class InputMethodManagerService extends IInputMethodManager.Stub // mSettings should be created before buildInputMethodListLocked mSettings = new InputMethodSettings( mRes, context.getContentResolver(), mMethodMap, mMethodList, userId); + + // Let the package manager query which are the default imes + // as they get certain permissions granted by default. + PackageManagerInternal packageManagerInternal = LocalServices.getService( + PackageManagerInternal.class); + packageManagerInternal.setImePackagesProvider( + new PackageManagerInternal.PackagesProvider() { + @Override + public String[] getPackages(int userId) { + synchronized (mMethodMap) { + final int currentUserId = mSettings.getCurrentUserId(); + // TODO: We are switching the current user id in the settings + // object to query it and then revert the user id. Ideally, we + // should call a API in settings with the user id as an argument. + mSettings.setCurrentUserId(userId); + List<InputMethodInfo> imes = mSettings + .getEnabledInputMethodListLocked(); + String[] packageNames = null; + if (imes != null) { + final int imeCount = imes.size(); + packageNames = new String[imeCount]; + for (int i = 0; i < imeCount; i++) { + InputMethodInfo ime = imes.get(i); + packageNames[i] = ime.getPackageName(); + } + } + mSettings.setCurrentUserId(currentUserId); + return packageNames; + } + } + }); + updateCurrentProfileIds(); mFileManager = new InputMethodFileManager(mMethodMap, userId); synchronized (mMethodMap) { @@ -1009,8 +1043,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub resetAllInternalStateLocked(false /* updateOnlyWhenLocaleChanged */, initialUserSwitch /* needsToResetDefaultIme */); if (initialUserSwitch) { - InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(mContext.getPackageManager(), - mSettings.getEnabledInputMethodListLocked()); + InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(mIPackageManager, + mSettings.getEnabledInputMethodListLocked(), newUserId, + mContext.getBasePackageName()); } if (DEBUG) Slog.d(TAG, "Switching user stage 3/3. newUserId=" + newUserId @@ -1067,9 +1102,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub if (!mImeSelectedOnBoot) { Slog.w(TAG, "Reset the default IME as \"Resource\" is ready here."); resetStateIfCurrentLocaleChangedLocked(); - InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed( - mContext.getPackageManager(), - mSettings.getEnabledInputMethodListLocked()); + InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(mIPackageManager, + mSettings.getEnabledInputMethodListLocked(), + mSettings.getCurrentUserId(), mContext.getBasePackageName()); } mLastSystemLocale = mRes.getConfiguration().locale; try { @@ -2112,8 +2147,23 @@ public class InputMethodManagerService extends IInputMethodManager.Stub if (DEBUG) Slog.v(TAG, "Not hiding: forced show not cancelled by not-always hide"); return false; } + + // There is a chance that IMM#hideSoftInput() is called in a transient state where + // IMMS#InputShown is already updated to be true whereas IMMS#mImeWindowVis is still waiting + // to be updated with the new value sent from IME process. Even in such a transient state + // historically we have accepted an incoming call of IMM#hideSoftInput() from the + // application process as a valid request, and have even promised such a behavior with CTS + // since Android Eclair. That's why we need to accept IMM#hideSoftInput() even when only + // IMMS#InputShown indicates that the software keyboard is shown. + // TODO: Clean up, IMMS#mInputShown, IMMS#mImeWindowVis and mShowRequested. + final boolean shouldHideSoftInput = (mCurMethod != null) && (mInputShown || + (mImeWindowVis & InputMethodService.IME_ACTIVE) != 0); boolean res; - if ((mImeWindowVis & InputMethodService.IME_ACTIVE) != 0 && mCurMethod != null) { + if (shouldHideSoftInput) { + // The IME will report its visible state again after the following message finally + // delivered to the IME process as an IPC. Hence the inconsistency between + // IMMS#mInputShown and IMMS#mImeWindowVis should be resolved spontaneously in + // the final state. executeOrSendMessage(mCurMethod, mCaller.obtainMessageOO( MSG_HIDE_SOFT_INPUT, mCurMethod, resultReceiver)); res = true; diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index c76fc1c2a123..61bedf5d6bd7 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -16,6 +16,7 @@ package com.android.server; +import android.content.pm.PackageManagerInternal; import com.android.internal.content.PackageMonitor; import com.android.internal.location.ProviderProperties; import com.android.internal.location.ProviderRequest; @@ -218,6 +219,19 @@ public class LocationManagerService extends ILocationManager.Stub { mContext = context; mAppOps = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE); + // Let the package manager query which are the default location + // providers as they get certain permissions granted by default. + PackageManagerInternal packageManagerInternal = LocalServices.getService( + PackageManagerInternal.class); + packageManagerInternal.setLocationPackagesProvider( + new PackageManagerInternal.PackagesProvider() { + @Override + public String[] getPackages(int userId) { + return mContext.getResources().getStringArray( + com.android.internal.R.array.config_locationProviderPackageNames); + } + }); + if (D) Log.d(TAG, "Constructed"); // most startup is deferred until systemReady() @@ -1958,6 +1972,27 @@ public class LocationManagerService extends ILocationManager.Stub { return p.getProperties(); } + /** + * @return null if the provider does not exist + * @throws SecurityException if the provider is not allowed to be + * accessed by the caller + */ + @Override + public String getNetworkProviderPackage() { + LocationProviderInterface p; + synchronized (mLock) { + if (mProvidersByName.get(LocationManager.NETWORK_PROVIDER) == null) { + return null; + } + p = mProvidersByName.get(LocationManager.NETWORK_PROVIDER); + } + + if (p instanceof LocationProviderProxy) { + return ((LocationProviderProxy) p).getConnectedPackageName(); + } + return null; + } + @Override public boolean isProviderEnabled(String provider) { // Fused provider is accessed indirectly via criteria rather than the provider-based APIs, diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java index a1e2a54fbadd..baa55e721a28 100644 --- a/services/core/java/com/android/server/NetworkManagementService.java +++ b/services/core/java/com/android/server/NetworkManagementService.java @@ -19,6 +19,15 @@ package com.android.server; import static android.Manifest.permission.CONNECTIVITY_INTERNAL; import static android.Manifest.permission.DUMP; import static android.Manifest.permission.SHUTDOWN; +import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_DOZABLE; +import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_DOZABLE; +import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_NONE; +import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_STANDBY; +import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NONE; +import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_STANDBY; +import static android.net.NetworkPolicyManager.FIREWALL_RULE_DEFAULT; +import static android.net.NetworkPolicyManager.FIREWALL_TYPE_BLACKLIST; +import static android.net.NetworkPolicyManager.FIREWALL_TYPE_WHITELIST; import static android.net.NetworkStats.SET_DEFAULT; import static android.net.NetworkStats.TAG_ALL; import static android.net.NetworkStats.TAG_NONE; @@ -35,6 +44,7 @@ import static com.android.server.NetworkManagementService.NetdResponseCode.Tethe import static com.android.server.NetworkManagementService.NetdResponseCode.TtyListResult; import static com.android.server.NetworkManagementSocketTagger.PROP_QTAGUID_ENABLED; +import android.annotation.NonNull; import android.app.ActivityManagerNative; import android.content.Context; import android.net.ConnectivityManager; @@ -192,6 +202,21 @@ public class NetworkManagementService extends INetworkManagementService.Stub /** Set of UIDs that are to be blocked/allowed by firewall controller. */ @GuardedBy("mQuotaLock") private SparseIntArray mUidFirewallRules = new SparseIntArray(); + /** + * Set of UIDs that are to be blocked/allowed by firewall controller. This set of Ids matches + * to application idles. + */ + @GuardedBy("mQuotaLock") + private SparseIntArray mUidFirewallStandbyRules = new SparseIntArray(); + /** + * Set of UIDs that are to be blocked/allowed by firewall controller. This set of Ids matches + * to device idles. + */ + @GuardedBy("mQuotaLock") + private SparseIntArray mUidFirewallDozableRules = new SparseIntArray(); + + private boolean mStandbyChainEnabled = false; + private boolean mDozableChainEnabled = false; private Object mIdleTimerLock = new Object(); /** Set of interfaces with active idle timers. */ @@ -282,6 +307,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub } public void systemReady() { + // init firewall states + mDozableChainEnabled = false; + mStandbyChainEnabled = true; prepareNativeDaemon(); if (DBG) Slog.d(TAG, "Prepared"); } @@ -568,9 +596,38 @@ public class NetworkManagementService extends INetworkManagementService.Stub final SparseIntArray uidFirewallRules = mUidFirewallRules; mUidFirewallRules = new SparseIntArray(); for (int i = 0; i < uidFirewallRules.size(); i++) { - setFirewallUidRule(uidFirewallRules.keyAt(i), uidFirewallRules.valueAt(i)); + setFirewallUidRuleInternal(FIREWALL_CHAIN_NONE, uidFirewallRules.keyAt(i), + uidFirewallRules.valueAt(i)); + } + } + + size = mUidFirewallStandbyRules.size(); + if (size > 0) { + Slog.d(TAG, "Pushing " + size + " active firewall standby UID rules"); + final SparseIntArray uidFirewallRules = mUidFirewallStandbyRules; + mUidFirewallStandbyRules = new SparseIntArray(); + for (int i = 0; i < uidFirewallRules.size(); i++) { + setFirewallUidRuleInternal(FIREWALL_CHAIN_STANDBY, uidFirewallRules.keyAt(i), + uidFirewallRules.valueAt(i)); + } + } + if (mStandbyChainEnabled) { + setFirewallChainEnabled(FIREWALL_CHAIN_STANDBY, true); + } + + size = mUidFirewallDozableRules.size(); + if (size > 0) { + Slog.d(TAG, "Pushing " + size + " active firewall dozable UID rules"); + final SparseIntArray uidFirewallRules = mUidFirewallDozableRules; + mUidFirewallDozableRules = new SparseIntArray(); + for (int i = 0; i < uidFirewallRules.size(); i++) { + setFirewallUidRuleInternal(FIREWALL_CHAIN_DOZABLE, uidFirewallRules.keyAt(i), + uidFirewallRules.valueAt(i)); } } + if (mDozableChainEnabled) { + setFirewallChainEnabled(FIREWALL_CHAIN_DOZABLE, true); + } } } @@ -1954,13 +2011,78 @@ public class NetworkManagementService extends INetworkManagementService.Stub } @Override - public void setFirewallUidRule(int uid, int rule) { + public void setFirewallChainEnabled(int chain, boolean enable) { enforceSystemUid(); - if (rule == NetworkPolicyManager.FIREWALL_RULE_ALLOW) { - Preconditions.checkState(mFirewallEnabled); + final String operation = enable ? "enable_chain" : "disable_chain"; + try { + String chainName; + switch(chain) { + case FIREWALL_CHAIN_STANDBY: + chainName = FIREWALL_CHAIN_NAME_STANDBY; + mStandbyChainEnabled = enable; + break; + case FIREWALL_CHAIN_DOZABLE: + chainName = FIREWALL_CHAIN_NAME_DOZABLE; + mDozableChainEnabled = enable; + break; + default: + throw new IllegalArgumentException("Bad child chain: " + chain); + } + mConnector.execute("firewall", operation, chainName); + } catch (NativeDaemonConnectorException e) { + throw e.rethrowAsParcelableException(); } + } + + private int getFirewallType(int chain) { + switch (chain) { + case FIREWALL_CHAIN_STANDBY: + return FIREWALL_TYPE_BLACKLIST; + case FIREWALL_CHAIN_DOZABLE: + return FIREWALL_TYPE_WHITELIST; + default: + return isFirewallEnabled() ? FIREWALL_TYPE_WHITELIST : FIREWALL_TYPE_BLACKLIST; + } + } + + @Override + public void setFirewallUidRules(int chain, int[] uids, int[] rules) { + enforceSystemUid(); + SparseIntArray uidFirewallRules = getUidFirewallRules(chain); + SparseIntArray newRules = new SparseIntArray(); + // apply new set of rules + for (int index = uids.length - 1; index >= 0; --index) { + int uid = uids[index]; + int rule = rules[index]; + setFirewallUidRule(chain, uid, rule); + newRules.put(uid, rule); + } + // collect the rules to remove. + SparseIntArray rulesToRemove = new SparseIntArray(); + for (int index = uidFirewallRules.size() - 1; index >= 0; --index) { + int uid = uidFirewallRules.keyAt(index); + if (newRules.indexOfKey(uid) < 0) { + rulesToRemove.put(uid, FIREWALL_RULE_DEFAULT); + } + } + // remove dead rules + for (int index = rulesToRemove.size() - 1; index >= 0; --index) { + int uid = rulesToRemove.keyAt(index); + setFirewallUidRuleInternal(chain, uid, FIREWALL_RULE_DEFAULT); + } + } + + @Override + public void setFirewallUidRule(int chain, int uid, int rule) { + enforceSystemUid(); + setFirewallUidRuleInternal(chain, uid, rule); + } + + private void setFirewallUidRuleInternal(int chain, int uid, int rule) { synchronized (mQuotaLock) { - final int oldUidFirewallRule = mUidFirewallRules.get(uid); + SparseIntArray uidFirewallRules = getUidFirewallRules(chain); + + final int oldUidFirewallRule = uidFirewallRules.get(uid, FIREWALL_RULE_DEFAULT); if (DBG) { Slog.d(TAG, "oldRule = " + oldUidFirewallRule + ", newRule=" + rule + " for uid=" + uid); @@ -1973,7 +2095,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub try { String ruleName; - if (isFirewallEnabled()) { // Whitelist mode + if (getFirewallType(chain) == FIREWALL_TYPE_WHITELIST) { if (rule == NetworkPolicyManager.FIREWALL_RULE_ALLOW) { ruleName = "allow"; } else { @@ -1988,17 +2110,44 @@ public class NetworkManagementService extends INetworkManagementService.Stub } if (rule == NetworkPolicyManager.FIREWALL_RULE_DEFAULT) { - mUidFirewallRules.delete(uid); + uidFirewallRules.delete(uid); } else { - mUidFirewallRules.put(uid, rule); + uidFirewallRules.put(uid, rule); } - mConnector.execute("firewall", "set_uid_rule", uid, ruleName); + mConnector.execute("firewall", "set_uid_rule", getFirewallChainName(chain), uid, + ruleName); } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); } } } + private @NonNull SparseIntArray getUidFirewallRules(int chain) { + switch (chain) { + case FIREWALL_CHAIN_STANDBY: + return mUidFirewallStandbyRules; + case FIREWALL_CHAIN_DOZABLE: + return mUidFirewallDozableRules; + case FIREWALL_CHAIN_NONE: + return mUidFirewallRules; + default: + throw new IllegalArgumentException("Unknown chain:" + chain); + } + } + + public @NonNull String getFirewallChainName(int chain) { + switch (chain) { + case FIREWALL_CHAIN_STANDBY: + return FIREWALL_CHAIN_NAME_STANDBY; + case FIREWALL_CHAIN_DOZABLE: + return FIREWALL_CHAIN_NAME_DOZABLE; + case FIREWALL_CHAIN_NONE: + return FIREWALL_CHAIN_NAME_NONE; + default: + throw new IllegalArgumentException("Unknown chain:" + chain); + } + } + private static void enforceSystemUid() { final int uid = Binder.getCallingUid(); if (uid != Process.SYSTEM_UID) { @@ -2123,6 +2272,32 @@ public class NetworkManagementService extends INetworkManagementService.Stub pw.println("]"); } + pw.println("UID firewall standby chain enabled: " + mStandbyChainEnabled); + synchronized (mUidFirewallStandbyRules) { + pw.print("UID firewall standby rule: ["); + final int size = mUidFirewallStandbyRules.size(); + for (int i = 0; i < size; i++) { + pw.print(mUidFirewallStandbyRules.keyAt(i)); + pw.print(":"); + pw.print(mUidFirewallStandbyRules.valueAt(i)); + if (i < size - 1) pw.print(","); + } + pw.println("]"); + } + + pw.println("UID firewall dozable chain enabled: " + mDozableChainEnabled); + synchronized (mUidFirewallDozableRules) { + pw.print("UID firewall dozable rule: ["); + final int size = mUidFirewallDozableRules.size(); + for (int i = 0; i < size; i++) { + pw.print(mUidFirewallDozableRules.keyAt(i)); + pw.print(":"); + pw.print(mUidFirewallDozableRules.valueAt(i)); + if (i < size - 1) pw.print(","); + } + pw.println("]"); + } + synchronized (mIdleTimerLock) { pw.println("Idle timers:"); for (HashMap.Entry<String, IdleTimerParams> ent : mActiveIdleTimers.entrySet()) { diff --git a/services/core/java/com/android/server/PersistentDataBlockService.java b/services/core/java/com/android/server/PersistentDataBlockService.java index 56f9942cb784..94316fe826e0 100644 --- a/services/core/java/com/android/server/PersistentDataBlockService.java +++ b/services/core/java/com/android/server/PersistentDataBlockService.java @@ -18,18 +18,14 @@ package com.android.server; import android.Manifest; import android.app.ActivityManager; -import android.app.PendingIntent; import android.content.Context; -import android.content.Intent; import android.content.pm.PackageManager; import android.os.Binder; -import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.os.SystemProperties; import android.os.UserHandle; import android.service.persistentdata.IPersistentDataBlockService; -import android.service.persistentdata.PersistentDataBlockManager; import android.util.Slog; import com.android.internal.R; @@ -432,29 +428,6 @@ public class PersistentDataBlockService extends SystemService { } @Override - public void wipeIfAllowed(Bundle bundle, PendingIntent pi) { - // Should only be called by owner - if (UserHandle.getCallingUserId() != UserHandle.USER_OWNER) { - throw new SecurityException("Only the Owner is allowed to wipe"); - } - // Caller must be able to query the the state of the PersistentDataBlock - enforcePersistentDataBlockAccess(); - String allowedPackage = mContext.getResources() - .getString(R.string.config_persistentDataPackageName); - Intent intent = new Intent(); - intent.setPackage(allowedPackage); - intent.setAction(PersistentDataBlockManager.ACTION_WIPE_IF_ALLOWED); - intent.putExtras(bundle); - intent.putExtra(PersistentDataBlockManager.EXTRA_WIPE_IF_ALLOWED_CALLBACK, pi); - long id = Binder.clearCallingIdentity(); - try { - mContext.sendBroadcastAsUser(intent, UserHandle.OWNER); - } finally { - restoreCallingIdentity(id); - } - } - - @Override public void setOemUnlockEnabled(boolean enabled) { // do not allow monkey to flip the flag if (ActivityManager.isUserAMonkey()) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index c4f460e66feb..030163829059 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -676,9 +676,9 @@ public final class ActivityManagerService extends ActivityManagerNative final SparseArray<UidRecord> mActiveUids = new SparseArray<>(); /** - * Which uses have been started, so are allowed to run code. + * Which users have been started, so are allowed to run code. */ - final SparseArray<UserStartedState> mStartedUsers = new SparseArray<>(); + final SparseArray<UserState> mStartedUsers = new SparseArray<>(); /** * LRU list of history of current users. Most recently current is at the end. @@ -1781,15 +1781,15 @@ public final class ActivityManagerService extends ActivityManagerNative break; } case REPORT_USER_SWITCH_MSG: { - dispatchUserSwitch((UserStartedState) msg.obj, msg.arg1, msg.arg2); + dispatchUserSwitch((UserState) msg.obj, msg.arg1, msg.arg2); break; } case CONTINUE_USER_SWITCH_MSG: { - continueUserSwitch((UserStartedState) msg.obj, msg.arg1, msg.arg2); + continueUserSwitch((UserState) msg.obj, msg.arg1, msg.arg2); break; } case USER_SWITCH_TIMEOUT_MSG: { - timeoutUserSwitch((UserStartedState) msg.obj, msg.arg1, msg.arg2); + timeoutUserSwitch((UserState) msg.obj, msg.arg1, msg.arg2); break; } case IMMERSIVE_MODE_LOCK_MSG: { @@ -2309,7 +2309,7 @@ public final class ActivityManagerService extends ActivityManagerNative mGrantFile = new AtomicFile(new File(systemDir, "urigrants.xml")); // User 0 is the first and only user that runs at boot. - mStartedUsers.put(UserHandle.USER_OWNER, new UserStartedState(UserHandle.OWNER, true)); + mStartedUsers.put(UserHandle.USER_OWNER, new UserState(UserHandle.OWNER, true)); mUserLru.add(UserHandle.USER_OWNER); updateStartedUserArrayLocked(); @@ -2488,10 +2488,7 @@ public final class ActivityManagerService extends ActivityManagerNative synchronized(bstats) { synchronized(mPidsSelfLocked) { if (haveNewCpuStats) { - final int perc = bstats.startAddingCpuLocked(); - if (perc >= 0) { - int remainUTime = 0; - int remainSTime = 0; + if (bstats.startAddingCpuLocked()) { int totalUTime = 0; int totalSTime = 0; final int N = mProcessCpuTracker.countStats(); @@ -2501,10 +2498,6 @@ public final class ActivityManagerService extends ActivityManagerNative continue; } ProcessRecord pr = mPidsSelfLocked.get(st.pid); - int otherUTime = (st.rel_utime*perc)/100; - int otherSTime = (st.rel_stime*perc)/100; - remainUTime += otherUTime; - remainSTime += otherSTime; totalUTime += st.rel_utime; totalSTime += st.rel_stime; if (pr != null) { @@ -2513,8 +2506,7 @@ public final class ActivityManagerService extends ActivityManagerNative pr.curProcBatteryStats = ps = bstats.getProcessStatsLocked( pr.info.uid, pr.processName); } - ps.addCpuTimeLocked(st.rel_utime - otherUTime, - st.rel_stime - otherSTime); + ps.addCpuTimeLocked(st.rel_utime, st.rel_stime); pr.curCpuTime += st.rel_utime + st.rel_stime; } else { BatteryStatsImpl.Uid.Proc ps = st.batteryStats; @@ -2522,8 +2514,7 @@ public final class ActivityManagerService extends ActivityManagerNative st.batteryStats = ps = bstats.getProcessStatsLocked( bstats.mapUid(st.uid), st.name); } - ps.addCpuTimeLocked(st.rel_utime - otherUTime, - st.rel_stime - otherSTime); + ps.addCpuTimeLocked(st.rel_utime, st.rel_stime); } } final int userTime = mProcessCpuTracker.getLastUserTime(); @@ -2532,9 +2523,8 @@ public final class ActivityManagerService extends ActivityManagerNative final int irqTime = mProcessCpuTracker.getLastIrqTime(); final int softIrqTime = mProcessCpuTracker.getLastSoftIrqTime(); final int idleTime = mProcessCpuTracker.getLastIdleTime(); - bstats.finishAddingCpuLocked(perc, remainUTime, - remainSTime, totalUTime, totalSTime, userTime, systemTime, - iowaitTime, irqTime, softIrqTime, idleTime); + bstats.finishAddingCpuLocked(totalUTime, totalSTime, userTime, + systemTime, iowaitTime, irqTime, softIrqTime, idleTime); } } } @@ -2754,13 +2744,19 @@ public final class ActivityManagerService extends ActivityManagerNative return index; } + private static void killProcessGroup(int uid, int pid) { + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "killProcessGroup"); + Process.killProcessGroup(uid, pid); + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); + } + final void removeLruProcessLocked(ProcessRecord app) { int lrui = mLruProcesses.lastIndexOf(app); if (lrui >= 0) { if (!app.killed) { Slog.wtfStack(TAG, "Removing process that hasn't been killed: " + app); Process.killProcessQuiet(app.pid); - Process.killProcessGroup(app.info.uid, app.pid); + killProcessGroup(app.info.uid, app.pid); } if (lrui <= mLruProcessActivityStart) { mLruProcessActivityStart--; @@ -3125,7 +3121,7 @@ public final class ActivityManagerService extends ActivityManagerNative // clean it up now. if (DEBUG_PROCESSES || DEBUG_CLEANUP) Slog.v(TAG_PROCESSES, "App died: " + app); checkTime(startTime, "startProcess: bad proc running, killing"); - Process.killProcessGroup(app.info.uid, app.pid); + killProcessGroup(app.info.uid, app.pid); handleAppDiedLocked(app, true, true); checkTime(startTime, "startProcess: done killing old proc"); } @@ -3274,9 +3270,9 @@ public final class ActivityManagerService extends ActivityManagerNative debugFlags |= Zygote.DEBUG_ENABLE_JIT; } } - String genCFIDebugProperty = SystemProperties.get("debug.gencfi"); - if ("true".equals(genCFIDebugProperty)) { - debugFlags |= Zygote.DEBUG_GENERATE_CFI; + String genDebugInfoProperty = SystemProperties.get("debug.generate-debug-info"); + if ("true".equals(genDebugInfoProperty)) { + debugFlags |= Zygote.DEBUG_GENERATE_DEBUG_INFO; } if ("1".equals(SystemProperties.get("debug.jni.logging"))) { debugFlags |= Zygote.DEBUG_ENABLE_JNI_LOGGING; @@ -3589,6 +3585,8 @@ public final class ActivityManagerService extends ActivityManagerNative @Override public int getPackageProcessState(String packageName) { + enforceCallingPermission(android.Manifest.permission.GET_PACKAGE_IMPORTANCE, + "getPackageProcessState"); int procState = ActivityManager.PROCESS_STATE_NONEXISTENT; synchronized (this) { for (int i=mLruProcesses.size()-1; i>=0; i--) { @@ -4611,7 +4609,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (!fromBinderDied) { Process.killProcessQuiet(pid); } - Process.killProcessGroup(app.info.uid, pid); + killProcessGroup(app.info.uid, pid); app.killed = true; } @@ -5932,7 +5930,7 @@ public final class ActivityManagerService extends ActivityManagerNative EventLog.writeEvent(EventLogTags.AM_DROP_PROCESS, pid); if (pid > 0 && pid != MY_PID) { Process.killProcessQuiet(pid); - //TODO: Process.killProcessGroup(app.info.uid, pid); + //TODO: killProcessGroup(app.info.uid, pid); } else { try { thread.scheduleExit(); @@ -6313,9 +6311,9 @@ public final class ActivityManagerService extends ActivityManagerNative SystemProperties.set("dev.bootcomplete", "1"); } for (int i=0; i<mStartedUsers.size(); i++) { - UserStartedState uss = mStartedUsers.valueAt(i); - if (uss.mState == UserStartedState.STATE_BOOTING) { - uss.mState = UserStartedState.STATE_RUNNING; + UserState uss = mStartedUsers.valueAt(i); + if (uss.mState == UserState.STATE_BOOTING) { + uss.mState = UserState.STATE_RUNNING; final int userId = mStartedUsers.keyAt(i); Intent intent = new Intent(Intent.ACTION_BOOT_COMPLETED, null); intent.putExtra(Intent.EXTRA_USER_HANDLE, userId); @@ -8278,7 +8276,7 @@ public final class ActivityManagerService extends ActivityManagerNative try { if (AppGlobals.getPackageManager().isUidPrivileged(callingUid)) { allowed = true; - Slog.w(TAG, caller + ": caller " + callingUid + if (DEBUG_TASKS) Slog.w(TAG, caller + ": caller " + callingUid + " is using old GET_TASKS but privileged; allowing"); } } catch (RemoteException e) { @@ -8286,7 +8284,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } if (!allowed) { - Slog.w(TAG, caller + ": caller " + callingUid + if (DEBUG_TASKS) Slog.w(TAG, caller + ": caller " + callingUid + " does not hold REAL_GET_TASKS; limiting output"); } return allowed; @@ -9442,6 +9440,7 @@ public final class ActivityManagerService extends ActivityManagerNative } checkTime(startTime, "getContentProviderImpl: before updateOomAdj"); boolean success = updateOomAdjLocked(cpr.proc); + maybeUpdateProviderUsageStatsLocked(r, cpr.info.packageName, name); checkTime(startTime, "getContentProviderImpl: after updateOomAdj"); if (DEBUG_PROVIDER) Slog.i(TAG_PROVIDER, "Adjust success: " + success); // NOTE: there is still a race here where a signal could be @@ -9831,6 +9830,8 @@ public final class ActivityManagerService extends ActivityManagerNative dst.notifyAll(); } updateOomAdjLocked(r); + maybeUpdateProviderUsageStatsLocked(r, src.info.packageName, + src.info.authority); } } @@ -12397,7 +12398,7 @@ public final class ActivityManagerService extends ActivityManagerNative } else { // Huh. Process.killProcess(pid); - Process.killProcessGroup(uid, pid); + killProcessGroup(uid, pid); } } return; @@ -13343,7 +13344,7 @@ public final class ActivityManagerService extends ActivityManagerNative needSep = false; pw.println(" mStartedUsers:"); for (int i=0; i<mStartedUsers.size(); i++) { - UserStartedState uss = mStartedUsers.valueAt(i); + UserState uss = mStartedUsers.valueAt(i); pw.print(" User #"); pw.print(uss.mHandle.getIdentifier()); pw.print(": "); uss.dump("", pw); } @@ -18615,6 +18616,22 @@ public final class ActivityManagerService extends ActivityManagerNative uidRec.pendingChange.processState = uidRec.setProcState; } + private void maybeUpdateProviderUsageStatsLocked(ProcessRecord app, String providerPkgName, + String authority) { + if (app == null) return; + if (app.curProcState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) { + UserState userState = mStartedUsers.get(app.userId); + if (userState == null) return; + final long now = SystemClock.elapsedRealtime(); + Long lastReported = userState.mProviderLastReportedFg.get(authority); + if (lastReported == null || lastReported < now - 60 * 1000L) { + mUsageStatsService.reportContentProviderUsage( + authority, providerPkgName, app.userId); + userState.mProviderLastReportedFg.put(authority, now); + } + } + } + private void maybeUpdateUsageStatsLocked(ProcessRecord app) { if (DEBUG_USAGE_STATS) { Slog.d(TAG, "Checking proc [" + Arrays.toString(app.getPackageList()) @@ -19602,7 +19619,7 @@ public final class ActivityManagerService extends ActivityManagerNative // If the user we are switching to is not currently started, then // we need to start it now. if (mStartedUsers.get(userId) == null) { - mStartedUsers.put(userId, new UserStartedState(new UserHandle(userId), false)); + mStartedUsers.put(userId, new UserState(new UserHandle(userId), false)); updateStartedUserArrayLocked(); needStart = true; } @@ -19627,26 +19644,26 @@ public final class ActivityManagerService extends ActivityManagerNative mUserLru.add(currentUserIdInt); } - final UserStartedState uss = mStartedUsers.get(userId); + final UserState uss = mStartedUsers.get(userId); // Make sure user is in the started state. If it is currently // stopping, we need to knock that off. - if (uss.mState == UserStartedState.STATE_STOPPING) { + if (uss.mState == UserState.STATE_STOPPING) { // If we are stopping, we haven't sent ACTION_SHUTDOWN, // so we can just fairly silently bring the user back from // the almost-dead. - uss.mState = UserStartedState.STATE_RUNNING; + uss.mState = UserState.STATE_RUNNING; updateStartedUserArrayLocked(); needStart = true; - } else if (uss.mState == UserStartedState.STATE_SHUTDOWN) { + } else if (uss.mState == UserState.STATE_SHUTDOWN) { // This means ACTION_SHUTDOWN has been sent, so we will // need to treat this as a new boot of the user. - uss.mState = UserStartedState.STATE_BOOTING; + uss.mState = UserState.STATE_BOOTING; updateStartedUserArrayLocked(); needStart = true; } - if (uss.mState == UserStartedState.STATE_BOOTING) { + if (uss.mState == UserState.STATE_BOOTING) { // Booting up a new user, need to tell system services about it. // Note that this is on the same handler as scheduling of broadcasts, // which is important because it needs to go first. @@ -19784,7 +19801,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } - void dispatchUserSwitch(final UserStartedState uss, final int oldUserId, + void dispatchUserSwitch(final UserState uss, final int oldUserId, final int newUserId) { final int N = mUserSwitchObservers.beginBroadcast(); if (N > 0) { @@ -19821,21 +19838,21 @@ public final class ActivityManagerService extends ActivityManagerNative mUserSwitchObservers.finishBroadcast(); } - void timeoutUserSwitch(UserStartedState uss, int oldUserId, int newUserId) { + void timeoutUserSwitch(UserState uss, int oldUserId, int newUserId) { synchronized (this) { Slog.w(TAG, "User switch timeout: from " + oldUserId + " to " + newUserId); sendContinueUserSwitchLocked(uss, oldUserId, newUserId); } } - void sendContinueUserSwitchLocked(UserStartedState uss, int oldUserId, int newUserId) { + void sendContinueUserSwitchLocked(UserState uss, int oldUserId, int newUserId) { mCurUserSwitchCallback = null; mHandler.removeMessages(USER_SWITCH_TIMEOUT_MSG); mHandler.sendMessage(mHandler.obtainMessage(CONTINUE_USER_SWITCH_MSG, oldUserId, newUserId, uss)); } - void onUserInitialized(UserStartedState uss, boolean foreground, int oldUserId, int newUserId) { + void onUserInitialized(UserState uss, boolean foreground, int oldUserId, int newUserId) { synchronized (this) { if (foreground) { moveUserToForeground(uss, oldUserId, newUserId); @@ -19845,7 +19862,7 @@ public final class ActivityManagerService extends ActivityManagerNative completeSwitchAndInitalize(uss, newUserId, true, false); } - void moveUserToForeground(UserStartedState uss, int oldUserId, int newUserId) { + void moveUserToForeground(UserState uss, int oldUserId, int newUserId) { boolean homeInFront = mStackSupervisor.switchUserLocked(newUserId, uss); if (homeInFront) { startHomeActivityLocked(newUserId, "moveUserToFroreground"); @@ -19857,11 +19874,11 @@ public final class ActivityManagerService extends ActivityManagerNative sendUserSwitchBroadcastsLocked(oldUserId, newUserId); } - void continueUserSwitch(UserStartedState uss, int oldUserId, int newUserId) { + void continueUserSwitch(UserState uss, int oldUserId, int newUserId) { completeSwitchAndInitalize(uss, newUserId, false, true); } - void completeSwitchAndInitalize(UserStartedState uss, int newUserId, + void completeSwitchAndInitalize(UserState uss, int newUserId, boolean clearInitializing, boolean clearSwitching) { boolean unfrozen = false; synchronized (this) { @@ -19898,10 +19915,10 @@ public final class ActivityManagerService extends ActivityManagerNative final int num = mUserLru.size(); for (int i = 0; i < num; i++) { Integer oldUserId = mUserLru.get(i); - UserStartedState oldUss = mStartedUsers.get(oldUserId); + UserState oldUss = mStartedUsers.get(oldUserId); if (oldUserId == UserHandle.USER_OWNER || oldUserId == mCurrentUserId - || oldUss.mState == UserStartedState.STATE_STOPPING - || oldUss.mState == UserStartedState.STATE_SHUTDOWN) { + || oldUss.mState == UserState.STATE_STOPPING + || oldUss.mState == UserState.STATE_SHUTDOWN) { continue; } UserInfo userInfo = mUserManager.getUserInfo(oldUserId); @@ -19942,11 +19959,11 @@ public final class ActivityManagerService extends ActivityManagerNative } } - void finishUserBoot(UserStartedState uss) { + void finishUserBoot(UserState uss) { synchronized (this) { - if (uss.mState == UserStartedState.STATE_BOOTING + if (uss.mState == UserState.STATE_BOOTING && mStartedUsers.get(uss.mHandle.getIdentifier()) == uss) { - uss.mState = UserStartedState.STATE_RUNNING; + uss.mState = UserState.STATE_RUNNING; final int userId = uss.mHandle.getIdentifier(); Intent intent = new Intent(Intent.ACTION_BOOT_COMPLETED, null); intent.putExtra(Intent.EXTRA_USER_HANDLE, userId); @@ -19959,7 +19976,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } - void finishUserSwitch(UserStartedState uss) { + void finishUserSwitch(UserState uss) { synchronized (this) { finishUserBoot(uss); @@ -19969,15 +19986,15 @@ public final class ActivityManagerService extends ActivityManagerNative int i = 0; while (num > MAX_RUNNING_USERS && i < mUserLru.size()) { Integer oldUserId = mUserLru.get(i); - UserStartedState oldUss = mStartedUsers.get(oldUserId); + UserState oldUss = mStartedUsers.get(oldUserId); if (oldUss == null) { // Shouldn't happen, but be sane if it does. mUserLru.remove(i); num--; continue; } - if (oldUss.mState == UserStartedState.STATE_STOPPING - || oldUss.mState == UserStartedState.STATE_SHUTDOWN) { + if (oldUss.mState == UserState.STATE_STOPPING + || oldUss.mState == UserState.STATE_SHUTDOWN) { // This user is already stopping, doesn't count. num--; i++; @@ -20022,7 +20039,7 @@ public final class ActivityManagerService extends ActivityManagerNative return ActivityManager.USER_OP_IS_CURRENT; } - final UserStartedState uss = mStartedUsers.get(userId); + final UserState uss = mStartedUsers.get(userId); if (uss == null) { // User is not started, nothing to do... but we do need to // callback if requested. @@ -20044,9 +20061,9 @@ public final class ActivityManagerService extends ActivityManagerNative uss.mStopCallbacks.add(callback); } - if (uss.mState != UserStartedState.STATE_STOPPING - && uss.mState != UserStartedState.STATE_SHUTDOWN) { - uss.mState = UserStartedState.STATE_STOPPING; + if (uss.mState != UserState.STATE_STOPPING + && uss.mState != UserState.STATE_SHUTDOWN) { + uss.mState = UserState.STATE_STOPPING; updateStartedUserArrayLocked(); long ident = Binder.clearCallingIdentity(); @@ -20074,11 +20091,11 @@ public final class ActivityManagerService extends ActivityManagerNative Bundle extras, boolean ordered, boolean sticky, int sendingUser) { // On to the next. synchronized (ActivityManagerService.this) { - if (uss.mState != UserStartedState.STATE_STOPPING) { + if (uss.mState != UserState.STATE_STOPPING) { // Whoops, we are being started back up. Abort, abort! return; } - uss.mState = UserStartedState.STATE_SHUTDOWN; + uss.mState = UserState.STATE_SHUTDOWN; } mBatteryStatsService.noteEvent( BatteryStats.HistoryItem.EVENT_USER_RUNNING_FINISH, @@ -20102,7 +20119,7 @@ public final class ActivityManagerService extends ActivityManagerNative return ActivityManager.USER_OP_SUCCESS; } - void finishUserStop(UserStartedState uss) { + void finishUserStop(UserState uss) { final int userId = uss.mHandle.getIdentifier(); boolean stopped; ArrayList<IStopUserCallback> callbacks; @@ -20110,7 +20127,7 @@ public final class ActivityManagerService extends ActivityManagerNative callbacks = new ArrayList<IStopUserCallback>(uss.mStopCallbacks); if (mStartedUsers.get(userId) != uss) { stopped = false; - } else if (uss.mState != UserStartedState.STATE_SHUTDOWN) { + } else if (uss.mState != UserState.STATE_SHUTDOWN) { stopped = false; } else { stopped = true; @@ -20184,15 +20201,15 @@ public final class ActivityManagerService extends ActivityManagerNative } boolean isUserRunningLocked(int userId, boolean orStopped) { - UserStartedState state = mStartedUsers.get(userId); + UserState state = mStartedUsers.get(userId); if (state == null) { return false; } if (orStopped) { return true; } - return state.mState != UserStartedState.STATE_STOPPING - && state.mState != UserStartedState.STATE_SHUTDOWN; + return state.mState != UserState.STATE_STOPPING + && state.mState != UserState.STATE_SHUTDOWN; } @Override @@ -20214,19 +20231,19 @@ public final class ActivityManagerService extends ActivityManagerNative private void updateStartedUserArrayLocked() { int num = 0; for (int i=0; i<mStartedUsers.size(); i++) { - UserStartedState uss = mStartedUsers.valueAt(i); + UserState uss = mStartedUsers.valueAt(i); // This list does not include stopping users. - if (uss.mState != UserStartedState.STATE_STOPPING - && uss.mState != UserStartedState.STATE_SHUTDOWN) { + if (uss.mState != UserState.STATE_STOPPING + && uss.mState != UserState.STATE_SHUTDOWN) { num++; } } mStartedUserArray = new int[num]; num = 0; for (int i=0; i<mStartedUsers.size(); i++) { - UserStartedState uss = mStartedUsers.valueAt(i); - if (uss.mState != UserStartedState.STATE_STOPPING - && uss.mState != UserStartedState.STATE_SHUTDOWN) { + UserState uss = mStartedUsers.valueAt(i); + if (uss.mState != UserState.STATE_STOPPING + && uss.mState != UserState.STATE_SHUTDOWN) { mStartedUserArray[num] = mStartedUsers.keyAt(i); num++; } diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index eb5af9e56d5c..0714d36eb5ed 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -1326,7 +1326,12 @@ final class ActivityStack { if (r != starting) { mStackSupervisor.startSpecificActivityLocked( r, noStackActivityResumed, false); - noStackActivityResumed = false; + if (activityNdx >= activities.size()) { + // Record may be removed if its process needs to restart. + activityNdx = activities.size() - 1; + } else { + noStackActivityResumed = false; + } } } else if (r.visible) { diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 9e33f2a99607..f967aef449a4 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -233,10 +233,10 @@ public final class ActivityStackSupervisor implements DisplayListener { final ArrayList<ActivityRecord> mGoingToSleepActivities = new ArrayList<>(); /** Used on user changes */ - final ArrayList<UserStartedState> mStartingUsers = new ArrayList<>(); + final ArrayList<UserState> mStartingUsers = new ArrayList<>(); /** Used to queue up any background users being started */ - final ArrayList<UserStartedState> mStartingBackgroundUsers = new ArrayList<>(); + final ArrayList<UserState> mStartingBackgroundUsers = new ArrayList<>(); /** Set to indicate whether to issue an onUserLeaving callback when a newly launched activity * is being brought in front of us. */ @@ -883,8 +883,18 @@ public final class ActivityStackSupervisor implements DisplayListener { void startHomeActivity(Intent intent, ActivityInfo aInfo, String reason) { moveHomeStackTaskToTop(HOME_ACTIVITY_TYPE, reason); - startActivityLocked(null, intent, null, aInfo, null, null, null, null, 0, 0, 0, null, - 0, 0, 0, null, false, null, null, null); + startActivityLocked(null /* caller */, intent, null /* resolvedType */, aInfo, + null /* voiceSession */, null /* voiceInteractor */, null /* resultTo */, + null /* resultWho */, 0 /* requestCode */, 0 /* callingPid */, 0 /* callingUid */, + null /* callingPackage */, 0 /* realCallingPid */, 0 /* realCallingUid */, + 0 /* startFlags */, null /* options */, false /* componentSpecified */, + null /* outActivity */, null /* container */, null /* inTask */); + if (inResumeTopActivity) { + // If we are in resume section already, home activity will be initialized, but not + // resumed (to avoid recursive resume) and will stay that way until something pokes it + // again. We need to schedule another resume. + scheduleResumeTopActivities(); + } } final int startActivityMayWait(IApplicationThread caller, int callingUid, @@ -1915,7 +1925,12 @@ public final class ActivityStackSupervisor implements DisplayListener { ActivityRecord intentActivity = !launchSingleInstance ? findTaskLocked(r) : findActivityLocked(intent, r.info); if (intentActivity != null) { - if (isLockTaskModeViolation(intentActivity.task)) { + // When the flags NEW_TASK and CLEAR_TASK are set, then the task gets reused + // but still needs to be a lock task mode violation since the task gets + // cleared out and the device would otherwise leave the locked task. + if (isLockTaskModeViolation(intentActivity.task, + (launchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK)) + == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))) { showLockTaskToast(); Slog.e(TAG, "startActivityUnchecked: Attempt to violate Lock Task Mode"); return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; @@ -2371,7 +2386,7 @@ public final class ActivityStackSupervisor implements DisplayListener { ArrayList<ActivityRecord> stops = null; ArrayList<ActivityRecord> finishes = null; - ArrayList<UserStartedState> startingUsers = null; + ArrayList<UserState> startingUsers = null; int NS = 0; int NF = 0; boolean booting = false; @@ -2468,7 +2483,7 @@ public final class ActivityStackSupervisor implements DisplayListener { } // Complete starting up of background users if (mStartingBackgroundUsers.size() > 0) { - startingUsers = new ArrayList<UserStartedState>(mStartingBackgroundUsers); + startingUsers = new ArrayList<UserState>(mStartingBackgroundUsers); mStartingBackgroundUsers.clear(); for (int i = 0; i < startingUsers.size(); i++) { mService.finishUserBoot(startingUsers.get(i)); @@ -3230,7 +3245,7 @@ public final class ActivityStackSupervisor implements DisplayListener { } } - boolean switchUserLocked(int userId, UserStartedState uss) { + boolean switchUserLocked(int userId, UserState uss) { mUserStackInFront.put(mCurrentUser, mFocusedStack.getStackId()); final int restoreStackId = mUserStackInFront.get(userId, HOME_STACK_ID); mCurrentUser = userId; @@ -3271,7 +3286,7 @@ public final class ActivityStackSupervisor implements DisplayListener { * @param userId The user being started in the background * @param uss The state object for the user. */ - public void startBackgroundUserLocked(int userId, UserStartedState uss) { + public void startBackgroundUserLocked(int userId, UserState uss) { mStartingBackgroundUsers.add(uss); } @@ -3780,7 +3795,11 @@ public final class ActivityStackSupervisor implements DisplayListener { } boolean isLockTaskModeViolation(TaskRecord task) { - if (getLockedTaskLocked() == task) { + return isLockTaskModeViolation(task, false); + } + + boolean isLockTaskModeViolation(TaskRecord task, boolean isNewClearTask) { + if (getLockedTaskLocked() == task && !isNewClearTask) { return false; } final int lockTaskAuth = task.mLockTaskAuth; diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index c973386e4bb8..3854e5160fc6 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -42,6 +42,7 @@ import android.telephony.SignalStrength; import android.telephony.TelephonyManager; import android.util.Slog; +import android.util.TimeUtils; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IBatteryStats; import com.android.internal.os.BatteryStatsHelper; @@ -64,16 +65,22 @@ public final class BatteryStatsService extends IBatteryStats.Stub implements PowerManagerInternal.LowPowerModeListener { static final String TAG = "BatteryStatsService"; - private boolean mFirstExternalStatsUpdate = true; static IBatteryStats sService; final BatteryStatsImpl mStats; final BatteryStatsHandler mHandler; Context mContext; PowerManagerInternal mPowerManagerInternal; + final int UPDATE_CPU = 0x01; + final int UPDATE_WIFI = 0x02; + final int UPDATE_RADIO = 0x04; + final int UPDATE_BT = 0x08; + final int UPDATE_ALL = UPDATE_CPU | UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT; + class BatteryStatsHandler extends Handler implements BatteryStatsImpl.ExternalStatsSync { public static final int MSG_SYNC_EXTERNAL_STATS = 1; public static final int MSG_WRITE_TO_DISK = 2; + private int mUpdateFlags = 0; public BatteryStatsHandler(Looper looper) { super(looper); @@ -83,11 +90,17 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void handleMessage(Message msg) { switch (msg.what) { case MSG_SYNC_EXTERNAL_STATS: - updateExternalStats((String)msg.obj, false); + final int updateFlags; + synchronized (this) { + removeMessages(MSG_SYNC_EXTERNAL_STATS); + updateFlags = mUpdateFlags; + mUpdateFlags = 0; + } + updateExternalStats((String)msg.obj, updateFlags); break; case MSG_WRITE_TO_DISK: - updateExternalStats("write", true); + updateExternalStats("write", UPDATE_ALL); synchronized (mStats) { mStats.writeAsyncLocked(); } @@ -97,9 +110,20 @@ public final class BatteryStatsService extends IBatteryStats.Stub @Override public void scheduleSync(String reason) { - if (!hasMessages(MSG_SYNC_EXTERNAL_STATS)) { - Message msg = Message.obtain(this, MSG_SYNC_EXTERNAL_STATS, reason); - sendMessage(msg); + scheduleSyncImpl(reason, UPDATE_ALL); + } + + @Override + public void scheduleWifiSync(String reason) { + scheduleSyncImpl(reason, UPDATE_WIFI); + } + + private void scheduleSyncImpl(String reason, int updateFlags) { + synchronized (this) { + if (mUpdateFlags == 0) { + sendMessage(Message.obtain(this, MSG_SYNC_EXTERNAL_STATS, reason)); + } + mUpdateFlags |= updateFlags; } } } @@ -137,7 +161,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void shutdown() { Slog.w("BatteryStats", "Writing battery stats before shutdown..."); - updateExternalStats("shutdown", true); + updateExternalStats("shutdown", UPDATE_ALL); synchronized (mStats) { mStats.shutdownLocked(); } @@ -237,7 +261,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub //Slog.i("foo", "SENDING BATTERY INFO:"); //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); Parcel out = Parcel.obtain(); - updateExternalStats("get-stats", true); + updateExternalStats("get-stats", UPDATE_ALL); synchronized (mStats) { mStats.writeToParcel(out, 0); } @@ -252,7 +276,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub //Slog.i("foo", "SENDING BATTERY INFO:"); //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); Parcel out = Parcel.obtain(); - updateExternalStats("get-stats", true); + updateExternalStats("get-stats", UPDATE_ALL); synchronized (mStats) { mStats.writeToParcel(out, 0); } @@ -603,8 +627,10 @@ public final class BatteryStatsService extends IBatteryStats.Stub // There was a change in WiFi power state. // Collect data now for the past activity. - mHandler.scheduleSync("wifi-data"); synchronized (mStats) { + if (mStats.isOnBattery()) { + mHandler.scheduleWifiSync("wifi-data"); + } mStats.noteWifiRadioPowerState(powerState, tsNanos); } } @@ -767,10 +793,10 @@ public final class BatteryStatsService extends IBatteryStats.Stub } @Override - public void noteDeviceIdleMode(boolean enabled, boolean fromActive, boolean fromMotion) { + public void noteDeviceIdleMode(boolean enabled, String activeReason, int activeUid) { enforceCallingPermission(); synchronized (mStats) { - mStats.noteDeviceIdleModeLocked(enabled, fromActive, fromMotion); + mStats.noteDeviceIdleModeLocked(enabled, activeReason, activeUid); } } @@ -807,7 +833,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub // Sync external stats first as the battery has changed states. If we don't sync // immediately here, we may not collect the relevant data later. - updateExternalStats("battery-state", false); + updateExternalStats("battery-state", UPDATE_ALL); synchronized (mStats) { mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt); } @@ -961,9 +987,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub pw.println("Battery stats reset."); noOutput = true; } - updateExternalStats("dump", true); + updateExternalStats("dump", UPDATE_ALL); } else if ("--write".equals(arg)) { - updateExternalStats("dump", true); + updateExternalStats("dump", UPDATE_ALL); synchronized (mStats) { mStats.writeSyncLocked(); pw.println("Battery stats written."); @@ -1027,7 +1053,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY; } // Fetch data from external sources and update the BatteryStatsImpl object with them. - updateExternalStats("dump", true); + updateExternalStats("dump", UPDATE_ALL); } finally { Binder.restoreCallingIdentity(ident); } @@ -1119,6 +1145,12 @@ public final class BatteryStatsService extends IBatteryStats.Stub return null; } + final long timePeriodMs = info.mTimestamp - mLastInfo.mTimestamp; + final long lastIdleMs = mLastInfo.mControllerIdleTimeMs; + final long lastTxMs = mLastInfo.mControllerTxTimeMs; + final long lastRxMs = mLastInfo.mControllerRxTimeMs; + final long lastEnergy = mLastInfo.mControllerEnergyUsed; + // We will modify the last info object to be the delta, and store the new // WifiActivityEnergyInfo object as our last one. final WifiActivityEnergyInfo result = mLastInfo; @@ -1126,19 +1158,16 @@ public final class BatteryStatsService extends IBatteryStats.Stub result.mStackState = info.getStackState(); // These times seem to be the most reliable. - result.mControllerTxTimeMs = - info.mControllerTxTimeMs - mLastInfo.mControllerTxTimeMs; - result.mControllerRxTimeMs = - info.mControllerRxTimeMs - mLastInfo.mControllerRxTimeMs; + result.mControllerTxTimeMs = info.mControllerTxTimeMs - lastTxMs; + result.mControllerRxTimeMs = info.mControllerRxTimeMs - lastRxMs; // WiFi calculates the idle time as a difference from the on time and the various // Rx + Tx times. There seems to be some missing time there because this sometimes // becomes negative. Just cap it at 0 and move on. // b/21613534 - result.mControllerIdleTimeMs = - Math.max(0, info.mControllerIdleTimeMs - mLastInfo.mControllerIdleTimeMs); + result.mControllerIdleTimeMs = Math.max(0, info.mControllerIdleTimeMs - lastIdleMs); result.mControllerEnergyUsed = - Math.max(0, info.mControllerEnergyUsed - mLastInfo.mControllerEnergyUsed); + Math.max(0, info.mControllerEnergyUsed - lastEnergy); if (result.mControllerTxTimeMs < 0 || result.mControllerRxTimeMs < 0) { @@ -1151,6 +1180,34 @@ public final class BatteryStatsService extends IBatteryStats.Stub Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + result); } + + final long totalTimeMs = result.mControllerIdleTimeMs + result.mControllerRxTimeMs + + result.mControllerTxTimeMs; + if (totalTimeMs > timePeriodMs) { + StringBuilder sb = new StringBuilder(); + sb.append("Total time "); + TimeUtils.formatDuration(totalTimeMs, sb); + sb.append(" is longer than sample period "); + TimeUtils.formatDuration(timePeriodMs, sb); + sb.append(".\n"); + sb.append("Previous WiFi snapshot: ").append("idle="); + TimeUtils.formatDuration(lastIdleMs, sb); + sb.append(" rx="); + TimeUtils.formatDuration(lastRxMs, sb); + sb.append(" tx="); + TimeUtils.formatDuration(lastTxMs, sb); + sb.append(" e=").append(lastEnergy); + sb.append("\n"); + sb.append("Current WiFi snapshot: ").append("idle="); + TimeUtils.formatDuration(info.mControllerIdleTimeMs, sb); + sb.append(" rx="); + TimeUtils.formatDuration(info.mControllerRxTimeMs, sb); + sb.append(" tx="); + TimeUtils.formatDuration(info.mControllerTxTimeMs, sb); + sb.append(" e=").append(info.mControllerEnergyUsed); + Slog.wtf(TAG, sb.toString()); + } + mLastInfo = info; return result; } @@ -1184,15 +1241,12 @@ public final class BatteryStatsService extends IBatteryStats.Stub * We first grab a lock specific to this method, then once all the data has been collected, * we grab the mStats lock and update the data. * - * TODO(adamlesinski): When we start distributing bluetooth data to apps, we'll want to - * separate these external stats so that they can be collected individually and on different - * intervals. - * * @param reason The reason why this collection was requested. Useful for debugging. - * @param force If false, some stats may decide not to be collected for efficiency as their - * results aren't needed immediately. When true, collect all stats unconditionally. + * @param updateFlags Which external stats to update. Can be a combination of + * {@link #UPDATE_CPU}, {@link #UPDATE_RADIO}, {@link #UPDATE_WIFI}, + * and {@link #UPDATE_BT}. */ - void updateExternalStats(String reason, boolean force) { + void updateExternalStats(final String reason, final int updateFlags) { synchronized (mExternalStatsLock) { if (mContext == null) { // We haven't started yet (which means the BatteryStatsImpl object has @@ -1200,34 +1254,46 @@ public final class BatteryStatsService extends IBatteryStats.Stub return; } - final WifiActivityEnergyInfo wifiEnergyInfo = pullWifiEnergyInfoLocked(); - final BluetoothActivityEnergyInfo bluetoothEnergyInfo; - if (force) { + if (BatteryStatsImpl.DEBUG_ENERGY) { + Slog.d(TAG, "Updating external stats: reason=" + reason); + } + + WifiActivityEnergyInfo wifiEnergyInfo = null; + if ((updateFlags & UPDATE_WIFI) != 0) { + wifiEnergyInfo = pullWifiEnergyInfoLocked(); + } + + BluetoothActivityEnergyInfo bluetoothEnergyInfo = null; + if ((updateFlags & UPDATE_BT) != 0) { // We only pull bluetooth stats when we have to, as we are not distributing its // use amongst apps and the sampling frequency does not matter. bluetoothEnergyInfo = pullBluetoothEnergyInfoLocked(); - } else { - bluetoothEnergyInfo = null; } synchronized (mStats) { + final long elapsedRealtime = SystemClock.elapsedRealtime(); + final long uptime = SystemClock.uptimeMillis(); if (mStats.mRecordAllHistory) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); mStats.addHistoryEventLocked(elapsedRealtime, uptime, BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS, reason, 0); } - mStats.updateCpuTimeLocked(mFirstExternalStatsUpdate); - mStats.updateKernelWakelocksLocked(); - mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime()); - mStats.updateWifiStateLocked(wifiEnergyInfo); - mStats.updateBluetoothStateLocked(bluetoothEnergyInfo); - } - if (mFirstExternalStatsUpdate) { - // We have read the stats for the first time, which means we have a baseline - // from which to calculate delta. - mFirstExternalStatsUpdate = false; + if ((updateFlags & UPDATE_CPU) != 0) { + mStats.updateCpuTimeLocked(); + mStats.updateKernelWakelocksLocked(); + } + + if ((updateFlags & UPDATE_RADIO) != 0) { + mStats.updateMobileRadioStateLocked(elapsedRealtime); + } + + if ((updateFlags & UPDATE_WIFI) != 0) { + mStats.updateWifiStateLocked(wifiEnergyInfo); + } + + if ((updateFlags & UPDATE_BT) != 0) { + mStats.updateBluetoothStateLocked(bluetoothEnergyInfo); + } } } } diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index 3acd3a387bcc..bd31a218f4c1 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -40,6 +40,7 @@ import android.os.Bundle; import android.os.IBinder; import android.os.Process; import android.os.SystemClock; +import android.os.Trace; import android.os.UserHandle; import android.util.ArrayMap; import android.util.PrintWriterPrinter; @@ -536,6 +537,7 @@ final class ProcessRecord { void kill(String reason, boolean noisy) { if (!killedByAm) { + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "kill"); if (noisy) { Slog.i(TAG, "Killing " + toShortString() + " (adj " + setAdj + "): " + reason); } @@ -546,6 +548,7 @@ final class ProcessRecord { killed = true; killedByAm = true; } + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); } } diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java index 236af375ffae..87cb40ea3e9f 100644 --- a/services/core/java/com/android/server/am/ServiceRecord.java +++ b/services/core/java/com/android/server/am/ServiceRecord.java @@ -445,6 +445,11 @@ final class ServiceRecord extends Binder { // icon, but this used to be able to slip through, so for // those dirty apps we will create a notification clearly // blaming the app. + Slog.v(TAG, "Attempted to start a foreground service (" + + name + + ") with a broken notification (no icon: " + + localForegroundNoti + + ")"); CharSequence appName = appInfo.loadLabel( ams.mContext.getPackageManager()); @@ -461,6 +466,12 @@ final class ServiceRecord extends Binder { // it's ugly, but it clearly identifies the app notiBuilder.setSmallIcon(appInfo.icon); + // mark as foreground + notiBuilder.setFlag(Notification.FLAG_FOREGROUND_SERVICE, true); + + // we are doing the app a kindness here + notiBuilder.setPriority(Notification.PRIORITY_MIN); + Intent runningIntent = new Intent( Settings.ACTION_APPLICATION_DETAILS_SETTINGS); runningIntent.setData(Uri.fromParts("package", @@ -498,6 +509,8 @@ final class ServiceRecord extends Binder { nm.enqueueNotification(localPackageName, localPackageName, appUid, appPid, null, localForegroundId, localForegroundNoti, outId, userId); + + foregroundNoti = localForegroundNoti; // save it for amending next time } catch (RuntimeException e) { Slog.w(TAG, "Error showing notification for service", e); // If it gave us a garbage notification, it doesn't diff --git a/services/core/java/com/android/server/am/UserStartedState.java b/services/core/java/com/android/server/am/UserState.java index d3e73d5222a4..b3d82bca2de8 100644 --- a/services/core/java/com/android/server/am/UserStartedState.java +++ b/services/core/java/com/android/server/am/UserState.java @@ -21,8 +21,9 @@ import java.util.ArrayList; import android.app.IStopUserCallback; import android.os.UserHandle; +import android.util.ArrayMap; -public final class UserStartedState { +public final class UserState { // User is first coming up. public final static int STATE_BOOTING = 0; // User is in the normal running state. @@ -40,7 +41,13 @@ public final class UserStartedState { public boolean switching; public boolean initializing; - public UserStartedState(UserHandle handle, boolean initial) { + /** + * The last time that a provider was reported to usage stats as being brought to important + * foreground procstate. + */ + public final ArrayMap<String,Long> mProviderLastReportedFg = new ArrayMap<>(); + + public UserState(UserHandle handle, boolean initial) { mHandle = handle; } diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index d39b25f39c83..47d3bde7a5e1 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -1542,11 +1542,7 @@ public class AudioService extends IAudioService.Stub { // UI update and Broadcast Intent private void sendVolumeUpdate(int streamType, int oldIndex, int index, int flags) { - if (!isPlatformVoice() && (streamType == AudioSystem.STREAM_RING)) { - streamType = AudioSystem.STREAM_NOTIFICATION; - } else { - streamType = mStreamVolumeAlias[streamType]; - } + streamType = mStreamVolumeAlias[streamType]; if (streamType == AudioSystem.STREAM_MUSIC) { flags = updateFlagsForSystemAudio(flags); diff --git a/services/core/java/com/android/server/audio/MediaFocusControl.java b/services/core/java/com/android/server/audio/MediaFocusControl.java index 4ccb5ad777d2..f72b5987d7ac 100644 --- a/services/core/java/com/android/server/audio/MediaFocusControl.java +++ b/services/core/java/com/android/server/audio/MediaFocusControl.java @@ -46,10 +46,12 @@ import android.os.Binder; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; +import android.os.IDeviceIdleController; import android.os.Looper; import android.os.Message; import android.os.PowerManager; import android.os.RemoteException; +import android.os.ServiceManager; import android.os.UserHandle; import android.provider.Settings; import android.speech.RecognizerIntent; @@ -1086,6 +1088,14 @@ public class MediaFocusControl implements OnFinished { voiceIntent = new Intent(android.speech.RecognizerIntent.ACTION_WEB_SEARCH); Log.i(TAG, "voice-based interactions: about to use ACTION_WEB_SEARCH"); } else { + IDeviceIdleController dic = IDeviceIdleController.Stub.asInterface( + ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER)); + if (dic != null) { + try { + dic.exitIdle("voice-search"); + } catch (RemoteException e) { + } + } voiceIntent = new Intent(RecognizerIntent.ACTION_VOICE_SEARCH_HANDS_FREE); voiceIntent.putExtra(RecognizerIntent.EXTRA_SECURE, isLocked && mKeyguardManager.isKeyguardSecure()); diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java index eac748f4cff7..3bf118338274 100644 --- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java +++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java @@ -106,8 +106,16 @@ public class NetworkAgentInfo { networkMisc = misc; } - public void addRequest(NetworkRequest networkRequest) { + /** + * Add {@code networkRequest} to this network as it's satisfied by this network. + * NOTE: This function must only be called on ConnectivityService's main thread. + * @return true if {@code networkRequest} was added or false if {@code networkRequest} was + * already present. + */ + public boolean addRequest(NetworkRequest networkRequest) { + if (networkRequests.get(networkRequest.requestId) == networkRequest) return false; networkRequests.put(networkRequest.requestId, networkRequest); + return true; } // Does this network satisfy request? diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java index fc50e2c01792..99a0567ef406 100644 --- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java +++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java @@ -178,6 +178,13 @@ public class NetworkMonitor extends StateMachine { */ private static final int CMD_LAUNCH_CAPTIVE_PORTAL_APP = BASE + 11; + /** + * Retest network to see if captive portal is still in place. + * arg1 = UID responsible for requesting this reeval. Will be billed for data. + * 0 indicates self-initiated, so nobody to blame. + */ + private static final int CMD_CAPTIVE_PORTAL_RECHECK = BASE + 12; + private static final String LINGER_DELAY_PROPERTY = "persist.netmon.linger"; // Default to 30s linger time-out. Modifyable only for testing. private static int DEFAULT_LINGER_DELAY_MS = 30000; @@ -194,6 +201,8 @@ public class NetworkMonitor extends StateMachine { private int mUidResponsibleForReeval = INVALID_UID; // Stop blaming UID that requested re-evaluation after this many attempts. private static final int BLAME_FOR_EVALUATION_ATTEMPTS = 5; + // Delay between reevaluations once a captive portal has been found. + private static final int CAPTIVE_PORTAL_REEVALUATE_DELAY_MS = 10*60*1000; private final Context mContext; private final Handler mConnectivityServiceHandler; @@ -287,6 +296,7 @@ public class NetworkMonitor extends StateMachine { quit(); return HANDLED; case CMD_FORCE_REEVALUATION: + case CMD_CAPTIVE_PORTAL_RECHECK: if (DBG) log("Forcing reevaluation"); mUidResponsibleForReeval = message.arg1; transitionTo(mEvaluatingState); @@ -517,6 +527,9 @@ public class NetworkMonitor extends StateMachine { mNetworkAgentInfo.network.netId, mLaunchCaptivePortalAppBroadcastReceiver.getPendingIntent()); mConnectivityServiceHandler.sendMessage(message); + // Retest for captive portal occasionally. + sendMessageDelayed(CMD_CAPTIVE_PORTAL_RECHECK, 0 /* no UID */, + CAPTIVE_PORTAL_REEVALUATE_DELAY_MS); } @Override @@ -524,6 +537,11 @@ public class NetworkMonitor extends StateMachine { if (DBG) log(getName() + message.toString()); return NOT_HANDLED; } + + @Override + public void exit() { + removeMessages(CMD_CAPTIVE_PORTAL_RECHECK); + } } // Being in the LingeringState State indicates a Network's validated bit is true and it once diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java index ea461e52947f..93ed2ee0c7a2 100644 --- a/services/core/java/com/android/server/content/ContentService.java +++ b/services/core/java/com/android/server/content/ContentService.java @@ -506,6 +506,21 @@ public final class ContentService extends IContentService.Stub { } @Override + public String[] getSyncAdapterPackagesForAuthorityAsUser(String authority, int userId) { + enforceCrossUserPermission(userId, + "no permission to read sync settings for user " + userId); + // This makes it so that future permission checks will be in the context of this + // process rather than the caller's process. We will restore this before returning. + final long identityToken = clearCallingIdentity(); + try { + SyncManager syncManager = getSyncManager(); + return syncManager.getSyncAdapterPackagesForAuthorityAsUser(authority, userId); + } finally { + restoreCallingIdentity(identityToken); + } + } + + @Override public boolean getSyncAutomatically(Account account, String providerName) { return getSyncAutomaticallyAsUser(account, providerName, UserHandle.getCallingUserId()); } diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index 2eb879791667..cd9c7fe0b9bb 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -908,6 +908,10 @@ public class SyncManager { return types; } + public String[] getSyncAdapterPackagesForAuthorityAsUser(String authority, int userId) { + return mSyncAdapters.getSyncAdapterPackagesForAuthority(authority, userId); + } + private void sendSyncAlarmMessage() { if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "sending MESSAGE_SYNC_ALARM"); mSyncHandler.sendEmptyMessage(SyncHandler.MESSAGE_SYNC_ALARM); diff --git a/services/core/java/com/android/server/location/FlpHardwareProvider.java b/services/core/java/com/android/server/location/FlpHardwareProvider.java index 259ff1d4c553..d4f3c4d3159b 100644 --- a/services/core/java/com/android/server/location/FlpHardwareProvider.java +++ b/services/core/java/com/android/server/location/FlpHardwareProvider.java @@ -136,6 +136,10 @@ public class FlpHardwareProvider { } maybeSendCapabilities(); + + if (mGeofenceHardwareSink != null) { + mGeofenceHardwareSink.setVersion(getVersion()); + } } private void onBatchingStatus(int status) { @@ -152,10 +156,23 @@ public class FlpHardwareProvider { } } + // Returns the current version of the FLP HAL. This depends both on the version of the + // structure returned by the hardware layer, and whether or not we've received the + // capabilities callback on initialization. Assume original version until we get + // the new initialization callback. + private int getVersion() { + synchronized (mLocationSinkLock) { + if (mHaveBatchingCapabilities) { + return mVersion; + } + } + return 1; + } + private void setVersion(int version) { mVersion = version; if (mGeofenceHardwareSink != null) { - mGeofenceHardwareSink.setVersion(version); + mGeofenceHardwareSink.setVersion(getVersion()); } } @@ -375,7 +392,7 @@ public class FlpHardwareProvider { @Override public void flushBatchedLocations() { - if (mVersion >= FIRST_VERSION_WITH_FLUSH_LOCATIONS) { + if (getVersion() >= FIRST_VERSION_WITH_FLUSH_LOCATIONS) { nativeFlushBatchedLocations(); } else { Log.wtf(TAG, @@ -405,7 +422,7 @@ public class FlpHardwareProvider { @Override public int getVersion() { - return mVersion; + return FlpHardwareProvider.this.getVersion(); } }; @@ -482,7 +499,7 @@ public class FlpHardwareProvider { private GeofenceHardwareImpl getGeofenceHardwareSink() { if (mGeofenceHardwareSink == null) { mGeofenceHardwareSink = GeofenceHardwareImpl.getInstance(mContext); - mGeofenceHardwareSink.setVersion(mVersion); + mGeofenceHardwareSink.setVersion(getVersion()); } return mGeofenceHardwareSink; diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java index dca762c9f07f..569a0fcf7204 100644 --- a/services/core/java/com/android/server/media/MediaSessionRecord.java +++ b/services/core/java/com/android/server/media/MediaSessionRecord.java @@ -242,19 +242,17 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } if (mVolumeType == PlaybackInfo.PLAYBACK_TYPE_LOCAL) { int stream = AudioAttributes.toLegacyStreamType(mAudioAttrs); + // Adjust the volume with a handler not to be blocked by other system service. if (useSuggested) { if (AudioSystem.isStreamActive(stream, 0)) { - mAudioManagerInternal.adjustSuggestedStreamVolumeForUid(stream, direction, - flags, packageName, uid); + postAdjustSuggestedStreamVolume(stream, direction, flags, packageName, uid); } else { flags |= previousFlagPlaySound; - mAudioManagerInternal.adjustSuggestedStreamVolumeForUid( - AudioManager.USE_DEFAULT_STREAM_TYPE, direction, flags, packageName, - uid); + postAdjustSuggestedStreamVolume(AudioManager.USE_DEFAULT_STREAM_TYPE, direction, + flags, packageName, uid); } } else { - mAudioManagerInternal.adjustStreamVolumeForUid(stream, direction, flags, - packageName, uid); + postAdjustStreamVolume(stream, direction, flags, packageName, uid); } } else { if (mVolumeControlType == VolumeProvider.VOLUME_CONTROL_FIXED) { @@ -461,6 +459,28 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { return mPackageName + "/" + mTag; } + private void postAdjustSuggestedStreamVolume(final int streamType, final int direction, + final int flags, final String callingPackage, final int uid) { + mHandler.post(new Runnable() { + @Override + public void run() { + mAudioManagerInternal.adjustSuggestedStreamVolumeForUid(streamType, direction, + flags, callingPackage, uid); + } + }); + } + + private void postAdjustStreamVolume(final int streamType, final int direction, final int flags, + final String callingPackage, final int uid) { + mHandler.post(new Runnable() { + @Override + public void run() { + mAudioManagerInternal.adjustStreamVolumeForUid(streamType, direction, flags, + callingPackage, uid); + } + }); + } + private String getShortMetadataString() { int fields = mMetadata == null ? 0 : mMetadata.size(); MediaDescription description = mMetadata == null ? null : mMetadata diff --git a/services/core/java/com/android/server/net/LockdownVpnTracker.java b/services/core/java/com/android/server/net/LockdownVpnTracker.java index 0f888836b106..9db6a0613544 100644 --- a/services/core/java/com/android/server/net/LockdownVpnTracker.java +++ b/services/core/java/com/android/server/net/LockdownVpnTracker.java @@ -17,6 +17,7 @@ package com.android.server.net; import static android.Manifest.permission.CONNECTIVITY_INTERNAL; +import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NONE; import static android.net.NetworkPolicyManager.FIREWALL_RULE_ALLOW; import static android.net.NetworkPolicyManager.FIREWALL_RULE_DEFAULT; @@ -201,8 +202,8 @@ public class LockdownVpnTracker { setFirewallEgressSourceRule(addr, true); } - mNetService.setFirewallUidRule(ROOT_UID, FIREWALL_RULE_ALLOW); - mNetService.setFirewallUidRule(Os.getuid(), FIREWALL_RULE_ALLOW); + mNetService.setFirewallUidRule(FIREWALL_CHAIN_NONE, ROOT_UID, FIREWALL_RULE_ALLOW); + mNetService.setFirewallUidRule(FIREWALL_CHAIN_NONE, Os.getuid(), FIREWALL_RULE_ALLOW); mErrorCount = 0; mAcceptedIface = iface; @@ -291,8 +292,8 @@ public class LockdownVpnTracker { setFirewallEgressSourceRule(addr, false); } - mNetService.setFirewallUidRule(ROOT_UID, FIREWALL_RULE_DEFAULT); - mNetService.setFirewallUidRule(Os.getuid(), FIREWALL_RULE_DEFAULT); + mNetService.setFirewallUidRule(FIREWALL_CHAIN_NONE, ROOT_UID, FIREWALL_RULE_DEFAULT); + mNetService.setFirewallUidRule(FIREWALL_CHAIN_NONE,Os.getuid(), FIREWALL_RULE_DEFAULT); mAcceptedSourceAddr = null; } diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index e00945599332..b0550d664b89 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -36,8 +36,10 @@ import static android.net.NetworkPolicy.LIMIT_DISABLED; import static android.net.NetworkPolicy.SNOOZE_NEVER; import static android.net.NetworkPolicy.WARNING_DISABLED; import static android.net.NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE; +import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_DOZABLE; +import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_STANDBY; +import static android.net.NetworkPolicyManager.FIREWALL_RULE_ALLOW; import static android.net.NetworkPolicyManager.FIREWALL_RULE_DENY; -import static android.net.NetworkPolicyManager.FIREWALL_RULE_DEFAULT; import static android.net.NetworkPolicyManager.POLICY_ALLOW_BACKGROUND_BATTERY_SAVE; import static android.net.NetworkPolicyManager.POLICY_NONE; import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND; @@ -80,7 +82,6 @@ import android.app.AppGlobals; import android.app.AppOpsManager; import android.app.IActivityManager; import android.app.INotificationManager; -import android.app.IProcessObserver; import android.app.IUidObserver; import android.app.Notification; import android.app.PendingIntent; @@ -141,7 +142,6 @@ import android.util.Log; import android.util.NtpTrustedTime; import android.util.Pair; import android.util.Slog; -import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.SparseIntArray; import android.util.TrustedTime; @@ -279,6 +279,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub final SparseIntArray mUidPolicy = new SparseIntArray(); /** Currently derived rules for each UID. */ final SparseIntArray mUidRules = new SparseIntArray(); + final SparseBooleanArray mFirewallChainStates = new SparseBooleanArray(); /** * UIDs that have been white-listed to always be able to have network access @@ -412,8 +413,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub mUsageStats = LocalServices.getService(UsageStatsManagerInternal.class); - final PackageManager pm = mContext.getPackageManager(); - synchronized (mRulesLock) { updatePowerSaveWhitelistLocked(); mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); @@ -1103,7 +1102,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub // will not have a bandwidth limit. Also only do this if restrict // background data use is *not* enabled, since that takes precendence // use over those networks can have a cost associated with it). - final boolean powerSave = (mRestrictPower || mDeviceIdleMode) && !mRestrictBackground; + final boolean powerSave = mRestrictPower && !mRestrictBackground; // First, generate identities of all connected networks so we can // quickly compare them against all defined policies below. @@ -2024,6 +2023,29 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub } } + void updateRulesForDeviceIdleLocked() { + if (mDeviceIdleMode) { + // sync the whitelists before enable dozable chain. We don't care about the rules if + // we are disabling the chain. + SparseIntArray uidRules = new SparseIntArray(); + final List<UserInfo> users = mUserManager.getUsers(); + for (UserInfo user : users) { + for (int i = mPowerSaveTempWhitelistAppIds.size() - 1; i >= 0; 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); + } + } + setUidFirewallRules(FIREWALL_CHAIN_DOZABLE, uidRules); + } + enableFirewallChain(FIREWALL_CHAIN_DOZABLE, mDeviceIdleMode); + } + /** * Update rules that might be changed by {@link #mRestrictBackground}, * {@link #mRestrictPower}, or {@link #mDeviceIdleMode} value. @@ -2034,10 +2056,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub // If we are in restrict power mode, we allow all important apps // to have data access. Otherwise, we restrict data access to only // the top apps. - mCurForegroundState = (!mRestrictBackground && (mRestrictPower || mDeviceIdleMode)) + mCurForegroundState = (!mRestrictBackground && mRestrictPower) ? ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE : ActivityManager.PROCESS_STATE_TOP; + updateRulesForDeviceIdleLocked(); + // update rules for all installed applications final List<UserInfo> users = mUserManager.getUsers(); final List<ApplicationInfo> apps = pm.getInstalledApplications( @@ -2131,7 +2155,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub // uid in background, and global background disabled uidRules = RULE_REJECT_METERED; } - } else if (mRestrictPower || mDeviceIdleMode) { + } else if (mRestrictPower) { final boolean whitelisted = mPowerSaveWhitelistAppIds.get(appId) || mPowerSaveTempWhitelistAppIds.get(appId); if (!whitelisted && !uidForeground @@ -2162,7 +2186,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub final boolean oldFirewallReject = (oldRules & RULE_REJECT_ALL) != 0; final boolean firewallReject = (uidRules & RULE_REJECT_ALL) != 0; if (oldFirewallReject != firewallReject) { - setUidFirewallRules(uid, firewallReject); + setUidFirewallRule(FIREWALL_CHAIN_STANDBY, uid, firewallReject); + if (mDeviceIdleMode && !firewallReject) { + // if we are in device idle mode, and we decide to allow this uid. we need to punch + // a hole in the device idle chain. + setUidFirewallRule(FIREWALL_CHAIN_DOZABLE, uid, false); + } } // dispatch changed rule to existing listeners @@ -2314,14 +2343,34 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub } /** + * Set uid rules on a particular firewall chain. This is going to synchronize the rules given + * here to netd. It will clean up dead rules and make sure the target chain only contains rules + * specified here. + */ + private void setUidFirewallRules(int chain, SparseIntArray uidRules) { + try { + int size = uidRules.size(); + int[] uids = new int[size]; + int[] rules = new int[size]; + for(int index = size - 1; index >= 0; --index) { + uids[index] = uidRules.keyAt(index); + rules[index] = uidRules.valueAt(index); + } + mNetworkManager.setFirewallUidRules(chain, uids, rules); + } catch (IllegalStateException e) { + Log.wtf(TAG, "problem setting firewall uid rules", e); + } catch (RemoteException e) { + // ignored; service lives in system_server + } + } + + /** * Add or remove a uid to the firewall blacklist for all network ifaces. - * @param uid - * @param rejectOnAll */ - private void setUidFirewallRules(int uid, boolean rejectOnAll) { + private void setUidFirewallRule(int chain, int uid, boolean rejectOnAll) { try { - mNetworkManager.setFirewallUidRule(uid, - rejectOnAll ? FIREWALL_RULE_DENY : FIREWALL_RULE_DEFAULT); + mNetworkManager.setFirewallUidRule(chain, uid, + rejectOnAll ? FIREWALL_RULE_DENY : FIREWALL_RULE_ALLOW); } catch (IllegalStateException e) { Log.wtf(TAG, "problem setting firewall uid rules", e); } catch (RemoteException e) { @@ -2329,6 +2378,24 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub } } + /** + * Add or remove a uid to the firewall blacklist for all network ifaces. + */ + private void enableFirewallChain(int chain, boolean enable) { + if (mFirewallChainStates.indexOfKey(chain) >= 0 && + mFirewallChainStates.get(chain) == enable) { + // All is the same, nothing to do. + return; + } + try { + mNetworkManager.setFirewallChainEnabled(chain, enable); + } catch (IllegalStateException e) { + Log.wtf(TAG, "problem enable firewall chain", e); + } catch (RemoteException e) { + // ignored; service lives in system_server + } + } + private long getTotalBytes(NetworkTemplate template, long start, long end) { try { return mNetworkStats.getNetworkTotalBytes(template, start, end); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 9c288beadb70..0dcad8219ef1 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -1969,6 +1969,9 @@ public class NotificationManagerService extends SystemService { for (int i=0; i<N; i++) { final NotificationRecord r = mNotificationList.get(i); if (r.sbn.getPackageName().equals(pkg) && r.sbn.getUserId() == userId) { + if (r.sbn.getId() == id && TextUtils.equals(r.sbn.getTag(), tag)) { + break; // Allow updating existing notification + } count++; if (count >= MAX_PACKAGE_NOTIFICATIONS) { Slog.e(TAG, "Package has already posted " + count @@ -2999,19 +3002,8 @@ public class NotificationManagerService extends SystemService { final int len = list.size(); for (int i=0; i<len; i++) { NotificationRecord r = list.get(i); - if (!notificationMatchesUserId(r, userId) || r.sbn.getId() != id) { - continue; - } - if (tag == null) { - if (r.sbn.getTag() != null) { - continue; - } - } else { - if (!tag.equals(r.sbn.getTag())) { - continue; - } - } - if (r.sbn.getPackageName().equals(pkg)) { + if (notificationMatchesUserId(r, userId) && r.sbn.getId() == id && + TextUtils.equals(r.sbn.getTag(), tag) && r.sbn.getPackageName().equals(pkg)) { return i; } } diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java new file mode 100644 index 000000000000..fe3103bcdc69 --- /dev/null +++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java @@ -0,0 +1,521 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.pm; + +import android.Manifest; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManagerInternal.PackagesProvider; +import android.content.pm.PackageParser; +import android.content.pm.ResolveInfo; +import android.net.Uri; +import android.os.Build; +import android.os.UserHandle; +import android.provider.MediaStore; +import android.util.ArraySet; +import android.util.Log; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import static android.os.Process.FIRST_APPLICATION_UID; + +/** + * This class is the policy for granting runtime permissions to + * platform components and default handlers in the system such + * that the device is usable out-of-the-box. For example, the + * shell UID is a part of the system and the Phone app should + * have phone related permission by default. + */ +final class DefaultPermissionGrantPolicy { + private static final String TAG = "DefaultPermissionGrantPolicy"; + private static final boolean DEBUG = false; + + private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive"; + + private static final Set<String> PHONE_PERMISSIONS = new ArraySet<>(); + static { + PHONE_PERMISSIONS.add(Manifest.permission.READ_PHONE_STATE); + PHONE_PERMISSIONS.add(Manifest.permission.CALL_PHONE); + PHONE_PERMISSIONS.add( Manifest.permission.READ_CALL_LOG); + PHONE_PERMISSIONS.add(Manifest.permission.WRITE_CALL_LOG); + PHONE_PERMISSIONS.add(Manifest.permission.ADD_VOICEMAIL); + PHONE_PERMISSIONS.add(Manifest.permission.USE_SIP); + PHONE_PERMISSIONS.add(Manifest.permission.PROCESS_OUTGOING_CALLS); + } + + private static final Set<String> CONTACTS_PERMISSIONS = new ArraySet<>(); + static { + CONTACTS_PERMISSIONS.add(Manifest.permission.READ_CONTACTS); + CONTACTS_PERMISSIONS.add(Manifest.permission.WRITE_CONTACTS); + } + + private static final Set<String> LOCATION_PERMISSIONS = new ArraySet<>(); + static { + LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_FINE_LOCATION); + LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_COARSE_LOCATION); + } + + private static final Set<String> CALENDAR_PERMISSIONS = new ArraySet<>(); + static { + CALENDAR_PERMISSIONS.add(Manifest.permission.READ_CALENDAR); + CALENDAR_PERMISSIONS.add(Manifest.permission.WRITE_CALENDAR); + } + + private static final Set<String> SMS_PERMISSIONS = new ArraySet<>(); + static { + SMS_PERMISSIONS.add(Manifest.permission.SEND_SMS); + SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_SMS); + SMS_PERMISSIONS.add(Manifest.permission.READ_SMS); + SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_WAP_PUSH); + SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_MMS); + SMS_PERMISSIONS.add(Manifest.permission.READ_CELL_BROADCASTS); + } + + private static final Set<String> MICROPHONE_PERMISSIONS = new ArraySet<>(); + static { + MICROPHONE_PERMISSIONS.add(Manifest.permission.RECORD_AUDIO); + } + + private static final Set<String> CAMERA_PERMISSIONS = new ArraySet<>(); + static { + CAMERA_PERMISSIONS.add(Manifest.permission.CAMERA); + } + + private static final Set<String> SENSORS_PERMISSIONS = new ArraySet<>(); + static { + SENSORS_PERMISSIONS.add(Manifest.permission.BODY_SENSORS); + } + + private static final Set<String> STORAGE_PERMISSIONS = new ArraySet<>(); + static { +// STORAGE_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE); + STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + + private static final Set<String> SETTINGS_PERMISSIONS = new ArraySet<>(); + static { + SETTINGS_PERMISSIONS.add(Manifest.permission.WRITE_SETTINGS); + } + + private static final Set<String> INSTALLER_PERMISSIONS = new ArraySet<>(); + static { + INSTALLER_PERMISSIONS.add(Manifest.permission.GRANT_REVOKE_PERMISSIONS); + INSTALLER_PERMISSIONS.add(Manifest.permission.INTERACT_ACROSS_USERS_FULL); + INSTALLER_PERMISSIONS.add(Manifest.permission.CLEAR_APP_USER_DATA); + INSTALLER_PERMISSIONS.add(Manifest.permission.KILL_UID); + } + + private static final Set<String> VERIFIER_PERMISSIONS = new ArraySet<>(); + static { + INSTALLER_PERMISSIONS.add(Manifest.permission.GRANT_REVOKE_PERMISSIONS); + } + + private final PackageManagerService mService; + + private PackagesProvider mImePackagesProvider; + private PackagesProvider mLocationPackagesProvider; + private PackagesProvider mVoiceInteractionPackagesProvider; + + public DefaultPermissionGrantPolicy(PackageManagerService service) { + mService = service; + } + + public void setImePackagesProviderLPr(PackagesProvider provider) { + mImePackagesProvider = provider; + } + + public void setLocationPackagesProviderLPw(PackagesProvider provider) { + mLocationPackagesProvider = provider; + } + + public void setVoiceInteractionPackagesProviderLPw(PackagesProvider provider) { + mVoiceInteractionPackagesProvider = provider; + } + + public void grantDefaultPermissions(int userId) { + grantPermissionsToSysComponentsAndPrivApps(userId); + grantDefaultSystemHandlerPermissions(userId); + } + + private void grantPermissionsToSysComponentsAndPrivApps(int userId) { + Log.i(TAG, "Granting permissions to platform components"); + + synchronized (mService.mPackages) { + for (PackageParser.Package pkg : mService.mPackages.values()) { + if (!isSysComponentOrPersistentPrivApp(pkg) + || !doesPackageSupportRuntimePermissions(pkg)) { + continue; + } + final int permissionCount = pkg.requestedPermissions.size(); + for (int i = 0; i < permissionCount; i++) { + String permission = pkg.requestedPermissions.get(i); + BasePermission bp = mService.mSettings.mPermissions.get(permission); + if (bp != null && bp.isRuntime()) { + final int flags = mService.getPermissionFlags(permission, + pkg.packageName, userId); + if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) == 0) { + mService.grantRuntimePermission(pkg.packageName, permission, userId); + mService.updatePermissionFlags(permission, pkg.packageName, + PackageManager.MASK_PERMISSION_FLAGS, + PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, userId); + if (DEBUG) { + Log.i(TAG, "Granted " + permission + " to system component " + + pkg.packageName); + } + } + } + } + } + } + } + + private void grantDefaultSystemHandlerPermissions(int userId) { + Log.i(TAG, "Granting permissions to default platform handlers"); + + final PackagesProvider imePackagesProvider; + final PackagesProvider locationPackagesProvider; + final PackagesProvider voiceInteractionPackagesProvider; + + synchronized (mService.mPackages) { + imePackagesProvider = mImePackagesProvider; + locationPackagesProvider = mLocationPackagesProvider; + voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider; + } + + String[] imePackageNames = (imePackagesProvider != null) + ? imePackagesProvider.getPackages(userId) : null; + String[] voiceInteractPackageNames = (voiceInteractionPackagesProvider != null) + ? voiceInteractionPackagesProvider.getPackages(userId) : null; + String[] locationPackageNames = (locationPackagesProvider != null) + ? locationPackagesProvider.getPackages(userId) : null; + + synchronized (mService.mPackages) { + // Installers + Intent installerIntent = new Intent(Intent.ACTION_INSTALL_PACKAGE); + installerIntent.addCategory(Intent.CATEGORY_DEFAULT); + installerIntent.setDataAndType(Uri.fromFile(new File("foo.apk")), + PACKAGE_MIME_TYPE); + List<PackageParser.Package> installerPackages = + getPrivilegedHandlerActivityPackagesLPr(installerIntent, userId); + final int installerCount = installerPackages.size(); + for (int i = 0; i < installerCount; i++) { + PackageParser.Package installPackage = installerPackages.get(i); + grantInstallPermissionsLPw(installPackage, INSTALLER_PERMISSIONS, userId); + } + + // Verifiers + Intent verifierIntent = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION); + verifierIntent.setType(PACKAGE_MIME_TYPE); + List<PackageParser.Package> verifierPackages = + getPrivilegedHandlerReceiverPackagesLPr(verifierIntent, userId); + final int verifierCount = verifierPackages.size(); + for (int i = 0; i < verifierCount; i++) { + PackageParser.Package verifierPackage = verifierPackages.get(i); + grantInstallPermissionsLPw(verifierPackage, VERIFIER_PERMISSIONS, userId); + } + + // SetupWizard + Intent setupIntent = new Intent(Intent.ACTION_MAIN); + setupIntent.addCategory(Intent.CATEGORY_HOME); + PackageParser.Package setupPackage = getDefaultSystemHandlerActvityPackageLPr( + setupIntent, userId); + if (setupPackage != null + && doesPackageSupportRuntimePermissions(setupPackage)) { + grantRuntimePermissionsLPw(setupPackage, PHONE_PERMISSIONS, userId); + grantRuntimePermissionsLPw(setupPackage, CONTACTS_PERMISSIONS, userId); + grantRuntimePermissionsLPw(setupPackage, SETTINGS_PERMISSIONS, userId); + } + + // Phone + Intent dialerIntent = new Intent(Intent.ACTION_DIAL); + PackageParser.Package dialerPackage = getDefaultSystemHandlerActvityPackageLPr( + dialerIntent, userId); + if (dialerPackage != null + && doesPackageSupportRuntimePermissions(dialerPackage)) { + grantRuntimePermissionsLPw(dialerPackage, PHONE_PERMISSIONS, userId); + grantRuntimePermissionsLPw(dialerPackage, CONTACTS_PERMISSIONS, userId); + grantRuntimePermissionsLPw(dialerPackage, SMS_PERMISSIONS, userId); + grantRuntimePermissionsLPw(dialerPackage, MICROPHONE_PERMISSIONS, userId); + } + + // Camera + Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + PackageParser.Package cameraPackage = getDefaultSystemHandlerActvityPackageLPr( + cameraIntent, userId); + if (cameraPackage != null + && doesPackageSupportRuntimePermissions(cameraPackage)) { + grantRuntimePermissionsLPw(cameraPackage, CAMERA_PERMISSIONS, userId); + grantRuntimePermissionsLPw(cameraPackage, MICROPHONE_PERMISSIONS, userId); + } + + // Messaging + Intent messagingIntent = new Intent(Intent.ACTION_MAIN); + messagingIntent.addCategory(Intent.CATEGORY_APP_MESSAGING); + PackageParser.Package messagingPackage = getDefaultSystemHandlerActvityPackageLPr( + messagingIntent, userId); + if (messagingPackage != null + && doesPackageSupportRuntimePermissions(messagingPackage)) { + grantRuntimePermissionsLPw(messagingPackage, PHONE_PERMISSIONS, userId); + grantRuntimePermissionsLPw(messagingPackage, CONTACTS_PERMISSIONS, userId); + grantRuntimePermissionsLPw(messagingPackage, SMS_PERMISSIONS, userId); + } + + // Calendar + Intent calendarIntent = new Intent(Intent.ACTION_MAIN); + calendarIntent.addCategory(Intent.CATEGORY_APP_CALENDAR); + PackageParser.Package calendarPackage = getDefaultSystemHandlerActvityPackageLPr( + calendarIntent, userId); + if (calendarPackage != null + && doesPackageSupportRuntimePermissions(calendarPackage)) { + grantRuntimePermissionsLPw(calendarPackage, CALENDAR_PERMISSIONS, userId); + grantRuntimePermissionsLPw(calendarPackage, CONTACTS_PERMISSIONS, userId); + } + + // Contacts + Intent contactsIntent = new Intent(Intent.ACTION_MAIN); + contactsIntent.addCategory(Intent.CATEGORY_APP_CONTACTS); + PackageParser.Package contactsPackage = getDefaultSystemHandlerActvityPackageLPr( + contactsIntent, userId); + if (contactsPackage != null + && doesPackageSupportRuntimePermissions(contactsPackage)) { + grantRuntimePermissionsLPw(contactsPackage, CONTACTS_PERMISSIONS, userId); + grantRuntimePermissionsLPw(contactsPackage, PHONE_PERMISSIONS, userId); + } + + // Maps + Intent mapsIntent = new Intent(Intent.ACTION_MAIN); + mapsIntent.addCategory(Intent.CATEGORY_APP_MAPS); + PackageParser.Package mapsPackage = getDefaultSystemHandlerActvityPackageLPr( + mapsIntent, userId); + if (mapsPackage != null + && doesPackageSupportRuntimePermissions(mapsPackage)) { + grantRuntimePermissionsLPw(mapsPackage, LOCATION_PERMISSIONS, userId); + } + + // Email + Intent emailIntent = new Intent(Intent.ACTION_MAIN); + emailIntent.addCategory(Intent.CATEGORY_APP_EMAIL); + PackageParser.Package emailPackage = getDefaultSystemHandlerActvityPackageLPr( + emailIntent, userId); + if (emailPackage != null + && doesPackageSupportRuntimePermissions(emailPackage)) { + grantRuntimePermissionsLPw(emailPackage, CONTACTS_PERMISSIONS, userId); + } + + // Browser + Intent browserIntent = new Intent(Intent.ACTION_MAIN); + browserIntent.addCategory(Intent.CATEGORY_APP_BROWSER); + PackageParser.Package browserPackage = getDefaultSystemHandlerActvityPackageLPr( + browserIntent, userId); + if (browserPackage != null + && doesPackageSupportRuntimePermissions(browserPackage)) { + grantRuntimePermissionsLPw(browserPackage, LOCATION_PERMISSIONS, userId); + } + + // IME + if (imePackageNames != null) { + for (String imePackageName : imePackageNames) { + PackageParser.Package imePackage = getSystemPackageLPr(imePackageName); + if (imePackage != null + && doesPackageSupportRuntimePermissions(imePackage)) { + grantRuntimePermissionsLPw(imePackage, CONTACTS_PERMISSIONS, userId); + } + } + } + + // Voice interaction + if (voiceInteractPackageNames != null) { + for (String voiceInteractPackageName : voiceInteractPackageNames) { + PackageParser.Package voiceInteractPackage = getSystemPackageLPr( + voiceInteractPackageName); + if (voiceInteractPackage != null + && doesPackageSupportRuntimePermissions(voiceInteractPackage)) { + grantRuntimePermissionsLPw(voiceInteractPackage, + CONTACTS_PERMISSIONS, userId); + grantRuntimePermissionsLPw(voiceInteractPackage, + CALENDAR_PERMISSIONS, userId); + grantRuntimePermissionsLPw(voiceInteractPackage, + MICROPHONE_PERMISSIONS, userId); + grantRuntimePermissionsLPw(voiceInteractPackage, + PHONE_PERMISSIONS, userId); + grantRuntimePermissionsLPw(voiceInteractPackage, + SMS_PERMISSIONS, userId); + grantRuntimePermissionsLPw(voiceInteractPackage, + LOCATION_PERMISSIONS, userId); + } + } + } + + // Location + if (locationPackageNames != null) { + for (String packageName : locationPackageNames) { + PackageParser.Package locationPackage = getSystemPackageLPr(packageName); + if (locationPackage != null + && doesPackageSupportRuntimePermissions(locationPackage)) { + grantRuntimePermissionsLPw(locationPackage, CONTACTS_PERMISSIONS, userId); + grantRuntimePermissionsLPw(locationPackage, CALENDAR_PERMISSIONS, userId); + grantRuntimePermissionsLPw(locationPackage, MICROPHONE_PERMISSIONS, userId); + grantRuntimePermissionsLPw(locationPackage, PHONE_PERMISSIONS, userId); + grantRuntimePermissionsLPw(locationPackage, SMS_PERMISSIONS, userId); + grantRuntimePermissionsLPw(locationPackage, LOCATION_PERMISSIONS, userId); + grantRuntimePermissionsLPw(locationPackage, CAMERA_PERMISSIONS, userId); + grantRuntimePermissionsLPw(locationPackage, SENSORS_PERMISSIONS, userId); + grantRuntimePermissionsLPw(locationPackage, STORAGE_PERMISSIONS, userId); + } + } + } + } + } + + private List<PackageParser.Package> getPrivilegedHandlerReceiverPackagesLPr( + Intent intent, int userId) { + List<ResolveInfo> handlers = mService.queryIntentReceivers( + intent, intent.resolveTypeIfNeeded(mService.mContext.getContentResolver()), + 0, userId); + return getPrivilegedPackages(handlers); + } + + private List<PackageParser.Package> getPrivilegedHandlerActivityPackagesLPr( + Intent intent, int userId) { + List<ResolveInfo> handlers = mService.queryIntentActivities( + intent, intent.resolveTypeIfNeeded(mService.mContext.getContentResolver()), + 0, userId); + return getPrivilegedPackages(handlers); + } + + private List<PackageParser.Package> getPrivilegedPackages(List<ResolveInfo> resolveInfos) { + List<PackageParser.Package> handlerPackages = new ArrayList<>(); + final int handlerCount = resolveInfos.size(); + for (int i = 0; i < handlerCount; i++) { + ResolveInfo handler = resolveInfos.get(i); + PackageParser.Package handlerPackage = getPrivilegedPackageLPr( + handler.activityInfo.packageName); + if (handlerPackage != null) { + handlerPackages.add(handlerPackage); + } + } + return handlerPackages; + } + + private PackageParser.Package getDefaultSystemHandlerActvityPackageLPr( + Intent intent, int userId) { + List<ResolveInfo> handlers = mService.queryIntentActivities(intent, null, 0, userId); + final int handlerCount = handlers.size(); + for (int i = 0; i < handlerCount; i++) { + ResolveInfo handler = handlers.get(i); + // TODO: This is a temporary hack to figure out the setup app. + PackageParser.Package handlerPackage = getSystemPackageLPr( + handler.activityInfo.packageName); + if (handlerPackage != null) { + return handlerPackage; + } + } + return null; + } + + private PackageParser.Package getSystemPackageLPr(String packageName) { + PackageParser.Package pkg = mService.mPackages.get(packageName); + if (pkg != null && pkg.isSystemApp()) { + return !isSysComponentOrPersistentPrivApp(pkg) ? pkg : null; + } + return null; + } + + private PackageParser.Package getPrivilegedPackageLPr(String packageName) { + PackageParser.Package pkg = mService.mPackages.get(packageName); + if (pkg != null && pkg.applicationInfo.isPrivilegedApp()) { + return !isSysComponentOrPersistentPrivApp(pkg) ? pkg : null; + } + return null; + } + + private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions, + int userId) { + List<String> requestedPermissions = pkg.requestedPermissions; + + if (pkg.isUpdatedSystemApp()) { + PackageSetting sysPs = mService.mSettings.getDisabledSystemPkgLPr(pkg.packageName); + if (sysPs != null) { + requestedPermissions = sysPs.pkg.requestedPermissions; + } + } + + final int permissionCount = requestedPermissions.size(); + for (int i = 0; i < permissionCount; i++) { + String permission = requestedPermissions.get(i); + if (permissions.contains(permission)) { + final int flags = mService.getPermissionFlags(permission, pkg.packageName, userId); + + // If any flags are set to the permission, then it is either set in + // its current state by the system or device/profile owner or the user. + // In all these cases we do not want to clobber the current state. + if (flags == 0) { + mService.grantRuntimePermission(pkg.packageName, permission, userId); + if (DEBUG) { + Log.i(TAG, "Granted " + permission + " to default handler " + + pkg.packageName); + } + } + } + } + } + + private void grantInstallPermissionsLPw(PackageParser.Package pkg, Set<String> permissions, + int userId) { + List<String> requestedPermissions = pkg.requestedPermissions; + + if (pkg.isUpdatedSystemApp()) { + PackageSetting sysPs = mService.mSettings.getDisabledSystemPkgLPr(pkg.packageName); + if (sysPs != null) { + requestedPermissions = sysPs.pkg.requestedPermissions; + } + } + + final int permissionCount = requestedPermissions.size(); + for (int i = 0; i < permissionCount; i++) { + String permission = requestedPermissions.get(i); + if (permissions.contains(permission)) { + final int flags = mService.getPermissionFlags(permission, pkg.packageName, userId); + + // If any flags are set to the permission, then it is either set in + // its current state by the system or device/profile owner or the user. + // In all these cases we do not want to clobber the current state. + if (flags == 0) { + mService.grantInstallPermissionLPw(permission, pkg); + if (DEBUG) { + Log.i(TAG, "Granted install " + permission + " to " + pkg.packageName); + } + } + } + } + } + + private static boolean isSysComponentOrPersistentPrivApp(PackageParser.Package pkg) { + return UserHandle.getAppId(pkg.applicationInfo.uid) < FIRST_APPLICATION_UID + || ((pkg.applicationInfo.privateFlags + & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0 + && (pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) != 0); + } + + private static boolean doesPackageSupportRuntimePermissions(PackageParser.Package pkg) { + return pkg.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1; + } +} diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 06e27fc55f31..95cb11d92728 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -55,7 +55,6 @@ import static android.content.pm.PackageManager.MOVE_FAILED_INTERNAL_ERROR; import static android.content.pm.PackageManager.MOVE_FAILED_OPERATION_PENDING; import static android.content.pm.PackageManager.MOVE_FAILED_SYSTEM_PACKAGE; import static android.content.pm.PackageParser.isApkFile; -import static android.os.Process.FIRST_APPLICATION_UID; import static android.os.Process.PACKAGE_INFO_GID; import static android.os.Process.SYSTEM_UID; import static android.system.OsConstants.O_CREAT; @@ -111,6 +110,7 @@ import android.content.pm.PackageInfoLite; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.PackageManager.LegacyPackageDeleteObserver; +import android.content.pm.PackageManagerInternal; import android.content.pm.PackageParser; import android.content.pm.PackageParser.ActivityIntentInfo; import android.content.pm.PackageParser.PackageLite; @@ -281,6 +281,8 @@ public class PackageManagerService extends IPackageManager.Stub { private static final boolean DEBUG_DEXOPT = false; private static final boolean DEBUG_ABI_SELECTION = false; + static final boolean CLEAR_RUNTIME_PERMISSIONS_ON_UPGRADE = Build.IS_DEBUGGABLE; + private static final int RADIO_UID = Process.PHONE_UID; private static final int LOG_UID = Process.LOG_UID; private static final int NFC_UID = Process.NFC_UID; @@ -551,6 +553,9 @@ public class PackageManagerService extends IPackageManager.Stub { final SparseArray<IntentFilterVerificationState> mIntentFilterVerificationStates = new SparseArray<IntentFilterVerificationState>(); + final DefaultPermissionGrantPolicy mDefaultPermissionPolicy = + new DefaultPermissionGrantPolicy(this); + private interface IntentFilterVerifier<T extends IntentFilter> { boolean addOneIntentFilterVerification(int verifierId, int userId, int verificationId, T filter, String packageName); @@ -1586,6 +1591,11 @@ public class PackageManagerService extends IPackageManager.Stub { grantRequestedRuntimePermissionsForUser(pkg, someUserId); } } + + // We could have touched GID membership, so flush out packages.list + synchronized (mPackages) { + mSettings.writePackageListLPr(); + } } private void grantRequestedRuntimePermissionsForUser(PackageParser.Package pkg, int userId) { @@ -2194,6 +2204,9 @@ public class PackageManagerService extends IPackageManager.Stub { // are all flushed. Not really needed, but keeps things nice and // tidy. Runtime.getRuntime().gc(); + + // Expose private service for system components to use. + LocalServices.addService(PackageManagerInternal.class, new PackageManagerInternalImpl()); } @Override @@ -3150,7 +3163,7 @@ public class PackageManagerService extends IPackageManager.Stub { } @Override - public void grantRuntimePermission(String packageName, String name, int userId) { + public void grantRuntimePermission(String packageName, String name, final int userId) { if (!sUserManager.exists(userId)) { Log.e(TAG, "No such user:" + userId); return; @@ -3163,7 +3176,6 @@ public class PackageManagerService extends IPackageManager.Stub { enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, "grantRuntimePermission"); - boolean gidsChanged = false; final SettingBase sb; synchronized (mPackages) { @@ -3199,7 +3211,12 @@ public class PackageManagerService extends IPackageManager.Stub { } case PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED: { - gidsChanged = true; + mHandler.post(new Runnable() { + @Override + public void run() { + killSettingPackagesForUser(sb, userId, KILL_APP_REASON_GIDS_CHANGED); + } + }); } break; } @@ -3208,10 +3225,6 @@ public class PackageManagerService extends IPackageManager.Stub { // Not critical if that is lost - app has to request again. mSettings.writeRuntimePermissionsForUserLPr(userId, false); } - - if (gidsChanged) { - killSettingPackagesForUser(sb, userId, KILL_APP_REASON_GIDS_CHANGED); - } } @Override @@ -3318,15 +3331,14 @@ public class PackageManagerService extends IPackageManager.Stub { enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, "updatePermissionFlags"); - // Only the system can change policy flags. + // Only the system can change policy and system fixed flags. if (getCallingUid() != Process.SYSTEM_UID) { flagMask &= ~PackageManager.FLAG_PERMISSION_POLICY_FIXED; flagValues &= ~PackageManager.FLAG_PERMISSION_POLICY_FIXED; - } - // Only the package manager can change system flags. - flagMask &= ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; - flagValues &= ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; + flagMask &= ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; + flagValues &= ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; + } synchronized (mPackages) { final PackageParser.Package pkg = mPackages.get(packageName); @@ -3404,6 +3416,21 @@ public class PackageManagerService extends IPackageManager.Stub { return (flags & PackageManager.FLAG_PERMISSION_USER_SET) != 0; } + void grantInstallPermissionLPw(String permission, PackageParser.Package pkg) { + BasePermission bp = mSettings.mPermissions.get(permission); + if (bp == null) { + throw new SecurityException("Missing " + permission + " permission"); + } + + SettingBase sb = (SettingBase) pkg.mExtras; + PermissionsState permissionsState = sb.getPermissionsState(); + + if (permissionsState.grantInstallPermission(bp) != + PermissionsState.PERMISSION_OPERATION_FAILURE) { + scheduleWriteSettingsLocked(); + } + } + @Override public void addOnPermissionsChangeListener(IOnPermissionsChangeListener listener) { mContext.enforceCallingOrSelfPermission( @@ -7719,7 +7746,7 @@ public class PackageManagerService extends IPackageManager.Stub { } } } - + if (pkgInfo != null) { grantPermissionsLPw(pkgInfo, (flags&UPDATE_PERMISSIONS_REPLACE_PKG) != 0, changingPkg); } @@ -7748,7 +7775,6 @@ public class PackageManagerService extends IPackageManager.Stub { final int[] currentUserIds = UserManagerService.getInstance().getUserIds(); - int[] upgradeUserIds = EMPTY_INT_ARRAY; int[] changedRuntimePermissionUserIds = EMPTY_INT_ARRAY; boolean changedInstallPermission = false; @@ -7805,32 +7831,11 @@ public class PackageManagerService extends IPackageManager.Stub { if (pkg.applicationInfo.targetSdkVersion <= Build.VERSION_CODES.LOLLIPOP_MR1) { // For legacy apps dangerous permissions are install time ones. grant = GRANT_INSTALL_LEGACY; - } else if (ps.isSystem()) { - final int[] updatedUserIds = ps.getPermissionsUpdatedForUserIds(); - if (origPermissions.hasInstallPermission(bp.name)) { - // If a system app had an install permission, then the app was - // upgraded and we grant the permissions as runtime to all users. - grant = GRANT_UPGRADE; - upgradeUserIds = currentUserIds; - } else if (!Arrays.equals(updatedUserIds, currentUserIds)) { - // If users changed since the last permissions update for a - // system app, we grant the permission as runtime to the new users. - grant = GRANT_UPGRADE; - upgradeUserIds = currentUserIds; - for (int userId : updatedUserIds) { - upgradeUserIds = ArrayUtils.removeInt(upgradeUserIds, userId); - } - } else { - // Otherwise, we grant the permission as runtime if the app - // already had it, i.e. we preserve runtime permissions. - grant = GRANT_RUNTIME; - } } else if (origPermissions.hasInstallPermission(bp.name)) { // For legacy apps that became modern, install becomes runtime. grant = GRANT_UPGRADE; - upgradeUserIds = currentUserIds; - } else if (replace) { - // For upgraded modern apps keep runtime permissions unchanged. + } else { + // For modern apps keep runtime permissions unchanged. grant = GRANT_RUNTIME; } } break; @@ -7865,7 +7870,7 @@ public class PackageManagerService extends IPackageManager.Stub { switch (grant) { case GRANT_INSTALL: { // Revoke this as runtime permission to handle the case of - // a runtime permssion being downgraded to an install one. + // a runtime permission being downgraded to an install one. for (int userId : UserManagerService.getInstance().getUserIds()) { if (origPermissions.getRuntimePermissionState( bp.name, userId) != null) { @@ -7896,26 +7901,20 @@ public class PackageManagerService extends IPackageManager.Stub { case GRANT_RUNTIME: { // Grant previously granted runtime permissions. for (int userId : UserManagerService.getInstance().getUserIds()) { + PermissionState permissionState = origPermissions + .getRuntimePermissionState(bp.name, userId); + final int flags = permissionState != null + ? permissionState.getFlags() : 0; if (origPermissions.hasRuntimePermission(bp.name, userId)) { - PermissionState permissionState = origPermissions - .getRuntimePermissionState(bp.name, userId); - final int flags = permissionState.getFlags(); if (permissionsState.grantRuntimePermission(bp, userId) == PermissionsState.PERMISSION_OPERATION_FAILURE) { // If we cannot put the permission as it was, we have to write. changedRuntimePermissionUserIds = ArrayUtils.appendInt( changedRuntimePermissionUserIds, userId); - } else { - // System components not only get the permissions but - // they are also fixed, so nothing can change that. - final int newFlags = !isSystemComponentOrPersistentPrivApp(pkg) - ? flags - : flags | PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; - // Propagate the permission flags. - permissionsState.updatePermissionFlags(bp, userId, - newFlags, newFlags); } } + // Propagate the permission flags. + permissionsState.updatePermissionFlags(bp, userId, flags, flags); } } break; @@ -7925,25 +7924,23 @@ public class PackageManagerService extends IPackageManager.Stub { .getInstallPermissionState(bp.name); final int flags = permissionState != null ? permissionState.getFlags() : 0; - origPermissions.revokeInstallPermission(bp); - // We will be transferring the permission flags, so clear them. - origPermissions.updatePermissionFlags(bp, UserHandle.USER_ALL, - PackageManager.MASK_PERMISSION_FLAGS, 0); + if (origPermissions.revokeInstallPermission(bp) + != PermissionsState.PERMISSION_OPERATION_FAILURE) { + // We will be transferring the permission flags, so clear them. + origPermissions.updatePermissionFlags(bp, UserHandle.USER_ALL, + PackageManager.MASK_PERMISSION_FLAGS, 0); + changedInstallPermission = true; + } // If the permission is not to be promoted to runtime we ignore it and // also its other flags as they are not applicable to install permissions. if ((flags & PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE) == 0) { - for (int userId : upgradeUserIds) { + for (int userId : currentUserIds) { if (permissionsState.grantRuntimePermission(bp, userId) != PermissionsState.PERMISSION_OPERATION_FAILURE) { - // System components not only get the permissions but - // they are also fixed so nothing can change that. - final int newFlags = !isSystemComponentOrPersistentPrivApp(pkg) - ? flags - : flags | PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; // Transfer the permission flags. permissionsState.updatePermissionFlags(bp, userId, - newFlags, newFlags); + flags, flags); // If we granted the permission, we have to write. changedRuntimePermissionUserIds = ArrayUtils.appendInt( changedRuntimePermissionUserIds, userId); @@ -7995,11 +7992,9 @@ public class PackageManagerService extends IPackageManager.Stub { ps.installPermissionsFixed = true; } - ps.setPermissionsUpdatedForUserIds(currentUserIds); - // Persist the runtime permissions state for users with changes. for (int userId : changedRuntimePermissionUserIds) { - mSettings.writeRuntimePermissionsForUserLPr(userId, true); + mSettings.writeRuntimePermissionsForUserLPr(userId, false); } } @@ -8248,6 +8243,7 @@ public class PackageManagerService extends IPackageManager.Stub { } else { res.icon = info.icon; } + res.iconResourceId = info.icon; res.system = res.activityInfo.applicationInfo.isSystemApp(); return res; } @@ -11875,13 +11871,6 @@ public class PackageManagerService extends IPackageManager.Stub { } } - private boolean isSystemComponentOrPersistentPrivApp(PackageParser.Package pkg) { - return UserHandle.getAppId(pkg.applicationInfo.uid) < FIRST_APPLICATION_UID - || ((pkg.applicationInfo.privateFlags - & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0 - && (pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) != 0); - } - private static boolean isMultiArch(PackageSetting ps) { return (ps.pkgFlags & ApplicationInfo.FLAG_MULTIARCH) != 0; } @@ -12494,6 +12483,8 @@ public class PackageManagerService extends IPackageManager.Stub { if (clearPackagePreferredActivitiesLPw(packageName, removeUser)) { scheduleWritePackageRestrictionsLocked(removeUser); } + revokeRuntimePermissionsAndClearAllFlagsLocked(ps.getPermissionsState(), + removeUser); } return true; } @@ -12700,17 +12691,44 @@ public class PackageManagerService extends IPackageManager.Stub { | PackageManager.FLAG_PERMISSION_USER_FIXED | PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE; + revokeRuntimePermissionsAndClearFlagsLocked(permissionsState, userId, userSetFlags); + } + + /** + * Revokes granted runtime permissions and clears all flags. + * + * @param permissionsState The permission state to reset. + * @param userId The device user for which to do a reset. + */ + private void revokeRuntimePermissionsAndClearAllFlagsLocked( + PermissionsState permissionsState, int userId) { + revokeRuntimePermissionsAndClearFlagsLocked(permissionsState, userId, + PackageManager.MASK_PERMISSION_FLAGS); + } + + /** + * Revokes granted runtime permissions and clears certain flags. + * + * @param permissionsState The permission state to reset. + * @param userId The device user for which to do a reset. + * @param flags The flags that is going to be reset. + */ + private void revokeRuntimePermissionsAndClearFlagsLocked( + PermissionsState permissionsState, int userId, int flags) { boolean needsWrite = false; for (PermissionState state : permissionsState.getRuntimePermissionStates(userId)) { BasePermission bp = mSettings.mPermissions.get(state.getName()); if (bp != null) { permissionsState.revokeRuntimePermission(bp, userId); - permissionsState.updatePermissionFlags(bp, userId, userSetFlags, 0); + permissionsState.updatePermissionFlags(bp, userId, flags, 0); needsWrite = true; } } + // Ensure default permissions are never cleared. + mDefaultPermissionPolicy.grantDefaultPermissions(userId); + if (needsWrite) { mSettings.writeRuntimePermissionsForUserLPr(userId, true); } @@ -13674,6 +13692,14 @@ public class PackageManagerService extends IPackageManager.Stub { } sUserManager.systemReady(); + // If we upgraded grant all default permissions before kicking off. + if (isFirstBoot() || (CLEAR_RUNTIME_PERMISSIONS_ON_UPGRADE && mIsUpgrade)) { + updatePermissionsLPw(null, null, UPDATE_PERMISSIONS_ALL); + for (int userId : UserManagerService.getInstance().getUserIds()) { + mDefaultPermissionPolicy.grantDefaultPermissions(userId); + } + } + // Kick off any messages waiting for system ready if (mPostSystemReadyMessages != null) { for (Message msg : mPostSystemReadyMessages) { @@ -14085,7 +14111,9 @@ public class PackageManagerService extends IPackageManager.Stub { } } - if (!checkin && dumpState.isDumping(DumpState.DUMP_DOMAIN_PREFERRED)) { + if (!checkin + && dumpState.isDumping(DumpState.DUMP_DOMAIN_PREFERRED) + && packageName == null) { pw.println(); int count = mSettings.mPackages.size(); if (count == 0) { @@ -15061,9 +15089,16 @@ public class PackageManagerService extends IPackageManager.Stub { } } - void newUserCreatedLILPw(int userHandle) { - // Adding a user requires updating runtime permissions for system apps. - updatePermissionsLPw(null, null, UPDATE_PERMISSIONS_ALL); + void newUserCreatedLILPw(final int userHandle) { + // We cannot grant the default permissions with a lock held as + // we query providers from other components for default handlers + // such as enabled IMEs, etc. + mHandler.post(new Runnable() { + @Override + public void run() { + mDefaultPermissionPolicy.grantDefaultPermissions(userHandle); + } + }); } @Override @@ -15415,4 +15450,27 @@ public class PackageManagerService extends IPackageManager.Stub { } } } + + private class PackageManagerInternalImpl extends PackageManagerInternal { + @Override + public void setLocationPackagesProvider(PackagesProvider provider) { + synchronized (mPackages) { + mDefaultPermissionPolicy.setLocationPackagesProviderLPw(provider); + } + } + + @Override + public void setImePackagesProvider(PackagesProvider provider) { + synchronized (mPackages) { + mDefaultPermissionPolicy.setImePackagesProviderLPr(provider); + } + } + + @Override + public void setVoiceInteractionPackagesProvider(PackagesProvider provider) { + synchronized (mPackages) { + mDefaultPermissionPolicy.setVoiceInteractionPackagesProviderLPw(provider); + } + } + } } diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java index f62c00cfd277..6f46f697efc4 100644 --- a/services/core/java/com/android/server/pm/PackageSettingBase.java +++ b/services/core/java/com/android/server/pm/PackageSettingBase.java @@ -24,7 +24,6 @@ import android.content.pm.IntentFilterVerificationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageUserState; import android.os.storage.VolumeInfo; -import android.text.TextUtils; import android.util.ArraySet; import android.util.SparseArray; @@ -223,7 +222,6 @@ abstract class PackageSettingBase extends SettingBase { * Make a shallow copy of this package settings. */ public void copyFrom(PackageSettingBase base) { - setPermissionsUpdatedForUserIds(base.getPermissionsUpdatedForUserIds()); mPermissionsState.copyFrom(base.mPermissionsState); primaryCpuAbiString = base.primaryCpuAbiString; secondaryCpuAbiString = base.secondaryCpuAbiString; diff --git a/services/core/java/com/android/server/pm/SettingBase.java b/services/core/java/com/android/server/pm/SettingBase.java index c35258a05625..5cf92a9f6a7f 100644 --- a/services/core/java/com/android/server/pm/SettingBase.java +++ b/services/core/java/com/android/server/pm/SettingBase.java @@ -18,16 +18,11 @@ package com.android.server.pm; import android.content.pm.ApplicationInfo; -import java.util.Arrays; - abstract class SettingBase { - private static final int[] USERS_NONE = new int[0]; - int pkgFlags; int pkgPrivateFlags; protected final PermissionsState mPermissionsState; - private int[] mPermissionsUpdatedForUserIds = USERS_NONE; SettingBase(int pkgFlags, int pkgPrivateFlags) { setFlags(pkgFlags); @@ -39,29 +34,12 @@ abstract class SettingBase { pkgFlags = base.pkgFlags; pkgPrivateFlags = base.pkgPrivateFlags; mPermissionsState = new PermissionsState(base.mPermissionsState); - setPermissionsUpdatedForUserIds(base.mPermissionsUpdatedForUserIds); } public PermissionsState getPermissionsState() { return mPermissionsState; } - public int[] getPermissionsUpdatedForUserIds() { - return mPermissionsUpdatedForUserIds; - } - - public void setPermissionsUpdatedForUserIds(int[] userIds) { - if (Arrays.equals(mPermissionsUpdatedForUserIds, userIds)) { - return; - } - - if (userIds == USERS_NONE) { - mPermissionsUpdatedForUserIds = userIds; - } else { - mPermissionsUpdatedForUserIds = Arrays.copyOf(userIds, userIds.length); - } - } - void setFlags(int pkgFlags) { this.pkgFlags = pkgFlags & (ApplicationInfo.FLAG_SYSTEM diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index cd50946567a7..6415343916d2 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -1139,17 +1139,6 @@ final class Settings { return new File(userDir, RUNTIME_PERMISSIONS_FILE_NAME); } - boolean isFirstRuntimePermissionsBoot() { - return !getUserRuntimePermissionsFile(UserHandle.USER_OWNER).exists(); - } - - void deleteRuntimePermissionsFiles() { - for (int userId : UserManagerService.getInstance().getUserIds()) { - File file = getUserRuntimePermissionsFile(userId); - file.delete(); - } - } - private File getUserPackagesStateBackupFile(int userId) { return new File(Environment.getUserSystemDirectory(userId), "package-restrictions-backup.xml"); @@ -2098,7 +2087,7 @@ final class Settings { } final ApplicationInfo ai = pkg.pkg.applicationInfo; - final String dataPath = ai.dataDir; + final String dataPath = new File(ai.dataDir).getCanonicalPath(); final boolean isDebug = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; final int[] gids = pkg.getPermissionsState().computeGids(userIds); @@ -2466,6 +2455,22 @@ final class Settings { } catch (NumberFormatException e) { } mFingerprint = parser.getAttributeValue(null, "fingerprint"); + + // If the build is setup to drop runtime permissions + // on update drop the files before loading them. + if (PackageManagerService.CLEAR_RUNTIME_PERMISSIONS_ON_UPGRADE) { + if (!Build.FINGERPRINT.equals(mFingerprint)) { + if (users == null) { + mRuntimePermissionsPersistence.deleteUserRuntimePermissionsFile( + UserHandle.USER_OWNER); + } else { + for (UserInfo user : users) { + mRuntimePermissionsPersistence.deleteUserRuntimePermissionsFile( + user.id); + } + } + } + } } else if (tagName.equals("database-version")) { mInternalDatabaseVersion = mExternalDatabaseVersion = 0; try { @@ -2554,15 +2559,21 @@ final class Settings { } else { if (users == null) { readPackageRestrictionsLPr(0); - mRuntimePermissionsPersistence.readStateForUserSyncLPr(UserHandle.USER_OWNER); } else { for (UserInfo user : users) { readPackageRestrictionsLPr(user.id); - mRuntimePermissionsPersistence.readStateForUserSyncLPr(user.id); } } } + if (users == null) { + mRuntimePermissionsPersistence.readStateForUserSyncLPr(UserHandle.USER_OWNER); + } else { + for (UserInfo user : users) { + mRuntimePermissionsPersistence.readStateForUserSyncLPr(user.id); + } + } + /* * Make sure all the updated system packages have their shared users * associated with them. @@ -3056,18 +3067,6 @@ final class Settings { } } - // We keep track for which users we granted permissions to be able - // to grant runtime permissions to system apps for newly appeared - // users or newly appeared system apps. If we supported runtime - // permissions during the previous boot, then we already granted - // permissions for all device users. In such a case we set the users - // for which we granted permissions to avoid clobbering of runtime - // permissions we granted to system apps but the user revoked later. - if (!isFirstRuntimePermissionsBoot()) { - final int[] userIds = UserManagerService.getInstance().getUserIds(); - ps.setPermissionsUpdatedForUserIds(userIds); - } - mDisabledSysPackages.put(name, ps); } @@ -3364,18 +3363,6 @@ final class Settings { XmlUtils.skipCurrentTag(parser); } } - - // We keep track for which users we granted permissions to be able - // to grant runtime permissions to system apps for newly appeared - // users or newly appeared system apps. If we supported runtime - // permissions during the previous boot, then we already granted - // permissions for all device users. In such a case we set the users - // for which we granted permissions to avoid clobbering of runtime - // permissions we granted to system apps but the user revoked later. - if (!isFirstRuntimePermissionsBoot()) { - final int[] userIds = UserManagerService.getInstance().getUserIds(); - packageSetting.setPermissionsUpdatedForUserIds(userIds); - } } else { XmlUtils.skipCurrentTag(parser); } @@ -3493,18 +3480,6 @@ final class Settings { XmlUtils.skipCurrentTag(parser); } } - - // We keep track for which users we granted permissions to be able - // to grant runtime permissions to system apps for newly appeared - // users or newly appeared system apps. If we supported runtime - // permissions during the previous boot, then we already granted - // permissions for all device users. In such a case we set the users - // for which we granted permissions to avoid clobbering of runtime - // permissions we granted to system apps but the user revoked later. - if (!isFirstRuntimePermissionsBoot()) { - final int[] userIds = UserManagerService.getInstance().getUserIds(); - su.setPermissionsUpdatedForUserIds(userIds); - } } else { XmlUtils.skipCurrentTag(parser); } @@ -4364,8 +4339,6 @@ final class Settings { Slog.wtf(PackageManagerService.TAG, "Failed to write settings, restoring backup", t); destination.failWrite(out); - throw new IllegalStateException("Failed to write runtime permissions," - + " restoring backup", t); } finally { IoUtils.closeQuietly(out); } @@ -4397,6 +4370,10 @@ final class Settings { } } + public void deleteUserRuntimePermissionsFile(int userId) { + getUserRuntimePermissionsFile(userId).delete(); + } + public void readStateForUserSyncLPr(int userId) { File permissionsFile = getUserRuntimePermissionsFile(userId); if (!permissionsFile.exists()) { @@ -4489,22 +4466,12 @@ final class Settings { ? Integer.parseInt(flagsStr, 16) : 0; if (granted) { - if (permissionsState.grantRuntimePermission(bp, userId) == - PermissionsState.PERMISSION_OPERATION_FAILURE) { - Slog.w(PackageManagerService.TAG, "Duplicate permission:" + name); - } else { - permissionsState.updatePermissionFlags(bp, userId, + permissionsState.grantRuntimePermission(bp, userId); + permissionsState.updatePermissionFlags(bp, userId, PackageManager.MASK_PERMISSION_FLAGS, flags); - - } } else { - if (permissionsState.revokeRuntimePermission(bp, userId) == - PermissionsState.PERMISSION_OPERATION_FAILURE) { - Slog.w(PackageManagerService.TAG, "Duplicate permission:" + name); - } else { - permissionsState.updatePermissionFlags(bp, userId, - PackageManager.MASK_PERMISSION_FLAGS, flags); - } + permissionsState.updatePermissionFlags(bp, userId, + PackageManager.MASK_PERMISSION_FLAGS, flags); } } break; diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index dbcfa19153c8..bd545dfaaa8a 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -56,6 +56,7 @@ import android.os.Debug; import android.os.FactoryTest; import android.os.Handler; import android.os.IBinder; +import android.os.IDeviceIdleController; import android.os.Looper; import android.os.Message; import android.os.Messenger; @@ -2734,6 +2735,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (!keyguardOn) { voiceIntent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH); } else { + IDeviceIdleController dic = IDeviceIdleController.Stub.asInterface( + ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER)); + if (dic != null) { + try { + dic.exitIdle("voice-search"); + } catch (RemoteException e) { + } + } voiceIntent = new Intent(RecognizerIntent.ACTION_VOICE_SEARCH_HANDS_FREE); voiceIntent.putExtra(RecognizerIntent.EXTRA_SECURE, true); } @@ -3739,13 +3748,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { attrs.gravity = Gravity.BOTTOM; mDockLayer = win.getSurfaceLayer(); } else if (attrs.type == TYPE_VOICE_INTERACTION) { - pf.left = df.left = of.left = cf.left = vf.left = mUnrestrictedScreenLeft; + pf.left = df.left = of.left = mUnrestrictedScreenLeft; pf.top = df.top = of.top = mUnrestrictedScreenTop; - pf.right = df.right = of.right = cf.right = vf.right = mUnrestrictedScreenLeft - + mUnrestrictedScreenWidth; - pf.bottom = df.bottom = of.bottom = cf.bottom = mUnrestrictedScreenTop - + mUnrestrictedScreenHeight; + pf.right = df.right = of.right = mUnrestrictedScreenLeft + mUnrestrictedScreenWidth; + pf.bottom = df.bottom = of.bottom = mUnrestrictedScreenTop + mUnrestrictedScreenHeight; cf.bottom = vf.bottom = mStableBottom; + // Note: In Phone landscape mode, the button bar should also be excluded. + cf.right = vf.right = mStableRight; + cf.left = vf.left = mStableLeft; cf.top = vf.top = mStableTop; } else if (win == mStatusBar) { pf.left = df.left = of.left = mUnrestrictedScreenLeft; @@ -5191,6 +5201,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { } void launchVoiceAssistWithWakeLock(boolean keyguardActive) { + IDeviceIdleController dic = IDeviceIdleController.Stub.asInterface( + ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER)); + if (dic != null) { + try { + dic.exitIdle("voice-search"); + } catch (RemoteException e) { + } + } Intent voiceIntent = new Intent(RecognizerIntent.ACTION_VOICE_SEARCH_HANDS_FREE); voiceIntent.putExtra(RecognizerIntent.EXTRA_SECURE, keyguardActive); diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java index 5a391f494583..d21c6d200dda 100644 --- a/services/core/java/com/android/server/power/Notifier.java +++ b/services/core/java/com/android/server/power/Notifier.java @@ -95,6 +95,9 @@ final class Notifier { private final Intent mScreenOffIntent; private final Intent mScreenBrightnessBoostIntent; + // True if the device should suspend when the screen is off due to proximity. + private final boolean mSuspendWhenScreenOffDueToProximityConfig; + // The current interactive state. This is set as soon as an interactive state // transition begins so as to capture the reason that it happened. At some point // this state will propagate to the pending state then eventually to the @@ -143,6 +146,9 @@ final class Notifier { mScreenBrightnessBoostIntent.addFlags( Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND); + mSuspendWhenScreenOffDueToProximityConfig = context.getResources().getBoolean( + com.android.internal.R.bool.config_suspendWhenScreenOffDueToProximity); + // Initialize interactive state for battery stats. try { mBatteryStats.noteInteractive(true); @@ -161,22 +167,24 @@ final class Notifier { + ", workSource=" + workSource); } - try { - final int monitorType = getBatteryStatsWakeLockMonitorType(flags); - boolean unimportantForLogging = (flags&PowerManager.UNIMPORTANT_FOR_LOGGING) != 0 - && ownerUid == Process.SYSTEM_UID; - if (workSource != null) { - mBatteryStats.noteStartWakelockFromSource(workSource, ownerPid, tag, historyTag, - monitorType, unimportantForLogging); - } else { - mBatteryStats.noteStartWakelock(ownerUid, ownerPid, tag, historyTag, - monitorType, unimportantForLogging); - // XXX need to deal with disabled operations. - mAppOps.startOperation(AppOpsManager.getToken(mAppOps), - AppOpsManager.OP_WAKE_LOCK, ownerUid, packageName); + final int monitorType = getBatteryStatsWakeLockMonitorType(flags); + if (monitorType >= 0) { + try { + final boolean unimportantForLogging = ownerUid == Process.SYSTEM_UID + && (flags & PowerManager.UNIMPORTANT_FOR_LOGGING) != 0; + if (workSource != null) { + mBatteryStats.noteStartWakelockFromSource(workSource, ownerPid, tag, + historyTag, monitorType, unimportantForLogging); + } else { + mBatteryStats.noteStartWakelock(ownerUid, ownerPid, tag, historyTag, + monitorType, unimportantForLogging); + // XXX need to deal with disabled operations. + mAppOps.startOperation(AppOpsManager.getToken(mAppOps), + AppOpsManager.OP_WAKE_LOCK, ownerUid, packageName); + } + } catch (RemoteException ex) { + // Ignore } - } catch (RemoteException ex) { - // Ignore } } @@ -188,17 +196,19 @@ final class Notifier { int newFlags, String newTag, String newPackageName, int newOwnerUid, int newOwnerPid, WorkSource newWorkSource, String newHistoryTag) { - if (workSource != null && newWorkSource != null) { - final int monitorType = getBatteryStatsWakeLockMonitorType(flags); - final int newMonitorType = getBatteryStatsWakeLockMonitorType(newFlags); - boolean unimportantForLogging = (newFlags&PowerManager.UNIMPORTANT_FOR_LOGGING) != 0 - && newOwnerUid == Process.SYSTEM_UID; + final int monitorType = getBatteryStatsWakeLockMonitorType(flags); + final int newMonitorType = getBatteryStatsWakeLockMonitorType(newFlags); + if (workSource != null && newWorkSource != null + && monitorType >= 0 && newMonitorType >= 0) { if (DEBUG) { Slog.d(TAG, "onWakeLockChanging: flags=" + newFlags + ", tag=\"" + newTag + "\", packageName=" + newPackageName + ", ownerUid=" + newOwnerUid + ", ownerPid=" + newOwnerPid + ", workSource=" + newWorkSource); } + + final boolean unimportantForLogging = newOwnerUid == Process.SYSTEM_UID + && (newFlags & PowerManager.UNIMPORTANT_FOR_LOGGING) != 0; try { mBatteryStats.noteChangeWakelockFromSource(workSource, ownerPid, tag, historyTag, monitorType, newWorkSource, newOwnerPid, newTag, newHistoryTag, @@ -225,28 +235,50 @@ final class Notifier { + ", workSource=" + workSource); } - try { - final int monitorType = getBatteryStatsWakeLockMonitorType(flags); - if (workSource != null) { - mBatteryStats.noteStopWakelockFromSource(workSource, ownerPid, tag, historyTag, - monitorType); - } else { - mBatteryStats.noteStopWakelock(ownerUid, ownerPid, tag, historyTag, monitorType); - mAppOps.finishOperation(AppOpsManager.getToken(mAppOps), - AppOpsManager.OP_WAKE_LOCK, ownerUid, packageName); + final int monitorType = getBatteryStatsWakeLockMonitorType(flags); + if (monitorType >= 0) { + try { + if (workSource != null) { + mBatteryStats.noteStopWakelockFromSource(workSource, ownerPid, tag, + historyTag, monitorType); + } else { + mBatteryStats.noteStopWakelock(ownerUid, ownerPid, tag, + historyTag, monitorType); + mAppOps.finishOperation(AppOpsManager.getToken(mAppOps), + AppOpsManager.OP_WAKE_LOCK, ownerUid, packageName); + } + } catch (RemoteException ex) { + // Ignore } - } catch (RemoteException ex) { - // Ignore } } - private static int getBatteryStatsWakeLockMonitorType(int flags) { + private int getBatteryStatsWakeLockMonitorType(int flags) { switch (flags & PowerManager.WAKE_LOCK_LEVEL_MASK) { case PowerManager.PARTIAL_WAKE_LOCK: + return BatteryStats.WAKE_TYPE_PARTIAL; + + case PowerManager.SCREEN_DIM_WAKE_LOCK: + case PowerManager.SCREEN_BRIGHT_WAKE_LOCK: + return BatteryStats.WAKE_TYPE_FULL; + case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK: + if (mSuspendWhenScreenOffDueToProximityConfig) { + return -1; + } return BatteryStats.WAKE_TYPE_PARTIAL; + + case PowerManager.DRAW_WAKE_LOCK: + return BatteryStats.WAKE_TYPE_DRAW; + + case PowerManager.DOZE_WAKE_LOCK: + // Doze wake locks are an internal implementation detail of the + // communication between dream manager service and power manager + // service. They have no additive battery impact. + return -1; + default: - return BatteryStats.WAKE_TYPE_FULL; + return -1; } } diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 3af97db93c5d..51bb36fd56af 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -970,6 +970,7 @@ public final class PowerManagerService extends SystemService case PowerManager.SCREEN_BRIGHT_WAKE_LOCK: case PowerManager.FULL_WAKE_LOCK: case PowerManager.DOZE_WAKE_LOCK: + case PowerManager.DRAW_WAKE_LOCK: return true; case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK: diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index 58c3ea1f619c..469240349d64 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -24,4 +24,5 @@ public interface StatusBarManagerInternal { void notificationLightPulse(int argb, int onMillis, int offMillis); void notificationLightOff(); void showScreenPinningRequest(); + void showAssistDisclosure(); } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 5669f30757d9..a7543790cc10 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -154,6 +154,16 @@ public class StatusBarManagerService extends IStatusBarService.Stub { } } } + + @Override + public void showAssistDisclosure() { + if (mBar != null) { + try { + mBar.showAssistDisclosure(); + } catch (RemoteException e) { + } + } + } }; // ================================================================================ diff --git a/services/core/java/com/android/server/tv/PersistentDataStore.java b/services/core/java/com/android/server/tv/PersistentDataStore.java index f9b5b9a4440d..f6b17059b934 100644 --- a/services/core/java/com/android/server/tv/PersistentDataStore.java +++ b/services/core/java/com/android/server/tv/PersistentDataStore.java @@ -111,8 +111,8 @@ final class PersistentDataStore { public boolean isRatingBlocked(TvContentRating rating) { loadIfNeeded(); synchronized (mBlockedRatings) { - for (TvContentRating blcokedRating : mBlockedRatings) { - if (rating.contains(blcokedRating)) { + for (TvContentRating blockedRating : mBlockedRatings) { + if (rating.contains(blockedRating)) { return true; } } diff --git a/services/core/java/com/android/server/tv/TvInputHal.java b/services/core/java/com/android/server/tv/TvInputHal.java index de271b8fffa4..a035826c770d 100644 --- a/services/core/java/com/android/server/tv/TvInputHal.java +++ b/services/core/java/com/android/server/tv/TvInputHal.java @@ -47,11 +47,10 @@ final class TvInputHal implements Handler.Callback { public static final int EVENT_FIRST_FRAME_CAPTURED = 4; public interface Callback { - public void onDeviceAvailable( - TvInputHardwareInfo info, TvStreamConfig[] configs); - public void onDeviceUnavailable(int deviceId); - public void onStreamConfigurationChanged(int deviceId, TvStreamConfig[] configs); - public void onFirstFrameCaptured(int deviceId, int streamId); + void onDeviceAvailable(TvInputHardwareInfo info, TvStreamConfig[] configs); + void onDeviceUnavailable(int deviceId); + void onStreamConfigurationChanged(int deviceId, TvStreamConfig[] configs); + void onFirstFrameCaptured(int deviceId, int streamId); } private native long nativeOpen(MessageQueue queue); @@ -152,7 +151,7 @@ final class TvInputHal implements Handler.Callback { // Handler.Callback implementation - private final Queue<Message> mPendingMessageQueue = new LinkedList<Message>(); + private final Queue<Message> mPendingMessageQueue = new LinkedList<>(); @Override public boolean handleMessage(Message msg) { diff --git a/services/core/java/com/android/server/tv/TvInputHardwareManager.java b/services/core/java/com/android/server/tv/TvInputHardwareManager.java index 444969fd4c6b..7f4c42b5c686 100644 --- a/services/core/java/com/android/server/tv/TvInputHardwareManager.java +++ b/services/core/java/com/android/server/tv/TvInputHardwareManager.java @@ -252,13 +252,8 @@ class TvInputHardwareManager implements TvInputHal.Callback { Connection connection, int callingUid, int resolvedUserId) { Integer connectionCallingUid = connection.getCallingUidLocked(); Integer connectionResolvedUserId = connection.getResolvedUserIdLocked(); - if (connectionCallingUid == null || connectionResolvedUserId == null) { - return true; - } - if (connectionCallingUid != callingUid || connectionResolvedUserId != resolvedUserId) { - return true; - } - return false; + return connectionCallingUid == null || connectionResolvedUserId == null + || connectionCallingUid != callingUid || connectionResolvedUserId != resolvedUserId; } private int convertConnectedToState(boolean connected) { @@ -303,7 +298,6 @@ class TvInputHardwareManager implements TvInputHal.Callback { mHandler.obtainMessage(ListenerHandler.STATE_CHANGED, convertConnectedToState(connection.getConfigsLocked().length > 0), 0, info.getId()).sendToTarget(); - return; } } } @@ -435,7 +429,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { */ public List<TvStreamConfig> getAvailableTvStreamConfigList(String inputId, int callingUid, int resolvedUserId) { - List<TvStreamConfig> configsList = new ArrayList<TvStreamConfig>(); + List<TvStreamConfig> configsList = new ArrayList<>(); synchronized (mLock) { int deviceId = findDeviceIdForInputIdLocked(inputId); if (deviceId < 0) { @@ -508,25 +502,31 @@ class TvInputHardwareManager implements TvInputHal.Callback { private void handleVolumeChange(Context context, Intent intent) { String action = intent.getAction(); - if (action.equals(AudioManager.VOLUME_CHANGED_ACTION)) { - int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); - if (streamType != AudioManager.STREAM_MUSIC) { - return; + switch (action) { + case AudioManager.VOLUME_CHANGED_ACTION: { + int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); + if (streamType != AudioManager.STREAM_MUSIC) { + return; + } + int index = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, 0); + if (index == mCurrentIndex) { + return; + } + mCurrentIndex = index; + break; } - int index = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, 0); - if (index == mCurrentIndex) { - return; + case AudioManager.STREAM_MUTE_CHANGED_ACTION: { + int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); + if (streamType != AudioManager.STREAM_MUSIC) { + return; + } + // volume index will be updated at onMediaStreamVolumeChanged() through + // updateVolume(). + break; } - mCurrentIndex = index; - } else if (action.equals(AudioManager.STREAM_MUTE_CHANGED_ACTION)) { - int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); - if (streamType != AudioManager.STREAM_MUSIC) { + default: + Slog.w(TAG, "Unrecognized intent: " + intent); return; - } - // volume index will be updated at onMediaStreamVolumeChanged() through updateVolume(). - } else { - Slog.w(TAG, "Unrecognized intent: " + intent); - return; } synchronized (mLock) { for (int i = 0; i < mConnections.size(); ++i) { @@ -691,7 +691,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { private void findAudioSinkFromAudioPolicy(List<AudioDevicePort> sinks) { sinks.clear(); - ArrayList<AudioDevicePort> devicePorts = new ArrayList<AudioDevicePort>(); + ArrayList<AudioDevicePort> devicePorts = new ArrayList<>(); if (mAudioManager.listAudioDevicePorts(devicePorts) != AudioManager.SUCCESS) { return; } @@ -707,7 +707,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { if (type == AudioManager.DEVICE_NONE) { return null; } - ArrayList<AudioDevicePort> devicePorts = new ArrayList<AudioDevicePort>(); + ArrayList<AudioDevicePort> devicePorts = new ArrayList<>(); if (mAudioManager.listAudioDevicePorts(devicePorts) != AudioManager.SUCCESS) { return null; } @@ -900,7 +900,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { mAudioManager.createAudioPatch( audioPatchArray, new AudioPortConfig[] { sourceConfig }, - sinkConfigs.toArray(new AudioPortConfig[0])); + sinkConfigs.toArray(new AudioPortConfig[sinkConfigs.size()])); mAudioPatch = audioPatchArray[0]; if (sourceGainConfig != null) { mAudioManager.setAudioPortGain(mAudioSource, sourceGainConfig); @@ -1027,12 +1027,12 @@ class TvInputHardwareManager implements TvInputHal.Callback { } interface Listener { - public void onStateChanged(String inputId, int state); - public void onHardwareDeviceAdded(TvInputHardwareInfo info); - public void onHardwareDeviceRemoved(TvInputHardwareInfo info); - public void onHdmiDeviceAdded(HdmiDeviceInfo device); - public void onHdmiDeviceRemoved(HdmiDeviceInfo device); - public void onHdmiDeviceUpdated(String inputId, HdmiDeviceInfo device); + void onStateChanged(String inputId, int state); + void onHardwareDeviceAdded(TvInputHardwareInfo info); + void onHardwareDeviceRemoved(TvInputHardwareInfo info); + void onHdmiDeviceAdded(HdmiDeviceInfo device); + void onHdmiDeviceRemoved(HdmiDeviceInfo device); + void onHdmiDeviceUpdated(String inputId, HdmiDeviceInfo device); } private class ListenerHandler extends Handler { @@ -1074,7 +1074,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { } case HDMI_DEVICE_UPDATED: { HdmiDeviceInfo info = (HdmiDeviceInfo) msg.obj; - String inputId = null; + String inputId; synchronized (mLock) { inputId = mHdmiInputIdMap.get(info.getId()); } diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index 4895d125d762..f5c5861a0ebd 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -121,7 +121,7 @@ public final class TvInputManagerService extends SystemService { private int mCurrentUserId = UserHandle.USER_OWNER; // A map from user id to UserState. - private final SparseArray<UserState> mUserStates = new SparseArray<UserState>(); + private final SparseArray<UserState> mUserStates = new SparseArray<>(); private final WatchLogHandler mWatchLogHandler; @@ -231,8 +231,7 @@ public final class TvInputManagerService extends SystemService { } } - ArrayList<ContentProviderOperation> operations = - new ArrayList<ContentProviderOperation>(); + ArrayList<ContentProviderOperation> operations = new ArrayList<>(); String selection = TvContract.BaseTvColumns.COLUMN_PACKAGE_NAME + "=?"; String[] selectionArgs = { packageName }; @@ -292,7 +291,7 @@ public final class TvInputManagerService extends SystemService { new Intent(TvInputService.SERVICE_INTERFACE), PackageManager.GET_SERVICES | PackageManager.GET_META_DATA, userId); - List<TvInputInfo> inputList = new ArrayList<TvInputInfo>(); + List<TvInputInfo> inputList = new ArrayList<>(); for (ResolveInfo ri : services) { ServiceInfo si = ri.serviceInfo; if (!android.Manifest.permission.BIND_TV_INPUT.equals(si.permission)) { @@ -325,7 +324,7 @@ public final class TvInputManagerService extends SystemService { userState.packageSet.add(si.packageName); } - Map<String, TvInputState> inputMap = new HashMap<String, TvInputState>(); + Map<String, TvInputState> inputMap = new HashMap<>(); for (TvInputInfo info : inputList) { if (DEBUG) { Slog.d(TAG, "add " + info.getId()); @@ -777,7 +776,7 @@ public final class TvInputManagerService extends SystemService { try { synchronized (mLock) { UserState userState = getUserStateLocked(resolvedUserId); - List<TvInputInfo> inputList = new ArrayList<TvInputInfo>(); + List<TvInputInfo> inputList = new ArrayList<>(); for (TvInputState state : userState.inputMap.values()) { inputList.add(state.info); } @@ -934,7 +933,7 @@ public final class TvInputManagerService extends SystemService { try { synchronized (mLock) { UserState userState = getUserStateLocked(resolvedUserId); - List<String> ratings = new ArrayList<String>(); + List<String> ratings = new ArrayList<>(); for (TvContentRating rating : userState.persistentDataStore.getBlockedRatings()) { ratings.add(rating.flattenToString()); @@ -1012,7 +1011,7 @@ public final class TvInputManagerService extends SystemService { userState.serviceStateMap.put(info.getComponent(), serviceState); } // Send a null token immediately while reconnecting. - if (serviceState.reconnecting == true) { + if (serviceState.reconnecting) { sendSessionTokenToClientLocked(client, inputId, null, null, seq); return; } @@ -1210,7 +1209,6 @@ public final class TvInputManagerService extends SystemService { .sendToTarget(); } catch (RemoteException | SessionNotFoundException e) { Slog.e(TAG, "error in tune", e); - return; } } } finally { @@ -1658,10 +1656,9 @@ public final class TvInputManagerService extends SystemService { UserState userState = getUserStateLocked(resolvedUserId); if (userState.sessionStateMap.size() == 1) { return true; - } - else if (userState.sessionStateMap.size() == 2) { + } else if (userState.sessionStateMap.size() == 2) { SessionState[] sessionStates = userState.sessionStateMap.values().toArray( - new SessionState[0]); + new SessionState[2]); // Check if there is a wrapper input. if (sessionStates[0].hardwareSessionToken != null || sessionStates[1].hardwareSessionToken != null) { @@ -1800,30 +1797,26 @@ public final class TvInputManagerService extends SystemService { private static final class UserState { // A mapping from the TV input id to its TvInputState. - private Map<String, TvInputState> inputMap = new HashMap<String, TvInputState>(); + private Map<String, TvInputState> inputMap = new HashMap<>(); // A set of all TV input packages. - private final Set<String> packageSet = new HashSet<String>(); + private final Set<String> packageSet = new HashSet<>(); // A list of all TV content rating systems defined. private final List<TvContentRatingSystemInfo> - contentRatingSystemList = new ArrayList<TvContentRatingSystemInfo>(); + contentRatingSystemList = new ArrayList<>(); // A mapping from the token of a client to its state. - private final Map<IBinder, ClientState> clientStateMap = - new HashMap<IBinder, ClientState>(); + private final Map<IBinder, ClientState> clientStateMap = new HashMap<>(); // A mapping from the name of a TV input service to its state. - private final Map<ComponentName, ServiceState> serviceStateMap = - new HashMap<ComponentName, ServiceState>(); + private final Map<ComponentName, ServiceState> serviceStateMap = new HashMap<>(); // A mapping from the token of a TV input session to its state. - private final Map<IBinder, SessionState> sessionStateMap = - new HashMap<IBinder, SessionState>(); + private final Map<IBinder, SessionState> sessionStateMap = new HashMap<>(); // A set of callbacks. - private final Set<ITvInputManagerCallback> callbackSet = - new HashSet<ITvInputManagerCallback>(); + private final Set<ITvInputManagerCallback> callbackSet = new HashSet<>(); // The token of a "main" TV input session. private IBinder mainSessionToken = null; @@ -1838,7 +1831,7 @@ public final class TvInputManagerService extends SystemService { } private final class ClientState implements IBinder.DeathRecipient { - private final List<IBinder> sessionTokens = new ArrayList<IBinder>(); + private final List<IBinder> sessionTokens = new ArrayList<>(); private IBinder clientToken; private final int userId; @@ -1871,11 +1864,11 @@ public final class TvInputManagerService extends SystemService { } private final class ServiceState { - private final List<IBinder> sessionTokens = new ArrayList<IBinder>(); + private final List<IBinder> sessionTokens = new ArrayList<>(); private final ServiceConnection connection; private final ComponentName component; private final boolean isHardware; - private final List<TvInputInfo> inputList = new ArrayList<TvInputInfo>(); + private final List<TvInputInfo> inputList = new ArrayList<>(); private ITvInputService service; private ServiceCallback callback; @@ -2125,13 +2118,13 @@ public final class TvInputManagerService extends SystemService { } @Override - public void onSessionCreated(ITvInputSession session, IBinder harewareSessionToken) { + public void onSessionCreated(ITvInputSession session, IBinder hardwareSessionToken) { if (DEBUG) { Slog.d(TAG, "onSessionCreated(inputId=" + mSessionState.info.getId() + ")"); } synchronized (mLock) { mSessionState.session = session; - mSessionState.hardwareSessionToken = harewareSessionToken; + mSessionState.hardwareSessionToken = hardwareSessionToken; if (session != null && addSessionTokenToClientStateLocked(session)) { sendSessionTokenToClientLocked(mSessionState.client, mSessionState.info.getId(), mSessionState.sessionToken, mChannels[0], @@ -2559,7 +2552,7 @@ public final class TvInputManagerService extends SystemService { @Override public void onHdmiDeviceUpdated(String inputId, HdmiDeviceInfo deviceInfo) { synchronized (mLock) { - Integer state = null; + Integer state; switch (deviceInfo.getDevicePowerStatus()) { case HdmiControlManager.POWER_STATUS_ON: state = INPUT_STATE_CONNECTED; @@ -2575,7 +2568,7 @@ public final class TvInputManagerService extends SystemService { break; } if (state != null) { - setStateLocked(inputId, state.intValue(), mCurrentUserId); + setStateLocked(inputId, state, mCurrentUserId); } } } diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateService.java b/services/core/java/com/android/server/webkit/WebViewUpdateService.java index ac79b36f7005..d4c5f8716c0e 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateService.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateService.java @@ -40,8 +40,6 @@ public class WebViewUpdateService extends SystemService { private boolean mRelroReady32Bit = false; private boolean mRelroReady64Bit = false; - private String oldWebViewPackageName = null; - private BroadcastReceiver mWebViewUpdatedReceiver; public WebViewUpdateService(Context context) { @@ -53,22 +51,9 @@ public class WebViewUpdateService extends SystemService { mWebViewUpdatedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - - for (String packageName : WebViewFactory.getWebViewPackageNames()) { - String webviewPackage = "package:" + packageName; - - if (webviewPackage.equals(intent.getDataString())) { - String usedPackageName = - WebViewFactory.findPreferredWebViewPackage().packageName; - // Only trigger update actions if the updated package is the one that - // will be used, or the one that was in use before the update. - if (packageName.equals(usedPackageName) || - packageName.equals(oldWebViewPackageName)) { - onWebViewUpdateInstalled(); - oldWebViewPackageName = usedPackageName; - } - return; - } + String webviewPackage = "package:" + WebViewFactory.getWebViewPackageName(); + if (webviewPackage.equals(intent.getDataString())) { + onWebViewUpdateInstalled(); } } }; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 1b63ca02cd8f..ace59970d0bf 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -7139,20 +7139,14 @@ public class WindowManagerService extends IWindowManager.Stub public Configuration computeNewConfiguration() { synchronized (mWindowMap) { - if (!mDisplayReady) { - return null; - } - Configuration config = computeNewConfigurationLocked(); - if (mWaitingForConfig) { - mWaitingForConfig = false; - mLastFinishedFreezeSource = "new-config"; - performLayoutAndPlaceSurfacesLocked(); - } - return config; + return computeNewConfigurationLocked(); } } - Configuration computeNewConfigurationLocked() { + private Configuration computeNewConfigurationLocked() { + if (!mDisplayReady) { + return null; + } Configuration config = new Configuration(); config.fontScale = 0; computeScreenConfigurationLocked(config); @@ -9678,7 +9672,7 @@ public class WindowManagerService extends IWindowManager.Stub /** * Extracted from {@link #performLayoutAndPlaceSurfacesLockedInner} to reduce size of method. - * @param w WindowState this method is applied to. + * @param w WindowState this method is applied to. * @param innerDw Width of app window. * @param innerDh Height of app window. */ diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 5064d8fd3a1e..f1331e94bd42 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -1383,10 +1383,21 @@ class WindowStateAnimator { // Adjust for surface insets. final LayoutParams attrs = w.getAttrs(); - width += attrs.surfaceInsets.left + attrs.surfaceInsets.right; - height += attrs.surfaceInsets.top + attrs.surfaceInsets.bottom; - left -= attrs.surfaceInsets.left; - top -= attrs.surfaceInsets.top; + final int displayId = w.getDisplayId(); + float scale = 1.0f; + // Magnification is supported only for the default display. + if (mService.mAccessibilityController != null && displayId == Display.DEFAULT_DISPLAY) { + MagnificationSpec spec = + mService.mAccessibilityController.getMagnificationSpecForWindowLocked(w); + if (spec != null && !spec.isNop()) { + scale = spec.scale; + } + } + + width += scale * (attrs.surfaceInsets.left + attrs.surfaceInsets.right); + height += scale * (attrs.surfaceInsets.top + attrs.surfaceInsets.bottom); + left -= scale * attrs.surfaceInsets.left; + top -= scale * attrs.surfaceInsets.top; final boolean surfaceMoved = mSurfaceX != left || mSurfaceY != top; if (surfaceMoved) { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index f1f61f3a40a5..3b62b61a1f3c 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -211,6 +211,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { DEVICE_OWNER_USER_RESTRICTIONS.add(UserManager.DISALLOW_SMS); DEVICE_OWNER_USER_RESTRICTIONS.add(UserManager.DISALLOW_FUN); DEVICE_OWNER_USER_RESTRICTIONS.add(UserManager.DISALLOW_SAFE_BOOT); + DEVICE_OWNER_USER_RESTRICTIONS.add(UserManager.DISALLOW_CREATE_WINDOWS); } // The following user restrictions cannot be changed by any active admin, including device diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 29c65dbea8a6..76226b4bcd45 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -292,7 +292,7 @@ public final class SystemServer { private void createSystemContext() { ActivityThread activityThread = ActivityThread.systemMain(); mSystemContext = activityThread.getSystemContext(); - mSystemContext.setTheme(android.R.style.Theme_Material_DayNight_DarkActionBar); + mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar); } /** diff --git a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java index b58c2e241e28..712db095587d 100644 --- a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java @@ -134,6 +134,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { private final NetworkInfo mNetworkInfo; private final NetworkCapabilities mNetworkCapabilities; private final Thread mThread; + private int mScore; private NetworkAgent mNetworkAgent; MockNetworkAgent(int transport) { @@ -142,13 +143,12 @@ public class ConnectivityServiceTest extends AndroidTestCase { mNetworkInfo = new NetworkInfo(type, 0, typeName, "Mock"); mNetworkCapabilities = new NetworkCapabilities(); mNetworkCapabilities.addTransportType(transport); - final int score; switch (transport) { case TRANSPORT_WIFI: - score = 60; + mScore = 60; break; case TRANSPORT_CELLULAR: - score = 50; + mScore = 50; break; default: throw new UnsupportedOperationException("unimplemented network type"); @@ -159,7 +159,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { Looper.prepare(); mNetworkAgent = new NetworkAgent(Looper.myLooper(), mServiceContext, "Mock" + typeName, mNetworkInfo, mNetworkCapabilities, - new LinkProperties(), score, new NetworkMisc()) { + new LinkProperties(), mScore, new NetworkMisc()) { public void unwanted() {} }; initComplete.open(); @@ -167,7 +167,12 @@ public class ConnectivityServiceTest extends AndroidTestCase { } }; mThread.start(); - initComplete.block(); + waitFor(initComplete); + } + + public void adjustScore(int change) { + mScore += change; + mNetworkAgent.sendNetworkScore(mScore); } /** @@ -209,7 +214,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { if (validated) { // Wait for network to validate. - validatedCv.block(); + waitFor(validatedCv); mNetworkCapabilities.addCapability(NET_CAPABILITY_INTERNET); mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities); } @@ -330,6 +335,10 @@ public class ConnectivityServiceTest extends AndroidTestCase { public boolean get(); } + /** + * Wait up to 500ms for {@code criteria.get()} to become true, polling. + * Fails if 500ms goes by before {@code criteria.get()} to become true. + */ static private void waitFor(Criteria criteria) { int delays = 0; while (!criteria.get()) { @@ -341,6 +350,26 @@ public class ConnectivityServiceTest extends AndroidTestCase { } } + /** + * Wait up to 500ms for {@code conditonVariable} to open. + * Fails if 500ms goes by before {@code conditionVariable} opens. + */ + static private void waitFor(ConditionVariable conditionVariable) { + assertTrue(conditionVariable.block(500)); + } + + /** + * This should only be used to verify that nothing happens, in other words that no unexpected + * changes occur. It should never be used to wait for a specific positive signal to occur. + */ + private void shortSleep() { + // TODO: Instead of sleeping, instead wait for all message loops to idle. + try { + Thread.sleep(500); + } catch (InterruptedException e) { + } + } + @Override public void setUp() throws Exception { super.setUp(); @@ -431,7 +460,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { // Test bringing up validated cellular. ConditionVariable cv = waitForConnectivityBroadcasts(1); mCellNetworkAgent.connect(true); - cv.block(); + waitFor(cv); verifyActiveNetwork(TRANSPORT_CELLULAR); assertEquals(2, mCm.getAllNetworks().length); assertTrue(mCm.getAllNetworks()[0].equals(mCm.getActiveNetwork()) || @@ -441,7 +470,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { // Test bringing up validated WiFi. cv = waitForConnectivityBroadcasts(2); mWiFiNetworkAgent.connect(true); - cv.block(); + waitFor(cv); verifyActiveNetwork(TRANSPORT_WIFI); assertEquals(2, mCm.getAllNetworks().length); assertTrue(mCm.getAllNetworks()[0].equals(mCm.getActiveNetwork()) || @@ -459,7 +488,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { // Test WiFi disconnect. cv = waitForConnectivityBroadcasts(1); mWiFiNetworkAgent.disconnect(); - cv.block(); + waitFor(cv); verifyNoNetwork(); } @@ -469,38 +498,32 @@ public class ConnectivityServiceTest extends AndroidTestCase { mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); ConditionVariable cv = waitForConnectivityBroadcasts(1); mWiFiNetworkAgent.connect(false); - cv.block(); + waitFor(cv); verifyActiveNetwork(TRANSPORT_WIFI); // Test bringing up unvalidated cellular mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(false); - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - } + shortSleep(); verifyActiveNetwork(TRANSPORT_WIFI); // Test cellular disconnect. mCellNetworkAgent.disconnect(); - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - } + shortSleep(); verifyActiveNetwork(TRANSPORT_WIFI); // Test bringing up validated cellular mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); cv = waitForConnectivityBroadcasts(2); mCellNetworkAgent.connect(true); - cv.block(); + waitFor(cv); verifyActiveNetwork(TRANSPORT_CELLULAR); // Test cellular disconnect. cv = waitForConnectivityBroadcasts(2); mCellNetworkAgent.disconnect(); - cv.block(); + waitFor(cv); verifyActiveNetwork(TRANSPORT_WIFI); // Test WiFi disconnect. cv = waitForConnectivityBroadcasts(1); mWiFiNetworkAgent.disconnect(); - cv.block(); + waitFor(cv); verifyNoNetwork(); } @@ -510,27 +533,209 @@ public class ConnectivityServiceTest extends AndroidTestCase { mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); ConditionVariable cv = waitForConnectivityBroadcasts(1); mCellNetworkAgent.connect(false); - cv.block(); + waitFor(cv); verifyActiveNetwork(TRANSPORT_CELLULAR); // Test bringing up unvalidated WiFi. mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); cv = waitForConnectivityBroadcasts(2); mWiFiNetworkAgent.connect(false); - cv.block(); + waitFor(cv); verifyActiveNetwork(TRANSPORT_WIFI); // Test WiFi disconnect. cv = waitForConnectivityBroadcasts(2); mWiFiNetworkAgent.disconnect(); - cv.block(); + waitFor(cv); verifyActiveNetwork(TRANSPORT_CELLULAR); // Test cellular disconnect. cv = waitForConnectivityBroadcasts(1); mCellNetworkAgent.disconnect(); - cv.block(); + waitFor(cv); verifyNoNetwork(); } @LargeTest + public void testCellularOutscoresWeakWifi() throws Exception { + // Test bringing up validated cellular. + mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); + ConditionVariable cv = waitForConnectivityBroadcasts(1); + mCellNetworkAgent.connect(true); + waitFor(cv); + verifyActiveNetwork(TRANSPORT_CELLULAR); + // Test bringing up validated WiFi. + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + cv = waitForConnectivityBroadcasts(2); + mWiFiNetworkAgent.connect(true); + waitFor(cv); + verifyActiveNetwork(TRANSPORT_WIFI); + // Test WiFi getting really weak. + cv = waitForConnectivityBroadcasts(2); + mWiFiNetworkAgent.adjustScore(-11); + waitFor(cv); + verifyActiveNetwork(TRANSPORT_CELLULAR); + // Test WiFi restoring signal strength. + cv = waitForConnectivityBroadcasts(2); + mWiFiNetworkAgent.adjustScore(11); + waitFor(cv); + verifyActiveNetwork(TRANSPORT_WIFI); + mCellNetworkAgent.disconnect(); + mWiFiNetworkAgent.disconnect(); + } + + enum CallbackState { + NONE, + AVAILABLE, + LOSING, + LOST + } + + private class TestNetworkCallback extends NetworkCallback { + private final ConditionVariable mConditionVariable = new ConditionVariable(); + private CallbackState mLastCallback = CallbackState.NONE; + + public void onAvailable(Network network) { + assertEquals(CallbackState.NONE, mLastCallback); + mLastCallback = CallbackState.AVAILABLE; + mConditionVariable.open(); + } + + public void onLosing(Network network, int maxMsToLive) { + assertEquals(CallbackState.NONE, mLastCallback); + mLastCallback = CallbackState.LOSING; + mConditionVariable.open(); + } + + public void onLost(Network network) { + assertEquals(CallbackState.NONE, mLastCallback); + mLastCallback = CallbackState.LOST; + mConditionVariable.open(); + } + + ConditionVariable getConditionVariable() { + mLastCallback = CallbackState.NONE; + mConditionVariable.close(); + return mConditionVariable; + } + + CallbackState getLastCallback() { + return mLastCallback; + } + } + + @LargeTest + public void testStateChangeNetworkCallbacks() throws Exception { + final TestNetworkCallback wifiNetworkCallback = new TestNetworkCallback(); + final TestNetworkCallback cellNetworkCallback = new TestNetworkCallback(); + final NetworkRequest wifiRequest = new NetworkRequest.Builder() + .addTransportType(TRANSPORT_WIFI).build(); + final NetworkRequest cellRequest = new NetworkRequest.Builder() + .addTransportType(TRANSPORT_CELLULAR).build(); + mCm.registerNetworkCallback(wifiRequest, wifiNetworkCallback); + mCm.registerNetworkCallback(cellRequest, cellNetworkCallback); + + // Test unvalidated networks + ConditionVariable cellCv = cellNetworkCallback.getConditionVariable(); + ConditionVariable wifiCv = wifiNetworkCallback.getConditionVariable(); + ConditionVariable cv = waitForConnectivityBroadcasts(1); + mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); + mCellNetworkAgent.connect(false); + waitFor(cellCv); + assertEquals(CallbackState.AVAILABLE, cellNetworkCallback.getLastCallback()); + assertEquals(CallbackState.NONE, wifiNetworkCallback.getLastCallback()); + assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + waitFor(cv); + + cellCv = cellNetworkCallback.getConditionVariable(); + wifiCv = wifiNetworkCallback.getConditionVariable(); + // This should not trigger spurious onAvailable() callbacks, b/21762680. + mCellNetworkAgent.adjustScore(-1); + shortSleep(); + assertEquals(CallbackState.NONE, wifiNetworkCallback.getLastCallback()); + assertEquals(CallbackState.NONE, cellNetworkCallback.getLastCallback()); + assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + + cellCv = cellNetworkCallback.getConditionVariable(); + wifiCv = wifiNetworkCallback.getConditionVariable(); + cv = waitForConnectivityBroadcasts(2); + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + mWiFiNetworkAgent.connect(false); + waitFor(wifiCv); + assertEquals(CallbackState.AVAILABLE, wifiNetworkCallback.getLastCallback()); + assertEquals(CallbackState.NONE, cellNetworkCallback.getLastCallback()); + assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + waitFor(cv); + + cellCv = cellNetworkCallback.getConditionVariable(); + wifiCv = wifiNetworkCallback.getConditionVariable(); + cv = waitForConnectivityBroadcasts(2); + mWiFiNetworkAgent.disconnect(); + waitFor(wifiCv); + assertEquals(CallbackState.LOST, wifiNetworkCallback.getLastCallback()); + assertEquals(CallbackState.NONE, cellNetworkCallback.getLastCallback()); + waitFor(cv); + + cellCv = cellNetworkCallback.getConditionVariable(); + wifiCv = wifiNetworkCallback.getConditionVariable(); + cv = waitForConnectivityBroadcasts(1); + mCellNetworkAgent.disconnect(); + waitFor(cellCv); + assertEquals(CallbackState.LOST, cellNetworkCallback.getLastCallback()); + assertEquals(CallbackState.NONE, wifiNetworkCallback.getLastCallback()); + waitFor(cv); + + // Test validated networks + + cellCv = cellNetworkCallback.getConditionVariable(); + wifiCv = wifiNetworkCallback.getConditionVariable(); + // Our method for faking successful validation generates an additional callback, so wait + // for broadcast instead. + cv = waitForConnectivityBroadcasts(1); + mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); + mCellNetworkAgent.connect(true); + waitFor(cv); + waitFor(cellCv); + assertEquals(CallbackState.AVAILABLE, cellNetworkCallback.getLastCallback()); + assertEquals(CallbackState.NONE, wifiNetworkCallback.getLastCallback()); + assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + + cellCv = cellNetworkCallback.getConditionVariable(); + wifiCv = wifiNetworkCallback.getConditionVariable(); + // This should not trigger spurious onAvailable() callbacks, b/21762680. + mCellNetworkAgent.adjustScore(-1); + shortSleep(); + assertEquals(CallbackState.NONE, wifiNetworkCallback.getLastCallback()); + assertEquals(CallbackState.NONE, cellNetworkCallback.getLastCallback()); + assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + + cellCv = cellNetworkCallback.getConditionVariable(); + wifiCv = wifiNetworkCallback.getConditionVariable(); + // Our method for faking successful validation generates an additional callback, so wait + // for broadcast instead. + cv = waitForConnectivityBroadcasts(1); + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + mWiFiNetworkAgent.connect(true); + waitFor(cv); + waitFor(wifiCv); + assertEquals(CallbackState.AVAILABLE, wifiNetworkCallback.getLastCallback()); + waitFor(cellCv); + assertEquals(CallbackState.LOSING, cellNetworkCallback.getLastCallback()); + assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + + cellCv = cellNetworkCallback.getConditionVariable(); + wifiCv = wifiNetworkCallback.getConditionVariable(); + mWiFiNetworkAgent.disconnect(); + waitFor(wifiCv); + assertEquals(CallbackState.LOST, wifiNetworkCallback.getLastCallback()); + assertEquals(CallbackState.NONE, cellNetworkCallback.getLastCallback()); + + cellCv = cellNetworkCallback.getConditionVariable(); + wifiCv = wifiNetworkCallback.getConditionVariable(); + mCellNetworkAgent.disconnect(); + waitFor(cellCv); + assertEquals(CallbackState.LOST, cellNetworkCallback.getLastCallback()); + assertEquals(CallbackState.NONE, wifiNetworkCallback.getLastCallback()); + } + + @LargeTest public void testNetworkFactoryRequests() throws Exception { NetworkCapabilities filter = new NetworkCapabilities(); filter.addCapability(NET_CAPABILITY_INTERNET); @@ -541,7 +746,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { testFactory.setScoreFilter(40); ConditionVariable cv = testFactory.getNetworkStartedCV(); testFactory.register(); - cv.block(); + waitFor(cv); assertEquals(1, testFactory.getMyRequestCount()); assertEquals(true, testFactory.getMyStartRequested()); @@ -550,10 +755,10 @@ public class ConnectivityServiceTest extends AndroidTestCase { cv = waitForConnectivityBroadcasts(1); ConditionVariable cvRelease = testFactory.getNetworkStoppedCV(); testAgent.connect(true); - cv.block(); + waitFor(cv); // part of the bringup makes another network request and then releases it // wait for the release - cvRelease.block(); + waitFor(cvRelease); assertEquals(false, testFactory.getMyStartRequested()); testFactory.waitForNetworkRequests(1); @@ -579,7 +784,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { // drop the higher scored network cv = waitForConnectivityBroadcasts(1); testAgent.disconnect(); - cv.block(); + waitFor(cv); assertEquals(1, testFactory.getMyRequestCount()); assertEquals(true, testFactory.getMyStartRequested()); @@ -605,7 +810,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { // // cv = waitForConnectivityBroadcasts(1); // mTrackerHandler.obtainMessage(EVENT_STATE_CHANGED, mMobile.info).sendToTarget(); -// cv.block(); +// waitFor(cv); // // // verify that both routes were added // int mobileNetId = mMobile.tracker.getNetwork().netId; @@ -625,7 +830,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { // // cv = waitForConnectivityBroadcasts(1); // mTrackerHandler.obtainMessage(EVENT_STATE_CHANGED, mMobile.info).sendToTarget(); -// cv.block(); +// waitFor(cv); // // reset(mNetManager); // @@ -641,7 +846,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { // // cv = waitForConnectivityBroadcasts(1); // mTrackerHandler.obtainMessage(EVENT_STATE_CHANGED, mWifi.info).sendToTarget(); -// cv.block(); +// waitFor(cv); // // // verify that wifi routes added, and teardown requested // int wifiNetId = mWifi.tracker.getNetwork().netId; @@ -660,7 +865,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { // // cv = waitForConnectivityBroadcasts(1); // mTrackerHandler.obtainMessage(EVENT_STATE_CHANGED, mMobile.info).sendToTarget(); -// cv.block(); +// waitFor(cv); // // verify(mNetManager).removeRoute(eq(mobileNetId), eq(MOBILE_ROUTE_V4)); // verify(mNetManager).removeRoute(eq(mobileNetId), eq(MOBILE_ROUTE_V6)); diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 3767fce183d9..490236e41ac7 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -31,6 +31,7 @@ import android.app.usage.UsageStatsManagerInternal.AppIdleStateChangeListener; import android.appwidget.AppWidgetManager; import android.content.BroadcastReceiver; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -69,8 +70,8 @@ import android.view.Display; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IBatteryStats; import com.android.internal.os.BackgroundThread; +import com.android.internal.os.SomeArgs; import com.android.internal.util.IndentingPrintWriter; -import com.android.server.DeviceIdleController; import com.android.server.SystemService; import java.io.BufferedReader; @@ -117,6 +118,7 @@ public class UsageStatsService extends SystemService implements static final int MSG_CHECK_IDLE_STATES = 5; static final int MSG_CHECK_PAROLE_TIMEOUT = 6; static final int MSG_PAROLE_END_TIMEOUT = 7; + static final int MSG_REPORT_CONTENT_PROVIDER_USAGE = 8; private final Object mLock = new Object(); Handler mHandler; @@ -133,6 +135,7 @@ public class UsageStatsService extends SystemService implements long mRealTimeSnapshot; long mSystemTimeSnapshot; + boolean mAppIdleEnabled; boolean mAppIdleParoled; private boolean mScreenOn; private long mLastAppIdleParoledTime; @@ -170,10 +173,15 @@ public class UsageStatsService extends SystemService implements getContext().registerReceiverAsUser(new UserActionsReceiver(), UserHandle.ALL, userActions, null, null); - IntentFilter deviceStates = new IntentFilter(BatteryManager.ACTION_CHARGING); - deviceStates.addAction(BatteryManager.ACTION_DISCHARGING); - deviceStates.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED); - getContext().registerReceiver(new DeviceStateReceiver(), deviceStates); + mAppIdleEnabled = getContext().getResources().getBoolean( + com.android.internal.R.bool.config_enableAutoPowerModes); + if (mAppIdleEnabled) { + IntentFilter deviceStates = new IntentFilter(BatteryManager.ACTION_CHARGING); + deviceStates.addAction(BatteryManager.ACTION_DISCHARGING); + deviceStates.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED); + getContext().registerReceiver(new DeviceStateReceiver(), deviceStates); + } + synchronized (mLock) { cleanUpRemovedUsersLocked(); } @@ -181,7 +189,6 @@ public class UsageStatsService extends SystemService implements mRealTimeSnapshot = SystemClock.elapsedRealtime(); mSystemTimeSnapshot = System.currentTimeMillis(); - publishLocalService(UsageStatsManagerInternal.class, new LocalService()); publishBinderService(Context.USAGE_STATS_SERVICE, new BinderService()); } @@ -337,6 +344,10 @@ public class UsageStatsService extends SystemService implements /** Check all running users' or specified user's apps to see if they enter an idle state. */ void checkIdleStates(int checkUserId) { + if (!mAppIdleEnabled) { + return; + } + final int[] userIds; try { if (checkUserId == UserHandle.USER_ALL) { @@ -583,6 +594,29 @@ public class UsageStatsService extends SystemService implements } } + void reportContentProviderUsage(String authority, String providerPkgName, int userId) { + // Get sync adapters for the authority + String[] packages = ContentResolver.getSyncAdapterPackagesForAuthorityAsUser( + authority, userId); + for (String packageName: packages) { + // Only force the sync adapters to active if the provider is not in the same package and + // the sync adapter is a system package. + try { + PackageInfo pi = AppGlobals.getPackageManager().getPackageInfo( + packageName, 0, userId); + if (pi == null || pi.applicationInfo == null + || !pi.applicationInfo.isSystemApp()) { + continue; + } + if (!packageName.equals(providerPkgName)) { + forceIdleState(packageName, userId, false); + } + } catch (RemoteException re) { + // Shouldn't happen + } + } + } + /** * Forces the app's beginIdleTime and lastUsedTime to reflect idle or active. If idle, * then it rolls back the beginIdleTime and lastUsedTime to a point in time that's behind @@ -605,7 +639,7 @@ public class UsageStatsService extends SystemService implements timeNow - (idle ? mAppIdleWallclockThresholdMillis : 0) - 5000); // Inform listeners if necessary if (previouslyIdle != idle) { - // Slog.d(TAG, "Informing listeners of out-of-idle " + event.mPackage); + // Slog.d(TAG, "Informing listeners of out-of-idle " + packageName); mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS, userId, /* idle = */ idle ? 1 : 0, packageName)); if (!idle) { @@ -744,6 +778,10 @@ public class UsageStatsService extends SystemService implements private boolean isAppIdleFiltered(String packageName, int userId, UserUsageStatsService userService, long timeNow, long screenOnTime) { if (packageName == null) return false; + // If not enabled at all, of course nobody is ever idle. + if (!mAppIdleEnabled) { + return false; + } synchronized (mLock) { // Temporary exemption, probably due to device charging or occasional allowance to // be allowed to sync, etc. @@ -872,6 +910,19 @@ public class UsageStatsService extends SystemService implements pw.print(" mAppIdleParoleDurationMillis="); TimeUtils.formatDuration(mAppIdleParoleDurationMillis, pw); pw.println(); + + pw.println(); + pw.print("mAppIdleEnabled="); pw.print(mAppIdleEnabled); + pw.print(" mAppIdleParoled="); pw.print(mAppIdleParoled); + pw.print(" mScreenOn="); pw.println(mScreenOn); + pw.print("mLastAppIdleParoledTime="); + TimeUtils.formatDuration(mLastAppIdleParoledTime, pw); + pw.println(); + pw.print("mScreenOnTime="); TimeUtils.formatDuration(mScreenOnTime, pw); + pw.println(); + pw.print("mScreenOnSystemTimeSnapshot="); + TimeUtils.formatDuration(mScreenOnSystemTimeSnapshot, pw); + pw.println(); } } @@ -916,6 +967,14 @@ public class UsageStatsService extends SystemService implements setAppIdleParoled(false); break; + case MSG_REPORT_CONTENT_PROVIDER_USAGE: + SomeArgs args = (SomeArgs) msg.obj; + reportContentProviderUsage((String) args.arg1, // authority name + (String) args.arg2, // package name + (int) args.arg3); // userId + args.recycle(); + break; + default: super.handleMessage(msg); break; @@ -1177,6 +1236,16 @@ public class UsageStatsService extends SystemService implements } @Override + public void reportContentProviderUsage(String name, String packageName, int userId) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = name; + args.arg2 = packageName; + args.arg3 = userId; + mHandler.obtainMessage(MSG_REPORT_CONTENT_PROVIDER_USAGE, args) + .sendToTarget(); + } + + @Override public boolean isAppIdle(String packageName, int userId) { return UsageStatsService.this.isAppIdleFiltered(packageName, userId, -1); } diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index fafe44afde4b..b68abab16aa3 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -26,6 +26,7 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; +import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.res.Resources; @@ -57,6 +58,7 @@ import com.android.internal.app.IVoiceInteractionSessionShowCallback; import com.android.internal.app.IVoiceInteractor; import com.android.internal.content.PackageMonitor; import com.android.internal.os.BackgroundThread; +import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.UiThread; @@ -83,6 +85,21 @@ public class VoiceInteractionManagerService extends SystemService { mDbHelper = new DatabaseHelper(context); mSoundTriggerHelper = new SoundTriggerHelper(context); mServiceStub = new VoiceInteractionManagerServiceStub(); + + PackageManagerInternal packageManagerInternal = LocalServices.getService( + PackageManagerInternal.class); + packageManagerInternal.setVoiceInteractionPackagesProvider( + new PackageManagerInternal.PackagesProvider() { + @Override + public String[] getPackages(int userId) { + mServiceStub.initForUser(userId); + ComponentName interactor = mServiceStub.getCurInteractor(userId); + if (interactor != null) { + return new String[] {interactor.getPackageName()}; + } + return null; + } + }); } @Override diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java index acd484dac0c8..af0ddbe82ca4 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java @@ -139,7 +139,7 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne IVoiceInteractionSessionShowCallback showCallback) { if (mActiveSession == null) { mActiveSession = new VoiceInteractionSessionConnection(mLock, mSessionComponentName, - mUser, mContext, this, mInfo.getServiceInfo().applicationInfo.uid); + mUser, mContext, this, mInfo.getServiceInfo().applicationInfo.uid, mHandler); } return mActiveSession.showLocked(args, flags, showCallback); } diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java index 47a230afb72a..cc6a9c52d8a5 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java @@ -32,6 +32,7 @@ import android.graphics.Bitmap; import android.net.Uri; import android.os.Binder; import android.os.Bundle; +import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; @@ -48,6 +49,8 @@ import com.android.internal.app.IAssistScreenshotReceiver; import com.android.internal.app.IVoiceInteractionSessionShowCallback; import com.android.internal.app.IVoiceInteractor; import com.android.internal.os.IResultReceiver; +import com.android.server.LocalServices; +import com.android.server.statusbar.StatusBarManagerInternal; import java.io.PrintWriter; import java.util.ArrayList; @@ -63,6 +66,7 @@ final class VoiceInteractionSessionConnection implements ServiceConnection { final Context mContext; final Callback mCallback; final int mCallingUid; + final Handler mHandler; final IActivityManager mAm; final IWindowManager mIWindowManager; final AppOpsManager mAppOps; @@ -141,13 +145,14 @@ final class VoiceInteractionSessionConnection implements ServiceConnection { }; public VoiceInteractionSessionConnection(Object lock, ComponentName component, int user, - Context context, Callback callback, int callingUid) { + Context context, Callback callback, int callingUid, Handler handler) { mLock = lock; mSessionComponentName = component; mUser = user; mContext = context; mCallback = callback; mCallingUid = callingUid; + mHandler = handler; mAm = ActivityManagerNative.getDefault(); mIWindowManager = IWindowManager.Stub.asInterface( ServiceManager.getService(Context.WINDOW_SERVICE)); @@ -193,11 +198,13 @@ final class VoiceInteractionSessionConnection implements ServiceConnection { mShowArgs = args; mShowFlags = flags; mHaveAssistData = false; + boolean needDisclosure = false; if ((flags& VoiceInteractionSession.SHOW_WITH_ASSIST) != 0) { if (mAppOps.noteOpNoThrow(AppOpsManager.OP_ASSIST_STRUCTURE, mCallingUid, mSessionComponentName.getPackageName()) == AppOpsManager.MODE_ALLOWED && allDataEnabled) { try { + needDisclosure = true; mAm.requestAssistContextExtras(ActivityManager.ASSIST_CONTEXT_FULL, mAssistReceiver); } catch (RemoteException e) { @@ -215,6 +222,7 @@ final class VoiceInteractionSessionConnection implements ServiceConnection { mSessionComponentName.getPackageName()) == AppOpsManager.MODE_ALLOWED && allDataEnabled) { try { + needDisclosure = true; mIWindowManager.requestAssistScreenshot(mScreenshotReceiver); } catch (RemoteException e) { } @@ -225,6 +233,9 @@ final class VoiceInteractionSessionConnection implements ServiceConnection { } else { mScreenshot = null; } + if (needDisclosure) { + mHandler.post(mShowAssistDisclosureRunnable); + } if (mSession != null) { try { mSession.show(mShowArgs, mShowFlags, showCallback); @@ -483,4 +494,15 @@ final class VoiceInteractionSessionConnection implements ServiceConnection { pw.print(prefix); pw.print("mAssistData="); pw.println(mAssistData); } } + + private Runnable mShowAssistDisclosureRunnable = new Runnable() { + @Override + public void run() { + StatusBarManagerInternal statusBarInternal = LocalServices.getService( + StatusBarManagerInternal.class); + if (statusBarInternal != null) { + statusBarInternal.showAssistDisclosure(); + } + } + }; }; diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index 91566f8a3a21..6055211a600a 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -1067,6 +1067,9 @@ public abstract class Connection extends Conferenceable { @SystemApi @Deprecated public final AudioState getAudioState() { + if (mCallAudioState == null) { + return null; + } return new AudioState(mCallAudioState); } diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index 0cd8c191203e..a0669e405851 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -477,39 +477,6 @@ public class TelecomManager { } /** - * Sets the SIM call manager to the specified phone account. - * - * @param accountHandle The phone account handle of the account to set as the sim call manager. - * @hide - */ - public void setSimCallManager(PhoneAccountHandle accountHandle) { - try { - if (isServiceConnected()) { - getTelecomService().setSimCallManager(accountHandle); - } - } catch (RemoteException e) { - Log.e(TAG, "Error calling ITelecomService#setSimCallManager"); - } - } - - /** - * Returns the list of registered SIM call managers. - * - * @return List of registered SIM call managers. - * @hide - */ - public List<PhoneAccountHandle> getSimCallManagers() { - try { - if (isServiceConnected()) { - return getTelecomService().getSimCallManagers(mContext.getOpPackageName()); - } - } catch (RemoteException e) { - Log.e(TAG, "Error calling ITelecomService#getSimCallManagers"); - } - return new ArrayList<>(); - } - - /** * Returns the current connection manager. Apps must be prepared for this method to return * {@code null}, indicating that there currently exists no user-chosen default * {@code PhoneAccount}. diff --git a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl index ea6a74aa6d90..fb0f6dafee71 100644 --- a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl +++ b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl @@ -93,16 +93,6 @@ interface ITelecomService { PhoneAccountHandle getSimCallManager(); /** - * @see TelecomServiceImpl#setSimCallManager - */ - void setSimCallManager(in PhoneAccountHandle account); - - /** - * @see TelecomServiceImpl#getSimCallManagers - */ - List<PhoneAccountHandle> getSimCallManagers(String callingPackage); - - /** * @see TelecomServiceImpl#registerPhoneAccount */ void registerPhoneAccount(in PhoneAccount metadata); diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 0eb94b8c1e30..4b8a10fd35f9 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -84,7 +84,7 @@ public class CarrierConfigManager { * from config.xml under apps/Contacts. */ public static final String - KEY_ENABLE_DIALER_KEY_VIBRATION_BOOL = "enable_dialer_vibration_bool"; + KEY_ENABLE_DIALER_KEY_VIBRATION_BOOL = "enable_dialer_key_vibration_bool"; /** Flag indicating if dtmf tone type is enabled */ public static final String KEY_DTMF_TYPE_ENABLED_BOOL = "dtmf_type_enabled_bool"; @@ -249,32 +249,24 @@ public class CarrierConfigManager { /* The following 3 fields are related to carrier visual voicemail. */ /** - * The carrier number MO sms messages are sent to. - * - * @hide + * The carrier number mobile outgoing (MO) sms messages are sent to. */ public static final String KEY_VVM_DESTINATION_NUMBER_STRING = "vvm_destination_number_string"; /** - * The port through which the MO sms messages are sent through. - * - * @hide + * The port through which the mobile outgoing (MO) sms messages are sent through. */ public static final String KEY_VVM_PORT_NUMBER_INT = "vvm_port_number_int"; /** * The type of visual voicemail protocol the carrier adheres to. See {@link TelephonyManager} * for possible values. For example {@link TelephonyManager#VVM_TYPE_OMTP}. - * - * @hide */ public static final String KEY_VVM_TYPE_STRING = "vvm_type_string"; /** * The package name of the carrier's visual voicemail app to ensure that dialer visual voicemail * and carrier visual voicemail are not active at the same time. - * - * @hide */ public static final String KEY_CARRIER_VVM_PACKAGE_NAME_STRING = "carrier_vvm_package_name_string"; @@ -306,6 +298,14 @@ public class CarrierConfigManager { public static final String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING = "ci_action_on_sys_update_extra_val_string"; + /** + * If this is true, the SIM card (through Customer Service Profile EF file) will be able to + * prevent manual operator selection. If false, this SIM setting will be ignored and manual + * operator selection will always be available. See CPHS4_2.WW6, CPHS B.4.7.1 for more + * information + */ + public static final String KEY_CSP_ENABLED_BOOL = "csp_enabled_bool"; + // These variables are used by the MMS service and exposed through another API, {@link // SmsManager}. The variable names and string values are copied from there. public static final String KEY_MMS_ALIAS_ENABLED_BOOL = "aliasEnabled"; @@ -385,6 +385,7 @@ public class CarrierConfigManager { sDefaults.putString(KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING, ""); sDefaults.putString(KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING, ""); sDefaults.putString(KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING, ""); + sDefaults.putBoolean(KEY_CSP_ENABLED_BOOL, false); sDefaults.putStringArray(KEY_GSM_ROAMING_NETWORKS_STRING_ARRAY, null); sDefaults.putStringArray(KEY_GSM_NONROAMING_NETWORKS_STRING_ARRAY, null); @@ -430,6 +431,9 @@ public class CarrierConfigManager { * specific SIM card. If an invalid subId is used, the returned config will contain default * values. * + * <p>Requires Permission: + * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * * @param subId the subscription ID, normally obtained from {@link SubscriptionManager}. * @return A {@link PersistableBundle} containing the config for the given subId, or default * values for an invalid subId. @@ -451,6 +455,9 @@ public class CarrierConfigManager { /** * Gets the configuration values for the default subscription. * + * <p>Requires Permission: + * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * * @see #getConfigForSubId */ @Nullable @@ -465,6 +472,8 @@ public class CarrierConfigManager { * This should be called by a carrier service app if it wants to update config at an arbitrary * moment. * </p> + * <p>Requires that the calling app has carrier privileges. + * @see #hasCarrierPrivileges * <p> * This method returns before the reload has completed, and * {@link android.service.carrier.CarrierService#onLoadConfig} will be called from an diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index e085d8902740..fa1ed54e1a56 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -1124,13 +1124,14 @@ public class SubscriptionManager { * {@hide} */ public static int getSimStateForSlotIdx(int slotIdx) { - int simState; + int simState = TelephonyManager.SIM_STATE_UNKNOWN; try { ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); - simState = iSub.getSimStateForSlotIdx(slotIdx); + if (iSub != null) { + simState = iSub.getSimStateForSlotIdx(slotIdx); + } } catch (RemoteException ex) { - simState = TelephonyManager.SIM_STATE_UNKNOWN; } logd("getSimStateForSubscriber: simState=" + simState + " slotIdx=" + slotIdx); return simState; @@ -1144,7 +1145,9 @@ public class SubscriptionManager { public boolean isActiveSubId(int subId) { try { ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); - return iSub.isActiveSubId(subId); + if (iSub != null) { + return iSub.isActiveSubId(subId); + } } catch (RemoteException ex) { } return false; diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 8291a3051dec..b7ca7499b64c 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -33,9 +33,11 @@ import android.telecom.PhoneAccount; import android.util.Log; import com.android.internal.telecom.ITelecomService; +import com.android.internal.telephony.CellNetworkScanResult; import com.android.internal.telephony.IPhoneSubInfo; import com.android.internal.telephony.ITelephony; import com.android.internal.telephony.ITelephonyRegistry; +import com.android.internal.telephony.OperatorInfo; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.RILConstants; import com.android.internal.telephony.TelephonyProperties; @@ -616,15 +618,11 @@ public class TelephonyManager { /** * The OMTP protocol. - * - * @hide */ public static final String VVM_TYPE_OMTP = "vvm_type_omtp"; /** - * A flavor of OMTP protocol for Comverse. - * - * @hide + * A flavor of OMTP protocol with a different mobile originated (MO) format */ public static final String VVM_TYPE_CVVM = "vvm_type_cvvm"; @@ -2143,7 +2141,7 @@ public class TelephonyManager { try { ITelephony telephony = getITelephony(); if (telephony != null) - return telephony.getMergedSubscriberIds(); + return telephony.getMergedSubscriberIds(mContext.getOpPackageName()); } catch (RemoteException ex) { } catch (NullPointerException ex) { } @@ -3437,6 +3435,55 @@ public class TelephonyManager { } /** + * Perform a radio scan and return the list of avialble networks. + * + * The return value is a list of the OperatorInfo of the networks found. Note that this + * scan can take a long time (sometimes minutes) to happen. + * + * <p> + * Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} + * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * + * @hide + */ + public CellNetworkScanResult getCellNetworkScanResults(int subId) { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) + return telephony.getCellNetworkScanResults(subId); + } catch (RemoteException ex) { + Rlog.e(TAG, "getCellNetworkScanResults RemoteException", ex); + } catch (NullPointerException ex) { + Rlog.e(TAG, "getCellNetworkScanResults NPE", ex); + } + return null; + } + + /** + * Ask the radio to connect to the input network and change selection mode to manual. + * + * <p> + * Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} + * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * + * @hide + */ + public boolean setNetworkSelectionModeManual(int subId, OperatorInfo operator) { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) + return telephony.setNetworkSelectionModeManual(subId, operator); + } catch (RemoteException ex) { + Rlog.e(TAG, "setNetworkSelectionModeManual RemoteException", ex); + } catch (NullPointerException ex) { + Rlog.e(TAG, "setNetworkSelectionModeManual NPE", ex); + } + return false; + } + + /** * Set the preferred network type. * Used for device configuration by some CDMA operators. * <p> diff --git a/telephony/java/com/android/internal/telephony/CellNetworkScanResult.aidl b/telephony/java/com/android/internal/telephony/CellNetworkScanResult.aidl new file mode 100644 index 000000000000..7917a816afbb --- /dev/null +++ b/telephony/java/com/android/internal/telephony/CellNetworkScanResult.aidl @@ -0,0 +1,19 @@ +/* +** Copyright 2015, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + +package com.android.internal.telephony; + +parcelable CellNetworkScanResult; diff --git a/telephony/java/com/android/internal/telephony/CellNetworkScanResult.java b/telephony/java/com/android/internal/telephony/CellNetworkScanResult.java new file mode 100644 index 000000000000..c708c1480ef9 --- /dev/null +++ b/telephony/java/com/android/internal/telephony/CellNetworkScanResult.java @@ -0,0 +1,125 @@ +/* +** Copyright 2015, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + +package com.android.internal.telephony; + +import android.os.Parcel; +import android.os.Parcelable; +import java.util.ArrayList; +import java.util.List; + +/** + * Response for querying available cellular networks. + * + * @hide + */ +public class CellNetworkScanResult implements Parcelable { + + /** + * Possible status values. + */ + public static final int STATUS_SUCCESS = 1; + public static final int STATUS_RADIO_NOT_AVAILABLE = 2; + public static final int STATUS_RADIO_GENERIC_FAILURE = 3; + public static final int STATUS_UNKNOWN_ERROR = 4; + + private final int mStatus; + private final List<OperatorInfo> mOperators; + + /** + * Constructor. + * + * @hide + */ + public CellNetworkScanResult(int status, List<OperatorInfo> operators) { + mStatus = status; + mOperators = operators; + } + + /** + * Construct a CellNetworkScanResult from a given parcel. + */ + private CellNetworkScanResult(Parcel in) { + mStatus = in.readInt(); + int len = in.readInt(); + if (len > 0) { + mOperators = new ArrayList(); + for (int i = 0; i < len; ++i) { + mOperators.add(OperatorInfo.CREATOR.createFromParcel(in)); + } + } else { + mOperators = null; + } + } + + /** + * @return the status of the command. + */ + public int getStatus() { + return mStatus; + } + + /** + * @return the operators. + */ + public List<OperatorInfo> getOperators() { + return mOperators; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + out.writeInt(mStatus); + if (mOperators != null && mOperators.size() > 0) { + for (OperatorInfo network : mOperators) { + network.writeToParcel(out, flags); + } + } else { + out.writeInt(0); + } + } + + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("CellNetworkScanResult: {"); + sb.append(" status:").append(mStatus); + if (mOperators != null) { + for (OperatorInfo network : mOperators) { + sb.append(" network:").append(network); + } + } + sb.append("}"); + return sb.toString(); + } + + public static final Parcelable.Creator<CellNetworkScanResult> CREATOR + = new Parcelable.Creator<CellNetworkScanResult>() { + + @Override + public CellNetworkScanResult createFromParcel(Parcel in) { + return new CellNetworkScanResult(in); + } + + public CellNetworkScanResult[] newArray(int size) { + return new CellNetworkScanResult[size]; + } + }; +} diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index c253b4f22407..7dc71ede8fc1 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -24,6 +24,8 @@ import android.telephony.IccOpenLogicalChannelResponse; import android.telephony.NeighboringCellInfo; import android.telephony.RadioAccessFamily; import android.telephony.ModemActivityInfo; +import com.android.internal.telephony.CellNetworkScanResult; +import com.android.internal.telephony.OperatorInfo; import java.util.List; @@ -679,6 +681,23 @@ interface ITelephony { void setNetworkSelectionModeAutomatic(int subId); /** + * Perform a radio scan and return the list of avialble networks. + * + * @param subId the id of the subscription. + * @return CellNetworkScanResult containing status of scan and networks. + */ + CellNetworkScanResult getCellNetworkScanResults(int subId); + + /** + * Ask the radio to connect to the input network and change selection mode to manual. + * + * @param subId the id of the subscription. + * @param operatorInfo the operator to attach to. + * @return true if the request suceeded. + */ + boolean setNetworkSelectionModeManual(int subId, in OperatorInfo operator); + + /** * Set the preferred network type. * Used for device configuration by some CDMA operators. * @@ -795,7 +814,7 @@ interface ITelephony { */ String getLine1AlphaTagForDisplay(int subId, String callingPackage); - String[] getMergedSubscriberIds(); + String[] getMergedSubscriberIds(String callingPackage); /** * Override the operator branding for the current ICCID. @@ -917,7 +936,6 @@ interface ITelephony { * @return {@code true} if the device supports hearing aid compatibility. */ boolean isHearingAidCompatibilitySupported(); - /** * Get IMS Registration Status */ diff --git a/telephony/java/com/android/internal/telephony/OperatorInfo.java b/telephony/java/com/android/internal/telephony/OperatorInfo.java new file mode 100644 index 000000000000..a29d7c161990 --- /dev/null +++ b/telephony/java/com/android/internal/telephony/OperatorInfo.java @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.telephony; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * {@hide} + */ +public class OperatorInfo implements Parcelable { + public enum State { + UNKNOWN, + AVAILABLE, + CURRENT, + FORBIDDEN; + } + + private String mOperatorAlphaLong; + private String mOperatorAlphaShort; + private String mOperatorNumeric; + + private State mState = State.UNKNOWN; + + + public String + getOperatorAlphaLong() { + return mOperatorAlphaLong; + } + + public String + getOperatorAlphaShort() { + return mOperatorAlphaShort; + } + + public String + getOperatorNumeric() { + return mOperatorNumeric; + } + + public State + getState() { + return mState; + } + + OperatorInfo(String operatorAlphaLong, + String operatorAlphaShort, + String operatorNumeric, + State state) { + + mOperatorAlphaLong = operatorAlphaLong; + mOperatorAlphaShort = operatorAlphaShort; + mOperatorNumeric = operatorNumeric; + + mState = state; + } + + + public OperatorInfo(String operatorAlphaLong, + String operatorAlphaShort, + String operatorNumeric, + String stateString) { + this (operatorAlphaLong, operatorAlphaShort, + operatorNumeric, rilStateToState(stateString)); + } + + public OperatorInfo(String operatorAlphaLong, + String operatorAlphaShort, + String operatorNumeric) { + this(operatorAlphaLong, operatorAlphaShort, operatorNumeric, State.UNKNOWN); + } + + /** + * See state strings defined in ril.h RIL_REQUEST_QUERY_AVAILABLE_NETWORKS + */ + private static State rilStateToState(String s) { + if (s.equals("unknown")) { + return State.UNKNOWN; + } else if (s.equals("available")) { + return State.AVAILABLE; + } else if (s.equals("current")) { + return State.CURRENT; + } else if (s.equals("forbidden")) { + return State.FORBIDDEN; + } else { + throw new RuntimeException( + "RIL impl error: Invalid network state '" + s + "'"); + } + } + + + @Override + public String toString() { + return "OperatorInfo " + mOperatorAlphaLong + + "/" + mOperatorAlphaShort + + "/" + mOperatorNumeric + + "/" + mState; + } + + /** + * Parcelable interface implemented below. + * This is a simple effort to make OperatorInfo parcelable rather than + * trying to make the conventional containing object (AsyncResult), + * implement parcelable. This functionality is needed for the + * NetworkQueryService to fix 1128695. + */ + + @Override + public int describeContents() { + return 0; + } + + /** + * Implement the Parcelable interface. + * Method to serialize a OperatorInfo object. + */ + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(mOperatorAlphaLong); + dest.writeString(mOperatorAlphaShort); + dest.writeString(mOperatorNumeric); + dest.writeSerializable(mState); + } + + /** + * Implement the Parcelable interface + * Method to deserialize a OperatorInfo object, or an array thereof. + */ + public static final Creator<OperatorInfo> CREATOR = + new Creator<OperatorInfo>() { + @Override + public OperatorInfo createFromParcel(Parcel in) { + OperatorInfo opInfo = new OperatorInfo( + in.readString(), /*operatorAlphaLong*/ + in.readString(), /*operatorAlphaShort*/ + in.readString(), /*operatorNumeric*/ + (State) in.readSerializable()); /*state*/ + return opInfo; + } + + @Override + public OperatorInfo[] newArray(int size) { + return new OperatorInfo[size]; + } + }; +} diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable04.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable04.xml index d282fc9eba8b..0f3fb95f5d46 100644 --- a/tests/VectorDrawableTest/res/drawable/vector_drawable04.xml +++ b/tests/VectorDrawableTest/res/drawable/vector_drawable04.xml @@ -13,37 +13,41 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="64dp" - android:height="64dp" - android:viewportWidth="7.30625" - android:viewportHeight="12.25" - android:autoMirrored="true"> + android:autoMirrored="true" + android:height="64dp" + android:viewportHeight="12.25" + android:viewportWidth="7.30625" + android:width="64dp" > <group> <clip-path - android:name="clip1" - android:pathData=" + android:name="clip1" + android:pathData=" M 3.65, 6.125 m-.001, 0 a .001,.001 0 1,0 .002,0 - a .001,.001 0 1,0-.002,0z"/> + a .001,.001 0 1,0-.002,0z" /> + <path - android:name="one" - android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125 + android:name="one" + android:fillColor="#ff88ff" + android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125 l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0 - l-5.046875,0.0 0.0-1.0Z" - android:fillColor="#ff88ff"/> - + l-5.046875,0.0 0.0-1.0Z" /> + </group> + <group> <clip-path - android:name="clip2" - android:pathData=" + android:name="clip2" + android:pathData=" M 3.65, 6.125 m-6, 0 a 6,6 0 1,0 12,0 - a 6,6 0 1,0-12,0z"/> + a 6,6 0 1,0-12,0z" /> + <path - android:name="two" - android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375 + android:name="two" + android:fillColor="#ff88ff" + android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375 q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625 q 0.234375-0.453125 0.234375-0.875 0.0-0.703125-0.5-1.140625 q-0.484375-0.4375-1.2656252-0.4375-0.5625,0.0-1.1875,0.1875 @@ -51,7 +55,7 @@ q 0.625-0.15625 1.140625-0.15625 1.3593752,0.0 2.1718752,0.6875 q 0.8125,0.671875 0.8125,1.8125 0.0,0.53125-0.203125,1.015625 q-0.203125,0.484375-0.734375,1.140625-0.15625,0.171875-0.9375,0.984375 - q-0.78125024,0.8125-2.2187502,2.265625Z" - android:fillColor="#ff88ff"/> + q-0.78125024,0.8125-2.2187502,2.265625Z" /> </group> -</vector> + +</vector>
\ No newline at end of file diff --git a/tools/aapt2/BinaryResourceParser.cpp b/tools/aapt2/BinaryResourceParser.cpp index 3559f435329b..4f1947ab8364 100644 --- a/tools/aapt2/BinaryResourceParser.cpp +++ b/tools/aapt2/BinaryResourceParser.cpp @@ -116,9 +116,11 @@ private: BinaryResourceParser::BinaryResourceParser(const std::shared_ptr<ResourceTable>& table, const std::shared_ptr<IResolver>& resolver, const Source& source, + const std::u16string& defaultPackage, const void* data, size_t len) : - mTable(table), mResolver(resolver), mSource(source), mData(data), mDataLen(len) { + mTable(table), mResolver(resolver), mSource(source), mDefaultPackage(defaultPackage), + mData(data), mDataLen(len) { } bool BinaryResourceParser::parse() { @@ -177,6 +179,9 @@ bool BinaryResourceParser::getSymbol(const void* data, ResourceNameRef* outSymbo if (!type) { return false; } + if (outSymbol->package.empty()) { + outSymbol->package = mTable->getPackage(); + } outSymbol->type = *type; // Since we scan the symbol table in order, we can start looking for the @@ -350,7 +355,22 @@ bool BinaryResourceParser::parsePackage(const ResChunk_header* chunk) { size_t len = strnlen16(reinterpret_cast<const char16_t*>(packageHeader->name), sizeof(packageHeader->name) / sizeof(packageHeader->name[0])); - mTable->setPackage(StringPiece16(reinterpret_cast<const char16_t*>(packageHeader->name), len)); + if (mTable->getPackage().empty() && len == 0) { + mTable->setPackage(mDefaultPackage); + } else if (len > 0) { + StringPiece16 thisPackage(reinterpret_cast<const char16_t*>(packageHeader->name), len); + if (mTable->getPackage().empty()) { + mTable->setPackage(thisPackage); + } else if (thisPackage != mTable->getPackage()) { + Logger::error(mSource) + << "incompatible packages: " + << mTable->getPackage() + << " vs. " + << thisPackage + << std::endl; + return false; + } + } ResChunkPullParser parser(getChunkData(packageHeader->header), getChunkDataLen(packageHeader->header)); diff --git a/tools/aapt2/BinaryResourceParser.h b/tools/aapt2/BinaryResourceParser.h index 32876cda04fc..3aab301ec199 100644 --- a/tools/aapt2/BinaryResourceParser.h +++ b/tools/aapt2/BinaryResourceParser.h @@ -45,6 +45,7 @@ public: BinaryResourceParser(const std::shared_ptr<ResourceTable>& table, const std::shared_ptr<IResolver>& resolver, const Source& source, + const std::u16string& defaultPackage, const void* data, size_t len); BinaryResourceParser(const BinaryResourceParser&) = delete; // No copy. @@ -97,12 +98,12 @@ private: const Source mSource; + // The package name of the resource table. + std::u16string mDefaultPackage; + const void* mData; const size_t mDataLen; - // The package name of the resource table. - std::u16string mPackage; - // The array of symbol entries. Each element points to an offset // in the table and an index into the symbol table string pool. const SymbolTable_entry* mSymbolEntries = nullptr; diff --git a/tools/aapt2/Linker.cpp b/tools/aapt2/Linker.cpp index f3f04a5f60d0..c37cc932cd3b 100644 --- a/tools/aapt2/Linker.cpp +++ b/tools/aapt2/Linker.cpp @@ -160,7 +160,7 @@ const Attribute* Linker::doResolveAttribute(Reference& attribute, const SourceLi void Linker::visit(Reference& reference, ValueVisitorArgs& a) { Args& args = static_cast<Args&>(a); - if (!reference.name.isValid()) { + if (reference.name.entry.empty()) { // We can't have a completely bad reference. if (!reference.id.isValid()) { Logger::error() << "srsly? " << args.referrer << std::endl; diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp index 41c229d535e1..54a7329359f1 100644 --- a/tools/aapt2/Main.cpp +++ b/tools/aapt2/Main.cpp @@ -756,8 +756,8 @@ bool link(const AaptOptions& options, const std::shared_ptr<ResourceTable>& outT zipFile->uncompress(entry)); assert(uncompressedData); - BinaryResourceParser parser(table, resolver, source, uncompressedData.get(), - entry->getUncompressedLen()); + BinaryResourceParser parser(table, resolver, source, options.appInfo.package, + uncompressedData.get(), entry->getUncompressedLen()); if (!parser.parse()) { return false; } @@ -1085,50 +1085,47 @@ static AaptOptions prepareArgs(int argc, char** argv) { } bool isStaticLib = false; + if (options.phase == AaptOptions::Phase::Link) { + flag::requiredFlag("--manifest", "AndroidManifest.xml of your app", + [&options](const StringPiece& arg) { + options.manifest = Source{ arg.toString() }; + }); + + flag::optionalFlag("-I", "add an Android APK to link against", + [&options](const StringPiece& arg) { + options.libraries.push_back(Source{ arg.toString() }); + }); + + flag::optionalFlag("--java", "directory in which to generate R.java", + [&options](const StringPiece& arg) { + options.generateJavaClass = Source{ arg.toString() }; + }); + + flag::optionalFlag("--proguard", "file in which to output proguard rules", + [&options](const StringPiece& arg) { + options.generateProguardRules = Source{ arg.toString() }; + }); + + flag::optionalSwitch("--static-lib", "generate a static Android library", true, + &isStaticLib); + + flag::optionalFlag("--binding", "Output directory for binding XML files", + [&options](const StringPiece& arg) { + options.bindingOutput = Source{ arg.toString() }; + }); + flag::optionalSwitch("--no-version", "Disables automatic style and layout versioning", + false, &options.versionStylesAndLayouts); + } + if (options.phase == AaptOptions::Phase::Compile || options.phase == AaptOptions::Phase::Link) { - if (options.phase == AaptOptions::Phase::Compile) { - flag::requiredFlag("--package", "Android package name", - [&options](const StringPiece& arg) { - options.appInfo.package = util::utf8ToUtf16(arg); - }); - } else if (options.phase == AaptOptions::Phase::Link) { - flag::requiredFlag("--manifest", "AndroidManifest.xml of your app", - [&options](const StringPiece& arg) { - options.manifest = Source{ arg.toString() }; - }); - - flag::optionalFlag("-I", "add an Android APK to link against", - [&options](const StringPiece& arg) { - options.libraries.push_back(Source{ arg.toString() }); - }); - - flag::optionalFlag("--java", "directory in which to generate R.java", - [&options](const StringPiece& arg) { - options.generateJavaClass = Source{ arg.toString() }; - }); - - flag::optionalFlag("--proguard", "file in which to output proguard rules", - [&options](const StringPiece& arg) { - options.generateProguardRules = Source{ arg.toString() }; - }); - - flag::optionalSwitch("--static-lib", "generate a static Android library", true, - &isStaticLib); - - flag::optionalFlag("--binding", "Output directory for binding XML files", - [&options](const StringPiece& arg) { - options.bindingOutput = Source{ arg.toString() }; - }); - flag::optionalSwitch("--no-version", "Disables automatic style and layout versioning", - false, &options.versionStylesAndLayouts); - } - // Common flags for all steps. flag::requiredFlag("-o", "Output path", [&options](const StringPiece& arg) { options.output = Source{ arg.toString() }; }); - } else if (options.phase == AaptOptions::Phase::DumpStyleGraph) { + } + + if (options.phase == AaptOptions::Phase::DumpStyleGraph) { flag::requiredFlag("--style", "Name of the style to dump", [&options](const StringPiece& arg, std::string* outError) -> bool { Reference styleReference; @@ -1191,7 +1188,7 @@ static bool doDump(const AaptOptions& options) { zipFile->uncompress(entry)); assert(uncompressedData); - BinaryResourceParser parser(table, resolver, source, uncompressedData.get(), + BinaryResourceParser parser(table, resolver, source, {}, uncompressedData.get(), entry->getUncompressedLen()); if (!parser.parse()) { return false; @@ -1223,16 +1220,17 @@ int main(int argc, char** argv) { if (!loadAppInfo(options.manifest, &options.appInfo)) { return false; } - } - // Verify we have some common options set. - if (options.appInfo.package.empty()) { - Logger::error() << "no package name specified." << std::endl; - return false; + if (options.appInfo.package.empty()) { + Logger::error() << "no package name specified." << std::endl; + return false; + } } // Every phase needs a resource table. std::shared_ptr<ResourceTable> table = std::make_shared<ResourceTable>(); + + // The package name is empty when in the compile phase. table->setPackage(options.appInfo.package); if (options.appInfo.package == u"android") { table->setPackageId(0x01); diff --git a/tools/aapt2/TableFlattener.cpp b/tools/aapt2/TableFlattener.cpp index 539c48f7930b..b7c04f06cff5 100644 --- a/tools/aapt2/TableFlattener.cpp +++ b/tools/aapt2/TableFlattener.cpp @@ -79,7 +79,7 @@ public: // Write the key. if (!Res_INTERNALID(key.id.id) && !key.id.isValid()) { - assert(key.name.isValid()); + assert(!key.name.entry.empty()); mSymbols->push_back(std::make_pair(ResourceNameRef(key.name), mOut->size() - sizeof(*outMapEntry))); } @@ -284,13 +284,6 @@ bool TableFlattener::flattenValue(BigBuffer* out, const FlatEntry& flatEntry, bool TableFlattener::flatten(BigBuffer* out, const ResourceTable& table) { const size_t beginning = out->size(); - if (table.getPackage().size() == 0) { - Logger::error() - << "ResourceTable has no package name." - << std::endl; - return false; - } - if (table.getPackageId() == ResourceTable::kUnsetPackageId) { Logger::error() << "ResourceTable has no package ID set." diff --git a/tools/aapt2/data/Makefile b/tools/aapt2/data/Makefile index 3387135d4947..91ff5fee6477 100644 --- a/tools/aapt2/data/Makefile +++ b/tools/aapt2/data/Makefile @@ -50,7 +50,7 @@ $(info PRIVATE_INTERMEDIATE_TABLES = $(PRIVATE_INTERMEDIATE_TABLES)) # returns: out/values-v4.apk: res/values-v4/styles.xml res/values-v4/colors.xml define make-collect-rule $(LOCAL_OUT)/$1.apk: $(filter $(LOCAL_RESOURCE_DIR)/$1/%,$(PRIVATE_RESOURCES)) - $(AAPT) compile --package $(LOCAL_PACKAGE) -o $$@ $$^ + $(AAPT) compile -o $$@ $$^ endef # Collect: out/values-v4.apk <- res/values-v4/styles.xml res/values-v4/colors.xml diff --git a/tools/aapt2/data/lib/Makefile b/tools/aapt2/data/lib/Makefile index 372c2251b33a..741be9a0e75a 100644 --- a/tools/aapt2/data/lib/Makefile +++ b/tools/aapt2/data/lib/Makefile @@ -48,7 +48,7 @@ $(info PRIVATE_INTERMEDIATE_TABLES = $(PRIVATE_INTERMEDIATE_TABLES)) # returns: out/values-v4.apk: res/values-v4/styles.xml res/values-v4/colors.xml define make-collect-rule $(LOCAL_OUT)/$1.apk: $(filter $(LOCAL_RESOURCE_DIR)/$1/%,$(PRIVATE_RESOURCES)) - $(AAPT) compile --package $(LOCAL_PACKAGE) -o $$@ $$^ + $(AAPT) compile -o $$@ $$^ endef # Collect: out/values-v4.apk <- res/values-v4/styles.xml res/values-v4/colors.xml |