diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl index caab00c3863e4e6efba080b2d1d1448937b9c908..775ec99205753858ad95e3d6de82a40fa17af4d7 100644 --- a/core/java/android/view/IWindowSession.aidl +++ b/core/java/android/view/IWindowSession.aidl @@ -300,5 +300,5 @@ interface IWindowSession { /** * Called when the system gesture exclusion has changed. */ - void reportSystemGestureExclusionChanged(IWindow window, in List exclusionRects); + oneway void reportSystemGestureExclusionChanged(IWindow window, in List exclusionRects); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 8a0bae3a73cfcfa8076c17b516c5f09ced92229a..ac2fa3b526928ab1a210e9e26f42d2d096a0d5a3 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -967,6 +967,19 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ static boolean sBrokenInsetsDispatch; + /** + * Prior to Q, calling + * {@link com.android.internal.policy.DecorView#setBackgroundDrawable(Drawable)} + * did not call update the window format so the opacity of the background was not correctly + * applied to the window. Some applications rely on this misbehavior to work properly. + *

+ * From Q, {@link com.android.internal.policy.DecorView#setBackgroundDrawable(Drawable)} is + * the same as {@link com.android.internal.policy.DecorView#setWindowBackground(Drawable)} + * which updates the window format. + * @hide + */ + protected static boolean sBrokenWindowBackground; + /** @hide */ @IntDef({NOT_FOCUSABLE, FOCUSABLE, FOCUSABLE_AUTO}) @Retention(RetentionPolicy.SOURCE) @@ -5104,6 +5117,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, sBrokenInsetsDispatch = ViewRootImpl.sNewInsetsMode != NEW_INSETS_MODE_FULL || targetSdkVersion < Build.VERSION_CODES.Q; + sBrokenWindowBackground = targetSdkVersion < Build.VERSION_CODES.Q; + sCompatibilityDone = true; } } diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 4daddfbfb204259cd2c255450b58bbf628521d11..8dc47a40158069fe4c3a20409811b3f662d99985 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -186,6 +186,89 @@ public final class SystemUiDeviceConfigFlags { */ public static final String BRIGHTLINE_FALSING_MANAGER_ENABLED = "brightline_falsing_manager_enabled"; + /** + * (float) Maximum fraction of the screen required to qualify as a real swipe. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_SCREEN_FRACTION_MAX_DISTANCE = + "brightline_falsing_distance_screen_fraction_max_distance"; + + /** + * (float) Multiplier for swipe velocity to convert it to pixels for a fling. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_VELOCITY_TO_DISTANCE = + "brightline_falsing_distance_velcoity_to_distance"; + + /** + * (float) How far, in inches, must a fling travel horizontally to qualify as intentional. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_FLING_THRESHOLD_IN = + "brightline_falsing_distance_horizontal_fling_threshold_in"; + + /** + * (float) Maximum fraction of the screen required to qualify as a real swipe. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_VERTICAL_FLING_THRESHOLD_IN = + "brightline_falsing_distance_vertical_fling_threshold_in"; + + /** + * (float) How far, in inches, must a continuous swipe travel horizontally to be intentional. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_SWIPE_THRESHOLD_IN = + "brightline_falsing_distance_horizontal_swipe_threshold_in"; + + /** + * (float) How far, in inches, must a continuous swipe travel vertically to be intentional. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_VERTICAL_SWIPE_THRESHOLD_IN = + "brightline_falsing_distance_horizontal_swipe_threshold_in"; + + /** + * (float) Percentage of swipe with the proximity sensor covered that triggers a higher + * swipe distance requirement. + */ + public static final String BRIGHTLINE_FALSING_PROXIMITY_PERCENT_COVERED_THRESHOLD = + "brightline_falsing_proximity_percent_covered_threshold"; + + /** + * (float) Angle, in radians, that a swipe can vary from horizontal and sill be intentional. + */ + public static final String BRIGHTLINE_FALSING_DIAGONAL_HORIZONTAL_ANGLE_RANGE = + "brightline_falsing_diagonal_horizontal_angle_range"; + + /** + * (float) Angle, in radians, that a swipe can vary from vertical and sill be intentional. + */ + public static final String BRIGHTLINE_FALSING_DIAGONAL_VERTICAL_ANGLE_RANGE = + "brightline_falsing_diagonal_horizontal_angle_range"; + + /** + * (float) Distance, in inches, that a swipe is allowed to vary in the horizontal direction for + * horizontal swipes. + */ + public static final String BRIGHTLINE_FALSING_ZIGZAG_X_PRIMARY_DEVIANCE = + "brightline_falsing_zigzag_x_primary_deviance"; + + /** + * (float) Distance, in inches, that a swipe is allowed to vary in the vertical direction for + * vertical swipes. + */ + public static final String BRIGHTLINE_FALSING_ZIGZAG_Y_PRIMARY_DEVIANCE = + "brightline_falsing_zigzag_y_primary_deviance"; + + /** + * (float) Distance, in inches, that a swipe is allowed to vary in the horizontal direction for + * horizontal swipes. + */ + public static final String BRIGHTLINE_FALSING_ZIGZAG_X_SECONDARY_DEVIANCE = + "brightline_falsing_zigzag_x_secondary_deviance"; + + /** + * (float) Distance, in inches, that a swipe is allowed to vary in the vertical direction for + * vertical swipes. + */ + public static final String BRIGHTLINE_FALSING_ZIGZAG_Y_SECONDARY_DEVIANCE = + "brightline_falsing_zigzag_y_secondary_deviance"; + private SystemUiDeviceConfigFlags() { } } diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index fe66cf9aab7df465c9b86c1ad6f1fcd6fbcd082e..7c52a40d4494d4515fec8582581b405db4095ea5 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -983,13 +983,14 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind @Override public void setBackgroundDrawable(Drawable background) { - // TODO: This should route through setWindowBackground, but late in the release to make this // change. if (mOriginalBackgroundDrawable != background) { mOriginalBackgroundDrawable = background; updateBackgroundDrawable(); - drawableChanged(); + if (!View.sBrokenWindowBackground) { + drawableChanged(); + } } } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 4d426ef9e6b6d283b205bde789a40a35cf4afe12..f0cfc278834733646fb0b37028bfc95eecae5835 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -5024,6 +5024,7 @@ - - - - - - + - - - + android:src="@drawable/stat_sys_roaming" + android:contentDescription="@string/data_connection_roaming" + android:visibility="gone" /> diff --git a/packages/SystemUI/res/values/arrays.xml b/packages/SystemUI/res/values/arrays.xml deleted file mode 100644 index 5f064f508c43cfa009b7f0cadaaa1e11371b4ac8..0000000000000000000000000000000000000000 --- a/packages/SystemUI/res/values/arrays.xml +++ /dev/null @@ -1,1148 +0,0 @@ - - - - - - - - array/telephony_data_type_sim1 - array/telephony_data_type_sim1 - array/telephony_data_type_sim1 - - - - - 0 - - drawable/stat_sys_data_fully_connected_g - - drawable/stat_sys_data_fully_connected_e - - drawable/stat_sys_data_fully_connected_3g - - drawable/stat_sys_data_fully_connected_1x - - drawable/stat_sys_data_fully_connected_3g - - drawable/stat_sys_data_fully_connected_3g - - drawable/stat_sys_data_fully_connected_1x - - drawable/stat_sys_data_fully_connected_h - - drawable/stat_sys_data_fully_connected_h - - drawable/stat_sys_data_fully_connected_h - - 0 - - drawable/stat_sys_data_fully_connected_3g - - drawable/stat_sys_data_fully_connected_3g - - drawable/stat_sys_data_fully_connected_3g - - drawable/stat_sys_data_fully_connected_3g - - drawable/stat_sys_data_fully_connected_g - - drawable/stat_sys_data_fully_connected_3g - - 0 - - - - - - - - - - - - - drawable/stat_sys_data_fully_connected_3g - - drawable/stat_sys_data_fully_connected_4g - - drawable/stat_sys_data_fully_connected_4g_plus - - - - - - 0 - - string/accessibility_data_connection_gprs - - string/accessibility_data_connection_edge - - string/accessibility_data_connection_3g - - string/accessibility_data_connection_cdma - - string/accessibility_data_connection_3g - - string/accessibility_data_connection_3g - - string/accessibility_data_connection_cdma - - string/accessibility_data_connection_3.5g - - string/accessibility_data_connection_3.5g - - string/accessibility_data_connection_3.5g - - 0 - - string/accessibility_data_connection_3g - - string/accessibility_data_connection_lte - - string/accessibility_data_connection_3g - - string/accessibility_data_connection_3.5g - - string/accessibility_data_connection_gprs - - string/accessibility_data_connection_3g - - 0 - - - - - string/accessibility_data_connection_3g - - string/accessibility_data_connection_4g - - - - - - array/data_activity_sim1 - array/data_activity_sim1 - array/data_activity_sim1 - - - - array/telephony_data_activity_unknown_sim1 - array/telephony_data_activity_g_sim1 - array/telephony_data_activity_e_sim1 - array/telephony_data_activity_2g_sim1 - array/telephony_data_activity_3g_sim1 - array/telephony_data_activity_4g_sim1 - array/telephony_data_activity_h_sim1 - array/telephony_data_activity_hp_sim1 - array/telephony_data_activity_1x_sim1 - array/telephony_data_activity_lte_sim1 - array/telephony_data_activity_4g_plus_sim1 - - - - - - - - - - - 0 - 0 - 0 - 0 - 0 - - - - - - - - - - - 0 - drawable/stat_sys_signal_in_auto_mirrored - drawable/stat_sys_signal_out_auto_mirrored - drawable/stat_sys_signal_inout_auto_mirrored - 0 - - - - - - - - - - - 0 - drawable/stat_sys_signal_in_auto_mirrored - drawable/stat_sys_signal_out_auto_mirrored - drawable/stat_sys_signal_inout_auto_mirrored - 0 - - - - - - - - - - - 0 - drawable/stat_sys_signal_in_auto_mirrored - drawable/stat_sys_signal_out_auto_mirrored - drawable/stat_sys_signal_inout_auto_mirrored - 0 - - - - - - - - - - - 0 - drawable/stat_sys_signal_in_auto_mirrored - drawable/stat_sys_signal_out_auto_mirrored - drawable/stat_sys_signal_inout_auto_mirrored - 0 - - - - - - - - - - - 0 - drawable/stat_sys_signal_in_auto_mirrored - drawable/stat_sys_signal_out_auto_mirrored - drawable/stat_sys_signal_inout_auto_mirrored - 0 - - - - 0 - drawable/stat_sys_signal_in_auto_mirrored - drawable/stat_sys_signal_out_auto_mirrored - drawable/stat_sys_signal_inout_auto_mirrored - 0 - - - - - - - - - - - 0 - drawable/stat_sys_signal_in_auto_mirrored - drawable/stat_sys_signal_out_auto_mirrored - drawable/stat_sys_signal_inout_auto_mirrored - 0 - - - - - - - - - - - 0 - drawable/stat_sys_signal_in_auto_mirrored - drawable/stat_sys_signal_out_auto_mirrored - drawable/stat_sys_signal_inout_auto_mirrored - 0 - - - - - - - - - - - 0 - drawable/stat_sys_signal_in_auto_mirrored - drawable/stat_sys_signal_out_auto_mirrored - drawable/stat_sys_signal_inout_auto_mirrored - 0 - - - - - - - - - - - 0 - drawable/stat_sys_signal_in_auto_mirrored - drawable/stat_sys_signal_out_auto_mirrored - drawable/stat_sys_signal_inout_auto_mirrored - 0 - - - - - - - - - - - - - array/telephony_siganl_strength_sim1 - array/telephony_siganl_strength_sim1 - array/telephony_siganl_strength_sim1 - - - - - array/telephony_siganl_strength_roaming_sim1 - array/telephony_siganl_strength_roaming_sim1 - array/telephony_siganl_strength_roaming_sim1 - - - - array/telephony_signal_strength_g_sim1 - array/telephony_signal_strength_e_sim1 - array/telephony_signal_strength_3g_sim1 - array/telephony_signal_strength_4g_sim1 - array/telephony_signal_strength_h_sim1 - array/telephony_signal_strength_hp_sim1 - array/telephony_signal_strength_1x_sim1 - array/telephony_signal_strength_cdma_sim1 - array/telephony_signal_strength_umts_sim1 - - - - - - - - - - array/telephony_signal_strength_g_roaming_sim1 - array/telephony_signal_strength_e_roaming_sim1 - array/telephony_signal_strength_3g_roaming_sim1 - array/telephony_signal_strength_4g_roaming_sim1 - array/telephony_signal_strength_h_roaming_sim1 - array/telephony_signal_strength_hp_roaming_sim1 - array/telephony_signal_strength_1x_roaming_sim1 - array/telephony_signal_strength_cdma_roaming_sim1 - array/telephony_signal_strength_umts_roaming_sim1 - - - - - - - - - - array/signal_strength_g_normal_sim1 - array/signal_strength_g_fully_sim1 - - - - array/signal_strength_g_normal_roaming_sim1 - array/signal_strength_g_fully_roaming_sim1 - - - - array/signal_strength_e_normal_sim1 - array/signal_strength_e_fully_sim1 - - - - array/signal_strength_e_normal_roaming_sim1 - array/signal_strength_e_fully_roaming_sim1 - - - - array/signal_strength_3g_normal_sim1 - array/signal_strength_3g_fully_sim1 - - - - array/signal_strength_3g_normal_roaming_sim1 - array/signal_strength_3g_fully_roaming_sim1 - - - - array/signal_strength_4g_normal_sim1 - array/signal_strength_4g_fully_sim1 - - - - array/signal_strength_4g_normal_roaming_sim1 - array/signal_strength_4g_fully_roaming_sim1 - - - - array/signal_strength_h_normal_sim1 - array/signal_strength_h_fully_sim1 - - - - array/signal_strength_h_normal_roaming_sim1 - array/signal_strength_h_fully_roaming_sim1 - - - - array/signal_strength_hp_normal_sim1 - array/signal_strength_hp_fully_sim1 - - - - array/signal_strength_hp_normal_roaming_sim1 - array/signal_strength_hp_fully_roaming_sim1 - - - - array/signal_strength_1x_normal_sim1 - array/signal_strength_1x_fully_sim1 - - - - array/signal_strength_1x_normal_roaming_sim1 - array/signal_strength_1x_fully_roaming_sim1 - - - - array/signal_strength_cdma_normal_sim1 - array/signal_strength_cdma_fully_sim1 - - - - array/signal_strength_cdma_normal_roaming_sim1 - array/signal_strength_cdma_fully_roaming_sim1 - - - - array/signal_strength_umts_normal_sim1 - array/signal_strength_umts_fully_sim1 - - - - array/signal_strength_umts_normal_roaming_sim1 - array/signal_strength_umts_fully_roaming_sim1 - - - - array/signal_strength_4g_plus_normal_roaming_sim1 - array/signal_strength_4g_plus_fully_roaming_sim1 - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_fully - drawable/stat_sys_signal_1_fully - drawable/stat_sys_signal_2_fully - drawable/stat_sys_signal_3_fully - drawable/stat_sys_signal_4_fully - - - - drawable/stat_sys_signal_0_default_roam - drawable/stat_sys_signal_1_default_roam - drawable/stat_sys_signal_2_default_roam - drawable/stat_sys_signal_3_default_roam - drawable/stat_sys_signal_4_default_roam - - - - drawable/stat_sys_signal_0_default_fully_roam - drawable/stat_sys_signal_1_default_fully_roam - drawable/stat_sys_signal_2_default_fully_roam - drawable/stat_sys_signal_3_default_fully_roam - drawable/stat_sys_signal_4_default_fully_roam - - - - - string/accessibility_no_phone - string/accessibility_phone_one_bar - string/accessibility_phone_two_bars - string/accessibility_phone_three_bars - string/accessibility_phone_signal_full - - - - - - drawable/stat_sys_signal_null - drawable/stat_sys_signal_null - drawable/stat_sys_signal_null - - - - - - drawable/stat_sys_no_sims - drawable/stat_sys_no_sims - drawable/stat_sys_no_sims - - - - - array/signal_strength_g_normal_sim2 - array/signal_strength_g_fully_sim2 - - - array/signal_strength_g_normal_roaming_sim2 - array/signal_strength_g_fully_roaming_sim2 - - - array/signal_strength_e_normal_sim2 - array/signal_strength_e_fully_sim2 - - - array/signal_strength_e_normal_roaming_sim2 - array/signal_strength_e_fully_roaming_sim2 - - - array/signal_strength_3g_normal_sim2 - array/signal_strength_3g_fully_sim2 - - - array/signal_strength_3g_normal_roaming_sim2 - array/signal_strength_3g_fully_roaming_sim2 - - - array/signal_strength_4g_normal_sim2 - array/signal_strength_4g_fully_sim2 - - - array/signal_strength_4g_normal_roaming_sim2 - array/signal_strength_4g_fully_roaming_sim2 - - - array/signal_strength_h_normal_sim2 - array/signal_strength_h_fully_sim2 - - - array/signal_strength_h_normal_roaming_sim2 - array/signal_strength_h_fully_roaming_sim2 - - - array/signal_strength_hp_normal_sim2 - array/signal_strength_hp_fully_sim2 - - - array/signal_strength_hp_normal_roaming_sim2 - array/signal_strength_hp_fully_roaming_sim2 - - - array/signal_strength_1x_normal_sim2 - array/signal_strength_1x_fully_sim2 - - - array/signal_strength_1x_normal_roaming_sim2 - array/signal_strength_1x_fully_roaming_sim2 - - - array/signal_strength_cdma_normal_sim2 - array/signal_strength_cdma_fully_sim2 - - - array/signal_strength_cdma_normal_roaming_sim2 - array/signal_strength_cdma_fully_roaming_sim2 - - - array/signal_strength_umts_normal_sim2 - array/signal_strength_umts_fully_sim2 - - - array/signal_strength_umts_normal_roaming_sim2 - array/signal_strength_umts_fully_roaming_sim2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - array/signal_strength_g_normal_sim3 - array/signal_strength_g_fully_sim3 - - - array/signal_strength_g_normal_roaming_sim3 - array/signal_strength_g_fully_roaming_sim3 - - - array/signal_strength_e_normal_sim3 - array/signal_strength_e_fully_sim3 - - - array/signal_strength_e_normal_roaming_sim3 - array/signal_strength_e_fully_roaming_sim3 - - - array/signal_strength_3g_normal_sim3 - array/signal_strength_3g_fully_sim3 - - - array/signal_strength_3g_normal_roaming_sim3 - array/signal_strength_3g_fully_roaming_sim3 - - - array/signal_strength_4g_normal_sim3 - array/signal_strength_4g_fully_sim3 - - - array/signal_strength_4g_normal_roaming_sim3 - array/signal_strength_4g_fully_roaming_sim3 - - - array/signal_strength_h_normal_sim3 - array/signal_strength_h_fully_sim3 - - - array/signal_strength_h_normal_roaming_sim3 - array/signal_strength_h_fully_roaming_sim3 - - - array/signal_strength_hp_normal_sim3 - array/signal_strength_hp_fully_sim3 - - - array/signal_strength_hp_normal_roaming_sim3 - array/signal_strength_hp_fully_roaming_sim3 - - - array/signal_strength_1x_normal_sim3 - array/signal_strength_1x_fully_sim3 - - - array/signal_strength_1x_normal_roaming_sim3 - array/signal_strength_1x_fully_roaming_sim3 - - - array/signal_strength_cdma_normal_sim3 - array/signal_strength_cdma_fully_sim3 - - - array/signal_strength_cdma_normal_roaming_sim3 - array/signal_strength_cdma_fully_roaming_sim3 - - - array/signal_strength_umts_normal_sim3 - array/signal_strength_umts_fully_sim3 - - - array/signal_strength_umts_normal_roaming_sim3 - array/signal_strength_umts_fully_roaming_sim3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @drawable/stat_sys_signal_0_3g - @drawable/stat_sys_signal_0_4g - @drawable/stat_sys_signal_1_3g - @drawable/stat_sys_signal_1_4g - @drawable/stat_sys_signal_2_3g - @drawable/stat_sys_signal_2_4g - @drawable/stat_sys_signal_3_3g - @drawable/stat_sys_signal_3_4g - @drawable/stat_sys_signal_4_3g - @drawable/stat_sys_signal_4_4g - @drawable/stat_sys_signal_0_3g_fully - @drawable/stat_sys_signal_0_4g_fully - @drawable/stat_sys_signal_1_3g_fully - @drawable/stat_sys_signal_1_4g_fully - @drawable/stat_sys_signal_2_3g_fully - @drawable/stat_sys_signal_2_4g_fully - @drawable/stat_sys_signal_3_3g_fully - @drawable/stat_sys_signal_3_4g_fully - @drawable/stat_sys_signal_4_3g_fully - @drawable/stat_sys_signal_4_4g_fully - - - - @drawable/stat_sys_signal_0_3g_default - @drawable/stat_sys_signal_0_4g_default - @drawable/stat_sys_signal_1_3g_default - @drawable/stat_sys_signal_1_4g_default - @drawable/stat_sys_signal_2_3g_default - @drawable/stat_sys_signal_2_4g_default - @drawable/stat_sys_signal_3_3g_default - @drawable/stat_sys_signal_3_4g_default - @drawable/stat_sys_signal_4_3g_default - @drawable/stat_sys_signal_4_4g_default - @drawable/stat_sys_signal_0_3g_default_fully - @drawable/stat_sys_signal_0_4g_default_fully - @drawable/stat_sys_signal_1_3g_default_fully - @drawable/stat_sys_signal_1_4g_default_fully - @drawable/stat_sys_signal_2_3g_default_fully - @drawable/stat_sys_signal_2_4g_default_fully - @drawable/stat_sys_signal_3_3g_default_fully - @drawable/stat_sys_signal_3_4g_default_fully - @drawable/stat_sys_signal_4_3g_default_fully - @drawable/stat_sys_signal_4_4g_default_fully - - diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 4da62a216333bee526c06896ef18bff3758c8bb3..dba3dd76b02165fda3f28a492ecc00f9be153d07 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -135,27 +135,6 @@ 2000 4000 - - false - - - true - - - false - - - false - - - false - - - false - - - false - false diff --git a/packages/SystemUI/res/values/config_qti.xml b/packages/SystemUI/res/values/config_qti.xml index 763435ea2e88ca74db938bb47bb0403b67f79a24..82c1a477c625211138707ef3b3552e0df3d6ae80 100644 --- a/packages/SystemUI/res/values/config_qti.xml +++ b/packages/SystemUI/res/values/config_qti.xml @@ -31,36 +31,8 @@ false false false - - + false + false + false false - - 4 - - - - - - - - - - -110 - -90 - -80 - -30 - - - - - - - - - - -5 - 10 - 20 - 40 - diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index b1cba53c4bca3b4d016791ad6e7b6b6562413edb..fee2c9b2505a7ab86fe230ea16bb5f87d648af1c 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -540,6 +540,9 @@ public class KeyguardClockSwitch extends RelativeLayout { @Override public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues, TransitionValues endValues) { + if (!sceneRoot.isShown()) { + return null; + } final float cutoff = mCutoff; final int startVisibility = View.INVISIBLE; final int endVisibility = (int) endValues.values.get(PROPNAME_VISIBILITY); @@ -552,6 +555,9 @@ public class KeyguardClockSwitch extends RelativeLayout { @Override public Animator onDisappear(ViewGroup sceneRoot, View view, TransitionValues startValues, TransitionValues endValues) { + if (!sceneRoot.isShown()) { + return null; + } final float cutoff = 1f - mCutoff; final int startVisibility = View.VISIBLE; final int endVisibility = (int) endValues.values.get(PROPNAME_VISIBILITY); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java index d45f521ba65aa9a13732fc335f6596b313af4db2..324019395489445480fcc042e2e8ac4737d6bccd 100755 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java @@ -77,7 +77,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { if (mCallback != null) { mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); } - break; + break; } case READY: { mRemainingAttempts = -1; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java index e219e24a89443cc40dcc63d1c19f1e8fa60e9385..af4e61b3f6bcb585cbcd29cb73760befad816cc3 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java @@ -89,6 +89,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe private final HashMap mClickActions; private final ActivityStarter mActivityStarter; private final ConfigurationController mConfigurationController; + private final LayoutTransition mLayoutTransition; private Uri mKeyguardSliceUri; @VisibleForTesting TextView mTitle; @@ -126,16 +127,16 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe mActivityStarter = activityStarter; mConfigurationController = configurationController; - LayoutTransition transition = new LayoutTransition(); - transition.setStagger(LayoutTransition.CHANGE_APPEARING, DEFAULT_ANIM_DURATION / 2); - transition.setDuration(LayoutTransition.APPEARING, DEFAULT_ANIM_DURATION); - transition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 2); - transition.disableTransitionType(LayoutTransition.CHANGE_APPEARING); - transition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); - transition.setInterpolator(LayoutTransition.APPEARING, Interpolators.FAST_OUT_SLOW_IN); - transition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT); - transition.setAnimateParentHierarchy(false); - setLayoutTransition(transition); + mLayoutTransition = new LayoutTransition(); + mLayoutTransition.setStagger(LayoutTransition.CHANGE_APPEARING, DEFAULT_ANIM_DURATION / 2); + mLayoutTransition.setDuration(LayoutTransition.APPEARING, DEFAULT_ANIM_DURATION); + mLayoutTransition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 2); + mLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_APPEARING); + mLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); + mLayoutTransition.setInterpolator(LayoutTransition.APPEARING, + Interpolators.FAST_OUT_SLOW_IN); + mLayoutTransition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT); + mLayoutTransition.setAnimateParentHierarchy(false); } @Override @@ -174,6 +175,12 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe mConfigurationController.removeCallback(this); } + @Override + public void onVisibilityAggregated(boolean isVisible) { + super.onVisibilityAggregated(isVisible); + setLayoutTransition(isVisible ? mLayoutTransition : null); + } + /** * Returns whether the current visible slice has a title/header. */ @@ -419,6 +426,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe * their desired positions. */ private final Animation.AnimationListener mKeepAwakeListener; + private LayoutTransition mLayoutTransition; private float mDarkAmount; public Row(Context context) { @@ -440,33 +448,41 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe @Override protected void onFinishInflate() { - LayoutTransition transition = new LayoutTransition(); - transition.setDuration(DEFAULT_ANIM_DURATION); + mLayoutTransition = new LayoutTransition(); + mLayoutTransition.setDuration(DEFAULT_ANIM_DURATION); PropertyValuesHolder left = PropertyValuesHolder.ofInt("left", 0, 1); PropertyValuesHolder right = PropertyValuesHolder.ofInt("right", 0, 1); ObjectAnimator changeAnimator = ObjectAnimator.ofPropertyValuesHolder((Object) null, left, right); - transition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeAnimator); - transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeAnimator); - transition.setInterpolator(LayoutTransition.CHANGE_APPEARING, + mLayoutTransition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeAnimator); + mLayoutTransition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeAnimator); + mLayoutTransition.setInterpolator(LayoutTransition.CHANGE_APPEARING, Interpolators.ACCELERATE_DECELERATE); - transition.setInterpolator(LayoutTransition.CHANGE_DISAPPEARING, + mLayoutTransition.setInterpolator(LayoutTransition.CHANGE_DISAPPEARING, Interpolators.ACCELERATE_DECELERATE); - transition.setStartDelay(LayoutTransition.CHANGE_APPEARING, DEFAULT_ANIM_DURATION); - transition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, DEFAULT_ANIM_DURATION); + mLayoutTransition.setStartDelay(LayoutTransition.CHANGE_APPEARING, + DEFAULT_ANIM_DURATION); + mLayoutTransition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, + DEFAULT_ANIM_DURATION); ObjectAnimator appearAnimator = ObjectAnimator.ofFloat(null, "alpha", 0f, 1f); - transition.setAnimator(LayoutTransition.APPEARING, appearAnimator); - transition.setInterpolator(LayoutTransition.APPEARING, Interpolators.ALPHA_IN); + mLayoutTransition.setAnimator(LayoutTransition.APPEARING, appearAnimator); + mLayoutTransition.setInterpolator(LayoutTransition.APPEARING, Interpolators.ALPHA_IN); ObjectAnimator disappearAnimator = ObjectAnimator.ofFloat(null, "alpha", 1f, 0f); - transition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT); - transition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 4); - transition.setAnimator(LayoutTransition.DISAPPEARING, disappearAnimator); + mLayoutTransition.setInterpolator(LayoutTransition.DISAPPEARING, + Interpolators.ALPHA_OUT); + mLayoutTransition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 4); + mLayoutTransition.setAnimator(LayoutTransition.DISAPPEARING, disappearAnimator); - transition.setAnimateParentHierarchy(false); - setLayoutTransition(transition); + mLayoutTransition.setAnimateParentHierarchy(false); + } + + @Override + public void onVisibilityAggregated(boolean isVisible) { + super.onVisibilityAggregated(isVisible); + setLayoutTransition(isVisible ? mLayoutTransition : null); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java index 6fb6467d07b251fd5fe1e29ff51afaaf66d2dc65..382c5d5c59548e2cdd3b73973e8523cef99b2a32 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java @@ -168,6 +168,7 @@ public class FalsingManagerImpl implements FalsingManager { .append("enabled=").append(isEnabled() ? 1 : 0) .append(" mScreenOn=").append(mScreenOn ? 1 : 0) .append(" mState=").append(StatusBarState.toShortString(mState)) + .append(" mShowingAod=").append(mShowingAod ? 1 : 0) .toString() ); } @@ -550,6 +551,14 @@ public class FalsingManagerImpl implements FalsingManager { pw.println(); } + @Override + public void cleanup() { + mSensorManager.unregisterListener(mSensorEventListener); + mContext.getContentResolver().unregisterContentObserver(mSettingsObserver); + Dependency.get(StatusBarStateController.class).removeCallback(mStatusBarStateListener); + KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mKeyguardUpdateCallback); + } + public Uri reportRejectedTouch() { if (mDataCollector.isEnabled()) { return mDataCollector.reportRejectedTouch(); diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java index 3cc8ec9afbb224b84a5a21b3ffe185ca9ccad600..eb4edcc45c8042352d0705fd95ac91ecc4fdcda7 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java @@ -65,6 +65,7 @@ public class FalsingManagerProxy implements FalsingManager { public void onPluginConnected(FalsingPlugin plugin, Context context) { FalsingManager pluginFalsingManager = plugin.getFalsingManager(context); if (pluginFalsingManager != null) { + mInternalFalsingManager.cleanup(); mInternalFalsingManager = pluginFalsingManager; } } @@ -91,7 +92,10 @@ public class FalsingManagerProxy implements FalsingManager { @VisibleForTesting public void setupFalsingManager(Context context) { boolean brightlineEnabled = DeviceConfig.getBoolean( - DeviceConfig.NAMESPACE_SYSTEMUI, BRIGHTLINE_FALSING_MANAGER_ENABLED, false); + DeviceConfig.NAMESPACE_SYSTEMUI, BRIGHTLINE_FALSING_MANAGER_ENABLED, true); + if (mInternalFalsingManager != null) { + mInternalFalsingManager.cleanup(); + } if (!brightlineEnabled) { mInternalFalsingManager = new FalsingManagerImpl(context); } else { @@ -290,4 +294,9 @@ public class FalsingManagerProxy implements FalsingManager { public void dump(PrintWriter pw) { mInternalFalsingManager.dump(pw); } + + @Override + public void cleanup() { + mInternalFalsingManager.cleanup(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java index 19c46e40f604b8bc7824f242ae095c12ffdd7b22..6280c9f7c00f051e2112eabac4460828cff35f95 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java @@ -98,10 +98,12 @@ public class BrightLineFalsingManager implements FalsingManager { } private void sessionStart() { - logDebug("Starting Session"); - mSessionStarted = true; - registerSensors(); - mClassifiers.forEach(FalsingClassifier::onSessionStarted); + if (!mSessionStarted) { + logDebug("Starting Session"); + mSessionStarted = true; + registerSensors(); + mClassifiers.forEach(FalsingClassifier::onSessionStarted); + } } private void sessionEnd() { @@ -309,6 +311,11 @@ public class BrightLineFalsingManager implements FalsingManager { public void dump(PrintWriter printWriter) { } + @Override + public void cleanup() { + unregisterSensors(); + } + static void logDebug(String msg) { logDebug(msg, null); } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java index 730907e1fa9cfdaee5808d2b7dba4d6f7eea3a40..cc6645415fd8df1538107f8d1dd5e8b7b3870e00 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java @@ -16,9 +16,13 @@ package com.android.systemui.classifier.brightline; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DIAGONAL_HORIZONTAL_ANGLE_RANGE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DIAGONAL_VERTICAL_ANGLE_RANGE; import static com.android.systemui.classifier.Classifier.LEFT_AFFORDANCE; import static com.android.systemui.classifier.Classifier.RIGHT_AFFORDANCE; +import android.provider.DeviceConfig; + /** * False on swipes that are too close to 45 degrees. * @@ -35,8 +39,20 @@ class DiagonalClassifier extends FalsingClassifier { private static final float ONE_HUNDRED_EIGHTY_DEG = (float) (Math.PI); private static final float THREE_HUNDRED_SIXTY_DEG = (float) (2 * Math.PI); + private final float mHorizontalAngleRange; + private final float mVerticalAngleRange; + DiagonalClassifier(FalsingDataProvider dataProvider) { super(dataProvider); + + mHorizontalAngleRange = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DIAGONAL_HORIZONTAL_ANGLE_RANGE, + HORIZONTAL_ANGLE_RANGE); + mVerticalAngleRange = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DIAGONAL_VERTICAL_ANGLE_RANGE, + VERTICAL_ANGLE_RANGE); } @Override @@ -52,11 +68,11 @@ class DiagonalClassifier extends FalsingClassifier { return false; } - float minAngle = DIAGONAL - HORIZONTAL_ANGLE_RANGE; - float maxAngle = DIAGONAL + HORIZONTAL_ANGLE_RANGE; + float minAngle = DIAGONAL - mHorizontalAngleRange; + float maxAngle = DIAGONAL + mHorizontalAngleRange; if (isVertical()) { - minAngle = DIAGONAL - VERTICAL_ANGLE_RANGE; - maxAngle = DIAGONAL + VERTICAL_ANGLE_RANGE; + minAngle = DIAGONAL - mVerticalAngleRange; + maxAngle = DIAGONAL + mVerticalAngleRange; } return angleBetween(angle, minAngle, maxAngle) diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java index 005ee12c4f610773f3137e126b14f99c0831ca04..a6a617dc51ded3d527d53382b78728c71d301e6f 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java @@ -16,6 +16,14 @@ package com.android.systemui.classifier.brightline; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_FLING_THRESHOLD_IN; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_SWIPE_THRESHOLD_IN; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_SCREEN_FRACTION_MAX_DISTANCE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VELOCITY_TO_DISTANCE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VERTICAL_FLING_THRESHOLD_IN; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VERTICAL_SWIPE_THRESHOLD_IN; + +import android.provider.DeviceConfig; import android.view.MotionEvent; import android.view.VelocityTracker; @@ -31,12 +39,13 @@ class DistanceClassifier extends FalsingClassifier { private static final float HORIZONTAL_SWIPE_THRESHOLD_DISTANCE_IN = 3; private static final float VERTICAL_SWIPE_THRESHOLD_DISTANCE_IN = 3; private static final float VELOCITY_TO_DISTANCE = 80f; - private static final float SCREEN_FRACTION_MIN_DISTANCE = 0.8f; + private static final float SCREEN_FRACTION_MAX_DISTANCE = 0.8f; private final float mVerticalFlingThresholdPx; private final float mHorizontalFlingThresholdPx; private final float mVerticalSwipeThresholdPx; private final float mHorizontalSwipeThresholdPx; + private final float mVelocityToDistanceMultiplier; private boolean mDistanceDirty; private DistanceVectors mCachedDistance; @@ -44,18 +53,48 @@ class DistanceClassifier extends FalsingClassifier { DistanceClassifier(FalsingDataProvider dataProvider) { super(dataProvider); + mVelocityToDistanceMultiplier = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_VELOCITY_TO_DISTANCE, + VELOCITY_TO_DISTANCE); + + float horizontalFlingThresholdIn = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_FLING_THRESHOLD_IN, + HORIZONTAL_FLING_THRESHOLD_DISTANCE_IN); + + float verticalFlingThresholdIn = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_VERTICAL_FLING_THRESHOLD_IN, + VERTICAL_FLING_THRESHOLD_DISTANCE_IN); + + float horizontalSwipeThresholdIn = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_SWIPE_THRESHOLD_IN, + HORIZONTAL_SWIPE_THRESHOLD_DISTANCE_IN); + + float verticalSwipeThresholdIn = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_VERTICAL_SWIPE_THRESHOLD_IN, + VERTICAL_SWIPE_THRESHOLD_DISTANCE_IN); + + float screenFractionMaxDistance = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_SCREEN_FRACTION_MAX_DISTANCE, + SCREEN_FRACTION_MAX_DISTANCE); + mHorizontalFlingThresholdPx = Math - .min(getWidthPixels() * SCREEN_FRACTION_MIN_DISTANCE, - HORIZONTAL_FLING_THRESHOLD_DISTANCE_IN * getXdpi()); + .min(getWidthPixels() * screenFractionMaxDistance, + horizontalFlingThresholdIn * getXdpi()); mVerticalFlingThresholdPx = Math - .min(getHeightPixels() * SCREEN_FRACTION_MIN_DISTANCE, - VERTICAL_FLING_THRESHOLD_DISTANCE_IN * getYdpi()); + .min(getHeightPixels() * screenFractionMaxDistance, + verticalFlingThresholdIn * getYdpi()); mHorizontalSwipeThresholdPx = Math - .min(getWidthPixels() * SCREEN_FRACTION_MIN_DISTANCE, - HORIZONTAL_SWIPE_THRESHOLD_DISTANCE_IN * getXdpi()); + .min(getWidthPixels() * screenFractionMaxDistance, + horizontalSwipeThresholdIn * getXdpi()); mVerticalSwipeThresholdPx = Math - .min(getHeightPixels() * SCREEN_FRACTION_MIN_DISTANCE, - VERTICAL_SWIPE_THRESHOLD_DISTANCE_IN * getYdpi()); + .min(getHeightPixels() * screenFractionMaxDistance, + verticalSwipeThresholdIn * getYdpi()); mDistanceDirty = true; } @@ -139,18 +178,18 @@ class DistanceClassifier extends FalsingClassifier { } boolean getPassedFlingThreshold() { - float dX = this.mDx + this.mVx * VELOCITY_TO_DISTANCE; - float dY = this.mDy + this.mVy * VELOCITY_TO_DISTANCE; + float dX = this.mDx + this.mVx * mVelocityToDistanceMultiplier; + float dY = this.mDy + this.mVy * mVelocityToDistanceMultiplier; if (isHorizontal()) { logDebug("Horizontal swipe and fling distance: " + this.mDx + ", " - + this.mVx * VELOCITY_TO_DISTANCE); + + this.mVx * mVelocityToDistanceMultiplier); logDebug("Threshold: " + mHorizontalFlingThresholdPx); return Math.abs(dX) >= mHorizontalFlingThresholdPx; } logDebug("Vertical swipe and fling distance: " + this.mDy + ", " - + this.mVy * VELOCITY_TO_DISTANCE); + + this.mVy * mVelocityToDistanceMultiplier); logDebug("Threshold: " + mVerticalFlingThresholdPx); return Math.abs(dY) >= mVerticalFlingThresholdPx; } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java index 94a8ac85b72443c41fad80d76d752ff232115cef..2644bf9f26ce78797d940e23a4e05c25631a1fae 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java @@ -16,10 +16,12 @@ package com.android.systemui.classifier.brightline; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_PROXIMITY_PERCENT_COVERED_THRESHOLD; import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS; import android.hardware.Sensor; import android.hardware.SensorEvent; +import android.provider.DeviceConfig; import android.view.MotionEvent; @@ -31,8 +33,9 @@ import android.view.MotionEvent; */ class ProximityClassifier extends FalsingClassifier { - private static final double PERCENT_COVERED_THRESHOLD = 0.1; + private static final float PERCENT_COVERED_THRESHOLD = 0.1f; private final DistanceClassifier mDistanceClassifier; + private final float mPercentCoveredThreshold; private boolean mNear; private long mGestureStartTimeNs; @@ -44,6 +47,11 @@ class ProximityClassifier extends FalsingClassifier { FalsingDataProvider dataProvider) { super(dataProvider); this.mDistanceClassifier = distanceClassifier; + + mPercentCoveredThreshold = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_PROXIMITY_PERCENT_COVERED_THRESHOLD, + PERCENT_COVERED_THRESHOLD); } @Override @@ -107,7 +115,7 @@ class ProximityClassifier extends FalsingClassifier { logInfo("Percent of gesture in proximity: " + mPercentNear); - if (mPercentNear > PERCENT_COVERED_THRESHOLD) { + if (mPercentNear > mPercentCoveredThreshold) { return !mDistanceClassifier.isLongSwipe(); } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java index a62574f2639992fea04b08ba89ed9d5b53fef05f..c58b7db451b020a06c0ca9d0adcfd3501802316a 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java @@ -16,7 +16,13 @@ package com.android.systemui.classifier.brightline; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_X_PRIMARY_DEVIANCE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_X_SECONDARY_DEVIANCE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_Y_PRIMARY_DEVIANCE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_Y_SECONDARY_DEVIANCE; + import android.graphics.Point; +import android.provider.DeviceConfig; import android.view.MotionEvent; import java.util.ArrayList; @@ -37,8 +43,34 @@ class ZigZagClassifier extends FalsingClassifier { private static final float MAX_X_SECONDARY_DEVIANCE = .3f; private static final float MAX_Y_SECONDARY_DEVIANCE = .3f; + private final float mMaxXPrimaryDeviance; + private final float mMaxYPrimaryDeviance; + private final float mMaxXSecondaryDeviance; + private final float mMaxYSecondaryDeviance; + ZigZagClassifier(FalsingDataProvider dataProvider) { super(dataProvider); + + mMaxXPrimaryDeviance = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_ZIGZAG_X_PRIMARY_DEVIANCE, + MAX_X_PRIMARY_DEVIANCE); + + mMaxYPrimaryDeviance = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_ZIGZAG_Y_PRIMARY_DEVIANCE, + MAX_Y_PRIMARY_DEVIANCE); + + mMaxXSecondaryDeviance = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_ZIGZAG_X_SECONDARY_DEVIANCE, + MAX_X_SECONDARY_DEVIANCE); + + mMaxYSecondaryDeviance = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_ZIGZAG_Y_SECONDARY_DEVIANCE, + MAX_Y_SECONDARY_DEVIANCE); + } @Override @@ -98,11 +130,11 @@ class ZigZagClassifier extends FalsingClassifier { float maxXDeviance; float maxYDeviance; if (actualDx > actualDy) { - maxXDeviance = MAX_X_PRIMARY_DEVIANCE * totalDistanceIn * getXdpi(); - maxYDeviance = MAX_Y_SECONDARY_DEVIANCE * totalDistanceIn * getYdpi(); + maxXDeviance = mMaxXPrimaryDeviance * totalDistanceIn * getXdpi(); + maxYDeviance = mMaxYSecondaryDeviance * totalDistanceIn * getYdpi(); } else { - maxXDeviance = MAX_X_SECONDARY_DEVIANCE * totalDistanceIn * getXdpi(); - maxYDeviance = MAX_Y_PRIMARY_DEVIANCE * totalDistanceIn * getYdpi(); + maxXDeviance = mMaxXSecondaryDeviance * totalDistanceIn * getXdpi(); + maxYDeviance = mMaxYPrimaryDeviance * totalDistanceIn * getYdpi(); } logDebug("Straightness Deviance: (" + devianceX + "," + devianceY + ") vs " diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java index 8694d2ad607cae570d900d7f9e177512b11232df..9c2adb36e1aee614c072c5a7aa08b519737fc427 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java @@ -30,6 +30,7 @@ import com.android.systemui.R; import com.android.systemui.SystemUIApplication; import com.android.systemui.classifier.FalsingManagerFactory; import com.android.systemui.dock.DockManager; +import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.util.AsyncSensorManager; import com.android.systemui.util.wakelock.DelayedWakeLock; @@ -70,7 +71,7 @@ public class DozeFactory { new DozeScreenState(wrappedService, handler, params, wakeLock), createDozeScreenBrightness(context, wrappedService, sensorManager, host, params, handler), - new DozeWallpaperState(context), + new DozeWallpaperState(context, getBiometricUnlockController(dozeService)), new DozeDockHandler(context, machine, host, config, handler, dockManager) }); @@ -107,4 +108,10 @@ public class DozeFactory { final SystemUIApplication app = (SystemUIApplication) appCandidate; return app.getComponent(DozeHost.class); } + + public static BiometricUnlockController getBiometricUnlockController(DozeService service) { + Application appCandidate = service.getApplication(); + final SystemUIApplication app = (SystemUIApplication) appCandidate; + return app.getComponent(BiometricUnlockController.class); + } } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index 5f52486b2bc6336a7dffb04402444905cb9abb0f..a882309c06d48b5705b788777529ada8f81fed44 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -43,6 +43,7 @@ import androidx.annotation.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; +import com.android.systemui.R; import com.android.systemui.plugins.SensorManagerPlugin; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.util.AlarmTimeout; @@ -255,12 +256,21 @@ public class DozeSensors { long mLastNear; final AlarmTimeout mCooldownTimer; final AlwaysOnDisplayPolicy mPolicy; - + final Sensor mSensor; public ProxSensor(AlwaysOnDisplayPolicy policy) { mPolicy = policy; mCooldownTimer = new AlarmTimeout(mAlarmManager, this::updateRegistered, "prox_cooldown", mHandler); + + // The default prox sensor can be noisy, so let's use a prox gated brightness sensor + // if available. + Sensor sensor = DozeSensors.findSensorWithType(mSensorManager, + mContext.getString(R.string.doze_brightness_sensor_type)); + if (sensor == null) { + sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); + } + mSensor = sensor; } void setRequested(boolean requested) { @@ -324,8 +334,9 @@ public class DozeSensors { @Override public String toString() { - return String.format("{registered=%s, requested=%s, coolingDown=%s, currentlyFar=%s}", - mRegistered, mRequested, mCooldownTimer.isScheduled(), mCurrentlyFar); + return String.format("{registered=%s, requested=%s, coolingDown=%s, currentlyFar=%s," + + " sensor=%s}", mRegistered, mRequested, mCooldownTimer.isScheduled(), + mCurrentlyFar, mSensor); } } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java b/packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java index 1b3cd881b949507351513f15430cfebdd8967eec..35c8b741381c8624b137bdf6be0b4ae8b65c7388 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java @@ -24,6 +24,7 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; +import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.DozeParameters; import java.io.PrintWriter; @@ -38,18 +39,22 @@ public class DozeWallpaperState implements DozeMachine.Part { private final IWallpaperManager mWallpaperManagerService; private final DozeParameters mDozeParameters; + private final BiometricUnlockController mBiometricUnlockController; private boolean mIsAmbientMode; - public DozeWallpaperState(Context context) { + public DozeWallpaperState(Context context, + BiometricUnlockController biometricUnlockController) { this(IWallpaperManager.Stub.asInterface( ServiceManager.getService(Context.WALLPAPER_SERVICE)), + biometricUnlockController, DozeParameters.getInstance(context)); } @VisibleForTesting DozeWallpaperState(IWallpaperManager wallpaperManagerService, - DozeParameters parameters) { + BiometricUnlockController biometricUnlockController, DozeParameters parameters) { mWallpaperManagerService = wallpaperManagerService; + mBiometricUnlockController = biometricUnlockController; mDozeParameters = parameters; } @@ -76,7 +81,9 @@ public class DozeWallpaperState implements DozeMachine.Part { } else { boolean wakingUpFromPulse = oldState == DozeMachine.State.DOZE_PULSING && newState == DozeMachine.State.FINISH; - animated = !mDozeParameters.getDisplayNeedsBlanking() || wakingUpFromPulse; + boolean fastDisplay = !mDozeParameters.getDisplayNeedsBlanking(); + animated = (fastDisplay && !mBiometricUnlockController.unlockedByWakeAndUnlock()) + || wakingUpFromPulse; } if (isAmbientMode != mIsAmbientMode) { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java index 20477975a6dd29f1bc1954bff2dfd88e54506837..0687b7d8efcefe7e32ae01529400a2afdbf77601 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java @@ -52,6 +52,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.R; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationMediaManager; +import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.NextAlarmControllerImpl; import com.android.systemui.statusbar.policy.ZenModeController; @@ -125,6 +126,7 @@ public class KeyguardSliceProvider extends SliceProvider implements private CharSequence mMediaTitle; private CharSequence mMediaArtist; protected boolean mDozing; + private int mStatusBarState; private boolean mMediaIsVisible; /** @@ -227,7 +229,10 @@ public class KeyguardSliceProvider extends SliceProvider implements } protected boolean needsMediaLocked() { - return !TextUtils.isEmpty(mMediaTitle) && mMediaIsVisible && mDozing; + // Show header if music is playing and the status bar is in the shade state. This way, an + // animation isn't necessary when pressing power and transitioning to AOD. + boolean keepWhenShade = mStatusBarState == StatusBarState.SHADE && mMediaIsVisible; + return !TextUtils.isEmpty(mMediaTitle) && mMediaIsVisible && (mDozing || keepWhenShade); } protected void addMediaLocked(ListBuilder listBuilder) { @@ -454,7 +459,7 @@ public class KeyguardSliceProvider extends SliceProvider implements synchronized (this) { boolean nextVisible = !mMediaInvisibleStates.contains(state); mHandler.removeCallbacksAndMessages(mMediaToken); - if (mMediaIsVisible && !nextVisible) { + if (mMediaIsVisible && !nextVisible && mStatusBarState != StatusBarState.SHADE) { // We need to delay this event for a few millis when stopping to avoid jank in the // animation. The media app might not send its update when buffering, and the slice // would end up without a header for 0.5 second. @@ -511,5 +516,14 @@ public class KeyguardSliceProvider extends SliceProvider implements @Override public void onStateChanged(int newState) { + final boolean notify; + synchronized (this) { + boolean needsMedia = needsMediaLocked(); + mStatusBarState = newState; + notify = needsMedia != needsMediaLocked(); + } + if (notify) { + notifyChange(); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java index 0fe5f8a6af5aba72f875afd3359b8e1c18ea4598..4cc5b2144adc451d8843bd8717bd6198a4a14476 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java @@ -15,7 +15,6 @@ package com.android.systemui.statusbar; import android.content.pm.UserInfo; -import android.service.notification.StatusBarNotification; import android.util.SparseArray; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -58,7 +57,7 @@ public interface NotificationLockscreenUserManager { boolean shouldHideNotifications(int userId); boolean shouldHideNotifications(String key); - boolean shouldShowOnKeyguard(StatusBarNotification sbn); + boolean shouldShowOnKeyguard(NotificationEntry entry); boolean isAnyProfilePublicMode(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java index 4ea1ed5b94515b2a413d615cdb529002247cd476..e08a5ae07bd89cc881a8a512a696c7a61bef82fb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java @@ -33,7 +33,6 @@ import android.os.ServiceManager; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; -import android.service.notification.StatusBarNotification; import android.util.Log; import android.util.SparseArray; import android.util.SparseBooleanArray; @@ -302,7 +301,7 @@ public class NotificationLockscreenUserManagerImpl implements Notification.VISIBILITY_SECRET; } - public boolean shouldShowOnKeyguard(StatusBarNotification sbn) { + public boolean shouldShowOnKeyguard(NotificationEntry entry) { if (getEntryManager() == null) { Log.wtf(TAG, "mEntryManager was null!", new Throwable()); return false; @@ -310,10 +309,10 @@ public class NotificationLockscreenUserManagerImpl implements boolean exceedsPriorityThreshold; if (NotificationUtils.useNewInterruptionModel(mContext) && hideSilentNotificationsOnLockscreen()) { - exceedsPriorityThreshold = getEntryManager().getNotificationData().isHighPriority(sbn); + exceedsPriorityThreshold = entry.isTopBucket(); } else { exceedsPriorityThreshold = - !getEntryManager().getNotificationData().isAmbient(sbn.getKey()); + !getEntryManager().getNotificationData().isAmbient(entry.key); } return mShowLockscreenNotifications && exceedsPriorityThreshold; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java index 404920187351c6e8990ed2201ecdd1802b9345c5..9c3ee96fe25bdf4329e37797037b44293a5d049c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java @@ -394,15 +394,13 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle int userId = entry.notification.getUserId(); boolean suppressedSummary = mGroupManager.isSummaryOfSuppressedGroup( entry.notification) && !entry.isRowRemoved(); - boolean showOnKeyguard = mLockscreenUserManager.shouldShowOnKeyguard(entry - .notification); + boolean showOnKeyguard = mLockscreenUserManager.shouldShowOnKeyguard(entry); if (!showOnKeyguard) { // min priority notifications should show if their summary is showing if (mGroupManager.isChildInGroupWithSummary(entry.notification)) { NotificationEntry summary = mGroupManager.getLogicalGroupSummary( entry.notification); - if (summary != null && mLockscreenUserManager.shouldShowOnKeyguard( - summary.notification)) { + if (summary != null && mLockscreenUserManager.shouldShowOnKeyguard(summary)) { showOnKeyguard = true; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java index 64b2f048ce2ef08a513e8fb17e649a25eb080e39..13f8f1a6a5488f4a3710f4a03a18515d78e1b9db 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java @@ -25,7 +25,6 @@ import android.service.notification.NotificationListenerService.RankingMap; import android.service.notification.SnoozeCriterion; import android.service.notification.StatusBarNotification; import android.util.ArrayMap; -import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Dependency; @@ -108,10 +107,19 @@ public class NotificationData { boolean bSystemMax = bImportance >= NotificationManager.IMPORTANCE_HIGH && isSystemNotification(nb); - boolean isHeadsUp = a.getRow().isHeadsUp(); - if (isHeadsUp != b.getRow().isHeadsUp()) { - return isHeadsUp ? -1 : 1; - } else if (isHeadsUp) { + + boolean aHeadsUp = a.getRow().isHeadsUp(); + boolean bHeadsUp = b.getRow().isHeadsUp(); + + // HACK: This should really go elsewhere, but it's currently not straightforward to + // extract the comparison code and we're guaranteed to touch every element, so this is + // the best place to set the buckets for the moment. + a.setIsTopBucket(aHeadsUp || aMedia || aSystemMax || a.isHighPriority()); + b.setIsTopBucket(bHeadsUp || bMedia || bSystemMax || b.isHighPriority()); + + if (aHeadsUp != bHeadsUp) { + return aHeadsUp ? -1 : 1; + } else if (aHeadsUp) { // Provide consistent ranking with headsUpManager return mHeadsUpManager.compare(a, b); } else if (a.getRow().showingAmbientPulsing() != b.getRow().showingAmbientPulsing()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index 92c261c4cad7c83959208678dc119653e48058d7..d157f06c03e961c827a5769a16e0b4db18ed1f11 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -173,6 +173,8 @@ public final class NotificationEntry { */ private boolean mHighPriority; + private boolean mIsTopBucket; + public NotificationEntry(StatusBarNotification n) { this(n, null); } @@ -220,6 +222,18 @@ public final class NotificationEntry { this.mHighPriority = highPriority; } + /** + * @return True if the notif should appear in the "top" or "important" section of notifications + * (as opposed to the "bottom" or "silent" section). This is usually the same as + * {@link #isHighPriority()}, but there are certain exceptions, such as media notifs. + */ + public boolean isTopBucket() { + return mIsTopBucket; + } + public void setIsTopBucket(boolean isTopBucket) { + mIsTopBucket = isTopBucket; + } + public boolean isBubble() { return (notification.getNotification().flags & FLAG_BUBBLE) != 0; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java index 20e8b733ce6ab73b45cbecb3133a097cbcb7d6e8..efa91972313298dbe1fdf25facaafddccb8f670f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java @@ -32,6 +32,7 @@ import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewStub; +import android.view.ViewTreeObserver; import android.widget.SeekBar; import android.widget.TextView; @@ -208,13 +209,18 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi private void startTimer() { clearTimer(); - mSeekBarTimer = new Timer(true /* isDaemon */); - mSeekBarTimer.schedule(new TimerTask() { + updateSeekBarView(); + } + + private void updateSeekBarView() { + mSeekBarView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){ @Override - public void run() { - mHandler.post(mOnUpdateTimerTick); + public boolean onPreDraw(){ + mSeekBarView.getViewTreeObserver().removeOnPreDrawListener(this); + mHandler.postDelayed(mOnUpdateTimerTick,PROGRESS_UPDATE_INTERVAL); + return true; } - }, 0, PROGRESS_UPDATE_INTERVAL); + }); } private void clearTimer() { @@ -261,7 +267,7 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi public void run() { if (mMediaController != null && mSeekBar != null) { PlaybackState playbackState = mMediaController.getPlaybackState(); - + updateSeekBarView(); if (playbackState != null) { updatePlaybackUi(playbackState); } else { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java index 170a4d5706887bc5a5ff7f89673ceead8947b11e..d119fb79e4c604d642cd05b5b4f88882ef17dc6f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java @@ -133,7 +133,7 @@ class NotificationSectionsManager implements StackScrollAlgorithm.SectionProvide if (child instanceof ExpandableNotificationRow && child.getVisibility() != View.GONE) { ExpandableNotificationRow row = (ExpandableNotificationRow) child; - if (!row.getEntry().isHighPriority()) { + if (!row.getEntry().isTopBucket()) { firstGentleNotifIndex = i; mFirstGentleNotif = row; break; @@ -248,7 +248,7 @@ class NotificationSectionsManager implements StackScrollAlgorithm.SectionProvide View child = mParent.getChildAt(i); if (child.getVisibility() != View.GONE && child instanceof ExpandableNotificationRow) { ExpandableNotificationRow row = (ExpandableNotificationRow) child; - if (!row.getEntry().isHighPriority()) { + if (!row.getEntry().isTopBucket()) { break; } else { lastChildBeforeGap = row; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 8fe34180203f34e065c8963aa3ac77eb18a9a2a5..09352cfd17a36ec7f5d752415ac81b6d8a17615d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -2516,12 +2516,20 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } return; } - int minTopPosition = 0; + int minTopPosition; NotificationSection lastSection = getLastVisibleSection(); if (mStatusBarState != StatusBarState.KEYGUARD) { minTopPosition = (int) (mTopPadding + mStackTranslation); } else if (lastSection == null) { minTopPosition = mTopPadding; + } else { + // The first sections could be empty while there could still be elements in later + // sections. The position of these first few sections is determined by the position of + // the first visible section. + NotificationSection firstVisibleSection = getFirstVisibleSection(); + firstVisibleSection.updateBounds(0 /* minTopPosition*/, 0 /* minBottomPosition */, + false /* shiftPulsingWithFirst */); + minTopPosition = firstVisibleSection.getBounds().top; } boolean shiftPulsingWithFirst = mAmbientPulseManager.getAllEntries().count() <= 1; for (NotificationSection section : mSections) { @@ -5768,7 +5776,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd currentIndex++; boolean beforeSpeedBump; if (mHighPriorityBeforeSpeedBump) { - beforeSpeedBump = row.getEntry().isHighPriority(); + beforeSpeedBump = row.getEntry().isTopBucket(); } else { beforeSpeedBump = !row.getEntry().ambient; } @@ -5826,9 +5834,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd case ROWS_ALL: return true; case ROWS_HIGH_PRIORITY: - return row.getEntry().isHighPriority(); + return row.getEntry().isTopBucket(); case ROWS_GENTLE: - return !row.getEntry().isHighPriority(); + return !row.getEntry().isTopBucket(); default: throw new IllegalArgumentException("Unknown selection: " + selection); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 4d4818d51414d73f6d699c3f02d4c87b366fe403..eccd70b4a59712207edec0d2e4f2c7b5a908914d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -132,6 +132,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { private BiometricSourceType mPendingAuthenticatedBioSourceType = null; private boolean mPendingShowBouncer; private boolean mHasScreenTurnedOnSinceAuthenticating; + private boolean mFadedAwayAfterWakeAndUnlock; private final TunerService.Tunable mFaceDismissedKeyguardTunable = new TunerService.Tunable() { @Override @@ -360,6 +361,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { @Override public void onStartedGoingToSleep(int why) { resetMode(); + mFadedAwayAfterWakeAndUnlock = false; mPendingAuthenticatedUserId = -1; mPendingAuthenticatedBioSourceType = null; } @@ -454,6 +456,9 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { } public void finishKeyguardFadingAway() { + if (isWakeAndUnlock()) { + mFadedAwayAfterWakeAndUnlock = true; + } resetMode(); } @@ -503,6 +508,14 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { || mMode == MODE_WAKE_AND_UNLOCK_FROM_DREAM; } + /** + * Successful authentication with fingerprint, face, or iris that wakes up the device. + * This will return {@code true} even after the keyguard fades away. + */ + public boolean unlockedByWakeAndUnlock() { + return isWakeAndUnlock() || mFadedAwayAfterWakeAndUnlock; + } + /** * Successful authentication with fingerprint, face, or iris when the screen was either * on or off. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java index 1d0d231424d1784f860bec4f9f3b3c6df170ed2a..595c1acaf56d3755b90e0d506f6018662ec70fc6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java @@ -301,12 +301,15 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, } public Region calculateTouchableRegion() { - if (!hasPinnedHeadsUp()) { + NotificationEntry topEntry = getTopEntry(); + // This call could be made in an inconsistent state while the pinnedMode hasn't been + // updated yet, but callbacks leading out of the headsUp manager, querying it. Let's + // therefore also check if the topEntry is null. + if (!hasPinnedHeadsUp() || topEntry == null) { mTouchableRegion.set(0, 0, mStatusBarWindowView.getWidth(), mStatusBarHeight); updateRegionForNotch(mTouchableRegion); } else { - NotificationEntry topEntry = getTopEntry(); if (topEntry.isChildInGroup()) { final NotificationEntry groupSummary = mGroupManager.getGroupSummary(topEntry.notification); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index a423adfd34b72af22a2bb11dbcc2adc3b2d573ba..bc205d67691461d9d286bfcdd690aa7bc806d1d3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -734,8 +734,7 @@ public class NotificationPanelView extends PanelView implements if (suppressedSummary) { continue; } - if (!mLockscreenUserManager.shouldShowOnKeyguard( - row.getStatusBarNotification())) { + if (!mLockscreenUserManager.shouldShowOnKeyguard(row.getEntry())) { continue; } if (row.isRemoved()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index aeef1e2db07e361353123f4e644f74650a831844..299ce7ab26da53ed52387147f2eafb7571bbc4c1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1213,6 +1213,7 @@ public class StatusBar extends SystemUI implements DemoMode, mDozeScrimController, keyguardViewMediator, mScrimController, this, UnlockMethodCache.getInstance(mContext), new Handler(), mKeyguardUpdateMonitor, Dependency.get(TunerService.class)); + putComponent(BiometricUnlockController.class, mBiometricUnlockController); mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this, getBouncerContainer(), mNotificationPanel, mBiometricUnlockController, mStatusBarWindow.findViewById(R.id.lock_icon_container)); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FiveGServiceClient.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FiveGServiceClient.java index b061277b83d466ee8bb12d1a45c62d4a1a3c02b1..74168cc08c26d19ded2ca356a558174f949daaba 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FiveGServiceClient.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FiveGServiceClient.java @@ -29,6 +29,12 @@ package com.android.systemui.statusbar.policy; +import static android.telephony.CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; +import static android.telephony.CellSignalStrength.SIGNAL_STRENGTH_POOR; +import static android.telephony.CellSignalStrength.SIGNAL_STRENGTH_MODERATE; +import static android.telephony.CellSignalStrength.SIGNAL_STRENGTH_GOOD; +import static android.telephony.CellSignalStrength.SIGNAL_STRENGTH_GREAT; + import android.content.ComponentName; import android.content.Context; import android.content.ServiceConnection; @@ -39,6 +45,7 @@ import android.os.Message; import android.os.DeadObjectException; import android.os.RemoteException; import android.provider.Settings; +import android.telephony.CellInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.Log; @@ -76,8 +83,13 @@ public class FiveGServiceClient { private static final int MAX_RETRY = 4; private static final int DELAY_MILLISECOND = 3000; private static final int DELAY_INCREMENT = 2000; - private final int mRsrpThresholds[]; - private final int mSnrThresholds[]; + + /** + * These threshold values are copied from CellSignalStrengthNr. + */ + private static final int SIGNAL_GREAT_THRESHOLD = -95; + private static final int SIGNAL_GOOD_THRESHOLD = -105; + private static final int SIGNAL_MODERATE_THRESHOLD = -115; private static FiveGServiceClient sInstance; private final ArrayList> @@ -160,11 +172,6 @@ public class FiveGServiceClient { public FiveGServiceClient(Context context) { mContext = context; mPackageName = mContext.getPackageName(); - - mRsrpThresholds = - mContext.getResources().getIntArray(R.array.config_5g_signal_rsrp_thresholds); - mSnrThresholds = - mContext.getResources().getIntArray(R.array.config_5g_signal_snr_thresholds); } public static FiveGServiceClient getInstance(Context context) { @@ -208,10 +215,6 @@ public class FiveGServiceClient { } } - public static int getNumLevels(Context context) { - return context.getResources().getInteger(R.integer.config_5g_num_signal_strength_bins); - } - public boolean isServiceConnected() { return mServiceConnected; } @@ -235,33 +238,6 @@ public class FiveGServiceClient { return state; } - private int getSnrLevel(int snr) { - return getLevel(snr, mSnrThresholds); - } - - private int getRsrpLevel(int rsrp) { - return getLevel(rsrp, mRsrpThresholds); - } - - private static int getLevel(int value, int[]thresholds) { - int level = 0; - if ( thresholds[thresholds.length-1] < value || value < thresholds[0] ) { - level = 0; - } else{ - level = 1; - for( int i=0; i < thresholds.length-1; ++i ) { - if (thresholds[i] < value && value <= thresholds[i+1]) { - level = i+1; - break; - } - } - } - if ( DEBUG ) { - Log.d(TAG, "value=" + value + " level=" + level); - } - return level; - } - private void notifyListenersIfNecessary(int phoneId) { FiveGServiceState currentState = getCurrentServiceState(phoneId); FiveGServiceState lastState = getLastServiceState(phoneId); @@ -297,10 +273,9 @@ public class FiveGServiceClient { if ( mNetworkService != null && mClient != null) { Log.d(TAG, "query 5G service state for phoneId " + phoneId); try { - Token token = mNetworkService.queryNrSignalStrength(phoneId, mClient); - Log.d(TAG, "queryNrSignalStrength result:" + token); + queryNrSignalStrength(phoneId); - token = mNetworkService.query5gConfigInfo(phoneId, mClient); + Token token = mNetworkService.query5gConfigInfo(phoneId, mClient); Log.d(TAG, "query5gConfigInfo result:" + token); token = mNetworkService.queryNrIconType(phoneId, mClient); @@ -343,6 +318,20 @@ public class FiveGServiceClient { state.mIconGroup = getNrIconGroup(state.mNrIconType, phoneId); } + private void updateLevel(int ssRsrp, FiveGServiceState state) { + if (ssRsrp == CellInfo.UNAVAILABLE) { + state.mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + } else if (ssRsrp >= SIGNAL_GREAT_THRESHOLD) { + state.mLevel = SIGNAL_STRENGTH_GREAT; + } else if (ssRsrp >= SIGNAL_GOOD_THRESHOLD) { + state.mLevel = SIGNAL_STRENGTH_GOOD; + } else if (ssRsrp >= SIGNAL_MODERATE_THRESHOLD) { + state.mLevel = SIGNAL_STRENGTH_MODERATE; + } else { + state.mLevel = SIGNAL_STRENGTH_POOR; + } + } + private MobileIconGroup getNrIconGroup(int nrIconType , int phoneId) { MobileIconGroup iconGroup = TelephonyIcons.UNKNOWN; switch (nrIconType){ @@ -440,7 +429,7 @@ public class FiveGServiceClient { if (status.get() == Status.SUCCESS && signalStrength != null) { FiveGServiceState state = getCurrentServiceState(slotId); - state.mLevel = getRsrpLevel(signalStrength.getRsrp()); + updateLevel(signalStrength.getRsrp(), state); notifyListenersIfNecessary(slotId); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 957f816bd5f73523386e15242a6a01b920978270..e76e15c797957d5e41d20305b08cce6a0ee2ae25 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -99,14 +99,13 @@ public class MobileSignalController extends SignalController< private int mCallState = TelephonyManager.CALL_STATE_IDLE; - /****************************5G****************************/ + /****************************SideCar****************************/ @VisibleForTesting FiveGStateListener mFiveGStateListener; @VisibleForTesting FiveGServiceState mFiveGState; private FiveGServiceClient mClient; private CellSignalStrengthNr mCellSignalStrengthNr; - private final int NUM_LEVELS_ON_5G; /**********************************************************/ private ImsManager mImsManager; @@ -144,8 +143,6 @@ public class MobileSignalController extends SignalController< // Get initial data sim state. updateDataSim(); - NUM_LEVELS_ON_5G = FiveGServiceClient.getNumLevels(mContext); - int phoneId = mSubscriptionInfo.getSimSlotIndex(); mImsManagerConnector = new ImsManager.Connector(mContext, phoneId, new ImsManager.Connector.Listener() { @@ -346,18 +343,6 @@ public class MobileSignalController extends SignalController< } } - public int getAlertSignalStrengthIconId() { - int level = mFiveGState.getSignalLevel(); - if (mConfig.inflateSignalStrengths) { - level++; - } - boolean dataDisabled = mCurrentState.userSetup - && mCurrentState.iconGroup == TelephonyIcons.DATA_DISABLED; - boolean noInternet = mCurrentState.inetCondition == 0; - boolean cutOut = dataDisabled || noInternet; - return SignalDrawable.getState(level, NUM_LEVELS_ON_5G , cutOut); - } - @Override public int getQsCurrentIconId() { return getCurrentIconId(); @@ -447,11 +432,8 @@ public class MobileSignalController extends SignalController< // Show icon in QS when we are connected or data is disabled. boolean showDataIcon = mCurrentState.dataConnected || dataDisabled; - boolean showAlertSignalStrength = - mDataNetType == TelephonyManager.NETWORK_TYPE_NR && !isCellSignalStrengthNrValid(); IconState statusIcon = new IconState(mCurrentState.enabled && !mCurrentState.airplaneMode, - showAlertSignalStrength ? getAlertSignalStrengthIconId() : getCurrentIconId(), - contentDescription); + getCurrentIconId(), contentDescription); int qsTypeIcon = 0; IconState qsIcon = null; @@ -680,14 +662,28 @@ public class MobileSignalController extends SignalController< if ( mDataNetType == TelephonyManager.NETWORK_TYPE_NR ) { if (mFiveGState.isNrIconTypeValid()) { mCurrentState.iconGroup = mFiveGState.getIconGroup(); + if (DEBUG) { + Log.d(mTag,"get 5G SA icon from side-car"); + } } - - if ( isCellSignalStrengthNrValid() ) { - mCurrentState.level = mCellSignalStrengthNr.getLevel(); + int nrLevel = getNrLevel(); + if (nrLevel > mFiveGState.getSignalLevel()) { + mCurrentState.level = nrLevel; + if (DEBUG) { + Log.d(mTag,"get 5G SA sinal strength from AOSP"); + } + }else{ + mCurrentState.level = mFiveGState.getSignalLevel(); + if (DEBUG) { + Log.d(mTag,"get 5G SA sinal strength from side-car"); + } } - }else if ( isAlertNsaValid() ) { + }else if ( nr5GIconGroup == null && isSideCarNsaValid() ) { mCurrentState.iconGroup = mFiveGState.getIconGroup(); + if (DEBUG) { + Log.d(mTag,"get 5G NSA icon from side-car"); + } } mCurrentState.dataConnected = mCurrentState.connected @@ -866,7 +862,7 @@ public class MobileSignalController extends SignalController< return registered; } - private boolean isAlertNsaValid() { + private boolean isSideCarNsaValid() { return mFiveGState.isNrIconTypeValid() && isDataRegisteredOnLte(); } @@ -874,6 +870,10 @@ public class MobileSignalController extends SignalController< return ( mCellSignalStrengthNr != null && mCellSignalStrengthNr.isValid()); } + private int getNrLevel() { + return mCellSignalStrengthNr != null ? mCellSignalStrengthNr.getLevel() : 0; + } + @Override public void dump(PrintWriter pw) { super.dump(pw); 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 4b5e739ee62af9ab3f757c6d72a0dfac8e0c98ca..eb151a290ddf4f81cc41b63f1ebee7ccda30294d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -1125,7 +1125,6 @@ public class NetworkControllerImpl extends BroadcastReceiver boolean alwaysShowDataRatIcon = false; public String patternOfCarrierSpecificDataIcon = ""; - boolean readIconsFromXml; boolean showRsrpSignalLevelforLTE = false; boolean hideNoInternetState = false; boolean showVolteIcon = false; @@ -1186,10 +1185,6 @@ public class NetworkControllerImpl extends BroadcastReceiver } } } - config.readIconsFromXml = res.getBoolean(R.bool.config_read_icons_from_xml); - config.showRsrpSignalLevelforLTE = - res.getBoolean(R.bool.config_showRsrpSignalLevelforLTE); - config.showVolteIcon = res.getBoolean(R.bool.config_display_volte); return config; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java index d5cd2d07a0b569b073adef5c10c882c33064c909..fc5c40586157ac667411dd9f5d4b2e7e1939d7a0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java @@ -16,14 +16,6 @@ package com.android.systemui.statusbar.policy; -import android.content.Context; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.telephony.SignalStrength; -import android.telephony.TelephonyManager; -import android.util.Log; -import android.util.SparseArray; - import com.android.systemui.R; import com.android.systemui.statusbar.policy.MobileSignalController.MobileIconGroup; @@ -31,19 +23,6 @@ import java.util.HashMap; import java.util.Map; class TelephonyIcons { - //Default roaming icons with R indicator - static final int[][] TELEPHONY_SIGNAL_STRENGTH_ROAMING_R = { - { R.drawable.stat_sys_signal_0_default_roam, - R.drawable.stat_sys_signal_1_default_roam, - R.drawable.stat_sys_signal_2_default_roam, - R.drawable.stat_sys_signal_3_default_roam, - R.drawable.stat_sys_signal_4_default_roam }, - { R.drawable.stat_sys_signal_0_default_fully_roam, - R.drawable.stat_sys_signal_1_default_fully_roam, - R.drawable.stat_sys_signal_2_default_fully_roam, - R.drawable.stat_sys_signal_3_default_fully_roam, - R.drawable.stat_sys_signal_4_default_fully_roam } - }; //***** Data connection icons static final int FLIGHT_MODE_ICON = R.drawable.stat_sys_airplane_mode; @@ -351,408 +330,6 @@ class TelephonyIcons { TelephonyIcons.ICON_5G_SA, false); - static final int DATA_TYPE_UNKNOWN = 0; - static final int DATA_TYPE_G = 1; - static final int DATA_TYPE_E = 2; - static final int DATA_TYPE_2G = 3; - static final int DATA_TYPE_3G = 4; - static final int DATA_TYPE_4G = 5; - static final int DATA_TYPE_H = 6; - static final int DATA_TYPE_HP = 7; - static final int DATA_TYPE_1X = 8; - static final int DATA_TYPE_LTE = 9; - static final int DATA_TYPE_4G_PLUS = 10; - - static final int SIGNAL_STRENGTH_TYPE_G = 0; - static final int SIGNAL_STRENGTH_TYPE_E = 1; - static final int SIGNAL_STRENGTH_TYPE_3G = 2; - static final int SIGNAL_STRENGTH_TYPE_4G = 3; - static final int SIGNAL_STRENGTH_TYPE_H = 4; - static final int SIGNAL_STRENGTH_TYPE_HP = 5; - static final int SIGNAL_STRENGTH_TYPE_1X = 6; - static final int SIGNAL_STRENGTH_TYPE_CDMA = 7; - static final int SIGNAL_STRENGTH_TYPE_UMTS = 8; - static final int SIGNAL_STRENGTH_TYPE_4G_PLUS = 9; - - static final int DEFAULT_SUB = 0; - static final int INET_TYPE_NUM = 2; - static final int SIGNAL_LEVEL_NUM = SignalStrength.NUM_SIGNAL_STRENGTH_BINS; - static final String TAG = "TelephonyIcons"; - static final String NS = "com.android.systemui"; - static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);; - - static String[] mDataTypeArray, mDataTypeGenerationArray; - static String[] mDataTypeDescriptionArray, mDataTypeGenerationDescArray; - static String[] mDataActivityArray; - static String[] mSignalStrengthArray, mSignalStrengthRoamingArray; - static String[] mSignalNullArray; - static String[] mSignalStrengthDesc; - - static int[] mSelectedDataTypeIcon; - static int[] mSelectedQSDataTypeIcon; - static String[] mSelectedDataTypeDesc; - static int[] mSelectedDataActivityIndex; - static int[] mSelectedSignalStreagthIndex; - static SparseArray mStacked2SingleIconLookup; - - private static Resources mRes; - private static boolean isInitiated = false; - - static void readIconsFromXml(Context context) { - if (isInitiated) { - log(TAG, "readIconsFromXml, already read!"); - return; - } - - mRes = context.getResources(); - try { - mDataTypeArray = mRes.getStringArray(R.array.multi_data_type); - mDataTypeDescriptionArray = mRes.getStringArray( - R.array.telephony_data_type_description); - mDataTypeGenerationArray = mRes.getStringArray( - R.array.telephony_data_type_generation); - mDataTypeGenerationDescArray = mRes.getStringArray( - R.array.telephony_data_type_generation_description); - mDataActivityArray = mRes.getStringArray(R.array.multi_data_activity); - mSignalStrengthArray = mRes.getStringArray(R.array.multi_signal_strength); - mSignalStrengthRoamingArray = mRes.getStringArray( - R.array.multi_signal_strength_roaming); - mSignalNullArray = mRes.getStringArray(R.array.multi_signal_null); - mSignalStrengthDesc = mRes.getStringArray(R.array.signal_strength_description); - initStacked2SingleIconLookup(); - } catch (android.content.res.Resources.NotFoundException e) { - isInitiated = false; - log(TAG, "readIconsFromXml, exception happened: " + e); - return; - } - - if (mSelectedDataTypeIcon == null - && mDataTypeArray.length != 0) { - mSelectedDataTypeIcon = new int[mDataTypeArray.length]; - } - if (mSelectedQSDataTypeIcon == null - && mDataTypeArray.length != 0) { - mSelectedQSDataTypeIcon = new int[mDataTypeArray.length]; - } - if (mSelectedDataTypeDesc == null - && mDataTypeArray.length != 0) { - mSelectedDataTypeDesc = new String[mDataTypeArray.length]; - } - if (mSelectedDataActivityIndex == null - && mDataActivityArray.length != 0) { - mSelectedDataActivityIndex = new int[mDataActivityArray.length]; - } - if (mSelectedSignalStreagthIndex == null - && mSignalStrengthArray.length != 0) { - mSelectedSignalStreagthIndex = new int[mSignalStrengthArray.length]; - } - isInitiated = true; - } - - static void initStacked2SingleIconLookup() { - mStacked2SingleIconLookup = new SparseArray<>(); - TypedArray stackedIcons = mRes.obtainTypedArray(R.array.stacked_signal_icons); - TypedArray singleIcons = mRes.obtainTypedArray(R.array.single_signal_icons); - - mStacked2SingleIconLookup.clear(); - for (int i = 0; i < stackedIcons.length() && i < singleIcons.length(); i++) { - mStacked2SingleIconLookup.put(stackedIcons.getResourceId(i,0), - singleIcons.getResourceId(i,0)); - } - stackedIcons.recycle(); - singleIcons.recycle(); - log(TAG, "initStacked2SingleIconLookup: size=" + mStacked2SingleIconLookup.size()); - } - - static int getSignalNullIcon(int slot) { - if (mSignalNullArray == null) { - return 0; - } - String resName = mSignalNullArray[slot]; - log(TAG, "null signal icon name: " + resName); - int resId = mRes.getIdentifier(resName, null, NS); - return resId; - } - - static void updateDataType(int slot, int type, boolean showAtLeast3G, - boolean show4GforLte, boolean hspaDistinguishable, int inet) { - log(TAG, "updateDataType " - + String.format("slot=%d, type=%d, inetCondition=%d", - slot, type, inet) - + " showAtLeast3G=" + String.valueOf(showAtLeast3G) - + " show4GforLte=" + String.valueOf(show4GforLte) - + " hspaDistinguishable=" + String.valueOf(hspaDistinguishable)); - - String resName = mDataTypeArray[slot]; - int resId = mRes.getIdentifier(resName, null, NS); - String[] dataTypeArray = mRes.getStringArray(resId); - - log(TAG, "data type item name: " + resName + " id:" + resId); - - switch (type) { - case TelephonyManager.NETWORK_TYPE_UNKNOWN: - if (!showAtLeast3G) { - mSelectedDataTypeIcon[slot] = mRes.getIdentifier( - dataTypeArray[type], null, NS); - mSelectedQSDataTypeIcon[slot] = 0; - mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; - mSelectedDataActivityIndex[slot] = 0; - mSelectedSignalStreagthIndex[slot] = 0; - break; - } else { - // fall through - } - case TelephonyManager.NETWORK_TYPE_EDGE: - if (!showAtLeast3G) { - mSelectedDataTypeIcon[slot] = mRes.getIdentifier( - dataTypeArray[type], null, NS); - mSelectedQSDataTypeIcon[slot] = ICON_E; - mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; - mSelectedDataActivityIndex[slot] = DATA_TYPE_E; - mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_E; - break; - } else { - // fall through - } - case TelephonyManager.NETWORK_TYPE_UMTS: - case TelephonyManager.NETWORK_TYPE_TD_SCDMA: - mSelectedDataActivityIndex[slot] = DATA_TYPE_3G; - mSelectedDataTypeIcon[slot] = mRes.getIdentifier( - dataTypeArray[type], null, NS); - mSelectedQSDataTypeIcon[slot] = ICON_3G; - mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; - mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_UMTS; - break; - case TelephonyManager.NETWORK_TYPE_HSDPA: - case TelephonyManager.NETWORK_TYPE_HSUPA: - case TelephonyManager.NETWORK_TYPE_HSPA: - if (hspaDistinguishable) { - mSelectedDataActivityIndex[slot] = DATA_TYPE_H; - mSelectedDataTypeIcon[slot] = mRes.getIdentifier( - dataTypeArray[type], null, NS); - mSelectedQSDataTypeIcon[slot] = ICON_H; - mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; - mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_H; - } else { - mSelectedDataActivityIndex[slot] = DATA_TYPE_3G; - mSelectedDataTypeIcon[slot] = mRes.getIdentifier( - mDataTypeGenerationArray[0], null, NS); - mSelectedQSDataTypeIcon[slot] = ICON_3G; - mSelectedDataTypeDesc[slot] = mDataTypeGenerationDescArray[0]; - mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_3G; - } - break; - case TelephonyManager.NETWORK_TYPE_HSPAP: - if (hspaDistinguishable) { - mSelectedDataActivityIndex[slot] = DATA_TYPE_HP; - mSelectedDataTypeIcon[slot] = mRes.getIdentifier( - dataTypeArray[type], null, NS); - mSelectedQSDataTypeIcon[slot] = ICON_H; - mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; - mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_HP; - } else { - mSelectedDataActivityIndex[slot] = DATA_TYPE_3G; - mSelectedDataTypeIcon[slot] = mRes.getIdentifier( - mDataTypeGenerationArray[0], null, NS); - mSelectedQSDataTypeIcon[slot] = ICON_3G; - mSelectedDataTypeDesc[slot] = mDataTypeGenerationDescArray[0]; - mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_3G; - } - break; - case TelephonyManager.NETWORK_TYPE_CDMA: - if (!showAtLeast3G) { - mSelectedDataActivityIndex[slot] = DATA_TYPE_1X; - mSelectedDataTypeIcon[slot] = mRes.getIdentifier( - dataTypeArray[type], null, NS); - mSelectedQSDataTypeIcon[slot] = ICON_1X; - mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; - mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_CDMA; - break; - } else { - // fall through - } - case TelephonyManager.NETWORK_TYPE_1xRTT: - if (!showAtLeast3G) { - mSelectedDataActivityIndex[slot] = DATA_TYPE_1X; - mSelectedDataTypeIcon[slot] = mRes.getIdentifier( - dataTypeArray[type], null, NS); - mSelectedQSDataTypeIcon[slot] = ICON_1X; - mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; - mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_1X; - break; - } else { - // fall through - } - case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through - case TelephonyManager.NETWORK_TYPE_EVDO_A: - case TelephonyManager.NETWORK_TYPE_EVDO_B: - case TelephonyManager.NETWORK_TYPE_EHRPD: - mSelectedDataActivityIndex[slot] = DATA_TYPE_3G; - mSelectedDataTypeIcon[slot] = mRes.getIdentifier( - dataTypeArray[type], null, NS); - mSelectedQSDataTypeIcon[slot] = ICON_3G; - mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; - mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_3G; - break; - case TelephonyManager.NETWORK_TYPE_LTE: - case TelephonyManager.NETWORK_TYPE_LTE_CA: - if (show4GforLte) { - mSelectedDataActivityIndex[slot] = DATA_TYPE_4G; - mSelectedDataTypeIcon[slot] = mRes.getIdentifier( - mDataTypeGenerationArray[1], null, NS); - mSelectedQSDataTypeIcon[slot] = ICON_4G; - mSelectedDataTypeDesc[slot] = mDataTypeGenerationDescArray[1]; - mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_4G; - - if ( type == TelephonyManager.NETWORK_TYPE_LTE_CA) { - //Select 4G+ icon. - mSelectedDataTypeIcon[slot] = mRes.getIdentifier( - mDataTypeGenerationArray[2], null, NS); - mSelectedQSDataTypeIcon[slot] = ICON_4G_PLUS; - mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_4G_PLUS; - mSelectedDataActivityIndex[slot] = DATA_TYPE_4G_PLUS; - } - } else { - mSelectedDataActivityIndex[slot] = DATA_TYPE_LTE; - mSelectedDataTypeIcon[slot] = mRes.getIdentifier( - dataTypeArray[type], null, NS); - mSelectedQSDataTypeIcon[slot] = ICON_LTE; - mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; - mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_4G; - } - break; - case TelephonyManager.NETWORK_TYPE_GPRS: - case TelephonyManager.NETWORK_TYPE_GSM: - if (!showAtLeast3G) { - mSelectedDataActivityIndex[slot] = DATA_TYPE_G; - mSelectedDataTypeIcon[slot] = mRes.getIdentifier( - dataTypeArray[type], null, NS); - mSelectedQSDataTypeIcon[slot] = ICON_G; - mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; - mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_G; - } else { - mSelectedDataActivityIndex[slot] = DATA_TYPE_3G; - mSelectedDataTypeIcon[slot] = mRes.getIdentifier( - mDataTypeGenerationArray[0], null, NS); - mSelectedQSDataTypeIcon[slot] = ICON_3G; - mSelectedDataTypeDesc[slot] = mDataTypeGenerationDescArray[0];; - mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_3G; - } - break; - default: - mSelectedDataActivityIndex[slot] = DATA_TYPE_UNKNOWN; - mSelectedDataTypeIcon[slot] = 0; - mSelectedQSDataTypeIcon[slot] = 0; - mSelectedDataTypeDesc[slot] = ""; - mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_G; - break; - } - log(TAG, "updateDataType " + String.format( - "mSelectedDataTypeIcon[%d]=%d, mSelectedDataActivityIndex=%d", - slot, mSelectedDataTypeIcon[slot], mSelectedDataActivityIndex[slot])); - } - - - static int getQSDataTypeIcon(int slot) { - return mSelectedQSDataTypeIcon[slot]; - } - - static int getDataTypeIcon(int slot) { - log(TAG, "getDataTypeIcon " + String.format("sub=%d", slot)); - return mSelectedDataTypeIcon[slot]; - } - - static int getDataTypeDesc(int slot) { - return mRes.getIdentifier(mSelectedDataTypeDesc[slot], null, NS); - } - - static int getDataActivity(int slot, int activity) { - log(TAG, String.format("getDataActivity, slot=%d, activity=%d", - slot, activity)); - - String[] dataActivityArray = mRes.getStringArray( - mRes.getIdentifier(mDataActivityArray[slot], null, NS)); - String[] selectedTypeArray = mRes.getStringArray(mRes.getIdentifier( - dataActivityArray[mSelectedDataActivityIndex[slot]], null, NS)); - - return mRes.getIdentifier(selectedTypeArray[activity], null, NS); - } - - static int getSignalStrengthIcon(int slot, int inet, int level, boolean roaming) { - log(TAG, "getSignalStrengthIcon: " + String.format( - "slot=%d, inetCondition=%d, level=%d, roaming=%b", slot, inet, level, roaming)); - - String[] signalStrengthArray, selectedTypeArray; - - signalStrengthArray = mRes.getStringArray(mRes.getIdentifier(!roaming ? - mSignalStrengthArray[slot] : mSignalStrengthRoamingArray[slot], null, NS)); - log(TAG, String.format("signalStrengthArray.length=%d", signalStrengthArray.length)); - - selectedTypeArray = mRes.getStringArray(mRes.getIdentifier( - signalStrengthArray[mSelectedSignalStreagthIndex[slot]], null, NS)); - log(TAG, String.format("selectedTypeArray.length=%d", selectedTypeArray.length)); - - String[] inetArray = mRes.getStringArray( - mRes.getIdentifier(selectedTypeArray[inet], null, NS)); - log(TAG, String.format("inetArray.length=%d", inetArray.length)); - - return mRes.getIdentifier(inetArray[level], null, NS); - } - - - static int convertMobileStrengthIcon(int stackedIcon) { - if (mStacked2SingleIconLookup == null) { - return stackedIcon; - } - int index = mStacked2SingleIconLookup.indexOfKey(stackedIcon); - if (index >= 0) { - return mStacked2SingleIconLookup.get(stackedIcon); - } - return stackedIcon; - } - - static int getStackedVoiceIcon(int level) { - int retValue = 0; - switch(level){ - case SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN: - retValue = R.drawable.stat_sys_signal_0_2g; - break; - case SignalStrength.SIGNAL_STRENGTH_POOR: - retValue = R.drawable.stat_sys_signal_1_2g; - break; - case SignalStrength.SIGNAL_STRENGTH_MODERATE: - retValue = R.drawable.stat_sys_signal_2_2g; - break; - case SignalStrength.SIGNAL_STRENGTH_GOOD: - retValue = R.drawable.stat_sys_signal_3_2g; - break; - case SignalStrength.SIGNAL_STRENGTH_GREAT: - retValue = R.drawable.stat_sys_signal_4_2g; - break; - default: - break; - } - return retValue; - } - - static int getRoamingSignalIconId(int level, int inet){ - return TELEPHONY_SIGNAL_STRENGTH_ROAMING_R[inet][level]; - } - - static int[] getSignalStrengthDes(int slot) { - int[] resId = new int[SIGNAL_LEVEL_NUM]; - for (int i = 0; i < SIGNAL_LEVEL_NUM; i++) { - resId[i] = mRes.getIdentifier(mSignalStrengthDesc[i], null, NS); - } - return resId; - } - - private static void log(String tag, String str){ - if (DEBUG) { - Log.d(tag, str); - } - } - /** Mapping icon name(lower case) to the icon object. */ static final Map ICON_NAME_TO_ICON; static { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java index ea4534d35ea0f329b05d859d98440c4d2b096d1a..837112ff8da098ef5411af2272546c6341e5a97b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java @@ -124,10 +124,8 @@ public class WifiSignalController extends @Override public void notifyListeners(SignalCallback callback) { // only show wifi in the cluster if connected or if wifi-only - boolean visibleWhenEnabled = mContext.getResources().getBoolean( - R.bool.config_showWifiIndicatorWhenEnabled); boolean wifiVisible = mCurrentState.enabled - && (mCurrentState.connected || !mHasMobileData || visibleWhenEnabled); + && (mCurrentState.connected || !mHasMobileData); String wifiDesc = wifiVisible ? mCurrentState.ssid : null; boolean ssidPresent = wifiVisible && mCurrentState.ssid != null; String contentDescription = getStringIfExists(getContentDescription()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java index 329ef1c19a2bcb3da87c1f69d7a46946d23426d7..7ea6493da83da6295265b4ac267d00301c63573e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java @@ -56,6 +56,9 @@ public class FalsingManagerProxyTest extends SysuiTestCase { mHandler = new Handler(mTestableLooper.getLooper()); mDefaultConfigValue = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI, BRIGHTLINE_FALSING_MANAGER_ENABLED, false); + // In case it runs on a device where it's been set to true, set it to false by hand. + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_MANAGER_ENABLED, "false", false); } @After diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java index 87ae85f6d3028db0f4fe746eb2d66d2a19f137d8..f07edf331f13c28d2f00c1a0ddf743396ac60ea1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java @@ -18,6 +18,7 @@ package com.android.systemui.doze; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -29,6 +30,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; +import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.DozeParameters; import org.junit.Before; @@ -44,12 +46,14 @@ public class DozeWallpaperStateTest extends SysuiTestCase { private DozeWallpaperState mDozeWallpaperState; @Mock IWallpaperManager mIWallpaperManager; + @Mock BiometricUnlockController mBiometricUnlockController; @Mock DozeParameters mDozeParameters; @Before public void setUp() { MockitoAnnotations.initMocks(this); - mDozeWallpaperState = new DozeWallpaperState(mIWallpaperManager, mDozeParameters); + mDozeWallpaperState = new DozeWallpaperState(mIWallpaperManager, mBiometricUnlockController, + mDozeParameters); } @Test @@ -101,6 +105,20 @@ public class DozeWallpaperStateTest extends SysuiTestCase { verify(mIWallpaperManager).setInAmbientMode(eq(false), eq(0L)); } + @Test + public void testDoesNotAnimate_whenWakeAndUnlock() throws RemoteException { + // Pre-conditions + when(mDozeParameters.getAlwaysOn()).thenReturn(true); + when(mBiometricUnlockController.unlockedByWakeAndUnlock()).thenReturn(true); + + mDozeWallpaperState.transitionTo(DozeMachine.State.UNINITIALIZED, + DozeMachine.State.DOZE_AOD); + clearInvocations(mIWallpaperManager); + + mDozeWallpaperState.transitionTo(DozeMachine.State.DOZE_AOD, DozeMachine.State.FINISH); + verify(mIWallpaperManager).setInAmbientMode(eq(false), eq(0L)); + } + @Test public void testTransitionTo_requestPulseIsAmbientMode() throws RemoteException { mDozeWallpaperState.transitionTo(DozeMachine.State.DOZE, diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java index 44191147f91425732fb3d37ff95033e04a62d1fd..a83c4b653ce775bb3b959226eaf473ba6fa782a8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java @@ -48,6 +48,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationMediaManager; +import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.util.wakelock.SettableWakeLock; @@ -177,6 +178,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Test public void onMetadataChanged_updatesSlice() { + mProvider.onStateChanged(StatusBarState.KEYGUARD); mProvider.onDozingChanged(true); reset(mContentResolver); mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING); @@ -190,6 +192,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Test public void onDozingChanged_updatesSliceIfMedia() { + mProvider.onStateChanged(StatusBarState.KEYGUARD); mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING); reset(mContentResolver); // Show media when dozing diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java index 49a263a8d781f0baa64714feca89f3365123041d..57dd8c94c79002010b788146953cf49566e01c67 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java @@ -38,7 +38,6 @@ import android.os.Handler; import android.os.Looper; import android.os.UserManager; import android.provider.Settings; -import android.service.notification.StatusBarNotification; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -48,6 +47,7 @@ import com.android.systemui.Dependency; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.collection.NotificationData; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.policy.DeviceProvisionedController; @@ -166,7 +166,7 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, 1); when(mNotificationData.isHighPriority(any())).thenReturn(false); - assertTrue(mLockscreenUserManager.shouldShowOnKeyguard(mock(StatusBarNotification.class))); + assertTrue(mLockscreenUserManager.shouldShowOnKeyguard(mock(NotificationEntry.class))); } @Test @@ -179,7 +179,7 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, 0); when(mNotificationData.isHighPriority(any())).thenReturn(false); - assertFalse(mLockscreenUserManager.shouldShowOnKeyguard(mock(StatusBarNotification.class))); + assertFalse(mLockscreenUserManager.shouldShowOnKeyguard(mock(NotificationEntry.class))); } private class TestNotificationLockscreenUserManager diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java index 73abda9a5da7a8773890c6bf23a547d803bb6508..59d0f912d38efab24e791ebeb7832169e3504a00 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java @@ -263,6 +263,8 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { when(notifRow.getVisibility()).thenReturn(View.VISIBLE); when(notifRow.getEntry().isHighPriority()) .thenReturn(children[i] == ChildType.HIPRI); + when(notifRow.getEntry().isTopBucket()) + .thenReturn(children[i] == ChildType.HIPRI); when(notifRow.getParent()).thenReturn(mNssl); child = notifRow; break; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 3c0d2603441473bc9bd995ed820a43c76642883c..52a2296b75a8b8b027fb7a9663f01a3220ce8615 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -5238,7 +5238,10 @@ public class ActivityManagerService extends IActivityManager.Stub (app.hostingRecord.getName() != null ? app.hostingRecord.getName() : "")); //send start notification to AT with the starting app's info. - mActivityTrigger.activityStartTrigger(app.info, app.pid); + String hRecordType = app.hostingRecord.getType(); + if(hRecordType != null && hRecordType.equals("activity")){ + mActivityTrigger.activityStartTrigger(app.info, app.pid); + } return true; } diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java index c7493df52053d91c17459812460923116615f91b..293b11952a3e8d56d71ba49ab1180db97dd270ed 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -301,13 +301,13 @@ public final class AudioDeviceInventory { if (event == BtHelper.EVENT_ACTIVE_DEVICE_CHANGE) { // Device is connected if (a2dpVolume != -1) { - Log.e(TAG, "Unmuting the stream before setting device Volume."); - mDeviceBroker.postAccessoryPlugMediaUnmute(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP); mDeviceBroker.postSetVolumeIndexOnDevice(AudioSystem.STREAM_MUSIC, // convert index to internal representation in VolumeStreamState a2dpVolume * 10, AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, "onBluetoothA2dpActiveDeviceChange"); + Log.i(TAG, "Unmuting the stream after setting device Volume."); + mDeviceBroker.postAccessoryPlugMediaUnmute(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP); } } else if (event == BtHelper.EVENT_DEVICE_CONFIG_CHANGE) { if (di.mDeviceCodecFormat != a2dpCodec) { @@ -612,6 +612,12 @@ public final class AudioDeviceInventory { mConnectedDevices.put(deviceKey, new DeviceInfo( AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, BtHelper.getName(device), address, a2dpCodec)); + if (BtHelper.isTwsPlusSwitch(device, deviceInfo.mDeviceAddress)) { + if (AudioService.DEBUG_DEVICES) { + Log.d(TAG,"TWS+ device switch"); + } + return; + } mDeviceBroker.postA2dpActiveDeviceChange( new BtHelper.BluetoothA2dpDeviceInfo( device, a2dpVolume, a2dpCodec)); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 2fa730968a34c608ae03e24b5aa33fa3a2d6c243..9a2abfe0245783d3f2c3569dbdf1dc38e25017f9 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -3751,6 +3751,11 @@ public class AudioService extends IAudioService.Stub /** @see AudioManager#startBluetoothSco() */ public void startBluetoothSco(IBinder cb, int targetSdkVersion) { Log.i(TAG, "In startBluetoothSco()"); + BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); + if ((adapter == null) || (adapter.getState() != BluetoothAdapter.STATE_ON)) { + Log.i(TAG, "startBluetoothSco(), BT is not turned ON or adapter is null"); + return; + } final int scoAudioMode = (targetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR2) ? BtHelper.SCO_MODE_VIRTUAL_CALL : BtHelper.SCO_MODE_UNDEFINED; @@ -3783,6 +3788,11 @@ public class AudioService extends IAudioService.Stub /** @see AudioManager#stopBluetoothSco() */ public void stopBluetoothSco(IBinder cb){ Log.i(TAG, "In stopBluetoothSco()"); + BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); + if ((adapter == null) || (adapter.getState() != BluetoothAdapter.STATE_ON)) { + Log.i(TAG, "stopBluetoothSco(), BT is not turned ON or adapter is null"); + return; + } if (!checkAudioSettingsPermission("stopBluetoothSco()") || !mSystemReady) { return; diff --git a/services/core/java/com/android/server/locksettings/PasswordSlotManager.java b/services/core/java/com/android/server/locksettings/PasswordSlotManager.java index 5cbd237a0722e577ea080e9c550464e26177579d..4ef63c05325c4e1e0fc81654c0f5df23a8dc73a6 100644 --- a/services/core/java/com/android/server/locksettings/PasswordSlotManager.java +++ b/services/core/java/com/android/server/locksettings/PasswordSlotManager.java @@ -122,7 +122,7 @@ public class PasswordSlotManager { */ public void markSlotDeleted(int slot) throws RuntimeException { ensureSlotMapLoaded(); - if (mSlotMap.containsKey(slot) && mSlotMap.get(slot) != getMode()) { + if (mSlotMap.containsKey(slot) && !mSlotMap.get(slot).equals(getMode())) { throw new RuntimeException("password slot " + slot + " cannot be deleted"); } mSlotMap.remove(slot); diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java index 6f28675d051bc621ada180266049078064155771..934511bf88d15e928815bb1efbc8ec03ef351781 100644 --- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java +++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java @@ -296,22 +296,12 @@ final class OverlayManagerServiceImpl { */ private void updateAndRefreshOverlaysForTarget(@NonNull final String targetPackageName, final int userId, final int flags) { - final List ois = new ArrayList<>(); - - // Framework overlays added first because order matters when resolving a resource - if (!"android".equals(targetPackageName)) { - ois.addAll(mSettings.getOverlaysForTarget("android", userId)); - } - - // Then add the targeted, non-framework overlays which have higher priority - ois.addAll(mSettings.getOverlaysForTarget(targetPackageName, userId)); - - final List enabledBaseCodePaths = new ArrayList<>(ois.size()); + final List targetOverlays = mSettings.getOverlaysForTarget(targetPackageName, + userId); + // Update the state for any overlay that targets this package. boolean modified = false; - final int n = ois.size(); - for (int i = 0; i < n; i++) { - final OverlayInfo oi = ois.get(i); + for (final OverlayInfo oi : targetOverlays) { final PackageInfo overlayPackage = mPackageManager.getPackageInfo(oi.packageName, userId); if (overlayPackage == null) { @@ -324,25 +314,39 @@ final class OverlayManagerServiceImpl { Slog.e(TAG, "failed to update settings", e); modified |= mSettings.remove(oi.packageName, userId); } - - if (oi.isEnabled() && overlayPackage.applicationInfo != null) { - enabledBaseCodePaths.add(overlayPackage.applicationInfo.getBaseCodePath()); - } } } if (!modified) { + // Update the overlay paths of the target within package manager if necessary. + final List enabledOverlayPaths = new ArrayList<>(targetOverlays.size()); + + // Framework overlays are first in the overlay paths of a package within PackageManager. + for (final OverlayInfo oi : mSettings.getOverlaysForTarget("android", userId)) { + if (oi.isEnabled()) { + enabledOverlayPaths.add(oi.baseCodePath); + } + } + + for (final OverlayInfo oi : targetOverlays) { + if (oi.isEnabled()) { + enabledOverlayPaths.add(oi.baseCodePath); + } + } + + // TODO(): Use getEnabledOverlayPaths(userId, targetPackageName) instead of + // resourceDirs if in the future resourceDirs contains APKs other than overlays PackageInfo packageInfo = mPackageManager.getPackageInfo(targetPackageName, userId); ApplicationInfo appInfo = packageInfo == null ? null : packageInfo.applicationInfo; String[] resourceDirs = appInfo == null ? null : appInfo.resourceDirs; // If the lists aren't the same length, the enabled overlays have changed - if (ArrayUtils.size(resourceDirs) != enabledBaseCodePaths.size()) { + if (ArrayUtils.size(resourceDirs) != enabledOverlayPaths.size()) { modified = true; } else if (resourceDirs != null) { // If any element isn't equal, an overlay or the order of overlays has changed for (int index = 0; index < resourceDirs.length; index++) { - if (!resourceDirs[index].equals(enabledBaseCodePaths.get(index))) { + if (!resourceDirs[index].equals(enabledOverlayPaths.get(index))) { modified = true; break; } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 85e95c07b5f2ed38c351e15ae99ceb4283a6a1b9..d122af465c2e6b248accf330893179596dd8e84d 100755 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -16657,13 +16657,13 @@ public class PackageManagerService extends IPackageManager.Stub && compareSignatures(sharedUserSignatures, pkg.mSigningDetails.signatures) != PackageManager.SIGNATURE_MATCH) { - if (SystemProperties.getInt("ro.product.first_api_level", 0) <= 28) { + if (SystemProperties.getInt("ro.product.first_api_level", 0) <= 29) { // Mismatched signatures is an error and silently skipping system // packages will likely break the device in unforeseen ways. - // However, - // we allow the device to boot anyway because, prior to P, - // vendors were - // not expecting the platform to crash in this situation. + // However, we allow the device to boot anyway because, prior to Q, + // vendors were not expecting the platform to crash in this + // situation. + // This WILL be a hard failure on any new API levels after Q. throw new ReconcileFailure( INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES, "Signature mismatch for shared user: " diff --git a/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java b/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java index d53f6854dfdf94c28289f964066099937685498f..c1a6dbd8ae147b343aa1457aa600293acb75de82 100644 --- a/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java +++ b/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java @@ -28,11 +28,14 @@ import static android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_INST import static android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT; import static android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT; +import static java.lang.Integer.min; + import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AppOpsManager; import android.content.Context; import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; import android.os.Build; import android.os.UserHandle; @@ -72,6 +75,41 @@ public abstract class SoftRestrictedPermissionPolicy { } }; + /** + * TargetSDK is per package. To make sure two apps int the same shared UID do not fight over + * what to set, always compute the combined targetSDK. + * + * @param context A context + * @param appInfo The app that is changed + * @param user The user the app belongs to + * + * @return The minimum targetSDK of all apps sharing the uid of the app + */ + private static int getMinimumTargetSDK(@NonNull Context context, + @NonNull ApplicationInfo appInfo, @NonNull UserHandle user) { + PackageManager pm = context.getPackageManager(); + + int minimumTargetSDK = appInfo.targetSdkVersion; + + String[] uidPkgs = pm.getPackagesForUid(appInfo.uid); + if (uidPkgs != null) { + for (String uidPkg : uidPkgs) { + if (!uidPkg.equals(appInfo.packageName)) { + ApplicationInfo uidPkgInfo; + try { + uidPkgInfo = pm.getApplicationInfoAsUser(uidPkg, 0, user); + } catch (PackageManager.NameNotFoundException e) { + continue; + } + + minimumTargetSDK = min(minimumTargetSDK, uidPkgInfo.targetSdkVersion); + } + } + } + + return minimumTargetSDK; + } + /** * Get the policy for a soft restricted permission. * @@ -99,12 +137,36 @@ public abstract class SoftRestrictedPermissionPolicy { final int targetSDK; if (appInfo != null) { - flags = context.getPackageManager().getPermissionFlags(permission, - appInfo.packageName, user); + PackageManager pm = context.getPackageManager(); + flags = pm.getPermissionFlags(permission, appInfo.packageName, user); applyRestriction = (flags & FLAG_PERMISSION_APPLY_RESTRICTION) != 0; isWhiteListed = (flags & FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT) != 0; - hasRequestedLegacyExternalStorage = appInfo.hasRequestedLegacyExternalStorage(); - targetSDK = appInfo.targetSdkVersion; + targetSDK = getMinimumTargetSDK(context, appInfo, user); + + boolean hasAnyRequestedLegacyExternalStorage = + appInfo.hasRequestedLegacyExternalStorage(); + + // hasRequestedLegacyExternalStorage is per package. To make sure two apps in + // the same shared UID do not fight over what to set, always compute the + // combined hasRequestedLegacyExternalStorage + String[] uidPkgs = pm.getPackagesForUid(appInfo.uid); + if (uidPkgs != null) { + for (String uidPkg : uidPkgs) { + if (!uidPkg.equals(appInfo.packageName)) { + ApplicationInfo uidPkgInfo; + try { + uidPkgInfo = pm.getApplicationInfoAsUser(uidPkg, 0, user); + } catch (PackageManager.NameNotFoundException e) { + continue; + } + + hasAnyRequestedLegacyExternalStorage |= + uidPkgInfo.hasRequestedLegacyExternalStorage(); + } + } + } + + hasRequestedLegacyExternalStorage = hasAnyRequestedLegacyExternalStorage; } else { flags = 0; applyRestriction = false; @@ -155,7 +217,7 @@ public abstract class SoftRestrictedPermissionPolicy { final int flags = context.getPackageManager().getPermissionFlags(permission, appInfo.packageName, user); isWhiteListed = (flags & FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT) != 0; - targetSDK = appInfo.targetSdkVersion; + targetSDK = getMinimumTargetSDK(context, appInfo, user); } else { isWhiteListed = false; targetSDK = 0; diff --git a/services/core/java/com/android/server/policy/TEST_MAPPING b/services/core/java/com/android/server/policy/TEST_MAPPING index c7e241b35e9af22d434940f44a27ef90487c2ce8..17392e0a67bbcfd4fc34ea4bef0fd082d716477e 100644 --- a/services/core/java/com/android/server/policy/TEST_MAPPING +++ b/services/core/java/com/android/server/policy/TEST_MAPPING @@ -33,6 +33,9 @@ "options": [ { "include-filter": "android.permission2.cts.RestrictedPermissionsTest" + }, + { + "include-filter": "android.permission2.cts.RestrictedStoragePermissionSharedUidTest" } ] }, diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index e9a6c8fb852453a9f25a5e4fc412521b82478f86..ecba2c8fe1cdee0e1079d16d5f0773f17dc8808f 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -957,6 +957,7 @@ class ScreenRotationAnimation { } } + t.setEarlyWakeup(); setSnapshotTransform(t, mSnapshotFinalMatrix, mExitTransformation.getAlpha()); } diff --git a/telephony/java/android/telephony/CellSignalStrengthNr.java b/telephony/java/android/telephony/CellSignalStrengthNr.java index 1912c60ac122ec6d4ba11ad169b7ec61aeb01f05..c8146dc7e4fb3dca4632b48351e102e38538b600 100644 --- a/telephony/java/android/telephony/CellSignalStrengthNr.java +++ b/telephony/java/android/telephony/CellSignalStrengthNr.java @@ -194,13 +194,13 @@ public final class CellSignalStrengthNr extends CellSignalStrength implements Pa /** @hide */ @Override public void updateLevel(PersistableBundle cc, ServiceState ss) { - if (mCsiRsrp == CellInfo.UNAVAILABLE) { + if (mSsRsrp == CellInfo.UNAVAILABLE) { mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; - } else if (mCsiRsrp >= SIGNAL_GREAT_THRESHOLD) { + } else if (mSsRsrp >= SIGNAL_GREAT_THRESHOLD) { mLevel = SIGNAL_STRENGTH_GREAT; - } else if (mCsiRsrp >= SIGNAL_GOOD_THRESHOLD) { + } else if (mSsRsrp >= SIGNAL_GOOD_THRESHOLD) { mLevel = SIGNAL_STRENGTH_GOOD; - } else if (mCsiRsrp >= SIGNAL_MODERATE_THRESHOLD) { + } else if (mSsRsrp >= SIGNAL_MODERATE_THRESHOLD) { mLevel = SIGNAL_STRENGTH_MODERATE; } else { mLevel = SIGNAL_STRENGTH_POOR; @@ -231,11 +231,11 @@ public final class CellSignalStrengthNr extends CellSignalStrength implements Pa } /** - * Get the CSI-RSRP as dBm value -140..-44dBm or {@link CellInfo#UNAVAILABLE UNAVAILABLE}. + * Get the SS-RSRP as dBm value -140..-44dBm or {@link CellInfo#UNAVAILABLE UNAVAILABLE}. */ @Override public int getDbm() { - return mCsiRsrp; + return mSsRsrp; } /** @hide */