diff --git a/services/core/java/com/android/server/app/GameServiceProviderInstanceImpl.java b/services/core/java/com/android/server/app/GameServiceProviderInstanceImpl.java index 145a298af95e4..4eba77168b8e5 100644 --- a/services/core/java/com/android/server/app/GameServiceProviderInstanceImpl.java +++ b/services/core/java/com/android/server/app/GameServiceProviderInstanceImpl.java @@ -473,7 +473,7 @@ final class GameServiceProviderInstanceImpl implements GameServiceProviderInstan } try { - mWindowManagerInternal.addTaskOverlay( + mWindowManagerInternal.addTrustedTaskOverlay( taskId, createGameSessionResult.getSurfacePackage()); } catch (IllegalArgumentException ex) { @@ -519,7 +519,7 @@ final class GameServiceProviderInstanceImpl implements GameServiceProviderInstan SurfacePackage surfacePackage = gameSessionRecord.getSurfacePackage(); if (surfacePackage != null) { try { - mWindowManagerInternal.removeTaskOverlay( + mWindowManagerInternal.removeTrustedTaskOverlay( gameSessionRecord.getTaskId(), surfacePackage); } catch (IllegalArgumentException ex) { diff --git a/services/core/java/com/android/server/wm/OverlayHost.java b/services/core/java/com/android/server/wm/TrustedOverlayHost.java similarity index 89% rename from services/core/java/com/android/server/wm/OverlayHost.java rename to services/core/java/com/android/server/wm/TrustedOverlayHost.java index 90f5b09968eaa..975b21c6f02c0 100644 --- a/services/core/java/com/android/server/wm/OverlayHost.java +++ b/services/core/java/com/android/server/wm/TrustedOverlayHost.java @@ -32,14 +32,20 @@ import java.util.ArrayList; * * Also handles multiplexing of event dispatch and tracking of overlays * to make things easier for WindowContainer. + * + * These overlays are to be used for various types of System UI and UI + * under the systems control. Provided SurfacePackages will be able + * to overlay application content, without engaging the usual cross process + * obscured touch filtering mechanisms. It's imperative that all UI provided + * be under complete control of the system. */ -class OverlayHost { +class TrustedOverlayHost { // Lazily initialized when required SurfaceControl mSurfaceControl; final ArrayList mOverlays = new ArrayList<>(); final WindowManagerService mWmService; - OverlayHost(WindowManagerService wms) { + TrustedOverlayHost(WindowManagerService wms) { mWmService = wms; } @@ -51,6 +57,8 @@ class OverlayHost { .setName("Overlay Host Leash"); mSurfaceControl = b.build(); + SurfaceControl.Transaction t = mWmService.mTransactionFactory.get(); + t.setTrustedOverlay(mSurfaceControl, true).apply(); } } diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 1bd153b2a5777..8a373bf5c09c6 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -314,7 +314,7 @@ class WindowContainer extends ConfigurationContainer< private final List mListeners = new ArrayList<>(); - protected OverlayHost mOverlayHost; + protected TrustedOverlayHost mOverlayHost; WindowContainer(WindowManagerService wms) { mWmService = wms; @@ -3600,9 +3600,9 @@ class WindowContainer extends ConfigurationContainer< @AnimationType int type, @Nullable AnimationAdapter snapshotAnim); } - void addOverlay(SurfaceControlViewHost.SurfacePackage overlay) { + void addTrustedOverlay(SurfaceControlViewHost.SurfacePackage overlay) { if (mOverlayHost == null) { - mOverlayHost = new OverlayHost(mWmService); + mOverlayHost = new TrustedOverlayHost(mWmService); } mOverlayHost.addOverlay(overlay, mSurfaceControl); @@ -3613,11 +3613,11 @@ class WindowContainer extends ConfigurationContainer< overlay.getRemoteInterface().onConfigurationChanged(getConfiguration()); } catch (Exception e) { Slog.e(TAG, "Error sending initial configuration change to WindowContainer overlay"); - removeOverlay(overlay); + removeTrustedOverlay(overlay); } } - void removeOverlay(SurfaceControlViewHost.SurfacePackage overlay) { + void removeTrustedOverlay(SurfaceControlViewHost.SurfacePackage overlay) { if (mOverlayHost != null && !mOverlayHost.removeOverlay(overlay)) { mOverlayHost.release(); mOverlayHost = null; diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java index 4900f9292f2a7..9585a4b93a972 100644 --- a/services/core/java/com/android/server/wm/WindowManagerInternal.java +++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java @@ -827,6 +827,11 @@ public abstract class WindowManagerInternal { * Internal methods for other parts of SystemServer to manage * SurfacePackage based overlays on tasks. * + * Since these overlays will overlay application content, they exist + * in a container with setTrustedOverlay(true). This means its imperative + * that this overlay feature only be used with UI completely under the control + * of the system, without 3rd party content. + * * Callers prepare a view hierarchy with SurfaceControlViewHost * and send the package to WM here. The remote view hierarchy will receive * configuration change, lifecycle events, etc, forwarded over the @@ -837,8 +842,10 @@ public abstract class WindowManagerInternal { * The embedded hierarchy exists in a coordinate space relative to the task * bounds. */ - public abstract void addTaskOverlay(int taskId, SurfaceControlViewHost.SurfacePackage overlay); - public abstract void removeTaskOverlay(int taskId, SurfaceControlViewHost.SurfacePackage overlay); + public abstract void addTrustedTaskOverlay(int taskId, + SurfaceControlViewHost.SurfacePackage overlay); + public abstract void removeTrustedTaskOverlay(int taskId, + SurfaceControlViewHost.SurfacePackage overlay); /** * Get a SurfaceControl that is the container layer that should be used to receive input to diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index c4907c2d99037..c9c3f1da5b405 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -8012,27 +8012,29 @@ public class WindowManagerService extends IWindowManager.Stub @Override public boolean shouldRestoreImeVisibility(IBinder imeTargetWindowToken) { return WindowManagerService.this.shouldRestoreImeVisibility(imeTargetWindowToken); - } + } @Override - public void addTaskOverlay(int taskId, SurfaceControlViewHost.SurfacePackage overlay) { + public void addTrustedTaskOverlay(int taskId, + SurfaceControlViewHost.SurfacePackage overlay) { synchronized (mGlobalLock) { final Task task = mRoot.getRootTask(taskId); if (task == null) { throw new IllegalArgumentException("no task with taskId" + taskId); } - task.addOverlay(overlay); + task.addTrustedOverlay(overlay); } } @Override - public void removeTaskOverlay(int taskId, SurfaceControlViewHost.SurfacePackage overlay) { + public void removeTrustedTaskOverlay(int taskId, + SurfaceControlViewHost.SurfacePackage overlay) { synchronized (mGlobalLock) { final Task task = mRoot.getRootTask(taskId); if (task == null) { throw new IllegalArgumentException("no task with taskId" + taskId); } - task.removeOverlay(overlay); + task.removeTrustedOverlay(overlay); } } diff --git a/services/tests/mockingservicestests/src/com/android/server/app/GameServiceProviderInstanceImplTest.java b/services/tests/mockingservicestests/src/com/android/server/app/GameServiceProviderInstanceImplTest.java index 7f571195f5f82..ed232e5458b0b 100644 --- a/services/tests/mockingservicestests/src/com/android/server/app/GameServiceProviderInstanceImplTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/app/GameServiceProviderInstanceImplTest.java @@ -406,7 +406,7 @@ public final class GameServiceProviderInstanceImplTest { mFakeGameSessionService.removePendingFutureForTaskId(10) .complete(new CreateGameSessionResult(gameSession10, mockSurfacePackage10)); - verify(mMockWindowManagerInternal).addTaskOverlay(eq(10), eq(mockSurfacePackage10)); + verify(mMockWindowManagerInternal).addTrustedTaskOverlay(eq(10), eq(mockSurfacePackage10)); } @Test @@ -556,8 +556,9 @@ public final class GameServiceProviderInstanceImplTest { stopTask(10); - verify(mMockWindowManagerInternal).addTaskOverlay(eq(10), eq(mockSurfacePackage10)); - verify(mMockWindowManagerInternal).removeTaskOverlay(eq(10), eq(mockSurfacePackage10)); + verify(mMockWindowManagerInternal).addTrustedTaskOverlay(eq(10), eq(mockSurfacePackage10)); + verify(mMockWindowManagerInternal).removeTrustedTaskOverlay(eq(10), + eq(mockSurfacePackage10)); } @Test