Loading core/java/android/app/WindowConfiguration.java +32 −0 Original line number Diff line number Diff line Loading @@ -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(); } } core/java/android/app/servertransaction/WindowStateResizeItem.java +4 −3 Original line number Diff line number Diff line Loading @@ -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; /** Loading Loading @@ -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; Loading @@ -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); Loading core/java/android/service/wallpaper/WallpaperService.java +83 −24 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); } Loading Loading @@ -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); Loading Loading @@ -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 Loading Loading @@ -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)) { Loading @@ -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); Loading Loading @@ -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; } Loading Loading @@ -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()); } Loading Loading @@ -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; Loading Loading @@ -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: Loading Loading @@ -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) { Loading @@ -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=" Loading @@ -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(); } Loading core/java/android/view/ViewRootImpl.java +80 −20 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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"); Loading Loading @@ -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; Loading Loading @@ -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) { Loading @@ -3802,6 +3842,7 @@ public final class ViewRootImpl implements ViewParent, mDrewOnceForSync = false; } } } final boolean surfaceControlChanged = (relayoutResult & RELAYOUT_RES_SURFACE_CHANGED) Loading Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -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, Loading @@ -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; } Loading Loading @@ -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; Loading core/java/com/android/internal/view/BaseIWindow.java +17 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -43,6 +44,8 @@ public class BaseIWindow extends IWindow.Stub { private IWindowSession mSession; private int mLastSeqId = -1; public void setSession(IWindowSession session) { mSession = session; } Loading @@ -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); Loading @@ -57,6 +69,7 @@ public class BaseIWindow extends IWindow.Stub { } } } } @Override public void insetsControlChanged(InsetsState insetsState, Loading Loading
core/java/android/app/WindowConfiguration.java +32 −0 Original line number Diff line number Diff line Loading @@ -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(); } }
core/java/android/app/servertransaction/WindowStateResizeItem.java +4 −3 Original line number Diff line number Diff line Loading @@ -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; /** Loading Loading @@ -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; Loading @@ -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); Loading
core/java/android/service/wallpaper/WallpaperService.java +83 −24 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); } Loading Loading @@ -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); Loading Loading @@ -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 Loading Loading @@ -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)) { Loading @@ -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); Loading Loading @@ -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; } Loading Loading @@ -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()); } Loading Loading @@ -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; Loading Loading @@ -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: Loading Loading @@ -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) { Loading @@ -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=" Loading @@ -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(); } Loading
core/java/android/view/ViewRootImpl.java +80 −20 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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"); Loading Loading @@ -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; Loading Loading @@ -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) { Loading @@ -3802,6 +3842,7 @@ public final class ViewRootImpl implements ViewParent, mDrewOnceForSync = false; } } } final boolean surfaceControlChanged = (relayoutResult & RELAYOUT_RES_SURFACE_CHANGED) Loading Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -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, Loading @@ -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; } Loading Loading @@ -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; Loading
core/java/com/android/internal/view/BaseIWindow.java +17 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -43,6 +44,8 @@ public class BaseIWindow extends IWindow.Stub { private IWindowSession mSession; private int mLastSeqId = -1; public void setSession(IWindowSession session) { mSession = session; } Loading @@ -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); Loading @@ -57,6 +69,7 @@ public class BaseIWindow extends IWindow.Stub { } } } } @Override public void insetsControlChanged(InsetsState insetsState, Loading