Guard VirtualDevice#close by permission
If the permission is not already held by the caller through other means, this causes unregistration failures, since the unique id disassociation requires a signature permission. Clear the binding identity if the permission is found, allowing use of the permisson. This is especially important for CTS tests, and for access by non-signature apps. Bug: 217275682 Test: atest CtsHardwareTestCases:android.hardware.input.cts.tests Change-Id: Ide5232e5b5b5b1b3ca96e5cbfb997e4a1001a583
This commit is contained in:
@@ -2754,7 +2754,7 @@ package android.companion.virtual {
|
||||
public static class VirtualDeviceManager.VirtualDevice implements java.lang.AutoCloseable {
|
||||
method public void addActivityListener(@NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener);
|
||||
method public void addActivityListener(@NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener, @NonNull java.util.concurrent.Executor);
|
||||
method public void close();
|
||||
method @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void close();
|
||||
method @Nullable public android.hardware.display.VirtualDisplay createVirtualDisplay(int, int, int, @Nullable android.view.Surface, int, @Nullable android.os.Handler, @Nullable android.hardware.display.VirtualDisplay.Callback);
|
||||
method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualKeyboard createVirtualKeyboard(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int);
|
||||
method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualMouse createVirtualMouse(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int);
|
||||
|
||||
@@ -249,6 +249,7 @@ public final class VirtualDeviceManager {
|
||||
* Closes the virtual device, stopping and tearing down any virtual displays,
|
||||
* audio policies, and event injection that's currently in progress.
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
|
||||
public void close() {
|
||||
try {
|
||||
mVirtualDevice.close();
|
||||
|
||||
@@ -212,6 +212,10 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
|
||||
|
||||
@Override // Binder call
|
||||
public void close() {
|
||||
mContext.enforceCallingOrSelfPermission(
|
||||
android.Manifest.permission.CREATE_VIRTUAL_DEVICE,
|
||||
"Permission required to close the virtual device");
|
||||
|
||||
synchronized (mVirtualDeviceLock) {
|
||||
if (!mPerDisplayWakelocks.isEmpty()) {
|
||||
mPerDisplayWakelocks.forEach((displayId, wakeLock) -> {
|
||||
@@ -224,7 +228,13 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
|
||||
}
|
||||
mListener.onClose(mAssociationInfo.getId());
|
||||
mAppToken.unlinkToDeath(this, 0);
|
||||
mInputController.close();
|
||||
|
||||
final long token = Binder.clearCallingIdentity();
|
||||
try {
|
||||
mInputController.close();
|
||||
} finally {
|
||||
Binder.restoreCallingIdentity(token);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user