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

Commit efee1a6b authored by Tiger Huang's avatar Tiger Huang Committed by Automerger Merge Worker
Browse files

Merge "Refine system bar position restoring" into rvc-qpr-dev am: 1adfc8b8

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12293070

Change-Id: I23e07b7e45535df955ff56cf98e760e95023bd09
parents 4ede3cff 1adfc8b8
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -60,6 +60,8 @@ import java.util.StringJoiner;
 */
public class InsetsState implements Parcelable {

    public static final InsetsState EMPTY = new InsetsState();

    /**
     * Internal representation of inset source types. This is different from the public API in
     * {@link WindowInsets.Type} as one type from the public API might indicate multiple windows
+18 −10
Original line number Diff line number Diff line
@@ -246,6 +246,9 @@ public class DisplayPolicy {
                    | View.STATUS_BAR_TRANSPARENT
                    | View.NAVIGATION_BAR_TRANSPARENT;

    private static final int[] SHOW_TYPES_FOR_SWIPE = {ITYPE_NAVIGATION_BAR, ITYPE_STATUS_BAR};
    private static final int[] SHOW_TYPES_FOR_PANIC = {ITYPE_NAVIGATION_BAR};

    private final WindowManagerService mService;
    private final Context mContext;
    private final Context mUiContext;
@@ -3330,8 +3333,15 @@ public class DisplayPolicy {
                return;
            }

            final InsetsState requestedState = controlTarget.getRequestedInsetsState();
            final @InsetsType int restorePositionTypes =
                    (requestedState.getSourceOrDefaultVisibility(ITYPE_NAVIGATION_BAR)
                            ? Type.navigationBars() : 0)
                    | (requestedState.getSourceOrDefaultVisibility(ITYPE_STATUS_BAR)
                            ? Type.statusBars() : 0);

            if (swipeTarget == mNavigationBar
                    && !getInsetsPolicy().isHidden(ITYPE_NAVIGATION_BAR)) {
                    && (restorePositionTypes & Type.navigationBars()) != 0) {
                // Don't show status bar when swiping on already visible navigation bar.
                // But restore the position of navigation bar if it has been moved by the control
                // target.
@@ -3339,14 +3349,13 @@ public class DisplayPolicy {
                return;
            }

            int insetsTypesToShow = Type.systemBars();

            if (controlTarget.canShowTransient()) {
                insetsTypesToShow &= ~mDisplayContent.getInsetsPolicy().showTransient(IntArray.wrap(
                        new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}));
            }
            if (insetsTypesToShow != 0) {
                controlTarget.showInsets(insetsTypesToShow, false);
                // Show transient bars if they are hidden; restore position if they are visible.
                mDisplayContent.getInsetsPolicy().showTransient(SHOW_TYPES_FOR_SWIPE);
                controlTarget.showInsets(restorePositionTypes, false);
            } else {
                // Restore visibilities and positions of system bars.
                controlTarget.showInsets(Type.statusBars() | Type.navigationBars(), false);
            }
        } else {
            boolean sb = mStatusBarController.checkShowTransientBarLw();
@@ -3923,8 +3932,7 @@ public class DisplayPolicy {
                mPendingPanicGestureUptime = SystemClock.uptimeMillis();
                if (!isNavBarEmpty(mLastSystemUiFlags)) {
                    mNavigationBarController.showTransient();
                    mDisplayContent.getInsetsPolicy().showTransient(IntArray.wrap(
                            new int[] {ITYPE_NAVIGATION_BAR}));
                    mDisplayContent.getInsetsPolicy().showTransient(SHOW_TYPES_FOR_PANIC);
                }
            }
        }
+8 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.wm;

import android.inputmethodservice.InputMethodService;
import android.view.InsetsState;
import android.view.WindowInsets.Type.InsetsType;

/**
@@ -37,6 +38,13 @@ interface InsetsControlTarget {
        return null;
    }

    /**
     * @return The requested {@link InsetsState} of this target.
     */
    default InsetsState getRequestedInsetsState() {
        return InsetsState.EMPTY;
    }

    /**
     * Instructs the control target to show inset sources.
     *
+3 −7
Original line number Diff line number Diff line
@@ -42,7 +42,6 @@ import android.view.InsetsState.InternalInsetsType;
import android.view.SurfaceControl;
import android.view.SyncRtSurfaceTransactionApplier;
import android.view.ViewRootImpl;
import android.view.WindowInsets.Type.InsetsType;
import android.view.WindowInsetsAnimation;
import android.view.WindowInsetsAnimation.Bounds;
import android.view.WindowInsetsAnimationControlListener;
@@ -154,15 +153,13 @@ class InsetsPolicy {
        return provider != null && provider.hasWindow() && !provider.getSource().isVisible();
    }

    @InsetsType int showTransient(IntArray types) {
        @InsetsType int showingTransientTypes = 0;
    void showTransient(@InternalInsetsType int[] types) {
        boolean changed = false;
        for (int i = types.size() - 1; i >= 0; i--) {
            final int type = types.get(i);
        for (int i = types.length - 1; i >= 0; i--) {
            final @InternalInsetsType int type = types[i];
            if (!isHidden(type)) {
                continue;
            }
            showingTransientTypes |= InsetsState.toPublicType(type);
            if (mShowingTransientTypes.indexOf(type) != -1) {
                continue;
            }
@@ -190,7 +187,6 @@ class InsetsPolicy {
                }
            });
        }
        return showingTransientTypes;
    }

    void hideTransient() {
+2 −1
Original line number Diff line number Diff line
@@ -725,7 +725,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
     * @return The insets state as requested by the client, i.e. the dispatched insets state
     *         for which the visibilities are overridden with what the client requested.
     */
    InsetsState getRequestedInsetsState() {
    @Override
    public InsetsState getRequestedInsetsState() {
        return mRequestedInsetsState;
    }

Loading