Loading core/java/android/service/wallpaper/WallpaperService.java +57 −10 Original line number Diff line number Diff line Loading @@ -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; /** Loading Loading @@ -431,6 +432,7 @@ public abstract class WallpaperService extends Service { Message msg = mCaller.obtainMessageIO(MSG_WINDOW_RESIZED, reportDraw ? 1 : 0, mergedConfiguration); mIWallpaperEngine.mPendingResizeCount.incrementAndGet(); mCaller.sendMessage(msg); } Loading Loading @@ -1051,6 +1053,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); Loading Loading @@ -1113,10 +1119,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"); Loading Loading @@ -1165,7 +1167,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; Loading Loading @@ -1221,6 +1223,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( (mDisplay.getInstallOrientation() + mDisplay.getRotation()) % 4); Loading Loading @@ -1488,6 +1501,8 @@ public abstract class WallpaperService extends Service { mWallpaperDimAmount = mDefaultDimAmount; mPreviousWallpaperDimAmount = mWallpaperDimAmount; mDisplayState = mDisplay.getCommittedState(); mMergedConfiguration.setOverrideConfiguration( mDisplayContext.getResources().getConfiguration()); if (DEBUG) Log.v(TAG, "onCreate(): " + this); Trace.beginSection("WPMS.Engine.onCreate"); Loading Loading @@ -2324,6 +2339,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; Loading Loading @@ -2579,11 +2596,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? Loading Loading @@ -2631,6 +2644,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(); } } /** Loading Loading
core/java/android/service/wallpaper/WallpaperService.java +57 −10 Original line number Diff line number Diff line Loading @@ -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; /** Loading Loading @@ -431,6 +432,7 @@ public abstract class WallpaperService extends Service { Message msg = mCaller.obtainMessageIO(MSG_WINDOW_RESIZED, reportDraw ? 1 : 0, mergedConfiguration); mIWallpaperEngine.mPendingResizeCount.incrementAndGet(); mCaller.sendMessage(msg); } Loading Loading @@ -1051,6 +1053,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); Loading Loading @@ -1113,10 +1119,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"); Loading Loading @@ -1165,7 +1167,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; Loading Loading @@ -1221,6 +1223,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( (mDisplay.getInstallOrientation() + mDisplay.getRotation()) % 4); Loading Loading @@ -1488,6 +1501,8 @@ public abstract class WallpaperService extends Service { mWallpaperDimAmount = mDefaultDimAmount; mPreviousWallpaperDimAmount = mWallpaperDimAmount; mDisplayState = mDisplay.getCommittedState(); mMergedConfiguration.setOverrideConfiguration( mDisplayContext.getResources().getConfiguration()); if (DEBUG) Log.v(TAG, "onCreate(): " + this); Trace.beginSection("WPMS.Engine.onCreate"); Loading Loading @@ -2324,6 +2339,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; Loading Loading @@ -2579,11 +2596,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? Loading Loading @@ -2631,6 +2644,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(); } } /** Loading