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

Commit 4defffd0 authored by Yunfan Chen's avatar Yunfan Chen
Browse files

Introduce Client Transient flag (1/n)

This is a feature flag to develop transient related features on the
system UI side. Currently it's handled by the system server.

This change introduced the flag and set it by default to false, in the
meanwhile, wrapped existing server side logic with the flag to make the
future clean-up easier.

If the flag is flipped without system UI side feature complete, the
transient animation will not work. Other insets related functionality
will not be affected.

SystemGesturesPointerEventListener should be simplified or changed to a
class instead of an interface with the feature development.

Bug: 277290737
Test: DisplayPolicyTests
Test: DisplayPolicyInsetsTests
Change-Id: I243407d233d71b40807d29660090e674b8dd5d31
parent 99a5d2d1
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -300,6 +300,14 @@ public final class ViewRootImpl implements ViewParent,
    public static final boolean CAPTION_ON_SHELL =
            SystemProperties.getBoolean("persist.wm.debug.caption_on_shell", true);

    /**
     * Whether the client (system UI) is handling the transient gesture and the corresponding
     * animation.
     * @hide
     */
    public static final boolean CLIENT_TRANSIENT =
            SystemProperties.getBoolean("persist.wm.debug.client_transient", false);

    /**
     * Whether the client should compute the window frame on its own.
     * @hide
+146 −127
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import static android.view.InsetsFrameProvider.SOURCE_ARBITRARY_RECTANGLE;
import static android.view.InsetsFrameProvider.SOURCE_CONTAINER_BOUNDS;
import static android.view.InsetsFrameProvider.SOURCE_DISPLAY;
import static android.view.InsetsFrameProvider.SOURCE_FRAME;
import static android.view.ViewRootImpl.CLIENT_TRANSIENT;
import static android.view.WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS;
import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS;
@@ -214,7 +215,8 @@ public class DisplayPolicy {
        }
    }

    private final SystemGesturesPointerEventListener mSystemGestures;
    // Will be null in client transient mode.
    private SystemGesturesPointerEventListener mSystemGestures;

    final DecorInsets mDecorInsets;

@@ -411,7 +413,8 @@ public class DisplayPolicy {
        final Looper looper = UiThread.getHandler().getLooper();
        mHandler = new PolicyHandler(looper);
        // TODO(b/181821798) Migrate SystemGesturesPointerEventListener to use window context.
        mSystemGestures = new SystemGesturesPointerEventListener(mUiContext, mHandler,
        if (!CLIENT_TRANSIENT) {
            SystemGesturesPointerEventListener.Callbacks gesturesPointerEventCallbacks =
                    new SystemGesturesPointerEventListener.Callbacks() {

                private static final long MOUSE_GESTURE_DELAY_MS = 500;
@@ -561,8 +564,11 @@ public class DisplayPolicy {
                public void onMouseLeaveFromBottom() {
                    mHandler.removeCallbacks(mOnSwipeFromBottom);
                }
                });
            };
            mSystemGestures = new SystemGesturesPointerEventListener(mUiContext, mHandler,
                    gesturesPointerEventCallbacks);
            displayContent.registerPointerEventListener(mSystemGestures);
        }
        mAppTransitionListener = new WindowManagerInternal.AppTransitionListener() {

            private Runnable mAppTransitionPending = () -> {
@@ -648,7 +654,9 @@ public class DisplayPolicy {
                mContext, () -> {
            synchronized (mLock) {
                onConfigurationChanged();
                if (!CLIENT_TRANSIENT) {
                    mSystemGestures.onConfigurationChanged();
                }
                mDisplayContent.updateSystemGestureExclusion();
            }
        });
@@ -670,7 +678,9 @@ public class DisplayPolicy {
    }

    void systemReady() {
        if (!CLIENT_TRANSIENT) {
            mSystemGestures.systemReady();
        }
        if (mService.mPointerLocationEnabled) {
            setPointerLocationEnabled(true);
        }
@@ -1317,8 +1327,10 @@ public class DisplayPolicy {
    }

    void onDisplayInfoChanged(DisplayInfo info) {
        if (!CLIENT_TRANSIENT) {
            mSystemGestures.onDisplayInfoChanged(info);
        }
    }

    /**
     * Called for each window attached to the window manager as layout is proceeding. The
@@ -1690,8 +1702,10 @@ public class DisplayPolicy {
        // Update the latest display size, cutout.
        mDisplayContent.updateDisplayInfo();
        onConfigurationChanged();
        if (!CLIENT_TRANSIENT) {
            mSystemGestures.onConfigurationChanged();
        }
    }

    /**
     * Called when the configuration has changed, and it's safe to load new values from resources.
@@ -1963,6 +1977,9 @@ public class DisplayPolicy {

    @VisibleForTesting
    void requestTransientBars(WindowState swipeTarget, boolean isGestureOnSystemBar) {
        if (CLIENT_TRANSIENT) {
            return;
        }
        if (swipeTarget == null || !mService.mPolicy.isUserSetupComplete()) {
            // Swipe-up for navigation bar is disabled during setup
            return;
@@ -2613,7 +2630,9 @@ public class DisplayPolicy {
            final DecorInsets.Info info = mDecorInsets.mInfoForRotation[rotation];
            pw.println(prefixInner + Surface.rotationToString(rotation) + "=" + info);
        }
        if (!CLIENT_TRANSIENT) {
            mSystemGestures.dump(pw, prefix);
        }

        pw.print(prefix); pw.println("Looper state:");
        mHandler.getLooper().dump(new PrintWriterPrinter(pw), prefix + "  ");
+4 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import static android.view.RoundedCorners.NO_ROUNDED_CORNERS;
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.ViewRootImpl.CLIENT_TRANSIENT;
import static android.view.WindowInsets.Type.navigationBars;
import static android.view.WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS;
import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
@@ -61,6 +62,7 @@ import android.view.WindowManager;

import androidx.test.filters.SmallTest;

import org.junit.Assume;
import org.junit.Test;
import org.junit.runner.RunWith;

@@ -379,6 +381,7 @@ public class DisplayPolicyTests extends WindowTestsBase {
    @SetupWindows(addWindows = { W_ACTIVITY, W_NAVIGATION_BAR })
    @Test
    public void testCanSystemBarsBeShownByUser() {
        Assume.assumeFalse(CLIENT_TRANSIENT);
        ((TestWindowManagerPolicy) mWm.mPolicy).mIsUserSetupComplete = true;
        mAppWindow.mAttrs.insetsFlags.behavior = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
        mAppWindow.setRequestedVisibleTypes(0, navigationBars());
@@ -400,6 +403,7 @@ public class DisplayPolicyTests extends WindowTestsBase {
    @UseTestDisplay(addWindows = { W_NAVIGATION_BAR })
    @Test
    public void testTransientBarsSuppressedOnDreams() {
        Assume.assumeFalse(CLIENT_TRANSIENT);
        final WindowState win = createDreamWindow();

        ((TestWindowManagerPolicy) mWm.mPolicy).mIsUserSetupComplete = true;