Loading core/java/android/companion/virtual/IVirtualDevice.aidl +13 −0 Original line number Diff line number Diff line Loading @@ -17,7 +17,9 @@ package android.companion.virtual; import android.app.PendingIntent; import android.companion.virtual.IVirtualDeviceActivityListener; import android.companion.virtual.IVirtualDeviceIntentInterceptor; import android.companion.virtual.IVirtualDeviceSoundEffectListener; import android.companion.virtual.audio.IAudioConfigChangedCallback; import android.companion.virtual.audio.IAudioRoutingCallback; import android.companion.virtual.sensor.VirtualSensor; Loading Loading @@ -296,4 +298,15 @@ interface IVirtualDevice { */ @EnforcePermission("CREATE_VIRTUAL_DEVICE") String getVirtualCameraId(in VirtualCameraConfig camera); /** * Setter for listeners that live in the client process, namely in * {@link android.companion.virtual.VirtualDeviceInternal}. * * This is needed for virtual devices that are created by the system, as the VirtualDeviceImpl * object is created before the returned VirtualDeviceInternal one. */ @EnforcePermission("CREATE_VIRTUAL_DEVICE") void setListeners(in IVirtualDeviceActivityListener activityListener, in IVirtualDeviceSoundEffectListener soundEffectListener); } core/java/android/companion/virtual/VirtualDeviceInternal.java +14 −0 Original line number Diff line number Diff line Loading @@ -164,6 +164,20 @@ public class VirtualDeviceInternal { mSoundEffectListener); } VirtualDeviceInternal( IVirtualDeviceManager service, Context context, IVirtualDevice virtualDevice) { mService = service; mContext = context.getApplicationContext(); mVirtualDevice = virtualDevice; try { mVirtualDevice.setListeners(mActivityListenerBinder, mSoundEffectListener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } int getDeviceId() { try { return mVirtualDevice.getDeviceId(); Loading core/java/android/companion/virtual/VirtualDeviceManager.java +6 −0 Original line number Diff line number Diff line Loading @@ -575,6 +575,12 @@ public final class VirtualDeviceManager { new VirtualDeviceInternal(service, context, associationId, params); } /** @hide */ public VirtualDevice(IVirtualDeviceManager service, Context context, IVirtualDevice virtualDevice) { mVirtualDeviceInternal = new VirtualDeviceInternal(service, context, virtualDevice); } /** * Returns the unique ID of this virtual device. */ Loading services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +28 −9 Original line number Diff line number Diff line Loading @@ -185,8 +185,8 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub private final SparseIntArray mDevicePolicies; @GuardedBy("mVirtualDeviceLock") private final SparseArray<VirtualDisplayWrapper> mVirtualDisplays = new SparseArray<>(); private final IVirtualDeviceActivityListener mActivityListener; private final IVirtualDeviceSoundEffectListener mSoundEffectListener; private IVirtualDeviceActivityListener mActivityListener; private IVirtualDeviceSoundEffectListener mSoundEffectListener; private final DisplayManagerGlobal mDisplayManager; private final DisplayManagerInternal mDisplayManagerInternal; @GuardedBy("mVirtualDeviceLock") Loading Loading @@ -303,7 +303,9 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub UserHandle ownerUserHandle = UserHandle.getUserHandleForUid(attributionSource.getUid()); mContext = context.createContextAsUser(ownerUserHandle, 0); mAssociationInfo = associationInfo; mPersistentDeviceId = createPersistentDeviceId(associationInfo.getId()); mPersistentDeviceId = associationInfo == null ? null : createPersistentDeviceId(associationInfo.getId()); mService = service; mPendingTrampolineCallback = pendingTrampolineCallback; mActivityListener = activityListener; Loading Loading @@ -405,7 +407,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub /** Returns the device display name. */ CharSequence getDisplayName() { return mAssociationInfo.getDisplayName(); return mAssociationInfo == null ? mParams.getName() : mAssociationInfo.getDisplayName(); } /** Returns the public representation of the device. */ Loading @@ -420,6 +422,22 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub } } /** * Setter for listeners that live in the client process, namely in * {@link android.companion.virtual.VirtualDeviceInternal}. * * This is needed for virtual devices that are created by the system, as the VirtualDeviceImpl * object is created before the returned VirtualDeviceInternal one. */ @Override // Binder call @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void setListeners(@NonNull IVirtualDeviceActivityListener activityListener, @NonNull IVirtualDeviceSoundEffectListener soundEffectListener) { super.setListeners_enforcePermission(); mActivityListener = Objects.requireNonNull(activityListener); mSoundEffectListener = Objects.requireNonNull(soundEffectListener); } @Override // Binder call public @VirtualDeviceParams.DevicePolicy int getDevicePolicy( @VirtualDeviceParams.PolicyType int policyType) { Loading Loading @@ -456,7 +474,9 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub @Override // Binder call public int getAssociationId() { return mAssociationInfo.getId(); return mAssociationInfo == null ? VirtualDeviceManagerService.CDM_ASSOCIATION_ID_NONE : mAssociationInfo.getId(); } @Override // Binder call Loading Loading @@ -1140,7 +1160,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub String indent = " "; fout.println(" VirtualDevice: "); fout.println(indent + "mDeviceId: " + mDeviceId); fout.println(indent + "mAssociationId: " + mAssociationInfo.getId()); fout.println(indent + "mAssociationId: " + getAssociationId()); fout.println(indent + "mOwnerPackageName: " + mOwnerPackageName); fout.println(indent + "mParams: "); mParams.dump(fout, indent + indent); Loading Loading @@ -1286,8 +1306,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) private void onActivityBlocked(int displayId, ActivityInfo activityInfo) { Intent intent = BlockedAppStreamingActivity.createIntent( activityInfo, mAssociationInfo.getDisplayName()); Intent intent = BlockedAppStreamingActivity.createIntent(activityInfo, getDisplayName()); mContext.startActivityAsUser( intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK), ActivityOptions.makeBasic().setLaunchDisplayId(displayId).toBundle(), Loading Loading @@ -1374,7 +1393,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub @SuppressWarnings("AndroidFrameworkRequiresPermission") private void checkVirtualInputDeviceDisplayIdAssociation(int displayId) { if (mContext.checkCallingPermission(android.Manifest.permission.INJECT_EVENTS) if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.INJECT_EVENTS) == PackageManager.PERMISSION_GRANTED) { // The INJECT_EVENTS permission allows for injecting input to any window / display. return; Loading services/companion/java/com/android/server/companion/virtual/VirtualDeviceLog.java +5 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.companion.virtual; import android.content.Context; import android.content.pm.PackageManager; import android.os.Binder; import android.os.Process; import android.util.SparseArray; import java.io.PrintWriter; Loading @@ -35,6 +36,8 @@ final class VirtualDeviceLog { "MM-dd HH:mm:ss.SSS").withZone(ZoneId.systemDefault()); private static final int MAX_ENTRIES = 16; private static final String VIRTUAL_DEVICE_OWNER_SYSTEM = "system"; private final Context mContext; private final ArrayDeque<LogEntry> mLogEntries = new ArrayDeque<>(); Loading Loading @@ -132,6 +135,8 @@ final class VirtualDeviceLog { String[] packages; if (mUidToPackagesCache.contains(ownerUid)) { return mUidToPackagesCache.get(ownerUid); } else if (ownerUid == Process.SYSTEM_UID) { return VIRTUAL_DEVICE_OWNER_SYSTEM; } else { packages = mPackageManager.getPackagesForUid(ownerUid); String packageName = ""; Loading Loading
core/java/android/companion/virtual/IVirtualDevice.aidl +13 −0 Original line number Diff line number Diff line Loading @@ -17,7 +17,9 @@ package android.companion.virtual; import android.app.PendingIntent; import android.companion.virtual.IVirtualDeviceActivityListener; import android.companion.virtual.IVirtualDeviceIntentInterceptor; import android.companion.virtual.IVirtualDeviceSoundEffectListener; import android.companion.virtual.audio.IAudioConfigChangedCallback; import android.companion.virtual.audio.IAudioRoutingCallback; import android.companion.virtual.sensor.VirtualSensor; Loading Loading @@ -296,4 +298,15 @@ interface IVirtualDevice { */ @EnforcePermission("CREATE_VIRTUAL_DEVICE") String getVirtualCameraId(in VirtualCameraConfig camera); /** * Setter for listeners that live in the client process, namely in * {@link android.companion.virtual.VirtualDeviceInternal}. * * This is needed for virtual devices that are created by the system, as the VirtualDeviceImpl * object is created before the returned VirtualDeviceInternal one. */ @EnforcePermission("CREATE_VIRTUAL_DEVICE") void setListeners(in IVirtualDeviceActivityListener activityListener, in IVirtualDeviceSoundEffectListener soundEffectListener); }
core/java/android/companion/virtual/VirtualDeviceInternal.java +14 −0 Original line number Diff line number Diff line Loading @@ -164,6 +164,20 @@ public class VirtualDeviceInternal { mSoundEffectListener); } VirtualDeviceInternal( IVirtualDeviceManager service, Context context, IVirtualDevice virtualDevice) { mService = service; mContext = context.getApplicationContext(); mVirtualDevice = virtualDevice; try { mVirtualDevice.setListeners(mActivityListenerBinder, mSoundEffectListener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } int getDeviceId() { try { return mVirtualDevice.getDeviceId(); Loading
core/java/android/companion/virtual/VirtualDeviceManager.java +6 −0 Original line number Diff line number Diff line Loading @@ -575,6 +575,12 @@ public final class VirtualDeviceManager { new VirtualDeviceInternal(service, context, associationId, params); } /** @hide */ public VirtualDevice(IVirtualDeviceManager service, Context context, IVirtualDevice virtualDevice) { mVirtualDeviceInternal = new VirtualDeviceInternal(service, context, virtualDevice); } /** * Returns the unique ID of this virtual device. */ Loading
services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +28 −9 Original line number Diff line number Diff line Loading @@ -185,8 +185,8 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub private final SparseIntArray mDevicePolicies; @GuardedBy("mVirtualDeviceLock") private final SparseArray<VirtualDisplayWrapper> mVirtualDisplays = new SparseArray<>(); private final IVirtualDeviceActivityListener mActivityListener; private final IVirtualDeviceSoundEffectListener mSoundEffectListener; private IVirtualDeviceActivityListener mActivityListener; private IVirtualDeviceSoundEffectListener mSoundEffectListener; private final DisplayManagerGlobal mDisplayManager; private final DisplayManagerInternal mDisplayManagerInternal; @GuardedBy("mVirtualDeviceLock") Loading Loading @@ -303,7 +303,9 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub UserHandle ownerUserHandle = UserHandle.getUserHandleForUid(attributionSource.getUid()); mContext = context.createContextAsUser(ownerUserHandle, 0); mAssociationInfo = associationInfo; mPersistentDeviceId = createPersistentDeviceId(associationInfo.getId()); mPersistentDeviceId = associationInfo == null ? null : createPersistentDeviceId(associationInfo.getId()); mService = service; mPendingTrampolineCallback = pendingTrampolineCallback; mActivityListener = activityListener; Loading Loading @@ -405,7 +407,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub /** Returns the device display name. */ CharSequence getDisplayName() { return mAssociationInfo.getDisplayName(); return mAssociationInfo == null ? mParams.getName() : mAssociationInfo.getDisplayName(); } /** Returns the public representation of the device. */ Loading @@ -420,6 +422,22 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub } } /** * Setter for listeners that live in the client process, namely in * {@link android.companion.virtual.VirtualDeviceInternal}. * * This is needed for virtual devices that are created by the system, as the VirtualDeviceImpl * object is created before the returned VirtualDeviceInternal one. */ @Override // Binder call @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void setListeners(@NonNull IVirtualDeviceActivityListener activityListener, @NonNull IVirtualDeviceSoundEffectListener soundEffectListener) { super.setListeners_enforcePermission(); mActivityListener = Objects.requireNonNull(activityListener); mSoundEffectListener = Objects.requireNonNull(soundEffectListener); } @Override // Binder call public @VirtualDeviceParams.DevicePolicy int getDevicePolicy( @VirtualDeviceParams.PolicyType int policyType) { Loading Loading @@ -456,7 +474,9 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub @Override // Binder call public int getAssociationId() { return mAssociationInfo.getId(); return mAssociationInfo == null ? VirtualDeviceManagerService.CDM_ASSOCIATION_ID_NONE : mAssociationInfo.getId(); } @Override // Binder call Loading Loading @@ -1140,7 +1160,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub String indent = " "; fout.println(" VirtualDevice: "); fout.println(indent + "mDeviceId: " + mDeviceId); fout.println(indent + "mAssociationId: " + mAssociationInfo.getId()); fout.println(indent + "mAssociationId: " + getAssociationId()); fout.println(indent + "mOwnerPackageName: " + mOwnerPackageName); fout.println(indent + "mParams: "); mParams.dump(fout, indent + indent); Loading Loading @@ -1286,8 +1306,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) private void onActivityBlocked(int displayId, ActivityInfo activityInfo) { Intent intent = BlockedAppStreamingActivity.createIntent( activityInfo, mAssociationInfo.getDisplayName()); Intent intent = BlockedAppStreamingActivity.createIntent(activityInfo, getDisplayName()); mContext.startActivityAsUser( intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK), ActivityOptions.makeBasic().setLaunchDisplayId(displayId).toBundle(), Loading Loading @@ -1374,7 +1393,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub @SuppressWarnings("AndroidFrameworkRequiresPermission") private void checkVirtualInputDeviceDisplayIdAssociation(int displayId) { if (mContext.checkCallingPermission(android.Manifest.permission.INJECT_EVENTS) if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.INJECT_EVENTS) == PackageManager.PERMISSION_GRANTED) { // The INJECT_EVENTS permission allows for injecting input to any window / display. return; Loading
services/companion/java/com/android/server/companion/virtual/VirtualDeviceLog.java +5 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.companion.virtual; import android.content.Context; import android.content.pm.PackageManager; import android.os.Binder; import android.os.Process; import android.util.SparseArray; import java.io.PrintWriter; Loading @@ -35,6 +36,8 @@ final class VirtualDeviceLog { "MM-dd HH:mm:ss.SSS").withZone(ZoneId.systemDefault()); private static final int MAX_ENTRIES = 16; private static final String VIRTUAL_DEVICE_OWNER_SYSTEM = "system"; private final Context mContext; private final ArrayDeque<LogEntry> mLogEntries = new ArrayDeque<>(); Loading Loading @@ -132,6 +135,8 @@ final class VirtualDeviceLog { String[] packages; if (mUidToPackagesCache.contains(ownerUid)) { return mUidToPackagesCache.get(ownerUid); } else if (ownerUid == Process.SYSTEM_UID) { return VIRTUAL_DEVICE_OWNER_SYSTEM; } else { packages = mPackageManager.getPackagesForUid(ownerUid); String packageName = ""; Loading