merge heads

This commit is contained in:
Jimmy Shih
2012-02-06 10:12:13 -08:00
4 changed files with 100 additions and 55 deletions
@@ -167,9 +167,7 @@ public class SensorStateActivity extends Activity {
// If no temp sensor manager is present, create one, and start it. // If no temp sensor manager is present, create one, and start it.
if (tempSensorManager == null) { if (tempSensorManager == null) {
tempSensorManager = SensorManagerFactory.getSensorManager(this); tempSensorManager = SensorManagerFactory.getInstance().getSensorManager(this);
if (tempSensorManager != null)
tempSensorManager.onStartTrack();
} }
// If a temp sensor manager is available, use states from temp sensor // If a temp sensor manager is available, use states from temp sensor
@@ -226,7 +224,7 @@ public class SensorStateActivity extends Activity {
*/ */
private void stopTempSensorManager() { private void stopTempSensorManager() {
if (tempSensorManager != null) { if (tempSensorManager != null) {
tempSensorManager.shutdown(); SensorManagerFactory.getInstance().releaseSensorManager(tempSensorManager);
tempSensorManager = null; tempSensorManager = null;
} }
} }
@@ -358,7 +358,7 @@ public class TrackRecordingService extends Service {
unregisterLocationListener(); unregisterLocationListener();
shutdownTaskExecutors(); shutdownTaskExecutors();
if (sensorManager != null) { if (sensorManager != null) {
sensorManager.shutdown(); SensorManagerFactory.getInstance().releaseSensorManager(sensorManager);
sensorManager = null; sensorManager = null;
} }
@@ -601,10 +601,7 @@ public class TrackRecordingService extends Service {
length = 0; length = 0;
showNotification(); showNotification();
registerLocationListener(); registerLocationListener();
sensorManager = SensorManagerFactory.getSensorManager(this); sensorManager = SensorManagerFactory.getInstance().getSensorManager(this);
if (sensorManager != null) {
sensorManager.onStartTrack();
}
// Reset the number of auto-resume retries. // Reset the number of auto-resume retries.
setAutoResumeTrackRetries(0); setAutoResumeTrackRetries(0);
@@ -1038,7 +1035,7 @@ public class TrackRecordingService extends Service {
prefManager.setRecordingTrack(recordingTrackId = -1); prefManager.setRecordingTrack(recordingTrackId = -1);
if (sensorManager != null) { if (sensorManager != null) {
sensorManager.shutdown(); SensorManagerFactory.getInstance().releaseSensorManager(sensorManager);
sensorManager = null; sensorManager = null;
} }
@@ -31,15 +31,28 @@ import android.util.Log;
*/ */
public class SensorManagerFactory { public class SensorManagerFactory {
private String activeSensorType;
private SensorManager activeSensorManager;
private int refCount;
private static SensorManagerFactory instance = new SensorManagerFactory();
private SensorManagerFactory() { private SensorManagerFactory() {
} }
/** /**
* Get a new sensor manager. * Get the factory instance.
*/
public static SensorManagerFactory getInstance() {
return instance;
}
/**
* Get and start a new sensor manager.
* @param context Context to fetch system preferences. * @param context Context to fetch system preferences.
* @return The sensor manager that corresponds to the sensor type setting. * @return The sensor manager that corresponds to the sensor type setting.
*/ */
public static SensorManager getSensorManager(Context context) { public SensorManager getSensorManager(Context context) {
SharedPreferences prefs = context.getSharedPreferences( SharedPreferences prefs = context.getSharedPreferences(
Constants.SETTINGS_NAME, Context.MODE_PRIVATE); Constants.SETTINGS_NAME, Context.MODE_PRIVATE);
if (prefs == null) { if (prefs == null) {
@@ -52,18 +65,54 @@ public class SensorManagerFactory {
Log.i(Constants.TAG, "Creating sensor of type: " + sensor); Log.i(Constants.TAG, "Creating sensor of type: " + sensor);
if (sensor == null) { if (sensor == null) {
reset();
return null; return null;
} else if (sensor.equals(context.getString(R.string.sensor_type_value_ant))) { }
return new AntDirectSensorManager(context); if (sensor.equals(activeSensorType)) {
Log.i(Constants.TAG, "Returning existing sensor manager.");
refCount++;
return activeSensorManager;
}
reset();
if (sensor.equals(context.getString(R.string.sensor_type_value_ant))) {
activeSensorManager = new AntDirectSensorManager(context);
} else if (sensor.equals(context.getString(R.string.sensor_type_value_srm_ant_bridge))) { } else if (sensor.equals(context.getString(R.string.sensor_type_value_srm_ant_bridge))) {
return new AntSrmBridgeSensorManager(context); activeSensorManager = new AntSrmBridgeSensorManager(context);
} else if (sensor.equals(context.getString(R.string.sensor_type_value_zephyr))) { } else if (sensor.equals(context.getString(R.string.sensor_type_value_zephyr))) {
return new ZephyrSensorManager(context); activeSensorManager = new ZephyrSensorManager(context);
} else if (sensor.equals(context.getString(R.string.sensor_type_value_polar))) { } else if (sensor.equals(context.getString(R.string.sensor_type_value_polar))) {
return new PolarSensorManager(context); activeSensorManager = new PolarSensorManager(context);
} else { } else {
Log.w(Constants.TAG, "Unable to find sensor type: " + sensor); Log.w(Constants.TAG, "Unable to find sensor type: " + sensor);
return null; return null;
} }
activeSensorType = sensor;
refCount = 1;
activeSensorManager.onStartTrack();
return activeSensorManager;
}
/**
* Finish using a sensor manager.
*/
public void releaseSensorManager(SensorManager sensorManager) {
Log.i(Constants.TAG, "releaseSensorManager: " + activeSensorType + " " + refCount);
if (sensorManager != activeSensorManager) {
Log.e(Constants.TAG, "invalid parameter to releaseSensorManager");
}
if (--refCount > 0) {
return;
}
reset();
}
private void reset() {
activeSensorType = null;
if (activeSensorManager != null) {
activeSensorManager.shutdown();
}
activeSensorManager = null;
refCount = 0;
} }
} }
@@ -26,7 +26,7 @@ public class SensorManagerFactoryTest extends AndroidTestCase {
@SmallTest @SmallTest
public void testDefaultSettings() throws Exception { public void testDefaultSettings() throws Exception {
assertNull(SensorManagerFactory.getSensorManager(getContext())); assertNull(SensorManagerFactory.getInstance().getSensorManager(getContext()));
} }
@SmallTest @SmallTest
@@ -49,8 +49,9 @@ public class SensorManagerFactoryTest extends AndroidTestCase {
.putString(getContext().getString(R.string.sensor_type_key), .putString(getContext().getString(R.string.sensor_type_key),
getContext().getString(i)) getContext().getString(i))
.apply(); .apply();
SensorManager sm = SensorManagerFactory.getSensorManager(getContext()); SensorManager sm = SensorManagerFactory.getInstance().getSensorManager(getContext());
assertNotNull(sm); assertNotNull(sm);
assertTrue(c.isInstance(sm)); assertTrue(c.isInstance(sm));
SensorManagerFactory.getInstance().releaseSensorManager(sm);
} }
} }