summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Android Build Coastguard Worker <android-build-coastguard-worker@google.com> 2025-04-16 09:11:31 -0700
committer Android Build Coastguard Worker <android-build-coastguard-worker@google.com> 2025-04-16 09:11:31 -0700
commit4341e620bf1c066c40e4633acc65f1e897af48a0 (patch)
tree9b6a3d00a7c706cb4efb4a953b58a71b9acf2bdb
parent4e4f936919d742a9d76357bafbf84a664c2b6c00 (diff)
parent99a4bd6cfa71439a0e2e385c9d1cf85955f6388b (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
-rw-r--r--core/java/android/service/dreams/DreamService.java158
-rw-r--r--core/java/android/view/ISurfaceControlViewHost.aidl2
-rw-r--r--core/java/android/view/IWindowSession.aidl5
-rw-r--r--core/java/android/view/SurfaceControlViewHost.java14
-rw-r--r--core/java/android/view/SurfaceView.java34
-rw-r--r--core/java/android/view/ViewRootImpl.java5
-rw-r--r--core/java/android/view/WindowlessWindowManager.java48
-rw-r--r--core/java/android/window/flags/window_surfaces.aconfig12
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterbox/LetterboxInputDetector.kt1
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java4
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxInputControllerTest.kt1
-rw-r--r--services/core/java/com/android/server/wm/EmbeddedWindowController.java32
-rw-r--r--services/core/java/com/android/server/wm/Session.java22
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java13
-rw-r--r--services/tests/dreamservicetests/src/com/android/server/dreams/TestDreamEnvironment.java20
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java9
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 */);