summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2021-03-12 01:38:39 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-03-12 01:38:39 +0000
commit706c23e63ff02978fdd06aa3414d37abc0778c05 (patch)
treec8ebe77bf0dbb90496be11c9d05e22967d72fba2
parent5774fa63b28e08b15857f5fb50e8f3873a4074fc (diff)
parent57edea38ad40d9ad44747bcf62ad0caa9f4238c8 (diff)
Merge "Add SensorPrivacyManagerInternal api for system server usage" into sc-dev
-rw-r--r--core/java/android/hardware/SensorPrivacyManagerInternal.java64
-rw-r--r--services/core/java/com/android/server/SensorPrivacyService.java92
2 files changed, 156 insertions, 0 deletions
diff --git a/core/java/android/hardware/SensorPrivacyManagerInternal.java b/core/java/android/hardware/SensorPrivacyManagerInternal.java
new file mode 100644
index 000000000000..d12e9f8418bc
--- /dev/null
+++ b/core/java/android/hardware/SensorPrivacyManagerInternal.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware;
+
+/**
+ * SensorPrivacyManager calls for within the system server
+ * @hide
+ */
+public abstract class SensorPrivacyManagerInternal {
+
+ /**
+ * A class implementing this interface can register to receive a callback when state changes.
+ */
+ public interface OnSensorPrivacyChangedListener {
+ /**
+ * The callback invoked when the state changes.
+ */
+ void onSensorPrivacyChanged(boolean enabled);
+ }
+
+ /**
+ * A class implementing this interface can register to receive a callback when state changes for
+ * any user.
+ */
+ public interface OnUserSensorPrivacyChangedListener {
+ /**
+ * The callback invoked when the state changes.
+ */
+ void onSensorPrivacyChanged(int userId, boolean enabled);
+ }
+
+ /**
+ * Get the individual sensor privacy state for a given user.
+ */
+ public abstract boolean isSensorPrivacyEnabled(int userId, int sensor);
+
+ /**
+ * Registers a new listener to receive notification when the state of sensor privacy
+ * changes.
+ */
+ public abstract void addSensorPrivacyListener(int userId, int sensor,
+ OnSensorPrivacyChangedListener listener);
+
+ /**
+ * Registers a new listener to receive notification when the state of sensor privacy
+ * changes for any user.
+ */
+ public abstract void addSensorPrivacyListenerForAllUsers(int sensor,
+ OnUserSensorPrivacyChangedListener listener);
+}
diff --git a/services/core/java/com/android/server/SensorPrivacyService.java b/services/core/java/com/android/server/SensorPrivacyService.java
index f2782f64995a..18d47c6fb7b3 100644
--- a/services/core/java/com/android/server/SensorPrivacyService.java
+++ b/services/core/java/com/android/server/SensorPrivacyService.java
@@ -51,6 +51,7 @@ import android.graphics.drawable.Icon;
import android.hardware.ISensorPrivacyListener;
import android.hardware.ISensorPrivacyManager;
import android.hardware.SensorPrivacyManager;
+import android.hardware.SensorPrivacyManagerInternal;
import android.os.Binder;
import android.os.Environment;
import android.os.Handler;
@@ -67,6 +68,7 @@ import android.service.SensorPrivacyServiceDumpProto;
import android.service.SensorPrivacyUserProto;
import android.text.Html;
import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.IndentingPrintWriter;
import android.util.Log;
@@ -80,6 +82,7 @@ import android.util.proto.ProtoOutputStream;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.os.BackgroundThread;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FunctionalUtils;
import com.android.internal.util.XmlUtils;
@@ -137,6 +140,8 @@ public final class SensorPrivacyService extends SystemService {
private final ActivityManager mActivityManager;
private final ActivityTaskManager mActivityTaskManager;
+ private SensorPrivacyManagerInternalImpl mSensorPrivacyManagerInternal;
+
public SensorPrivacyService(Context context) {
super(context);
mUserManagerInternal = getLocalService(UserManagerInternal.class);
@@ -148,6 +153,9 @@ public final class SensorPrivacyService extends SystemService {
@Override
public void onStart() {
publishBinderService(Context.SENSOR_PRIVACY_SERVICE, mSensorPrivacyServiceImpl);
+ mSensorPrivacyManagerInternal = new SensorPrivacyManagerInternalImpl();
+ publishLocalService(SensorPrivacyManagerInternal.class,
+ mSensorPrivacyManagerInternal);
}
class SensorPrivacyServiceImpl extends ISensorPrivacyManager.Stub implements
@@ -1108,6 +1116,7 @@ public final class SensorPrivacyService extends SystemService {
}
public void handleSensorPrivacyChanged(int userId, int sensor, boolean enabled) {
+ mSensorPrivacyManagerInternal.dispatch(userId, sensor, enabled);
SparseArray<RemoteCallbackList<ISensorPrivacyListener>> listenersForUser =
mIndividualSensorListeners.get(userId);
if (listenersForUser == null) {
@@ -1168,4 +1177,87 @@ public final class SensorPrivacyService extends SystemService {
c.accept(userIds[i]);
}
}
+
+ private class SensorPrivacyManagerInternalImpl extends SensorPrivacyManagerInternal {
+
+ private ArrayMap<Integer, ArrayMap<Integer, ArraySet<OnSensorPrivacyChangedListener>>>
+ mListeners = new ArrayMap<>();
+ private ArrayMap<Integer, ArraySet<OnUserSensorPrivacyChangedListener>> mAllUserListeners =
+ new ArrayMap<>();
+
+ private final Object mLock = new Object();
+
+ private void dispatch(int userId, int sensor, boolean enabled) {
+ synchronized (mLock) {
+ ArraySet<OnUserSensorPrivacyChangedListener> allUserSensorListeners =
+ mAllUserListeners.get(sensor);
+ if (allUserSensorListeners != null) {
+ for (int i = 0; i < allUserSensorListeners.size(); i++) {
+ OnUserSensorPrivacyChangedListener listener =
+ allUserSensorListeners.valueAt(i);
+ BackgroundThread.getHandler().post(() ->
+ listener.onSensorPrivacyChanged(userId, enabled));
+ }
+ }
+
+ ArrayMap<Integer, ArraySet<OnSensorPrivacyChangedListener>> userSensorListeners =
+ mListeners.get(userId);
+ if (userSensorListeners != null) {
+ ArraySet<OnSensorPrivacyChangedListener> sensorListeners =
+ userSensorListeners.get(sensor);
+ if (sensorListeners != null) {
+ for (int i = 0; i < sensorListeners.size(); i++) {
+ OnSensorPrivacyChangedListener listener = sensorListeners.valueAt(i);
+ BackgroundThread.getHandler().post(() ->
+ listener.onSensorPrivacyChanged(enabled));
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean isSensorPrivacyEnabled(int userId, int sensor) {
+ return SensorPrivacyService.this
+ .mSensorPrivacyServiceImpl.isIndividualSensorPrivacyEnabled(userId, sensor);
+ }
+
+ @Override
+ public void addSensorPrivacyListener(int userId, int sensor,
+ OnSensorPrivacyChangedListener listener) {
+ synchronized (mLock) {
+ ArrayMap<Integer, ArraySet<OnSensorPrivacyChangedListener>> userSensorListeners =
+ mListeners.get(userId);
+ if (userSensorListeners == null) {
+ userSensorListeners = new ArrayMap<>();
+ mListeners.put(userId, userSensorListeners);
+ }
+
+ ArraySet<OnSensorPrivacyChangedListener> sensorListeners =
+ userSensorListeners.get(sensor);
+ if (sensorListeners == null) {
+ sensorListeners = new ArraySet<>();
+ userSensorListeners.put(sensor, sensorListeners);
+ }
+
+ sensorListeners.add(listener);
+ }
+ }
+
+ @Override
+ public void addSensorPrivacyListenerForAllUsers(int sensor,
+ OnUserSensorPrivacyChangedListener listener) {
+ synchronized (mLock) {
+ ArraySet<OnUserSensorPrivacyChangedListener> sensorListeners =
+ mAllUserListeners.get(sensor);
+ if (sensorListeners == null) {
+ sensorListeners = new ArraySet<>();
+ mAllUserListeners.put(sensor, sensorListeners);
+ }
+
+ sensorListeners.add(listener);
+ }
+ }
+ }
+
}