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

Commit b2328d03 authored by Evan Rosky's avatar Evan Rosky Committed by Android (Google) Code Review
Browse files

Merge "Seqid for all sync requests, not just blast" into main

parents 44d661e1 704de8ca
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -940,4 +940,36 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
            default: return String.valueOf(alwaysOnTop);
        }
    }

    /** @hide */
    @NonNull
    public static String diffToString(@WindowConfig long diff) {
        if (diff == 0) return "_";
        final StringBuilder sb = new StringBuilder();
        if ((diff & WINDOW_CONFIG_BOUNDS) != 0) {
            sb.append(sb.isEmpty() ? "" : "|").append("BOUNDS");
        }
        if ((diff & WINDOW_CONFIG_APP_BOUNDS) != 0) {
            sb.append(sb.isEmpty() ? "" : "|").append("APP_BOUNDS");
        }
        if ((diff & WINDOW_CONFIG_MAX_BOUNDS) != 0) {
            sb.append(sb.isEmpty() ? "" : "|").append("MAX_BOUNDS");
        }
        if ((diff & WINDOW_CONFIG_WINDOWING_MODE) != 0) {
            sb.append(sb.isEmpty() ? "" : "|").append("WINDOWING_MODE");
        }
        if ((diff & WINDOW_CONFIG_ACTIVITY_TYPE) != 0) {
            sb.append(sb.isEmpty() ? "" : "|").append("ACTIVITY_TYPE");
        }
        if ((diff & WINDOW_CONFIG_ALWAYS_ON_TOP) != 0) {
            sb.append(sb.isEmpty() ? "" : "|").append("ALWAYS_ON_TOP");
        }
        if ((diff & WINDOW_CONFIG_ROTATION) != 0) {
            sb.append(sb.isEmpty() ? "" : "|").append("ROTATION");
        }
        if ((diff & WINDOW_CONFIG_DISPLAY_ROTATION) != 0) {
            sb.append(sb.isEmpty() ? "" : "|").append("DISPLAY_ROTATION");
        }
        return sb.toString();
    }
}
+4 −3
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ import android.view.WindowRelayoutResult;
import android.window.ActivityWindowInfo;
import android.window.ClientWindowFrames;

import com.android.window.flags.Flags;

import java.util.Objects;

/**
@@ -65,7 +67,7 @@ public class WindowStateResizeItem extends WindowStateTransactionItem {
        } else {
            mLayout.activityWindowInfo = null;
        }
        mReportDraw = reportDraw;
        mReportDraw = Flags.alwaysSeqIdLayout() ? false : reportDraw;
        mForceLayout = forceLayout;
        mDisplayId = displayId;
        mLayout.syncSeqId = syncSeqId;
@@ -76,8 +78,7 @@ public class WindowStateResizeItem extends WindowStateTransactionItem {
    @Override
    public void execute(@NonNull ClientTransactionHandler client, @NonNull IWindow window,
            @NonNull PendingTransactionActions pendingActions) {
        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER,
                mReportDraw ? "windowResizedReport" : "windowResized");
        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "windowResized");
        try {
            window.resized(mLayout, mReportDraw, mForceLayout, mDisplayId, mSyncWithBuffers,
                    mDragResizing);
+83 −24
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
import static android.view.flags.Flags.disableDrawWakeLock;

import static com.android.window.flags.Flags.FLAG_OFFLOAD_COLOR_EXTRACTION;
import static com.android.window.flags.Flags.alwaysSeqIdLayout;
import static com.android.window.flags.Flags.offloadColorExtraction;

import android.animation.AnimationHandler;
@@ -121,6 +122,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.HandlerCaller;
import com.android.internal.view.BaseIWindow;
import com.android.internal.view.BaseSurfaceHolder;
import com.android.window.flags.Flags;

import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -498,9 +500,20 @@ public abstract class WallpaperService extends Service {
            public void resized(WindowRelayoutResult layout, boolean reportDraw,
                    boolean forceLayout, int displayId, boolean syncWithBuffers,
                    boolean dragResizing) {
                Message msg = mCaller.obtainMessageIO(MSG_WINDOW_RESIZED, reportDraw ? 1 : 0,
                final Message msg;
                if (Flags.alwaysSeqIdLayout()) {
                    msg = mCaller.obtainMessageIO(MSG_WINDOW_RESIZED, layout.syncSeqId,
                            layout.mergedConfiguration);
                    int latestSeqId = mIWallpaperEngine.mPendingSeqId.get();
                    while (latestSeqId < layout.syncSeqId) {
                        latestSeqId = mIWallpaperEngine.mPendingSeqId.compareAndExchange(
                                latestSeqId, layout.syncSeqId);
                    }
                } else {
                    msg = mCaller.obtainMessageIO(MSG_WINDOW_RESIZED, reportDraw ? 1 : 0,
                            layout.mergedConfiguration);
                    mIWallpaperEngine.mPendingResizeCount.incrementAndGet();
                }
                mCaller.sendMessage(msg);
            }

@@ -1158,6 +1171,10 @@ public abstract class WallpaperService extends Service {
            if (pendingCount != 0) {
                out.print(prefix); out.print("mPendingResizeCount="); out.println(pendingCount);
            }
            final int pendingSeqId = mIWallpaperEngine.mPendingSeqId.get();
            if (pendingSeqId != 0) {
                out.print(prefix); out.print("mPendingSeqId="); out.println(pendingSeqId);
            }
            synchronized (mLock) {
                out.print(prefix); out.print("mPendingXOffset="); out.print(mPendingXOffset);
                        out.print(" mPendingXOffset="); out.println(mPendingXOffset);
@@ -1242,7 +1259,7 @@ public abstract class WallpaperService extends Service {
            final boolean typeChanged = mType != mSurfaceHolder.getRequestedType();
            final boolean flagsChanged = mCurWindowFlags != mWindowFlags ||
                    mCurWindowPrivateFlags != mWindowPrivateFlags;
            final boolean reportDraw = false;
            final boolean reportDraw = Flags.alwaysSeqIdLayout() ? seqId > mSeqId : false;
            redrawNeeded = redrawNeeded || reportDraw;
            if (forceRelayout || creating || surfaceCreating || formatChanged || sizeChanged
                    || typeChanged || flagsChanged || redrawNeeded
@@ -1326,7 +1343,8 @@ public abstract class WallpaperService extends Service {
                        mLayout.surfaceInsets.set(0, 0, 0, 0);
                    }
                    final int relayoutResult = mSession.relayout(mWindow, mLayout, mWidth, mHeight,
                            View.VISIBLE, 0, 0, 0, mRelayoutResult, mSurfaceControl);
                            View.VISIBLE, 0, 0, Flags.alwaysSeqIdLayout() ? seqId : 0,
                            mRelayoutResult, mSurfaceControl);
                    final Rect outMaxBounds = mMergedConfiguration.getMergedConfiguration()
                            .windowConfiguration.getMaxBounds();
                    if (!outMaxBounds.equals(maxBounds)) {
@@ -1334,10 +1352,19 @@ public abstract class WallpaperService extends Service {
                                + maxBounds + " -> " + outMaxBounds);
                        mSurfaceHolder.mSurfaceLock.unlock();
                        mDrawingAllowed = false;
                        if (Flags.alwaysSeqIdLayout()) {
                            mCaller.sendMessage(mCaller.obtainMessageI(MSG_WINDOW_RESIZED,
                                    seqId));
                        } else {
                            mCaller.sendMessage(mCaller.obtainMessageI(MSG_WINDOW_RESIZED,
                                    redrawNeeded ? 1 : 0));
                        }
                        return;
                    }
                    if (reportDraw) {
                        // at this point, we've decided to draw now.
                        mSeqId = seqId;
                    }
                    WindowLayout.computeSurfaceSize(mLayout, maxBounds, mWidth, mHeight,
                            mWinFrames.frame, false /* dragResizing */, mSurfaceSize);

@@ -1451,6 +1478,11 @@ public abstract class WallpaperService extends Service {
                    if (!mSurfaceHolder.mSurface.isValid()) {
                        reportSurfaceDestroyed();
                        if (DEBUG) Log.v(TAG, "Layout: Surface destroyed");
                        if (reportDraw) {
                            // If surface was destroyed but we need to report, then report (ie.
                            // treat destroyed as "done drawing" since nothing to draw)
                            mSession.finishDrawing(mWindow, null /* postDrawTransaction */, seqId);
                        }
                        return;
                    }

@@ -1551,11 +1583,19 @@ public abstract class WallpaperService extends Service {
                    } finally {
                        mIsCreating = false;
                        mSurfaceCreated = true;
                        if (Flags.alwaysSeqIdLayout()) {
                            if (reportDraw) {
                                mSession.finishDrawing(mWindow, null /* postDrawTransaction */,
                                        seqId);
                                processLocalColors();
                            }
                        } else {
                            if (redrawNeeded) {
                                mSession.finishDrawing(mWindow, null /* postDrawTransaction */,
                                        Integer.MAX_VALUE);
                                processLocalColors();
                            }
                        }
                        reposition();
                        reportEngineShown(shouldWaitForEngineShown());
                    }
@@ -2503,6 +2543,7 @@ public abstract class WallpaperService extends Service {
        final boolean mIsPreview;
        final AtomicInteger mPendingResizeCount = new AtomicInteger();
        boolean mReportDraw;
        final AtomicInteger mPendingSeqId = new AtomicInteger();
        boolean mShownReported;
        int mReqWidth;
        int mReqHeight;
@@ -2782,6 +2823,8 @@ public abstract class WallpaperService extends Service {
                case MSG_VISIBILITY_CHANGED:
                    if (DEBUG) Log.v(TAG, "Visibility change in " + mEngine
                            + ": " + message.arg1);
                    mEngine.mVisSeqId = alwaysSeqIdLayout()
                            ? Math.max(message.arg2, mEngine.mVisSeqId) : -1;
                    mEngine.doVisibilityChanged(message.arg1 != 0);
                    break;
                case MSG_UPDATE_SCREEN_TURNING_ON:
@@ -2864,6 +2907,7 @@ public abstract class WallpaperService extends Service {
            // The config can be null when retrying for a changed config from relayout, otherwise
            // it is from IWindow#resized which always sends non-null config.
            final boolean fromResized = config != null;
            if (!Flags.alwaysSeqIdLayout()) {
                final boolean reportDraw = seqId != 0;
                final int pendingCount = fromResized ? mPendingResizeCount.decrementAndGet() : -1;
                if (reportDraw) {
@@ -2877,6 +2921,17 @@ public abstract class WallpaperService extends Service {
                    }
                    return;
                }
            } else {
                final int latestPendingSeqId = mPendingSeqId.get();
                if (fromResized && latestPendingSeqId > seqId) {
                    if (DEBUG) {
                        Log.d(TAG, "Skip outdated resize, bounds="
                                + config.getMergedConfiguration().windowConfiguration.getMaxBounds()
                                + " pendingSeqId=" + latestPendingSeqId);
                    }
                    return;
                }
            }
            if (fromResized) {
                if (DEBUG) {
                    Log.d(TAG, "Update config from resized, bounds="
@@ -2884,8 +2939,12 @@ public abstract class WallpaperService extends Service {
                }
                mEngine.mMergedConfiguration.setTo(config);
            }
            if (Flags.alwaysSeqIdLayout()) {
                mEngine.updateSurface(true /* forceRelayout */, seqId, false /* redrawNeeded */);
            } else {
                mEngine.updateSurface(true /* forceRelayout */, -1 /* seqId */, mReportDraw);
                mReportDraw = false;
            }
            mEngine.doOffsetsChanged(true);
            mEngine.scaleAndCropScreenshot();
        }
+80 −20
Original line number Diff line number Diff line
@@ -129,6 +129,7 @@ import static android.window.DesktopModeFlags.ENABLE_CAPTION_COMPAT_INSET_FORCE_
import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;
import static com.android.text.flags.Flags.disableHandwritingInitiatorForIme;
import static com.android.window.flags.Flags.alwaysSeqIdLayout;
import static com.android.window.flags.Flags.enableWindowContextResourcesUpdateOnConfigChange;
import static com.android.window.flags.Flags.predictiveBackSwipeEdgeNoneApi;
import static com.android.window.flags.Flags.reduceChangedExclusionRectsMsgs;
@@ -767,6 +768,8 @@ public final class ViewRootImpl implements ViewParent,
    private boolean mDrewOnceForSync = false;
    int mSeqId = 0;
    int mLastSeqId = 0;
    int mSyncSeqId = 0;
    int mLastSyncSeqId = 0;
@@ -1597,6 +1600,10 @@ public final class ViewRootImpl implements ViewParent,
                    mTmpFrames.attachedFrame = addResult.frames.attachedFrame;
                    mTmpFrames.compatScale = addResult.frames.compatScale;
                    mInvCompatScale = 1f / addResult.frames.compatScale;
                    mSeqId = Math.max(addResult.syncSeqId, mSeqId);
                    if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
                        Trace.instant(Trace.TRACE_TAG_VIEW, mTag + " setView id=" + mSeqId);
                    }
                } catch (RemoteException | RuntimeException e) {
                    mView = null;
                    mAttachInfo.mRootView = null;
@@ -2225,9 +2232,10 @@ public final class ViewRootImpl implements ViewParent,
    void handleAppVisibility(boolean visible, int seqId) {
        if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
            Trace.instant(Trace.TRACE_TAG_VIEW, TextUtils.formatSimple(
                    "%s visibilityChanged oldVisibility=%b newVisibility=%b", mTag,
                    mAppVisible, visible));
                    "%s visibilityChanged oldVisibility=%b newVisibility=%b seqId=%d mSeqId=%d",
                    mTag, mAppVisible, visible, seqId, mSeqId));
        }
        mSeqId = Math.max(seqId, mSeqId);
        if (mAppVisible != visible) {
            final boolean previousVisible = getHostVisibility() == View.VISIBLE;
            mAppVisible = visible;
@@ -2290,11 +2298,19 @@ public final class ViewRootImpl implements ViewParent,
        final boolean displayChanged = mDisplay.getDisplayId() != displayId;
        final boolean compatScaleChanged = mTmpFrames.compatScale != compatScale;
        final boolean dragResizingChanged = mPendingDragResizing != dragResizing;
        if (alwaysSeqIdLayout()) {
            reportDraw = seqId > mSeqId;
        }
        if (!reportDraw && !frameChanged && !configChanged && !attachedFrameChanged
                && !displayChanged && !forceLayout
                && !compatScaleChanged && !dragResizingChanged) {
            return;
        }
        if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
            Trace.instant(Trace.TRACE_TAG_VIEW, TextUtils.formatSimple("%s handleResized "
                            + "frameChanged=%b configChanged=%b seqId=%d mSeqId=%d buf=%b",
                    mTag, frameChanged, configChanged, seqId, mSeqId, syncWithBuffers));
        }
        mPendingDragResizing = dragResizing;
        mTmpFrames.compatScale = compatScale;
@@ -2325,7 +2341,14 @@ public final class ViewRootImpl implements ViewParent,
        }
        mForceNextWindowRelayout |= forceLayout;
        mSeqId = seqId > mSeqId ? seqId : mSeqId;
        if (alwaysSeqIdLayout()) {
            if (syncWithBuffers) {
                mSyncSeqId = seqId > mSyncSeqId ? seqId : mSyncSeqId;
            }
        } else {
            mSyncSeqId = seqId > mSyncSeqId ? seqId : mSyncSeqId;
        }
        if (reportDraw) {
            reportNextDraw("resized");
@@ -3750,9 +3773,9 @@ public final class ViewRootImpl implements ViewParent,
            if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
                Trace.traceBegin(Trace.TRACE_TAG_VIEW,
                        TextUtils.formatSimple("%s-relayoutWindow#"
                                        + "first=%b/resize=%b/vis=%b/params=%b/force=%b", mTag,
                                mFirst, windowShouldResize, viewVisibilityChanged, params != null,
                                mForceNextWindowRelayout));
                                        + "first=%b/resize=%b/vis=%b/params=%b/force=%b/seqId=%d",
                                mTag, mFirst, windowShouldResize, viewVisibilityChanged,
                                params != null, mForceNextWindowRelayout, mSeqId));
            }
            mForceNextWindowRelayout = false;
@@ -3790,6 +3813,23 @@ public final class ViewRootImpl implements ViewParent,
                        == RELAYOUT_RES_CANCEL_AND_REDRAW;
                cancelReason = "relayout";
                final boolean dragResizing = mPendingDragResizing;
                if (alwaysSeqIdLayout()) {
                    if (mSeqId > mLastSeqId) {
                        mLastSeqId = mSeqId;
                        reportNextDraw("relayout");
                        if (!cancelDraw) {
                            mDrewOnceForSync = false;
                        }
                    }
                    if (mSyncSeqId > mLastSyncSeqId) {
                        mLastSyncSeqId = mSyncSeqId;
                        if (DEBUG_BLAST) {
                            Log.d(mTag, "Relayout called with blastSync");
                        }
                        mSyncBuffer = true;
                        isSyncRequest = true;
                    }
                } else {
                    if (mSyncSeqId > mLastSyncSeqId) {
                        mLastSyncSeqId = mSyncSeqId;
                        if (DEBUG_BLAST) {
@@ -3802,6 +3842,7 @@ public final class ViewRootImpl implements ViewParent,
                            mDrewOnceForSync = false;
                        }
                    }
                }
                final boolean surfaceControlChanged =
                        (relayoutResult & RELAYOUT_RES_SURFACE_CHANGED)
@@ -4135,7 +4176,7 @@ public final class ViewRootImpl implements ViewParent,
            // traversal. So we don't know if the sync is complete that we can continue to draw.
            // Here invokes cancelDraw to obtain the information.
            try {
                cancelDraw = mWindowSession.cancelDraw(mWindow, 0);
                cancelDraw = mWindowSession.cancelDraw(mWindow, alwaysSeqIdLayout() ? mSeqId : 0);
                cancelReason = "wm_sync";
                if (DEBUG_BLAST) {
                    Log.d(mTag, "cancelDraw returned " + cancelDraw);
@@ -4525,7 +4566,7 @@ public final class ViewRootImpl implements ViewParent,
            return;
        }
        final int seqId = mSyncSeqId;
        final int seqId = alwaysSeqIdLayout() ? mSeqId : mSyncSeqId;
        mWmsRequestSyncGroupState = WMS_SYNC_PENDING;
        mWmsRequestSyncGroup = new SurfaceSyncGroup("wmsSync-" + mTag, t -> {
            mWmsRequestSyncGroupState = WMS_SYNC_MERGED;
@@ -9483,6 +9524,7 @@ public final class ViewRootImpl implements ViewParent,
        if ((mViewFrameInfo.flags & FrameInfo.FLAG_WINDOW_VISIBILITY_CHANGED) == 0
                && mWindowAttributes.type != TYPE_APPLICATION_STARTING
                && mSyncSeqId <= mLastSyncSeqId
                && (mSeqId <= mLastSeqId || !alwaysSeqIdLayout())
                && winConfigFromAm.diff(winConfigFromWm, false /* compareUndefined */) == 0) {
            final InsetsState state = mInsetsController.getState();
            final Rect displayCutoutSafe = mTempRect;
@@ -9506,8 +9548,25 @@ public final class ViewRootImpl implements ViewParent,
            final boolean sizeChanged =
                    newFrame.width() != oldFrame.width() || newFrame.height() != oldFrame.height();
            relayoutAsync = !positionChanged || !sizeChanged;
            if (!relayoutAsync && Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
                Trace.instant(Trace.TRACE_TAG_VIEW, "relayoutSync "
                        + oldFrame.width() + "x" + oldFrame.height()
                        + "+" + oldFrame.left + "," + oldFrame.top
                        + "->" + newFrame.width() + "x" + newFrame.height()
                        + "+" + newFrame.left + "," + newFrame.top);
            }
        } else {
            relayoutAsync = false;
            if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
                Trace.instant(Trace.TRACE_TAG_VIEW, "relayoutSync visChange="
                        + ((mViewFrameInfo.flags & FrameInfo.FLAG_WINDOW_VISIBILITY_CHANGED) != 0)
                        + " starting=" + (mWindowAttributes.type == TYPE_APPLICATION_STARTING)
                        + " bufferId=" + mSyncSeqId + ">" + mLastSyncSeqId
                        + " seqId=" + mSeqId + ">" + mLastSeqId
                        + " winCfg=" + WindowConfiguration.diffToString(
                                winConfigFromAm.diff(winConfigFromWm, false /* compareUndefined */))
                );
            }
        }
        float appScale = mAttachInfo.mApplicationScale;
@@ -9535,7 +9594,7 @@ public final class ViewRootImpl implements ViewParent,
        final int requestedHeight = (int) (measuredHeight * appScale + 0.5f);
        int relayoutResult = 0;
        mRelayoutSeq++;
        final int seqId = mLastSyncSeqId;
        final int seqId = alwaysSeqIdLayout() ? mSeqId : mLastSyncSeqId;
        if (relayoutAsync) {
            mWindowSession.relayoutAsync(mWindow, params,
                    requestedWidth, requestedHeight, viewVisibility,
@@ -9557,7 +9616,7 @@ public final class ViewRootImpl implements ViewParent,
                }
            }
            final int maybeSyncSeqId = mRelayoutResult.syncSeqId;
            if (maybeSyncSeqId > 0) {
            if (maybeSyncSeqId > (alwaysSeqIdLayout() ? mSyncSeqId : 0)) {
                mSyncSeqId = maybeSyncSeqId;
            }
@@ -10207,7 +10266,8 @@ public final class ViewRootImpl implements ViewParent,
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    private void dispatchResized(WindowRelayoutResult layout, boolean reportDraw,
            boolean forceLayout, int displayId, boolean syncWithBuffers, boolean dragResizing) {
        Message msg = mHandler.obtainMessage(reportDraw ? MSG_RESIZED_REPORT : MSG_RESIZED);
        Message msg = mHandler.obtainMessage((reportDraw && !alwaysSeqIdLayout())
                ? MSG_RESIZED_REPORT : MSG_RESIZED);
        SomeArgs args = SomeArgs.obtain();
        args.arg1 = layout;
        args.argi1 = forceLayout ? 1 : 0;
+17 −4
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.view.WindowRelayoutResult;
import android.view.inputmethod.ImeTracker;

import com.android.internal.os.IResultReceiver;
import com.android.window.flags.Flags;

import java.io.IOException;

@@ -43,6 +44,8 @@ public class BaseIWindow extends IWindow.Stub {

    private IWindowSession mSession;

    private int mLastSeqId = -1;

    public void setSession(IWindowSession session) {
        mSession = session;
    }
@@ -50,6 +53,15 @@ public class BaseIWindow extends IWindow.Stub {
    @Override
    public void resized(WindowRelayoutResult layout, boolean reportDraw, boolean forceLayout,
            int displayId, boolean syncWithBuffers, boolean dragResizing) {
        if (Flags.alwaysSeqIdLayout()) {
            if (layout.syncSeqId > mLastSeqId) {
                mLastSeqId = layout.syncSeqId;
                try {
                    mSession.finishDrawing(this, null /* postDrawTransaction */, layout.syncSeqId);
                } catch (RemoteException e) {
                }
            }
        } else {
            if (reportDraw) {
                try {
                    mSession.finishDrawing(this, null /* postDrawTransaction */, layout.syncSeqId);
@@ -57,6 +69,7 @@ public class BaseIWindow extends IWindow.Stub {
                }
            }
        }
    }

    @Override
    public void insetsControlChanged(InsetsState insetsState,
Loading