Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 97193c2c authored by Matt Casey's avatar Matt Casey
Browse files

Always show ScreenDecorations when in gesture nav mode.

ScreenDecorations host the handles for the assist gesture, which are
available on non-rounded phones as well.

Only show the overlay that is actually in use.

Bug: 134487710
Test: atest ScreenDecorationsTest, manual testing on walleye
Change-Id: I00d1a274d5a236fb2f4679d80bd38db6f24d06bc
parent e45e09fc
Loading
Loading
Loading
Loading
+35 −6
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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}
@@ -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) {
@@ -232,6 +257,7 @@ public class ScreenDecorations extends SystemUI implements Tunable,
                    break;
                    break;
            }
            }
        }
        }
        updateWindowVisibilities();
    }
    }


    /**
    /**
@@ -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();
        }
        }


@@ -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);
    }
    }


@@ -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);
            }
            }
        });
        });
    }
    }
+53 −0
Original line number Original line Diff line number Diff line
@@ -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;


@@ -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;
@@ -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() {
@@ -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);
@@ -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