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

Commit 982ecde2 authored by Bryce Lee's avatar Bryce Lee
Browse files

Suppress transient bars over dreams.

This changelist prevents transient bars over dream windows.
This allows for suppressing these UI elements when other swipe
affordances are provided by the SystemUI.

Bug: 267565290
Test: atest DisplayPolicyTests#testTransientBarsSuppressedOnDreams
Test: manual: swipe up and down from edges of device on a dream
      and observe now transient bars
Change-Id: I5be342ed21174ff6e2c2cf87cea6202773e5f51a
Merged-In: I5be342ed21174ff6e2c2cf87cea6202773e5f51a
parent 65d8b8ba
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -2148,6 +2148,14 @@ public class DisplayPolicy {
            return;
        }

        if (controlTarget != null) {
            final WindowState win = controlTarget.getWindow();

            if (win != null && win.isActivityTypeDream()) {
                return;
            }
        }

        final @InsetsType int restorePositionTypes =
                (controlTarget.getRequestedVisibility(ITYPE_NAVIGATION_BAR)
                        ? Type.navigationBars() : 0)
+36 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import static android.view.Surface.ROTATION_0;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import static android.view.WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS;
import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
import static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND;
import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
@@ -59,6 +60,7 @@ import android.platform.test.annotations.Presubmit;
import android.view.DisplayInfo;
import android.view.InsetsSource;
import android.view.InsetsState;
import android.view.InsetsVisibilities;
import android.view.PrivacyIndicatorBounds;
import android.view.WindowInsets.Side;
import android.view.WindowManager;
@@ -85,6 +87,17 @@ public class DisplayPolicyTests extends WindowTestsBase {
        return win;
    }

    private WindowState createDreamWindow() {
        final WindowState win = createDreamWindow(null, TYPE_BASE_APPLICATION, "dream");
        final WindowManager.LayoutParams attrs = win.mAttrs;
        attrs.width = MATCH_PARENT;
        attrs.height = MATCH_PARENT;
        attrs.flags =
                FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR | FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
        attrs.format = PixelFormat.OPAQUE;
        return win;
    }

    private WindowState createDimmingDialogWindow(boolean canBeImTarget) {
        final WindowState win = spy(createWindow(null, TYPE_APPLICATION, "dimmingDialog"));
        final WindowManager.LayoutParams attrs = win.mAttrs;
@@ -381,4 +394,27 @@ public class DisplayPolicyTests extends WindowTestsBase {
        displayPolicy.requestTransientBars(windowState, true);
        verify(controlTarget).showInsets(anyInt(), anyBoolean());
    }

    @UseTestDisplay(addWindows = { W_NAVIGATION_BAR })
    @Test
    public void testTransientBarsSuppressedOnDreams() {
        final WindowState win = createDreamWindow();

        ((TestWindowManagerPolicy) mWm.mPolicy).mIsUserSetupComplete = true;
        win.mAttrs.insetsFlags.behavior = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
        final InsetsVisibilities insetsVisibilities = new InsetsVisibilities();
        insetsVisibilities.setVisibility(ITYPE_NAVIGATION_BAR, false);
        insetsVisibilities.setVisibility(ITYPE_EXTRA_NAVIGATION_BAR, false);
        win.setRequestedVisibilities(insetsVisibilities);

        final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy();
        displayPolicy.addWindowLw(mNavBarWindow, mNavBarWindow.mAttrs);
        final InsetsSourceProvider navBarProvider = mNavBarWindow.getControllableInsetProvider();
        navBarProvider.updateControlForTarget(win, false);
        navBarProvider.getSource().setVisible(false);

        displayPolicy.setCanSystemBarsBeShownByUser(true);
        displayPolicy.requestTransientBars(mNavBarWindow, true);
        assertFalse(mDisplayContent.getInsetsPolicy().isTransient(ITYPE_NAVIGATION_BAR));
    }
}
+7 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.wm;

import static android.app.AppOpsManager.OP_NONE;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
@@ -443,6 +444,12 @@ class WindowTestsBase extends SystemServiceTestsBase {
        return createWindow(null, type, activity, name);
    }

    WindowState createDreamWindow(WindowState parent, int type, String name) {
        final WindowToken token = createWindowToken(
                mDisplayContent, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_DREAM, type);
        return createWindow(parent, type, token, name);
    }

    // TODO: Move these calls to a builder?
    WindowState createWindow(WindowState parent, int type, DisplayContent dc, String name,
            IWindow iwindow) {