From 79c004b2c11d6a84b7c0fb71480f99b3e5183540 Mon Sep 17 00:00:00 2001 From: Peng Xu Date: Fri, 22 Jan 2016 00:44:28 -0800 Subject: [PATCH] [DO NOT MERGE ANYWHERE] Fix bodysensor permission Bug: 26481493 Bug: 26447970 Change-Id: Ibeaf5a5e39f0dc552cf115d2834a1ec28ecef5ab --- core/java/android/hardware/SensorManager.java | 34 ++++++------------ .../android/hardware/SystemSensorManager.java | 35 +++++++++++++++++-- native/android/sensor.cpp | 11 +++--- 3 files changed, 49 insertions(+), 31 deletions(-) diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java index 5d405f92e380b..a5a6f87583f95 100644 --- a/core/java/android/hardware/SensorManager.java +++ b/core/java/android/hardware/SensorManager.java @@ -407,25 +407,18 @@ public abstract class SensorManager { * @see Sensor */ public List getSensorList(int type) { - // cache the returned lists the first time List list; final List fullList = getFullSensorList(); - synchronized (mSensorListByType) { - list = mSensorListByType.get(type); - if (list == null) { - if (type == Sensor.TYPE_ALL) { - list = fullList; - } else { - list = new ArrayList(); - for (Sensor i : fullList) { - if (i.getType() == type) - list.add(i); - } - } - list = Collections.unmodifiableList(list); - mSensorListByType.append(type, list); + if (type == Sensor.TYPE_ALL) { + list = fullList; + } else { + list = new ArrayList(); + for (Sensor i : fullList) { + if (i.getType() == type) + list.add(i); } } + list = Collections.unmodifiableList(list); return list; } @@ -446,7 +439,6 @@ public abstract class SensorManager { */ public Sensor getDefaultSensor(int type) { // TODO: need to be smarter, for now, just return the 1st sensor - List l = getSensorList(type); boolean wakeUpSensor = false; // For the following sensor types, return a wake-up sensor. These types are by default // defined as wake-up sensors. For the rest of the SDK defined sensor types return a @@ -457,11 +449,7 @@ public abstract class SensorManager { type == Sensor.TYPE_WRIST_TILT_GESTURE) { wakeUpSensor = true; } - - for (Sensor sensor : l) { - if (sensor.isWakeUpSensor() == wakeUpSensor) return sensor; - } - return null; + return getDefaultSensor(type, wakeUpSensor); } /** @@ -491,9 +479,9 @@ public abstract class SensorManager { * @see Sensor#isWakeUpSensor() */ public Sensor getDefaultSensor(int type, boolean wakeUp) { - List l = getSensorList(type); + final List l = getFullSensorList(); for (Sensor sensor : l) { - if (sensor.isWakeUpSensor() == wakeUp) + if (sensor.getType() == type && sensor.isWakeUpSensor() == wakeUp) return sensor; } return null; diff --git a/core/java/android/hardware/SystemSensorManager.java b/core/java/android/hardware/SystemSensorManager.java index 2fe8fb6f71ced..3f9b419f1c786 100644 --- a/core/java/android/hardware/SystemSensorManager.java +++ b/core/java/android/hardware/SystemSensorManager.java @@ -52,6 +52,7 @@ public class SystemSensorManager extends SensorManager { private final Object mLock = new Object(); private final ArrayList mFullSensorsList = new ArrayList<>(); + private List mSensorsListCached = null; private final SparseArray mHandleToSensor = new SparseArray<>(); // Listener list @@ -60,6 +61,8 @@ public class SystemSensorManager extends SensorManager { private final HashMap mTriggerListeners = new HashMap(); + private boolean mBodySensorPermission; + // Looper associated with the context in which this instance was created. private final Looper mMainLooper; private final int mTargetSdkLevel; @@ -74,6 +77,7 @@ public class SystemSensorManager extends SensorManager { mNativeInstance = nativeCreate(context.getOpPackageName()); synchronized(mLock) { + updatePermission(); if (!sSensorModuleInitialized) { sSensorModuleInitialized = true; nativeClassInit(); @@ -89,11 +93,27 @@ public class SystemSensorManager extends SensorManager { } } - /** @hide */ @Override protected List getFullSensorList() { - return mFullSensorsList; + synchronized (mLock) { + if ( updatePermission() || mSensorsListCached == null) { + List list = new ArrayList(); + for (Sensor s: mFullSensorsList) { + switch (s.getRequiredPermission()) { + case Manifest.permission.BODY_SENSORS: + if (mBodySensorPermission) { + list.add(s); + } + break; + default: + list.add(s); + } + } + mSensorsListCached = list; + } + } + return mSensorsListCached; } @@ -274,6 +294,17 @@ public class SystemSensorManager extends SensorManager { } } + /** Returns true if permission is changed */ + private boolean updatePermission() { + boolean bodySensorPermission = + (mContext.checkSelfPermission(Manifest.permission.BODY_SENSORS) == + PackageManager.PERMISSION_GRANTED); + + boolean ret = bodySensorPermission != mBodySensorPermission; + mBodySensorPermission = bodySensorPermission; + return ret; + } + /* * BaseEventQueue is the communication channel with the sensor service, * SensorEventQueue, TriggerEventQueue are subclases and there is one-to-one mapping between diff --git a/native/android/sensor.cpp b/native/android/sensor.cpp index 76c701a5b8ce1..81507265f817b 100644 --- a/native/android/sensor.cpp +++ b/native/android/sensor.cpp @@ -52,13 +52,12 @@ ASensorManager* ASensorManager_getInstanceForPackage(const char* packageName) } } -int ASensorManager_getSensorList(ASensorManager* manager, - ASensorList* list) +int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list) { - Sensor const* const* l; - int c = static_cast(manager)->getSensorList(&l); + Sensor const* const* sensorPointerList; + int c = static_cast(manager)->getAvailableSensorList(&sensorPointerList); if (list) { - *list = reinterpret_cast(l); + *list = reinterpret_cast(sensorPointerList); } return c; } @@ -71,7 +70,7 @@ ASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type ASensor const* ASensorManager_getDefaultSensorEx(ASensorManager* manager, int type, bool wakeUp) { Sensor const* const* sensorList; - size_t size = static_cast(manager)->getSensorList(&sensorList); + size_t size = static_cast(manager)->getAvailableSensorList(&sensorList); for (size_t i = 0; i < size; ++i) { if (ASensor_getType(sensorList[i]) == type && ASensor_isWakeUpSensor(sensorList[i]) == wakeUp) {