From b961356b7b5b11213bb1ca581c3b1744270acbbe Mon Sep 17 00:00:00 2001 From: Sandor Dornbush Date: Fri, 31 Dec 2010 09:11:22 -0800 Subject: [PATCH] Addressed comments. Merge from head. --- MyTracks/AndroidManifest.xml | 3 ++ MyTracks/res/values/strings.xml | 17 ++++----- .../android/apps/mytracks/AntPreference.java | 8 ++-- .../mytracks/content/MyTracksProvider.java | 17 ++++++--- .../services/TrackRecordingService.java | 5 ++- .../sensors/AntDirectSensorManager.java | 37 +++++++++---------- .../services/sensors/AntSensorManager.java | 13 +++---- .../sensors/SensorManagerFactory.java | 8 ++-- .../services/sensors/ZephyrMessageParser.java | 1 + .../content/MyTracksProviderUtils.java | 21 +++-------- .../content/MyTracksProviderUtilsImpl.java | 29 --------------- .../sensors/SensorManagerFactoryTest.java | 11 ++---- 12 files changed, 65 insertions(+), 105 deletions(-) diff --git a/MyTracks/AndroidManifest.xml b/MyTracks/AndroidManifest.xml index 5f52f7262..e8486bb01 100755 --- a/MyTracks/AndroidManifest.xml +++ b/MyTracks/AndroidManifest.xml @@ -119,6 +119,9 @@ limitations under the License. + + + diff --git a/MyTracks/res/values/strings.xml b/MyTracks/res/values/strings.xml index ad5cadc04..487afee53 100644 --- a/MyTracks/res/values/strings.xml +++ b/MyTracks/res/values/strings.xml @@ -213,18 +213,15 @@ limitations under the License. Only supported in Android 2.0 or above Sensor Type - The type of sensor to connect to. - Clear ant heart rate sensor pairing. - Clear ant power sensor pairing. - Clear ant srm bridge sensor pairing. - Ant sensor not paired. - Ant sensor paired with: %d - The Id must be an integer value. + The type of sensor to connect to + Clear ANT heart rate sensor pairing + Clear ANT power sensor pairing + Clear ANT srm bridge sensor pairing + ANT sensor not paired + ANT sensor paired with: %d Bluetooth sensor - The bluetooth sensor to connect to. + The bluetooth sensor to connect to Modular Stats Display - The stats screen is split in various modes. - Display all stats on one screen Backup (BETA) SD Card Backup diff --git a/MyTracks/src/com/google/android/apps/mytracks/AntPreference.java b/MyTracks/src/com/google/android/apps/mytracks/AntPreference.java index 84ded7425..6d6a4b853 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/AntPreference.java +++ b/MyTracks/src/com/google/android/apps/mytracks/AntPreference.java @@ -22,8 +22,8 @@ import android.preference.Preference; import android.util.AttributeSet; /** - * A preference for a ANT device pairing. - * Currently this shows the id and lets the user clear that id for future pairing. + * A preference for an ANT device pairing. + * Currently this shows the ID and lets the user clear that ID for future pairing. * TODO: Support pairing from this preference. * * @author Sandor Dornbush @@ -45,9 +45,7 @@ public class AntPreference extends Preference { if (sensorId == 0) { setSummary(R.string.settings_ant_not_paired); } else { - setSummary( - String.format( - getContext().getString(R.string.settings_ant_paired), sensorId)); + setSummary(String.format(getContext().getString(R.string.settings_ant_paired), sensorId)); } // Add actions to allow repairing. diff --git a/MyTracks/src/com/google/android/apps/mytracks/content/MyTracksProvider.java b/MyTracks/src/com/google/android/apps/mytracks/content/MyTracksProvider.java index 89604e4b2..247c2bfa2 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/content/MyTracksProvider.java +++ b/MyTracks/src/com/google/android/apps/mytracks/content/MyTracksProvider.java @@ -136,17 +136,24 @@ public class MyTracksProvider extends ContentProvider { @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 17) { + // Wipe the old data. Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS " + TRACKPOINTS_TABLE); db.execSQL("DROP TABLE IF EXISTS " + TRACKS_TABLE); db.execSQL("DROP TABLE IF EXISTS " + WAYPOINTS_TABLE); onCreate(db); - } else if (oldVersion >= 17) { - Log.w(TAG, "Upgrading database from version " + oldVersion + " to " - + newVersion + ", adding sensor column."); - db.execSQL("ALTER TABLE " + TRACKPOINTS_TABLE - + " ADD " + TrackPointsColumns.SENSOR + " BLOB"); + } else { + // Incremental updates go here. + // Each time you increase the DB version, add a corresponding if clause. + + // Sensor data. + if (oldVersion <= 17) { + Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + + newVersion + ", adding sensor column."); + db.execSQL("ALTER TABLE " + TRACKPOINTS_TABLE + + " ADD " + TrackPointsColumns.SENSOR + " BLOB"); + } } } } 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 55147ebd3..f44823bce 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java @@ -644,7 +644,6 @@ public class TrackRecordingService extends Service implements LocationListener { locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); splitManager = new SplitManager(this); - sensorManager = SensorManagerFactory.getSensorManager(this); prefManager = new PreferenceManager(this); registerLocationListener(); @@ -731,7 +730,7 @@ public class TrackRecordingService extends Service implements LocationListener { splitManager.shutdown(); splitManager = null; if (sensorManager != null) { - sensorManager.onDestroy(); + sensorManager.shutdown(); sensorManager = null; } @@ -1080,6 +1079,7 @@ public class TrackRecordingService extends Service implements LocationListener { showNotification(); registerLocationListener(); splitManager.restore(); + sensorManager = SensorManagerFactory.getSensorManager(this); if (sensorManager != null) { sensorManager.onStartTrack(); } @@ -1128,6 +1128,7 @@ public class TrackRecordingService extends Service implements LocationListener { if (sensorManager != null) { sensorManager.shutdown(); + sensorManager = null; } releaseWakeLock(); diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/sensors/AntDirectSensorManager.java b/MyTracks/src/com/google/android/apps/mytracks/services/sensors/AntDirectSensorManager.java index 0f6b031ab..a26d0e8cd 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/sensors/AntDirectSensorManager.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/sensors/AntDirectSensorManager.java @@ -15,7 +15,7 @@ */ package com.google.android.apps.mytracks.services.sensors; -import com.google.android.apps.mytracks.MyTracksConstants; +import static com.google.android.apps.mytracks.MyTracksConstants.TAG; import com.google.android.apps.mytracks.MyTracksSettings; import com.google.android.apps.mytracks.content.Sensor; import com.google.android.maps.mytracks.R; @@ -37,13 +37,13 @@ public class AntDirectSensorManager extends AntSensorManager { /* * These constants are defined by the ANT+ heart rate monitor spec. */ - public static final byte HRM_CHANNEL = (byte) 0; - public static final byte NETWORK_NUMBER = (byte) 1; - public static final byte HEART_RATE_DEVICE_TYPE = (byte) 120; - public static final byte POWER_DEVICE_TYPE = (byte) 11; - public static final byte MANUFACTURER_ID = (byte) 1; - public static final short CHANNEL_PERIOD = (short) 8070; - public static final byte RF_FREQUENCY = (byte) 57; + public static final byte HRM_CHANNEL = 0; + public static final byte NETWORK_NUMBER = 1; + public static final byte HEART_RATE_DEVICE_TYPE = 120; + public static final byte POWER_DEVICE_TYPE = 11; + public static final byte MANUFACTURER_ID = 1; + public static final short CHANNEL_PERIOD = 8070; + public static final byte RF_FREQUENCY = 57; private short deviceNumberHRM; @@ -59,8 +59,7 @@ public class AntDirectSensorManager extends AntSensorManager { deviceNumberHRM = (short) prefs.getInt(context.getString(R.string.ant_heart_rate_sensor_id_key), 0); } - Log.i(MyTracksConstants.TAG, - "Pairing with heart rate monitor: " + deviceNumberHRM); + Log.i(TAG, "Pairing with heart rate monitor: " + deviceNumberHRM); } @Override @@ -72,7 +71,7 @@ public class AntDirectSensorManager extends AntSensorManager { antDecodeHRM(antMessage); break; default: - Log.d(MyTracksConstants.TAG, "Unhandled message: " + channel); + Log.d(TAG, "Unhandled message: " + channel); } } @@ -93,8 +92,7 @@ public class AntDirectSensorManager extends AntSensorManager { handleChannelId(antMessage); break; default: - Log.e(MyTracksConstants.TAG, - "Unexpected message id: " + antMessage[3]); + Log.e(TAG, "Unexpected message id: " + antMessage[3]); } } @@ -102,7 +100,7 @@ public class AntDirectSensorManager extends AntSensorManager { if (deviceNumberHRM == WILDCARD) { getAntReceiver().ANTRequestMessage(HRM_CHANNEL, AntMesg.MESG_CHANNEL_ID_ID); - Log.d(MyTracksConstants.TAG, "Requesting channel id id."); + Log.d(TAG, "Requesting channel id id."); } setSensorState(Sensor.SensorState.CONNECTED); @@ -122,7 +120,7 @@ public class AntDirectSensorManager extends AntSensorManager { deviceNumberHRM = (short) (((int) antMessage[3] & 0xFF | ((int) (antMessage[4] & 0xFF) << 8)) & 0xFFFF); - Log.i(MyTracksConstants.TAG, "Found device id: " + deviceNumberHRM); + Log.i(TAG, "Found device id: " + deviceNumberHRM); SharedPreferences prefs = context.getSharedPreferences( MyTracksSettings.SETTINGS_NAME, Context.MODE_PRIVATE); @@ -132,16 +130,15 @@ public class AntDirectSensorManager extends AntSensorManager { } private void handleMessageResponse(byte[] antMessage) { - if (antMessage[3] == AntMesg.MESG_EVENT_ID - && antMessage[4] == AntDefine.EVENT_RX_SEARCH_TIMEOUT) { + if (antMessage[3] == AntMesg.MESG_EVENT_ID && + antMessage[4] == AntDefine.EVENT_RX_SEARCH_TIMEOUT) { // Search timeout - Log.w(MyTracksConstants.TAG, "Search timed out. Unassigning channel."); + Log.w(TAG, "Search timed out. Unassigning channel."); getAntReceiver().ANTUnassignChannel((byte) 0); setSensorState(Sensor.SensorState.DISCONNECTED); } else if (antMessage[3] == AntMesg.MESG_UNASSIGN_CHANNEL_ID) { setSensorState(Sensor.SensorState.DISCONNECTED); - Log.i(MyTracksConstants.TAG, - "Disconnected from the sensor: " + getSensorState()); + Log.i(TAG, "Disconnected from the sensor: " + getSensorState()); } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/sensors/AntSensorManager.java b/MyTracks/src/com/google/android/apps/mytracks/services/sensors/AntSensorManager.java index 3ca3ff2ab..eb2230f10 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/sensors/AntSensorManager.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/sensors/AntSensorManager.java @@ -48,15 +48,15 @@ public abstract class AntSensorManager extends SensorManager { private boolean status; // Flag to know if the ANT App was interrupted - // TODO this code path is not used but probably should be. - private boolean antInterrupted = false; + // TODO: This code path is not used but probably should be. + private boolean antInterrupted; /** * The data from the sensors. */ - protected SensorDataSet sensorData = null; + protected SensorDataSet sensorData; - protected Context context = null; + protected Context context; private static final boolean DEBUGGING = false; @@ -133,7 +133,7 @@ public abstract class AntSensorManager extends SensorManager { // already called before if (antInterrupted == false) { status = antReceiver.enable(); - if (status == false) { + if (!status) { Log.e(MyTracksConstants.TAG, "Can not enable ANT interface"); } else { Log.i(MyTracksConstants.TAG, "Powering on Radio"); @@ -208,8 +208,7 @@ public abstract class AntSensorManager extends SensorManager { } // Set search timeout to 30 seconds (low priority search)) - if (!antReceiver.ANTSetLowPriorityChannelSearchTimeout(channelNumber, - (byte) 12)) { + if (!antReceiver.ANTSetLowPriorityChannelSearchTimeout(channelNumber, (byte) 12)) { return false; } 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 e43e1d767..cad3e707b 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 @@ -45,21 +45,19 @@ public class SensorManagerFactory { return null; } - String sensor = prefs.getString(context.getString(R.string.sensor_type_key), - null); + String sensor = prefs.getString(context.getString(R.string.sensor_type_key), null); Log.i(MyTracksConstants.TAG, "Creating sensor of type: " + sensor); if (sensor == null) { return null; } else if (sensor.equals(context.getString(R.string.ant_sensor_type))) { return new AntDirectSensorManager(context); - } else if (sensor.equals( - context.getString(R.string.srm_ant_bridge_sensor_type))) { + } else if (sensor.equals(context.getString(R.string.srm_ant_bridge_sensor_type))) { return new AntSRMSensorManager(context); } else if (sensor.equals(context.getString(R.string.zephyr_sensor_type))) { return new ZephyrSensorManager(context); } else { - Log.w(MyTracksConstants.TAG, "Unable to find sensor type: " + sensor); + Log.w(MyTracksConstants.TAG, "Unable to find sensor type: " + sensor); return null; } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/sensors/ZephyrMessageParser.java b/MyTracks/src/com/google/android/apps/mytracks/services/sensors/ZephyrMessageParser.java index 7db8bcc18..3a2fbf9e4 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/sensors/ZephyrMessageParser.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/sensors/ZephyrMessageParser.java @@ -35,6 +35,7 @@ public class ZephyrMessageParser implements MessageParser { } Log.w(MyTracksConstants.TAG, "Got zephyr data: " + sb); // The provided units are 1/16 strides per minute. + // TODO: Fix the cadence calculation. // int cadence = SensorUtils.unsignedShortToInt(buffer, 56); // Heart Rate Sensor.SensorData.Builder b = Sensor.SensorData.newBuilder() diff --git a/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtils.java b/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtils.java index 2dd891ac2..586228b25 100644 --- a/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtils.java +++ b/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtils.java @@ -180,8 +180,9 @@ public interface MyTracksProviderUtils { /** * Finds a track by given unique track id. - * Note that the returned track object does not have any track points - * attached. Use {@link #getTrackPoints(Track, int)} to load the track points. + * Note that the returned track object does not have any track points attached. + * Use {@link #getLocationIterator(long, long, boolean, LocationFactory)} to load + * the track points. * * @param id desired unique track id * @return a Track object, or null if not found @@ -189,24 +190,14 @@ public interface MyTracksProviderUtils { Track getTrack(long id); /** - * Retrieves all tracks without track points. If no tracks exist an empty - * list will be returned. Use {@link #getTrackPoints(Track, int)} to load - * the track points. + * Retrieves all tracks without track points. If no tracks exist, an empty + * list will be returned. Use {@link #getLocationIterator(long, long, boolean, LocationFactory)} + * to load the track points. * * @return a list of all the recorded tracks */ List getAllTracks(); - /** - * Loads the track points for a given track. - * - * @param track assumes that startId and stopId are filled in correctly - * @param maxPoints maximum number of points to load, or -1 for no limit - * (oldest ones will be discarded) - * @return the id of the last location in the track - */ - long getTrackPoints(Track track, int maxPoints); - /** * Creates a cursor over the tracks provider with a given selection. * Caller gets to own the returned cursor. Don't forget to close it. diff --git a/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java b/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java index 33bfb6eef..5d134effb 100644 --- a/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java +++ b/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java @@ -877,35 +877,6 @@ public class MyTracksProviderUtilsImpl implements MyTracksProviderUtils { return tracks; } - @Override - public long getTrackPoints(Track track, int maxPoints) { - long lastId = -1; - Cursor cursor = getLocationsCursor(track.getId(), -1, maxPoints, true); - if (cursor == null) { - Log.w(TAG, "Cannot get a locations cursor!"); - return lastId; - } - try { - final int idColumnIdx = - cursor.getColumnIndexOrThrow(TrackPointsColumns._ID); - if (cursor.moveToLast()) { - do { - Location location = createLocation(cursor); - if (location == null) { - continue; - } - track.addLocation(location); - lastId = cursor.getLong(idColumnIdx); - } while (cursor.moveToPrevious()); - } - } catch (RuntimeException e) { - Log.w(TAG, "Caught unexpected exception.", e); - } finally { - cursor.close(); - } - return lastId; - } - @Override public Cursor getTracksCursor(String selection) { Cursor cursor = contentResolver.query( diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/services/sensors/SensorManagerFactoryTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/services/sensors/SensorManagerFactoryTest.java index b83101234..8af73b13c 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/services/sensors/SensorManagerFactoryTest.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/services/sensors/SensorManagerFactoryTest.java @@ -28,23 +28,20 @@ public class SensorManagerFactoryTest extends AndroidTestCase { @SmallTest public void testCreateZephyr() throws Exception { - assertClassForName( - ZephyrSensorManager.class, R.string.zephyr_sensor_type); + assertClassForName(ZephyrSensorManager.class, R.string.zephyr_sensor_type); } @SmallTest public void testCreateAnt() throws Exception { - assertClassForName( - AntDirectSensorManager.class, R.string.ant_sensor_type); + assertClassForName(AntDirectSensorManager.class, R.string.ant_sensor_type); } @SmallTest public void testCreateAntSRM() throws Exception { - assertClassForName( - AntSRMSensorManager.class, R.string.srm_ant_bridge_sensor_type); + assertClassForName(AntSRMSensorManager.class, R.string.srm_ant_bridge_sensor_type); } - private void assertClassForName(Class c, int i) { + private void assertClassForName(Class c, int i) { sharedPreferences.edit() .putString(getContext().getString(R.string.sensor_type_key), getContext().getString(i))