forked from upstream-mirrors/OpenTracks
Clean up SensorManagerFactory.
- not using reference count. - make sure SensorStateActivity will not disconnect a connection used by TrackRecordingService
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+60
-62
@@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user