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
*/
public List<Sensor> getSensorList(int type) {
// cache the returned lists the first time
List<Sensor> list;
final List<Sensor> fullList = getFullSensorList();
synchronized (mSensorListByType) {
list = mSensorListByType.get(type);
if (list == null) {
if (type == Sensor.TYPE_ALL) {
list = fullList;
} else {
list = new ArrayList<Sensor>();
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<Sensor>();
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<Sensor> 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<Sensor> l = getSensorList(type);
final List<Sensor> l = getFullSensorList();
for (Sensor sensor : l) {
if (sensor.isWakeUpSensor() == wakeUp)
if (sensor.getType() == type && sensor.isWakeUpSensor() == wakeUp)
return sensor;
}
return null;

View File

@@ -52,6 +52,7 @@ public class SystemSensorManager extends SensorManager {
private final Object mLock = new Object();
private final ArrayList<Sensor> mFullSensorsList = new ArrayList<>();
private List<Sensor> mSensorsListCached = null;
private final SparseArray<Sensor> mHandleToSensor = new SparseArray<>();
// Listener list
@@ -60,6 +61,8 @@ public class SystemSensorManager extends SensorManager {
private final HashMap<TriggerEventListener, TriggerEventQueue> mTriggerListeners =
new HashMap<TriggerEventListener, TriggerEventQueue>();
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<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,
* 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,
ASensorList* list)
int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list)
{
Sensor const* const* l;
int c = static_cast<SensorManager*>(manager)->getSensorList(&l);
Sensor const* const* sensorPointerList;
int c = static_cast<SensorManager*>(manager)->getAvailableSensorList(&sensorPointerList);
if (list) {
*list = reinterpret_cast<ASensorList>(l);
*list = reinterpret_cast<ASensorList>(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<SensorManager*>(manager)->getSensorList(&sensorList);
size_t size = static_cast<SensorManager*>(manager)->getAvailableSensorList(&sensorList);
for (size_t i = 0; i < size; ++i) {
if (ASensor_getType(sensorList[i]) == type &&
ASensor_isWakeUpSensor(sensorList[i]) == wakeUp) {