Loading core/java/android/companion/virtual/flags/flags.aconfig +7 −0 Original line number Diff line number Diff line Loading @@ -111,3 +111,10 @@ flag { description: "Device awareness in power and display APIs" bug: "285020111" } flag { name: "status_bar_and_insets" namespace: "virtual_devices" description: "Allow for status bar and insets on virtual devices" bug: "350007866" } services/core/java/com/android/server/policy/PhoneWindowManager.java +20 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.policy; import static android.Manifest.permission.CREATE_VIRTUAL_DEVICE; import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; import static android.Manifest.permission.OVERRIDE_SYSTEM_KEY_BEHAVIOR_IN_FOCUSED_WINDOW; import static android.Manifest.permission.SYSTEM_ALERT_WINDOW; Loading Loading @@ -59,13 +60,18 @@ import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE; import static android.view.WindowManager.LayoutParams.TYPE_PRESENTATION; import static android.view.WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION; import static android.view.WindowManager.LayoutParams.TYPE_QS_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_ADDITIONAL; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION; import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import static android.view.WindowManager.LayoutParams.isSystemAlertWindowType; import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_KEY_CHORD; Loading Loading @@ -3058,7 +3064,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { /** {@inheritDoc} */ @Override public int checkAddPermission(int type, boolean isRoundedCornerOverlay, String packageName, int[] outAppOp) { int[] outAppOp, int displayId) { if (isRoundedCornerOverlay && mContext.checkCallingOrSelfPermission(INTERNAL_SYSTEM_WINDOW) != PERMISSION_GRANTED) { return ADD_PERMISSION_DENIED; Loading Loading @@ -3098,6 +3104,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { case TYPE_VOICE_INTERACTION: case TYPE_QS_DIALOG: case TYPE_NAVIGATION_BAR_PANEL: case TYPE_STATUS_BAR: case TYPE_NOTIFICATION_SHADE: case TYPE_NAVIGATION_BAR: case TYPE_STATUS_BAR_ADDITIONAL: case TYPE_STATUS_BAR_SUB_PANEL: case TYPE_VOICE_INTERACTION_STARTING: // The window manager will check these. return ADD_OKAY; } Loading Loading @@ -3141,6 +3153,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { return ADD_OKAY; } // Allow virtual device owners to add overlays on the displays they own. if (mWindowManagerFuncs.isCallerVirtualDeviceOwner(displayId, callingUid) && mContext.checkCallingOrSelfPermission(CREATE_VIRTUAL_DEVICE) == PERMISSION_GRANTED) { return ADD_OKAY; } // check if user has enabled this operation. SecurityException will be thrown if this app // has not been allowed by the user. The reason to use "noteOp" (instead of checkOp) is to // make sure the usage is logged. Loading services/core/java/com/android/server/policy/WindowManagerPolicy.java +8 −1 Original line number Diff line number Diff line Loading @@ -362,6 +362,12 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { * Invoked when a screenshot is taken of the given display to notify registered listeners. */ List<ComponentName> notifyScreenshotListeners(int displayId); /** * Returns whether the given UID is the owner of a virtual device, which the given display * belongs to. */ boolean isCallerVirtualDeviceOwner(int displayId, int callingUid); } /** Loading Loading @@ -421,6 +427,7 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { * @param packageName package name * @param outAppOp First element will be filled with the app op corresponding to * this window, or OP_NONE. * @param displayId The display on which this window is being added. * * @return {@link WindowManagerGlobal#ADD_OKAY} if the add can proceed; * else an error code, usually Loading @@ -429,7 +436,7 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { * @see WindowManager.LayoutParams#PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY */ int checkAddPermission(int type, boolean isRoundedCornerOverlay, String packageName, int[] outAppOp); int[] outAppOp, int displayId); /** * After the window manager has computed the current configuration based Loading services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +15 −7 Original line number Diff line number Diff line Loading @@ -107,7 +107,6 @@ import android.app.servertransaction.LaunchActivityItem; import android.app.servertransaction.PauseActivityItem; import android.app.servertransaction.ResumeActivityItem; import android.app.servertransaction.StopActivityItem; import android.companion.virtual.VirtualDeviceManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; Loading Loading @@ -158,6 +157,7 @@ import com.android.server.LocalServices; import com.android.server.am.ActivityManagerService; import com.android.server.am.HostingRecord; import com.android.server.am.UserState; import com.android.server.companion.virtual.VirtualDeviceManagerInternal; import com.android.server.pm.SaferIntentUtils; import com.android.server.utils.Slogf; import com.android.server.wm.ActivityMetricsLogger.LaunchingState; Loading Loading @@ -285,7 +285,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { private WindowManagerService mWindowManager; private AppOpsManager mAppOpsManager; private VirtualDeviceManager mVirtualDeviceManager; private VirtualDeviceManagerInternal mVirtualDeviceManagerInternal; /** Common synchronization logic used to save things to disks. */ PersisterQueue mPersisterQueue; Loading Loading @@ -1298,16 +1298,24 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { if (displayId == DEFAULT_DISPLAY || displayId == INVALID_DISPLAY) { return Context.DEVICE_ID_DEFAULT; } if (mVirtualDeviceManager == null) { if (mVirtualDeviceManagerInternal == null) { if (mService.mHasCompanionDeviceSetupFeature) { mVirtualDeviceManager = mService.mContext.getSystemService(VirtualDeviceManager.class); mVirtualDeviceManagerInternal = LocalServices.getService(VirtualDeviceManagerInternal.class); } if (mVirtualDeviceManager == null) { if (mVirtualDeviceManagerInternal == null) { return Context.DEVICE_ID_DEFAULT; } } return mVirtualDeviceManager.getDeviceIdForDisplayId(displayId); return mVirtualDeviceManagerInternal.getDeviceIdForDisplayId(displayId); } boolean isDeviceOwnerUid(int displayId, int callingUid) { final int deviceId = getDeviceIdForDisplayId(displayId); if (deviceId == Context.DEVICE_ID_DEFAULT || deviceId == Context.DEVICE_ID_INVALID) { return false; } return mVirtualDeviceManagerInternal.getDeviceOwnerUid(deviceId) == callingUid; } private AppOpsManager getAppOpsManager() { Loading services/core/java/com/android/server/wm/DisplayPolicy.java +15 −18 Original line number Diff line number Diff line Loading @@ -1036,7 +1036,7 @@ public class DisplayPolicy { /** * Check if a window can be added to the system. * * Currently enforces that two window types are singletons per display: * Currently enforces that these window types are singletons per display: * <ul> * <li>{@link WindowManager.LayoutParams#TYPE_STATUS_BAR}</li> * <li>{@link WindowManager.LayoutParams#TYPE_NOTIFICATION_SHADE}</li> Loading @@ -1058,41 +1058,39 @@ public class DisplayPolicy { ActivityTaskManagerService.enforceTaskPermission("DisplayPolicy"); } final String systemUiPermission = mService.isCallerVirtualDeviceOwner(mDisplayContent.getDisplayId(), callingUid) // Allow virtual device owners to add system windows on their displays. ? android.Manifest.permission.CREATE_VIRTUAL_DEVICE : android.Manifest.permission.STATUS_BAR_SERVICE; switch (attrs.type) { case TYPE_STATUS_BAR: mContext.enforcePermission( android.Manifest.permission.STATUS_BAR_SERVICE, callingPid, callingUid, mContext.enforcePermission(systemUiPermission, callingPid, callingUid, "DisplayPolicy"); if (mStatusBar != null && mStatusBar.isAlive()) { return WindowManagerGlobal.ADD_MULTIPLE_SINGLETON; } break; case TYPE_NOTIFICATION_SHADE: mContext.enforcePermission( android.Manifest.permission.STATUS_BAR_SERVICE, callingPid, callingUid, mContext.enforcePermission(systemUiPermission, callingPid, callingUid, "DisplayPolicy"); if (mNotificationShade != null) { if (mNotificationShade.isAlive()) { if (mNotificationShade != null && mNotificationShade.isAlive()) { return WindowManagerGlobal.ADD_MULTIPLE_SINGLETON; } } break; case TYPE_NAVIGATION_BAR: mContext.enforcePermission(android.Manifest.permission.STATUS_BAR_SERVICE, callingPid, callingUid, "DisplayPolicy"); mContext.enforcePermission(systemUiPermission, callingPid, callingUid, "DisplayPolicy"); if (mNavigationBar != null && mNavigationBar.isAlive()) { return WindowManagerGlobal.ADD_MULTIPLE_SINGLETON; } break; case TYPE_NAVIGATION_BAR_PANEL: mContext.enforcePermission(android.Manifest.permission.STATUS_BAR_SERVICE, callingPid, callingUid, "DisplayPolicy"); break; case TYPE_STATUS_BAR_ADDITIONAL: case TYPE_STATUS_BAR_SUB_PANEL: case TYPE_VOICE_INTERACTION_STARTING: mContext.enforcePermission( android.Manifest.permission.STATUS_BAR_SERVICE, callingPid, callingUid, mContext.enforcePermission(systemUiPermission, callingPid, callingUid, "DisplayPolicy"); break; case TYPE_STATUS_BAR_PANEL: Loading @@ -1102,8 +1100,7 @@ public class DisplayPolicy { if (attrs.providedInsets != null) { // Recents component is allowed to add inset types. if (!mService.mAtmService.isCallerRecents(callingUid)) { mContext.enforcePermission( android.Manifest.permission.STATUS_BAR_SERVICE, callingPid, callingUid, mContext.enforcePermission(systemUiPermission, callingPid, callingUid, "DisplayPolicy"); } } Loading Loading
core/java/android/companion/virtual/flags/flags.aconfig +7 −0 Original line number Diff line number Diff line Loading @@ -111,3 +111,10 @@ flag { description: "Device awareness in power and display APIs" bug: "285020111" } flag { name: "status_bar_and_insets" namespace: "virtual_devices" description: "Allow for status bar and insets on virtual devices" bug: "350007866" }
services/core/java/com/android/server/policy/PhoneWindowManager.java +20 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.policy; import static android.Manifest.permission.CREATE_VIRTUAL_DEVICE; import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; import static android.Manifest.permission.OVERRIDE_SYSTEM_KEY_BEHAVIOR_IN_FOCUSED_WINDOW; import static android.Manifest.permission.SYSTEM_ALERT_WINDOW; Loading Loading @@ -59,13 +60,18 @@ import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE; import static android.view.WindowManager.LayoutParams.TYPE_PRESENTATION; import static android.view.WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION; import static android.view.WindowManager.LayoutParams.TYPE_QS_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_ADDITIONAL; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION; import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import static android.view.WindowManager.LayoutParams.isSystemAlertWindowType; import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_KEY_CHORD; Loading Loading @@ -3058,7 +3064,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { /** {@inheritDoc} */ @Override public int checkAddPermission(int type, boolean isRoundedCornerOverlay, String packageName, int[] outAppOp) { int[] outAppOp, int displayId) { if (isRoundedCornerOverlay && mContext.checkCallingOrSelfPermission(INTERNAL_SYSTEM_WINDOW) != PERMISSION_GRANTED) { return ADD_PERMISSION_DENIED; Loading Loading @@ -3098,6 +3104,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { case TYPE_VOICE_INTERACTION: case TYPE_QS_DIALOG: case TYPE_NAVIGATION_BAR_PANEL: case TYPE_STATUS_BAR: case TYPE_NOTIFICATION_SHADE: case TYPE_NAVIGATION_BAR: case TYPE_STATUS_BAR_ADDITIONAL: case TYPE_STATUS_BAR_SUB_PANEL: case TYPE_VOICE_INTERACTION_STARTING: // The window manager will check these. return ADD_OKAY; } Loading Loading @@ -3141,6 +3153,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { return ADD_OKAY; } // Allow virtual device owners to add overlays on the displays they own. if (mWindowManagerFuncs.isCallerVirtualDeviceOwner(displayId, callingUid) && mContext.checkCallingOrSelfPermission(CREATE_VIRTUAL_DEVICE) == PERMISSION_GRANTED) { return ADD_OKAY; } // check if user has enabled this operation. SecurityException will be thrown if this app // has not been allowed by the user. The reason to use "noteOp" (instead of checkOp) is to // make sure the usage is logged. Loading
services/core/java/com/android/server/policy/WindowManagerPolicy.java +8 −1 Original line number Diff line number Diff line Loading @@ -362,6 +362,12 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { * Invoked when a screenshot is taken of the given display to notify registered listeners. */ List<ComponentName> notifyScreenshotListeners(int displayId); /** * Returns whether the given UID is the owner of a virtual device, which the given display * belongs to. */ boolean isCallerVirtualDeviceOwner(int displayId, int callingUid); } /** Loading Loading @@ -421,6 +427,7 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { * @param packageName package name * @param outAppOp First element will be filled with the app op corresponding to * this window, or OP_NONE. * @param displayId The display on which this window is being added. * * @return {@link WindowManagerGlobal#ADD_OKAY} if the add can proceed; * else an error code, usually Loading @@ -429,7 +436,7 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { * @see WindowManager.LayoutParams#PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY */ int checkAddPermission(int type, boolean isRoundedCornerOverlay, String packageName, int[] outAppOp); int[] outAppOp, int displayId); /** * After the window manager has computed the current configuration based Loading
services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +15 −7 Original line number Diff line number Diff line Loading @@ -107,7 +107,6 @@ import android.app.servertransaction.LaunchActivityItem; import android.app.servertransaction.PauseActivityItem; import android.app.servertransaction.ResumeActivityItem; import android.app.servertransaction.StopActivityItem; import android.companion.virtual.VirtualDeviceManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; Loading Loading @@ -158,6 +157,7 @@ import com.android.server.LocalServices; import com.android.server.am.ActivityManagerService; import com.android.server.am.HostingRecord; import com.android.server.am.UserState; import com.android.server.companion.virtual.VirtualDeviceManagerInternal; import com.android.server.pm.SaferIntentUtils; import com.android.server.utils.Slogf; import com.android.server.wm.ActivityMetricsLogger.LaunchingState; Loading Loading @@ -285,7 +285,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { private WindowManagerService mWindowManager; private AppOpsManager mAppOpsManager; private VirtualDeviceManager mVirtualDeviceManager; private VirtualDeviceManagerInternal mVirtualDeviceManagerInternal; /** Common synchronization logic used to save things to disks. */ PersisterQueue mPersisterQueue; Loading Loading @@ -1298,16 +1298,24 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { if (displayId == DEFAULT_DISPLAY || displayId == INVALID_DISPLAY) { return Context.DEVICE_ID_DEFAULT; } if (mVirtualDeviceManager == null) { if (mVirtualDeviceManagerInternal == null) { if (mService.mHasCompanionDeviceSetupFeature) { mVirtualDeviceManager = mService.mContext.getSystemService(VirtualDeviceManager.class); mVirtualDeviceManagerInternal = LocalServices.getService(VirtualDeviceManagerInternal.class); } if (mVirtualDeviceManager == null) { if (mVirtualDeviceManagerInternal == null) { return Context.DEVICE_ID_DEFAULT; } } return mVirtualDeviceManager.getDeviceIdForDisplayId(displayId); return mVirtualDeviceManagerInternal.getDeviceIdForDisplayId(displayId); } boolean isDeviceOwnerUid(int displayId, int callingUid) { final int deviceId = getDeviceIdForDisplayId(displayId); if (deviceId == Context.DEVICE_ID_DEFAULT || deviceId == Context.DEVICE_ID_INVALID) { return false; } return mVirtualDeviceManagerInternal.getDeviceOwnerUid(deviceId) == callingUid; } private AppOpsManager getAppOpsManager() { Loading
services/core/java/com/android/server/wm/DisplayPolicy.java +15 −18 Original line number Diff line number Diff line Loading @@ -1036,7 +1036,7 @@ public class DisplayPolicy { /** * Check if a window can be added to the system. * * Currently enforces that two window types are singletons per display: * Currently enforces that these window types are singletons per display: * <ul> * <li>{@link WindowManager.LayoutParams#TYPE_STATUS_BAR}</li> * <li>{@link WindowManager.LayoutParams#TYPE_NOTIFICATION_SHADE}</li> Loading @@ -1058,41 +1058,39 @@ public class DisplayPolicy { ActivityTaskManagerService.enforceTaskPermission("DisplayPolicy"); } final String systemUiPermission = mService.isCallerVirtualDeviceOwner(mDisplayContent.getDisplayId(), callingUid) // Allow virtual device owners to add system windows on their displays. ? android.Manifest.permission.CREATE_VIRTUAL_DEVICE : android.Manifest.permission.STATUS_BAR_SERVICE; switch (attrs.type) { case TYPE_STATUS_BAR: mContext.enforcePermission( android.Manifest.permission.STATUS_BAR_SERVICE, callingPid, callingUid, mContext.enforcePermission(systemUiPermission, callingPid, callingUid, "DisplayPolicy"); if (mStatusBar != null && mStatusBar.isAlive()) { return WindowManagerGlobal.ADD_MULTIPLE_SINGLETON; } break; case TYPE_NOTIFICATION_SHADE: mContext.enforcePermission( android.Manifest.permission.STATUS_BAR_SERVICE, callingPid, callingUid, mContext.enforcePermission(systemUiPermission, callingPid, callingUid, "DisplayPolicy"); if (mNotificationShade != null) { if (mNotificationShade.isAlive()) { if (mNotificationShade != null && mNotificationShade.isAlive()) { return WindowManagerGlobal.ADD_MULTIPLE_SINGLETON; } } break; case TYPE_NAVIGATION_BAR: mContext.enforcePermission(android.Manifest.permission.STATUS_BAR_SERVICE, callingPid, callingUid, "DisplayPolicy"); mContext.enforcePermission(systemUiPermission, callingPid, callingUid, "DisplayPolicy"); if (mNavigationBar != null && mNavigationBar.isAlive()) { return WindowManagerGlobal.ADD_MULTIPLE_SINGLETON; } break; case TYPE_NAVIGATION_BAR_PANEL: mContext.enforcePermission(android.Manifest.permission.STATUS_BAR_SERVICE, callingPid, callingUid, "DisplayPolicy"); break; case TYPE_STATUS_BAR_ADDITIONAL: case TYPE_STATUS_BAR_SUB_PANEL: case TYPE_VOICE_INTERACTION_STARTING: mContext.enforcePermission( android.Manifest.permission.STATUS_BAR_SERVICE, callingPid, callingUid, mContext.enforcePermission(systemUiPermission, callingPid, callingUid, "DisplayPolicy"); break; case TYPE_STATUS_BAR_PANEL: Loading @@ -1102,8 +1100,7 @@ public class DisplayPolicy { if (attrs.providedInsets != null) { // Recents component is allowed to add inset types. if (!mService.mAtmService.isCallerRecents(callingUid)) { mContext.enforcePermission( android.Manifest.permission.STATUS_BAR_SERVICE, callingPid, callingUid, mContext.enforcePermission(systemUiPermission, callingPid, callingUid, "DisplayPolicy"); } } Loading