From 6c8326f02a59dfa190280fd07e43390701c686db Mon Sep 17 00:00:00 2001 From: Evan Severson Date: Wed, 19 May 2021 15:58:39 -0700 Subject: [PATCH] Update signature on remove sensor privacy listener API If a listener can be registered for multiple sensors they should be able to be removed individually. Test: Build Bug: 181681375 Change-Id: I04b867de8140adc8db0137e7d13c0f8d1a966a5e --- core/api/system-current.txt | 2 +- .../hardware/ISensorPrivacyManager.aidl | 2 ++ .../hardware/SensorPrivacyManager.java | 8 +++-- .../android/server/SensorPrivacyService.java | 30 +++++++++++++++++-- 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 143d674bc029c..e39a33f8e68f2 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -3117,7 +3117,7 @@ package android.hardware { method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(int, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener); method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(int, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener); method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public boolean isSensorPrivacyEnabled(int); - method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void removeSensorPrivacyListener(@NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener); + method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void removeSensorPrivacyListener(int, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener); } public static interface SensorPrivacyManager.OnSensorPrivacyChangedListener { diff --git a/core/java/android/hardware/ISensorPrivacyManager.aidl b/core/java/android/hardware/ISensorPrivacyManager.aidl index a71bb09a19afa..1c8e95917484a 100644 --- a/core/java/android/hardware/ISensorPrivacyManager.aidl +++ b/core/java/android/hardware/ISensorPrivacyManager.aidl @@ -33,6 +33,8 @@ interface ISensorPrivacyManager { void removeSensorPrivacyListener(in ISensorPrivacyListener listener); + void removeIndividualSensorPrivacyListener(int sensor, in ISensorPrivacyListener listener); + boolean isSensorPrivacyEnabled(); boolean isIndividualSensorPrivacyEnabled(int userId, int sensor); diff --git a/core/java/android/hardware/SensorPrivacyManager.java b/core/java/android/hardware/SensorPrivacyManager.java index fc0204a55337e..1a5e5a85d2a13 100644 --- a/core/java/android/hardware/SensorPrivacyManager.java +++ b/core/java/android/hardware/SensorPrivacyManager.java @@ -286,13 +286,15 @@ public final class SensorPrivacyManager { */ @SystemApi @RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY) - public void removeSensorPrivacyListener(@NonNull OnSensorPrivacyChangedListener listener) { + public void removeSensorPrivacyListener(@Sensors.Sensor int sensor, + @NonNull OnSensorPrivacyChangedListener listener) { synchronized (mListeners) { for (int i = 0; i < mIndividualListeners.size(); i++) { Pair pair = mIndividualListeners.keyAt(i); - if (pair.first.equals(listener)) { + if (pair.second == sensor && pair.first.equals(listener)) { try { - mService.removeSensorPrivacyListener(mIndividualListeners.valueAt(i)); + mService.removeIndividualSensorPrivacyListener(sensor, + mIndividualListeners.valueAt(i)); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/services/core/java/com/android/server/SensorPrivacyService.java b/services/core/java/com/android/server/SensorPrivacyService.java index 2bf4edc67d7cd..2256b0ae86b50 100644 --- a/services/core/java/com/android/server/SensorPrivacyService.java +++ b/services/core/java/com/android/server/SensorPrivacyService.java @@ -995,6 +995,19 @@ public final class SensorPrivacyService extends SystemService { mHandler.removeListener(listener); } + /** + * Unregisters a listener from sensor privacy state change notifications. + */ + @Override + public void removeIndividualSensorPrivacyListener(int sensor, + ISensorPrivacyListener listener) { + enforceObserveSensorPrivacyPermission(); + if (listener == null) { + throw new NullPointerException("listener cannot be null"); + } + mHandler.removeListener(sensor, listener); + } + @Override public void suppressIndividualSensorPrivacyReminders(int userId, String packageName, IBinder token, boolean suppress) { @@ -1329,10 +1342,21 @@ public final class SensorPrivacyService extends SystemService { deathRecipient.destroy(); } mListeners.unregister(listener); + } + } + + public void removeListener(int sensor, ISensorPrivacyListener listener) { + synchronized (mListenerLock) { + DeathRecipient deathRecipient = mDeathRecipients.remove(listener); + if (deathRecipient != null) { + deathRecipient.destroy(); + } + for (int i = 0, numUsers = mIndividualSensorListeners.size(); i < numUsers; i++) { - for (int j = 0, numListeners = mIndividualSensorListeners.valueAt(i).size(); - j < numListeners; j++) { - mIndividualSensorListeners.valueAt(i).valueAt(j).unregister(listener); + RemoteCallbackList callbacks = + mIndividualSensorListeners.valueAt(i).get(sensor); + if (callbacks != null) { + callbacks.unregister(listener); } } }