diff options
7 files changed, 51 insertions, 14 deletions
diff --git a/core/java/android/companion/virtual/IVirtualDeviceManager.aidl b/core/java/android/companion/virtual/IVirtualDeviceManager.aidl index ee7836f0f7f0..ed8484fe7266 100644 --- a/core/java/android/companion/virtual/IVirtualDeviceManager.aidl +++ b/core/java/android/companion/virtual/IVirtualDeviceManager.aidl @@ -21,6 +21,7 @@ import android.companion.virtual.IVirtualDeviceActivityListener; import android.companion.virtual.IVirtualDeviceSoundEffectListener; import android.companion.virtual.VirtualDevice; import android.companion.virtual.VirtualDeviceParams; +import android.content.AttributionSource; import android.hardware.display.IVirtualDisplayCallback; import android.hardware.display.VirtualDisplayConfig; @@ -46,7 +47,7 @@ interface IVirtualDeviceManager { */ @EnforcePermission("CREATE_VIRTUAL_DEVICE") IVirtualDevice createVirtualDevice( - in IBinder token, String packageName, int associationId, + in IBinder token, in AttributionSource attributionSource, int associationId, in VirtualDeviceParams params, in IVirtualDeviceActivityListener activityListener, in IVirtualDeviceSoundEffectListener soundEffectListener); diff --git a/core/java/android/companion/virtual/VirtualDeviceInternal.java b/core/java/android/companion/virtual/VirtualDeviceInternal.java index f68cfff1c053..d13bfd4f6229 100644 --- a/core/java/android/companion/virtual/VirtualDeviceInternal.java +++ b/core/java/android/companion/virtual/VirtualDeviceInternal.java @@ -145,7 +145,7 @@ public class VirtualDeviceInternal { mContext = context.getApplicationContext(); mVirtualDevice = service.createVirtualDevice( new Binder(), - mContext.getPackageName(), + mContext.getAttributionSource(), associationId, params, mActivityListenerBinder, diff --git a/core/java/android/companion/virtual/VirtualDeviceParams.java b/core/java/android/companion/virtual/VirtualDeviceParams.java index 45d6dc62bfe8..b6d837589284 100644 --- a/core/java/android/companion/virtual/VirtualDeviceParams.java +++ b/core/java/android/companion/virtual/VirtualDeviceParams.java @@ -43,6 +43,7 @@ import android.util.ArraySet; import android.util.SparseArray; import android.util.SparseIntArray; +import java.io.PrintWriter; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -501,6 +502,26 @@ public final class VirtualDeviceParams implements Parcelable { + ")"; } + /** + * Dumps debugging information about the VirtualDeviceParams + * @hide + */ + public void dump(PrintWriter pw, String prefix) { + pw.println(prefix + "mName=" + mName); + pw.println(prefix + "mLockState=" + mLockState); + pw.println(prefix + "mUsersWithMatchingAccounts=" + mUsersWithMatchingAccounts); + pw.println(prefix + "mAllowedCrossTaskNavigations=" + mAllowedCrossTaskNavigations); + pw.println(prefix + "mBlockedCrossTaskNavigations=" + mBlockedCrossTaskNavigations); + pw.println(prefix + "mAllowedActivities=" + mAllowedActivities); + pw.println(prefix + "mBlockedActivities=" + mBlockedActivities); + pw.println(prefix + "mDevicePolicies=" + mDevicePolicies); + pw.println(prefix + "mDefaultNavigationPolicy=" + mDefaultNavigationPolicy); + pw.println(prefix + "mDefaultActivityPolicy=" + mDefaultActivityPolicy); + pw.println(prefix + "mVirtualSensorConfigs=" + mVirtualSensorConfigs); + pw.println(prefix + "mAudioPlaybackSessionId=" + mAudioPlaybackSessionId); + pw.println(prefix + "mAudioRecordingSessionId=" + mAudioRecordingSessionId); + } + @NonNull public static final Parcelable.Creator<VirtualDeviceParams> CREATOR = new Parcelable.Creator<VirtualDeviceParams>() { diff --git a/core/java/android/companion/virtual/sensor/VirtualSensorConfig.java b/core/java/android/companion/virtual/sensor/VirtualSensorConfig.java index 3bdf9aa8015b..0dbe411a400e 100644 --- a/core/java/android/companion/virtual/sensor/VirtualSensorConfig.java +++ b/core/java/android/companion/virtual/sensor/VirtualSensorConfig.java @@ -104,6 +104,11 @@ public final class VirtualSensorConfig implements Parcelable { parcel.writeInt(mFlags); } + @Override + public String toString() { + return "VirtualSensorConfig{" + "mType=" + mType + ", mName='" + mName + '\'' + '}'; + } + /** * Returns the type of the sensor. * diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java index ee6c28ed3fe1..d1be5a9e971d 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java @@ -43,6 +43,7 @@ import android.companion.virtual.audio.IAudioConfigChangedCallback; import android.companion.virtual.audio.IAudioRoutingCallback; import android.companion.virtual.sensor.VirtualSensor; import android.companion.virtual.sensor.VirtualSensorEvent; +import android.content.AttributionSource; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -125,6 +126,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub private final VirtualDeviceManagerService mService; private final PendingTrampolineCallback mPendingTrampolineCallback; private final int mOwnerUid; + private final String mOwnerPackageName; private int mDeviceId; private @Nullable String mPersistentDeviceId; // Thou shall not hold the mVirtualDeviceLock over the mInputController calls. @@ -196,7 +198,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub AssociationInfo associationInfo, VirtualDeviceManagerService service, IBinder token, - int ownerUid, + AttributionSource attributionSource, int deviceId, CameraAccessController cameraAccessController, PendingTrampolineCallback pendingTrampolineCallback, @@ -209,7 +211,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub associationInfo, service, token, - ownerUid, + attributionSource, deviceId, /* inputController= */ null, cameraAccessController, @@ -227,7 +229,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub AssociationInfo associationInfo, VirtualDeviceManagerService service, IBinder token, - int ownerUid, + AttributionSource attributionSource, int deviceId, InputController inputController, CameraAccessController cameraAccessController, @@ -238,7 +240,8 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub VirtualDeviceParams params, DisplayManagerGlobal displayManager) { super(PermissionEnforcer.fromContext(context)); - UserHandle ownerUserHandle = UserHandle.getUserHandleForUid(ownerUid); + mOwnerPackageName = attributionSource.getPackageName(); + UserHandle ownerUserHandle = UserHandle.getUserHandleForUid(attributionSource.getUid()); mContext = context.createContextAsUser(ownerUserHandle, 0); mAssociationInfo = associationInfo; mPersistentDeviceId = PERSISTENT_ID_PREFIX_CDM_ASSOCIATION + associationInfo.getId(); @@ -247,7 +250,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub mActivityListener = activityListener; mSoundEffectListener = soundEffectListener; mRunningAppsChangedCallback = runningAppsChangedCallback; - mOwnerUid = ownerUid; + mOwnerUid = attributionSource.getUid(); mDeviceId = deviceId; mAppToken = token; mParams = params; @@ -771,7 +774,9 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub fout.println(" VirtualDevice: "); fout.println(" mDeviceId: " + mDeviceId); fout.println(" mAssociationId: " + mAssociationInfo.getId()); - fout.println(" mParams: " + mParams); + fout.println(" mOwnerPackageName: " + mOwnerPackageName); + fout.println(" mParams: "); + mParams.dump(fout, " "); fout.println(" mVirtualDisplayIds: "); synchronized (mVirtualDeviceLock) { for (int i = 0; i < mVirtualDisplays.size(); i++) { diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java index 77508a8fcc0d..e558498e4715 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java @@ -35,6 +35,7 @@ import android.companion.virtual.VirtualDevice; import android.companion.virtual.VirtualDeviceManager; import android.companion.virtual.VirtualDeviceParams; import android.companion.virtual.sensor.VirtualSensor; +import android.content.AttributionSource; import android.content.Context; import android.content.Intent; import android.hardware.display.IVirtualDisplayCallback; @@ -314,13 +315,15 @@ public class VirtualDeviceManagerService extends SystemService { @Override // Binder call public IVirtualDevice createVirtualDevice( IBinder token, - String packageName, + AttributionSource attributionSource, int associationId, @NonNull VirtualDeviceParams params, @NonNull IVirtualDeviceActivityListener activityListener, @NonNull IVirtualDeviceSoundEffectListener soundEffectListener) { createVirtualDevice_enforcePermission(); + attributionSource.enforceCallingUid(); final int callingUid = getCallingUid(); + final String packageName = attributionSource.getPackageName(); if (!PermissionUtils.validateCallingPackageName(getContext(), packageName)) { throw new SecurityException( "Package name " + packageName + " does not belong to calling uid " @@ -340,10 +343,9 @@ public class VirtualDeviceManagerService extends SystemService { final int deviceId = sNextUniqueIndex.getAndIncrement(); final Consumer<ArraySet<Integer>> runningAppsChangedCallback = runningUids -> notifyRunningAppsChanged(deviceId, runningUids); - VirtualDeviceImpl virtualDevice = new VirtualDeviceImpl(getContext(), - associationInfo, VirtualDeviceManagerService.this, token, callingUid, - deviceId, cameraAccessController, - mPendingTrampolineCallback, activityListener, + VirtualDeviceImpl virtualDevice = new VirtualDeviceImpl(getContext(), associationInfo, + VirtualDeviceManagerService.this, token, attributionSource, deviceId, + cameraAccessController, mPendingTrampolineCallback, activityListener, soundEffectListener, runningAppsChangedCallback, params); synchronized (mVirtualDeviceManagerLock) { if (mVirtualDevices.size() == 0) { diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java index bcbbcd4456ee..908afc861f8b 100644 --- a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java @@ -61,6 +61,7 @@ import android.companion.virtual.sensor.IVirtualSensorCallback; import android.companion.virtual.sensor.VirtualSensor; import android.companion.virtual.sensor.VirtualSensorCallback; import android.companion.virtual.sensor.VirtualSensorConfig; +import android.content.AttributionSource; import android.content.ComponentName; import android.content.Context; import android.content.ContextWrapper; @@ -1729,7 +1730,9 @@ public class VirtualDeviceManagerServiceTest { private VirtualDeviceImpl createVirtualDevice(int virtualDeviceId, int ownerUid, VirtualDeviceParams params) { VirtualDeviceImpl virtualDeviceImpl = new VirtualDeviceImpl(mContext, - mAssociationInfo, mVdms, new Binder(), ownerUid, virtualDeviceId, + mAssociationInfo, mVdms, new Binder(), + new AttributionSource(ownerUid, "com.android.virtualdevice.test", "virtualdevice"), + virtualDeviceId, mInputController, mCameraAccessController, mPendingTrampolineCallback, mActivityListener, mSoundEffectListener, mRunningAppsChangedCallback, params, new DisplayManagerGlobal(mIDisplayManager)); |