Merge "[DO NOT MERGE ANYWHERE] Fix bodysensor permission" into cw-e-dev

This commit is contained in:
Nick Vaccaro
2016-01-26 20:13:26 +00:00
committed by Android (Google) Code Review
3 changed files with 49 additions and 31 deletions

View File

@@ -407,25 +407,18 @@ public abstract class SensorManager {
* @see Sensor * @see Sensor
*/ */
public List<Sensor> getSensorList(int type) { public List<Sensor> getSensorList(int type) {
// cache the returned lists the first time
List<Sensor> list; List<Sensor> list;
final List<Sensor> fullList = getFullSensorList(); final List<Sensor> fullList = getFullSensorList();
synchronized (mSensorListByType) { if (type == Sensor.TYPE_ALL) {
list = mSensorListByType.get(type); list = fullList;
if (list == null) { } else {
if (type == Sensor.TYPE_ALL) { list = new ArrayList<Sensor>();
list = fullList; for (Sensor i : fullList) {
} else { if (i.getType() == type)
list = new ArrayList<Sensor>(); list.add(i);
for (Sensor i : fullList) {
if (i.getType() == type)
list.add(i);
}
}
list = Collections.unmodifiableList(list);
mSensorListByType.append(type, list);
} }
} }
list = Collections.unmodifiableList(list);
return list; return list;
} }
@@ -446,7 +439,6 @@ public abstract class SensorManager {
*/ */
public Sensor getDefaultSensor(int type) { public Sensor getDefaultSensor(int type) {
// TODO: need to be smarter, for now, just return the 1st sensor // TODO: need to be smarter, for now, just return the 1st sensor
List<Sensor> l = getSensorList(type);
boolean wakeUpSensor = false; boolean wakeUpSensor = false;
// For the following sensor types, return a wake-up sensor. These types are by default // 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 // 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) { type == Sensor.TYPE_WRIST_TILT_GESTURE) {
wakeUpSensor = true; wakeUpSensor = true;
} }
return getDefaultSensor(type, wakeUpSensor);
for (Sensor sensor : l) {
if (sensor.isWakeUpSensor() == wakeUpSensor) return sensor;
}
return null;
} }
/** /**
@@ -491,9 +479,9 @@ public abstract class SensorManager {
* @see Sensor#isWakeUpSensor() * @see Sensor#isWakeUpSensor()
*/ */
public Sensor getDefaultSensor(int type, boolean wakeUp) { public Sensor getDefaultSensor(int type, boolean wakeUp) {
List<Sensor> l = getSensorList(type); final List<Sensor> l = getFullSensorList();
for (Sensor sensor : l) { for (Sensor sensor : l) {
if (sensor.isWakeUpSensor() == wakeUp) if (sensor.getType() == type && sensor.isWakeUpSensor() == wakeUp)
return sensor; return sensor;
} }
return null; return null;

View File

@@ -52,6 +52,7 @@ public class SystemSensorManager extends SensorManager {
private final Object mLock = new Object(); private final Object mLock = new Object();
private final ArrayList<Sensor> mFullSensorsList = new ArrayList<>(); private final ArrayList<Sensor> mFullSensorsList = new ArrayList<>();
private List<Sensor> mSensorsListCached = null;
private final SparseArray<Sensor> mHandleToSensor = new SparseArray<>(); private final SparseArray<Sensor> mHandleToSensor = new SparseArray<>();
// Listener list // Listener list
@@ -60,6 +61,8 @@ public class SystemSensorManager extends SensorManager {
private final HashMap<TriggerEventListener, TriggerEventQueue> mTriggerListeners = private final HashMap<TriggerEventListener, TriggerEventQueue> mTriggerListeners =
new HashMap<TriggerEventListener, TriggerEventQueue>(); new HashMap<TriggerEventListener, TriggerEventQueue>();
private boolean mBodySensorPermission;
// Looper associated with the context in which this instance was created. // Looper associated with the context in which this instance was created.
private final Looper mMainLooper; private final Looper mMainLooper;
private final int mTargetSdkLevel; private final int mTargetSdkLevel;
@@ -74,6 +77,7 @@ public class SystemSensorManager extends SensorManager {
mNativeInstance = nativeCreate(context.getOpPackageName()); mNativeInstance = nativeCreate(context.getOpPackageName());
synchronized(mLock) { synchronized(mLock) {
updatePermission();
if (!sSensorModuleInitialized) { if (!sSensorModuleInitialized) {
sSensorModuleInitialized = true; sSensorModuleInitialized = true;
nativeClassInit(); nativeClassInit();
@@ -89,11 +93,27 @@ public class SystemSensorManager extends SensorManager {
} }
} }
/** @hide */ /** @hide */
@Override @Override
protected List<Sensor> getFullSensorList() { protected List<Sensor> getFullSensorList() {
return mFullSensorsList; synchronized (mLock) {
if ( updatePermission() || mSensorsListCached == null) {
List<Sensor> 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, * BaseEventQueue is the communication channel with the sensor service,
* SensorEventQueue, TriggerEventQueue are subclases and there is one-to-one mapping between * SensorEventQueue, TriggerEventQueue are subclases and there is one-to-one mapping between

View File

@@ -52,13 +52,12 @@ ASensorManager* ASensorManager_getInstanceForPackage(const char* packageName)
} }
} }
int ASensorManager_getSensorList(ASensorManager* manager, int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list)
ASensorList* list)
{ {
Sensor const* const* l; Sensor const* const* sensorPointerList;
int c = static_cast<SensorManager*>(manager)->getSensorList(&l); int c = static_cast<SensorManager*>(manager)->getAvailableSensorList(&sensorPointerList);
if (list) { if (list) {
*list = reinterpret_cast<ASensorList>(l); *list = reinterpret_cast<ASensorList>(sensorPointerList);
} }
return c; return c;
} }
@@ -71,7 +70,7 @@ ASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type
ASensor const* ASensorManager_getDefaultSensorEx(ASensorManager* manager, ASensor const* ASensorManager_getDefaultSensorEx(ASensorManager* manager,
int type, bool wakeUp) { int type, bool wakeUp) {
Sensor const* const* sensorList; Sensor const* const* sensorList;
size_t size = static_cast<SensorManager*>(manager)->getSensorList(&sensorList); size_t size = static_cast<SensorManager*>(manager)->getAvailableSensorList(&sensorList);
for (size_t i = 0; i < size; ++i) { for (size_t i = 0; i < size; ++i) {
if (ASensor_getType(sensorList[i]) == type && if (ASensor_getType(sensorList[i]) == type &&
ASensor_isWakeUpSensor(sensorList[i]) == wakeUp) { ASensor_isWakeUpSensor(sensorList[i]) == wakeUp) {