Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 83d0078f authored by Peng Xu's avatar Peng Xu Committed by Android (Google) Code Review
Browse files

Merge "Fix NC caused by race condition in SystemSensorManager" into nyc-dev

parents d3eb078a aa957274
Loading
Loading
Loading
Loading
+26 −27
Original line number Original line Diff line number Diff line
@@ -54,10 +54,9 @@ public class SystemSensorManager extends SensorManager {
    private static native void nativeGetDynamicSensors(long nativeInstance, List<Sensor> list);
    private static native void nativeGetDynamicSensors(long nativeInstance, List<Sensor> list);
    private static native boolean nativeIsDataInjectionEnabled(long nativeInstance);
    private static native boolean nativeIsDataInjectionEnabled(long nativeInstance);


    private static final Object sLock = new Object();
    private static boolean sSensorModuleInitialized = false;
    private static boolean sSensorModuleInitialized = false;
    private static InjectEventQueue mInjectEventQueue = null;
    private static InjectEventQueue sInjectEventQueue = null;

    private final Object mLock = new Object();


    private final ArrayList<Sensor> mFullSensorsList = new ArrayList<>();
    private final ArrayList<Sensor> mFullSensorsList = new ArrayList<>();
    private List<Sensor> mFullDynamicSensorsList = new ArrayList<>();
    private List<Sensor> mFullDynamicSensorsList = new ArrayList<>();
@@ -84,16 +83,17 @@ public class SystemSensorManager extends SensorManager {


    /** {@hide} */
    /** {@hide} */
    public SystemSensorManager(Context context, Looper mainLooper) {
    public SystemSensorManager(Context context, Looper mainLooper) {
        mMainLooper = mainLooper;
        synchronized(sLock) {
        mTargetSdkLevel = context.getApplicationInfo().targetSdkVersion;
        mContext = context;
        mNativeInstance = nativeCreate(context.getOpPackageName());

        synchronized(mLock) {
            if (!sSensorModuleInitialized) {
            if (!sSensorModuleInitialized) {
                sSensorModuleInitialized = true;
                sSensorModuleInitialized = true;
                nativeClassInit();
                nativeClassInit();
            }
            }
        }

        mMainLooper = mainLooper;
        mTargetSdkLevel = context.getApplicationInfo().targetSdkVersion;
        mContext = context;
        mNativeInstance = nativeCreate(context.getOpPackageName());


        // initialize the sensor list
        // initialize the sensor list
        for (int index = 0;;++index) {
        for (int index = 0;;++index) {
@@ -103,7 +103,6 @@ public class SystemSensorManager extends SensorManager {
            mHandleToSensor.put(sensor.getHandle(), sensor);
            mHandleToSensor.put(sensor.getHandle(), sensor);
        }
        }
    }
    }
    }




    /** @hide */
    /** @hide */
@@ -257,7 +256,7 @@ public class SystemSensorManager extends SensorManager {
    }
    }


    protected boolean initDataInjectionImpl(boolean enable) {
    protected boolean initDataInjectionImpl(boolean enable) {
        synchronized (mLock) {
        synchronized (sLock) {
            if (enable) {
            if (enable) {
                boolean isDataInjectionModeEnabled = nativeIsDataInjectionEnabled(mNativeInstance);
                boolean isDataInjectionModeEnabled = nativeIsDataInjectionEnabled(mNativeInstance);
                // The HAL does not support injection OR SensorService hasn't been set in DI mode.
                // The HAL does not support injection OR SensorService hasn't been set in DI mode.
@@ -266,15 +265,15 @@ public class SystemSensorManager extends SensorManager {
                    return false;
                    return false;
                }
                }
                // Initialize a client for data_injection.
                // Initialize a client for data_injection.
                if (mInjectEventQueue == null) {
                if (sInjectEventQueue == null) {
                    mInjectEventQueue = new InjectEventQueue(mMainLooper, this,
                    sInjectEventQueue = new InjectEventQueue(mMainLooper, this,
                            mContext.getPackageName());
                            mContext.getPackageName());
                }
                }
            } else {
            } else {
                // If data injection is being disabled clean up the native resources.
                // If data injection is being disabled clean up the native resources.
                if (mInjectEventQueue != null) {
                if (sInjectEventQueue != null) {
                    mInjectEventQueue.dispose();
                    sInjectEventQueue.dispose();
                    mInjectEventQueue = null;
                    sInjectEventQueue = null;
                }
                }
            }
            }
            return true;
            return true;
@@ -283,17 +282,17 @@ public class SystemSensorManager extends SensorManager {


    protected boolean injectSensorDataImpl(Sensor sensor, float[] values, int accuracy,
    protected boolean injectSensorDataImpl(Sensor sensor, float[] values, int accuracy,
            long timestamp) {
            long timestamp) {
        synchronized (mLock) {
        synchronized (sLock) {
            if (mInjectEventQueue == null) {
            if (sInjectEventQueue == null) {
                Log.e(TAG, "Data injection mode not activated before calling injectSensorData");
                Log.e(TAG, "Data injection mode not activated before calling injectSensorData");
                return false;
                return false;
            }
            }
            int ret = mInjectEventQueue.injectSensorData(sensor.getHandle(), values, accuracy,
            int ret = sInjectEventQueue.injectSensorData(sensor.getHandle(), values, accuracy,
                                                         timestamp);
                                                         timestamp);
            // If there are any errors in data injection clean up the native resources.
            // If there are any errors in data injection clean up the native resources.
            if (ret != 0) {
            if (ret != 0) {
                mInjectEventQueue.dispose();
                sInjectEventQueue.dispose();
                mInjectEventQueue = null;
                sInjectEventQueue = null;
            }
            }
            return ret == 0;
            return ret == 0;
        }
        }