From 8bf4362d5e3602af509887fbbf161dcda9edd60f Mon Sep 17 00:00:00 2001 From: brycelee Date: Fri, 28 Mar 2025 02:51:07 +0000 Subject: Clear Binder identity on calls into DreamService. There are multiple entry points where DreamService is accessed by the either the System or SystemUI. In these cases, the Binder identity should be cleared to prevent the DreamService implementation from running in an elevated state. Test: atest DreamServiceTest Fixed: 406895224 Flag: EXEMPT bugfix (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:c027f365a60228be94ed1323641752ef11566e64) Merged-In: I8e76f590d6f65ae689f5220b233b7197f2e731b4 Change-Id: I8e76f590d6f65ae689f5220b233b7197f2e731b4 --- core/java/android/service/dreams/DreamService.java | 49 ++++++++++++++++++---- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index df3b8baa40c8..50a646284a8e 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -1211,13 +1211,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. + mHandler.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); + } } }; @@ -1883,25 +1893,46 @@ public class DreamService extends Service implements Window.Callback { @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); } } -- cgit v1.2.3-59-g8ed1b From 2e5169f5b17ed6002ca58f705ea0b7ec8014bf97 Mon Sep 17 00:00:00 2001 From: brycelee Date: Thu, 27 Mar 2025 22:28:01 +0000 Subject: Ensure dream logic is not suspended on handler. It is possible for work to be queued on a handler and then suspended in doze mode. This can cause dream operations to be noticeably deferred. In order to address this, a wake lock is now acquired in this scenario and wraps these calls on the handler. Note that in the normal, non-doze dream case, the wakelock is not necessary. Bug: 404420534 Flag: EXEMPT bugfix Test: atest DreamServiceTest (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:d958722427762581b9a39b3518d21334e063d99b) Merged-In: Ib7802e951ea793ca4484ef19972a9f2aed4bfd81 Change-Id: Ib7802e951ea793ca4484ef19972a9f2aed4bfd81 --- core/java/android/service/dreams/DreamService.java | 111 +++++++++++++++++---- .../server/dreams/TestDreamEnvironment.java | 20 ++-- 2 files changed, 106 insertions(+), 25 deletions(-) diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index 50a646284a8e..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; } @@ -1214,7 +1290,7 @@ public class DreamService extends Service implements Window.Callback { final long token = Binder.clearCallingIdentity(); try { // Simply finish dream when exit is requested. - mHandler.post(() -> finishInternal()); + post(() -> finishInternal()); } finally { Binder.restoreCallingIdentity(token); } @@ -1320,7 +1396,7 @@ public class DreamService extends Service implements Window.Callback { *

*/ public final void finish() { - mHandler.post(this::finishInternal); + post(this::finishInternal); } private void finishInternal() { @@ -1382,7 +1458,7 @@ public class DreamService extends Service implements Window.Callback { *

*/ public final void wakeUp() { - mHandler.post(()-> wakeUp(false)); + post(()-> wakeUp(false)); } /** @@ -1831,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 */ @@ -1887,7 +1964,7 @@ public class DreamService extends Service implements Window.Callback { return; } - service.mHandler.post(() -> consumer.accept(service)); + service.post(() -> consumer.accept(service)); } @Override 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) { @@ -234,11 +238,6 @@ public class TestDreamEnvironment { return mServiceInfo; } - @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 -- cgit v1.2.3-59-g8ed1b From 99a4bd6cfa71439a0e2e385c9d1cf85955f6388b Mon Sep 17 00:00:00 2001 From: Android Culprit Assistant Date: Mon, 24 Mar 2025 07:12:45 -0700 Subject: Revert "Update SCVH InputTransferToken when available" This revert was created by Android Culprit Assistant. The culprit was identified in the following culprit search session (http://go/aca-get/78a373af-3d5f-4015-a25e-bcb24843f6a9). Bug: 405254118 Signed-off-by: boq-android-culprit-assistant@system.gserviceaccount.com (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:c77468cfe08273d1d568e71e17b5fc4e20b8f6ff) Merged-In: Id09afebdfdb16d58c17da55c070a023e9aca9a1a Change-Id: Id09afebdfdb16d58c17da55c070a023e9aca9a1a --- .../java/android/view/ISurfaceControlViewHost.aidl | 2 - core/java/android/view/IWindowSession.aidl | 5 +-- core/java/android/view/SurfaceControlViewHost.java | 14 ------- core/java/android/view/SurfaceView.java | 34 +-------------- core/java/android/view/ViewRootImpl.java | 5 +-- .../java/android/view/WindowlessWindowManager.java | 48 ++++++++-------------- .../android/window/flags/window_surfaces.aconfig | 12 ------ .../compatui/letterbox/LetterboxInputDetector.kt | 1 - .../shell/windowdecor/DragResizeInputListener.java | 4 +- .../letterbox/LetterboxInputControllerTest.kt | 1 - .../server/wm/EmbeddedWindowController.java | 32 +++++---------- .../core/java/com/android/server/wm/Session.java | 22 ++++------ .../android/server/wm/WindowManagerService.java | 13 ++---- .../server/wm/WindowManagerServiceTests.java | 9 ++-- 14 files changed, 45 insertions(+), 157 deletions(-) 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 @@ -78,20 +78,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) { 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/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 */); -- cgit v1.2.3-59-g8ed1b