Merge "Refresh layout parameter for bounds change from relayout" into tm-qpr-dev

This commit is contained in:
Riddle Hsu
2023-05-04 02:08:29 +00:00
committed by Android (Google) Code Review

View File

@@ -112,6 +112,7 @@ import java.util.Objects;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Supplier;
/**
@@ -433,6 +434,7 @@ public abstract class WallpaperService extends Service {
Message msg = mCaller.obtainMessageIO(MSG_WINDOW_RESIZED,
reportDraw ? 1 : 0,
mergedConfiguration);
mIWallpaperEngine.mPendingResizeCount.incrementAndGet();
mCaller.sendMessage(msg);
}
@@ -1021,6 +1023,10 @@ public abstract class WallpaperService extends Service {
out.print(prefix); out.print("mZoom="); out.println(mZoom);
out.print(prefix); out.print("mPreviewSurfacePosition=");
out.println(mPreviewSurfacePosition);
final int pendingCount = mIWallpaperEngine.mPendingResizeCount.get();
if (pendingCount != 0) {
out.print(prefix); out.print("mPendingResizeCount="); out.println(pendingCount);
}
synchronized (mLock) {
out.print(prefix); out.print("mPendingXOffset="); out.print(mPendingXOffset);
out.print(" mPendingXOffset="); out.println(mPendingXOffset);
@@ -1083,10 +1089,6 @@ public abstract class WallpaperService extends Service {
}
}
private void updateConfiguration(MergedConfiguration mergedConfiguration) {
mMergedConfiguration.setTo(mergedConfiguration);
}
void updateSurface(boolean forceRelayout, boolean forceReport, boolean redrawNeeded) {
if (mDestroyed) {
Log.w(TAG, "Ignoring updateSurface due to destroyed");
@@ -1135,7 +1137,7 @@ public abstract class WallpaperService extends Service {
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
final Configuration config = mMergedConfiguration.getMergedConfiguration();
final Rect maxBounds = config.windowConfiguration.getMaxBounds();
final Rect maxBounds = new Rect(config.windowConfiguration.getMaxBounds());
if (myWidth == ViewGroup.LayoutParams.MATCH_PARENT
&& myHeight == ViewGroup.LayoutParams.MATCH_PARENT) {
mLayout.width = myWidth;
@@ -1195,6 +1197,17 @@ public abstract class WallpaperService extends Service {
final int relayoutResult = mSession.relayout(mWindow, mLayout, mWidth, mHeight,
View.VISIBLE, 0, 0, 0, mWinFrames, mMergedConfiguration,
mSurfaceControl, mInsetsState, mTempControls, mSyncSeqIdBundle);
final Rect outMaxBounds = mMergedConfiguration.getMergedConfiguration()
.windowConfiguration.getMaxBounds();
if (!outMaxBounds.equals(maxBounds)) {
Log.i(TAG, "Retry updateSurface because bounds changed from relayout: "
+ maxBounds + " -> " + outMaxBounds);
mSurfaceHolder.mSurfaceLock.unlock();
mDrawingAllowed = false;
mCaller.sendMessage(mCaller.obtainMessageI(MSG_WINDOW_RESIZED,
redrawNeeded ? 1 : 0));
return;
}
final int transformHint = SurfaceControl.rotationToBufferTransform(
(mDisplayInstallOrientation + mDisplay.getRotation()) % 4);
@@ -1461,6 +1474,8 @@ public abstract class WallpaperService extends Service {
mPreviousWallpaperDimAmount = mWallpaperDimAmount;
mDisplayState = mDisplay.getCommittedState();
mDisplayInstallOrientation = mDisplay.getInstallOrientation();
mMergedConfiguration.setOverrideConfiguration(
mDisplayContext.getResources().getConfiguration());
if (DEBUG) Log.v(TAG, "onCreate(): " + this);
Trace.beginSection("WPMS.Engine.onCreate");
@@ -2262,6 +2277,8 @@ public abstract class WallpaperService extends Service {
final IBinder mWindowToken;
final int mWindowType;
final boolean mIsPreview;
final AtomicInteger mPendingResizeCount = new AtomicInteger();
boolean mReportDraw;
boolean mShownReported;
int mReqWidth;
int mReqHeight;
@@ -2513,11 +2530,7 @@ public abstract class WallpaperService extends Service {
mEngine.doCommand(cmd);
} break;
case MSG_WINDOW_RESIZED: {
final boolean reportDraw = message.arg1 != 0;
mEngine.updateConfiguration(((MergedConfiguration) message.obj));
mEngine.updateSurface(true, false, reportDraw);
mEngine.doOffsetsChanged(true);
mEngine.scaleAndCropScreenshot();
handleResized((MergedConfiguration) message.obj, message.arg1 != 0);
} break;
case MSG_WINDOW_MOVED: {
// Do nothing. What does it mean for a Wallpaper to move?
@@ -2562,6 +2575,40 @@ public abstract class WallpaperService extends Service {
Log.w(TAG, "Unknown message type " + message.what);
}
}
/**
* In general this performs relayout for IWindow#resized. If there are several pending
* (in the message queue) MSG_WINDOW_RESIZED from server side, only the last one will be
* handled (ignore intermediate states). Note that this procedure cannot be skipped if the
* configuration is not changed because this is also used to dispatch insets changes.
*/
private void handleResized(MergedConfiguration config, boolean reportDraw) {
// 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 int pendingCount = config != null ? mPendingResizeCount.decrementAndGet() : -1;
if (reportDraw) {
mReportDraw = true;
}
if (pendingCount > 0) {
if (DEBUG) {
Log.d(TAG, "Skip outdated resize, bounds="
+ config.getMergedConfiguration().windowConfiguration.getMaxBounds()
+ " pendingCount=" + pendingCount);
}
return;
}
if (config != null) {
if (DEBUG) {
Log.d(TAG, "Update config from resized, bounds="
+ config.getMergedConfiguration().windowConfiguration.getMaxBounds());
}
mEngine.mMergedConfiguration.setTo(config);
}
mEngine.updateSurface(true /* forceRelayout */, false /* forceReport */, mReportDraw);
mReportDraw = false;
mEngine.doOffsetsChanged(true);
mEngine.scaleAndCropScreenshot();
}
}
/**