Loading core/java/android/service/wallpaper/WallpaperService.java +29 −6 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static android.graphics.Matrix.MSKEW_X; import static android.graphics.Matrix.MSKEW_Y; import static android.graphics.Matrix.MSKEW_Y; import static android.view.SurfaceControl.METADATA_WINDOW_TYPE; import static android.view.SurfaceControl.METADATA_WINDOW_TYPE; import static android.view.View.SYSTEM_UI_FLAG_VISIBLE; import static android.view.View.SYSTEM_UI_FLAG_VISIBLE; import static android.view.ViewRootImpl.LOCAL_LAYOUT; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import android.animation.Animator; import android.animation.Animator; Loading @@ -39,6 +40,7 @@ import android.app.Service; import android.app.WallpaperColors; import android.app.WallpaperColors; import android.app.WallpaperInfo; import android.app.WallpaperInfo; import android.app.WallpaperManager; import android.app.WallpaperManager; import android.app.WindowConfiguration; import android.compat.annotation.UnsupportedAppUsage; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.Context; import android.content.Intent; import android.content.Intent; Loading Loading @@ -257,6 +259,8 @@ public abstract class WallpaperService extends Service { private final Point mLastSurfaceSize = new Point(); private final Point mLastSurfaceSize = new Point(); private final Matrix mTmpMatrix = new Matrix(); private final Matrix mTmpMatrix = new Matrix(); private final float[] mTmpValues = new float[9]; private final float[] mTmpValues = new float[9]; private final WindowLayout mWindowLayout = new WindowLayout(); private final Rect mTempRect = new Rect(); final WindowManager.LayoutParams mLayout final WindowManager.LayoutParams mLayout = new WindowManager.LayoutParams(); = new WindowManager.LayoutParams(); Loading Loading @@ -1091,7 +1095,8 @@ public abstract class WallpaperService extends Service { | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; final Configuration config = mMergedConfiguration.getMergedConfiguration(); final Configuration config = mMergedConfiguration.getMergedConfiguration(); final Rect maxBounds = config.windowConfiguration.getMaxBounds(); final WindowConfiguration winConfig = config.windowConfiguration; final Rect maxBounds = winConfig.getMaxBounds(); if (myWidth == ViewGroup.LayoutParams.MATCH_PARENT if (myWidth == ViewGroup.LayoutParams.MATCH_PARENT && myHeight == ViewGroup.LayoutParams.MATCH_PARENT) { && myHeight == ViewGroup.LayoutParams.MATCH_PARENT) { mLayout.width = myWidth; mLayout.width = myWidth; Loading Loading @@ -1149,10 +1154,28 @@ public abstract class WallpaperService extends Service { mLayout.surfaceInsets.set(0, 0, 0, 0); mLayout.surfaceInsets.set(0, 0, 0, 0); } } final int relayoutResult = mSession.relayout( int relayoutResult = 0; mWindow, mLayout, mWidth, mHeight, if (LOCAL_LAYOUT) { View.VISIBLE, 0, mWinFrames, mMergedConfiguration, mSurfaceControl, if (!mSurfaceControl.isValid()) { mInsetsState, mTempControls, mSyncSeqIdBundle); relayoutResult = mSession.updateVisibility(mWindow, mLayout, View.VISIBLE, mMergedConfiguration, mSurfaceControl, mInsetsState, mTempControls); } final Rect displayCutoutSafe = mTempRect; mInsetsState.getDisplayCutoutSafe(displayCutoutSafe); mWindowLayout.computeFrames(mLayout, mInsetsState, displayCutoutSafe, winConfig.getBounds(), winConfig.getWindowingMode(), mWidth, mHeight, mRequestedVisibilities, null /* attachedWindowFrame */, 1f /* compatScale */, mWinFrames); mSession.updateLayout(mWindow, mLayout, 0 /* flags */, mWinFrames, mWidth, mHeight); } else { relayoutResult = mSession.relayout(mWindow, mLayout, mWidth, mHeight, View.VISIBLE, 0, mWinFrames, mMergedConfiguration, mSurfaceControl, mInsetsState, mTempControls, mSyncSeqIdBundle); } final int transformHint = SurfaceControl.rotationToBufferTransform( final int transformHint = SurfaceControl.rotationToBufferTransform( (mDisplayInstallOrientation + mDisplay.getRotation()) % 4); (mDisplayInstallOrientation + mDisplay.getRotation()) % 4); Loading Loading @@ -1202,7 +1225,7 @@ public abstract class WallpaperService extends Service { null /* ignoringVisibilityState */, config.isScreenRound(), null /* ignoringVisibilityState */, config.isScreenRound(), false /* alwaysConsumeSystemBars */, mLayout.softInputMode, false /* alwaysConsumeSystemBars */, mLayout.softInputMode, mLayout.flags, SYSTEM_UI_FLAG_VISIBLE, mLayout.type, mLayout.flags, SYSTEM_UI_FLAG_VISIBLE, mLayout.type, config.windowConfiguration.getWindowingMode(), null /* typeSideMap */); winConfig.getWindowingMode(), null /* typeSideMap */); if (!fixedSize) { if (!fixedSize) { final Rect padding = mIWallpaperEngine.mDisplayPadding; final Rect padding = mIWallpaperEngine.mDisplayPadding; Loading core/java/android/view/IWindowSession.aidl +35 −0 Original line number Original line Diff line number Diff line Loading @@ -107,6 +107,41 @@ interface IWindowSession { out InsetsState insetsState, out InsetsSourceControl[] activeControls, out InsetsState insetsState, out InsetsSourceControl[] activeControls, out Bundle bundle); out Bundle bundle); /** * Changes the view visibility and the attributes of a window. This should only be called when * the visibility of the root view is changed. This returns a valid surface if the root view is * visible. This also returns the latest information for the caller to compute its window frame. * * @param window The window being updated. * @param attrs If non-null, new attributes to apply to the window. * @param viewVisibility Window root view's visibility. * @param outMergedConfiguration New config container that holds global, override and merged * config for window, if it is now becoming visible and the merged configuration has changed * since it was last displayed. * @param outSurfaceControl Object in which is placed the new display surface. * @param outInsetsState The current insets state in the system. * @param outActiveControls The insets source controls for the caller to override the insets * state in the system. * * @return int Result flags: {@link WindowManagerGlobal#RELAYOUT_FIRST_TIME}. */ int updateVisibility(IWindow window, in WindowManager.LayoutParams attrs, int viewVisibility, out MergedConfiguration outMergedConfiguration, out SurfaceControl outSurfaceControl, out InsetsState outInsetsState, out InsetsSourceControl[] outActiveControls); /** * Reports the layout results and the attributes of a window to the server. * * @param window The window being reported. * @param attrs If non-null, new attributes to apply to the window. * @param flags Request flags: {@link WindowManagerGlobal#RELAYOUT_INSETS_PENDING}. * @param clientFrames the window frames computed by the client. * @param requestedWidth The width the window wants to be. * @param requestedHeight The height the window wants to be. */ oneway void updateLayout(IWindow window, in WindowManager.LayoutParams attrs, int flags, in ClientWindowFrames clientFrames, int requestedWidth, int requestedHeight); /* /* * Notify the window manager that an application is relaunching and * Notify the window manager that an application is relaunching and * windows should be prepared for replacement. * windows should be prepared for replacement. Loading core/java/android/view/ViewRootImpl.java +67 −21 Original line number Original line Diff line number Diff line Loading @@ -78,11 +78,13 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_SIZE_E import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_ADDITIONAL; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_ADDITIONAL; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; import static android.view.WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY; import static android.view.WindowManagerGlobal.RELAYOUT_RES_CONSUME_ALWAYS_SYSTEM_BARS; import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED; import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED; import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.IME_FOCUS_CONTROLLER; import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.IME_FOCUS_CONTROLLER; import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.INSETS_CONTROLLER; import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.INSETS_CONTROLLER; Loading Loading @@ -278,6 +280,13 @@ public final class ViewRootImpl implements ViewParent, */ */ public static final boolean CAPTION_ON_SHELL = false; public static final boolean CAPTION_ON_SHELL = false; /** * Whether the client should compute the window frame on its own. * @hide */ public static final boolean LOCAL_LAYOUT = SystemProperties.getBoolean("persist.debug.local_layout", false); /** /** * Set this system property to true to force the view hierarchy to render * Set this system property to true to force the view hierarchy to render * at 60 Hz. This can be used to measure the potential framerate. * at 60 Hz. This can be used to measure the potential framerate. Loading Loading @@ -8083,17 +8092,68 @@ public final class ViewRootImpl implements ViewParent, final int requestedWidth = (int) (mView.getMeasuredWidth() * appScale + 0.5f); final int requestedWidth = (int) (mView.getMeasuredWidth() * appScale + 0.5f); final int requestedHeight = (int) (mView.getMeasuredHeight() * appScale + 0.5f); final int requestedHeight = (int) (mView.getMeasuredHeight() * appScale + 0.5f); int relayoutResult = mWindowSession.relayout(mWindow, params, mWillMove = false; mWillResize = false; int relayoutResult = 0; WindowConfiguration winConfig = getConfiguration().windowConfiguration; if (LOCAL_LAYOUT) { if (mFirst || viewVisibility != mViewVisibility) { relayoutResult = mWindowSession.updateVisibility(mWindow, params, viewVisibility, mPendingMergedConfiguration, mSurfaceControl, mTempInsets, mTempControls); if (mTranslator != null) { mTranslator.translateInsetsStateInScreenToAppWindow(mTempInsets); mTranslator.translateSourceControlsInScreenToAppWindow(mTempControls); } mInsetsController.onStateChanged(mTempInsets); mInsetsController.onControlsChanged(mTempControls); mPendingAlwaysConsumeSystemBars = (relayoutResult & RELAYOUT_RES_CONSUME_ALWAYS_SYSTEM_BARS) != 0; } final InsetsState state = mInsetsController.getState(); final Rect displayCutoutSafe = mTempRect; state.getDisplayCutoutSafe(displayCutoutSafe); if (mWindowAttributes.type == TYPE_APPLICATION_STARTING) { // TODO(b/210378379): Remove the special logic. // Letting starting window use the window bounds from the pending config is for the // fixed rotation, because the config is not overridden before the starting window // is created. winConfig = mPendingMergedConfiguration.getMergedConfiguration() .windowConfiguration; } mWindowLayout.computeFrames(mWindowAttributes, state, displayCutoutSafe, winConfig.getBounds(), winConfig.getWindowingMode(), requestedWidth, requestedHeight, mInsetsController.getRequestedVisibilities(), getAttachedWindowFrame(), 1f /* compatScale */, mTmpFrames); mWindowSession.updateLayout(mWindow, params, insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, mTmpFrames, requestedWidth, requestedHeight); } else { relayoutResult = mWindowSession.relayout(mWindow, params, requestedWidth, requestedHeight, viewVisibility, requestedWidth, requestedHeight, viewVisibility, insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, mTmpFrames, mPendingMergedConfiguration, mSurfaceControl, mTempInsets, mTmpFrames, mPendingMergedConfiguration, mSurfaceControl, mTempInsets, mTempControls, mRelayoutBundle); mTempControls, mRelayoutBundle); mSyncSeqId = mRelayoutBundle.getInt("seqid"); mSyncSeqId = mRelayoutBundle.getInt("seqid"); if (mTranslator != null) { mTranslator.translateRectInScreenToAppWindow(mTmpFrames.frame); mTranslator.translateRectInScreenToAppWindow(mTmpFrames.displayFrame); mTranslator.translateInsetsStateInScreenToAppWindow(mTempInsets); mTranslator.translateSourceControlsInScreenToAppWindow(mTempControls); } mInsetsController.onStateChanged(mTempInsets); mInsetsController.onControlsChanged(mTempControls); mPendingAlwaysConsumeSystemBars = (relayoutResult & RELAYOUT_RES_CONSUME_ALWAYS_SYSTEM_BARS) != 0; } final int transformHint = SurfaceControl.rotationToBufferTransform( final int transformHint = SurfaceControl.rotationToBufferTransform( (mDisplayInstallOrientation + mDisplay.getRotation()) % 4); (mDisplayInstallOrientation + mDisplay.getRotation()) % 4); final WindowConfiguration winConfig = getConfiguration().windowConfiguration; WindowLayout.computeSurfaceSize(mWindowAttributes, winConfig.getMaxBounds(), requestedWidth, WindowLayout.computeSurfaceSize(mWindowAttributes, winConfig.getMaxBounds(), requestedWidth, requestedHeight, mTmpFrames.frame, mPendingDragResizing, mSurfaceSize); requestedHeight, mTmpFrames.frame, mPendingDragResizing, mSurfaceSize); Loading Loading @@ -8142,24 +8202,10 @@ public final class ViewRootImpl implements ViewParent, destroySurface(); destroySurface(); } } mPendingAlwaysConsumeSystemBars = (relayoutResult & WindowManagerGlobal.RELAYOUT_RES_CONSUME_ALWAYS_SYSTEM_BARS) != 0; if (restore) { if (restore) { params.restore(); params.restore(); } } if (mTranslator != null) { mTranslator.translateRectInScreenToAppWindow(mTmpFrames.frame); mTranslator.translateRectInScreenToAppWindow(mTmpFrames.displayFrame); mTranslator.translateInsetsStateInScreenToAppWindow(mTempInsets); mTranslator.translateSourceControlsInScreenToAppWindow(mTempControls); } setFrame(mTmpFrames.frame); setFrame(mTmpFrames.frame); mWillMove = false; mWillResize = false; mInsetsController.onStateChanged(mTempInsets); mInsetsController.onControlsChanged(mTempControls); return relayoutResult; return relayoutResult; } } Loading core/java/android/view/WindowlessWindowManager.java +15 −0 Original line number Original line Diff line number Diff line Loading @@ -335,6 +335,21 @@ public class WindowlessWindowManager implements IWindowSession { return 0; return 0; } } @Override public int updateVisibility(IWindow window, WindowManager.LayoutParams inAttrs, int viewVisibility, MergedConfiguration outMergedConfiguration, SurfaceControl outSurfaceControl, InsetsState outInsetsState, InsetsSourceControl[] outActiveControls) { // TODO(b/161810301): Finish the implementation. return 0; } @Override public void updateLayout(IWindow window, WindowManager.LayoutParams inAttrs, int flags, ClientWindowFrames clientWindowFrames, int requestedWidth, int requestedHeight) { // TODO(b/161810301): Finish the implementation. } @Override @Override public void prepareToReplaceWindows(android.os.IBinder appToken, boolean childrenOnly) { public void prepareToReplaceWindows(android.os.IBinder appToken, boolean childrenOnly) { } } Loading services/core/java/com/android/server/wm/Session.java +25 −0 Original line number Original line Diff line number Diff line Loading @@ -116,6 +116,8 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { private float mLastReportedAnimatorScale; private float mLastReportedAnimatorScale; private String mPackageName; private String mPackageName; private String mRelayoutTag; private String mRelayoutTag; private String mUpdateViewVisibilityTag; private String mUpdateWindowLayoutTag; private final InsetsVisibilities mDummyRequestedVisibilities = new InsetsVisibilities(); private final InsetsVisibilities mDummyRequestedVisibilities = new InsetsVisibilities(); private final InsetsSourceControl[] mDummyControls = new InsetsSourceControl[0]; private final InsetsSourceControl[] mDummyControls = new InsetsSourceControl[0]; final boolean mSetsUnrestrictedKeepClearAreas; final boolean mSetsUnrestrictedKeepClearAreas; Loading Loading @@ -222,6 +224,27 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { mService.removeWindow(this, window); mService.removeWindow(this, window); } } @Override public int updateVisibility(IWindow client, WindowManager.LayoutParams attrs, int viewVisibility, MergedConfiguration outMergedConfiguration, SurfaceControl outSurfaceControl, InsetsState outInsetsState, InsetsSourceControl[] outActiveControls) { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, mUpdateViewVisibilityTag); int res = mService.updateViewVisibility(this, client, attrs, viewVisibility, outMergedConfiguration, outSurfaceControl, outInsetsState, outActiveControls); Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); return res; } @Override public void updateLayout(IWindow window, WindowManager.LayoutParams attrs, int flags, ClientWindowFrames clientFrames, int requestedWidth, int requestedHeight) { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, mUpdateWindowLayoutTag); mService.updateWindowLayout(this, window, attrs, flags, clientFrames, requestedWidth, requestedHeight); Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); } @Override @Override public void prepareToReplaceWindows(IBinder appToken, boolean childrenOnly) { public void prepareToReplaceWindows(IBinder appToken, boolean childrenOnly) { mService.setWillReplaceWindows(appToken, childrenOnly); mService.setWillReplaceWindows(appToken, childrenOnly); Loading Loading @@ -689,6 +712,8 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { if (wpc != null) { if (wpc != null) { mPackageName = wpc.mInfo.packageName; mPackageName = wpc.mInfo.packageName; mRelayoutTag = "relayoutWindow: " + mPackageName; mRelayoutTag = "relayoutWindow: " + mPackageName; mUpdateViewVisibilityTag = "updateVisibility: " + mPackageName; mUpdateWindowLayoutTag = "updateLayout: " + mPackageName; } else { } else { Slog.e(TAG_WM, "Unknown process pid=" + mPid); Slog.e(TAG_WM, "Unknown process pid=" + mPid); } } Loading Loading
core/java/android/service/wallpaper/WallpaperService.java +29 −6 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static android.graphics.Matrix.MSKEW_X; import static android.graphics.Matrix.MSKEW_Y; import static android.graphics.Matrix.MSKEW_Y; import static android.view.SurfaceControl.METADATA_WINDOW_TYPE; import static android.view.SurfaceControl.METADATA_WINDOW_TYPE; import static android.view.View.SYSTEM_UI_FLAG_VISIBLE; import static android.view.View.SYSTEM_UI_FLAG_VISIBLE; import static android.view.ViewRootImpl.LOCAL_LAYOUT; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import android.animation.Animator; import android.animation.Animator; Loading @@ -39,6 +40,7 @@ import android.app.Service; import android.app.WallpaperColors; import android.app.WallpaperColors; import android.app.WallpaperInfo; import android.app.WallpaperInfo; import android.app.WallpaperManager; import android.app.WallpaperManager; import android.app.WindowConfiguration; import android.compat.annotation.UnsupportedAppUsage; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.Context; import android.content.Intent; import android.content.Intent; Loading Loading @@ -257,6 +259,8 @@ public abstract class WallpaperService extends Service { private final Point mLastSurfaceSize = new Point(); private final Point mLastSurfaceSize = new Point(); private final Matrix mTmpMatrix = new Matrix(); private final Matrix mTmpMatrix = new Matrix(); private final float[] mTmpValues = new float[9]; private final float[] mTmpValues = new float[9]; private final WindowLayout mWindowLayout = new WindowLayout(); private final Rect mTempRect = new Rect(); final WindowManager.LayoutParams mLayout final WindowManager.LayoutParams mLayout = new WindowManager.LayoutParams(); = new WindowManager.LayoutParams(); Loading Loading @@ -1091,7 +1095,8 @@ public abstract class WallpaperService extends Service { | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; final Configuration config = mMergedConfiguration.getMergedConfiguration(); final Configuration config = mMergedConfiguration.getMergedConfiguration(); final Rect maxBounds = config.windowConfiguration.getMaxBounds(); final WindowConfiguration winConfig = config.windowConfiguration; final Rect maxBounds = winConfig.getMaxBounds(); if (myWidth == ViewGroup.LayoutParams.MATCH_PARENT if (myWidth == ViewGroup.LayoutParams.MATCH_PARENT && myHeight == ViewGroup.LayoutParams.MATCH_PARENT) { && myHeight == ViewGroup.LayoutParams.MATCH_PARENT) { mLayout.width = myWidth; mLayout.width = myWidth; Loading Loading @@ -1149,10 +1154,28 @@ public abstract class WallpaperService extends Service { mLayout.surfaceInsets.set(0, 0, 0, 0); mLayout.surfaceInsets.set(0, 0, 0, 0); } } final int relayoutResult = mSession.relayout( int relayoutResult = 0; mWindow, mLayout, mWidth, mHeight, if (LOCAL_LAYOUT) { View.VISIBLE, 0, mWinFrames, mMergedConfiguration, mSurfaceControl, if (!mSurfaceControl.isValid()) { mInsetsState, mTempControls, mSyncSeqIdBundle); relayoutResult = mSession.updateVisibility(mWindow, mLayout, View.VISIBLE, mMergedConfiguration, mSurfaceControl, mInsetsState, mTempControls); } final Rect displayCutoutSafe = mTempRect; mInsetsState.getDisplayCutoutSafe(displayCutoutSafe); mWindowLayout.computeFrames(mLayout, mInsetsState, displayCutoutSafe, winConfig.getBounds(), winConfig.getWindowingMode(), mWidth, mHeight, mRequestedVisibilities, null /* attachedWindowFrame */, 1f /* compatScale */, mWinFrames); mSession.updateLayout(mWindow, mLayout, 0 /* flags */, mWinFrames, mWidth, mHeight); } else { relayoutResult = mSession.relayout(mWindow, mLayout, mWidth, mHeight, View.VISIBLE, 0, mWinFrames, mMergedConfiguration, mSurfaceControl, mInsetsState, mTempControls, mSyncSeqIdBundle); } final int transformHint = SurfaceControl.rotationToBufferTransform( final int transformHint = SurfaceControl.rotationToBufferTransform( (mDisplayInstallOrientation + mDisplay.getRotation()) % 4); (mDisplayInstallOrientation + mDisplay.getRotation()) % 4); Loading Loading @@ -1202,7 +1225,7 @@ public abstract class WallpaperService extends Service { null /* ignoringVisibilityState */, config.isScreenRound(), null /* ignoringVisibilityState */, config.isScreenRound(), false /* alwaysConsumeSystemBars */, mLayout.softInputMode, false /* alwaysConsumeSystemBars */, mLayout.softInputMode, mLayout.flags, SYSTEM_UI_FLAG_VISIBLE, mLayout.type, mLayout.flags, SYSTEM_UI_FLAG_VISIBLE, mLayout.type, config.windowConfiguration.getWindowingMode(), null /* typeSideMap */); winConfig.getWindowingMode(), null /* typeSideMap */); if (!fixedSize) { if (!fixedSize) { final Rect padding = mIWallpaperEngine.mDisplayPadding; final Rect padding = mIWallpaperEngine.mDisplayPadding; Loading
core/java/android/view/IWindowSession.aidl +35 −0 Original line number Original line Diff line number Diff line Loading @@ -107,6 +107,41 @@ interface IWindowSession { out InsetsState insetsState, out InsetsSourceControl[] activeControls, out InsetsState insetsState, out InsetsSourceControl[] activeControls, out Bundle bundle); out Bundle bundle); /** * Changes the view visibility and the attributes of a window. This should only be called when * the visibility of the root view is changed. This returns a valid surface if the root view is * visible. This also returns the latest information for the caller to compute its window frame. * * @param window The window being updated. * @param attrs If non-null, new attributes to apply to the window. * @param viewVisibility Window root view's visibility. * @param outMergedConfiguration New config container that holds global, override and merged * config for window, if it is now becoming visible and the merged configuration has changed * since it was last displayed. * @param outSurfaceControl Object in which is placed the new display surface. * @param outInsetsState The current insets state in the system. * @param outActiveControls The insets source controls for the caller to override the insets * state in the system. * * @return int Result flags: {@link WindowManagerGlobal#RELAYOUT_FIRST_TIME}. */ int updateVisibility(IWindow window, in WindowManager.LayoutParams attrs, int viewVisibility, out MergedConfiguration outMergedConfiguration, out SurfaceControl outSurfaceControl, out InsetsState outInsetsState, out InsetsSourceControl[] outActiveControls); /** * Reports the layout results and the attributes of a window to the server. * * @param window The window being reported. * @param attrs If non-null, new attributes to apply to the window. * @param flags Request flags: {@link WindowManagerGlobal#RELAYOUT_INSETS_PENDING}. * @param clientFrames the window frames computed by the client. * @param requestedWidth The width the window wants to be. * @param requestedHeight The height the window wants to be. */ oneway void updateLayout(IWindow window, in WindowManager.LayoutParams attrs, int flags, in ClientWindowFrames clientFrames, int requestedWidth, int requestedHeight); /* /* * Notify the window manager that an application is relaunching and * Notify the window manager that an application is relaunching and * windows should be prepared for replacement. * windows should be prepared for replacement. Loading
core/java/android/view/ViewRootImpl.java +67 −21 Original line number Original line Diff line number Diff line Loading @@ -78,11 +78,13 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_SIZE_E import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_ADDITIONAL; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_ADDITIONAL; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; import static android.view.WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY; import static android.view.WindowManagerGlobal.RELAYOUT_RES_CONSUME_ALWAYS_SYSTEM_BARS; import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED; import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED; import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.IME_FOCUS_CONTROLLER; import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.IME_FOCUS_CONTROLLER; import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.INSETS_CONTROLLER; import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.INSETS_CONTROLLER; Loading Loading @@ -278,6 +280,13 @@ public final class ViewRootImpl implements ViewParent, */ */ public static final boolean CAPTION_ON_SHELL = false; public static final boolean CAPTION_ON_SHELL = false; /** * Whether the client should compute the window frame on its own. * @hide */ public static final boolean LOCAL_LAYOUT = SystemProperties.getBoolean("persist.debug.local_layout", false); /** /** * Set this system property to true to force the view hierarchy to render * Set this system property to true to force the view hierarchy to render * at 60 Hz. This can be used to measure the potential framerate. * at 60 Hz. This can be used to measure the potential framerate. Loading Loading @@ -8083,17 +8092,68 @@ public final class ViewRootImpl implements ViewParent, final int requestedWidth = (int) (mView.getMeasuredWidth() * appScale + 0.5f); final int requestedWidth = (int) (mView.getMeasuredWidth() * appScale + 0.5f); final int requestedHeight = (int) (mView.getMeasuredHeight() * appScale + 0.5f); final int requestedHeight = (int) (mView.getMeasuredHeight() * appScale + 0.5f); int relayoutResult = mWindowSession.relayout(mWindow, params, mWillMove = false; mWillResize = false; int relayoutResult = 0; WindowConfiguration winConfig = getConfiguration().windowConfiguration; if (LOCAL_LAYOUT) { if (mFirst || viewVisibility != mViewVisibility) { relayoutResult = mWindowSession.updateVisibility(mWindow, params, viewVisibility, mPendingMergedConfiguration, mSurfaceControl, mTempInsets, mTempControls); if (mTranslator != null) { mTranslator.translateInsetsStateInScreenToAppWindow(mTempInsets); mTranslator.translateSourceControlsInScreenToAppWindow(mTempControls); } mInsetsController.onStateChanged(mTempInsets); mInsetsController.onControlsChanged(mTempControls); mPendingAlwaysConsumeSystemBars = (relayoutResult & RELAYOUT_RES_CONSUME_ALWAYS_SYSTEM_BARS) != 0; } final InsetsState state = mInsetsController.getState(); final Rect displayCutoutSafe = mTempRect; state.getDisplayCutoutSafe(displayCutoutSafe); if (mWindowAttributes.type == TYPE_APPLICATION_STARTING) { // TODO(b/210378379): Remove the special logic. // Letting starting window use the window bounds from the pending config is for the // fixed rotation, because the config is not overridden before the starting window // is created. winConfig = mPendingMergedConfiguration.getMergedConfiguration() .windowConfiguration; } mWindowLayout.computeFrames(mWindowAttributes, state, displayCutoutSafe, winConfig.getBounds(), winConfig.getWindowingMode(), requestedWidth, requestedHeight, mInsetsController.getRequestedVisibilities(), getAttachedWindowFrame(), 1f /* compatScale */, mTmpFrames); mWindowSession.updateLayout(mWindow, params, insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, mTmpFrames, requestedWidth, requestedHeight); } else { relayoutResult = mWindowSession.relayout(mWindow, params, requestedWidth, requestedHeight, viewVisibility, requestedWidth, requestedHeight, viewVisibility, insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, mTmpFrames, mPendingMergedConfiguration, mSurfaceControl, mTempInsets, mTmpFrames, mPendingMergedConfiguration, mSurfaceControl, mTempInsets, mTempControls, mRelayoutBundle); mTempControls, mRelayoutBundle); mSyncSeqId = mRelayoutBundle.getInt("seqid"); mSyncSeqId = mRelayoutBundle.getInt("seqid"); if (mTranslator != null) { mTranslator.translateRectInScreenToAppWindow(mTmpFrames.frame); mTranslator.translateRectInScreenToAppWindow(mTmpFrames.displayFrame); mTranslator.translateInsetsStateInScreenToAppWindow(mTempInsets); mTranslator.translateSourceControlsInScreenToAppWindow(mTempControls); } mInsetsController.onStateChanged(mTempInsets); mInsetsController.onControlsChanged(mTempControls); mPendingAlwaysConsumeSystemBars = (relayoutResult & RELAYOUT_RES_CONSUME_ALWAYS_SYSTEM_BARS) != 0; } final int transformHint = SurfaceControl.rotationToBufferTransform( final int transformHint = SurfaceControl.rotationToBufferTransform( (mDisplayInstallOrientation + mDisplay.getRotation()) % 4); (mDisplayInstallOrientation + mDisplay.getRotation()) % 4); final WindowConfiguration winConfig = getConfiguration().windowConfiguration; WindowLayout.computeSurfaceSize(mWindowAttributes, winConfig.getMaxBounds(), requestedWidth, WindowLayout.computeSurfaceSize(mWindowAttributes, winConfig.getMaxBounds(), requestedWidth, requestedHeight, mTmpFrames.frame, mPendingDragResizing, mSurfaceSize); requestedHeight, mTmpFrames.frame, mPendingDragResizing, mSurfaceSize); Loading Loading @@ -8142,24 +8202,10 @@ public final class ViewRootImpl implements ViewParent, destroySurface(); destroySurface(); } } mPendingAlwaysConsumeSystemBars = (relayoutResult & WindowManagerGlobal.RELAYOUT_RES_CONSUME_ALWAYS_SYSTEM_BARS) != 0; if (restore) { if (restore) { params.restore(); params.restore(); } } if (mTranslator != null) { mTranslator.translateRectInScreenToAppWindow(mTmpFrames.frame); mTranslator.translateRectInScreenToAppWindow(mTmpFrames.displayFrame); mTranslator.translateInsetsStateInScreenToAppWindow(mTempInsets); mTranslator.translateSourceControlsInScreenToAppWindow(mTempControls); } setFrame(mTmpFrames.frame); setFrame(mTmpFrames.frame); mWillMove = false; mWillResize = false; mInsetsController.onStateChanged(mTempInsets); mInsetsController.onControlsChanged(mTempControls); return relayoutResult; return relayoutResult; } } Loading
core/java/android/view/WindowlessWindowManager.java +15 −0 Original line number Original line Diff line number Diff line Loading @@ -335,6 +335,21 @@ public class WindowlessWindowManager implements IWindowSession { return 0; return 0; } } @Override public int updateVisibility(IWindow window, WindowManager.LayoutParams inAttrs, int viewVisibility, MergedConfiguration outMergedConfiguration, SurfaceControl outSurfaceControl, InsetsState outInsetsState, InsetsSourceControl[] outActiveControls) { // TODO(b/161810301): Finish the implementation. return 0; } @Override public void updateLayout(IWindow window, WindowManager.LayoutParams inAttrs, int flags, ClientWindowFrames clientWindowFrames, int requestedWidth, int requestedHeight) { // TODO(b/161810301): Finish the implementation. } @Override @Override public void prepareToReplaceWindows(android.os.IBinder appToken, boolean childrenOnly) { public void prepareToReplaceWindows(android.os.IBinder appToken, boolean childrenOnly) { } } Loading
services/core/java/com/android/server/wm/Session.java +25 −0 Original line number Original line Diff line number Diff line Loading @@ -116,6 +116,8 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { private float mLastReportedAnimatorScale; private float mLastReportedAnimatorScale; private String mPackageName; private String mPackageName; private String mRelayoutTag; private String mRelayoutTag; private String mUpdateViewVisibilityTag; private String mUpdateWindowLayoutTag; private final InsetsVisibilities mDummyRequestedVisibilities = new InsetsVisibilities(); private final InsetsVisibilities mDummyRequestedVisibilities = new InsetsVisibilities(); private final InsetsSourceControl[] mDummyControls = new InsetsSourceControl[0]; private final InsetsSourceControl[] mDummyControls = new InsetsSourceControl[0]; final boolean mSetsUnrestrictedKeepClearAreas; final boolean mSetsUnrestrictedKeepClearAreas; Loading Loading @@ -222,6 +224,27 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { mService.removeWindow(this, window); mService.removeWindow(this, window); } } @Override public int updateVisibility(IWindow client, WindowManager.LayoutParams attrs, int viewVisibility, MergedConfiguration outMergedConfiguration, SurfaceControl outSurfaceControl, InsetsState outInsetsState, InsetsSourceControl[] outActiveControls) { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, mUpdateViewVisibilityTag); int res = mService.updateViewVisibility(this, client, attrs, viewVisibility, outMergedConfiguration, outSurfaceControl, outInsetsState, outActiveControls); Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); return res; } @Override public void updateLayout(IWindow window, WindowManager.LayoutParams attrs, int flags, ClientWindowFrames clientFrames, int requestedWidth, int requestedHeight) { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, mUpdateWindowLayoutTag); mService.updateWindowLayout(this, window, attrs, flags, clientFrames, requestedWidth, requestedHeight); Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); } @Override @Override public void prepareToReplaceWindows(IBinder appToken, boolean childrenOnly) { public void prepareToReplaceWindows(IBinder appToken, boolean childrenOnly) { mService.setWillReplaceWindows(appToken, childrenOnly); mService.setWillReplaceWindows(appToken, childrenOnly); Loading Loading @@ -689,6 +712,8 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { if (wpc != null) { if (wpc != null) { mPackageName = wpc.mInfo.packageName; mPackageName = wpc.mInfo.packageName; mRelayoutTag = "relayoutWindow: " + mPackageName; mRelayoutTag = "relayoutWindow: " + mPackageName; mUpdateViewVisibilityTag = "updateVisibility: " + mPackageName; mUpdateWindowLayoutTag = "updateLayout: " + mPackageName; } else { } else { Slog.e(TAG_WM, "Unknown process pid=" + mPid); Slog.e(TAG_WM, "Unknown process pid=" + mPid); } } Loading