| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.device.sensors; | 5 package org.chromium.device.sensors; |
| 6 | 6 |
| 7 import android.content.Context; | 7 import android.content.Context; |
| 8 import android.hardware.Sensor; | 8 import android.hardware.Sensor; |
| 9 import android.hardware.SensorEvent; | 9 import android.hardware.SensorEvent; |
| 10 import android.hardware.SensorEventListener; | 10 import android.hardware.SensorEventListener; |
| 11 import android.hardware.SensorManager; | 11 import android.hardware.SensorManager; |
| 12 import android.os.Handler; | 12 import android.os.Handler; |
| 13 import android.os.HandlerThread; | 13 import android.os.HandlerThread; |
| 14 | 14 |
| 15 import org.chromium.base.CollectionUtil; | 15 import org.chromium.base.CollectionUtil; |
| 16 import org.chromium.base.ContextUtils; |
| 16 import org.chromium.base.Log; | 17 import org.chromium.base.Log; |
| 17 import org.chromium.base.ThreadUtils; | 18 import org.chromium.base.ThreadUtils; |
| 18 import org.chromium.base.VisibleForTesting; | 19 import org.chromium.base.VisibleForTesting; |
| 19 import org.chromium.base.annotations.CalledByNative; | 20 import org.chromium.base.annotations.CalledByNative; |
| 20 import org.chromium.base.annotations.JNINamespace; | 21 import org.chromium.base.annotations.JNINamespace; |
| 21 | 22 |
| 22 import java.util.HashSet; | 23 import java.util.HashSet; |
| 23 import java.util.List; | 24 import java.util.List; |
| 24 import java.util.Set; | 25 import java.util.Set; |
| 25 | 26 |
| 26 /** | 27 /** |
| 27 * Android implementation of the device {motion|orientation} APIs. | 28 * Android implementation of the device {motion|orientation} APIs. |
| 28 */ | 29 */ |
| 29 @JNINamespace("device") | 30 @JNINamespace("device") |
| 30 class DeviceSensors implements SensorEventListener { | 31 class DeviceSensors implements SensorEventListener { |
| 31 private static final String TAG = "DeviceSensors"; | 32 private static final String TAG = "DeviceSensors"; |
| 32 | 33 |
| 33 // Matches kEnableExperimentalWebPlatformFeatures. | 34 // Matches kEnableExperimentalWebPlatformFeatures. |
| 34 private static final String EXPERIMENTAL_WEB_PLAFTORM_FEATURES = | 35 private static final String EXPERIMENTAL_WEB_PLAFTORM_FEATURES = |
| 35 "enable-experimental-web-platform-features"; | 36 "enable-experimental-web-platform-features"; |
| 36 | 37 |
| 37 // These fields are lazily initialized by getHandler(). | 38 // These fields are lazily initialized by getHandler(). |
| 38 private Thread mThread; | 39 private Thread mThread; |
| 39 private Handler mHandler; | 40 private Handler mHandler; |
| 40 | 41 |
| 41 // A reference to the application context in order to acquire the SensorServ
ice. | |
| 42 private final Context mAppContext; | |
| 43 | |
| 44 // The lock to access the mHandler. | 42 // The lock to access the mHandler. |
| 45 private final Object mHandlerLock = new Object(); | 43 private final Object mHandlerLock = new Object(); |
| 46 | 44 |
| 47 // Non-zero if and only if we're listening for events. | 45 // Non-zero if and only if we're listening for events. |
| 48 // To avoid race conditions on the C++ side, access must be synchronized. | 46 // To avoid race conditions on the C++ side, access must be synchronized. |
| 49 private long mNativePtr; | 47 private long mNativePtr; |
| 50 | 48 |
| 51 // The lock to access the mNativePtr. | 49 // The lock to access the mNativePtr. |
| 52 private final Object mNativePtrLock = new Object(); | 50 private final Object mNativePtrLock = new Object(); |
| 53 | 51 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 81 @VisibleForTesting | 79 @VisibleForTesting |
| 82 final Set<Integer> mActiveSensors = new HashSet<Integer>(); | 80 final Set<Integer> mActiveSensors = new HashSet<Integer>(); |
| 83 final List<Set<Integer>> mOrientationSensorSets; | 81 final List<Set<Integer>> mOrientationSensorSets; |
| 84 Set<Integer> mDeviceOrientationSensors; | 82 Set<Integer> mDeviceOrientationSensors; |
| 85 boolean mDeviceMotionIsActive; | 83 boolean mDeviceMotionIsActive; |
| 86 boolean mDeviceOrientationIsActive; | 84 boolean mDeviceOrientationIsActive; |
| 87 boolean mDeviceOrientationIsActiveWithBackupSensors; | 85 boolean mDeviceOrientationIsActiveWithBackupSensors; |
| 88 boolean mDeviceOrientationAbsoluteIsActive; | 86 boolean mDeviceOrientationAbsoluteIsActive; |
| 89 boolean mOrientationNotAvailable; | 87 boolean mOrientationNotAvailable; |
| 90 | 88 |
| 91 protected DeviceSensors(Context context) { | 89 protected DeviceSensors() { |
| 92 mAppContext = context.getApplicationContext(); | |
| 93 | |
| 94 mOrientationSensorSets = CollectionUtil.newArrayList(DEVICE_ORIENTATION_
SENSORS_A, | 90 mOrientationSensorSets = CollectionUtil.newArrayList(DEVICE_ORIENTATION_
SENSORS_A, |
| 95 DEVICE_ORIENTATION_SENSORS_B, DEVICE_ORIENTATION_SENSORS_C); | 91 DEVICE_ORIENTATION_SENSORS_B, DEVICE_ORIENTATION_SENSORS_C); |
| 96 } | 92 } |
| 97 | 93 |
| 98 // For orientation we use a 3-way fallback approach where up to 3 different
sets of sensors | 94 // For orientation we use a 3-way fallback approach where up to 3 different
sets of sensors |
| 99 // are attempted if necessary. The sensors to be used for orientation are de
termined in the | 95 // are attempted if necessary. The sensors to be used for orientation are de
termined in the |
| 100 // following order: | 96 // following order: |
| 101 // A: GAME_ROTATION_VECTOR (relative) | 97 // A: GAME_ROTATION_VECTOR (relative) |
| 102 // B: ROTATION_VECTOR (absolute) | 98 // B: ROTATION_VECTOR (absolute) |
| 103 // C: combination of ACCELEROMETER and MAGNETIC_FIELD (absolute) | 99 // C: combination of ACCELEROMETER and MAGNETIC_FIELD (absolute) |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 Math.toDegrees(mRotationAngles[2])); | 412 Math.toDegrees(mRotationAngles[2])); |
| 417 } | 413 } |
| 418 | 414 |
| 419 private SensorManagerProxy getSensorManagerProxy() { | 415 private SensorManagerProxy getSensorManagerProxy() { |
| 420 if (mSensorManagerProxy != null) { | 416 if (mSensorManagerProxy != null) { |
| 421 return mSensorManagerProxy; | 417 return mSensorManagerProxy; |
| 422 } | 418 } |
| 423 | 419 |
| 424 ThreadUtils.assertOnUiThread(); | 420 ThreadUtils.assertOnUiThread(); |
| 425 SensorManager sensorManager = | 421 SensorManager sensorManager = |
| 426 (SensorManager) mAppContext.getSystemService(Context.SENSOR_SERV
ICE); | 422 (SensorManager) ContextUtils.getApplicationContext().getSystemSe
rvice( |
| 423 Context.SENSOR_SERVICE); |
| 427 | 424 |
| 428 if (sensorManager != null) { | 425 if (sensorManager != null) { |
| 429 mSensorManagerProxy = new SensorManagerProxyImpl(sensorManager); | 426 mSensorManagerProxy = new SensorManagerProxyImpl(sensorManager); |
| 430 } | 427 } |
| 431 return mSensorManagerProxy; | 428 return mSensorManagerProxy; |
| 432 } | 429 } |
| 433 | 430 |
| 434 @VisibleForTesting | 431 @VisibleForTesting |
| 435 void setSensorManagerProxy(SensorManagerProxy sensorManagerProxy) { | 432 void setSensorManagerProxy(SensorManagerProxy sensorManagerProxy) { |
| 436 mSensorManagerProxy = sensorManagerProxy; | 433 mSensorManagerProxy = sensorManagerProxy; |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 if (mHandler == null) { | 555 if (mHandler == null) { |
| 559 HandlerThread thread = new HandlerThread("DeviceMotionAndOrienta
tion"); | 556 HandlerThread thread = new HandlerThread("DeviceMotionAndOrienta
tion"); |
| 560 thread.start(); | 557 thread.start(); |
| 561 mHandler = new Handler(thread.getLooper()); // blocks on thread
start | 558 mHandler = new Handler(thread.getLooper()); // blocks on thread
start |
| 562 } | 559 } |
| 563 return mHandler; | 560 return mHandler; |
| 564 } | 561 } |
| 565 } | 562 } |
| 566 | 563 |
| 567 @CalledByNative | 564 @CalledByNative |
| 568 static DeviceSensors create(Context appContext) { | 565 static DeviceSensors create() { |
| 569 return new DeviceSensors(appContext); | 566 return new DeviceSensors(); |
| 570 } | 567 } |
| 571 | 568 |
| 572 /** | 569 /** |
| 573 * Native JNI calls, | 570 * Native JNI calls, |
| 574 * see device/sensors/sensor_manager_android.cc | 571 * see device/sensors/sensor_manager_android.cc |
| 575 */ | 572 */ |
| 576 | 573 |
| 577 /** | 574 /** |
| 578 * Orientation of the device with respect to its reference frame. | 575 * Orientation of the device with respect to its reference frame. |
| 579 */ | 576 */ |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 mSensorManager.unregisterListener(listener, sensors.get(0)); | 637 mSensorManager.unregisterListener(listener, sensors.get(0)); |
| 641 } catch (IllegalArgumentException e) { | 638 } catch (IllegalArgumentException e) { |
| 642 // Suppress occasional exception on Digma iDxD* devices: | 639 // Suppress occasional exception on Digma iDxD* devices: |
| 643 // Receiver not registered: android.hardware.SystemSensorManager
$1 | 640 // Receiver not registered: android.hardware.SystemSensorManager
$1 |
| 644 // See crbug.com/596453. | 641 // See crbug.com/596453. |
| 645 Log.w(TAG, "Failed to unregister device sensor " + sensors.get(0
).getName()); | 642 Log.w(TAG, "Failed to unregister device sensor " + sensors.get(0
).getName()); |
| 646 } | 643 } |
| 647 } | 644 } |
| 648 } | 645 } |
| 649 } | 646 } |
| OLD | NEW |