From d4db27b092331cd02503a9d54d1fc780a8d042e9 Mon Sep 17 00:00:00 2001 From: Jimmy Shih Date: Sat, 26 May 2012 13:33:23 -0700 Subject: [PATCH] Clean up SensorManager code. check for sensor channel when the sensor state is NONE. --- .../services/TrackRecordingService.java | 4 +- .../sensors/BluetoothSensorManager.java | 19 ++- .../services/sensors/SensorManager.java | 130 ++++++++---------- .../sensors/SensorManagerFactory.java | 4 +- .../sensors/ant/AntSensorManager.java | 4 +- 5 files changed, 79 insertions(+), 82 deletions(-) diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java index f0dbffa2e..79468fbfe 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java @@ -724,7 +724,7 @@ public class TrackRecordingService extends Service { boolean hasSensorData = sensorManager != null && sensorManager.isEnabled() && sensorManager.getSensorDataSet() != null - && sensorManager.isDataValid(); + && sensorManager.isSensorDataSetValid(); // If the user has been stationary for two recording just record the first // two and ignore the rest. This code will only have an effect if the @@ -823,7 +823,7 @@ public class TrackRecordingService extends Service { Location locationToInsert = location; if (sensorManager != null && sensorManager.isEnabled()) { SensorDataSet sd = sensorManager.getSensorDataSet(); - if (sd != null && sensorManager.isDataValid()) { + if (sd != null && sensorManager.isSensorDataSetValid()) { locationToInsert = new MyTracksLocation(location, sd); } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/sensors/BluetoothSensorManager.java b/MyTracks/src/com/google/android/apps/mytracks/services/sensors/BluetoothSensorManager.java index 759e4daa4..6b81b4be4 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/sensors/BluetoothSensorManager.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/sensors/BluetoothSensorManager.java @@ -19,6 +19,8 @@ import static com.google.android.apps.mytracks.Constants.TAG; import com.google.android.apps.mytracks.Constants; import com.google.android.apps.mytracks.content.Sensor; +import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; +import com.google.android.apps.mytracks.content.Sensor.SensorState; import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.maps.mytracks.R; @@ -118,11 +120,13 @@ public class BluetoothSensorManager extends SensorManager { return adapters.get(0); } + @Override public boolean isEnabled() { return bluetoothAdapter != null && bluetoothAdapter.isEnabled(); } - public void setupChannel() { + @Override + protected void setUpChannel() { if (!isEnabled() || connectionManager == null) { Log.w(Constants.TAG, "Disabled manager onStartTrack"); return; @@ -158,21 +162,22 @@ public class BluetoothSensorManager extends SensorManager { } } - public void onDestroy() { + @Override + protected void tearDownChannel() { // Stop the Bluetooth sensor services if (connectionManager != null) { connectionManager.stop(); } } - public Sensor.SensorDataSet getSensorDataSet() { + @Override + public SensorDataSet getSensorDataSet() { return sensorDataSet; } - public Sensor.SensorState getSensorState() { - return (connectionManager == null) - ? Sensor.SensorState.NONE - : connectionManager.getState(); + @Override + public SensorState getSensorState() { + return connectionManager == null ? Sensor.SensorState.NONE : connectionManager.getState(); } // The Handler that gets information back from the BluetoothSensorService diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/sensors/SensorManager.java b/MyTracks/src/com/google/android/apps/mytracks/services/sensors/SensorManager.java index cb217e590..eb63ce6a0 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/sensors/SensorManager.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/sensors/SensorManager.java @@ -13,126 +13,118 @@ * License for the specific language governing permissions and limitations under * the License. */ + package com.google.android.apps.mytracks.services.sensors; +import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; +import com.google.android.apps.mytracks.content.Sensor.SensorState; + +import android.util.Log; + import java.util.Timer; import java.util.TimerTask; -import android.util.Log; - -import com.google.android.apps.mytracks.Constants; -import com.google.android.apps.mytracks.content.Sensor; - /** * Manage the connection to a sensor. - * + * * @author Sandor Dornbush */ public abstract class SensorManager { - /** - * The maximum age where the data is considered valid. - */ - public static final long MAX_AGE = 5000; + private static final String TAG = SensorManager.class.getSimpleName(); + private static final long MAX_SENSOR_DATE_SET_AGE = 5000; + private static final long MAX_SENSOR_STATE_AGE = 30000; + private static final int RETRY_PERIOD = 30000; + + private SensorState sensorState = SensorState.NONE; + private long sensorStateTimestamp = System.currentTimeMillis(); /** - * Time to wait after a time out to retry. + * A time task to check sensor connection. */ - public static final int RETRY_PERIOD = 30000; - - private Sensor.SensorState sensorState = Sensor.SensorState.NONE; - - private long sensorStateTimestamp = 0; - - /** - * A task to run periodically to check to see if connection was lost. - */ - private TimerTask checkSensorManager = new TimerTask() { - @Override + private TimerTask checkSensorConnectionTimeTask = new TimerTask() { + @Override public void run() { - Log.i(Constants.TAG, - "SensorManager state: " + getSensorState()); switch (getSensorState()) { case CONNECTING: - long age = System.currentTimeMillis() - getSensorStateTimestamp(); - if (age > 2 * RETRY_PERIOD) { - Log.i(Constants.TAG, "Retrying connecting SensorManager."); - setupChannel(); + if (System.currentTimeMillis() - sensorStateTimestamp > MAX_SENSOR_STATE_AGE) { + Log.i(TAG, "Retry setUpChannel"); + setUpChannel(); } break; + case NONE: case DISCONNECTED: - Log.i(Constants.TAG, - "Re-registering disconnected SensoManager."); - setupChannel(); + setUpChannel(); + break; + default: break; } } }; - /** - * This timer invokes periodically the checkLocationListener timer task. - */ private final Timer timer = new Timer(); /** - * Is the sensor that this manages enabled. - * @return true if the sensor is enabled + * Returns true if the sensor is enabled. */ public abstract boolean isEnabled(); /** - * This is called when my tracks starts recording a new track. - * This is the place to open connections to the sensor. + * Sets up the sensor channel. */ - public void onStartTrack() { - setupChannel(); - timer.schedule(checkSensorManager, RETRY_PERIOD, RETRY_PERIOD); + protected abstract void setUpChannel(); + + /** + * Tears down the sensor channel. + */ + protected abstract void tearDownChannel(); + + /** + * Gets the sensor data set. + */ + public abstract SensorDataSet getSensorDataSet(); + + /** + * Starts the sensor. + */ + public void startSensor() { + setUpChannel(); + timer.schedule(checkSensorConnectionTimeTask, RETRY_PERIOD, RETRY_PERIOD); } /** - * This method is used to set up any necessary connections to underlying - * sensor hardware. + * Stops the sensor. */ - protected abstract void setupChannel(); - - public void shutdown() { + public void stopSensor() { timer.cancel(); - onDestroy(); + tearDownChannel(); } /** - * This is called when my tracks stops recording. - * This is the place to shutdown any open connections. + * Sets the sensor state. + * + * @param sensorState the sensor state */ - public abstract void onDestroy(); - - /** - * Return the last sensor reading. - * @return The last reading from the sensor. - */ - public abstract Sensor.SensorDataSet getSensorDataSet(); - - public void setSensorState(Sensor.SensorState sensorState) { + public void setSensorState(SensorState sensorState) { + sensorStateTimestamp = System.currentTimeMillis(); this.sensorState = sensorState; } /** - * Return the current sensor state. - * @return The current sensor state. + * Gets the sensor state. */ - public Sensor.SensorState getSensorState() { + public SensorState getSensorState() { return sensorState; } - public long getSensorStateTimestamp() { - return sensorStateTimestamp; - } - /** - * @return True if the data is recent enough to be considered valid. + * Returns true if the sensor data set is valid. */ - public boolean isDataValid() { - return (System.currentTimeMillis() - getSensorDataSet().getCreationTime()) < MAX_AGE; + public boolean isSensorDataSetValid() { + SensorDataSet sensorDataSet = getSensorDataSet(); + if (sensorDataSet == null) { + return false; + } + return (System.currentTimeMillis() - sensorDataSet.getCreationTime()) < MAX_SENSOR_DATE_SET_AGE; } - } diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/sensors/SensorManagerFactory.java b/MyTracks/src/com/google/android/apps/mytracks/services/sensors/SensorManagerFactory.java index 853355ebf..92dbfd06b 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/sensors/SensorManagerFactory.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/sensors/SensorManagerFactory.java @@ -84,7 +84,7 @@ public class SensorManagerFactory { } activeSensorType = sensorType; refCount = 1; - activeSensorManager.onStartTrack(); + activeSensorManager.startSensor(); return activeSensorManager; } @@ -105,7 +105,7 @@ public class SensorManagerFactory { private void reset() { activeSensorType = null; if (activeSensorManager != null) { - activeSensorManager.shutdown(); + activeSensorManager.stopSensor(); } activeSensorManager = null; refCount = 0; diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/sensors/ant/AntSensorManager.java b/MyTracks/src/com/google/android/apps/mytracks/services/sensors/ant/AntSensorManager.java index 3d8bce09b..d174a6138 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/sensors/ant/AntSensorManager.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/sensors/ant/AntSensorManager.java @@ -133,7 +133,7 @@ public abstract class AntSensorManager extends SensorManager { } @Override - public void onDestroy() { + protected void tearDownChannel() { Log.i(TAG, "destroying AntSensorManager"); cleanAntInterface(); @@ -161,7 +161,7 @@ public abstract class AntSensorManager extends SensorManager { * {@link #setupAntSensorChannels}. */ @Override - protected final void setupChannel() { + protected void setUpChannel() { setup(); }