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

Commit 090c0cbc authored by Tiger Huang's avatar Tiger Huang
Browse files

Use InsetsVisibilities to carry requested visibilities

InsetsState contains much more information than visibilities, such as
display frame, display cutout, rounded corners, privacy indicator
bounds, and frames of of insets sources. The control target only needs
to send the requested visibilities to WMS, so it can be too heavy to use
InsetsState.

This CL introduces an new class, InsetsVisibilities, which only contains
which type has which visibility. So it uses less memory, and it is more
efficient on copying and checking the equality.

Fix: 194186241
Test: atest InsetsVisibilitiesTest WindowAddRemovePerfTest
            InsetsControllerTest RegisterStatusBarResultTest
            CommandQueueTest LightsOutNotifControllerTest
            ActivityRecordTests DisplayContentTests
            DisplayPolicyLayoutTests InsetsPolicyTest
            InsetsSourceProviderTest InsetsStateControllerTest
            WindowFrameTests WindowManagerServiceTests WindowStateTests
Change-Id: I86c1b26b4383bfa3b924726d580e5706e13ba735
parent b022a912
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.view.IWindowSession;
import android.view.InputChannel;
import android.view.InsetsSourceControl;
import android.view.InsetsState;
import android.view.InsetsVisibilities;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
@@ -82,7 +83,7 @@ public class WindowAddRemovePerfTest extends WindowManagerPerfTestBase

    private static class TestWindow extends BaseIWindow {
        final WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams();
        final InsetsState mRequestedVisibility = new InsetsState();
        final InsetsVisibilities mRequestedVisibilities = new InsetsVisibilities();
        final InsetsState mOutInsetsState = new InsetsState();
        final InsetsSourceControl[] mOutControls = new InsetsSourceControl[0];

@@ -102,7 +103,7 @@ public class WindowAddRemovePerfTest extends WindowManagerPerfTestBase

                long startTime = SystemClock.elapsedRealtimeNanos();
                session.addToDisplay(this, mLayoutParams, View.VISIBLE,
                        Display.DEFAULT_DISPLAY, mRequestedVisibility, inputChannel,
                        Display.DEFAULT_DISPLAY, mRequestedVisibilities, inputChannel,
                        mOutInsetsState, mOutControls);
                final long elapsedTimeNsOfAdd = SystemClock.elapsedRealtimeNanos() - startTime;
                state.addExtraResult("add", elapsedTimeNsOfAdd);
+4 −4
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ import android.view.InputEvent;
import android.view.InputEventReceiver;
import android.view.InsetsSourceControl;
import android.view.InsetsState;
import android.view.InsetsVisibilities;
import android.view.MotionEvent;
import android.view.PixelCopy;
import android.view.Surface;
@@ -224,10 +225,9 @@ public abstract class WallpaperService extends Service {
        final ClientWindowFrames mWinFrames = new ClientWindowFrames();
        final Rect mDispatchedContentInsets = new Rect();
        final Rect mDispatchedStableInsets = new Rect();
        final Rect mFinalSystemInsets = new Rect();
        final Rect mFinalStableInsets = new Rect();
        DisplayCutout mDispatchedDisplayCutout = DisplayCutout.NO_CUTOUT;
        final InsetsState mInsetsState = new InsetsState();
        final InsetsVisibilities mRequestedVisibilities = new InsetsVisibilities();
        final InsetsSourceControl[] mTempControls = new InsetsSourceControl[0];
        final MergedConfiguration mMergedConfiguration = new MergedConfiguration();
        private final Point mSurfaceSize = new Point();
@@ -995,8 +995,8 @@ public abstract class WallpaperService extends Service {
                        InputChannel inputChannel = new InputChannel();

                        if (mSession.addToDisplay(mWindow, mLayout, View.VISIBLE,
                                mDisplay.getDisplayId(), mInsetsState, inputChannel, mInsetsState,
                                mTempControls) < 0) {
                                mDisplay.getDisplayId(), mRequestedVisibilities, inputChannel,
                                mInsetsState, mTempControls) < 0) {
                            Log.w(TAG, "Failed to add window while updating wallpaper surface.");
                            return;
                        }
+5 −3
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ import android.view.IWindowSessionCallback;
import android.view.KeyEvent;
import android.view.InputEvent;
import android.view.InsetsState;
import android.view.InsetsVisibilities;
import android.view.MagnificationSpec;
import android.view.MotionEvent;
import android.view.InputChannel;
@@ -720,14 +721,15 @@ interface IWindowManager
            int displayId, in IDisplayWindowInsetsController displayWindowInsetsController);

    /**
     * Called when a remote process modifies insets on a display window container.
     * Called when a remote process updates the requested visibilities of insets on a display window
     * container.
     */
    void modifyDisplayWindowInsets(int displayId, in InsetsState state);
    void updateDisplayWindowRequestedVisibilities(int displayId, in InsetsVisibilities vis);

    /**
     * Called to get the expected window insets.
     *
     * @return {@code true} if system bars are always comsumed.
     * @return {@code true} if system bars are always consumed.
     */
    boolean getWindowInsets(in WindowManager.LayoutParams attrs, int displayId,
            out InsetsState outInsetsState);
+5 −5
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import android.view.MotionEvent;
import android.view.WindowManager;
import android.view.InsetsSourceControl;
import android.view.InsetsState;
import android.view.InsetsVisibilities;
import android.view.Surface;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
@@ -46,12 +47,12 @@ import java.util.List;
 */
interface IWindowSession {
    int addToDisplay(IWindow window, in WindowManager.LayoutParams attrs,
            in int viewVisibility, in int layerStackId, in InsetsState requestedVisibility,
            in int viewVisibility, in int layerStackId, in InsetsVisibilities requestedVisibilities,
            out InputChannel outInputChannel, out InsetsState insetsState,
            out InsetsSourceControl[] activeControls);
    int addToDisplayAsUser(IWindow window, in WindowManager.LayoutParams attrs,
            in int viewVisibility, in int layerStackId, in int userId,
            in InsetsState requestedVisibility, out InputChannel outInputChannel,
            in InsetsVisibilities requestedVisibilities, out InputChannel outInputChannel,
            out InsetsState insetsState, out InsetsSourceControl[] activeControls);
    int addToDisplayWithoutInputChannel(IWindow window, in WindowManager.LayoutParams attrs,
            in int viewVisibility, in int layerStackId, out InsetsState insetsState);
@@ -285,10 +286,9 @@ interface IWindowSession {
    oneway void updateTapExcludeRegion(IWindow window, in Region region);

    /**
     * Called when the client has changed the local insets state, and now the server should reflect
     * that new state.
     * Updates the requested visibilities of insets.
     */
    oneway void insetsModified(IWindow window, in InsetsState state);
    oneway void updateRequestedVisibilities(IWindow window, in InsetsVisibilities visibilities);

    /**
     * Called when the system gesture exclusion has changed.
+23 −22
Original line number Diff line number Diff line
@@ -107,9 +107,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
                boolean hasControl);

        /**
         * Called when insets have been modified by the client and should be reported back to WM.
         * Called when the requested visibilities of insets have been modified by the client.
         * The visibilities should be reported back to WM.
         *
         * @param visibilities A collection of the requested visibilities.
         */
        void onInsetsModified(InsetsState insetsState);
        void updateRequestedVisibilities(InsetsVisibilities visibilities);

        /**
         * @return Whether the host has any callbacks it wants to synchronize the animations with.
@@ -536,10 +539,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
    /** The state dispatched from server */
    private final InsetsState mLastDispatchedState = new InsetsState();

    // TODO: Use other class to represent the requested visibility of each type, because the
    //       display frame and the frame in each source are not used.
    /** The requested visibilities sent to server */
    private final InsetsState mRequestedState = new InsetsState();
    private final InsetsVisibilities mRequestedVisibilities = new InsetsVisibilities();

    private final Rect mFrame = new Rect();
    private final BiFunction<InsetsController, Integer, InsetsSourceConsumer> mConsumerCreator;
@@ -801,7 +802,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
            }
        }

        boolean requestedStateStale = false;
        boolean requestedVisibilityStale = false;
        final int[] showTypes = new int[1];
        final int[] hideTypes = new int[1];

@@ -822,20 +823,20 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
            final InsetsSourceConsumer consumer = getSourceConsumer(type);
            consumer.setControl(control, showTypes, hideTypes);

            if (!requestedStateStale) {
            if (!requestedVisibilityStale) {
                final boolean requestedVisible = consumer.isRequestedVisible();

                // We might have changed our requested visibilities while we don't have the control,
                // so we need to update our requested state once we have control. Otherwise, our
                // requested state at the server side might be incorrect.
                final boolean requestedVisibilityChanged =
                        requestedVisible != mRequestedState.getSourceOrDefaultVisibility(type);
                        requestedVisible != mRequestedVisibilities.getVisibility(type);

                // The IME client visibility will be reset by insets source provider while updating
                // control, so if IME is requested visible, we need to send the request to server.
                final boolean imeRequestedVisible = type == ITYPE_IME && requestedVisible;

                requestedStateStale = requestedVisibilityChanged || imeRequestedVisible;
                requestedVisibilityStale = requestedVisibilityChanged || imeRequestedVisible;
            }
        }

@@ -861,7 +862,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
        }

        // InsetsSourceConsumer#setControl might change the requested visibility.
        updateRequestedVisibility();
        updateRequestedVisibilities();
    }

    @Override
@@ -1015,7 +1016,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
        if (types == 0) {
            // nothing to animate.
            listener.onCancelled(null);
            updateRequestedVisibility();
            updateRequestedVisibilities();
            if (DEBUG) Log.d(TAG, "no types to animate in controlAnimationUnchecked");
            return;
        }
@@ -1051,7 +1052,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
                    }
                });
            }
            updateRequestedVisibility();
            updateRequestedVisibilities();
            Trace.asyncTraceEnd(TRACE_TAG_VIEW, "IC.showRequestFromApi", 0);
            return;
        }
@@ -1059,7 +1060,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
        if (typesReady == 0) {
            if (DEBUG) Log.d(TAG, "No types ready. onCancelled()");
            listener.onCancelled(null);
            updateRequestedVisibility();
            updateRequestedVisibilities();
            return;
        }

@@ -1091,7 +1092,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
        } else {
            hideDirectly(types, false /* animationFinished */, animationType, fromIme);
        }
        updateRequestedVisibility();
        updateRequestedVisibilities();
    }

    /**
@@ -1348,7 +1349,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
    /**
     * Sends the requested visibilities to window manager if any of them is changed.
     */
    private void updateRequestedVisibility() {
    private void updateRequestedVisibilities() {
        boolean changed = false;
        for (int i = mRequestedVisibilityChanged.size() - 1; i >= 0; i--) {
            final InsetsSourceConsumer consumer = mRequestedVisibilityChanged.valueAt(i);
@@ -1357,8 +1358,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
                continue;
            }
            final boolean requestedVisible = consumer.isRequestedVisible();
            if (requestedVisible != mRequestedState.getSourceOrDefaultVisibility(type)) {
                mRequestedState.getSource(type).setVisible(requestedVisible);
            if (mRequestedVisibilities.getVisibility(type) != requestedVisible) {
                mRequestedVisibilities.setVisibility(type, requestedVisible);
                changed = true;
            }
        }
@@ -1366,11 +1367,11 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
        if (!changed) {
            return;
        }
        mHost.onInsetsModified(mRequestedState);
        mHost.updateRequestedVisibilities(mRequestedVisibilities);
    }

    InsetsState getRequestedVisibility() {
        return mRequestedState;
    InsetsVisibilities getRequestedVisibilities() {
        return mRequestedVisibilities;
    }

    @VisibleForTesting
@@ -1425,7 +1426,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
        for (int i = internalTypes.size() - 1; i >= 0; i--) {
            getSourceConsumer(internalTypes.valueAt(i)).hide(animationFinished, animationType);
        }
        updateRequestedVisibility();
        updateRequestedVisibilities();

        if (fromIme) {
            Trace.asyncTraceEnd(TRACE_TAG_VIEW, "IC.hideRequestFromIme", 0);
@@ -1441,7 +1442,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
        for (int i = internalTypes.size() - 1; i >= 0; i--) {
            getSourceConsumer(internalTypes.valueAt(i)).show(false /* fromIme */);
        }
        updateRequestedVisibility();
        updateRequestedVisibilities();

        if (fromIme) {
            Trace.asyncTraceEnd(TRACE_TAG_VIEW, "IC.showRequestFromIme", 0);
Loading