| Index: device/generic_sensor/android/java/src/org/chromium/device/sensors/PlatformSensorProvider.java
|
| diff --git a/device/generic_sensor/android/java/src/org/chromium/device/sensors/PlatformSensorProvider.java b/device/generic_sensor/android/java/src/org/chromium/device/sensors/PlatformSensorProvider.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..18aebf099213256d52fc682a404cc447cad1a308
|
| --- /dev/null
|
| +++ b/device/generic_sensor/android/java/src/org/chromium/device/sensors/PlatformSensorProvider.java
|
| @@ -0,0 +1,167 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.device.sensors;
|
| +
|
| +import android.content.Context;
|
| +import android.hardware.Sensor;
|
| +import android.hardware.SensorManager;
|
| +import android.os.Build;
|
| +import android.os.Handler;
|
| +import android.os.HandlerThread;
|
| +
|
| +import org.chromium.base.ContextUtils;
|
| +import org.chromium.base.annotations.CalledByNative;
|
| +import org.chromium.base.annotations.JNINamespace;
|
| +import org.chromium.device.mojom.SensorType;
|
| +
|
| +import java.util.HashSet;
|
| +import java.util.Set;
|
| +
|
| +/**
|
| + * Lifetime is controlled by device::PlatformSensorProviderAndroid.
|
| + */
|
| +@JNINamespace("device")
|
| +class PlatformSensorProvider {
|
| + /**
|
| + * SensorManager that is shared among PlatformSensor objects. It is used for Sensor object
|
| + * creation and @see android.hardware.SensorEventListener registration.
|
| + * @see android.hardware.SensorManager
|
| + */
|
| + private final SensorManager mSensorManager;
|
| +
|
| + /**
|
| + * Thread that is handling all sensor events.
|
| + */
|
| + private HandlerThread mSensorsThread;
|
| +
|
| + /**
|
| + * Processes messages on #mSensorsThread message queue. Provided to #mSensorManager when
|
| + * sensor should start polling for data.
|
| + */
|
| + private Handler mHandler;
|
| +
|
| + /**
|
| + * Set of currently active PlatformSensor objects.
|
| + */
|
| + private final Set<PlatformSensor> mActiveSensors = new HashSet<PlatformSensor>();
|
| +
|
| + /**
|
| + * Returns shared thread Handler.
|
| + *
|
| + * @return Handler thread handler.
|
| + */
|
| + public Handler getHandler() {
|
| + return mHandler;
|
| + }
|
| +
|
| + /**
|
| + * Returns shared SensorManager.
|
| + *
|
| + * @return SensorManager sensor manager.
|
| + */
|
| + public SensorManager getSensorManager() {
|
| + return mSensorManager;
|
| + }
|
| +
|
| + /**
|
| + * Notifies PlatformSensorProvider that sensor started polling for data. Adds sensor to
|
| + * a set of active sensors, creates and starts new thread if needed.
|
| + */
|
| + public void sensorStarted(PlatformSensor sensor) {
|
| + if (mActiveSensors.isEmpty()) startSensorThread();
|
| + mActiveSensors.add(sensor);
|
| + }
|
| +
|
| + /**
|
| + * Notifies PlatformSensorProvider that sensor is no longer polling for data. When
|
| + * #mActiveSensors becomes empty thread is stopped.
|
| + */
|
| + public void sensorStopped(PlatformSensor sensor) {
|
| + mActiveSensors.remove(sensor);
|
| + if (mActiveSensors.isEmpty()) stopSensorThread();
|
| + }
|
| +
|
| + /**
|
| + * Starts sensor handler thread.
|
| + */
|
| + protected void startSensorThread() {
|
| + if (mSensorsThread == null) {
|
| + mSensorsThread = new HandlerThread("SensorsHandlerThread");
|
| + mSensorsThread.start();
|
| + mHandler = new Handler(mSensorsThread.getLooper());
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Stops sensor handler thread.
|
| + */
|
| + protected void stopSensorThread() {
|
| + if (mSensorsThread != null) {
|
| + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
|
| + mSensorsThread.quitSafely();
|
| + } else {
|
| + mSensorsThread.quit();
|
| + }
|
| + mSensorsThread = null;
|
| + mHandler = null;
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Constructor.
|
| + */
|
| + protected PlatformSensorProvider(Context context) {
|
| + mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
|
| + }
|
| +
|
| + /**
|
| + * Creates PlatformSensorProvider instance.
|
| + *
|
| + * @return PlatformSensorProvider new PlatformSensorProvider instance.
|
| + */
|
| + protected static PlatformSensorProvider createForTest(Context context) {
|
| + return new PlatformSensorProvider(context);
|
| + }
|
| +
|
| + /**
|
| + * Creates PlatformSensorProvider instance.
|
| + *
|
| + * @return PlatformSensorProvider new PlatformSensorProvider instance.
|
| + */
|
| + @CalledByNative
|
| + protected static PlatformSensorProvider create() {
|
| + return new PlatformSensorProvider(ContextUtils.getApplicationContext());
|
| + }
|
| +
|
| + /**
|
| + * Creates PlatformSensor instance.
|
| + *
|
| + * @param type type of a sensor.
|
| + * @return PlatformSensor new PlatformSensor instance or null if sensor cannot be created.
|
| + */
|
| + @CalledByNative
|
| + protected PlatformSensor createSensor(int type) {
|
| + if (mSensorManager == null) return null;
|
| +
|
| + switch (type) {
|
| + case SensorType.AMBIENT_LIGHT:
|
| + return PlatformSensor.create(Sensor.TYPE_LIGHT, 1, this);
|
| + case SensorType.ACCELEROMETER:
|
| + return PlatformSensor.create(Sensor.TYPE_ACCELEROMETER, 3, this);
|
| + case SensorType.LINEAR_ACCELERATION:
|
| + return PlatformSensor.create(Sensor.TYPE_LINEAR_ACCELERATION, 3, this);
|
| + case SensorType.GYROSCOPE:
|
| + return PlatformSensor.create(Sensor.TYPE_GYROSCOPE, 3, this);
|
| + case SensorType.MAGNETOMETER:
|
| + return PlatformSensor.create(Sensor.TYPE_MAGNETIC_FIELD, 3, this);
|
| + case SensorType.ABSOLUTE_ORIENTATION:
|
| + return PlatformSensor.create(Sensor.TYPE_ROTATION_VECTOR, 4, this);
|
| + case SensorType.RELATIVE_ORIENTATION:
|
| + return PlatformSensor.create(Sensor.TYPE_GAME_ROTATION_VECTOR, 4, this);
|
| + default:
|
| + return null;
|
| + }
|
| + }
|
| +}
|
|
|