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
This commit is contained in:
Evan Severson
2021-05-19 15:58:39 -07:00
parent 92c4b3d31d
commit 6c8326f02a
4 changed files with 35 additions and 7 deletions

View File

@@ -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 {

View File

@@ -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);

View File

@@ -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<OnSensorPrivacyChangedListener, Integer> 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();
}

View File

@@ -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);
}
}
}