diff options
| author | 2021-03-12 01:38:39 +0000 | |
|---|---|---|
| committer | 2021-03-12 01:38:39 +0000 | |
| commit | 706c23e63ff02978fdd06aa3414d37abc0778c05 (patch) | |
| tree | c8ebe77bf0dbb90496be11c9d05e22967d72fba2 | |
| parent | 5774fa63b28e08b15857f5fb50e8f3873a4074fc (diff) | |
| parent | 57edea38ad40d9ad44747bcf62ad0caa9f4238c8 (diff) | |
Merge "Add SensorPrivacyManagerInternal api for system server usage" into sc-dev
| -rw-r--r-- | core/java/android/hardware/SensorPrivacyManagerInternal.java | 64 | ||||
| -rw-r--r-- | services/core/java/com/android/server/SensorPrivacyService.java | 92 |
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); + } + } + } + } |