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

Commit 40fc6eb3 authored by Saumya Prakash's avatar Saumya Prakash
Browse files

Ensure taskbar insets for camera cutout only apply on the needed sides

For devices with a camera cutout, we only need the increased inset to
accomodate a camera cutout on the sides/orientations where the cutout
interrupts the taskbar. This change ensures that the insets are only
added when necessary.

Fix: 325508089
Test: Open an app and ensure the insets remain unchanged for 0 and 90
degree rotations. Ensure the insets for 180 and 270 degrees are still
covering the camera cutout.
Flag: N/A

Change-Id: I3ee14ffc84d72512acdb750d0f614acacefc7639
parent 56392d2f
Loading
Loading
Loading
Loading
+32 −30
Original line number Diff line number Diff line
@@ -505,52 +505,26 @@ public class TaskbarActivityContext extends BaseTaskbarContext {

    /**
     * Creates {@link WindowManager.LayoutParams} for Taskbar, and also sets LP.paramsForRotation
     * for taskbar showing as navigation bar
     * for taskbar
     */
    private WindowManager.LayoutParams createAllWindowParams() {
        final int windowType =
                ENABLE_TASKBAR_NAVBAR_UNIFICATION ? TYPE_NAVIGATION_BAR : TYPE_NAVIGATION_BAR_PANEL;
        WindowManager.LayoutParams windowLayoutParams =
                createDefaultWindowLayoutParams(windowType, TaskbarActivityContext.WINDOW_TITLE);
        if (!isPhoneButtonNavMode()) {
            return windowLayoutParams;
        }

        // Provide WM layout params for all rotations to cache, see NavigationBar#getBarLayoutParams
        int width = WindowManager.LayoutParams.MATCH_PARENT;
        int height = WindowManager.LayoutParams.MATCH_PARENT;
        int gravity = Gravity.BOTTOM;
        windowLayoutParams.paramsForRotation = new WindowManager.LayoutParams[4];
        for (int rot = Surface.ROTATION_0; rot <= Surface.ROTATION_270; rot++) {
            WindowManager.LayoutParams lp =
                    createDefaultWindowLayoutParams(windowType,
                            TaskbarActivityContext.WINDOW_TITLE);
            switch (rot) {
                case Surface.ROTATION_0, Surface.ROTATION_180 -> {
                    // Defaults are fine
                    width = WindowManager.LayoutParams.MATCH_PARENT;
                    height = mLastRequestedNonFullscreenSize;
                    gravity = Gravity.BOTTOM;
                }
                case Surface.ROTATION_90 -> {
                    width = mLastRequestedNonFullscreenSize;
                    height = WindowManager.LayoutParams.MATCH_PARENT;
                    gravity = Gravity.END;
            if (isPhoneButtonNavMode()) {
                populatePhoneButtonNavModeWindowLayoutParams(rot, lp);
            }
                case Surface.ROTATION_270 -> {
                    width = mLastRequestedNonFullscreenSize;
                    height = WindowManager.LayoutParams.MATCH_PARENT;
                    gravity = Gravity.START;
                }

            }
            lp.width = width;
            lp.height = height;
            lp.gravity = gravity;
            windowLayoutParams.paramsForRotation[rot] = lp;
        }

        // Override current layout params
        // Override with current layout params
        WindowManager.LayoutParams currentParams =
                windowLayoutParams.paramsForRotation[getDisplay().getRotation()];
        windowLayoutParams.width = currentParams.width;
@@ -560,6 +534,32 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
        return windowLayoutParams;
    }

    /**
     * Update {@link WindowManager.LayoutParams} with values specific to phone and 3 button
     * navigation users
     */
    private void populatePhoneButtonNavModeWindowLayoutParams(int rot,
            WindowManager.LayoutParams lp) {
        lp.width = WindowManager.LayoutParams.MATCH_PARENT;
        lp.height = WindowManager.LayoutParams.MATCH_PARENT;
        lp.gravity = Gravity.BOTTOM;

        // Override with per-rotation specific values
        switch (rot) {
            case Surface.ROTATION_0, Surface.ROTATION_180 -> {
                lp.height = mLastRequestedNonFullscreenSize;
            }
            case Surface.ROTATION_90 -> {
                lp.width = mLastRequestedNonFullscreenSize;
                lp.gravity = Gravity.END;
            }
            case Surface.ROTATION_270 -> {
                lp.width = mLastRequestedNonFullscreenSize;
                lp.gravity = Gravity.START;
            }
        }
    }

    public void onConfigurationChanged(@Config int configChanges) {
        mControllers.onConfigurationChanged(configChanges);
        if (!mIsUserSetupComplete) {
@@ -920,8 +920,10 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
        }
        if (landscapePhoneButtonNav) {
            mWindowLayoutParams.width = size;
            mWindowLayoutParams.paramsForRotation[getDisplay().getRotation()].width = size;
        } else {
            mWindowLayoutParams.height = size;
            mWindowLayoutParams.paramsForRotation[getDisplay().getRotation()].height = size;
        }
        mControllers.taskbarInsetsController.onTaskbarOrBubblebarWindowHeightOrInsetsChanged();
        notifyUpdateLayoutParams();
+6 −15
Original line number Diff line number Diff line
@@ -118,13 +118,11 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas
                getProvidedInsets(insetsRoundedCornerFlag)
            }

        if (!context.isGestureNav) {
        if (windowLayoutParams.paramsForRotation != null) {
            for (layoutParams in windowLayoutParams.paramsForRotation) {
                layoutParams.providedInsets = getProvidedInsets(insetsRoundedCornerFlag)
            }
        }
        }

        val taskbarTouchableHeight = controllers.taskbarStashController.touchableHeight
        val bubblesTouchableHeight =
@@ -156,21 +154,14 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas
            )
        }

        val gravity = windowLayoutParams.gravity

        // Pre-calculate insets for different providers across different rotations for this gravity
        for (rotation in Surface.ROTATION_0..Surface.ROTATION_270) {
            // Add insets for navbar rotated params
            if (windowLayoutParams.paramsForRotation != null) {
            val layoutParams = windowLayoutParams.paramsForRotation[rotation]
            for (provider in layoutParams.providedInsets) {
                setProviderInsets(provider, layoutParams.gravity, rotation)
            }
        }
            for (provider in windowLayoutParams.providedInsets) {
                setProviderInsets(provider, gravity, rotation)
            }
        }
        context.notifyUpdateLayoutParams()
    }