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() {
if (tempSensorManager != null) {
SensorManagerFactory.getInstance().releaseSensorManager(tempSensorManager);
SensorManagerFactory.releaseTempSensorManager();
tempSensorManager = null;
}
}
@@ -139,7 +139,7 @@ public class SensorStateActivity extends AbstractMyTracksActivity {
Sensor.SensorDataSet sensorDataSet = null;
if (tempSensorManager == null) {
tempSensorManager = SensorManagerFactory.getInstance().getSensorManager(this);
tempSensorManager = SensorManagerFactory.getTempSensorManager(this);
}
if (tempSensorManager != null) {
@@ -359,7 +359,7 @@ public class TrackRecordingService extends Service {
unregisterLocationListener();
shutdownTaskExecutors();
if (sensorManager != null) {
SensorManagerFactory.getInstance().releaseSensorManager(sensorManager);
SensorManagerFactory.releaseSystemSensorManager();
sensorManager = null;
}
@@ -595,7 +595,7 @@ public class TrackRecordingService extends Service {
length = 0;
showNotification();
registerLocationListener();
sensorManager = SensorManagerFactory.getInstance().getSensorManager(this);
sensorManager = SensorManagerFactory.getSystemSensorManager(this);
// Reset the number of auto-resume retries.
setAutoResumeTrackRetries(0);
@@ -1042,7 +1042,7 @@ public class TrackRecordingService extends Service {
PreferencesUtils.setLong(this, R.string.recording_track_id_key, recordingTrackId);
if (sensorManager != null) {
SensorManagerFactory.getInstance().releaseSensorManager(sensorManager);
SensorManagerFactory.releaseSystemSensorManager();
sensorManager = null;
}
@@ -13,101 +13,99 @@
* 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.Constants;
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.util.PreferencesUtils;
import com.google.android.maps.mytracks.R;
import android.content.Context;
import android.util.Log;
/**
* A factory of SensorManagers.
* A factory of {@link SensorManager}.
*
* @author Sandor Dornbush
*/
public class SensorManagerFactory {
private String activeSensorType = null;
private SensorManager activeSensorManager = null;
private int refCount = 0;
private static SensorManager systemSensorManager = null;
private static SensorManager tempSensorManager = null;
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() {
return instance;
public static void releaseSystemSensorManager() {
if (systemSensorManager != null) {
systemSensorManager.stopSensor();
}
systemSensorManager = null;
}
/**
* Get and start a new sensor manager.
* @param context Context to fetch system preferences.
* @return The sensor manager that corresponds to the sensor type setting.
* Gets the temp sensor manager.
*
* @param context
*/
public SensorManager getSensorManager(Context context) {
context = context.getApplicationContext();
public static SensorManager getTempSensorManager(Context context) {
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 sensorType = PreferencesUtils.getString(
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))) {
activeSensorManager = new AntDirectSensorManager(context);
return new AntDirectSensorManager(context);
} 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))) {
activeSensorManager = new ZephyrSensorManager(context);
return new ZephyrSensorManager(context);
} else if (sensorType.equals(context.getString(R.string.sensor_type_value_polar))) {
activeSensorManager = new PolarSensorManager(context);
} else {
Log.w(Constants.TAG, "Unable to find sensor type: " + sensorType);
return null;
return new PolarSensorManager(context);
}
activeSensorType = sensorType;
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;
return null;
}
}
@@ -23,7 +23,7 @@ public class SensorManagerFactoryTest extends AndroidTestCase {
@SmallTest
public void testDefaultSettings() throws Exception {
assertNull(SensorManagerFactory.getInstance().getSensorManager(getContext()));
assertNull(SensorManagerFactory.getSystemSensorManager(getContext()));
}
@SmallTest
@@ -38,9 +38,9 @@ public class SensorManagerFactoryTest extends AndroidTestCase {
private void assertClassForName(Class<?> c, int 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);
assertTrue(c.isInstance(sm));
SensorManagerFactory.getInstance().releaseSensorManager(sm);
SensorManagerFactory.releaseSystemSensorManager();
}
}