diff options
3 files changed, 69 insertions, 4 deletions
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig index 2cb297ad1359..723959ac3f6e 100644 --- a/packages/SystemUI/aconfig/systemui.aconfig +++ b/packages/SystemUI/aconfig/systemui.aconfig @@ -984,6 +984,16 @@ flag { } flag { + namespace: "systemui" + name: "privacy_dot_unfold_wrong_corner_fix" + description: "Fixes an issue where the privacy dot is at the wrong corner after unfolding/folding." + bug: "339335643" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "validate_keyboard_shortcut_helper_icon_uri" namespace: "systemui" description: "Adds a check that the caller can access the content URI of an icon in the shortcut helper." diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt index 43409718c849..f12643280c26 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt @@ -18,14 +18,19 @@ package com.android.systemui.statusbar.events import android.graphics.Point import android.graphics.Rect +import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags import android.testing.TestableLooper.RunWithLooper import android.view.Display import android.view.DisplayAdjustments import android.view.View import android.widget.FrameLayout +import android.widget.FrameLayout.LayoutParams.UNSPECIFIED_GRAVITY import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest +import com.android.systemui.Flags import com.android.systemui.SysuiTestCase +import com.android.systemui.res.R import com.android.systemui.statusbar.FakeStatusBarStateController import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider import com.android.systemui.statusbar.policy.FakeConfigurationController @@ -291,14 +296,61 @@ class PrivacyDotViewControllerTest : SysuiTestCase() { assertThat(controller.currentViewState.designatedCorner).isEqualTo(bottomRightView) } + @Test + @EnableFlags(Flags.FLAG_PRIVACY_DOT_UNFOLD_WRONG_CORNER_FIX) + fun initialize_newViews_fixFlagEnabled_gravityIsUpdated() { + val newTopLeftView = initDotView() + val newTopRightView = initDotView() + val newBottomLeftView = initDotView() + val newBottomRightView = initDotView() + setRotation(ROTATION_LANDSCAPE) // Bottom right used in landscape + + val controller = createAndInitializeController() + // Re-init with different views, but same rotation + controller.initialize( + newTopLeftView, + newTopRightView, + newBottomLeftView, + newBottomRightView + ) + + assertThat((newBottomRightView.layoutParams as FrameLayout.LayoutParams).gravity) + .isNotEqualTo(UNSPECIFIED_GRAVITY) + } + + @Test + @DisableFlags(Flags.FLAG_PRIVACY_DOT_UNFOLD_WRONG_CORNER_FIX) + fun initialize_newViews_fixFlagDisabled_gravityIsNotUpdated() { + val newTopLeftView = initDotView() + val newTopRightView = initDotView() + val newBottomLeftView = initDotView() + val newBottomRightView = initDotView() + setRotation(ROTATION_LANDSCAPE) // Bottom right used in landscape + + val controller = createAndInitializeController() + // Re-init with different views, but same rotation + controller.initialize( + newTopLeftView, + newTopRightView, + newBottomLeftView, + newBottomRightView + ) + + assertThat((newBottomRightView.layoutParams as FrameLayout.LayoutParams).gravity) + .isEqualTo(UNSPECIFIED_GRAVITY) + } + private fun setRotation(rotation: Int) { whenever(mockDisplay.rotation).thenReturn(rotation) } - private fun initDotView(): View = - View(context).also { + private fun initDotView(): View { + val privacyDot = View(context).also { it.id = R.id.privacy_dot } + return FrameLayout(context).also { it.layoutParams = FrameLayout.LayoutParams(/* width = */ 0, /* height = */ 0) + it.addView(privacyDot) } + } private fun enableRtl() { configurationController.notifyLayoutDirectionChanged(isRtl = true) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt index 658625996575..9eb9ed5f2063 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt @@ -26,6 +26,7 @@ import android.widget.FrameLayout import androidx.core.animation.Animator import com.android.app.animation.Interpolators import com.android.internal.annotations.GuardedBy +import com.android.systemui.Flags.privacyDotUnfoldWrongCornerFix import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Main @@ -505,7 +506,9 @@ open class PrivacyDotViewController @Inject constructor( return } - if (state.rotation != currentViewState.rotation) { + val designatedCornerChanged = state.designatedCorner != currentViewState.designatedCorner + val rotationChanged = state.rotation != currentViewState.rotation + if (rotationChanged || (designatedCornerChanged && privacyDotUnfoldWrongCornerFix())) { // A rotation has started, hide the views to avoid flicker updateRotations(state.rotation, state.paddingTop) } @@ -515,7 +518,7 @@ open class PrivacyDotViewController @Inject constructor( views.forEach { it.requestLayout() } } - if (state.designatedCorner != currentViewState.designatedCorner) { + if (designatedCornerChanged) { currentViewState.designatedCorner?.contentDescription = null state.designatedCorner?.contentDescription = state.contentDescription |