diff options
author | 2025-04-16 09:11:31 -0700 | |
---|---|---|
committer | 2025-04-16 09:11:31 -0700 | |
commit | 4341e620bf1c066c40e4633acc65f1e897af48a0 (patch) | |
tree | 9b6a3d00a7c706cb4efb4a953b58a71b9acf2bdb | |
parent | 4e4f936919d742a9d76357bafbf84a664c2b6c00 (diff) | |
parent | 99a4bd6cfa71439a0e2e385c9d1cf85955f6388b (diff) |
Merge cherrypicks of ['googleplex-android-review.googlesource.com/32753793', 'googleplex-android-review.googlesource.com/32754356', 'googleplex-android-review.googlesource.com/32627908'] into 25Q2-release.
Change-Id: I4f68886629a85d4c404dfc7e276b1ab2363c50b4
16 files changed, 190 insertions, 190 deletions
diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index df3b8baa40c8..31143a559060 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -21,6 +21,7 @@ import static android.service.dreams.Flags.dreamHandlesBeingObscured; import static android.service.dreams.Flags.dreamHandlesConfirmKeys; import static android.service.dreams.Flags.startAndStopDozingInBackground; +import android.Manifest; import android.annotation.FlaggedApi; import android.annotation.IdRes; import android.annotation.IntDef; @@ -254,7 +255,6 @@ public class DreamService extends Service implements Window.Callback { "android.service.dream.DreamService.dream_overlay_component"; private final IDreamManager mDreamManager; - private final Handler mHandler; private IBinder mDreamToken; private Window mWindow; private Activity mActivity; @@ -323,19 +323,87 @@ public class DreamService extends Service implements Window.Callback { /** Returns the associated service info */ ServiceInfo getServiceInfo(); - /** Returns the handler to be used for any posted operation */ - Handler getHandler(); - /** Returns the package manager */ PackageManager getPackageManager(); /** Returns the resources */ Resources getResources(); + + /** Returns a specialized handler to ensure Runnables are not suspended */ + WakefulHandler getWakefulHandler(); + } + + /** + * {@link WakefulHandler} is an interface for defining an object that helps post work without + * being interrupted by doze state. + * + * @hide + */ + public interface WakefulHandler { + /** Posts a {@link Runnable} to be ran on the underlying {@link Handler}. */ + void post(Runnable r); + + /** + * Returns the underlying {@link Handler}. Should only be used for passing the handler into + * a function and not for directly calling methods on it. + */ + Handler getHandler(); + } + + /** + * {@link WakefulHandlerImpl} ensures work on a handler is not suspended by wrapping the call + * with a partial wakelock. Note that this is only needed for Doze DreamService implementations. + * In this case, the component should have wake lock permissions. When such permission is not + * available, this class behaves like an ordinary handler. + */ + private static final class WakefulHandlerImpl implements WakefulHandler { + private static final String SERVICE_HANDLER_WAKE_LOCK_TAG = "dream:service:handler"; + private Context mContext; + private Handler mHandler; + + private PowerManager.WakeLock mWakeLock; + + private PowerManager.WakeLock getWakeLock() { + if (mContext.checkCallingOrSelfPermission(Manifest.permission.WAKE_LOCK) + != PERMISSION_GRANTED) { + return null; + } + + final PowerManager powerManager = mContext.getSystemService(PowerManager.class); + + if (powerManager == null) { + return null; + } + + return powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, + SERVICE_HANDLER_WAKE_LOCK_TAG); + } + + WakefulHandlerImpl(Context context) { + mContext = context; + mHandler = new Handler(Looper.getMainLooper()); + mWakeLock = getWakeLock(); + } + + @Override + public void post(Runnable r) { + if (mWakeLock != null) { + mHandler.post(mWakeLock.wrap(r)); + } else { + mHandler.post(r); + } + } + + @Override + public Handler getHandler() { + return mHandler; + } } private static final class DefaultInjector implements Injector { private Context mContext; private Class<?> mClassName; + private WakefulHandler mWakefulHandler; public void init(Context context) { mContext = context; @@ -346,8 +414,6 @@ public class DreamService extends Service implements Window.Callback { public DreamOverlayConnectionHandler createOverlayConnection( ComponentName overlayComponent, Runnable onDisconnected) { - final Resources resources = mContext.getResources(); - return new DreamOverlayConnectionHandler( /* context= */ mContext, Looper.getMainLooper(), @@ -381,8 +447,14 @@ public class DreamService extends Service implements Window.Callback { } @Override - public Handler getHandler() { - return new Handler(Looper.getMainLooper()); + public WakefulHandler getWakefulHandler() { + synchronized (this) { + if (mWakefulHandler == null) { + mWakefulHandler = new WakefulHandlerImpl(mContext); + } + } + + return mWakefulHandler; } @Override @@ -394,7 +466,6 @@ public class DreamService extends Service implements Window.Callback { public Resources getResources() { return mContext.getResources(); } - } public DreamService() { @@ -412,7 +483,6 @@ public class DreamService extends Service implements Window.Callback { mInjector = injector; mInjector.init(this); mDreamManager = mInjector.getDreamManager(); - mHandler = mInjector.getHandler(); } /** @@ -925,11 +995,17 @@ public class DreamService extends Service implements Window.Callback { } } + private void post(Runnable runnable) { + // The handler is based on the populated context is not ready at construction time. + // therefore we fetch on demand. + mInjector.getWakefulHandler().post(runnable); + } + /** * Updates doze state. Note that this must be called on the mHandler. */ private void updateDoze() { - mHandler.post(() -> { + post(() -> { if (mDreamToken == null) { Slog.w(mTag, "Updating doze without a dream token."); return; @@ -971,7 +1047,7 @@ public class DreamService extends Service implements Window.Callback { */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) public void stopDozing() { - mHandler.post(() -> { + post(() -> { if (mDreamToken == null) { return; } @@ -1211,13 +1287,23 @@ public class DreamService extends Service implements Window.Callback { mOverlayCallback = new IDreamOverlayCallback.Stub() { @Override public void onExitRequested() { - // Simply finish dream when exit is requested. - mHandler.post(() -> finishInternal()); + final long token = Binder.clearCallingIdentity(); + try { + // Simply finish dream when exit is requested. + post(() -> finishInternal()); + } finally { + Binder.restoreCallingIdentity(token); + } } @Override public void onRedirectWake(boolean redirect) { - mRedirectWake = redirect; + final long token = Binder.clearCallingIdentity(); + try { + mRedirectWake = redirect; + } finally { + Binder.restoreCallingIdentity(token); + } } }; @@ -1310,7 +1396,7 @@ public class DreamService extends Service implements Window.Callback { * </p> */ public final void finish() { - mHandler.post(this::finishInternal); + post(this::finishInternal); } private void finishInternal() { @@ -1372,7 +1458,7 @@ public class DreamService extends Service implements Window.Callback { * </p> */ public final void wakeUp() { - mHandler.post(()-> wakeUp(false)); + post(()-> wakeUp(false)); } /** @@ -1821,7 +1907,8 @@ public class DreamService extends Service implements Window.Callback { @Override protected void dump(final FileDescriptor fd, PrintWriter pw, final String[] args) { - DumpUtils.dumpAsync(mHandler, (pw1, prefix) -> dumpOnHandler(fd, pw1, args), pw, "", 1000); + DumpUtils.dumpAsync(mInjector.getWakefulHandler().getHandler(), + (pw1, prefix) -> dumpOnHandler(fd, pw1, args), pw, "", 1000); } /** @hide */ @@ -1877,31 +1964,52 @@ public class DreamService extends Service implements Window.Callback { return; } - service.mHandler.post(() -> consumer.accept(service)); + service.post(() -> consumer.accept(service)); } @Override public void attach(final IBinder dreamToken, final boolean canDoze, final boolean isPreviewMode, IRemoteCallback started) { - post(dreamService -> dreamService.attach(dreamToken, canDoze, isPreviewMode, started)); + final long token = Binder.clearCallingIdentity(); + try { + post(dreamService -> dreamService.attach(dreamToken, canDoze, isPreviewMode, + started)); + } finally { + Binder.restoreCallingIdentity(token); + } } @Override public void detach() { - post(DreamService::detach); + final long token = Binder.clearCallingIdentity(); + try { + post(DreamService::detach); + } finally { + Binder.restoreCallingIdentity(token); + } } @Override public void wakeUp() { - post(dreamService -> dreamService.wakeUp(true /*fromSystem*/)); + final long token = Binder.clearCallingIdentity(); + try { + post(dreamService -> dreamService.wakeUp(true /*fromSystem*/)); + } finally { + Binder.restoreCallingIdentity(token); + } } @Override public void comeToFront() { - if (!dreamHandlesBeingObscured()) { - return; + final long token = Binder.clearCallingIdentity(); + try { + if (!dreamHandlesBeingObscured()) { + return; + } + post(DreamService::comeToFront); + } finally { + Binder.restoreCallingIdentity(token); } - post(DreamService::comeToFront); } } diff --git a/core/java/android/view/ISurfaceControlViewHost.aidl b/core/java/android/view/ISurfaceControlViewHost.aidl index 83aceb3f9a7d..fd4b329570d9 100644 --- a/core/java/android/view/ISurfaceControlViewHost.aidl +++ b/core/java/android/view/ISurfaceControlViewHost.aidl @@ -21,7 +21,6 @@ import android.graphics.Rect; import android.view.InsetsState; import android.view.ISurfaceControlViewHostParent; import android.window.ISurfaceSyncGroup; -import android.window.InputTransferToken; /** * API from content embedder back to embedded content in SurfaceControlViewHost @@ -33,7 +32,6 @@ interface ISurfaceControlViewHost { * APIs that are blocking */ oneway void onConfigurationChanged(in Configuration newConfig); - oneway void onDispatchAttachedToWindow(in InputTransferToken token); oneway void onDispatchDetachedFromWindow(); oneway void onInsetsChanged(in InsetsState state, in Rect insetFrame); ISurfaceSyncGroup getSurfaceSyncGroup(); diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl index a029303611c0..ab656ebc6492 100644 --- a/core/java/android/view/IWindowSession.aidl +++ b/core/java/android/view/IWindowSession.aidl @@ -313,9 +313,8 @@ interface IWindowSession { /** * Update the flags on an input channel associated with a particular surface. */ - oneway void updateInputChannel(in IBinder channelToken, - in @nullable InputTransferToken hostInputTransferToken, - int displayId, in SurfaceControl surface, int flags, int privateFlags, int inputFeatures, + oneway void updateInputChannel(in IBinder channelToken, int displayId, + in SurfaceControl surface, int flags, int privateFlags, int inputFeatures, in Region region); /** diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java index ecbf1f65f810..04ec4d0d382d 100644 --- a/core/java/android/view/SurfaceControlViewHost.java +++ b/core/java/android/view/SurfaceControlViewHost.java @@ -79,20 +79,6 @@ public class SurfaceControlViewHost { } @Override - public void onDispatchAttachedToWindow(InputTransferToken hostInputTransferToken) { - boolean hostInputTransferTokenChanged = - !Objects.equals(hostInputTransferToken, mWm.mHostInputTransferToken); - if (!hostInputTransferTokenChanged) { - return; - } - - mWm.setHostInputTransferToken(hostInputTransferToken); - if (mViewRoot != null && mViewRoot.mView != null) { - mWm.updateInputChannel(getWindowToken().asBinder()); - } - } - - @Override public void onDispatchDetachedFromWindow() { if (mViewRoot == null) { return; diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 94e9aa709369..29008d31990d 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -16,7 +16,6 @@ package android.view; - import static android.view.flags.Flags.FLAG_DEPRECATE_SURFACE_VIEW_Z_ORDER_APIS; import static android.view.flags.Flags.FLAG_SURFACE_VIEW_GET_SURFACE_PACKAGE; import static android.view.flags.Flags.FLAG_SURFACE_VIEW_SET_COMPOSITION_ORDER; @@ -24,8 +23,6 @@ import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; import static android.view.WindowManagerPolicyConstants.APPLICATION_MEDIA_OVERLAY_SUBLAYER; import static android.view.WindowManagerPolicyConstants.APPLICATION_MEDIA_SUBLAYER; import static android.view.WindowManagerPolicyConstants.APPLICATION_PANEL_SUBLAYER; -import static android.view.flags.Flags.FLAG_SURFACE_VIEW_GET_SURFACE_PACKAGE; -import static android.view.flags.Flags.FLAG_SURFACE_VIEW_SET_COMPOSITION_ORDER; import android.annotation.FlaggedApi; import android.annotation.FloatRange; @@ -62,7 +59,6 @@ import android.util.Log; import android.view.SurfaceControl.Transaction; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.IAccessibilityEmbeddedConnection; -import android.window.InputTransferToken; import android.window.SurfaceSyncGroup; import com.android.graphics.hwui.flags.Flags; @@ -351,7 +347,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall sv.mSurfacePackage.getRemoteInterface().attachParentInterface(this); mSurfaceView = sv; } catch (RemoteException e) { - Log.d(TAG, "Failed to attach parent interface to SCVH. Likely SCVH is already " + Log.d(TAG, "Failed to attach parent interface to SCVH. Likely SCVH is alraedy " + "dead."); } } @@ -496,37 +492,10 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall mTag = "SV[" + System.identityHashCode(this) + windowName + "]"; } - private void dispatchScvhAttachedToHost() { - final ViewRootImpl viewRoot = getViewRootImpl(); - if (viewRoot == null) { - return; - } - - IBinder inputToken = viewRoot.getInputToken(); - if (inputToken == null) { - // We don't have an input channel so we can't transfer focus or active - // touch gestures to embedded. - return; - } - - try { - mSurfacePackage - .getRemoteInterface() - .onDispatchAttachedToWindow(new InputTransferToken(inputToken)); - } catch (RemoteException e) { - Log.d(TAG, - "Failed to onDispatchAttachedToWindow to SCVH. Likely SCVH is already " - + "dead."); - } - } - @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); setTag(); - if (mSurfacePackage != null) { - dispatchScvhAttachedToHost(); - } getViewRootImpl().addSurfaceChangedCallback(this); mWindowStopped = false; mViewVisibility = getVisibility() == VISIBLE; @@ -2220,7 +2189,6 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall applyTransactionOnVriDraw(transaction); } mSurfacePackage = p; - dispatchScvhAttachedToHost(); mSurfaceControlViewHostParent.attach(this); if (isFocused()) { diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index b1676dde3b70..2d62ed8c3ffc 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -37,8 +37,8 @@ import static android.view.Surface.FRAME_RATE_CATEGORY_HIGH_HINT; import static android.view.Surface.FRAME_RATE_CATEGORY_LOW; import static android.view.Surface.FRAME_RATE_CATEGORY_NORMAL; import static android.view.Surface.FRAME_RATE_CATEGORY_NO_PREFERENCE; -import static android.view.Surface.FRAME_RATE_COMPATIBILITY_AT_LEAST; import static android.view.Surface.FRAME_RATE_COMPATIBILITY_FIXED_SOURCE; +import static android.view.Surface.FRAME_RATE_COMPATIBILITY_AT_LEAST; import static android.view.View.FRAME_RATE_CATEGORY_REASON_BOOST; import static android.view.View.FRAME_RATE_CATEGORY_REASON_CONFLICTED; import static android.view.View.FRAME_RATE_CATEGORY_REASON_INTERMITTENT; @@ -2704,8 +2704,7 @@ public final class ViewRootImpl implements ViewParent, mStopped = stopped; final ThreadedRenderer renderer = mAttachInfo.mThreadedRenderer; if (renderer != null) { - if (DEBUG_DRAW) - Log.d(mTag, "WindowStopped on " + getTitle() + " set to " + mStopped); + if (DEBUG_DRAW) Log.d(mTag, "WindowStopped on " + getTitle() + " set to " + mStopped); renderer.setStopped(mStopped); } if (!mStopped) { diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java index 5af4abd1f608..a5ab917c267d 100644 --- a/core/java/android/view/WindowlessWindowManager.java +++ b/core/java/android/view/WindowlessWindowManager.java @@ -89,7 +89,7 @@ public class WindowlessWindowManager implements IWindowSession { protected final SurfaceControl mRootSurface; private final Configuration mConfiguration; private final IWindowSession mRealWm; - InputTransferToken mHostInputTransferToken; + final InputTransferToken mHostInputTransferToken; private final InputTransferToken mInputTransferToken = new InputTransferToken(); private InsetsState mInsetsState; private final ClientWindowFrames mTmpFrames = new ClientWindowFrames(); @@ -128,11 +128,9 @@ public class WindowlessWindowManager implements IWindowSession { return null; } - void setHostInputTransferToken(InputTransferToken token) { - mHostInputTransferToken = token; - } - - /** Utility API. */ + /** + * Utility API. + */ void setCompletionCallback(IBinder window, ResizeCompleteCallback callback) { if (mResizeCompletionForWindow.get(window) != null) { Log.w(TAG, "Unsupported overlapping resizes"); @@ -153,25 +151,11 @@ public class WindowlessWindowManager implements IWindowSession { return; } state.mInputRegion = region != null ? new Region(region) : null; - updateInputChannel(window); - } - } - - protected void updateInputChannel(IBinder window) { - State state; - synchronized (this) { - // Do everything while locked so that we synchronize with relayout. This should be a - // very infrequent operation. - state = mStateForWindow.get(window); - if (state == null) { - return; - } if (state.mInputChannelToken != null) { try { - mRealWm.updateInputChannel(state.mInputChannelToken, mHostInputTransferToken, - state.mDisplayId, state.mSurfaceControl, state.mParams.flags, - state.mParams.privateFlags, state.mParams.inputFeatures, - state.mInputRegion); + mRealWm.updateInputChannel(state.mInputChannelToken, state.mDisplayId, + state.mSurfaceControl, state.mParams.flags, state.mParams.privateFlags, + state.mParams.inputFeatures, state.mInputRegion); } catch (RemoteException e) { Log.e(TAG, "Failed to update surface input channel: ", e); } @@ -190,7 +174,9 @@ public class WindowlessWindowManager implements IWindowSession { } } - /** IWindowSession implementation. */ + /** + * IWindowSession implementation. + */ @Override public int addToDisplay(IWindow window, WindowManager.LayoutParams attrs, int viewVisibility, int displayId, @InsetsType int requestedVisibleTypes, @@ -451,15 +437,14 @@ public class WindowlessWindowManager implements IWindowSession { if ((attrChanges & inputChangeMask) != 0 && state.mInputChannelToken != null) { try { if (mRealWm instanceof IWindowSession.Stub) { - mRealWm.updateInputChannel(state.mInputChannelToken, mHostInputTransferToken, - state.mDisplayId, + mRealWm.updateInputChannel(state.mInputChannelToken, state.mDisplayId, new SurfaceControl(sc, "WindowlessWindowManager.relayout"), attrs.flags, attrs.privateFlags, attrs.inputFeatures, state.mInputRegion); } else { - mRealWm.updateInputChannel(state.mInputChannelToken, mHostInputTransferToken, - state.mDisplayId, sc, attrs.flags, attrs.privateFlags, - attrs.inputFeatures, state.mInputRegion); + mRealWm.updateInputChannel(state.mInputChannelToken, state.mDisplayId, sc, + attrs.flags, attrs.privateFlags, attrs.inputFeatures, + state.mInputRegion); } } catch (RemoteException e) { Log.e(TAG, "Failed to update surface input channel: ", e); @@ -639,9 +624,8 @@ public class WindowlessWindowManager implements IWindowSession { } @Override - public void updateInputChannel(IBinder channelToken, InputTransferToken hostInputToken, - int displayId, SurfaceControl surface, int flags, int privateFlags, int inputFeatures, - Region region) { + public void updateInputChannel(IBinder channelToken, int displayId, SurfaceControl surface, + int flags, int privateFlags, int inputFeatures, Region region) { } @Override diff --git a/core/java/android/window/flags/window_surfaces.aconfig b/core/java/android/window/flags/window_surfaces.aconfig index 7550a6360ee9..d2901a4a5d74 100644 --- a/core/java/android/window/flags/window_surfaces.aconfig +++ b/core/java/android/window/flags/window_surfaces.aconfig @@ -126,15 +126,3 @@ flag { purpose: PURPOSE_BUGFIX } } - -flag { - name: "update_host_input_transfer_token" - namespace: "window_surfaces" - description: "Update host InpuTransferToken on view attach" - is_fixed_read_only: true - is_exported: true - bug: "392965431" - metadata { - purpose: PURPOSE_BUGFIX - } -}
\ No newline at end of file diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterbox/LetterboxInputDetector.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterbox/LetterboxInputDetector.kt index bcbe123eb5e6..812cc0161aae 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterbox/LetterboxInputDetector.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterbox/LetterboxInputDetector.kt @@ -167,7 +167,6 @@ class LetterboxInputDetector( windowSession.updateInputChannel( inputChannel.token, - null /* hostInputTransferToken */, displayId, inputSurface, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java index 97a47c602bcd..c2b8c55fb0ef 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java @@ -23,12 +23,12 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERL import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_CONSUMER; -import static com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ResizeTrigger; import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE; import static com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_BOTTOM; import static com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_LEFT; import static com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_RIGHT; import static com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_TOP; +import static com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ResizeTrigger; import static com.android.wm.shell.windowdecor.DragResizeWindowGeometry.isEdgeResizePermitted; import static com.android.wm.shell.windowdecor.DragResizeWindowGeometry.isEventFromTouchscreen; @@ -342,7 +342,6 @@ class DragResizeInputListener implements AutoCloseable { try { mWindowSession.updateInputChannel( mInputChannel.getToken(), - null /* hostInputToken */, mDisplayId, mDecorationSurface, FLAG_NOT_FOCUSABLE, @@ -384,7 +383,6 @@ class DragResizeInputListener implements AutoCloseable { try { mWindowSession.updateInputChannel( mSinkInputChannel.getToken(), - null /* hostInputToken */, mDisplayId, mInputSinkSurface, FLAG_NOT_FOCUSABLE, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxInputControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxInputControllerTest.kt index 9c45cd22db19..43b934cfbe27 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxInputControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxInputControllerTest.kt @@ -192,7 +192,6 @@ class LetterboxInputControllerTest : ShellTestCase() { fun checkUpdateSessionRegion(times: Int = 1, displayId: Int = DISPLAY_ID, region: Region) { verify(windowSession, times(times)).updateInputChannel( any(), - anyOrNull(), eq(displayId), any(), any(), diff --git a/services/core/java/com/android/server/wm/EmbeddedWindowController.java b/services/core/java/com/android/server/wm/EmbeddedWindowController.java index 1bf65d1e3536..7104c7e22a4e 100644 --- a/services/core/java/com/android/server/wm/EmbeddedWindowController.java +++ b/services/core/java/com/android/server/wm/EmbeddedWindowController.java @@ -240,10 +240,9 @@ class EmbeddedWindowController { static class EmbeddedWindow implements InputTarget { final IBinder mClient; - @Nullable WindowState mHostWindowState; + @Nullable final WindowState mHostWindowState; @Nullable final ActivityRecord mHostActivityRecord; - String mName; - final String mInputHandleName; + final String mName; final int mOwnerUid; final int mOwnerPid; final WindowManagerService mWmService; @@ -281,12 +280,13 @@ class EmbeddedWindowController { * @param displayId used for focus requests */ EmbeddedWindow(Session session, WindowManagerService service, IBinder clientToken, - @Nullable WindowState hostWindowState, int ownerUid, int ownerPid, - int windowType, int displayId, InputTransferToken inputTransferToken, - String inputHandleName, boolean isFocusable) { + WindowState hostWindowState, int ownerUid, int ownerPid, int windowType, + int displayId, InputTransferToken inputTransferToken, String inputHandleName, + boolean isFocusable) { mSession = session; mWmService = service; mClient = clientToken; + mHostWindowState = hostWindowState; mHostActivityRecord = (mHostWindowState != null) ? mHostWindowState.mActivityRecord : null; mOwnerUid = ownerUid; @@ -294,9 +294,11 @@ class EmbeddedWindowController { mWindowType = windowType; mDisplayId = displayId; mInputTransferToken = inputTransferToken; + final String hostWindowName = + (mHostWindowState != null) ? "-" + mHostWindowState.getWindowTag().toString() + : ""; mIsFocusable = isFocusable; - mInputHandleName = inputHandleName; - updateHost(hostWindowState); + mName = "Embedded{" + inputHandleName + hostWindowName + "}"; } @Override @@ -485,19 +487,5 @@ class EmbeddedWindowController { proto.end(token2); proto.end(token); } - - public void updateHost(WindowState hostWindowState) { - if (mHostWindowState == hostWindowState && mName != null) { - return; - } - - ProtoLog.d(WM_DEBUG_EMBEDDED_WINDOWS, "[%s] Updated host window from %s to %s", - this, mHostWindowState, hostWindowState); - mHostWindowState = hostWindowState; - final String hostWindowName = - (mHostWindowState != null) ? "-" + mHostWindowState.getWindowTag().toString() - : ""; - mName = "Embedded{" + mInputHandleName + hostWindowName + "}"; - } } } diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index c5b47f9f4256..390132445ba8 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -916,16 +916,10 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { int privateFlags, int inputFeatures, int type, IBinder windowToken, InputTransferToken inputTransferToken, String inputHandleName, InputChannel outInputChannel) { - if (!Flags.updateHostInputTransferToken()) { - // This is not a valid security check, callers can pass in a bogus token. If the - // token is not known to wm, then input APIs is request focus or transferTouchGesture - // will fail. Removing this check allows SCVH to be created before associating with a - // host window. - if (hostInputTransferToken == null && !mCanAddInternalSystemWindow) { - // Callers without INTERNAL_SYSTEM_WINDOW permission cannot grant input channel to - // embedded windows without providing a host window input token - throw new SecurityException("Requires INTERNAL_SYSTEM_WINDOW permission"); - } + if (hostInputTransferToken == null && !mCanAddInternalSystemWindow) { + // Callers without INTERNAL_SYSTEM_WINDOW permission cannot grant input channel to + // embedded windows without providing a host window input token + throw new SecurityException("Requires INTERNAL_SYSTEM_WINDOW permission"); } final long identity = Binder.clearCallingIdentity(); @@ -940,14 +934,12 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { } @Override - public void updateInputChannel(IBinder channelToken, - @Nullable InputTransferToken hostInputTransferToken, - int displayId, SurfaceControl surface, + public void updateInputChannel(IBinder channelToken, int displayId, SurfaceControl surface, int flags, int privateFlags, int inputFeatures, Region region) { final long identity = Binder.clearCallingIdentity(); try { - mService.updateInputChannel(channelToken, hostInputTransferToken, displayId, surface, - flags, mCanAddInternalSystemWindow ? privateFlags : 0, inputFeatures, region); + mService.updateInputChannel(channelToken, displayId, surface, flags, + mCanAddInternalSystemWindow ? privateFlags : 0, inputFeatures, region); } finally { Binder.restoreCallingIdentity(identity); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index aa5eb33d8069..d25987028199 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -9418,12 +9418,10 @@ public class WindowManagerService extends IWindowManager.Stub /** * Updates the flags on an existing surface's input channel. This assumes the surface provided - * is the one associated with the provided input-channel. If this isn't the case, behavior is - * undefined. + * is the one associated with the provided input-channel. If this isn't the case, behavior + * is undefined. */ - void updateInputChannel(IBinder channelToken, - @Nullable InputTransferToken hostInputTransferToken, int displayId, - SurfaceControl surface, + void updateInputChannel(IBinder channelToken, int displayId, SurfaceControl surface, int flags, int privateFlags, int inputFeatures, Region region) { final InputApplicationHandle applicationHandle; final String name; @@ -9437,11 +9435,6 @@ public class WindowManagerService extends IWindowManager.Stub name = win.toString(); applicationHandle = win.getApplicationHandle(); win.setIsFocusable((flags & FLAG_NOT_FOCUSABLE) == 0); - if (Flags.updateHostInputTransferToken()) { - WindowState hostWindowState = hostInputTransferToken != null - ? mInputToWindowMap.get(hostInputTransferToken.getToken()) : null; - win.updateHost(hostWindowState); - } } updateInputChannel(channelToken, win.mOwnerUid, win.mOwnerPid, displayId, surface, name, diff --git a/services/tests/dreamservicetests/src/com/android/server/dreams/TestDreamEnvironment.java b/services/tests/dreamservicetests/src/com/android/server/dreams/TestDreamEnvironment.java index 586ff52aa78c..a16d463cae71 100644 --- a/services/tests/dreamservicetests/src/com/android/server/dreams/TestDreamEnvironment.java +++ b/services/tests/dreamservicetests/src/com/android/server/dreams/TestDreamEnvironment.java @@ -33,7 +33,6 @@ import android.content.pm.ServiceInfo; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; -import android.os.Handler; import android.os.IBinder; import android.os.IRemoteCallback; import android.os.Looper; @@ -176,7 +175,9 @@ public class TestDreamEnvironment { @Mock private ServiceInfo mServiceInfo; - private final Handler mHandler; + @Mock + private DreamService.WakefulHandler mWakefulHandler; + private final IDreamManager mDreamManager; private final DreamOverlayConnectionHandler mDreamOverlayConnectionHandler; @@ -185,7 +186,6 @@ public class TestDreamEnvironment { DreamOverlayConnectionHandler dreamOverlayConnectionHandler, boolean shouldShowComplications) { MockitoAnnotations.initMocks(this); - mHandler = new Handler(looper); mDreamManager = dreamManager; mDreamOverlayConnectionHandler = dreamOverlayConnectionHandler; mServiceInfo.packageName = FAKE_DREAM_PACKAGE_NAME; @@ -198,6 +198,10 @@ public class TestDreamEnvironment { .thenReturn(FAKE_DREAM_SETTINGS_ACTIVITY); when(mPackageManager.extractPackageItemInfoAttributes(any(), any(), any(), any())) .thenReturn(mAttributes); + doAnswer(invocation -> { + ((Runnable) invocation.getArgument(0)).run(); + return null; + }).when(mWakefulHandler).post(any()); } @Override public void init(Context context) { @@ -235,11 +239,6 @@ public class TestDreamEnvironment { } @Override - public Handler getHandler() { - return mHandler; - } - - @Override public PackageManager getPackageManager() { return mPackageManager; } @@ -248,6 +247,11 @@ public class TestDreamEnvironment { public Resources getResources() { return mResources; } + + @Override + public DreamService.WakefulHandler getWakefulHandler() { + return mWakefulHandler; + } } @Mock diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java index 7836ca7d1b4d..9645e184d99c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java @@ -1147,8 +1147,7 @@ public class WindowManagerServiceTests extends WindowTestsBase { argThat(h -> (h.inputConfig & InputConfig.SPY) == 0)); assertThrows(IllegalArgumentException.class, () -> - mWm.updateInputChannel(inputChannel.getToken(), null /* hostInputToken */, - DEFAULT_DISPLAY, surfaceControl, + mWm.updateInputChannel(inputChannel.getToken(), DEFAULT_DISPLAY, surfaceControl, FLAG_NOT_FOCUSABLE, PRIVATE_FLAG_TRUSTED_OVERLAY, INPUT_FEATURE_SPY, null /* region */)); } @@ -1171,8 +1170,7 @@ public class WindowManagerServiceTests extends WindowTestsBase { eq(surfaceControl), argThat(h -> (h.inputConfig & InputConfig.SPY) == 0)); - mWm.updateInputChannel(inputChannel.getToken(), null /* hostInputToken */, - DEFAULT_DISPLAY, surfaceControl, + mWm.updateInputChannel(inputChannel.getToken(), DEFAULT_DISPLAY, surfaceControl, FLAG_NOT_FOCUSABLE, PRIVATE_FLAG_TRUSTED_OVERLAY, INPUT_FEATURE_SPY, null /* region */); verify(mTransaction).setInputWindowInfo( @@ -1199,8 +1197,7 @@ public class WindowManagerServiceTests extends WindowTestsBase { eq(surfaceControl), argThat(h -> (h.inputConfig & InputConfig.SENSITIVE_FOR_PRIVACY) == 0)); - mWm.updateInputChannel(inputChannel.getToken(), null /* hostInputToken */, - DEFAULT_DISPLAY, surfaceControl, + mWm.updateInputChannel(inputChannel.getToken(), DEFAULT_DISPLAY, surfaceControl, FLAG_NOT_FOCUSABLE, PRIVATE_FLAG_TRUSTED_OVERLAY, INPUT_FEATURE_SENSITIVE_FOR_PRIVACY, null /* region */); |