Loading packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +35 −6 Original line number Original line Diff line number Diff line Loading @@ -77,8 +77,10 @@ import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentHostManager.FragmentListener; import com.android.systemui.fragments.FragmentHostManager.FragmentListener; import com.android.systemui.plugins.qs.QS; import com.android.systemui.plugins.qs.QS; import com.android.systemui.qs.SecureSetting; import com.android.systemui.qs.SecureSetting; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment; import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment; import com.android.systemui.statusbar.phone.NavigationBarTransitions; import com.android.systemui.statusbar.phone.NavigationBarTransitions; import com.android.systemui.statusbar.phone.NavigationModeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.tuner.TunablePadding; import com.android.systemui.tuner.TunablePadding; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService; Loading Loading @@ -125,6 +127,7 @@ public class ScreenDecorations extends SystemUI implements Tunable, private Handler mHandler; private Handler mHandler; private boolean mAssistHintBlocked = false; private boolean mAssistHintBlocked = false; private boolean mIsReceivingNavBarColor = false; private boolean mIsReceivingNavBarColor = false; private boolean mInGesturalMode; /** /** * Converts a set of {@link Rect}s into a {@link Region} * Converts a set of {@link Rect}s into a {@link Region} Loading @@ -149,6 +152,28 @@ public class ScreenDecorations extends SystemUI implements Tunable, mHandler.post(this::startOnScreenDecorationsThread); mHandler.post(this::startOnScreenDecorationsThread); setupStatusBarPaddingIfNeeded(); setupStatusBarPaddingIfNeeded(); putComponent(ScreenDecorations.class, this); putComponent(ScreenDecorations.class, this); mInGesturalMode = QuickStepContract.isGesturalMode( Dependency.get(NavigationModeController.class) .addListener(this::handleNavigationModeChange)); } @VisibleForTesting void handleNavigationModeChange(int navigationMode) { if (!mHandler.getLooper().isCurrentThread()) { mHandler.post(() -> handleNavigationModeChange(navigationMode)); return; } boolean inGesturalMode = QuickStepContract.isGesturalMode(navigationMode); if (mInGesturalMode != inGesturalMode) { mInGesturalMode = inGesturalMode; if (mInGesturalMode && mOverlay == null) { setupDecorations(); if (mOverlay != null) { updateLayoutParams(); } } } } } private void fade(View view, boolean fadeIn, boolean isLeft) { private void fade(View view, boolean fadeIn, boolean isLeft) { Loading Loading @@ -232,6 +257,7 @@ public class ScreenDecorations extends SystemUI implements Tunable, break; break; } } } } updateWindowVisibilities(); } } /** /** Loading @@ -256,11 +282,15 @@ public class ScreenDecorations extends SystemUI implements Tunable, return thread.getThreadHandler(); return thread.getThreadHandler(); } } private boolean shouldHostHandles() { return mInGesturalMode; } private void startOnScreenDecorationsThread() { private void startOnScreenDecorationsThread() { mRotation = RotationUtils.getExactRotation(mContext); mRotation = RotationUtils.getExactRotation(mContext); mWindowManager = mContext.getSystemService(WindowManager.class); mWindowManager = mContext.getSystemService(WindowManager.class); updateRoundedCornerRadii(); updateRoundedCornerRadii(); if (hasRoundedCorners() || shouldDrawCutout()) { if (hasRoundedCorners() || shouldDrawCutout() || shouldHostHandles()) { setupDecorations(); setupDecorations(); } } Loading Loading @@ -565,7 +595,10 @@ public class ScreenDecorations extends SystemUI implements Tunable, boolean visibleForCutout = shouldDrawCutout() boolean visibleForCutout = shouldDrawCutout() && overlay.findViewById(R.id.display_cutout).getVisibility() == View.VISIBLE; && overlay.findViewById(R.id.display_cutout).getVisibility() == View.VISIBLE; boolean visibleForRoundedCorners = hasRoundedCorners(); boolean visibleForRoundedCorners = hasRoundedCorners(); overlay.setVisibility(visibleForCutout || visibleForRoundedCorners boolean visibleForHandles = overlay.findViewById(R.id.assist_hint_left).getVisibility() == View.VISIBLE || overlay.findViewById(R.id.assist_hint_right).getVisibility() == View.VISIBLE; overlay.setVisibility(visibleForCutout || visibleForRoundedCorners || visibleForHandles ? View.VISIBLE : View.GONE); ? View.VISIBLE : View.GONE); } } Loading Loading @@ -688,10 +721,6 @@ public class ScreenDecorations extends SystemUI implements Tunable, setSize(mOverlay.findViewById(R.id.right), sizeTop); setSize(mOverlay.findViewById(R.id.right), sizeTop); setSize(mBottomOverlay.findViewById(R.id.left), sizeBottom); setSize(mBottomOverlay.findViewById(R.id.left), sizeBottom); setSize(mBottomOverlay.findViewById(R.id.right), sizeBottom); setSize(mBottomOverlay.findViewById(R.id.right), sizeBottom); setSize(mOverlay.findViewById(R.id.assist_hint_left), sizeTop * 2); setSize(mOverlay.findViewById(R.id.assist_hint_right), sizeTop * 2); setSize(mBottomOverlay.findViewById(R.id.assist_hint_left), sizeBottom * 2); setSize(mBottomOverlay.findViewById(R.id.assist_hint_right), sizeBottom * 2); } } }); }); } } Loading packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +53 −0 Original line number Original line Diff line number Diff line Loading @@ -45,6 +45,7 @@ import android.testing.TestableLooper.RunWithLooper; import android.view.Display; import android.view.Display; import android.view.View; import android.view.View; import android.view.WindowManager; import android.view.WindowManager; import android.view.WindowManagerPolicyConstants; import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest; Loading @@ -52,6 +53,7 @@ import com.android.systemui.R.dimen; import com.android.systemui.ScreenDecorations.TunablePaddingTagListener; import com.android.systemui.ScreenDecorations.TunablePaddingTagListener; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentService; import com.android.systemui.fragments.FragmentService; import com.android.systemui.statusbar.phone.NavigationModeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarWindowView; import com.android.systemui.statusbar.phone.StatusBarWindowView; import com.android.systemui.tuner.TunablePadding; import com.android.systemui.tuner.TunablePadding; Loading @@ -78,6 +80,7 @@ public class ScreenDecorationsTest extends SysuiTestCase { private TunerService mTunerService; private TunerService mTunerService; private StatusBarWindowView mView; private StatusBarWindowView mView; private TunablePaddingService mTunablePaddingService; private TunablePaddingService mTunablePaddingService; private NavigationModeController mNavigationModeController; @Before @Before public void setup() { public void setup() { Loading @@ -87,6 +90,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { mTunablePaddingService = mDependency.injectMockDependency(TunablePaddingService.class); mTunablePaddingService = mDependency.injectMockDependency(TunablePaddingService.class); mTunerService = mDependency.injectMockDependency(TunerService.class); mTunerService = mDependency.injectMockDependency(TunerService.class); mFragmentService = mDependency.injectMockDependency(FragmentService.class); mFragmentService = mDependency.injectMockDependency(FragmentService.class); mNavigationModeController = mDependency.injectMockDependency( NavigationModeController.class); mStatusBar = mock(StatusBar.class); mStatusBar = mock(StatusBar.class); mWindowManager = mock(WindowManager.class); mWindowManager = mock(WindowManager.class); Loading Loading @@ -207,6 +212,54 @@ public class ScreenDecorationsTest extends SysuiTestCase { verify(mWindowManager, times(2)).addView(any(), any()); verify(mWindowManager, times(2)).addView(any(), any()); } } @Test public void testAssistHandles() { mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius, 0); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius_top, 0); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 0); when(mNavigationModeController.addListener(any())).thenReturn( WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL); mScreenDecorations.start(); // Add 2 windows for rounded corners (top and bottom). verify(mWindowManager, times(2)).addView(any(), any()); } @Test public void testDelayedAssistHandles() { mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius, 0); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius_top, 0); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 0); when(mNavigationModeController.addListener(any())).thenReturn( WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON); mScreenDecorations.start(); // No handles and no corners verify(mWindowManager, never()).addView(any(), any()); mScreenDecorations.handleNavigationModeChange( WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL); // Add 2 windows for rounded corners (top and bottom). verify(mWindowManager, times(2)).addView(any(), any()); } @Test @Test public void hasRoundedCornerOverlayFlagSet() { public void hasRoundedCornerOverlayFlagSet() { assertThat(mScreenDecorations.getWindowLayoutParams().privateFlags assertThat(mScreenDecorations.getWindowLayoutParams().privateFlags Loading Loading
packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +35 −6 Original line number Original line Diff line number Diff line Loading @@ -77,8 +77,10 @@ import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentHostManager.FragmentListener; import com.android.systemui.fragments.FragmentHostManager.FragmentListener; import com.android.systemui.plugins.qs.QS; import com.android.systemui.plugins.qs.QS; import com.android.systemui.qs.SecureSetting; import com.android.systemui.qs.SecureSetting; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment; import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment; import com.android.systemui.statusbar.phone.NavigationBarTransitions; import com.android.systemui.statusbar.phone.NavigationBarTransitions; import com.android.systemui.statusbar.phone.NavigationModeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.tuner.TunablePadding; import com.android.systemui.tuner.TunablePadding; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService; Loading Loading @@ -125,6 +127,7 @@ public class ScreenDecorations extends SystemUI implements Tunable, private Handler mHandler; private Handler mHandler; private boolean mAssistHintBlocked = false; private boolean mAssistHintBlocked = false; private boolean mIsReceivingNavBarColor = false; private boolean mIsReceivingNavBarColor = false; private boolean mInGesturalMode; /** /** * Converts a set of {@link Rect}s into a {@link Region} * Converts a set of {@link Rect}s into a {@link Region} Loading @@ -149,6 +152,28 @@ public class ScreenDecorations extends SystemUI implements Tunable, mHandler.post(this::startOnScreenDecorationsThread); mHandler.post(this::startOnScreenDecorationsThread); setupStatusBarPaddingIfNeeded(); setupStatusBarPaddingIfNeeded(); putComponent(ScreenDecorations.class, this); putComponent(ScreenDecorations.class, this); mInGesturalMode = QuickStepContract.isGesturalMode( Dependency.get(NavigationModeController.class) .addListener(this::handleNavigationModeChange)); } @VisibleForTesting void handleNavigationModeChange(int navigationMode) { if (!mHandler.getLooper().isCurrentThread()) { mHandler.post(() -> handleNavigationModeChange(navigationMode)); return; } boolean inGesturalMode = QuickStepContract.isGesturalMode(navigationMode); if (mInGesturalMode != inGesturalMode) { mInGesturalMode = inGesturalMode; if (mInGesturalMode && mOverlay == null) { setupDecorations(); if (mOverlay != null) { updateLayoutParams(); } } } } } private void fade(View view, boolean fadeIn, boolean isLeft) { private void fade(View view, boolean fadeIn, boolean isLeft) { Loading Loading @@ -232,6 +257,7 @@ public class ScreenDecorations extends SystemUI implements Tunable, break; break; } } } } updateWindowVisibilities(); } } /** /** Loading @@ -256,11 +282,15 @@ public class ScreenDecorations extends SystemUI implements Tunable, return thread.getThreadHandler(); return thread.getThreadHandler(); } } private boolean shouldHostHandles() { return mInGesturalMode; } private void startOnScreenDecorationsThread() { private void startOnScreenDecorationsThread() { mRotation = RotationUtils.getExactRotation(mContext); mRotation = RotationUtils.getExactRotation(mContext); mWindowManager = mContext.getSystemService(WindowManager.class); mWindowManager = mContext.getSystemService(WindowManager.class); updateRoundedCornerRadii(); updateRoundedCornerRadii(); if (hasRoundedCorners() || shouldDrawCutout()) { if (hasRoundedCorners() || shouldDrawCutout() || shouldHostHandles()) { setupDecorations(); setupDecorations(); } } Loading Loading @@ -565,7 +595,10 @@ public class ScreenDecorations extends SystemUI implements Tunable, boolean visibleForCutout = shouldDrawCutout() boolean visibleForCutout = shouldDrawCutout() && overlay.findViewById(R.id.display_cutout).getVisibility() == View.VISIBLE; && overlay.findViewById(R.id.display_cutout).getVisibility() == View.VISIBLE; boolean visibleForRoundedCorners = hasRoundedCorners(); boolean visibleForRoundedCorners = hasRoundedCorners(); overlay.setVisibility(visibleForCutout || visibleForRoundedCorners boolean visibleForHandles = overlay.findViewById(R.id.assist_hint_left).getVisibility() == View.VISIBLE || overlay.findViewById(R.id.assist_hint_right).getVisibility() == View.VISIBLE; overlay.setVisibility(visibleForCutout || visibleForRoundedCorners || visibleForHandles ? View.VISIBLE : View.GONE); ? View.VISIBLE : View.GONE); } } Loading Loading @@ -688,10 +721,6 @@ public class ScreenDecorations extends SystemUI implements Tunable, setSize(mOverlay.findViewById(R.id.right), sizeTop); setSize(mOverlay.findViewById(R.id.right), sizeTop); setSize(mBottomOverlay.findViewById(R.id.left), sizeBottom); setSize(mBottomOverlay.findViewById(R.id.left), sizeBottom); setSize(mBottomOverlay.findViewById(R.id.right), sizeBottom); setSize(mBottomOverlay.findViewById(R.id.right), sizeBottom); setSize(mOverlay.findViewById(R.id.assist_hint_left), sizeTop * 2); setSize(mOverlay.findViewById(R.id.assist_hint_right), sizeTop * 2); setSize(mBottomOverlay.findViewById(R.id.assist_hint_left), sizeBottom * 2); setSize(mBottomOverlay.findViewById(R.id.assist_hint_right), sizeBottom * 2); } } }); }); } } Loading
packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +53 −0 Original line number Original line Diff line number Diff line Loading @@ -45,6 +45,7 @@ import android.testing.TestableLooper.RunWithLooper; import android.view.Display; import android.view.Display; import android.view.View; import android.view.View; import android.view.WindowManager; import android.view.WindowManager; import android.view.WindowManagerPolicyConstants; import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest; Loading @@ -52,6 +53,7 @@ import com.android.systemui.R.dimen; import com.android.systemui.ScreenDecorations.TunablePaddingTagListener; import com.android.systemui.ScreenDecorations.TunablePaddingTagListener; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentService; import com.android.systemui.fragments.FragmentService; import com.android.systemui.statusbar.phone.NavigationModeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarWindowView; import com.android.systemui.statusbar.phone.StatusBarWindowView; import com.android.systemui.tuner.TunablePadding; import com.android.systemui.tuner.TunablePadding; Loading @@ -78,6 +80,7 @@ public class ScreenDecorationsTest extends SysuiTestCase { private TunerService mTunerService; private TunerService mTunerService; private StatusBarWindowView mView; private StatusBarWindowView mView; private TunablePaddingService mTunablePaddingService; private TunablePaddingService mTunablePaddingService; private NavigationModeController mNavigationModeController; @Before @Before public void setup() { public void setup() { Loading @@ -87,6 +90,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { mTunablePaddingService = mDependency.injectMockDependency(TunablePaddingService.class); mTunablePaddingService = mDependency.injectMockDependency(TunablePaddingService.class); mTunerService = mDependency.injectMockDependency(TunerService.class); mTunerService = mDependency.injectMockDependency(TunerService.class); mFragmentService = mDependency.injectMockDependency(FragmentService.class); mFragmentService = mDependency.injectMockDependency(FragmentService.class); mNavigationModeController = mDependency.injectMockDependency( NavigationModeController.class); mStatusBar = mock(StatusBar.class); mStatusBar = mock(StatusBar.class); mWindowManager = mock(WindowManager.class); mWindowManager = mock(WindowManager.class); Loading Loading @@ -207,6 +212,54 @@ public class ScreenDecorationsTest extends SysuiTestCase { verify(mWindowManager, times(2)).addView(any(), any()); verify(mWindowManager, times(2)).addView(any(), any()); } } @Test public void testAssistHandles() { mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius, 0); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius_top, 0); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 0); when(mNavigationModeController.addListener(any())).thenReturn( WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL); mScreenDecorations.start(); // Add 2 windows for rounded corners (top and bottom). verify(mWindowManager, times(2)).addView(any(), any()); } @Test public void testDelayedAssistHandles() { mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius, 0); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius_top, 0); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 0); when(mNavigationModeController.addListener(any())).thenReturn( WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON); mScreenDecorations.start(); // No handles and no corners verify(mWindowManager, never()).addView(any(), any()); mScreenDecorations.handleNavigationModeChange( WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL); // Add 2 windows for rounded corners (top and bottom). verify(mWindowManager, times(2)).addView(any(), any()); } @Test @Test public void hasRoundedCornerOverlayFlagSet() { public void hasRoundedCornerOverlayFlagSet() { assertThat(mScreenDecorations.getWindowLayoutParams().privateFlags assertThat(mScreenDecorations.getWindowLayoutParams().privateFlags Loading