summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Vladimir Komsiyski <vladokom@google.com> 2023-09-04 17:00:08 +0200
committer Vladimir Komsiyski <vladokom@google.com> 2023-09-06 15:46:00 +0200
commitb76e28c0d718fa907926c8dbd8d60379a74f505c (patch)
tree111a418b941f6606427ea310c9e6739442643067
parenta6706ac3da8e73240b414720681a32b08f956206 (diff)
Replace the VDM broadcast for device closed with listener.
Since the addition of the public VirtualDeviceListener API, The broadcast is no longer needed and can be cleaned up. Bug: 276718212 Test: atest VirtualSensorTest Change-Id: Ifae9080642a6c849c1f82adc0e9720bf3a18d52b
-rw-r--r--core/java/android/hardware/SystemSensorManager.java41
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java35
-rw-r--r--services/core/java/com/android/server/clipboard/ClipboardService.java26
3 files changed, 82 insertions, 20 deletions
diff --git a/core/java/android/hardware/SystemSensorManager.java b/core/java/android/hardware/SystemSensorManager.java
index 0f6f6019c0f7..dfd380233662 100644
--- a/core/java/android/hardware/SystemSensorManager.java
+++ b/core/java/android/hardware/SystemSensorManager.java
@@ -129,6 +129,7 @@ public class SystemSensorManager extends SensorManager {
mDynamicSensorCallbacks = new HashMap<>();
private BroadcastReceiver mDynamicSensorBroadcastReceiver;
private BroadcastReceiver mRuntimeSensorBroadcastReceiver;
+ private VirtualDeviceManager.VirtualDeviceListener mVirtualDeviceListener;
// Looper associated with the context in which this instance was created.
private final Looper mMainLooper;
@@ -518,7 +519,11 @@ public class SystemSensorManager extends SensorManager {
}
private List<Sensor> createRuntimeSensorListLocked(int deviceId) {
- setupRuntimeSensorBroadcastReceiver();
+ if (android.companion.virtual.flags.Flags.vdmPublicApis()) {
+ setupVirtualDeviceListener();
+ } else {
+ setupRuntimeSensorBroadcastReceiver();
+ }
List<Sensor> list = new ArrayList<>();
nativeGetRuntimeSensors(mNativeInstance, deviceId, list);
mFullRuntimeSensorListByDevice.put(deviceId, list);
@@ -558,6 +563,34 @@ public class SystemSensorManager extends SensorManager {
}
}
+ private void setupVirtualDeviceListener() {
+ if (mVirtualDeviceListener != null) {
+ return;
+ }
+ if (mVdm == null) {
+ mVdm = mContext.getSystemService(VirtualDeviceManager.class);
+ if (mVdm == null) {
+ return;
+ }
+ }
+ mVirtualDeviceListener = new VirtualDeviceManager.VirtualDeviceListener() {
+ @Override
+ public void onVirtualDeviceClosed(int deviceId) {
+ synchronized (mFullRuntimeSensorListByDevice) {
+ List<Sensor> removedSensors =
+ mFullRuntimeSensorListByDevice.removeReturnOld(deviceId);
+ if (removedSensors != null) {
+ for (Sensor s : removedSensors) {
+ cleanupSensorConnection(s);
+ }
+ }
+ mRuntimeSensorListByDeviceByType.remove(deviceId);
+ }
+ }
+ };
+ mVdm.registerVirtualDeviceListener(mContext.getMainExecutor(), mVirtualDeviceListener);
+ }
+
private void setupDynamicSensorBroadcastReceiver() {
if (mDynamicSensorBroadcastReceiver == null) {
mDynamicSensorBroadcastReceiver = new BroadcastReceiver() {
@@ -581,12 +614,6 @@ public class SystemSensorManager extends SensorManager {
}
}
- private void teardownDynamicSensorBroadcastReceiver() {
- mDynamicSensorCallbacks.clear();
- mContext.unregisterReceiver(mDynamicSensorBroadcastReceiver);
- mDynamicSensorBroadcastReceiver = null;
- }
-
/** @hide */
protected void registerDynamicSensorCallbackImpl(
DynamicSensorCallback callback, Handler handler) {
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index cbf4cced0e9b..93ba362070d3 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -63,6 +63,7 @@ import android.app.PendingIntent;
import android.app.RemoteAction;
import android.app.admin.DevicePolicyManager;
import android.appwidget.AppWidgetManagerInternal;
+import android.companion.virtual.VirtualDeviceManager;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -928,18 +929,32 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
mContext.registerReceiverAsUser(receiver, UserHandle.ALL, filter, null, mMainHandler,
Context.RECEIVER_EXPORTED);
- final BroadcastReceiver virtualDeviceReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- final int deviceId = intent.getIntExtra(
- EXTRA_VIRTUAL_DEVICE_ID, DEVICE_ID_DEFAULT);
- mProxyManager.clearConnections(deviceId);
+ if (android.companion.virtual.flags.Flags.vdmPublicApis()) {
+ VirtualDeviceManager vdm = mContext.getSystemService(VirtualDeviceManager.class);
+ if (vdm != null) {
+ vdm.registerVirtualDeviceListener(mContext.getMainExecutor(),
+ new VirtualDeviceManager.VirtualDeviceListener() {
+ @Override
+ public void onVirtualDeviceClosed(int deviceId) {
+ mProxyManager.clearConnections(deviceId);
+ }
+ });
}
- };
+ } else {
+ final BroadcastReceiver virtualDeviceReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final int deviceId = intent.getIntExtra(
+ EXTRA_VIRTUAL_DEVICE_ID, DEVICE_ID_DEFAULT);
+ mProxyManager.clearConnections(deviceId);
+ }
+ };
- final IntentFilter virtualDeviceFilter = new IntentFilter(ACTION_VIRTUAL_DEVICE_REMOVED);
- mContext.registerReceiver(virtualDeviceReceiver, virtualDeviceFilter,
- Context.RECEIVER_NOT_EXPORTED);
+ final IntentFilter virtualDeviceFilter = new IntentFilter(
+ ACTION_VIRTUAL_DEVICE_REMOVED);
+ mContext.registerReceiver(virtualDeviceReceiver, virtualDeviceFilter,
+ Context.RECEIVER_NOT_EXPORTED);
+ }
}
/**
diff --git a/services/core/java/com/android/server/clipboard/ClipboardService.java b/services/core/java/com/android/server/clipboard/ClipboardService.java
index 38c6a528e221..906c66d4fe8a 100644
--- a/services/core/java/com/android/server/clipboard/ClipboardService.java
+++ b/services/core/java/com/android/server/clipboard/ClipboardService.java
@@ -144,6 +144,7 @@ public class ClipboardService extends SystemService {
private final VirtualDeviceManagerInternal mVdmInternal;
private final VirtualDeviceManager mVdm;
private BroadcastReceiver mVirtualDeviceRemovedReceiver;
+ private VirtualDeviceManager.VirtualDeviceListener mVirtualDeviceListener;
private final IUserManager mUm;
private final PackageManager mPm;
private final AppOpsManager mAppOps;
@@ -216,12 +217,14 @@ public class ClipboardService extends SystemService {
@Override
public void onStart() {
publishBinderService(Context.CLIPBOARD_SERVICE, new ClipboardImpl());
- if (mVdmInternal != null) {
- registerVirtualDeviceRemovedListener();
+ if (!android.companion.virtual.flags.Flags.vdmPublicApis() && mVdmInternal != null) {
+ registerVirtualDeviceBroadcastReceiver();
+ } else if (android.companion.virtual.flags.Flags.vdmPublicApis() && mVdm != null) {
+ registerVirtualDeviceListener();
}
}
- private void registerVirtualDeviceRemovedListener() {
+ private void registerVirtualDeviceBroadcastReceiver() {
if (mVirtualDeviceRemovedReceiver != null) {
return;
}
@@ -245,6 +248,23 @@ public class ClipboardService extends SystemService {
Context.RECEIVER_NOT_EXPORTED);
}
+ private void registerVirtualDeviceListener() {
+ if (mVirtualDeviceListener != null) {
+ return;
+ }
+ mVirtualDeviceListener = new VirtualDeviceManager.VirtualDeviceListener() {
+ @Override
+ public void onVirtualDeviceClosed(int deviceId) {
+ synchronized (mLock) {
+ for (int i = mClipboards.numMaps() - 1; i >= 0; i--) {
+ mClipboards.delete(mClipboards.keyAt(i), deviceId);
+ }
+ }
+ }
+ };
+ mVdm.registerVirtualDeviceListener(getContext().getMainExecutor(), mVirtualDeviceListener);
+ }
+
@Override
public void onUserStopped(@NonNull TargetUser user) {
synchronized (mLock) {