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