Merge "Don't remove task needed for reuse when clearing during activity start."
diff --git a/CleanSpec.mk b/CleanSpec.mk
index 40908f1..2fe5cbe 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -238,6 +238,8 @@
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/DocumentsUI_intermediates)
$(call add-clean-step, rm -f $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/media/java/android/media/IRemoteControlClient.*)
$(call add-clean-step, rm -f $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/media/java/android/media/IRemoteControlDisplay.*)
+$(call add-clean-step, rm -f $(OUT_DIR)/target/common/obj/APPS/FeatureSplit1_intermediates/src/com/android/test/split/feature/R.java)
+$(call add-clean-step, rm -f $(OUT_DIR)/target/common/obj/APPS/FeatureSplit2_intermediates/src/com/android/test/split/feature/R.java)
# ******************************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST ABOVE THIS BANNER
diff --git a/api/current.txt b/api/current.txt
index 34952ef..ee4a572 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -35633,12 +35633,24 @@
method public android.os.PersistableBundle getConfigForSubId(int);
method public void notifyConfigChangedForSubId(int);
field public static final java.lang.String ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED";
+ field public static final java.lang.String BOOL_ALLOW_EMERGENCY_VIDEO_CALLS = "bool_allow_emergency_video_calls";
+ field public static final java.lang.String BOOL_ALLOW_VIDEO_PAUSE = "bool_allow_video_pause";
field public static final java.lang.String KEY_ADDITIONAL_CALL_SETTING_BOOL = "additional_call_setting_bool";
+ field public static final java.lang.String KEY_ALLOW_ADDING_APNS_BOOL = "allow_adding_apns_bool";
field public static final java.lang.String KEY_ALLOW_EMERGENCY_NUMBERS_IN_CALL_LOG_BOOL = "allow_emergency_numbers_in_call_log_bool";
field public static final java.lang.String KEY_ALLOW_LOCAL_DTMF_TONES_BOOL = "allow_local_dtmf_tones_bool";
+ field public static final java.lang.String KEY_ALLOW_NON_EMERGENCY_CALLS_IN_ECM_BOOL = "allow_non_emergency_calls_in_ecm_bool";
+ field public static final java.lang.String KEY_ALWAYS_SHOW_EMERGENCY_ALERT_ONOFF_BOOL = "always_show_emergency_alert_onoff_bool";
field public static final java.lang.String KEY_APN_EXPAND_BOOL = "apn_expand_bool";
field public static final java.lang.String KEY_AUTO_RETRY_ENABLED_BOOL = "auto_retry_enabled_bool";
field public static final java.lang.String KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL = "carrier_allow_turnoff_ims_bool";
+ field public static final java.lang.String KEY_CARRIER_FORCE_DISABLE_ETWS_CMAS_TEST_BOOL = "carrier_force_disable_etws_cmas_test_bool";
+ field public static final java.lang.String KEY_CARRIER_IMS_GBA_REQUIRED_BOOL = "carrier_ims_gba_required_bool";
+ field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_AVAILABLE_BOOL = "carrier_instant_lettering_available_bool";
+ field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_ENCODING_STRING = "carrier_instant_lettering_encoding_string";
+ field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_ESCAPED_CHARS_STRING = "carrier_instant_lettering_escaped_chars_string";
+ field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_INVALID_CHARS_STRING = "carrier_instant_lettering_invalid_chars_string";
+ field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_LENGTH_LIMIT_INT = "carrier_instant_lettering_length_limit_int";
field public static final java.lang.String KEY_CARRIER_SETTINGS_ENABLE_BOOL = "carrier_settings_enable_bool";
field public static final java.lang.String KEY_CARRIER_USE_IMS_FIRST_FOR_EMERGENCY_BOOL = "carrier_use_ims_first_for_emergency_bool";
field public static final java.lang.String KEY_CARRIER_VOLTE_AVAILABLE_BOOL = "carrier_volte_available_bool";
@@ -35647,20 +35659,30 @@
field public static final java.lang.String KEY_CARRIER_VT_AVAILABLE_BOOL = "carrier_vt_available_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_DTMF_TONE_DELAY_INT = "cdma_dtmf_tone_delay_int";
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_CI_ACTION_ON_SYS_UPDATE_BOOL = "ci_action_on_sys_update_bool";
+ field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING = "ci_action_on_sys_update_extra_string";
+ field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING = "ci_action_on_sys_update_extra_val_string";
+ field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING = "ci_action_on_sys_update_intent_string";
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_EDITABLE_ENHANCED_4G_LTE_BOOL = "editable_enhanced_4g_lte_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_FORCE_HOME_NETWORK_BOOL = "force_home_network_bool";
+ field public static final java.lang.String KEY_GSM_DTMF_TONE_DELAY_INT = "gsm_dtmf_tone_delay_int";
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";
field public static final java.lang.String KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL = "hide_carrier_network_settings_bool";
+ field public static final java.lang.String KEY_HIDE_IMS_APN_BOOL = "hide_ims_apn_bool";
+ field public static final java.lang.String KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL = "hide_preferred_network_type_bool";
field public static final java.lang.String KEY_HIDE_SIM_LOCK_SETTINGS_BOOL = "hide_sim_lock_settings_bool";
field public static final java.lang.String KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL = "ignore_sim_network_locked_events_bool";
+ field public static final java.lang.String KEY_IMS_DTMF_TONE_DELAY_INT = "ims_dtmf_tone_delay_int";
field public static final java.lang.String KEY_MMS_ALIAS_ENABLED_BOOL = "aliasEnabled";
field public static final java.lang.String KEY_MMS_ALIAS_MAX_CHARS_INT = "aliasMaxChars";
field public static final java.lang.String KEY_MMS_ALIAS_MIN_CHARS_INT = "aliasMinChars";
@@ -35694,14 +35716,17 @@
field public static final java.lang.String KEY_MMS_USER_AGENT_STRING = "userAgent";
field public static final java.lang.String KEY_OPERATOR_SELECTION_EXPAND_BOOL = "operator_selection_expand_bool";
field public static final java.lang.String KEY_PREFER_2G_BOOL = "prefer_2g_bool";
+ field public static final java.lang.String KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL = "require_entitlement_checks_bool";
field public static final java.lang.String KEY_SHOW_APN_SETTING_CDMA_BOOL = "show_apn_setting_cdma_bool";
field public static final java.lang.String KEY_SHOW_CDMA_CHOICES_BOOL = "show_cdma_choices_bool";
field public static final java.lang.String KEY_SHOW_ONSCREEN_DIAL_BUTTON_BOOL = "show_onscreen_dial_button_bool";
field public static final java.lang.String KEY_SIM_NETWORK_UNLOCK_ALLOW_DISMISS_BOOL = "sim_network_unlock_allow_dismiss_bool";
+ field public static final java.lang.String KEY_SUPPORT_CONFERENCE_CALL_BOOL = "support_conference_call_bool";
field public static final java.lang.String KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL = "support_pause_ims_video_calls_bool";
field public static final java.lang.String KEY_SUPPORT_SWAP_AFTER_MERGE_BOOL = "support_swap_after_merge_bool";
field public static final java.lang.String KEY_USE_HFA_FOR_PROVISIONING_BOOL = "use_hfa_for_provisioning_bool";
field public static final java.lang.String KEY_USE_OTASP_FOR_PROVISIONING_BOOL = "use_otasp_for_provisioning_bool";
+ field public static final java.lang.String KEY_USE_RCS_PRESENCE_BOOL = "use_rcs_presence_bool";
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";
diff --git a/api/system-current.txt b/api/system-current.txt
index 727962a..187fa6b 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -37962,11 +37962,21 @@
field public static final java.lang.String BOOL_ALLOW_EMERGENCY_VIDEO_CALLS = "bool_allow_emergency_video_calls";
field public static final java.lang.String BOOL_ALLOW_VIDEO_PAUSE = "bool_allow_video_pause";
field public static final java.lang.String KEY_ADDITIONAL_CALL_SETTING_BOOL = "additional_call_setting_bool";
+ field public static final java.lang.String KEY_ALLOW_ADDING_APNS_BOOL = "allow_adding_apns_bool";
field public static final java.lang.String KEY_ALLOW_EMERGENCY_NUMBERS_IN_CALL_LOG_BOOL = "allow_emergency_numbers_in_call_log_bool";
field public static final java.lang.String KEY_ALLOW_LOCAL_DTMF_TONES_BOOL = "allow_local_dtmf_tones_bool";
+ field public static final java.lang.String KEY_ALLOW_NON_EMERGENCY_CALLS_IN_ECM_BOOL = "allow_non_emergency_calls_in_ecm_bool";
+ field public static final java.lang.String KEY_ALWAYS_SHOW_EMERGENCY_ALERT_ONOFF_BOOL = "always_show_emergency_alert_onoff_bool";
field public static final java.lang.String KEY_APN_EXPAND_BOOL = "apn_expand_bool";
field public static final java.lang.String KEY_AUTO_RETRY_ENABLED_BOOL = "auto_retry_enabled_bool";
field public static final java.lang.String KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL = "carrier_allow_turnoff_ims_bool";
+ field public static final java.lang.String KEY_CARRIER_FORCE_DISABLE_ETWS_CMAS_TEST_BOOL = "carrier_force_disable_etws_cmas_test_bool";
+ field public static final java.lang.String KEY_CARRIER_IMS_GBA_REQUIRED_BOOL = "carrier_ims_gba_required_bool";
+ field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_AVAILABLE_BOOL = "carrier_instant_lettering_available_bool";
+ field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_ENCODING_STRING = "carrier_instant_lettering_encoding_string";
+ field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_ESCAPED_CHARS_STRING = "carrier_instant_lettering_escaped_chars_string";
+ field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_INVALID_CHARS_STRING = "carrier_instant_lettering_invalid_chars_string";
+ field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_LENGTH_LIMIT_INT = "carrier_instant_lettering_length_limit_int";
field public static final java.lang.String KEY_CARRIER_SETTINGS_ENABLE_BOOL = "carrier_settings_enable_bool";
field public static final java.lang.String KEY_CARRIER_USE_IMS_FIRST_FOR_EMERGENCY_BOOL = "carrier_use_ims_first_for_emergency_bool";
field public static final java.lang.String KEY_CARRIER_VOLTE_AVAILABLE_BOOL = "carrier_volte_available_bool";
@@ -37975,20 +37985,30 @@
field public static final java.lang.String KEY_CARRIER_VT_AVAILABLE_BOOL = "carrier_vt_available_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_DTMF_TONE_DELAY_INT = "cdma_dtmf_tone_delay_int";
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_CI_ACTION_ON_SYS_UPDATE_BOOL = "ci_action_on_sys_update_bool";
+ field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING = "ci_action_on_sys_update_extra_string";
+ field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING = "ci_action_on_sys_update_extra_val_string";
+ field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING = "ci_action_on_sys_update_intent_string";
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_EDITABLE_ENHANCED_4G_LTE_BOOL = "editable_enhanced_4g_lte_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_FORCE_HOME_NETWORK_BOOL = "force_home_network_bool";
+ field public static final java.lang.String KEY_GSM_DTMF_TONE_DELAY_INT = "gsm_dtmf_tone_delay_int";
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";
field public static final java.lang.String KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL = "hide_carrier_network_settings_bool";
+ field public static final java.lang.String KEY_HIDE_IMS_APN_BOOL = "hide_ims_apn_bool";
+ field public static final java.lang.String KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL = "hide_preferred_network_type_bool";
field public static final java.lang.String KEY_HIDE_SIM_LOCK_SETTINGS_BOOL = "hide_sim_lock_settings_bool";
field public static final java.lang.String KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL = "ignore_sim_network_locked_events_bool";
+ field public static final java.lang.String KEY_IMS_DTMF_TONE_DELAY_INT = "ims_dtmf_tone_delay_int";
field public static final java.lang.String KEY_MMS_ALIAS_ENABLED_BOOL = "aliasEnabled";
field public static final java.lang.String KEY_MMS_ALIAS_MAX_CHARS_INT = "aliasMaxChars";
field public static final java.lang.String KEY_MMS_ALIAS_MIN_CHARS_INT = "aliasMinChars";
@@ -38022,10 +38042,12 @@
field public static final java.lang.String KEY_MMS_USER_AGENT_STRING = "userAgent";
field public static final java.lang.String KEY_OPERATOR_SELECTION_EXPAND_BOOL = "operator_selection_expand_bool";
field public static final java.lang.String KEY_PREFER_2G_BOOL = "prefer_2g_bool";
+ field public static final java.lang.String KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL = "require_entitlement_checks_bool";
field public static final java.lang.String KEY_SHOW_APN_SETTING_CDMA_BOOL = "show_apn_setting_cdma_bool";
field public static final java.lang.String KEY_SHOW_CDMA_CHOICES_BOOL = "show_cdma_choices_bool";
field public static final java.lang.String KEY_SHOW_ONSCREEN_DIAL_BUTTON_BOOL = "show_onscreen_dial_button_bool";
field public static final java.lang.String KEY_SIM_NETWORK_UNLOCK_ALLOW_DISMISS_BOOL = "sim_network_unlock_allow_dismiss_bool";
+ field public static final java.lang.String KEY_SUPPORT_CONFERENCE_CALL_BOOL = "support_conference_call_bool";
field public static final java.lang.String KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL = "support_pause_ims_video_calls_bool";
field public static final java.lang.String KEY_SUPPORT_SWAP_AFTER_MERGE_BOOL = "support_swap_after_merge_bool";
field public static final java.lang.String KEY_USE_HFA_FOR_PROVISIONING_BOOL = "use_hfa_for_provisioning_bool";
diff --git a/api/test-current.txt b/api/test-current.txt
index 92857a2..915fbee 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -35647,12 +35647,24 @@
method public android.os.PersistableBundle getConfigForSubId(int);
method public void notifyConfigChangedForSubId(int);
field public static final java.lang.String ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED";
+ field public static final java.lang.String BOOL_ALLOW_EMERGENCY_VIDEO_CALLS = "bool_allow_emergency_video_calls";
+ field public static final java.lang.String BOOL_ALLOW_VIDEO_PAUSE = "bool_allow_video_pause";
field public static final java.lang.String KEY_ADDITIONAL_CALL_SETTING_BOOL = "additional_call_setting_bool";
+ field public static final java.lang.String KEY_ALLOW_ADDING_APNS_BOOL = "allow_adding_apns_bool";
field public static final java.lang.String KEY_ALLOW_EMERGENCY_NUMBERS_IN_CALL_LOG_BOOL = "allow_emergency_numbers_in_call_log_bool";
field public static final java.lang.String KEY_ALLOW_LOCAL_DTMF_TONES_BOOL = "allow_local_dtmf_tones_bool";
+ field public static final java.lang.String KEY_ALLOW_NON_EMERGENCY_CALLS_IN_ECM_BOOL = "allow_non_emergency_calls_in_ecm_bool";
+ field public static final java.lang.String KEY_ALWAYS_SHOW_EMERGENCY_ALERT_ONOFF_BOOL = "always_show_emergency_alert_onoff_bool";
field public static final java.lang.String KEY_APN_EXPAND_BOOL = "apn_expand_bool";
field public static final java.lang.String KEY_AUTO_RETRY_ENABLED_BOOL = "auto_retry_enabled_bool";
field public static final java.lang.String KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL = "carrier_allow_turnoff_ims_bool";
+ field public static final java.lang.String KEY_CARRIER_FORCE_DISABLE_ETWS_CMAS_TEST_BOOL = "carrier_force_disable_etws_cmas_test_bool";
+ field public static final java.lang.String KEY_CARRIER_IMS_GBA_REQUIRED_BOOL = "carrier_ims_gba_required_bool";
+ field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_AVAILABLE_BOOL = "carrier_instant_lettering_available_bool";
+ field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_ENCODING_STRING = "carrier_instant_lettering_encoding_string";
+ field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_ESCAPED_CHARS_STRING = "carrier_instant_lettering_escaped_chars_string";
+ field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_INVALID_CHARS_STRING = "carrier_instant_lettering_invalid_chars_string";
+ field public static final java.lang.String KEY_CARRIER_INSTANT_LETTERING_LENGTH_LIMIT_INT = "carrier_instant_lettering_length_limit_int";
field public static final java.lang.String KEY_CARRIER_SETTINGS_ENABLE_BOOL = "carrier_settings_enable_bool";
field public static final java.lang.String KEY_CARRIER_USE_IMS_FIRST_FOR_EMERGENCY_BOOL = "carrier_use_ims_first_for_emergency_bool";
field public static final java.lang.String KEY_CARRIER_VOLTE_AVAILABLE_BOOL = "carrier_volte_available_bool";
@@ -35661,20 +35673,30 @@
field public static final java.lang.String KEY_CARRIER_VT_AVAILABLE_BOOL = "carrier_vt_available_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_DTMF_TONE_DELAY_INT = "cdma_dtmf_tone_delay_int";
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_CI_ACTION_ON_SYS_UPDATE_BOOL = "ci_action_on_sys_update_bool";
+ field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING = "ci_action_on_sys_update_extra_string";
+ field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING = "ci_action_on_sys_update_extra_val_string";
+ field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING = "ci_action_on_sys_update_intent_string";
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_EDITABLE_ENHANCED_4G_LTE_BOOL = "editable_enhanced_4g_lte_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_FORCE_HOME_NETWORK_BOOL = "force_home_network_bool";
+ field public static final java.lang.String KEY_GSM_DTMF_TONE_DELAY_INT = "gsm_dtmf_tone_delay_int";
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";
field public static final java.lang.String KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL = "hide_carrier_network_settings_bool";
+ field public static final java.lang.String KEY_HIDE_IMS_APN_BOOL = "hide_ims_apn_bool";
+ field public static final java.lang.String KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL = "hide_preferred_network_type_bool";
field public static final java.lang.String KEY_HIDE_SIM_LOCK_SETTINGS_BOOL = "hide_sim_lock_settings_bool";
field public static final java.lang.String KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL = "ignore_sim_network_locked_events_bool";
+ field public static final java.lang.String KEY_IMS_DTMF_TONE_DELAY_INT = "ims_dtmf_tone_delay_int";
field public static final java.lang.String KEY_MMS_ALIAS_ENABLED_BOOL = "aliasEnabled";
field public static final java.lang.String KEY_MMS_ALIAS_MAX_CHARS_INT = "aliasMaxChars";
field public static final java.lang.String KEY_MMS_ALIAS_MIN_CHARS_INT = "aliasMinChars";
@@ -35708,14 +35730,17 @@
field public static final java.lang.String KEY_MMS_USER_AGENT_STRING = "userAgent";
field public static final java.lang.String KEY_OPERATOR_SELECTION_EXPAND_BOOL = "operator_selection_expand_bool";
field public static final java.lang.String KEY_PREFER_2G_BOOL = "prefer_2g_bool";
+ field public static final java.lang.String KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL = "require_entitlement_checks_bool";
field public static final java.lang.String KEY_SHOW_APN_SETTING_CDMA_BOOL = "show_apn_setting_cdma_bool";
field public static final java.lang.String KEY_SHOW_CDMA_CHOICES_BOOL = "show_cdma_choices_bool";
field public static final java.lang.String KEY_SHOW_ONSCREEN_DIAL_BUTTON_BOOL = "show_onscreen_dial_button_bool";
field public static final java.lang.String KEY_SIM_NETWORK_UNLOCK_ALLOW_DISMISS_BOOL = "sim_network_unlock_allow_dismiss_bool";
+ field public static final java.lang.String KEY_SUPPORT_CONFERENCE_CALL_BOOL = "support_conference_call_bool";
field public static final java.lang.String KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL = "support_pause_ims_video_calls_bool";
field public static final java.lang.String KEY_SUPPORT_SWAP_AFTER_MERGE_BOOL = "support_swap_after_merge_bool";
field public static final java.lang.String KEY_USE_HFA_FOR_PROVISIONING_BOOL = "use_hfa_for_provisioning_bool";
field public static final java.lang.String KEY_USE_OTASP_FOR_PROVISIONING_BOOL = "use_otasp_for_provisioning_bool";
+ field public static final java.lang.String KEY_USE_RCS_PRESENCE_BOOL = "use_rcs_presence_bool";
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";
diff --git a/cmds/telecom/src/com/android/commands/telecom/Telecom.java b/cmds/telecom/src/com/android/commands/telecom/Telecom.java
index b7c729b..63f6c92 100644
--- a/cmds/telecom/src/com/android/commands/telecom/Telecom.java
+++ b/cmds/telecom/src/com/android/commands/telecom/Telecom.java
@@ -19,11 +19,13 @@
import android.content.ComponentName;
import android.content.Context;
import android.net.Uri;
+import android.os.IUserManager;
+import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.UserHandle;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
-import android.text.TextUtils;
import com.android.internal.os.BaseCommand;
import com.android.internal.telecom.ITelecomService;
@@ -53,16 +55,17 @@
private ComponentName mComponent;
private String mAccountId;
private ITelecomService mTelecomService;
+ private IUserManager mUserManager;
@Override
public void onShowUsage(PrintStream out) {
out.println(
"usage: telecom [subcommand] [options]\n" +
- "usage: telecom set-phone-account-enabled <COMPONENT> <ID>\n" +
- "usage: telecom set-phone-account-disabled <COMPONENT> <ID>\n" +
- "usage: telecom register-phone-account <COMPONENT> <ID> <LABEL>\n" +
- "usage: telecom register-sim-phone-account <COMPONENT> <ID> <LABEL> <ADDRESS>\n" +
- "usage: telecom unregister-phone-account <COMPONENT> <ID>\n" +
+ "usage: telecom set-phone-account-enabled <COMPONENT> <ID> <USER_SN>\n" +
+ "usage: telecom set-phone-account-disabled <COMPONENT> <ID> <USER_SN>\n" +
+ "usage: telecom register-phone-account <COMPONENT> <ID> <USER_SN> <LABEL>\n" +
+ "usage: telecom register-sim-phone-account <COMPONENT> <ID> <USER_SN> <LABEL> <ADDRESS>\n" +
+ "usage: telecom unregister-phone-account <COMPONENT> <ID> <USER_SN>\n" +
"usage: telecom set-default-dialer <PACKAGE>\n" +
"usage: telecom get-default-dialer\n" +
"usage: telecom get-system-dialer\n" +
@@ -89,6 +92,12 @@
showError("Error: Could not access the Telecom Manager. Is the system running?");
return;
}
+ mUserManager = IUserManager.Stub
+ .asInterface(ServiceManager.getService(Context.USER_SERVICE));
+ if (mUserManager == null) {
+ showError("Error: Could not access the User Manager. Is the system running?");
+ return;
+ }
String command = nextArgRequired();
switch (command) {
@@ -183,10 +192,18 @@
System.out.println(mTelecomService.getSystemDialerPackage());
}
- private PhoneAccountHandle getPhoneAccountHandleFromArgs() {
+ private PhoneAccountHandle getPhoneAccountHandleFromArgs() throws RemoteException{
final ComponentName component = parseComponentName(nextArgRequired());
final String accountId = nextArgRequired();
- return new PhoneAccountHandle(component, accountId);
+ final String userSnInStr = nextArgRequired();
+ UserHandle userHandle;
+ try {
+ final int userSn = Integer.parseInt(userSnInStr);
+ userHandle = UserHandle.of(mUserManager.getUserHandle(userSn));
+ } catch (NumberFormatException ex) {
+ throw new IllegalArgumentException ("Invalid user serial number " + userSnInStr);
+ }
+ return new PhoneAccountHandle(component, accountId, userHandle);
}
private ComponentName parseComponentName(String component) {
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 2f2fbbe..a7d3669 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -4723,6 +4723,9 @@
}
private static void setupJitProfileSupport(LoadedApk loadedApk, File cacheDir) {
+ if (!SystemProperties.getBoolean("dalvik.vm.usejitprofiles", false)) {
+ return;
+ }
final ApplicationInfo appInfo = loadedApk.getApplicationInfo();
if (isSharingRuntime(appInfo)) {
// If sharing is enabled we do not have a unique application
diff --git a/core/java/com/android/internal/os/InstallerConnection.java b/core/java/com/android/internal/os/InstallerConnection.java
index b3222f0..ed4722d 100644
--- a/core/java/com/android/internal/os/InstallerConnection.java
+++ b/core/java/com/android/internal/os/InstallerConnection.java
@@ -21,6 +21,7 @@
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Slog;
+import android.text.TextUtils;
import com.android.internal.util.Preconditions;
@@ -139,14 +140,24 @@
}
public void dexopt(String apkPath, int uid, String instructionSet, int dexoptNeeded,
- int dexFlags) throws InstallerException {
- dexopt(apkPath, uid, "*", instructionSet, dexoptNeeded, null /* outputPath */, dexFlags);
+ int dexFlags, String volumeUuid, boolean useProfiles) throws InstallerException {
+ dexopt(apkPath, uid, "*", instructionSet, dexoptNeeded,
+ null /*outputPath*/, dexFlags, volumeUuid, useProfiles);
}
public void dexopt(String apkPath, int uid, String pkgName, String instructionSet,
- int dexoptNeeded, String outputPath, int dexFlags) throws InstallerException {
- execute("dexopt", apkPath, uid, pkgName, instructionSet, dexoptNeeded, outputPath,
- dexFlags);
+ int dexoptNeeded, String outputPath, int dexFlags, String volumeUuid,
+ boolean useProfiles) throws InstallerException {
+ execute("dexopt",
+ apkPath,
+ uid,
+ pkgName,
+ instructionSet,
+ dexoptNeeded,
+ outputPath,
+ dexFlags,
+ volumeUuid,
+ useProfiles ? '1' : '0');
}
private boolean connect() {
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index eecc0ee..6ad9e20 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -500,8 +500,11 @@
final int dexoptNeeded = DexFile.getDexOptNeeded(
classPathElement, "*", instructionSet, false /* defer */);
if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {
+ // System server is fully AOTed and never profiled
+ // for profile guided compilation.
installer.dexopt(classPathElement, Process.SYSTEM_UID, instructionSet,
- dexoptNeeded, 0 /*dexFlags*/);
+ dexoptNeeded, 0 /*dexFlags*/, null /*volumeUuid*/,
+ false /*useProfiles*/);
}
}
} catch (IOException | InstallerException e) {
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index fc1ba44..30593f2 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -7,7 +7,6 @@
LOCAL_CFLAGS += -Wno-unused-parameter
LOCAL_CFLAGS += -Wno-non-virtual-dtor
LOCAL_CFLAGS += -Wno-maybe-uninitialized -Wno-parentheses
-LOCAL_CFLAGS += -DHWUI_NEW_OPS
LOCAL_CPPFLAGS += -Wno-conversion-null
ifeq ($(TARGET_ARCH), arm)
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 40af22a..8e11e06 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -586,6 +586,7 @@
char jitmaxsizeOptsBuf[sizeof("-Xjitmaxsize:")-1 + PROPERTY_VALUE_MAX];
char jitinitialsizeOptsBuf[sizeof("-Xjitinitialsize:")-1 + PROPERTY_VALUE_MAX];
char jitthresholdOptsBuf[sizeof("-Xjitthreshold:")-1 + PROPERTY_VALUE_MAX];
+ char useJitProfilesOptsBuf[sizeof("-Xjitsaveprofilinginfo:")-1 + PROPERTY_VALUE_MAX];
char gctypeOptsBuf[sizeof("-Xgc:")-1 + PROPERTY_VALUE_MAX];
char backgroundgcOptsBuf[sizeof("-XX:BackgroundGC=")-1 + PROPERTY_VALUE_MAX];
char heaptargetutilizationOptsBuf[sizeof("-XX:HeapTargetUtilization=")-1 + PROPERTY_VALUE_MAX];
@@ -691,6 +692,10 @@
parseRuntimeOption("dalvik.vm.jitmaxsize", jitmaxsizeOptsBuf, "-Xjitmaxsize:");
parseRuntimeOption("dalvik.vm.jitinitialsize", jitinitialsizeOptsBuf, "-Xjitinitialsize:");
parseRuntimeOption("dalvik.vm.jitthreshold", jitthresholdOptsBuf, "-Xjitthreshold:");
+ property_get("dalvik.vm.usejitprofiles", useJitProfilesOptsBuf, "");
+ if (strcmp(useJitProfilesOptsBuf, "true") == 0) {
+ addOption("-Xjitsaveprofilinginfo");
+ }
property_get("ro.config.low_ram", propBuf, "");
if (strcmp(propBuf, "true") == 0) {
diff --git a/core/jni/android_view_DisplayListCanvas.cpp b/core/jni/android_view_DisplayListCanvas.cpp
index d2c99fd..a6c61de 100644
--- a/core/jni/android_view_DisplayListCanvas.cpp
+++ b/core/jni/android_view_DisplayListCanvas.cpp
@@ -72,10 +72,16 @@
// ----------------------------------------------------------------------------
static jint android_view_DisplayListCanvas_getMaxTextureWidth(JNIEnv* env, jobject clazz) {
+ if (!Caches::hasInstance()) {
+ android::uirenderer::renderthread::RenderProxy::staticFence();
+ }
return Caches::getInstance().maxTextureSize;
}
static jint android_view_DisplayListCanvas_getMaxTextureHeight(JNIEnv* env, jobject clazz) {
+ if (!Caches::hasInstance()) {
+ android::uirenderer::renderthread::RenderProxy::staticFence();
+ }
return Caches::getInstance().maxTextureSize;
}
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 53a733d..9cc2a2f 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2442,4 +2442,7 @@
<integer name="config_jobSchedulerInactivityIdleThreshold">4260000</integer>
<!-- The alarm window (in milliseconds) that JobScheduler uses to enter the idle state -->
<integer name="config_jobSchedulerIdleWindowSlop">300000</integer>
+
+ <!-- If true, all guest users created on the device will be ephemeral. -->
+ <bool name="config_guestUserEphemeral">false</bool>
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index f3bc0d8..8a0ab80 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -305,6 +305,7 @@
<java-symbol type="bool" name="config_supportSpeakerNearUltrasound" />
<java-symbol type="bool" name="config_supportAudioSourceUnprocessed" />
<java-symbol type="bool" name="config_freeformWindowManagement" />
+ <java-symbol type="bool" name="config_guestUserEphemeral" />
<java-symbol type="string" name="config_defaultPictureInPictureBounds" />
<java-symbol type="string" name="config_centeredPictureInPictureBounds" />
<java-symbol type="integer" name="config_wifi_framework_5GHz_preference_boost_threshold" />
diff --git a/core/tests/coretests/src/android/animation/AutoCancelTest.java b/core/tests/coretests/src/android/animation/AutoCancelTest.java
index 5810818..b1f88db 100644
--- a/core/tests/coretests/src/android/animation/AutoCancelTest.java
+++ b/core/tests/coretests/src/android/animation/AutoCancelTest.java
@@ -18,12 +18,10 @@
import android.os.Handler;
import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.SmallTest;
-import android.test.suitebuilder.annotation.Suppress;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;
-@Suppress // Failing
public class AutoCancelTest extends ActivityInstrumentationTestCase2<BasicAnimatorActivity> {
boolean mAnimX1Canceled = false;
diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk
index fa7c8aa..1248a4c 100644
--- a/libs/hwui/Android.mk
+++ b/libs/hwui/Android.mk
@@ -2,7 +2,7 @@
include $(CLEAR_VARS)
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-HWUI_NEW_OPS := true
+HWUI_NEW_OPS := false
hwui_src_files := \
font/CacheTexture.cpp \
@@ -233,7 +233,6 @@
tests/unit/GpuMemoryTrackerTests.cpp \
tests/unit/LayerUpdateQueueTests.cpp \
tests/unit/LinearAllocatorTests.cpp \
- tests/unit/LeakCheckTests.cpp \
tests/unit/VectorDrawableTests.cpp \
tests/unit/OffscreenBufferPoolTests.cpp \
tests/unit/StringUtilsTests.cpp
@@ -242,6 +241,7 @@
LOCAL_SRC_FILES += \
tests/unit/BakedOpStateTests.cpp \
tests/unit/FrameBuilderTests.cpp \
+ tests/unit/LeakCheckTests.cpp \
tests/unit/RecordingCanvasTests.cpp
endif
diff --git a/libs/hwui/BakedOpDispatcher.cpp b/libs/hwui/BakedOpDispatcher.cpp
index 7ecc743..00381ee 100644
--- a/libs/hwui/BakedOpDispatcher.cpp
+++ b/libs/hwui/BakedOpDispatcher.cpp
@@ -784,7 +784,9 @@
.build();
renderer.renderGlop(state, glop);
}
+ GL_CHECKPOINT();
renderer.renderState().layerPool().putOrDelete(*op.layerHandle);
+ GL_CHECKPOINT();
}
} // namespace uirenderer
diff --git a/libs/hwui/BakedOpRenderer.cpp b/libs/hwui/BakedOpRenderer.cpp
index 4fbff0d..0931282 100644
--- a/libs/hwui/BakedOpRenderer.cpp
+++ b/libs/hwui/BakedOpRenderer.cpp
@@ -74,7 +74,8 @@
// Detach the texture from the FBO
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
- LOG_ALWAYS_FATAL_IF(GLUtils::dumpGLErrors(), "endLayer FAILED");
+ LOG_ALWAYS_FATAL_IF(GLUtils::dumpGLErrors(), "endLayer FAILED, bound fbo = %u",
+ mRenderState.getFramebuffer());
mRenderState.deleteFramebuffer(mRenderTarget.frameBufferId);
mRenderTarget.frameBufferId = 0;
}
diff --git a/libs/hwui/FrameBuilder.h b/libs/hwui/FrameBuilder.h
index 3ba73f0..bd01850 100644
--- a/libs/hwui/FrameBuilder.h
+++ b/libs/hwui/FrameBuilder.h
@@ -21,6 +21,7 @@
#include "DisplayList.h"
#include "LayerBuilder.h"
#include "RecordedOp.h"
+#include "utils/GLUtils.h"
#include <vector>
#include <unordered_map>
@@ -99,22 +100,30 @@
// Relay through layers in reverse order, since layers
// later in the list will be drawn by earlier ones
for (int i = mLayerBuilders.size() - 1; i >= 1; i--) {
+ GL_CHECKPOINT();
LayerBuilder& layer = *(mLayerBuilders[i]);
if (layer.renderNode) {
// cached HW layer - can't skip layer if empty
renderer.startRepaintLayer(layer.offscreenBuffer, layer.repaintRect);
+ GL_CHECKPOINT();
layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers);
+ GL_CHECKPOINT();
renderer.endLayer();
} else if (!layer.empty()) { // save layer - skip entire layer if empty
layer.offscreenBuffer = renderer.startTemporaryLayer(layer.width, layer.height);
+ GL_CHECKPOINT();
layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers);
+ GL_CHECKPOINT();
renderer.endLayer();
}
}
+ GL_CHECKPOINT();
const LayerBuilder& fbo0 = *(mLayerBuilders[0]);
renderer.startFrame(fbo0.width, fbo0.height, fbo0.repaintRect);
+ GL_CHECKPOINT();
fbo0.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers);
+ GL_CHECKPOINT();
renderer.endFrame(fbo0.repaintRect);
}
diff --git a/libs/hwui/GradientCache.cpp b/libs/hwui/GradientCache.cpp
index 522aa96..1473bc8 100644
--- a/libs/hwui/GradientCache.cpp
+++ b/libs/hwui/GradientCache.cpp
@@ -277,9 +277,9 @@
if (mUseFloatTexture) {
// We have to use GL_RGBA16F because GL_RGBA32F does not support filtering
- texture->upload(width, height, GL_RGBA16F, GL_RGBA, GL_FLOAT, pixels);
+ texture->upload(GL_RGBA16F, width, height, GL_RGBA, GL_FLOAT, pixels);
} else {
- texture->upload(width, height, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+ texture->upload(GL_RGBA, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
}
texture->setFilter(GL_LINEAR);
diff --git a/libs/hwui/Texture.cpp b/libs/hwui/Texture.cpp
index 8a6b28d..771d004 100644
--- a/libs/hwui/Texture.cpp
+++ b/libs/hwui/Texture.cpp
@@ -16,6 +16,7 @@
#include "Caches.h"
#include "Texture.h"
+#include "utils/GLUtils.h"
#include "utils/TraceUtils.h"
#include <utils/Log.h>
@@ -93,22 +94,28 @@
void Texture::upload(GLint internalformat, uint32_t width, uint32_t height,
GLenum format, GLenum type, const void* pixels) {
+ GL_CHECKPOINT();
bool needsAlloc = updateSize(width, height, internalformat);
if (!needsAlloc && !pixels) {
return;
}
mCaches.textureState().activateTexture(0);
+ GL_CHECKPOINT();
if (!mId) {
glGenTextures(1, &mId);
needsAlloc = true;
}
+ GL_CHECKPOINT();
mCaches.textureState().bindTexture(GL_TEXTURE_2D, mId);
+ GL_CHECKPOINT();
if (needsAlloc) {
glTexImage2D(GL_TEXTURE_2D, 0, mFormat, mWidth, mHeight, 0,
format, type, pixels);
+ GL_CHECKPOINT();
} else {
glTexSubImage2D(GL_TEXTURE_2D, 0, mFormat, mWidth, mHeight, 0,
format, type, pixels);
+ GL_CHECKPOINT();
}
}
diff --git a/libs/hwui/renderstate/RenderState.cpp b/libs/hwui/renderstate/RenderState.cpp
index b6dba02..e71d6ee 100644
--- a/libs/hwui/renderstate/RenderState.cpp
+++ b/libs/hwui/renderstate/RenderState.cpp
@@ -241,6 +241,8 @@
const Glop::Mesh::Indices& indices = mesh.indices;
const Glop::Fill& fill = glop.fill;
+ GL_CHECKPOINT();
+
// ---------------------------------------------
// ---------- Program + uniform setup ----------
// ---------------------------------------------
@@ -284,6 +286,8 @@
roundedOutRadius);
}
+ GL_CHECKPOINT();
+
// --------------------------------
// ---------- Mesh setup ----------
// --------------------------------
@@ -335,11 +339,15 @@
// Shader uniforms
SkiaShader::apply(*mCaches, fill.skiaShaderData);
+ GL_CHECKPOINT();
+
// ------------------------------------
// ---------- GL state setup ----------
// ------------------------------------
blend().setFactors(glop.blend.src, glop.blend.dst);
+ GL_CHECKPOINT();
+
// ------------------------------------
// ---------- Actual drawing ----------
// ------------------------------------
@@ -368,6 +376,8 @@
glDrawArrays(mesh.primitiveMode, 0, mesh.elementCount);
}
+ GL_CHECKPOINT();
+
// -----------------------------------
// ---------- Mesh teardown ----------
// -----------------------------------
@@ -377,6 +387,8 @@
if (vertices.attribFlags & VertexAttribFlags::Color) {
glDisableVertexAttribArray(colorLocation);
}
+
+ GL_CHECKPOINT();
}
void RenderState::dump() {
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index dd48a83..6f8d627 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -29,6 +29,7 @@
#include "renderstate/RenderState.h"
#include "renderstate/Stencil.h"
#include "protos/hwui.pb.h"
+#include "utils/GLUtils.h"
#include "utils/TimeUtils.h"
#if HWUI_NEW_OPS
@@ -213,10 +214,13 @@
// node(s) are non client / filler nodes.
info.mode = (node.get() == target ? TreeInfo::MODE_FULL : TreeInfo::MODE_RT_ONLY);
node->prepareTree(info);
+ GL_CHECKPOINT();
}
mAnimationContext->runRemainingAnimations(info);
+ GL_CHECKPOINT();
freePrefetechedLayers();
+ GL_CHECKPOINT();
if (CC_UNLIKELY(!mNativeWindow.get())) {
mCurrentFrameInfo->addFlag(FrameInfoFlags::SkippedFrame);
@@ -463,6 +467,9 @@
bool drew = mCanvas->finish();
#endif
+
+ GL_CHECKPOINT();
+
// Even if we decided to cancel the frame, from the perspective of jank
// metrics the frame was swapped at this point
mCurrentFrameInfo->markSwapBuffers();
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index 72c7e4e..db2a2c8 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -384,6 +384,12 @@
postAndWait(task);
}
+void RenderProxy::staticFence() {
+ SETUP_TASK(fence);
+ UNUSED(args);
+ staticPostAndWait(task);
+}
+
CREATE_BRIDGE1(stopDrawing, CanvasContext* context) {
args->context->stopDrawing();
return nullptr;
diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h
index 1d30eb8..0f91b2a 100644
--- a/libs/hwui/renderthread/RenderProxy.h
+++ b/libs/hwui/renderthread/RenderProxy.h
@@ -93,6 +93,7 @@
ANDROID_API static void overrideProperty(const char* name, const char* value);
ANDROID_API void fence();
+ ANDROID_API static void staticFence();
ANDROID_API void stopDrawing();
ANDROID_API void notifyFramePending();
diff --git a/libs/hwui/utils/GLUtils.h b/libs/hwui/utils/GLUtils.h
index 7020461..6c521e4 100644
--- a/libs/hwui/utils/GLUtils.h
+++ b/libs/hwui/utils/GLUtils.h
@@ -16,9 +16,18 @@
#ifndef GLUTILS_H
#define GLUTILS_H
+#include <cutils/log.h>
+
namespace android {
namespace uirenderer {
+#if 0
+#define GL_CHECKPOINT() LOG_ALWAYS_FATAL_IF(GLUtils::dumpGLErrors(),\
+ "GL errors! %s:%d", __FILE__, __LINE__)
+#else
+#define GL_CHECKPOINT()
+#endif
+
class GLUtils {
public:
/**
diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java
index 606447b5..efae628 100644
--- a/media/java/android/media/AudioAttributes.java
+++ b/media/java/android/media/AudioAttributes.java
@@ -442,7 +442,8 @@
/**
* Sets the combination of flags.
- * @param flags the {@link AudioAttributes#FLAG_AUDIBILITY_ENFORCED} flag.
+ * @param flags a combination of {@link AudioAttributes#FLAG_AUDIBILITY_ENFORCED},
+ * {@link AudioAttributes#FLAG_HW_AV_SYNC}.
* @return the same Builder instance.
*/
public Builder setFlags(int flags) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/net/MobileDataController.java b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
similarity index 93%
rename from packages/SettingsLib/src/com/android/settingslib/net/MobileDataController.java
rename to packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
index 642b60e..5d8668b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/net/MobileDataController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
@@ -42,11 +42,11 @@
import static android.text.format.DateUtils.FORMAT_ABBREV_MONTH;
import static android.text.format.DateUtils.FORMAT_SHOW_DATE;
-public class MobileDataController {
- private static final String TAG = "MobileDataController";
+public class DataUsageController {
+ private static final String TAG = "DataUsageController";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- private static final long DEFAULT_WARNING_LEVEL = 2L * 1024 * 1024 * 1024;
+ public static final long DEFAULT_WARNING_LEVEL = 2L * 1024 * 1024 * 1024;
private static final int FIELDS = FIELD_RX_BYTES | FIELD_TX_BYTES;
private static final StringBuilder PERIOD_BUILDER = new StringBuilder(50);
private static final java.util.Formatter PERIOD_FORMATTER = new java.util.Formatter(
@@ -62,7 +62,7 @@
private Callback mCallback;
private NetworkNameProvider mNetworkController;
- public MobileDataController(Context context) {
+ public DataUsageController(Context context) {
mContext = context;
mTelephonyManager = TelephonyManager.from(context);
mConnectivityManager = ConnectivityManager.from(context);
@@ -109,16 +109,25 @@
if (subscriberId == null) {
return warn("no subscriber id");
}
+ NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll(subscriberId);
+ template = NetworkTemplate.normalize(template, mTelephonyManager.getMergedSubscriberIds());
+
+ return getDataUsageInfo(template);
+ }
+
+ public DataUsageInfo getWifiDataUsageInfo() {
+ NetworkTemplate template = NetworkTemplate.buildTemplateWifiWildcard();
+ return getDataUsageInfo(template);
+ }
+
+ public DataUsageInfo getDataUsageInfo(NetworkTemplate template) {
final INetworkStatsSession session = getSession();
if (session == null) {
return warn("no stats session");
}
- NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll(subscriberId);
- template = NetworkTemplate.normalize(template, mTelephonyManager.getMergedSubscriberIds());
-
final NetworkPolicy policy = findNetworkPolicy(template);
try {
- final NetworkStatsHistory history = mSession.getHistoryForNetwork(template, FIELDS);
+ final NetworkStatsHistory history = session.getHistoryForNetwork(template, FIELDS);
final long now = System.currentTimeMillis();
final long start, end;
if (policy != null && policy.cycleDay > 0) {
@@ -153,6 +162,7 @@
}
final long totalBytes = entry.rxBytes + entry.txBytes;
final DataUsageInfo usage = new DataUsageInfo();
+ usage.startDate = start;
usage.usageLevel = totalBytes;
usage.period = formatDateRange(start, end);
if (policy != null) {
@@ -238,6 +248,7 @@
public static class DataUsageInfo {
public String carrier;
public String period;
+ public long startDate;
public long limitLevel;
public long warningLevel;
public long usageLevel;
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index df8fad4..874a946d 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -934,6 +934,10 @@
Log.e(TAG, "INTERNAL ERROR: no bugreportFile on " + info);
return;
}
+ if (TextUtils.isEmpty(info.title) && TextUtils.isEmpty(info.description)) {
+ Log.d(TAG, "Not touching zip file since neither title nor description are set");
+ return;
+ }
// It's not possible to add a new entry into an existing file, so we need to create a new
// zip, copy all entries, then rename it.
final File dir = info.bugreportFile.getParentFile();
diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml
index 7617ed4..7cbc55c 100644
--- a/packages/SystemUI/res/layout/volume_dialog.xml
+++ b/packages/SystemUI/res/layout/volume_dialog.xml
@@ -46,6 +46,9 @@
<!-- volume rows added and removed here! :-) -->
<include layout="@layout/volume_zen_footer" />
+
+ <!-- Only shown from Tuner setting -->
+ <include layout="@layout/zen_mode_panel" />
</LinearLayout>
-</RelativeLayout>
\ No newline at end of file
+</RelativeLayout>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index de49677..c39ea57 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -805,6 +805,12 @@
<!-- Interruption level: Alarms only. Optimized for narrow two-line display. [CHAR LIMIT=40] -->
<string name="interruption_level_alarms_twoline">Alarms\nonly</string>
+ <!-- Interruption level: All interruptions. [CHAR LIMIT=40] -->
+ <string name="interruption_level_all">All</string>
+
+ <!-- Interruption level: All interruptions. Optimized for narrow two-line display. [CHAR LIMIT=40] -->
+ <string name="interruption_level_all_twoline">All\n</string>
+
<!-- Indication on the keyguard that is shown when the device is charging. [CHAR LIMIT=40]-->
<string name="keyguard_indication_charging_time">Charging (<xliff:g id="charging_time_left" example="4 hours and 2 minutes">%s</xliff:g> until full)</string>
@@ -1295,4 +1301,18 @@
<!-- User visible title for the the keyboard shortcut that triggers the back action. -->
<string name="keyboard_shortcut_group_system_back">Back</string>
+ <!-- SysUI Tuner: Option to show full do not disturb panel in volume [CHAR LIMIT=60] -->
+ <string name="tuner_full_zen_title">Show do not disturb in volume</string>
+ <!-- SysUI Tuner: Summary of option to show full do not disturb panel in volume [CHAR LIMIT=NONE] -->
+ <string name="tuner_full_zen_summary">Allow full control of do not disturb in the volume dialog.</string>
+
+ <!-- SysUI Tuner: Label for screen about volume and do not disturb settings [CHAR LIMIT=60] -->
+ <string name="volume_and_do_not_disturb">Volume and Do not disturb</string>
+
+ <!-- SysUI Tuner: Switch to control volume down behavior [CHAR LIMIT=60] -->
+ <string name="volume_down_silent">Enter do not disturb on volume down</string>
+
+ <!-- SysUI Tuner: Switch to control volume up behavior [CHAR LIMIT=60] -->
+ <string name="volume_up_silent">Exit do not disturb on volume up</string>
+
</resources>
diff --git a/packages/SystemUI/res/xml/tuner_prefs.xml b/packages/SystemUI/res/xml/tuner_prefs.xml
index 11ef735d..483f367 100644
--- a/packages/SystemUI/res/xml/tuner_prefs.xml
+++ b/packages/SystemUI/res/xml/tuner_prefs.xml
@@ -113,6 +113,27 @@
android:title="@string/color_transform"
android:fragment="com.android.systemui.tuner.ColorMatrixFragment" />
+ <PreferenceScreen
+ android:key="volume_and_do_not_disturb"
+ android:title="@string/volume_and_do_not_disturb">
+
+ <com.android.systemui.tuner.TunerSwitch
+ android:key="sysui_show_full_zen"
+ android:title="@string/tuner_full_zen_title"
+ android:summary="@string/tuner_full_zen_summary" />
+
+ <com.android.systemui.tuner.TunerSwitch
+ android:key="sysui_volume_down_silent"
+ android:title="@string/volume_down_silent"
+ sysui:defValue="true" />
+
+ <com.android.systemui.tuner.TunerSwitch
+ android:key="sysui_volume_up_silent"
+ android:title="@string/volume_up_silent"
+ sysui:defValue="true" />
+
+ </PreferenceScreen>
+
<!-- Warning, this goes last. -->
<Preference
android:summary="@string/tuner_persistent_warning"
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 c1dcfea..1f8fae0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -24,7 +24,7 @@
import android.view.View;
import android.view.ViewGroup;
import com.android.internal.logging.MetricsLogger;
-import com.android.settingslib.net.MobileDataController;
+import com.android.settingslib.net.DataUsageController;
import com.android.systemui.R;
import com.android.systemui.qs.QSIconView;
import com.android.systemui.qs.QSTile;
@@ -39,7 +39,7 @@
"com.android.settings", "com.android.settings.Settings$DataUsageSummaryActivity"));
private final NetworkController mController;
- private final MobileDataController mDataController;
+ private final DataUsageController mDataController;
private final CellularDetailAdapter mDetailAdapter;
private final CellSignalCallback mSignalCallback = new CellSignalCallback();
@@ -255,7 +255,7 @@
final DataUsageDetailView v = (DataUsageDetailView) (convertView != null
? convertView
: LayoutInflater.from(mContext).inflate(R.layout.data_usage, parent, false));
- final MobileDataController.DataUsageInfo info = mDataController.getDataUsageInfo();
+ final DataUsageController.DataUsageInfo info = mDataController.getDataUsageInfo();
if (info == null) return v;
v.bind(info);
return v;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java
index d814b1c2..2be43c0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java
@@ -23,7 +23,7 @@
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
-import com.android.settingslib.net.MobileDataController;
+import com.android.settingslib.net.DataUsageController;
import com.android.systemui.FontSizeUtils;
import com.android.systemui.R;
import com.android.systemui.qs.DataUsageGraph;
@@ -59,7 +59,7 @@
R.dimen.qs_data_usage_text_size);
}
- public void bind(MobileDataController.DataUsageInfo info) {
+ public void bind(DataUsageController.DataUsageInfo info) {
final Resources res = mContext.getResources();
final int titleId;
final long bytes;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
index 01de60c..adc1e92 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
@@ -59,6 +59,7 @@
import android.util.Pair;
import android.view.Display;
import android.view.IDockedStackListener;
+import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.KeyboardShortcutsReceiver;
import android.view.WindowManagerGlobal;
@@ -307,12 +308,13 @@
}
/** Docks a task to the side of the screen and starts it. */
- public void startTaskInDockedMode(Context context, int taskId, int createMode) {
+ public void startTaskInDockedMode(Context context, View view, int taskId, int createMode) {
if (mIam == null) return;
try {
// TODO: Determine what animation we want for the incoming task
- final ActivityOptions options = ActivityOptions.makeCustomAnimation(context, 0, 0);
+ final ActivityOptions options = ActivityOptions.makeThumbnailAspectScaleUpAnimation(
+ view, null, 0, 0, view.getWidth(), view.getHeight(), null, null);
options.setDockCreateMode(createMode);
options.setLaunchStackId(DOCKED_STACK_ID);
mIam.startActivityFromRecents(taskId, options.toBundle());
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
index 0d9a1c4..c77a2f9 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -526,9 +526,8 @@
public void onAnimationEnd(Animator animation) {
// Dock the task and launch it
SystemServicesProxy ssp = Recents.getSystemServices();
- ssp.startTaskInDockedMode(getContext(), event.task.key.id,
- dockState.createMode);
- launchTask(event.task, null, INVALID_STACK_ID);
+ ssp.startTaskInDockedMode(getContext(), event.taskView,
+ event.task.key.id, dockState.createMode);
mTaskStackView.getStack().removeTask(event.task);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index 6c0c0ae..efa8f5b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -231,6 +231,10 @@
return mCurrentView;
}
+ public View[] getAllViews() {
+ return mRotatedViews;
+ }
+
public KeyButtonView getRecentsButton() {
return (KeyButtonView) getCurrentView().findViewById(R.id.recent_apps);
}
@@ -341,7 +345,6 @@
// Update menu button in case the IME state has changed.
setMenuVisibility(mShowMenu, true);
-
setDisabledFlags(mDisabledFlags, true);
}
@@ -398,12 +401,6 @@
}
}
- private void setVisibleOrGone(View view, boolean visible) {
- if (view != null) {
- view.setVisibility(visible ? VISIBLE : GONE);
- }
- }
-
public void setLayoutTransitionsEnabled(boolean enabled) {
mLayoutTransitionsEnabled = enabled;
updateLayoutTransitionsEnabled();
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 78497ab..c853fb4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -495,7 +495,6 @@
private final ShadeUpdates mShadeUpdates = new ShadeUpdates();
- private int mDrawCount;
private Runnable mLaunchTransitionEndRunnable;
private boolean mLaunchTransitionFadingAway;
private ExpandableNotificationRow mDraggedDownRow;
@@ -670,8 +669,6 @@
protected PhoneStatusBarView makeStatusBarView() {
final Context context = mContext;
- Resources res = context.getResources();
-
updateDisplaySize(); // populates mDisplayMetrics
updateResources();
@@ -835,23 +832,11 @@
mZenModeController = mVolumeComponent.getZenController();
}
mCastController = new CastControllerImpl(mContext);
- final SignalClusterView signalCluster =
- (SignalClusterView) mStatusBarView.findViewById(R.id.signal_cluster);
- final SignalClusterView signalClusterKeyguard =
- (SignalClusterView) mKeyguardStatusBar.findViewById(R.id.signal_cluster);
- final SignalClusterView signalClusterQs =
- (SignalClusterView) mHeader.findViewById(R.id.signal_cluster);
- mNetworkController.addSignalCallback(signalCluster);
- mNetworkController.addSignalCallback(signalClusterKeyguard);
- signalCluster.setSecurityController(mSecurityController);
- signalCluster.setNetworkController(mNetworkController);
- signalClusterKeyguard.setSecurityController(mSecurityController);
- signalClusterKeyguard.setNetworkController(mNetworkController);
- if (signalClusterQs != null) {
- mNetworkController.addSignalCallback(signalClusterQs);
- signalClusterQs.setSecurityController(mSecurityController);
- signalClusterQs.setNetworkController(mNetworkController);
- }
+
+ initSignalCluster(mStatusBarView);
+ initSignalCluster(mKeyguardStatusBar);
+ initSignalCluster(mHeader);
+
final boolean isAPhone = mNetworkController.hasVoiceCallingFeature();
if (isAPhone) {
mNetworkController.addEmergencyListener(mHeader);
@@ -977,6 +962,16 @@
}});
}
+ private void initSignalCluster(View containerView) {
+ SignalClusterView signalCluster =
+ (SignalClusterView) containerView.findViewById(R.id.signal_cluster);
+ if (signalCluster != null) {
+ mNetworkController.addSignalCallback(signalCluster);
+ signalCluster.setSecurityController(mSecurityController);
+ signalCluster.setNetworkController(mNetworkController);
+ }
+ }
+
/** Returns true if the app shelf should be shown in the nav bar. */
private boolean shouldShowAppShelf() {
// Allow adb to override the default shelf behavior:
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index f8c72b3..b2bcde3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -19,7 +19,7 @@
import android.content.Context;
import android.content.Intent;
import android.telephony.SubscriptionInfo;
-import com.android.settingslib.net.MobileDataController;
+import com.android.settingslib.net.DataUsageController;
import com.android.settingslib.wifi.AccessPoint;
import java.util.List;
@@ -32,7 +32,7 @@
void setWifiEnabled(boolean enabled);
void onUserSwitched(int newUserId);
AccessPointController getAccessPointController();
- MobileDataController getMobileDataController();
+ DataUsageController getMobileDataController();
public interface SignalCallback {
void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
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 909f497..3385c82 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -40,7 +40,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.TelephonyIntents;
-import com.android.settingslib.net.MobileDataController;
+import com.android.settingslib.net.DataUsageController;
import com.android.systemui.DemoMode;
import com.android.systemui.R;
@@ -59,7 +59,7 @@
/** Platform implementation of the network controller. **/
public class NetworkControllerImpl extends BroadcastReceiver
- implements NetworkController, DemoMode, MobileDataController.NetworkNameProvider {
+ implements NetworkController, DemoMode, DataUsageController.NetworkNameProvider {
// debug
static final String TAG = "NetworkController";
static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -94,7 +94,7 @@
// SIM for most actions. This may be null if there aren't any SIMs around.
private MobileSignalController mDefaultSignalController;
private final AccessPointControllerImpl mAccessPoints;
- private final MobileDataController mMobileDataController;
+ private final DataUsageController mDataUsageController;
private boolean mInetCondition; // Used for Logging and demo.
@@ -139,7 +139,7 @@
SubscriptionManager.from(context), Config.readConfig(context), bgLooper,
new CallbackHandler(),
new AccessPointControllerImpl(context, bgLooper),
- new MobileDataController(context),
+ new DataUsageController(context),
new SubscriptionDefaults());
mReceiverHandler.post(mRegisterListeners);
}
@@ -150,7 +150,7 @@
SubscriptionManager subManager, Config config, Looper bgLooper,
CallbackHandler callbackHandler,
AccessPointControllerImpl accessPointController,
- MobileDataController mobileDataController,
+ DataUsageController dataUsageController,
SubscriptionDefaults defaultsHandler) {
mContext = context;
mConfig = config;
@@ -171,10 +171,10 @@
mLocale = mContext.getResources().getConfiguration().locale;
mAccessPoints = accessPointController;
- mMobileDataController = mobileDataController;
- mMobileDataController.setNetworkController(this);
- // TODO: Find a way to move this into MobileDataController.
- mMobileDataController.setCallback(new MobileDataController.Callback() {
+ mDataUsageController = dataUsageController;
+ mDataUsageController.setNetworkController(this);
+ // TODO: Find a way to move this into DataUsageController.
+ mDataUsageController.setCallback(new DataUsageController.Callback() {
@Override
public void onMobileDataEnabled(boolean enabled) {
mCallbackHandler.setMobileDataEnabled(enabled);
@@ -236,8 +236,8 @@
}
@Override
- public MobileDataController getMobileDataController() {
- return mMobileDataController;
+ public DataUsageController getMobileDataController() {
+ return mDataUsageController;
}
public void addEmergencyListener(EmergencyListener listener) {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
index 0901015..ed6fc9e 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
@@ -21,7 +21,6 @@
import android.accessibilityservice.AccessibilityServiceInfo;
import android.animation.LayoutTransition;
-import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.app.Dialog;
@@ -62,7 +61,6 @@
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener;
-import android.view.animation.DecelerateInterpolator;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.SeekBar;
@@ -71,6 +69,7 @@
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.ZenModeController;
+import com.android.systemui.tuner.TunerService;
import com.android.systemui.volume.VolumeDialogController.State;
import com.android.systemui.volume.VolumeDialogController.StreamState;
@@ -85,9 +84,11 @@
*
* Methods ending in "H" must be called on the (ui) handler.
*/
-public class VolumeDialog {
+public class VolumeDialog implements TunerService.Tunable {
private static final String TAG = Util.logTag(VolumeDialog.class);
+ public static final String SHOW_FULL_ZEN = "sysui_show_full_zen";
+
private static final long USER_ATTEMPT_GRACE_PERIOD = 1000;
private static final int WAIT_FOR_RIPPLE = 200;
@@ -131,6 +132,9 @@
private boolean mHovering = false;
private int mLastActiveStream;
+ private boolean mShowFullZen;
+ private final ZenModePanel mZenPanel;
+
public VolumeDialog(Context context, int windowType, VolumeDialogController controller,
ZenModeController zenModeController, Callback callback) {
mContext = context;
@@ -221,11 +225,23 @@
mExpandButtonAnimationDuration = res.getInteger(R.integer.volume_expand_animation_duration);
mZenFooter = (ZenFooter) mDialog.findViewById(R.id.volume_zen_footer);
mZenFooter.init(zenModeController);
+ mZenPanel = (ZenModePanel) mDialog.findViewById(R.id.zen_mode_panel);
+ mZenPanel.addNoneButton();
+ mZenPanel.init(zenModeController);
+ mZenPanel.setCallback(mZenPanelCallback);
mAccessibility.init();
controller.addCallback(mControllerCallbackH, mHandler);
controller.getState();
+ TunerService.get(mContext).addTunable(this, SHOW_FULL_ZEN);
+ }
+
+ @Override
+ public void onTuningChanged(String key, String newValue) {
+ if (SHOW_FULL_ZEN.equals(key)) {
+ mShowFullZen = newValue != null && Integer.parseInt(newValue) != 0;
+ }
}
private ColorStateList loadColorStateList(int colorResId) {
@@ -278,7 +294,7 @@
.getDimensionPixelSize(R.dimen.volume_slider_interspacing);
final LinearLayout.LayoutParams lp =
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, h);
- mDialogContentView.addView(v, mDialogContentView.getChildCount() - 1, lp);
+ mDialogContentView.addView(v, mDialogContentView.getChildCount() - 2, lp);
row.space = v;
}
row.settingsButton.addOnLayoutChangeListener(new OnLayoutChangeListener() {
@@ -306,7 +322,7 @@
}
});
// add new row just before the footer
- mDialogContentView.addView(row.view, mDialogContentView.getChildCount() - 1);
+ mDialogContentView.addView(row.view, mDialogContentView.getChildCount() - 2);
mRows.add(row);
}
@@ -655,12 +671,21 @@
if (D.BUG) Log.d(TAG, "updateFooterH");
final boolean wasVisible = mZenFooter.getVisibility() == View.VISIBLE;
final boolean visible = mState.zenMode != Global.ZEN_MODE_OFF
- && (mAudioManager.isStreamAffectedByRingerMode(mActiveStream) || mExpanded);
+ && (mAudioManager.isStreamAffectedByRingerMode(mActiveStream) || mExpanded)
+ && !mShowFullZen;
if (wasVisible != visible && !visible) {
prepareForCollapse();
}
Util.setVisOrGone(mZenFooter, visible);
mZenFooter.update();
+
+ final boolean fullWasVisible = mZenPanel.getVisibility() == View.VISIBLE;
+ final boolean fullVisible = mShowFullZen && (mState.zenMode != Global.ZEN_MODE_OFF
+ || mExpanded);
+ if (fullWasVisible != fullVisible && !fullVisible) {
+ prepareForCollapse();
+ }
+ Util.setVisOrGone(mZenPanel, fullVisible);
}
private void updateVolumeRowH(VolumeRow row) {
@@ -903,6 +928,23 @@
}
};
+ private final ZenModePanel.Callback mZenPanelCallback = new ZenModePanel.Callback() {
+ @Override
+ public void onPrioritySettings() {
+ mCallback.onZenPrioritySettingsClicked();
+ }
+
+ @Override
+ public void onInteraction() {
+ mHandler.sendEmptyMessage(H.RESCHEDULE_TIMEOUT);
+ }
+
+ @Override
+ public void onExpanded(boolean expanded) {
+ // noop.
+ }
+ };
+
private final OnClickListener mClickExpand = new OnClickListener() {
@Override
public void onClick(View v) {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
index 1083f40..d7635ad 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
@@ -31,6 +31,7 @@
import com.android.systemui.qs.tiles.DndTile;
import com.android.systemui.statusbar.phone.PhoneStatusBar;
import com.android.systemui.statusbar.policy.ZenModeController;
+import com.android.systemui.tuner.TunerService;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -38,16 +39,25 @@
/**
* Implementation of VolumeComponent backed by the new volume dialog.
*/
-public class VolumeDialogComponent implements VolumeComponent {
+public class VolumeDialogComponent implements VolumeComponent, TunerService.Tunable {
+
+ public static final String VOLUME_DOWN_SILENT = "sysui_volume_down_silent";
+ public static final String VOLUME_UP_SILENT = "sysui_volume_up_silent";
+ public static final String VOLUME_SILENT_DO_NOT_DISTURB = "sysui_do_not_disturb";
+
+ public static final boolean DEFAULT_VOLUME_DOWN_TO_ENTER_SILENT = true;
+ public static final boolean DEFAULT_VOLUME_UP_TO_EXIT_SILENT = true;
+ public static final boolean DEFAULT_DO_NOT_DISTURB_WHEN_SILENT = true;
+
private final SystemUI mSysui;
private final Context mContext;
private final VolumeDialogController mController;
private final ZenModeController mZenModeController;
private final VolumeDialog mDialog;
- private final VolumePolicy mVolumePolicy = new VolumePolicy(
- true, // volumeDownToEnterSilent
- true, // volumeUpToExitSilent
- true, // doNotDisturbWhenSilent
+ private VolumePolicy mVolumePolicy = new VolumePolicy(
+ DEFAULT_VOLUME_DOWN_TO_ENTER_SILENT, // volumeDownToEnterSilent
+ DEFAULT_VOLUME_UP_TO_EXIT_SILENT, // volumeUpToExitSilent
+ DEFAULT_DO_NOT_DISTURB_WHEN_SILENT, // doNotDisturbWhenSilent
400 // vibrateToSilentDebounce
);
@@ -65,6 +75,41 @@
mDialog = new VolumeDialog(context, WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY,
mController, zen, mVolumeDialogCallback);
applyConfiguration();
+ TunerService.get(mContext).addTunable(this, VOLUME_DOWN_SILENT, VOLUME_UP_SILENT,
+ VOLUME_SILENT_DO_NOT_DISTURB);
+ }
+
+ @Override
+ public void onTuningChanged(String key, String newValue) {
+ if (VOLUME_DOWN_SILENT.equals(key)) {
+ final boolean volumeDownToEnterSilent = newValue != null
+ ? Integer.parseInt(newValue) != 0
+ : DEFAULT_VOLUME_DOWN_TO_ENTER_SILENT;
+ setVolumePolicy(volumeDownToEnterSilent,
+ mVolumePolicy.volumeUpToExitSilent, mVolumePolicy.doNotDisturbWhenSilent,
+ mVolumePolicy.vibrateToSilentDebounce);
+ } else if (VOLUME_UP_SILENT.equals(key)) {
+ final boolean volumeUpToExitSilent = newValue != null
+ ? Integer.parseInt(newValue) != 0
+ : DEFAULT_VOLUME_UP_TO_EXIT_SILENT;
+ setVolumePolicy(mVolumePolicy.volumeDownToEnterSilent,
+ volumeUpToExitSilent, mVolumePolicy.doNotDisturbWhenSilent,
+ mVolumePolicy.vibrateToSilentDebounce);
+ } else if (VOLUME_SILENT_DO_NOT_DISTURB.equals(key)) {
+ final boolean doNotDisturbWhenSilent = newValue != null
+ ? Integer.parseInt(newValue) != 0
+ : DEFAULT_DO_NOT_DISTURB_WHEN_SILENT;
+ setVolumePolicy(mVolumePolicy.volumeDownToEnterSilent,
+ mVolumePolicy.volumeUpToExitSilent, doNotDisturbWhenSilent,
+ mVolumePolicy.vibrateToSilentDebounce);
+ }
+ }
+
+ private void setVolumePolicy(boolean volumeDownToEnterSilent, boolean volumeUpToExitSilent,
+ boolean doNotDisturbWhenSilent, int vibrateToSilentDebounce) {
+ mVolumePolicy = new VolumePolicy(volumeDownToEnterSilent, volumeUpToExitSilent,
+ doNotDisturbWhenSilent, vibrateToSilentDebounce);
+ mController.setVolumePolicy(mVolumePolicy);
}
private void sendUserActivity() {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
index 38d8de0..f73ba6f 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
@@ -189,6 +189,12 @@
mZenAlarmWarning = (TextView) findViewById(R.id.zen_alarm_warning);
}
+ public void addNoneButton() {
+ mZenButtons.addButton(R.string.interruption_level_all_twoline,
+ R.string.interruption_level_all,
+ Global.ZEN_MODE_OFF);
+ }
+
@Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
@@ -494,6 +500,7 @@
if (mExpanded && isShown()) {
ensureSelection();
}
+ mZenConditions.setVisibility(mSessionZen != Global.ZEN_MODE_OFF ? View.VISIBLE : View.GONE);
}
private Condition forever() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
index b64fbea..5cf3767 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
@@ -33,7 +33,7 @@
import android.util.Log;
import com.android.internal.telephony.cdma.EriInfo;
-import com.android.settingslib.net.MobileDataController;
+import com.android.settingslib.net.DataUsageController;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config;
@@ -96,7 +96,7 @@
mCallbackHandler = mock(CallbackHandler.class);
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
mConfig, Looper.getMainLooper(), mCallbackHandler,
- mock(AccessPointControllerImpl.class), mock(MobileDataController.class),
+ mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults);
setupNetworkController();
@@ -137,7 +137,7 @@
= new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
mConfig, Looper.getMainLooper(), mCallbackHandler,
mock(AccessPointControllerImpl.class),
- mock(MobileDataController.class), mMockSubDefaults);
+ mock(DataUsageController.class), mMockSubDefaults);
setupNetworkController();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
index e4f858b..d5eca95 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
@@ -4,7 +4,7 @@
import android.telephony.TelephonyManager;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.settingslib.net.MobileDataController;
+import com.android.settingslib.net.DataUsageController;
import org.mockito.Mockito;
@SmallTest
@@ -88,7 +88,7 @@
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
mConfig, Looper.getMainLooper(), mCallbackHandler,
Mockito.mock(AccessPointControllerImpl.class),
- Mockito.mock(MobileDataController.class), mMockSubDefaults);
+ Mockito.mock(DataUsageController.class), mMockSubDefaults);
setupNetworkController();
setupDefaultSignal();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
index 760aa9a..08da382 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
@@ -29,7 +29,7 @@
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.TelephonyIntents;
-import com.android.settingslib.net.MobileDataController;
+import com.android.settingslib.net.DataUsageController;
import com.android.systemui.R;
import org.mockito.ArgumentCaptor;
@@ -47,7 +47,7 @@
// Create a new NetworkController as this is currently handled in constructor.
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
mConfig, Looper.getMainLooper(), mCallbackHandler,
- mock(AccessPointControllerImpl.class), mock(MobileDataController.class),
+ mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults);
setupNetworkController();
@@ -96,7 +96,7 @@
// Create a new NetworkController as this is currently handled in constructor.
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
mConfig, Looper.getMainLooper(), mCallbackHandler,
- mock(AccessPointControllerImpl.class), mock(MobileDataController.class),
+ mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults);
setupNetworkController();
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 2de5324..df20704 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -753,6 +753,7 @@
intentFilter.addAction(Intent.ACTION_USER_STOPPING);
intentFilter.addAction(Intent.ACTION_USER_ADDED);
intentFilter.addAction(Intent.ACTION_USER_REMOVED);
+ intentFilter.addAction(Intent.ACTION_USER_PRESENT);
mContext.registerReceiverAsUser(
mUserIntentReceiver, UserHandle.ALL, intentFilter, null, null);
@@ -1571,8 +1572,6 @@
// Try bringing up tracker, but KeyStore won't be ready yet for secondary users so wait
// for user to unlock device too.
updateLockdownVpn();
- final IntentFilter filter = new IntentFilter(Intent.ACTION_USER_PRESENT);
- mContext.registerReceiverAsUser(mUserPresentReceiver, UserHandle.ALL, filter, null, null);
// Configure whether mobile data is always on.
mHandler.sendMessage(mHandler.obtainMessage(EVENT_CONFIGURE_MOBILE_DATA_ALWAYS_ON));
@@ -1582,23 +1581,6 @@
mPermissionMonitor.startMonitoring();
}
- private BroadcastReceiver mUserPresentReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- // User that sent this intent = user that was just unlocked
- final int unlockedUser = getSendingUserId();
-
- // Try creating lockdown tracker, since user present usually means
- // unlocked keystore.
- if (mUserManager.getUserInfo(unlockedUser).isPrimary() &&
- LockdownVpnTracker.isEnabled()) {
- updateLockdownVpn();
- } else {
- updateAlwaysOnVpn(unlockedUser);
- }
- }
- };
-
/**
* Setup data activity tracking for the given network.
*
@@ -3206,11 +3188,6 @@
// Tear down existing lockdown if profile was removed
mLockdownEnabled = LockdownVpnTracker.isEnabled();
if (mLockdownEnabled) {
- if (!mKeyStore.isUnlocked()) {
- Slog.w(TAG, "KeyStore locked; unable to create LockdownTracker");
- return false;
- }
-
final String profileName = new String(mKeyStore.get(Credentials.LOCKDOWN_VPN));
final VpnProfile profile = VpnProfile.decode(
profileName, mKeyStore.get(Credentials.VPN + profileName));
@@ -3589,6 +3566,11 @@
userVpn = new Vpn(mHandler.getLooper(), mContext, mNetd, userId);
mVpns.put(userId, userVpn);
}
+ if (mUserManager.getUserInfo(userId).isPrimary() && LockdownVpnTracker.isEnabled()) {
+ updateLockdownVpn();
+ } else {
+ updateAlwaysOnVpn(userId);
+ }
}
private void onUserStop(int userId) {
@@ -3622,6 +3604,15 @@
}
}
+ private void onUserPresent(int userId) {
+ // User present may be sent because of an unlock, which might mean an unlocked keystore.
+ if (mUserManager.getUserInfo(userId).isPrimary() && LockdownVpnTracker.isEnabled()) {
+ updateLockdownVpn();
+ } else {
+ updateAlwaysOnVpn(userId);
+ }
+ }
+
private BroadcastReceiver mUserIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -3637,6 +3628,8 @@
onUserAdded(userId);
} else if (Intent.ACTION_USER_REMOVED.equals(action)) {
onUserRemoved(userId);
+ } else if (Intent.ACTION_USER_PRESENT.equals(action)) {
+ onUserPresent(userId);
}
}
};
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 1d9bd91..ca33f9f 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -5475,7 +5475,7 @@
return;
}
killPackageProcessesLocked(packageName, appId, userId,
- ProcessList.SERVICE_ADJ, false, true, true, false, true, "kill background");
+ ProcessList.SERVICE_ADJ, false, true, true, false, "kill background");
}
} finally {
Binder.restoreCallingIdentity(callingId);
@@ -5777,7 +5777,7 @@
private final boolean killPackageProcessesLocked(String packageName, int appId,
int userId, int minOomAdj, boolean callerWillRestart, boolean allowRestart,
- boolean doit, boolean evenPersistent, boolean killPackageApp, String reason) {
+ boolean doit, boolean evenPersistent, String reason) {
ArrayList<ProcessRecord> procs = new ArrayList<>();
// Remove all processes this package may have touched: all with the
@@ -5826,7 +5826,7 @@
if (userId != UserHandle.USER_ALL && app.userId != userId) {
continue;
}
- if ((!killPackageApp || !app.pkgList.containsKey(packageName)) && !isDep) {
+ if (!app.pkgList.containsKey(packageName) && !isDep) {
continue;
}
}
@@ -5992,7 +5992,7 @@
}
boolean didSomething = killPackageProcessesLocked(packageName, appId, userId,
- ProcessList.INVALID_ADJ, callerWillRestart, true, doit, evenPersistent, true,
+ ProcessList.INVALID_ADJ, callerWillRestart, true, doit, evenPersistent,
packageName == null ? ("stop user " + userId) : ("stop " + packageName));
if (mStackSupervisor.finishDisabledPackageActivitiesLocked(
@@ -11265,9 +11265,13 @@
+ android.Manifest.permission.DEVICE_POWER);
}
+ final int user = UserHandle.myUserId();
synchronized(this) {
long ident = Binder.clearCallingIdentity();
try {
+ if (!shown && mStackSupervisor.isFocusedUserLockedProfile()) {
+ startHomeActivityLocked(user, "setLockScreenShown");
+ }
if (DEBUG_LOCKSCREEN) logLockScreen(" shown=" + shown);
mLockScreenShown = shown ? LOCK_SCREEN_SHOWN : LOCK_SCREEN_HIDDEN;
updateSleepIfNeededLocked();
@@ -12124,7 +12128,7 @@
final long identity = Binder.clearCallingIdentity();
try {
killPackageProcessesLocked(null, appId, userId,
- ProcessList.PERSISTENT_PROC_ADJ, false, true, true, true, true,
+ ProcessList.PERSISTENT_PROC_ADJ, false, true, true, true,
reason != null ? reason : "kill uid");
} finally {
Binder.restoreCallingIdentity(identity);
@@ -21190,7 +21194,8 @@
public void killPackageDependents(String packageName, int userId) {
enforceCallingPermission(android.Manifest.permission.KILL_UID, "killPackageDependents()");
if (packageName == null) {
- throw new NullPointerException("Cannot kill the dependents of a package without its name.");
+ throw new NullPointerException(
+ "Cannot kill the dependents of a package without its name.");
}
long callingId = Binder.clearCallingIdentity();
@@ -21201,12 +21206,13 @@
} catch (RemoteException e) {
}
if (pkgUid == -1) {
- throw new IllegalArgumentException("Cannot kill dependents of non-existing package " + packageName);
+ throw new IllegalArgumentException(
+ "Cannot kill dependents of non-existing package " + packageName);
}
try {
synchronized(this) {
killPackageProcessesLocked(packageName, UserHandle.getAppId(pkgUid), userId,
- ProcessList.FOREGROUND_APP_ADJ, false, true, true, false, false,
+ ProcessList.FOREGROUND_APP_ADJ, false, true, true, false,
"dep: " + packageName);
}
} finally {
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 09bb9ab..280ab60 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -692,6 +692,12 @@
return null;
}
+ boolean isFocusedUserLockedProfile() {
+ final int userId = mFocusedStack.topRunningActivityLocked().userId;
+ return userId != UserHandle.myUserId()
+ && mService.mUserController.shouldConfirmCredentials(userId);
+ }
+
void setNextTaskIdForUserLocked(int taskId, int userId) {
final int currentTaskId = mCurTaskIdForUser.get(userId, -1);
if (taskId > currentTaskId) {
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index e957fc6..fd9abff 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -944,9 +944,6 @@
*/
public void startLegacyVpnPrivileged(VpnProfile profile, KeyStore keyStore,
LinkProperties egress) {
- if (!keyStore.isUnlocked()) {
- throw new IllegalStateException("KeyStore isn't unlocked");
- }
UserManager mgr = UserManager.get(mContext);
UserInfo user = mgr.getUserInfo(mUserHandle);
if (user.isRestricted() || mgr.hasUserRestriction(UserManager.DISALLOW_CONFIG_VPN,
diff --git a/services/core/java/com/android/server/lights/Light.java b/services/core/java/com/android/server/lights/Light.java
index b496b4c6..b18a181 100644
--- a/services/core/java/com/android/server/lights/Light.java
+++ b/services/core/java/com/android/server/lights/Light.java
@@ -31,6 +31,11 @@
*/
public static final int BRIGHTNESS_MODE_SENSOR = 1;
+ /**
+ * Low-persistence light mode.
+ */
+ public static final int BRIGHTNESS_MODE_LOW_PERSISTENCE = 2;
+
public abstract void setBrightness(int brightness);
public abstract void setBrightness(int brightness, int brightnessMode);
public abstract void setColor(int color);
@@ -38,4 +43,4 @@
public abstract void pulse();
public abstract void pulse(int color, int onMS);
public abstract void turnOff();
-}
\ No newline at end of file
+}
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index ed884ef..257c7da 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -17,6 +17,8 @@
package com.android.server.lights;
import com.android.server.SystemService;
+import com.android.server.vr.VrManagerInternal;
+import com.android.server.vr.VrStateListener;
import android.content.Context;
import android.os.Handler;
@@ -72,6 +74,9 @@
@Override
public void pulse(int color, int onMS) {
synchronized (this) {
+ if (mBrightnessMode == BRIGHTNESS_MODE_LOW_PERSISTENCE) {
+ return;
+ }
if (mColor == 0 && !mFlashing) {
setLightLocked(color, LIGHT_FLASH_HARDWARE, onMS, 1000, BRIGHTNESS_MODE_USER);
mColor = 0;
@@ -87,6 +92,20 @@
}
}
+ void enableLowPersistence() {
+ synchronized(this) {
+ setLightLocked(0, LIGHT_FLASH_NONE, 0, 0, BRIGHTNESS_MODE_LOW_PERSISTENCE);
+ mLocked = true;
+ }
+ }
+
+ void disableLowPersistence() {
+ synchronized(this) {
+ mLocked = false;
+ setLightLocked(mLastColor, LIGHT_FLASH_NONE, 0, 0, mLastBrightnessMode);
+ }
+ }
+
private void stopFlashing() {
synchronized (this) {
setLightLocked(mColor, LIGHT_FLASH_NONE, 0, 0, BRIGHTNESS_MODE_USER);
@@ -94,13 +113,17 @@
}
private void setLightLocked(int color, int mode, int onMS, int offMS, int brightnessMode) {
- if (color != mColor || mode != mMode || onMS != mOnMS || offMS != mOffMS) {
+ if (!mLocked && (color != mColor || mode != mMode || onMS != mOnMS || offMS != mOffMS ||
+ mBrightnessMode != brightnessMode)) {
if (DEBUG) Slog.v(TAG, "setLight #" + mId + ": color=#"
- + Integer.toHexString(color));
+ + Integer.toHexString(color) + ": brightnessMode=" + brightnessMode);
+ mLastColor = mColor;
mColor = color;
mMode = mode;
mOnMS = onMS;
mOffMS = offMS;
+ mLastBrightnessMode = mBrightnessMode;
+ mBrightnessMode = brightnessMode;
Trace.traceBegin(Trace.TRACE_TAG_POWER, "setLight(" + mId + ", 0x"
+ Integer.toHexString(color) + ")");
try {
@@ -117,6 +140,10 @@
private int mOnMS;
private int mOffMS;
private boolean mFlashing;
+ private int mBrightnessMode;
+ private int mLastBrightnessMode;
+ private int mLastColor;
+ private boolean mLocked;
}
public LightsService(Context context) {
@@ -134,6 +161,28 @@
publishLocalService(LightsManager.class, mService);
}
+ @Override
+ public void onBootPhase(int phase) {
+ if (phase == PHASE_SYSTEM_SERVICES_READY) {
+ getLocalService(VrManagerInternal.class).registerListener(mVrStateListener);
+ }
+ }
+
+ private final VrStateListener mVrStateListener = new VrStateListener() {
+ @Override
+ public void onVrStateChanged(boolean enabled) {
+ LightImpl l = mLights[LightsManager.LIGHT_ID_BACKLIGHT];
+ if (enabled) {
+ if (DEBUG) Slog.v(TAG, "VR mode enabled, setting brightness to low persistence");
+ l.enableLowPersistence();
+
+ } else {
+ if (DEBUG) Slog.v(TAG, "VR mode disabled, resetting brightnes");
+ l.disableLowPersistence();
+ }
+ }
+ };
+
private final LightsManager mService = new LightsManager() {
@Override
public Light getLight(int id) {
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index af20679..06f828e 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -24,6 +24,7 @@
import android.content.ComponentName;
import android.content.Context;
import android.os.ServiceManager;
+import android.os.SystemProperties;
import android.util.ArraySet;
import android.util.Log;
@@ -50,12 +51,13 @@
final AtomicBoolean mIdleTime = new AtomicBoolean(false);
- public static void schedule(Context context, long minLatency) {
+ private boolean useJitProfiles = SystemProperties.getBoolean("dalvik.vm.usejitprofiles", false);
+
+ public static void schedule(Context context) {
JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo job = new JobInfo.Builder(BACKGROUND_DEXOPT_JOB, sDexoptServiceName)
.setRequiresDeviceIdle(true)
.setRequiresCharging(true)
- .setMinimumLatency(minLatency)
.setPeriodic(TimeUnit.DAYS.toMillis(1))
.build();
js.schedule(job);
@@ -63,16 +65,17 @@
@Override
public boolean onStartJob(JobParameters params) {
- Log.i(TAG, "onIdleStart");
+ Log.i(TAG, "onStartJob");
final PackageManagerService pm =
(PackageManagerService)ServiceManager.getService("package");
if (pm.isStorageLow()) {
- schedule(BackgroundDexOptService.this, RETRY_LATENCY);
+ Log.i(TAG, "Low storage, skipping this run");
return false;
}
- final ArraySet<String> pkgs = pm.getPackagesThatNeedDexOpt();
- if (pkgs == null) {
+ final ArraySet<String> pkgs = pm.getOptimizablePackages();
+ if (pkgs == null || pkgs.isEmpty()) {
+ Log.i(TAG, "No packages to optimize");
return false;
}
@@ -83,15 +86,14 @@
public void run() {
for (String pkg : pkgs) {
if (!mIdleTime.get()) {
- // stopped while still working, so we need to reschedule
- schedule(BackgroundDexOptService.this, 0);
+ // Out of the idle state. Stop the compilation.
return;
}
if (sFailedPackageNames.contains(pkg)) {
// skip previously failing package
continue;
}
- if (!pm.performDexOpt(pkg, null /* instruction set */)) {
+ if (!pm.performDexOpt(pkg, /* instruction set */ null, useJitProfiles)) {
// there was a problem running dexopt,
// remember this so we do not keep retrying.
sFailedPackageNames.add(pkg);
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index a730de4..366edf9 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -143,17 +143,19 @@
}
public void dexopt(String apkPath, int uid, String instructionSet, int dexoptNeeded,
- int dexFlags) throws InstallerException {
+ int dexFlags, String volumeUuid, boolean useProfiles) throws InstallerException {
assertValidInstructionSet(instructionSet);
- mInstaller.dexopt(apkPath, uid, instructionSet, dexoptNeeded, dexFlags);
+ mInstaller.dexopt(apkPath, uid, instructionSet, dexoptNeeded, dexFlags,
+ volumeUuid, useProfiles);
}
public void dexopt(String apkPath, int uid, String pkgName, String instructionSet,
- int dexoptNeeded, @Nullable String outputPath, int dexFlags)
+ int dexoptNeeded, @Nullable String outputPath, int dexFlags,
+ String volumeUuid, boolean useProfiles)
throws InstallerException {
assertValidInstructionSet(instructionSet);
mInstaller.dexopt(apkPath, uid, pkgName, instructionSet, dexoptNeeded,
- outputPath, dexFlags);
+ outputPath, dexFlags, volumeUuid, useProfiles);
}
public void idmap(String targetApkPath, String overlayApkPath, int uid)
diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
index b45a922..44b51d4 100644
--- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java
+++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
@@ -23,6 +23,7 @@
import android.os.PowerManager;
import android.os.UserHandle;
import android.os.WorkSource;
+import android.os.storage.StorageManager;
import android.util.ArraySet;
import android.util.Log;
import android.util.Slog;
@@ -68,6 +69,11 @@
mDexoptWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*dexopt*");
}
+ static boolean canOptimizePackage(PackageParser.Package pkg) {
+ return pkg.canHaveOatDir() &&
+ ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_HAS_CODE) != 0);
+ }
+
/**
* Performs dexopt on all code paths and libraries of the specified package for specified
* instruction sets.
@@ -76,7 +82,7 @@
* {@link PackageManagerService#mInstallLock}.
*/
int performDexOpt(PackageParser.Package pkg, String[] instructionSets,
- boolean inclDependencies) {
+ boolean inclDependencies, String volumeUuid, boolean useProfiles) {
ArraySet<String> done;
if (inclDependencies && (pkg.usesLibraries != null || pkg.usesOptionalLibraries != null)) {
done = new ArraySet<String>();
@@ -91,7 +97,7 @@
mDexoptWakeLock.acquire();
}
try {
- return performDexOptLI(pkg, instructionSets, done);
+ return performDexOptLI(pkg, instructionSets, done, volumeUuid, useProfiles);
} finally {
if (useLock) {
mDexoptWakeLock.release();
@@ -101,7 +107,7 @@
}
private int performDexOptLI(PackageParser.Package pkg, String[] targetInstructionSets,
- ArraySet<String> done) {
+ ArraySet<String> done, String volumeUuid, boolean useProfiles) {
final String[] instructionSets = targetInstructionSets != null ?
targetInstructionSets : getAppDexInstructionSets(pkg.applicationInfo);
@@ -115,7 +121,7 @@
}
}
- if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_HAS_CODE) == 0) {
+ if (!canOptimizePackage(pkg)) {
return DEX_OPT_SKIPPED;
}
@@ -124,18 +130,15 @@
final List<String> paths = pkg.getAllCodePathsExcludingResourceOnly();
boolean performedDexOpt = false;
- // There are three basic cases here:
- // 1.) we need to dexopt, either because we are forced or it is needed
- // 2.) we are deferring a needed dexopt
- // 3.) we are skipping an unneeded dexopt
final String[] dexCodeInstructionSets = getDexCodeInstructionSets(instructionSets);
for (String dexCodeInstructionSet : dexCodeInstructionSets) {
- if (pkg.mDexOptPerformed.contains(dexCodeInstructionSet)) {
+ if (!useProfiles && pkg.mDexOptPerformed.contains(dexCodeInstructionSet)) {
+ // Skip only if we do not use profiles since they might trigger a recompilation.
continue;
}
for (String path : paths) {
- final int dexoptNeeded;
+ int dexoptNeeded;
try {
dexoptNeeded = DexFile.getDexOptNeeded(path, pkg.packageName,
dexCodeInstructionSet, /* defer */false);
@@ -144,38 +147,46 @@
return DEX_OPT_FAILED;
}
- if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {
- final String dexoptType;
- String oatDir = null;
- if (dexoptNeeded == DexFile.DEX2OAT_NEEDED) {
- dexoptType = "dex2oat";
- oatDir = createOatDirIfSupported(pkg, dexCodeInstructionSet);
- } else if (dexoptNeeded == DexFile.PATCHOAT_NEEDED) {
- dexoptType = "patchoat";
- } else if (dexoptNeeded == DexFile.SELF_PATCHOAT_NEEDED) {
- dexoptType = "self patchoat";
+ if (dexoptNeeded == DexFile.NO_DEXOPT_NEEDED) {
+ if (useProfiles) {
+ // If we do a profile guided compilation then we might recompile the same
+ // package if more profile information is available.
+ dexoptNeeded = DexFile.DEX2OAT_NEEDED;
} else {
- throw new IllegalStateException("Invalid dexopt needed: " + dexoptNeeded);
+ // No dexopt needed and we don't use profiles. Nothing to do.
+ continue;
}
+ }
+ final String dexoptType;
+ String oatDir = null;
+ if (dexoptNeeded == DexFile.DEX2OAT_NEEDED) {
+ dexoptType = "dex2oat";
+ oatDir = createOatDirIfSupported(pkg, dexCodeInstructionSet);
+ } else if (dexoptNeeded == DexFile.PATCHOAT_NEEDED) {
+ dexoptType = "patchoat";
+ } else if (dexoptNeeded == DexFile.SELF_PATCHOAT_NEEDED) {
+ dexoptType = "self patchoat";
+ } else {
+ throw new IllegalStateException("Invalid dexopt needed: " + dexoptNeeded);
+ }
- Log.i(TAG, "Running dexopt (" + dexoptType + ") on: " + path + " pkg="
- + pkg.applicationInfo.packageName + " isa=" + dexCodeInstructionSet
- + " vmSafeMode=" + vmSafeMode + " debuggable=" + debuggable
- + " oatDir = " + oatDir);
- final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid);
- final int dexFlags =
- (!pkg.isForwardLocked() ? DEXOPT_PUBLIC : 0)
- | (vmSafeMode ? DEXOPT_SAFEMODE : 0)
- | (debuggable ? DEXOPT_DEBUGGABLE : 0)
- | DEXOPT_BOOTCOMPLETE;
- try {
- mPackageManagerService.mInstaller.dexopt(path, sharedGid,
- pkg.packageName, dexCodeInstructionSet, dexoptNeeded, oatDir,
- dexFlags);
- performedDexOpt = true;
- } catch (InstallerException e) {
- Slog.w(TAG, "Failed to dexopt", e);
- }
+ Log.i(TAG, "Running dexopt (" + dexoptType + ") on: " + path + " pkg="
+ + pkg.applicationInfo.packageName + " isa=" + dexCodeInstructionSet
+ + " vmSafeMode=" + vmSafeMode + " debuggable=" + debuggable
+ + " oatDir = " + oatDir);
+ final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid);
+ final int dexFlags =
+ (!pkg.isForwardLocked() ? DEXOPT_PUBLIC : 0)
+ | (vmSafeMode ? DEXOPT_SAFEMODE : 0)
+ | (debuggable ? DEXOPT_DEBUGGABLE : 0)
+ | DEXOPT_BOOTCOMPLETE;
+ try {
+ mPackageManagerService.mInstaller.dexopt(path, sharedGid,
+ pkg.packageName, dexCodeInstructionSet, dexoptNeeded, oatDir,
+ dexFlags, volumeUuid, useProfiles);
+ performedDexOpt = true;
+ } catch (InstallerException e) {
+ Slog.w(TAG, "Failed to dexopt", e);
}
}
@@ -235,7 +246,10 @@
PackageParser.Package libPkg = mPackageManagerService.findSharedNonSystemLibrary(
libName);
if (libPkg != null && !done.contains(libName)) {
- performDexOptLI(libPkg, instructionSets, done);
+ // TODO: Analyze and investigate if we (should) profile libraries.
+ // Currently this will do a full compilation of the library.
+ performDexOptLI(libPkg, instructionSets, done,
+ StorageManager.UUID_PRIVATE_INTERNAL, /*useProfiles*/ false);
}
}
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 8a243a8..88198d4 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -2093,8 +2093,12 @@
try {
int dexoptNeeded = DexFile.getDexOptNeeded(lib, null, dexCodeInstructionSet, false);
if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {
+ // Shared libraries do not have profiles so we perform a full
+ // AOT compilation.
mInstaller.dexopt(lib, Process.SYSTEM_UID, dexCodeInstructionSet,
- dexoptNeeded, DEXOPT_PUBLIC /*dexFlags*/);
+ dexoptNeeded, DEXOPT_PUBLIC /*dexFlags*/,
+ StorageManager.UUID_PRIVATE_INTERNAL,
+ false /*useProfiles*/);
}
} catch (FileNotFoundException e) {
Slog.w(TAG, "Library not found: " + lib);
@@ -6647,25 +6651,28 @@
}
}
+ // TODO: this is not used nor needed. Delete it.
@Override
public boolean performDexOptIfNeeded(String packageName, String instructionSet) {
- return performDexOptTraced(packageName, instructionSet);
+ return performDexOptTraced(packageName, instructionSet, false);
}
- public boolean performDexOpt(String packageName, String instructionSet) {
- return performDexOptTraced(packageName, instructionSet);
+ public boolean performDexOpt(String packageName, String instructionSet, boolean useProfiles) {
+ return performDexOptTraced(packageName, instructionSet, useProfiles);
}
- private boolean performDexOptTraced(String packageName, String instructionSet) {
+ private boolean performDexOptTraced(String packageName, String instructionSet,
+ boolean useProfiles) {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
try {
- return performDexOptInternal(packageName, instructionSet);
+ return performDexOptInternal(packageName, instructionSet, useProfiles);
} finally {
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
}
- private boolean performDexOptInternal(String packageName, String instructionSet) {
+ private boolean performDexOptInternal(String packageName, String instructionSet,
+ boolean useProfiles) {
PackageParser.Package p;
final String targetInstructionSet;
synchronized (mPackages) {
@@ -6677,7 +6684,8 @@
targetInstructionSet = instructionSet != null ? instructionSet :
getPrimaryInstructionSet(p.applicationInfo);
- if (p.mDexOptPerformed.contains(targetInstructionSet)) {
+ if (!useProfiles && p.mDexOptPerformed.contains(targetInstructionSet)) {
+ // Skip only if we do not use profiles since they might trigger a recompilation.
return false;
}
}
@@ -6686,7 +6694,7 @@
synchronized (mInstallLock) {
final String[] instructionSets = new String[] { targetInstructionSet };
int result = mPackageDexOptimizer.performDexOpt(p, instructionSets,
- true /* inclDependencies */);
+ true /* inclDependencies */, p.volumeUuid, useProfiles);
return result == PackageDexOptimizer.DEX_OPT_PERFORMED;
}
} finally {
@@ -6694,20 +6702,13 @@
}
}
- public ArraySet<String> getPackagesThatNeedDexOpt() {
- ArraySet<String> pkgs = null;
+ public ArraySet<String> getOptimizablePackages() {
+ ArraySet<String> pkgs = new ArraySet<String>();
synchronized (mPackages) {
for (PackageParser.Package p : mPackages.values()) {
- if (DEBUG_DEXOPT) {
- Log.i(TAG, p.packageName + " mDexOptPerformed=" + p.mDexOptPerformed.toArray());
+ if (PackageDexOptimizer.canOptimizePackage(p)) {
+ pkgs.add(p.packageName);
}
- if (!p.mDexOptPerformed.isEmpty()) {
- continue;
- }
- if (pkgs == null) {
- pkgs = new ArraySet<String>();
- }
- pkgs.add(p.packageName);
}
}
return pkgs;
@@ -6735,8 +6736,10 @@
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
+ // Whoever is calling forceDexOpt wants a fully compiled package.
+ // Don't use profiles since that may cause compilation to be skipped.
final int res = mPackageDexOptimizer.performDexOpt(pkg, instructionSets,
- true /* inclDependencies */);
+ true /* inclDependencies */, pkg.volumeUuid, false /* useProfiles */);
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
if (res != PackageDexOptimizer.DEX_OPT_PERFORMED) {
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 13d7c35..3248fe6 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -32,6 +32,7 @@
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.UserInfo;
+import android.content.res.Resources;
import android.graphics.Bitmap;
import android.os.Binder;
import android.os.Bundle;
@@ -1841,7 +1842,11 @@
}
}
- if (parent != null && parent.info.isEphemeral()) {
+ // Add ephemeral flag to guests if required. Also inherit it from parent.
+ boolean ephemeralGuests = Resources.getSystem()
+ .getBoolean(com.android.internal.R.bool.config_guestUserEphemeral);
+ if ((isGuest && ephemeralGuests)
+ || (parent != null && parent.info.isEphemeral())) {
flags |= UserInfo.FLAG_EPHEMERAL;
}
userId = getNextAvailableId();
@@ -2800,6 +2805,8 @@
pw.println();
pw.println(" Max users: " + UserManager.getMaxSupportedUsers());
pw.println(" Supports switchable users: " + UserManager.supportsMultipleUsers());
+ pw.println(" All guests ephemeral: " + Resources.getSystem().getBoolean(
+ com.android.internal.R.bool.config_guestUserEphemeral));
}
}
diff --git a/services/core/jni/com_android_server_lights_LightsService.cpp b/services/core/jni/com_android_server_lights_LightsService.cpp
index 3f074f5..c8e3946 100644
--- a/services/core/jni/com_android_server_lights_LightsService.cpp
+++ b/services/core/jni/com_android_server_lights_LightsService.cpp
@@ -113,11 +113,27 @@
return ;
}
+ uint32_t version = devices->lights[light]->common.version;
+
memset(&state, 0, sizeof(light_state_t));
- state.color = colorARGB;
- state.flashMode = flashMode;
- state.flashOnMS = onMS;
- state.flashOffMS = offMS;
+
+ if (brightnessMode == BRIGHTNESS_MODE_LOW_PERSISTENCE) {
+ if (light != LIGHT_INDEX_BACKLIGHT) {
+ ALOGE("Cannot set low-persistence mode for non-backlight device.");
+ return;
+ }
+ if (version < LIGHTS_DEVICE_API_VERSION_2_0) {
+ // HAL impl has not been upgraded to support this.
+ return;
+ }
+ } else {
+ // Only set non-brightness settings when not in low-persistence mode
+ state.color = colorARGB;
+ state.flashMode = flashMode;
+ state.flashOnMS = onMS;
+ state.flashOffMS = offMS;
+ }
+
state.brightnessMode = brightnessMode;
{
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index ee5f23f..7ce945bf 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -1051,7 +1051,7 @@
traceBeginAndSlog("StartBackgroundDexOptService");
try {
- BackgroundDexOptService.schedule(context, 0);
+ BackgroundDexOptService.schedule(context);
} catch (Throwable e) {
reportWtf("starting BackgroundDexOptService", e);
}
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 10815b3..9eff591 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -81,7 +81,6 @@
* Flag to require or skip entitlement checks.
* If true, entitlement checks will be executed if device has been configured for it,
* If false, entitlement checks will be skipped.
- * @hide
*/
public static final String
KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL = "require_entitlement_checks_bool";
@@ -269,7 +268,6 @@
/**
* Flag specifying whether Generic Bootstrapping Architecture capable SIM is required for IMS.
- * @hide
*/
public static final String KEY_CARRIER_IMS_GBA_REQUIRED_BOOL
= "carrier_ims_gba_required_bool";
@@ -277,7 +275,6 @@
/**
* Flag specifying whether IMS instant lettering is available for the carrier. {@code True} if
* instant lettering is available for the carrier, {@code false} otherwise.
- * @hide
*/
public static final String KEY_CARRIER_INSTANT_LETTERING_AVAILABLE_BOOL =
"carrier_instant_lettering_available_bool";
@@ -294,7 +291,6 @@
* {@link #KEY_CARRIER_INSTANT_LETTERING_AVAILABLE_BOOL}), determines the list of characters
* which may not be contained in messages. Should be specified as a regular expression suitable
* for use with {@link String#matches(String)}.
- * @hide
*/
public static final String KEY_CARRIER_INSTANT_LETTERING_INVALID_CHARS_STRING =
"carrier_instant_lettering_invalid_chars_string";
@@ -305,7 +301,6 @@
* must be escaped with a backslash '\' character. Should be specified as a string containing
* the characters to be escaped. For example to escape quote and backslash the string would be
* a quote and a backslash.
- * @hide
*/
public static final String KEY_CARRIER_INSTANT_LETTERING_ESCAPED_CHARS_STRING =
"carrier_instant_lettering_escaped_chars_string";
@@ -319,7 +314,6 @@
* towards the messages size limit as a single bye. If a character encoding is specified, the
* message size limit will be based on the number of bytes in the message per the specified
* encoding.
- * @hide
*/
public static final String KEY_CARRIER_INSTANT_LETTERING_ENCODING_STRING =
"carrier_instant_lettering_encoding_string";
@@ -330,7 +324,6 @@
* in the InCall UI to ensure the user cannot enter more characters than allowed by the carrier.
* See also {@link #KEY_CARRIER_INSTANT_LETTERING_ENCODING_STRING} for more information on how
* the length of the message is calculated.
- * @hide
*/
public static final String KEY_CARRIER_INSTANT_LETTERING_LENGTH_LIMIT_INT =
"carrier_instant_lettering_length_limit_int";
@@ -353,7 +346,6 @@
/**
* The default flag specifying whether ETWS/CMAS test setting is forcibly disabled in
* Settings->More->Emergency broadcasts menu even though developer options is turned on.
- * @hide
*/
public static final String KEY_CARRIER_FORCE_DISABLE_ETWS_CMAS_TEST_BOOL =
"carrier_force_disable_etws_cmas_test_bool";
@@ -361,7 +353,6 @@
/**
* The default flag specifying whether "Turn on Notifications" option will be always shown in
* Settings->More->Emergency broadcasts menu regardless developer options is turned on or not.
- * @hide
*/
public static final String KEY_ALWAYS_SHOW_EMERGENCY_ALERT_ONOFF_BOOL =
"always_show_emergency_alert_onoff_bool";
@@ -398,27 +389,23 @@
/**
* Flag specifying whether an additional (client initiated) intent needs to be sent on System
* update
- * @hide
*/
public static final String KEY_CI_ACTION_ON_SYS_UPDATE_BOOL = "ci_action_on_sys_update_bool";
/**
* Intent to be sent for the additional action on System update
- * @hide
*/
public static final String KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING =
"ci_action_on_sys_update_intent_string";
/**
* Extra to be included in the intent sent for additional action on System update
- * @hide
*/
public static final String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING =
"ci_action_on_sys_update_extra_string";
/**
* Value of extra included in intent sent for additional action on System update
- * @hide
*/
public static final String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING =
"ci_action_on_sys_update_extra_val_string";
@@ -427,7 +414,6 @@
* Specifies the amount of gap to be added in millis between postdial DTMF tones. When a
* non-zero value is specified, the UE shall wait for the specified amount of time before it
* sends out successive DTMF tones on the network.
- * @hide
*/
public static final String KEY_GSM_DTMF_TONE_DELAY_INT = "gsm_dtmf_tone_delay_int";
@@ -435,7 +421,6 @@
* Specifies the amount of gap to be added in millis between DTMF tones. When a non-zero value
* is specified, the UE shall wait for the specified amount of time before it sends out
* successive DTMF tones on the network.
- * @hide
*/
public static final String KEY_IMS_DTMF_TONE_DELAY_INT = "ims_dtmf_tone_delay_int";
@@ -443,32 +428,27 @@
* Specifies the amount of gap to be added in millis between postdial DTMF tones. When a
* non-zero value is specified, the UE shall wait for the specified amount of time before it
* sends out successive DTMF tones on the network.
- * @hide
*/
public static final String KEY_CDMA_DTMF_TONE_DELAY_INT = "cdma_dtmf_tone_delay_int";
/**
* Determines whether conference calls are supported by a carrier. When {@code true},
* conference calling is supported, {@code false otherwise}.
- * @hide
*/
public static final String KEY_SUPPORT_CONFERENCE_CALL_BOOL = "support_conference_call_bool";
/**
* Determine whether user can toggle Enhanced 4G LTE Mode in Settings.
- * @hide
*/
public static final String KEY_EDITABLE_ENHANCED_4G_LTE_BOOL = "editable_enhanced_4g_lte_bool";
/**
* Determine whether IMS apn can be shown.
- * @hide
*/
public static final String KEY_HIDE_IMS_APN_BOOL = "hide_ims_apn_bool";
/**
* Determine whether preferred network type can be shown.
- * @hide
*/
public static final String KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL = "hide_preferred_network_type_bool";
@@ -491,7 +471,6 @@
/**
* Allow user to add APNs
- * @hide
*/
public static final String KEY_ALLOW_ADDING_APNS_BOOL = "allow_adding_apns_bool";
@@ -540,7 +519,6 @@
* Determines whether the carrier supports making non-emergency phone calls while the phone is
* in emergency callback mode. Default value is {@code true}, meaning that non-emergency calls
* are allowed in emergency callback mode.
- * @hide
*/
public static final String KEY_ALLOW_NON_EMERGENCY_CALLS_IN_ECM_BOOL =
"allow_non_emergency_calls_in_ecm_bool";
@@ -549,8 +527,6 @@
* Flag indicating whether to allow carrier video calls to emergency numbers.
* When {@code true}, video calls to emergency numbers will be allowed. When {@code false},
* video calls to emergency numbers will be initiated as audio-only calls instead.
- *
- * @hide
*/
@SystemApi
public static final String BOOL_ALLOW_EMERGENCY_VIDEO_CALLS =
@@ -562,8 +538,6 @@
* to pause transmission of video when the In-Call app is sent to the background.
* When {@code false}, video pause signaling is not supported. {@code True} by default unless
* a carrier configuration overrides the default.
- *
- * @hide
*/
@SystemApi
public static final String BOOL_ALLOW_VIDEO_PAUSE =
@@ -580,8 +554,6 @@
* via {@link android.telecom.PhoneAccount#CAPABILITY_VIDEO_CALLING_RELIES_ON_PRESENCE}
* and can choose to hide or show the video calling icon based on whether a contact supports
* video.
- *
- * @hide
*/
@SystemApi
public static final String KEY_USE_RCS_PRESENCE_BOOL = "use_rcs_presence_bool";
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 43fe9d1..d3c1aec 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -296,7 +296,7 @@
/**
* @hide
*/
- public static final boolean EMERGENCY_ASSISTANCE_ENABLED = false;
+ public static final boolean EMERGENCY_ASSISTANCE_ENABLED = true;
/**
* The lookup key used with the {@link #ACTION_PHONE_STATE_CHANGED} broadcast
diff --git a/wifi/java/android/net/wifi/WifiWakeReasonAndCounts.java b/wifi/java/android/net/wifi/WifiWakeReasonAndCounts.java
new file mode 100644
index 0000000..17cc29f
--- /dev/null
+++ b/wifi/java/android/net/wifi/WifiWakeReasonAndCounts.java
@@ -0,0 +1,150 @@
+/*
+ * 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.net.wifi;
+
+import android.os.Parcelable;
+import android.os.Parcel;
+
+/**
+ * A class representing wifi wake reason accounting.
+ */
+
+/** @hide */
+public class WifiWakeReasonAndCounts implements Parcelable {
+ private static final String TAG = "WifiWakeReasonAndCounts";
+ /**
+ * Wlan can wake host, only when it is cmd/event, local driver-fw
+ * functions(non-data, non cmd/event) and rx data.The first packet
+ * from wlan that woke up a sleep host is what is accounted here.
+ * Total wlan wake to application processor would be:
+ * [cmdEventWake + driverFwLocalWake + totalRxDataWake]
+ * A further classification is provided for identifying the reasons
+ * for wakeup.
+ */
+ public int totalCmdEventWake;
+ public int totalDriverFwLocalWake;
+ public int totalRxDataWake;
+
+ public int rxUnicast;
+ public int rxMulticast;
+ public int rxBroadcast;
+
+ public int icmp;
+ public int icmp6;
+ public int icmp6Ra;
+ public int icmp6Na;
+ public int icmp6Ns;
+
+ public int ipv4RxMulticast;
+ public int ipv6Multicast;
+ public int otherRxMulticast;
+
+ /* {@hide} */
+ public WifiWakeReasonAndCounts () {
+ }
+
+ @Override
+ /* {@hide} */
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+ sb.append(" totalCmdEventWake ").append(totalCmdEventWake);
+ sb.append(" totalDriverFwLocalWake ").append(totalDriverFwLocalWake);
+ sb.append(" totalRxDataWake ").append(totalRxDataWake);
+
+ sb.append(" rxUnicast ").append(rxUnicast);
+ sb.append(" rxMulticast ").append(rxMulticast);
+ sb.append(" rxBroadcast ").append(rxBroadcast);
+
+ sb.append(" icmp ").append(icmp);
+ sb.append(" icmp6 ").append(icmp6);
+ sb.append(" icmp6Ra ").append(icmp6Ra);
+ sb.append(" icmp6Na ").append(icmp6Na);
+ sb.append(" icmp6Ns ").append(icmp6Ns);
+
+ sb.append(" ipv4RxMulticast ").append(ipv4RxMulticast);
+ sb.append(" ipv6Multicast ").append(ipv6Multicast);
+ sb.append(" otherRxMulticast ").append(otherRxMulticast);
+ return sb.toString();
+ }
+
+ /* Implement the Parcelable interface
+ * {@hide}
+ */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /* Implement the Parcelable interface
+ * {@hide}
+ */
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(totalCmdEventWake);
+ dest.writeInt(totalDriverFwLocalWake);
+ dest.writeInt(totalRxDataWake);
+
+ dest.writeInt(rxUnicast);
+ dest.writeInt(rxMulticast);
+ dest.writeInt(rxBroadcast);
+
+ dest.writeInt(icmp);
+ dest.writeInt(icmp6);
+ dest.writeInt(icmp6Ra);
+ dest.writeInt(icmp6Na);
+ dest.writeInt(icmp6Ns);
+
+ dest.writeInt(ipv4RxMulticast);
+ dest.writeInt(ipv6Multicast);
+ dest.writeInt(otherRxMulticast);
+ }
+
+ /* Implement the Parcelable interface
+ * {@hide}
+ */
+ public static final Creator<WifiWakeReasonAndCounts> CREATOR =
+ new Creator<WifiWakeReasonAndCounts>() {
+ public WifiWakeReasonAndCounts createFromParcel(Parcel in) {
+ WifiWakeReasonAndCounts counts = new WifiWakeReasonAndCounts();
+ counts.totalCmdEventWake = in.readInt();
+ counts.totalDriverFwLocalWake = in.readInt();
+ counts.totalRxDataWake = in.readInt();
+
+ counts.rxUnicast = in.readInt();
+ counts.rxMulticast = in.readInt();
+ counts.rxBroadcast = in.readInt();
+
+ counts.icmp = in.readInt();
+ counts.icmp6 = in.readInt();
+ counts.icmp6Ra = in.readInt();
+ counts.icmp6Na = in.readInt();
+ counts.icmp6Ns = in.readInt();
+
+ counts.ipv4RxMulticast = in.readInt();
+ counts.ipv6Multicast = in.readInt();
+ counts.otherRxMulticast = in.readInt();
+ return counts;
+ }
+ /* Implement the Parcelable interface
+ * {@hide}
+ */
+ @Override
+ public WifiWakeReasonAndCounts[] newArray(int size) {
+ return new WifiWakeReasonAndCounts[size];
+ }
+ };
+}