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

Commit dba4c464 authored by Yuhan Yang's avatar Yuhan Yang
Browse files

Add vertical margin between autoclick panel and navbar

Screencast: go/screencast-nduxnjmwnjaynzaymdi4ohxjnjq2mjqwyi03mg

Bug: 421953814
Test: atest AutoclickTypePanelTest
Flag: com.android.server.accessibility.enable_autoclick_indicator
Change-Id: I8b6a9ae67186c26c2ab3296cc0257c908443f7ec
parent f2c6db3d
Loading
Loading
Loading
Loading
+20 −17
Original line number Diff line number Diff line
@@ -62,8 +62,12 @@ public class AutoclickTypePanel {
    protected static final String POSITION_DELIMITER = ",";

    // Distance between panel and screen edge.
    // TODO(b/396402941): Finalize edge margin.
    private static final int PANEL_EDGE_MARGIN = 15;
    // TODO(b/396402941): Finalize horizontal margin.
    private static final int PANEL_HORIZONTAL_MARGIN = 15;
    // TODO(b/396402941): Finalize vertical margin.
    // Using 30 as the panel's vertical margin to keep it same with the panel position after
    // clicking position button on the panel that moves it to next corner.
    private static final int PANEL_VERTICAL_MARGIN = 30;

    // Touch point when drag starts, it can be anywhere inside the panel.
    private float mTouchStartX, mTouchStartY;
@@ -297,6 +301,9 @@ public class AutoclickTypePanel {
        // Get screen width to determine which side to snap to.
        // TODO(b/397944891): Handle device rotation case.
        int screenWidth = mContext.getResources().getDisplayMetrics().widthPixels;
        int screenHeight = mContext.getResources().getDisplayMetrics().heightPixels;
        int taskbarHeight = SystemBarUtils.getTaskbarHeight(mContext.getResources());
        int panelHeight = mContentView.getMeasuredHeight();
        int yPosition = params.y;

        // Determine which half of the screen the panel is on.
@@ -317,9 +324,11 @@ public class AutoclickTypePanel {
        }

        // Apply final position: set params.x to be edge margin, params.y to maintain vertical
        // position.
        params.x = PANEL_EDGE_MARGIN;
        params.y = yPosition;
        // position, with a minimal margin of PANEL_VERTICAL_MARGIN with taskbar and status bar.
        final int bottomPosition = screenHeight - taskbarHeight - panelHeight - mStatusBarHeight
                - PANEL_VERTICAL_MARGIN;
        params.x = PANEL_HORIZONTAL_MARGIN;
        params.y = Math.min(Math.max(PANEL_VERTICAL_MARGIN, yPosition), bottomPosition);
        mWindowManager.updateViewLayout(mContentView, params);

        // Use actual position for icon (not mCurrentCorner which is mainly used for rotation
@@ -516,29 +525,22 @@ public class AutoclickTypePanel {
    }

    private void setPanelPositionForCorner(WindowManager.LayoutParams params, @Corner int corner) {
        //  TODO(b/396402941): Replace hardcoded pixel values with proper dimension calculations,
        //  Current values are experimental and may not work correctly across different device
        //  resolutions and configurations.
        // TODO(b/396402941): Current values are experimental and may not work correctly across
        // different device resolutions and configurations.
        params.x = PANEL_HORIZONTAL_MARGIN;
        params.y = PANEL_VERTICAL_MARGIN;
        switch (corner) {
            case CORNER_BOTTOM_RIGHT:
                params.gravity = Gravity.END | Gravity.BOTTOM;
                params.x = PANEL_EDGE_MARGIN;
                params.y = 90;
                break;
            case CORNER_BOTTOM_LEFT:
                params.gravity = Gravity.START | Gravity.BOTTOM;
                params.x = PANEL_EDGE_MARGIN;
                params.y = 90;
                break;
            case CORNER_TOP_LEFT:
                params.gravity = Gravity.START | Gravity.TOP;
                params.x = PANEL_EDGE_MARGIN;
                params.y = 30;
                break;
            case CORNER_TOP_RIGHT:
                params.gravity = Gravity.END | Gravity.TOP;
                params.x = PANEL_EDGE_MARGIN;
                params.y = 30;
                break;
            default:
                throw new IllegalArgumentException("Invalid corner: " + corner);
@@ -776,7 +778,8 @@ public class AutoclickTypePanel {
        layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
        layoutParams.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS;
        layoutParams.setFitInsetsTypes(WindowInsets.Type.statusBars());
        layoutParams.setFitInsetsTypes(WindowInsets.Type.statusBars()
                | WindowInsets.Type.navigationBars());
        layoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
        layoutParams.format = PixelFormat.TRANSLUCENT;
        layoutParams.setTitle(AutoclickTypePanel.class.getSimpleName());
+6 −6
Original line number Diff line number Diff line
@@ -285,11 +285,11 @@ public class AutoclickTypePanelTest {
    public void moveToNextCorner_positionButton_rotatesThroughAllPositions() {
        // Define all positions in sequence
        int[][] expectedPositions = {
                {CORNER_BOTTOM_RIGHT, Gravity.END | Gravity.BOTTOM, /*x=*/ 15, /*y=*/ 90},
                {CORNER_BOTTOM_LEFT, Gravity.START | Gravity.BOTTOM, /*x=*/ 15, /*y=*/ 90},
                {CORNER_BOTTOM_RIGHT, Gravity.END | Gravity.BOTTOM, /*x=*/ 15, /*y=*/ 30},
                {CORNER_BOTTOM_LEFT, Gravity.START | Gravity.BOTTOM, /*x=*/ 15, /*y=*/ 30},
                {CORNER_TOP_LEFT, Gravity.START | Gravity.TOP, /*x=*/ 15, /*y=*/ 30},
                {CORNER_TOP_RIGHT, Gravity.END | Gravity.TOP, /*x=*/ 15, /*y=*/ 30},
                {CORNER_BOTTOM_RIGHT, Gravity.END | Gravity.BOTTOM, /*x=*/ 15, /*y=*/ 90}
                {CORNER_BOTTOM_RIGHT, Gravity.END | Gravity.BOTTOM, /*x=*/ 15, /*y=*/ 30}
        };

        // Check initial position
@@ -418,7 +418,7 @@ public class AutoclickTypePanelTest {
        assertThat(panel.getCurrentCornerForTesting()).isEqualTo(CORNER_BOTTOM_RIGHT);
        assertThat(params.gravity).isEqualTo(Gravity.END | Gravity.BOTTOM);
        assertThat(params.x).isEqualTo(15);  // Default edge margin.
        assertThat(params.y).isEqualTo(90);  // Default bottom offset.
        assertThat(params.y).isEqualTo(30);  // Default bottom offset.
    }

    @Test
@@ -478,7 +478,7 @@ public class AutoclickTypePanelTest {
        assertThat(Integer.parseInt(parts[0])).isEqualTo(Gravity.START | Gravity.TOP);
        assertThat(Integer.parseInt(parts[1])).isEqualTo(15);
        assertThat(Integer.parseInt(parts[2])).isEqualTo(
                Math.max(0, panelLocation[1] + 10
                Math.max(30, panelLocation[1] + 10
                        - mAutoclickTypePanel.getStatusBarHeightForTesting()));
        assertThat(Integer.parseInt(parts[3])).isEqualTo(CORNER_BOTTOM_LEFT);

@@ -489,7 +489,7 @@ public class AutoclickTypePanelTest {
        WindowManager.LayoutParams params = mAutoclickTypePanel.getLayoutParamsForTesting();
        assertThat(params.gravity).isEqualTo(Gravity.START | Gravity.TOP);
        assertThat(params.x).isEqualTo(15); // PANEL_EDGE_MARGIN
        assertThat(params.y).isEqualTo(Math.max(0,
        assertThat(params.y).isEqualTo(Math.max(30,
                panelLocation[1] + 10 - mAutoclickTypePanel.getStatusBarHeightForTesting()));
        assertThat(mAutoclickTypePanel.getCurrentCornerForTesting()).isEqualTo(
                CORNER_BOTTOM_LEFT);