Clean up SensorManagerFactory.

- not using reference count.
- make sure SensorStateActivity will not
  disconnect a connection used by TrackRecordingService
This commit is contained in:
Jimmy Shih
2012-05-29 10:36:28 -07:00
parent d4db27b092
commit 9e5d9d23de
4 changed files with 68 additions and 70 deletions
@@ -126,7 +126,7 @@ public class SensorStateActivity extends AbstractMyTracksActivity {
*/ */
private void stopTempSensorManager() { private void stopTempSensorManager() {
if (tempSensorManager != null) { if (tempSensorManager != null) {
SensorManagerFactory.getInstance().releaseSensorManager(tempSensorManager); SensorManagerFactory.releaseTempSensorManager();
tempSensorManager = null; tempSensorManager = null;
} }
} }
@@ -139,7 +139,7 @@ public class SensorStateActivity extends AbstractMyTracksActivity {
Sensor.SensorDataSet sensorDataSet = null; Sensor.SensorDataSet sensorDataSet = null;
if (tempSensorManager == null) { if (tempSensorManager == null) {
tempSensorManager = SensorManagerFactory.getInstance().getSensorManager(this); tempSensorManager = SensorManagerFactory.getTempSensorManager(this);
} }
if (tempSensorManager != null) { if (tempSensorManager != null) {
@@ -359,7 +359,7 @@ public class TrackRecordingService extends Service {
unregisterLocationListener(); unregisterLocationListener();
shutdownTaskExecutors(); shutdownTaskExecutors();
if (sensorManager != null) { if (sensorManager != null) {
SensorManagerFactory.getInstance().releaseSensorManager(sensorManager); SensorManagerFactory.releaseSystemSensorManager();
sensorManager = null; sensorManager = null;
} }
@@ -595,7 +595,7 @@ public class TrackRecordingService extends Service {
length = 0; length = 0;
showNotification(); showNotification();
registerLocationListener(); registerLocationListener();
sensorManager = SensorManagerFactory.getInstance().getSensorManager(this); sensorManager = SensorManagerFactory.getSystemSensorManager(this);
// Reset the number of auto-resume retries. // Reset the number of auto-resume retries.
setAutoResumeTrackRetries(0); setAutoResumeTrackRetries(0);
@@ -1042,7 +1042,7 @@ public class TrackRecordingService extends Service {
PreferencesUtils.setLong(this, R.string.recording_track_id_key, recordingTrackId); PreferencesUtils.setLong(this, R.string.recording_track_id_key, recordingTrackId);
if (sensorManager != null) { if (sensorManager != null) {
SensorManagerFactory.getInstance().releaseSensorManager(sensorManager); SensorManagerFactory.releaseSystemSensorManager();
sensorManager = null; sensorManager = null;
} }
@@ -13,101 +13,99 @@
* License for the specific language governing permissions and limitations under * License for the specific language governing permissions and limitations under
* the License. * the License.
*/ */
package com.google.android.apps.mytracks.services.sensors; package com.google.android.apps.mytracks.services.sensors;
import com.google.android.apps.mytracks.Constants;
import com.google.android.apps.mytracks.services.sensors.ant.AntDirectSensorManager; import com.google.android.apps.mytracks.services.sensors.ant.AntDirectSensorManager;
import com.google.android.apps.mytracks.services.sensors.ant.AntSrmBridgeSensorManager; import com.google.android.apps.mytracks.services.sensors.ant.AntSrmBridgeSensorManager;
import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.maps.mytracks.R; import com.google.android.maps.mytracks.R;
import android.content.Context; import android.content.Context;
import android.util.Log;
/** /**
* A factory of SensorManagers. * A factory of {@link SensorManager}.
* *
* @author Sandor Dornbush * @author Sandor Dornbush
*/ */
public class SensorManagerFactory { public class SensorManagerFactory {
private String activeSensorType = null; private static SensorManager systemSensorManager = null;
private SensorManager activeSensorManager = null; private static SensorManager tempSensorManager = null;
private int refCount = 0;
private static SensorManagerFactory instance = new SensorManagerFactory(); private SensorManagerFactory() {}
private SensorManagerFactory() { /**
* Gets the system sensor manager.
*
* @param context the context
*/
public static SensorManager getSystemSensorManager(Context context) {
releaseTempSensorManager();
releaseSystemSensorManager();
systemSensorManager = getSensorManager(context);
if (systemSensorManager != null) {
systemSensorManager.startSensor();
}
return systemSensorManager;
} }
/** /**
* Get the factory instance. * Releases the system sensor manager.
*/ */
public static SensorManagerFactory getInstance() { public static void releaseSystemSensorManager() {
return instance; if (systemSensorManager != null) {
systemSensorManager.stopSensor();
}
systemSensorManager = null;
} }
/** /**
* Get and start a new sensor manager. * Gets the temp sensor manager.
* @param context Context to fetch system preferences. *
* @return The sensor manager that corresponds to the sensor type setting. * @param context
*/ */
public SensorManager getSensorManager(Context context) { public static SensorManager getTempSensorManager(Context context) {
context = context.getApplicationContext(); releaseTempSensorManager();
if (systemSensorManager != null) {
return null;
}
tempSensorManager = getSensorManager(context);
if (tempSensorManager != null) {
tempSensorManager.startSensor();
}
return tempSensorManager;
}
/**
* Releases the temp sensor manager.
*/
public static void releaseTempSensorManager() {
if (tempSensorManager != null) {
tempSensorManager.stopSensor();
}
tempSensorManager = null;
}
/**
* Gets the sensor manager.
*
* @param context the context
*/
private static SensorManager getSensorManager(Context context) {
String sensorTypeValueNone = context.getString(R.string.sensor_type_value_none); String sensorTypeValueNone = context.getString(R.string.sensor_type_value_none);
String sensorType = PreferencesUtils.getString( String sensorType = PreferencesUtils.getString(
context, R.string.sensor_type_key, sensorTypeValueNone); context, R.string.sensor_type_key, sensorTypeValueNone);
Log.i(Constants.TAG, "Creating sensor of type: " + sensorType);
if (sensorTypeValueNone.equals(sensorType)) {
reset();
return null;
}
if (sensorType.equals(activeSensorType)) {
Log.i(Constants.TAG, "Returning existing sensor manager.");
refCount++;
return activeSensorManager;
}
reset();
if (sensorType.equals(context.getString(R.string.sensor_type_value_ant))) { if (sensorType.equals(context.getString(R.string.sensor_type_value_ant))) {
activeSensorManager = new AntDirectSensorManager(context); return new AntDirectSensorManager(context);
} else if (sensorType.equals(context.getString(R.string.sensor_type_value_srm_ant_bridge))) { } else if (sensorType.equals(context.getString(R.string.sensor_type_value_srm_ant_bridge))) {
activeSensorManager = new AntSrmBridgeSensorManager(context); return new AntSrmBridgeSensorManager(context);
} else if (sensorType.equals(context.getString(R.string.sensor_type_value_zephyr))) { } else if (sensorType.equals(context.getString(R.string.sensor_type_value_zephyr))) {
activeSensorManager = new ZephyrSensorManager(context); return new ZephyrSensorManager(context);
} else if (sensorType.equals(context.getString(R.string.sensor_type_value_polar))) { } else if (sensorType.equals(context.getString(R.string.sensor_type_value_polar))) {
activeSensorManager = new PolarSensorManager(context); return new PolarSensorManager(context);
} else {
Log.w(Constants.TAG, "Unable to find sensor type: " + sensorType);
return null;
} }
activeSensorType = sensorType; return null;
refCount = 1;
activeSensorManager.startSensor();
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.stopSensor();
}
activeSensorManager = null;
refCount = 0;
} }
} }
@@ -23,7 +23,7 @@ public class SensorManagerFactoryTest extends AndroidTestCase {
@SmallTest @SmallTest
public void testDefaultSettings() throws Exception { public void testDefaultSettings() throws Exception {
assertNull(SensorManagerFactory.getInstance().getSensorManager(getContext())); assertNull(SensorManagerFactory.getSystemSensorManager(getContext()));
} }
@SmallTest @SmallTest
@@ -38,9 +38,9 @@ public class SensorManagerFactoryTest extends AndroidTestCase {
private void assertClassForName(Class<?> c, int i) { private void assertClassForName(Class<?> c, int i) {
PreferencesUtils.setString(getContext(), R.string.sensor_type_key, getContext().getString(i)); PreferencesUtils.setString(getContext(), R.string.sensor_type_key, getContext().getString(i));
SensorManager sm = SensorManagerFactory.getInstance().getSensorManager(getContext()); SensorManager sm = SensorManagerFactory.getSystemSensorManager(getContext());
assertNotNull(sm); assertNotNull(sm);
assertTrue(c.isInstance(sm)); assertTrue(c.isInstance(sm));
SensorManagerFactory.getInstance().releaseSensorManager(sm); SensorManagerFactory.releaseSystemSensorManager();
} }
} }