From 3ef1ae4b092d3ec47af25acb4ac3a1850c6f36bd Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Sat, 20 Jul 2019 00:21:27 +0200 Subject: [PATCH] Sensor settings: added NONE bluetooth sensor. --- myTracks/build.gradle | 3 - .../android/apps/mytracks/TrackStubUtils.java | 8 +- .../MyTracksProviderUtilsImplTest.java | 2 +- .../mytracks/fragments/ChartFragmentTest.java | 4 +- .../apps/mytracks/SensorStateActivity.java | 76 +- .../mytracks/content/MyTracksLocation.java | 8 +- .../mytracks/content/MyTracksProvider.java | 2 +- .../content/MyTracksProviderUtilsImpl.java | 36 +- .../android/apps/mytracks/content/Sensor.java | 882 ------------------ .../mytracks/content/TrackPointsColumns.java | 9 +- .../content/sensor/SensorDataSet.java | 74 ++ .../mytracks/content/sensor/SensorState.java | 27 + .../mytracks/fragments/ChartFragment.java | 24 +- .../io/file/exporter/GpxTrackWriter.java | 1 + .../io/file/exporter/KmlTrackWriter.java | 42 +- .../file/importer/KmlFileTrackImporter.java | 31 +- .../services/ITrackRecordingService.java | 8 +- .../services/TrackRecordingService.java | 14 +- .../sensors/BluetoothConnectionManager.java | 9 +- .../sensors/BluetoothSensorManager.java | 10 +- .../services/sensors/SensorManager.java | 6 +- .../services/sensors/SensorUtils.java | 115 --- .../settings/SensorSettingsActivity.java | 28 +- .../mytracks/util/BluetoothDeviceUtils.java | 5 +- 24 files changed, 237 insertions(+), 1187 deletions(-) delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/content/Sensor.java create mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/content/sensor/SensorDataSet.java create mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/content/sensor/SensorState.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/SensorUtils.java diff --git a/myTracks/build.gradle b/myTracks/build.gradle index 69a5cfcd3..66233d6ce 100644 --- a/myTracks/build.gradle +++ b/myTracks/build.gradle @@ -8,7 +8,6 @@ android { minSdkVersion 21 targetSdkVersion 28 - testApplicationId "com.google.android.maps.mytracks.test" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -22,8 +21,6 @@ android { dependencies { implementation 'androidx.appcompat:appcompat:1.0.2' - implementation 'com.google.protobuf:protobuf-java:2.5.0' - androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test:rules:1.2.0' androidTestImplementation 'androidx.test.ext:junit:1.1.1' diff --git a/myTracks/src/androidTest/java/com/google/android/apps/mytracks/TrackStubUtils.java b/myTracks/src/androidTest/java/com/google/android/apps/mytracks/TrackStubUtils.java index e53685efe..c27bc2bbf 100644 --- a/myTracks/src/androidTest/java/com/google/android/apps/mytracks/TrackStubUtils.java +++ b/myTracks/src/androidTest/java/com/google/android/apps/mytracks/TrackStubUtils.java @@ -16,12 +16,12 @@ package com.google.android.apps.mytracks; -import com.google.android.apps.mytracks.content.MyTracksLocation; -import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; -import com.google.android.apps.mytracks.content.Track; - import android.location.Location; +import com.google.android.apps.mytracks.content.MyTracksLocation; +import com.google.android.apps.mytracks.content.Track; +import com.google.android.apps.mytracks.content.sensor.Sensor.SensorDataSet; + /** * Commons utilities for creating stubs of track, location. The class will be * enriched if needs more similar stubs for test. diff --git a/myTracks/src/androidTest/java/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImplTest.java b/myTracks/src/androidTest/java/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImplTest.java index 5baf871c8..dd3329bcb 100644 --- a/myTracks/src/androidTest/java/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImplTest.java +++ b/myTracks/src/androidTest/java/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImplTest.java @@ -679,7 +679,7 @@ public class MyTracksProviderUtilsImplTest { AndroidMock.expect(cursorMock.getColumnIndexOrThrow(TrackPointsColumns.SPEED)).andReturn( index++); // Sensor - AndroidMock.expect(cursorMock.getColumnIndexOrThrow(TrackPointsColumns.SENSOR)).andReturn( + AndroidMock.expect(cursorMock.getColumnIndexOrThrow(TrackPointsColumns.SENSOR_HEARTRATE)).andReturn( index++); // Set return value of isNull(). diff --git a/myTracks/src/androidTest/java/com/google/android/apps/mytracks/fragments/ChartFragmentTest.java b/myTracks/src/androidTest/java/com/google/android/apps/mytracks/fragments/ChartFragmentTest.java index 9b9ab0a4d..712d42a96 100644 --- a/myTracks/src/androidTest/java/com/google/android/apps/mytracks/fragments/ChartFragmentTest.java +++ b/myTracks/src/androidTest/java/com/google/android/apps/mytracks/fragments/ChartFragmentTest.java @@ -24,8 +24,8 @@ import androidx.test.platform.app.InstrumentationRegistry; import com.google.android.apps.mytracks.ChartView; import com.google.android.apps.mytracks.TrackStubUtils; import com.google.android.apps.mytracks.content.MyTracksLocation; -import com.google.android.apps.mytracks.content.Sensor; -import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; +import com.google.android.apps.mytracks.content.sensor.Sensor; +import com.google.android.apps.mytracks.content.sensor.Sensor.SensorDataSet; import com.google.android.apps.mytracks.util.UnitConversions; import org.junit.Assert; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/SensorStateActivity.java b/myTracks/src/main/java/com/google/android/apps/mytracks/SensorStateActivity.java index 01478e4f5..8f84b48a7 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/SensorStateActivity.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/SensorStateActivity.java @@ -22,16 +22,15 @@ import android.text.format.DateFormat; import android.util.Log; import android.widget.TextView; -import com.google.android.apps.mytracks.content.Sensor; +import com.google.android.apps.mytracks.content.sensor.SensorDataSet; +import com.google.android.apps.mytracks.content.sensor.SensorState; import com.google.android.apps.mytracks.services.ITrackRecordingService; import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection; import com.google.android.apps.mytracks.services.sensors.SensorManager; import com.google.android.apps.mytracks.services.sensors.SensorManagerFactory; -import com.google.android.apps.mytracks.services.sensors.SensorUtils; import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtils; import com.google.android.apps.mytracks.util.UnitConversions; import com.google.android.maps.mytracks.R; -import com.google.protobuf.InvalidProtocolBufferException; /** * An activity that displays information about sensors. @@ -118,8 +117,8 @@ public class SensorStateActivity extends AbstractActivity { * Updates from a temp sensor manager. */ private void updateFromTempSensorManager() { - Sensor.SensorState sensorState = Sensor.SensorState.NONE; - Sensor.SensorDataSet sensorDataSet = null; + SensorState sensorState = SensorState.NONE; + SensorDataSet sensorDataSet = null; if (tempSensorManager == null) { tempSensorManager = SensorManagerFactory.getSensorManagerTemporary(this); @@ -137,28 +136,13 @@ public class SensorStateActivity extends AbstractActivity { * Updates from the system sensor manager. */ private void updateFromSystemSensorManager() { - Sensor.SensorState sensorState = Sensor.SensorState.NONE; - Sensor.SensorDataSet sensorDataSet = null; - ITrackRecordingService trackRecordingService = trackRecordingServiceConnection.getServiceIfBound(); - - // Get sensor details from the service. if (trackRecordingService == null) { Log.d(TAG, "Cannot get the track recording service."); + updateSensorStateAndDataSet(SensorState.NONE, null); } else { - sensorState = Sensor.SensorState.valueOf(trackRecordingService.getSensorState()); - - try { - byte[] buff = trackRecordingService.getSensorData(); - if (buff != null) { - sensorDataSet = Sensor.SensorDataSet.parseFrom(buff); - } - } catch (InvalidProtocolBufferException e) { - Log.e(TAG, "Cannot read sensor data set.", e); - } + updateSensorStateAndDataSet(trackRecordingService.getSensorState(), trackRecordingService.getSensorData()); } - - updateSensorStateAndDataSet(sensorState, sensorDataSet); } /** @@ -167,8 +151,8 @@ public class SensorStateActivity extends AbstractActivity { * @param sensorState sensor state * @param sensorDataSet sensor data set */ - private void updateSensorStateAndDataSet(Sensor.SensorState sensorState, Sensor.SensorDataSet sensorDataSet) { - ((TextView) findViewById(R.id.sensor_state)).setText(SensorUtils.getStateAsString(sensorState, this)); + private void updateSensorStateAndDataSet(SensorState sensorState, SensorDataSet sensorDataSet) { + ((TextView) findViewById(R.id.sensor_state)).setText(SensorState.getStateAsString(sensorState, this)); String lastSensorTime = sensorDataSet == null ? getString(R.string.value_unknown) : getLastSensorTime(sensorDataSet); String heartRate = sensorDataSet == null ? getString(R.string.value_unknown) : getHeartRate(sensorDataSet); @@ -188,7 +172,7 @@ public class SensorStateActivity extends AbstractActivity { * * @param sensorDataSet sensor data set */ - private String getLastSensorTime(Sensor.SensorDataSet sensorDataSet) { + private String getLastSensorTime(SensorDataSet sensorDataSet) { return DateFormat.format("h:mm:ss aa", sensorDataSet.getCreationTime()).toString(); } @@ -197,13 +181,12 @@ public class SensorStateActivity extends AbstractActivity { * * @param sensorDataSet sensor data set */ - private String getHeartRate(Sensor.SensorDataSet sensorDataSet) { + private String getHeartRate(SensorDataSet sensorDataSet) { String value; - if (sensorDataSet.hasHeartRate() && sensorDataSet.getHeartRate().hasValue() && sensorDataSet.getHeartRate().getState() == Sensor.SensorState.SENDING) { - value = getString( - R.string.sensor_state_heart_rate_value, sensorDataSet.getHeartRate().getValue()); + if (sensorDataSet.hasHeartRate()) { + value = getString(R.string.sensor_state_heart_rate_value, (int)sensorDataSet.getHeartRate()); } else { - value = SensorUtils.getStateAsString(sensorDataSet.hasHeartRate() ? sensorDataSet.getHeartRate().getState() : Sensor.SensorState.NONE, this); + value = SensorState.getStateAsString(SensorState.NONE, this); } return value; } @@ -213,15 +196,12 @@ public class SensorStateActivity extends AbstractActivity { * * @param sensorDataSet sensor data set */ - private String getCadence(Sensor.SensorDataSet sensorDataSet) { + private String getCadence(SensorDataSet sensorDataSet) { String value; - if (sensorDataSet.hasCadence() && sensorDataSet.getCadence().hasValue() - && sensorDataSet.getCadence().getState() == Sensor.SensorState.SENDING) { - value = getString(R.string.sensor_state_cadence_value, sensorDataSet.getCadence().getValue()); + if (sensorDataSet.hasCadence()) { + value = getString(R.string.sensor_state_cadence_value, (int)sensorDataSet.getCadence()); } else { - value = SensorUtils.getStateAsString( - sensorDataSet.hasCadence() ? sensorDataSet.getCadence().getState() - : Sensor.SensorState.NONE, this); + value = SensorState.getStateAsString(SensorState.NONE, this); } return value; } @@ -231,15 +211,12 @@ public class SensorStateActivity extends AbstractActivity { * * @param sensorDataSet sensor data set */ - private String getPower(Sensor.SensorDataSet sensorDataSet) { + private String getPower(SensorDataSet sensorDataSet) { String value; - if (sensorDataSet.hasPower() && sensorDataSet.getPower().hasValue() - && sensorDataSet.getPower().getState() == Sensor.SensorState.SENDING) { - value = getString(R.string.sensor_state_power_value, sensorDataSet.getPower().getValue()); + if (sensorDataSet.hasPower()) { + value = getString(R.string.sensor_state_power_value, (int)sensorDataSet.getPower()); } else { - value = SensorUtils.getStateAsString( - sensorDataSet.hasPower() ? sensorDataSet.getPower().getState() : Sensor.SensorState.NONE, - this); + value = SensorState.getStateAsString(SensorState.NONE,this); } return value; } @@ -249,15 +226,12 @@ public class SensorStateActivity extends AbstractActivity { * * @param sensorDataSet sensor data set */ - private String getBattery(Sensor.SensorDataSet sensorDataSet) { + private String getBattery(SensorDataSet sensorDataSet) { String value; - if (sensorDataSet.hasBatteryLevel() && sensorDataSet.getBatteryLevel().hasValue() - && sensorDataSet.getBatteryLevel().getState() == Sensor.SensorState.SENDING) { - value = getString(R.string.value_integer_percent, sensorDataSet.getBatteryLevel().getValue()); + if (sensorDataSet.hasBatteryLevel()) { + value = getString(R.string.value_integer_percent, sensorDataSet.getBatteryLevel()); } else { - value = SensorUtils.getStateAsString( - sensorDataSet.hasBatteryLevel() ? sensorDataSet.getBatteryLevel().getState() - : Sensor.SensorState.NONE, this); + value = SensorState.getStateAsString(SensorState.NONE, this); } return value; } diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/content/MyTracksLocation.java b/myTracks/src/main/java/com/google/android/apps/mytracks/content/MyTracksLocation.java index 081e5d6ec..3d55bb43b 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/content/MyTracksLocation.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/content/MyTracksLocation.java @@ -15,10 +15,10 @@ */ package com.google.android.apps.mytracks.content; -import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; - import android.location.Location; +import com.google.android.apps.mytracks.content.sensor.SensorDataSet; + /** * This class extends the standard Android location with extra information. * @@ -33,9 +33,9 @@ public class MyTracksLocation extends Location { */ private int id = -1; - public MyTracksLocation(Location location, Sensor.SensorDataSet sd) { + public MyTracksLocation(Location location, SensorDataSet sensorDataSet) { super(location); - this.sensorDataSet = sd; + this.sensorDataSet = sensorDataSet; } public MyTracksLocation(String provider) { diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/content/MyTracksProvider.java b/myTracks/src/main/java/com/google/android/apps/mytracks/content/MyTracksProvider.java index 6a8b4e900..e7ece8ab5 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/content/MyTracksProvider.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/content/MyTracksProvider.java @@ -52,7 +52,7 @@ public class MyTracksProvider extends ContentProvider { private static final String TAG = MyTracksProvider.class.getSimpleName(); @VisibleForTesting - static final int DATABASE_VERSION = 22; + static final int DATABASE_VERSION = 23; @VisibleForTesting static final String DATABASE_NAME = "mytracks.db"; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java b/myTracks/src/main/java/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java index 52d267cb8..7bb41395a 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java @@ -24,11 +24,10 @@ import android.location.Location; import android.net.Uri; import android.util.Log; -import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; import com.google.android.apps.mytracks.content.Waypoint.WaypointType; +import com.google.android.apps.mytracks.content.sensor.SensorDataSet; import com.google.android.apps.mytracks.stats.TripStatistics; import com.google.android.apps.mytracks.util.FileUtils; -import com.google.protobuf.InvalidProtocolBufferException; import java.io.File; import java.util.ArrayList; @@ -999,10 +998,18 @@ public class MyTracksProviderUtilsImpl implements MyTracksProviderUtils { values.put(TrackPointsColumns.BEARING, location.getBearing()); } + //SensorData if (location instanceof MyTracksLocation) { MyTracksLocation myTracksLocation = (MyTracksLocation) location; - if (myTracksLocation.getSensorDataSet() != null) { - values.put(TrackPointsColumns.SENSOR, myTracksLocation.getSensorDataSet().toByteArray()); + SensorDataSet sensorDataSet = myTracksLocation.getSensorDataSet(); + if (sensorDataSet != null && sensorDataSet.hasHeartRate()) { + values.put(TrackPointsColumns.SENSOR_HEARTRATE, myTracksLocation.getSensorDataSet().getHeartRate()); + } + if (sensorDataSet != null && sensorDataSet.hasCadence()) { + values.put(TrackPointsColumns.SENSOR_CADENCE, myTracksLocation.getSensorDataSet().getCadence()); + } + if (sensorDataSet != null && sensorDataSet.hasPower()) { + values.put(TrackPointsColumns.SENSOR_POWER, myTracksLocation.getSensorDataSet().getPower()); } } return values; @@ -1039,13 +1046,14 @@ public class MyTracksProviderUtilsImpl implements MyTracksProviderUtils { if (!cursor.isNull(indexes.bearingIndex)) { location.setBearing(cursor.getFloat(indexes.bearingIndex)); } - if (location instanceof MyTracksLocation && !cursor.isNull(indexes.sensorIndex)) { + if (location instanceof MyTracksLocation) { MyTracksLocation myTracksLocation = (MyTracksLocation) location; - try { - myTracksLocation.setSensorDataSet(SensorDataSet.parseFrom(cursor.getBlob(indexes.sensorIndex))); - } catch (InvalidProtocolBufferException e) { - Log.w(TAG, "Failed to parse sensor data.", e); - } + + float heartRate = cursor.isNull(indexes.sensorHeartRateIndex) ? SensorDataSet.DATA_UNAVAILABLE : cursor.getFloat(indexes.sensorHeartRateIndex); + float cadence = cursor.isNull(indexes.sensorCadenceIndex) ? SensorDataSet.DATA_UNAVAILABLE : cursor.getFloat(indexes.sensorCadenceIndex); + float power = cursor.isNull(indexes.sensorPowerIndex) ? SensorDataSet.DATA_UNAVAILABLE : cursor.getFloat(indexes.sensorPowerIndex); + + myTracksLocation.setSensorDataSet(new SensorDataSet(heartRate, cadence, power, SensorDataSet.DATA_UNAVAILABLE, location.getTime())); } } @@ -1084,7 +1092,9 @@ public class MyTracksProviderUtilsImpl implements MyTracksProviderUtils { final int accuracyIndex; final int speedIndex; final int bearingIndex; - final int sensorIndex; + final int sensorHeartRateIndex; + final int sensorCadenceIndex; + final int sensorPowerIndex; CachedTrackPointsIndexes(Cursor cursor) { idIndex = cursor.getColumnIndex(TrackPointsColumns._ID); @@ -1095,7 +1105,9 @@ public class MyTracksProviderUtilsImpl implements MyTracksProviderUtils { accuracyIndex = cursor.getColumnIndexOrThrow(TrackPointsColumns.ACCURACY); speedIndex = cursor.getColumnIndexOrThrow(TrackPointsColumns.SPEED); bearingIndex = cursor.getColumnIndexOrThrow(TrackPointsColumns.BEARING); - sensorIndex = cursor.getColumnIndexOrThrow(TrackPointsColumns.SENSOR); + sensorHeartRateIndex = cursor.getColumnIndexOrThrow(TrackPointsColumns.SENSOR_HEARTRATE); + sensorCadenceIndex = cursor.getColumnIndexOrThrow(TrackPointsColumns.SENSOR_CADENCE); + sensorPowerIndex = cursor.getColumnIndexOrThrow(TrackPointsColumns.SENSOR_POWER); } } diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/content/Sensor.java b/myTracks/src/main/java/com/google/android/apps/mytracks/content/Sensor.java deleted file mode 100644 index 7fd6a652e..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/content/Sensor.java +++ /dev/null @@ -1,882 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: proto/sensor.proto - -package com.google.android.apps.mytracks.content; - -public final class Sensor { - private Sensor() {} - public static void registerAllExtensions( - com.google.protobuf.ExtensionRegistryLite registry) { - } - public enum SensorState - implements com.google.protobuf.Internal.EnumLite { - NONE(0, 1), - CONNECTING(1, 2), - CONNECTED(2, 3), - DISCONNECTED(3, 4), - SENDING(4, 5), - ; - - - public final int getNumber() { return value; } - - public static SensorState valueOf(int value) { - switch (value) { - case 1: return NONE; - case 2: return CONNECTING; - case 3: return CONNECTED; - case 4: return DISCONNECTED; - case 5: return SENDING; - default: return null; - } - } - - public static com.google.protobuf.Internal.EnumLiteMap - internalGetValueMap() { - return internalValueMap; - } - private static com.google.protobuf.Internal.EnumLiteMap - internalValueMap = - new com.google.protobuf.Internal.EnumLiteMap() { - public SensorState findValueByNumber(int number) { - return SensorState.valueOf(number) - ; } - }; - - private final int index; - private final int value; - SensorState(int index, int value) { - this.index = index; - this.value = value; - } - - // @@protoc_insertion_point(enum_scope:com.google.android.apps.mytracks.content.SensorState) - } - - public static final class SensorData extends - com.google.protobuf.GeneratedMessageLite { - // Use SensorData.newBuilder() to construct. - private SensorData() { - initFields(); - } - private SensorData(boolean noInit) {} - - private static final SensorData defaultInstance; - public static SensorData getDefaultInstance() { - return defaultInstance; - } - - public SensorData getDefaultInstanceForType() { - return defaultInstance; - } - - // required .com.google.android.apps.mytracks.content.SensorState state = 1 [default = NONE]; - public static final int STATE_FIELD_NUMBER = 1; - private boolean hasState; - private com.google.android.apps.mytracks.content.Sensor.SensorState state_; - public boolean hasState() { return hasState; } - public com.google.android.apps.mytracks.content.Sensor.SensorState getState() { return state_; } - - // optional int32 value = 2; - public static final int VALUE_FIELD_NUMBER = 2; - private boolean hasValue; - private int value_ = 0; - public boolean hasValue() { return hasValue; } - public int getValue() { return value_; } - - private void initFields() { - state_ = com.google.android.apps.mytracks.content.Sensor.SensorState.NONE; - } - public final boolean isInitialized() { - return hasState; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - if (hasState()) { - output.writeEnum(1, getState().getNumber()); - } - if (hasValue()) { - output.writeInt32(2, getValue()); - } - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - if (hasState()) { - size += com.google.protobuf.CodedOutputStream - .computeEnumSize(1, getState().getNumber()); - } - if (hasValue()) { - size += com.google.protobuf.CodedOutputStream - .computeInt32Size(2, getValue()); - } - memoizedSerializedSize = size; - return size; - } - - public static com.google.android.apps.mytracks.content.Sensor.SensorData parseFrom( - com.google.protobuf.ByteString data) - throws com.google.protobuf.InvalidProtocolBufferException { - return newBuilder().mergeFrom(data).buildParsed(); - } - public static com.google.android.apps.mytracks.content.Sensor.SensorData parseFrom( - com.google.protobuf.ByteString data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return newBuilder().mergeFrom(data, extensionRegistry) - .buildParsed(); - } - public static com.google.android.apps.mytracks.content.Sensor.SensorData parseFrom(byte[] data) - throws com.google.protobuf.InvalidProtocolBufferException { - return newBuilder().mergeFrom(data).buildParsed(); - } - public static com.google.android.apps.mytracks.content.Sensor.SensorData parseFrom( - byte[] data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return newBuilder().mergeFrom(data, extensionRegistry) - .buildParsed(); - } - public static com.google.android.apps.mytracks.content.Sensor.SensorData parseFrom(java.io.InputStream input) - throws java.io.IOException { - return newBuilder().mergeFrom(input).buildParsed(); - } - public static com.google.android.apps.mytracks.content.Sensor.SensorData parseFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return newBuilder().mergeFrom(input, extensionRegistry) - .buildParsed(); - } - public static com.google.android.apps.mytracks.content.Sensor.SensorData parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - Builder builder = newBuilder(); - if (builder.mergeDelimitedFrom(input)) { - return builder.buildParsed(); - } else { - return null; - } - } - public static com.google.android.apps.mytracks.content.Sensor.SensorData parseDelimitedFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - Builder builder = newBuilder(); - if (builder.mergeDelimitedFrom(input, extensionRegistry)) { - return builder.buildParsed(); - } else { - return null; - } - } - public static com.google.android.apps.mytracks.content.Sensor.SensorData parseFrom( - com.google.protobuf.CodedInputStream input) - throws java.io.IOException { - return newBuilder().mergeFrom(input).buildParsed(); - } - public static com.google.android.apps.mytracks.content.Sensor.SensorData parseFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return newBuilder().mergeFrom(input, extensionRegistry) - .buildParsed(); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(com.google.android.apps.mytracks.content.Sensor.SensorData prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - public static final class Builder extends - com.google.protobuf.GeneratedMessageLite.Builder< - com.google.android.apps.mytracks.content.Sensor.SensorData, Builder> { - private com.google.android.apps.mytracks.content.Sensor.SensorData result; - - // Construct using com.google.android.apps.mytracks.content.Sensor.SensorData.newBuilder() - private Builder() {} - - private static Builder create() { - Builder builder = new Builder(); - builder.result = new com.google.android.apps.mytracks.content.Sensor.SensorData(); - return builder; - } - - protected com.google.android.apps.mytracks.content.Sensor.SensorData internalGetResult() { - return result; - } - - public Builder clear() { - if (result == null) { - throw new IllegalStateException( - "Cannot call clear() after build()."); - } - result = new com.google.android.apps.mytracks.content.Sensor.SensorData(); - return this; - } - - public Builder clone() { - return create().mergeFrom(result); - } - - public com.google.android.apps.mytracks.content.Sensor.SensorData getDefaultInstanceForType() { - return com.google.android.apps.mytracks.content.Sensor.SensorData.getDefaultInstance(); - } - - public boolean isInitialized() { - return result.isInitialized(); - } - public com.google.android.apps.mytracks.content.Sensor.SensorData build() { - if (result != null && !isInitialized()) { - throw newUninitializedMessageException(result); - } - return buildPartial(); - } - - private com.google.android.apps.mytracks.content.Sensor.SensorData buildParsed() - throws com.google.protobuf.InvalidProtocolBufferException { - if (!isInitialized()) { - throw newUninitializedMessageException( - result).asInvalidProtocolBufferException(); - } - return buildPartial(); - } - - public com.google.android.apps.mytracks.content.Sensor.SensorData buildPartial() { - if (result == null) { - throw new IllegalStateException( - "build() has already been called on this Builder."); - } - com.google.android.apps.mytracks.content.Sensor.SensorData returnMe = result; - result = null; - return returnMe; - } - - public Builder mergeFrom(com.google.android.apps.mytracks.content.Sensor.SensorData other) { - if (other == com.google.android.apps.mytracks.content.Sensor.SensorData.getDefaultInstance()) return this; - if (other.hasState()) { - setState(other.getState()); - } - if (other.hasValue()) { - setValue(other.getValue()); - } - return this; - } - - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - while (true) { - int tag = input.readTag(); - switch (tag) { - case 0: - return this; - default: { - if (!parseUnknownField(input, extensionRegistry, tag)) { - return this; - } - break; - } - case 8: { - int rawValue = input.readEnum(); - com.google.android.apps.mytracks.content.Sensor.SensorState value = com.google.android.apps.mytracks.content.Sensor.SensorState.valueOf(rawValue); - if (value != null) { - setState(value); - } - break; - } - case 16: { - setValue(input.readInt32()); - break; - } - } - } - } - - - // required .com.google.android.apps.mytracks.content.SensorState state = 1 [default = NONE]; - public boolean hasState() { - return result.hasState(); - } - public com.google.android.apps.mytracks.content.Sensor.SensorState getState() { - return result.getState(); - } - public Builder setState(com.google.android.apps.mytracks.content.Sensor.SensorState value) { - if (value == null) { - throw new NullPointerException(); - } - result.hasState = true; - result.state_ = value; - return this; - } - public Builder clearState() { - result.hasState = false; - result.state_ = com.google.android.apps.mytracks.content.Sensor.SensorState.NONE; - return this; - } - - // optional int32 value = 2; - public boolean hasValue() { - return result.hasValue(); - } - public int getValue() { - return result.getValue(); - } - public Builder setValue(int value) { - result.hasValue = true; - result.value_ = value; - return this; - } - public Builder clearValue() { - result.hasValue = false; - result.value_ = 0; - return this; - } - - // @@protoc_insertion_point(builder_scope:com.google.android.apps.mytracks.content.SensorData) - } - - static { - defaultInstance = new SensorData(true); - com.google.android.apps.mytracks.content.Sensor.internalForceInit(); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:com.google.android.apps.mytracks.content.SensorData) - } - - public static final class SensorDataSet extends - com.google.protobuf.GeneratedMessageLite { - // Use SensorDataSet.newBuilder() to construct. - private SensorDataSet() { - initFields(); - } - private SensorDataSet(boolean noInit) {} - - private static final SensorDataSet defaultInstance; - public static SensorDataSet getDefaultInstance() { - return defaultInstance; - } - - public SensorDataSet getDefaultInstanceForType() { - return defaultInstance; - } - - // optional uint64 creation_time = 1 [default = 0]; - public static final int CREATION_TIME_FIELD_NUMBER = 1; - private boolean hasCreationTime; - private long creationTime_ = 0L; - public boolean hasCreationTime() { return hasCreationTime; } - public long getCreationTime() { return creationTime_; } - - // optional .com.google.android.apps.mytracks.content.SensorData heart_rate = 2; - public static final int HEART_RATE_FIELD_NUMBER = 2; - private boolean hasHeartRate; - private com.google.android.apps.mytracks.content.Sensor.SensorData heartRate_; - public boolean hasHeartRate() { return hasHeartRate; } - public com.google.android.apps.mytracks.content.Sensor.SensorData getHeartRate() { return heartRate_; } - - // optional .com.google.android.apps.mytracks.content.SensorData cadence = 3; - public static final int CADENCE_FIELD_NUMBER = 3; - private boolean hasCadence; - private com.google.android.apps.mytracks.content.Sensor.SensorData cadence_; - public boolean hasCadence() { return hasCadence; } - public com.google.android.apps.mytracks.content.Sensor.SensorData getCadence() { return cadence_; } - - // optional .com.google.android.apps.mytracks.content.SensorData power = 4; - public static final int POWER_FIELD_NUMBER = 4; - private boolean hasPower; - private com.google.android.apps.mytracks.content.Sensor.SensorData power_; - public boolean hasPower() { return hasPower; } - public com.google.android.apps.mytracks.content.Sensor.SensorData getPower() { return power_; } - - // optional .com.google.android.apps.mytracks.content.SensorData battery_level = 5; - public static final int BATTERY_LEVEL_FIELD_NUMBER = 5; - private boolean hasBatteryLevel; - private com.google.android.apps.mytracks.content.Sensor.SensorData batteryLevel_; - public boolean hasBatteryLevel() { return hasBatteryLevel; } - public com.google.android.apps.mytracks.content.Sensor.SensorData getBatteryLevel() { return batteryLevel_; } - - private void initFields() { - heartRate_ = com.google.android.apps.mytracks.content.Sensor.SensorData.getDefaultInstance(); - cadence_ = com.google.android.apps.mytracks.content.Sensor.SensorData.getDefaultInstance(); - power_ = com.google.android.apps.mytracks.content.Sensor.SensorData.getDefaultInstance(); - batteryLevel_ = com.google.android.apps.mytracks.content.Sensor.SensorData.getDefaultInstance(); - } - public final boolean isInitialized() { - if (hasHeartRate()) { - if (!getHeartRate().isInitialized()) return false; - } - if (hasCadence()) { - if (!getCadence().isInitialized()) return false; - } - if (hasPower()) { - if (!getPower().isInitialized()) return false; - } - if (hasBatteryLevel()) { - return getBatteryLevel().isInitialized(); - } - return true; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - if (hasCreationTime()) { - output.writeUInt64(1, getCreationTime()); - } - if (hasHeartRate()) { - output.writeMessage(2, getHeartRate()); - } - if (hasCadence()) { - output.writeMessage(3, getCadence()); - } - if (hasPower()) { - output.writeMessage(4, getPower()); - } - if (hasBatteryLevel()) { - output.writeMessage(5, getBatteryLevel()); - } - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - if (hasCreationTime()) { - size += com.google.protobuf.CodedOutputStream - .computeUInt64Size(1, getCreationTime()); - } - if (hasHeartRate()) { - size += com.google.protobuf.CodedOutputStream - .computeMessageSize(2, getHeartRate()); - } - if (hasCadence()) { - size += com.google.protobuf.CodedOutputStream - .computeMessageSize(3, getCadence()); - } - if (hasPower()) { - size += com.google.protobuf.CodedOutputStream - .computeMessageSize(4, getPower()); - } - if (hasBatteryLevel()) { - size += com.google.protobuf.CodedOutputStream - .computeMessageSize(5, getBatteryLevel()); - } - memoizedSerializedSize = size; - return size; - } - - public static com.google.android.apps.mytracks.content.Sensor.SensorDataSet parseFrom( - com.google.protobuf.ByteString data) - throws com.google.protobuf.InvalidProtocolBufferException { - return newBuilder().mergeFrom(data).buildParsed(); - } - public static com.google.android.apps.mytracks.content.Sensor.SensorDataSet parseFrom( - com.google.protobuf.ByteString data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return newBuilder().mergeFrom(data, extensionRegistry) - .buildParsed(); - } - public static com.google.android.apps.mytracks.content.Sensor.SensorDataSet parseFrom(byte[] data) - throws com.google.protobuf.InvalidProtocolBufferException { - return newBuilder().mergeFrom(data).buildParsed(); - } - public static com.google.android.apps.mytracks.content.Sensor.SensorDataSet parseFrom( - byte[] data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return newBuilder().mergeFrom(data, extensionRegistry) - .buildParsed(); - } - public static com.google.android.apps.mytracks.content.Sensor.SensorDataSet parseFrom(java.io.InputStream input) - throws java.io.IOException { - return newBuilder().mergeFrom(input).buildParsed(); - } - public static com.google.android.apps.mytracks.content.Sensor.SensorDataSet parseFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return newBuilder().mergeFrom(input, extensionRegistry) - .buildParsed(); - } - public static com.google.android.apps.mytracks.content.Sensor.SensorDataSet parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - Builder builder = newBuilder(); - if (builder.mergeDelimitedFrom(input)) { - return builder.buildParsed(); - } else { - return null; - } - } - public static com.google.android.apps.mytracks.content.Sensor.SensorDataSet parseDelimitedFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - Builder builder = newBuilder(); - if (builder.mergeDelimitedFrom(input, extensionRegistry)) { - return builder.buildParsed(); - } else { - return null; - } - } - public static com.google.android.apps.mytracks.content.Sensor.SensorDataSet parseFrom( - com.google.protobuf.CodedInputStream input) - throws java.io.IOException { - return newBuilder().mergeFrom(input).buildParsed(); - } - public static com.google.android.apps.mytracks.content.Sensor.SensorDataSet parseFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return newBuilder().mergeFrom(input, extensionRegistry) - .buildParsed(); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(com.google.android.apps.mytracks.content.Sensor.SensorDataSet prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - public static final class Builder extends - com.google.protobuf.GeneratedMessageLite.Builder< - com.google.android.apps.mytracks.content.Sensor.SensorDataSet, Builder> { - private com.google.android.apps.mytracks.content.Sensor.SensorDataSet result; - - // Construct using com.google.android.apps.mytracks.content.Sensor.SensorDataSet.newBuilder() - private Builder() {} - - private static Builder create() { - Builder builder = new Builder(); - builder.result = new com.google.android.apps.mytracks.content.Sensor.SensorDataSet(); - return builder; - } - - protected com.google.android.apps.mytracks.content.Sensor.SensorDataSet internalGetResult() { - return result; - } - - public Builder clear() { - if (result == null) { - throw new IllegalStateException( - "Cannot call clear() after build()."); - } - result = new com.google.android.apps.mytracks.content.Sensor.SensorDataSet(); - return this; - } - - public Builder clone() { - return create().mergeFrom(result); - } - - public com.google.android.apps.mytracks.content.Sensor.SensorDataSet getDefaultInstanceForType() { - return com.google.android.apps.mytracks.content.Sensor.SensorDataSet.getDefaultInstance(); - } - - public boolean isInitialized() { - return result.isInitialized(); - } - public com.google.android.apps.mytracks.content.Sensor.SensorDataSet build() { - if (result != null && !isInitialized()) { - throw newUninitializedMessageException(result); - } - return buildPartial(); - } - - private com.google.android.apps.mytracks.content.Sensor.SensorDataSet buildParsed() - throws com.google.protobuf.InvalidProtocolBufferException { - if (!isInitialized()) { - throw newUninitializedMessageException( - result).asInvalidProtocolBufferException(); - } - return buildPartial(); - } - - public com.google.android.apps.mytracks.content.Sensor.SensorDataSet buildPartial() { - if (result == null) { - throw new IllegalStateException( - "build() has already been called on this Builder."); - } - com.google.android.apps.mytracks.content.Sensor.SensorDataSet returnMe = result; - result = null; - return returnMe; - } - - public Builder mergeFrom(com.google.android.apps.mytracks.content.Sensor.SensorDataSet other) { - if (other == com.google.android.apps.mytracks.content.Sensor.SensorDataSet.getDefaultInstance()) return this; - if (other.hasCreationTime()) { - setCreationTime(other.getCreationTime()); - } - if (other.hasHeartRate()) { - mergeHeartRate(other.getHeartRate()); - } - if (other.hasCadence()) { - mergeCadence(other.getCadence()); - } - if (other.hasPower()) { - mergePower(other.getPower()); - } - if (other.hasBatteryLevel()) { - mergeBatteryLevel(other.getBatteryLevel()); - } - return this; - } - - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - while (true) { - int tag = input.readTag(); - switch (tag) { - case 0: - return this; - default: { - if (!parseUnknownField(input, extensionRegistry, tag)) { - return this; - } - break; - } - case 8: { - setCreationTime(input.readUInt64()); - break; - } - case 18: { - com.google.android.apps.mytracks.content.Sensor.SensorData.Builder subBuilder = com.google.android.apps.mytracks.content.Sensor.SensorData.newBuilder(); - if (hasHeartRate()) { - subBuilder.mergeFrom(getHeartRate()); - } - input.readMessage(subBuilder, extensionRegistry); - setHeartRate(subBuilder.buildPartial()); - break; - } - case 26: { - com.google.android.apps.mytracks.content.Sensor.SensorData.Builder subBuilder = com.google.android.apps.mytracks.content.Sensor.SensorData.newBuilder(); - if (hasCadence()) { - subBuilder.mergeFrom(getCadence()); - } - input.readMessage(subBuilder, extensionRegistry); - setCadence(subBuilder.buildPartial()); - break; - } - case 34: { - com.google.android.apps.mytracks.content.Sensor.SensorData.Builder subBuilder = com.google.android.apps.mytracks.content.Sensor.SensorData.newBuilder(); - if (hasPower()) { - subBuilder.mergeFrom(getPower()); - } - input.readMessage(subBuilder, extensionRegistry); - setPower(subBuilder.buildPartial()); - break; - } - case 42: { - com.google.android.apps.mytracks.content.Sensor.SensorData.Builder subBuilder = com.google.android.apps.mytracks.content.Sensor.SensorData.newBuilder(); - if (hasBatteryLevel()) { - subBuilder.mergeFrom(getBatteryLevel()); - } - input.readMessage(subBuilder, extensionRegistry); - setBatteryLevel(subBuilder.buildPartial()); - break; - } - } - } - } - - - // optional uint64 creation_time = 1 [default = 0]; - public boolean hasCreationTime() { - return result.hasCreationTime(); - } - public long getCreationTime() { - return result.getCreationTime(); - } - public Builder setCreationTime(long value) { - result.hasCreationTime = true; - result.creationTime_ = value; - return this; - } - public Builder clearCreationTime() { - result.hasCreationTime = false; - result.creationTime_ = 0L; - return this; - } - - // optional .com.google.android.apps.mytracks.content.SensorData heart_rate = 2; - public boolean hasHeartRate() { - return result.hasHeartRate(); - } - public com.google.android.apps.mytracks.content.Sensor.SensorData getHeartRate() { - return result.getHeartRate(); - } - public Builder setHeartRate(com.google.android.apps.mytracks.content.Sensor.SensorData value) { - if (value == null) { - throw new NullPointerException(); - } - result.hasHeartRate = true; - result.heartRate_ = value; - return this; - } - public Builder setHeartRate(com.google.android.apps.mytracks.content.Sensor.SensorData.Builder builderForValue) { - result.hasHeartRate = true; - result.heartRate_ = builderForValue.build(); - return this; - } - public Builder mergeHeartRate(com.google.android.apps.mytracks.content.Sensor.SensorData value) { - if (result.hasHeartRate() && - result.heartRate_ != com.google.android.apps.mytracks.content.Sensor.SensorData.getDefaultInstance()) { - result.heartRate_ = - com.google.android.apps.mytracks.content.Sensor.SensorData.newBuilder(result.heartRate_).mergeFrom(value).buildPartial(); - } else { - result.heartRate_ = value; - } - result.hasHeartRate = true; - return this; - } - public Builder clearHeartRate() { - result.hasHeartRate = false; - result.heartRate_ = com.google.android.apps.mytracks.content.Sensor.SensorData.getDefaultInstance(); - return this; - } - - // optional .com.google.android.apps.mytracks.content.SensorData cadence = 3; - public boolean hasCadence() { - return result.hasCadence(); - } - public com.google.android.apps.mytracks.content.Sensor.SensorData getCadence() { - return result.getCadence(); - } - public Builder setCadence(com.google.android.apps.mytracks.content.Sensor.SensorData value) { - if (value == null) { - throw new NullPointerException(); - } - result.hasCadence = true; - result.cadence_ = value; - return this; - } - public Builder setCadence(com.google.android.apps.mytracks.content.Sensor.SensorData.Builder builderForValue) { - result.hasCadence = true; - result.cadence_ = builderForValue.build(); - return this; - } - public Builder mergeCadence(com.google.android.apps.mytracks.content.Sensor.SensorData value) { - if (result.hasCadence() && - result.cadence_ != com.google.android.apps.mytracks.content.Sensor.SensorData.getDefaultInstance()) { - result.cadence_ = - com.google.android.apps.mytracks.content.Sensor.SensorData.newBuilder(result.cadence_).mergeFrom(value).buildPartial(); - } else { - result.cadence_ = value; - } - result.hasCadence = true; - return this; - } - public Builder clearCadence() { - result.hasCadence = false; - result.cadence_ = com.google.android.apps.mytracks.content.Sensor.SensorData.getDefaultInstance(); - return this; - } - - // optional .com.google.android.apps.mytracks.content.SensorData power = 4; - public boolean hasPower() { - return result.hasPower(); - } - public com.google.android.apps.mytracks.content.Sensor.SensorData getPower() { - return result.getPower(); - } - public Builder setPower(com.google.android.apps.mytracks.content.Sensor.SensorData value) { - if (value == null) { - throw new NullPointerException(); - } - result.hasPower = true; - result.power_ = value; - return this; - } - public Builder setPower(com.google.android.apps.mytracks.content.Sensor.SensorData.Builder builderForValue) { - result.hasPower = true; - result.power_ = builderForValue.build(); - return this; - } - public Builder mergePower(com.google.android.apps.mytracks.content.Sensor.SensorData value) { - if (result.hasPower() && - result.power_ != com.google.android.apps.mytracks.content.Sensor.SensorData.getDefaultInstance()) { - result.power_ = - com.google.android.apps.mytracks.content.Sensor.SensorData.newBuilder(result.power_).mergeFrom(value).buildPartial(); - } else { - result.power_ = value; - } - result.hasPower = true; - return this; - } - public Builder clearPower() { - result.hasPower = false; - result.power_ = com.google.android.apps.mytracks.content.Sensor.SensorData.getDefaultInstance(); - return this; - } - - // optional .com.google.android.apps.mytracks.content.SensorData battery_level = 5; - public boolean hasBatteryLevel() { - return result.hasBatteryLevel(); - } - public com.google.android.apps.mytracks.content.Sensor.SensorData getBatteryLevel() { - return result.getBatteryLevel(); - } - public Builder setBatteryLevel(com.google.android.apps.mytracks.content.Sensor.SensorData value) { - if (value == null) { - throw new NullPointerException(); - } - result.hasBatteryLevel = true; - result.batteryLevel_ = value; - return this; - } - public Builder setBatteryLevel(com.google.android.apps.mytracks.content.Sensor.SensorData.Builder builderForValue) { - result.hasBatteryLevel = true; - result.batteryLevel_ = builderForValue.build(); - return this; - } - public Builder mergeBatteryLevel(com.google.android.apps.mytracks.content.Sensor.SensorData value) { - if (result.hasBatteryLevel() && - result.batteryLevel_ != com.google.android.apps.mytracks.content.Sensor.SensorData.getDefaultInstance()) { - result.batteryLevel_ = - com.google.android.apps.mytracks.content.Sensor.SensorData.newBuilder(result.batteryLevel_).mergeFrom(value).buildPartial(); - } else { - result.batteryLevel_ = value; - } - result.hasBatteryLevel = true; - return this; - } - public Builder clearBatteryLevel() { - result.hasBatteryLevel = false; - result.batteryLevel_ = com.google.android.apps.mytracks.content.Sensor.SensorData.getDefaultInstance(); - return this; - } - - // @@protoc_insertion_point(builder_scope:com.google.android.apps.mytracks.content.SensorDataSet) - } - - static { - defaultInstance = new SensorDataSet(true); - com.google.android.apps.mytracks.content.Sensor.internalForceInit(); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:com.google.android.apps.mytracks.content.SensorDataSet) - } - - - static { - } - - public static void internalForceInit() {} - - // @@protoc_insertion_point(outer_class_scope) -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/content/TrackPointsColumns.java b/myTracks/src/main/java/com/google/android/apps/mytracks/content/TrackPointsColumns.java index 95322e639..bb3f86d0a 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/content/TrackPointsColumns.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/content/TrackPointsColumns.java @@ -41,7 +41,9 @@ public interface TrackPointsColumns extends BaseColumns { String ACCURACY = "accuracy"; String SPEED = "speed"; String BEARING = "bearing"; - String SENSOR = "sensor"; + String SENSOR_HEARTRATE = "sensor_heartrate"; + String SENSOR_CADENCE = "sensor_cadence"; + String SENSOR_POWER = "sensor_power"; String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " @@ -53,6 +55,7 @@ public interface TrackPointsColumns extends BaseColumns { + ACCURACY + " FLOAT, " + SPEED + " FLOAT, " + BEARING + " FLOAT, " - + SENSOR + " BLOB" - + ");"; + + SENSOR_HEARTRATE + " FLOAT, " + + SENSOR_CADENCE + " FLOAT, " + + SENSOR_POWER + " FLOAT);"; } diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/content/sensor/SensorDataSet.java b/myTracks/src/main/java/com/google/android/apps/mytracks/content/sensor/SensorDataSet.java new file mode 100644 index 000000000..497232387 --- /dev/null +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/content/sensor/SensorDataSet.java @@ -0,0 +1,74 @@ +package com.google.android.apps.mytracks.content.sensor; + +public final class SensorDataSet { + + public static final float DATA_UNAVAILABLE = Integer.MAX_VALUE; + + //TODO It might be necessary to consider: sensor if sensor was connected as well. + + private float heartRate; + private float cadence; + private float power; + private float batteryLevel; + private long creationTimestamp; + + public SensorDataSet(float heartRate, float cadence, float power, float batteryLevel, long creationTimestamp) { + this.heartRate = heartRate; + this.cadence = cadence; + this.power = power; + this.batteryLevel = batteryLevel; + this.creationTimestamp = creationTimestamp; + } + + public SensorDataSet(float heartRate, float cadence, float power, float batteryLevel) { + this(heartRate, cadence, power, batteryLevel, System.currentTimeMillis()); + } + + public SensorDataSet(float heartRate, float cadence, float power) { + this(heartRate, cadence, power, DATA_UNAVAILABLE, System.currentTimeMillis()); + } + + public SensorDataSet(float heartRate, float cadence) { + this(heartRate, cadence, DATA_UNAVAILABLE, DATA_UNAVAILABLE, System.currentTimeMillis()); + } + + public SensorDataSet(float heartRate) { + this(heartRate, DATA_UNAVAILABLE, DATA_UNAVAILABLE, DATA_UNAVAILABLE, System.currentTimeMillis()); + } + + public boolean hasHeartRate() { + return heartRate != DATA_UNAVAILABLE; + } + + public float getHeartRate() { + return heartRate; + } + + public boolean hasCadence() { + return cadence != DATA_UNAVAILABLE; + } + + public float getCadence() { + return cadence; + } + + public boolean hasPower() { + return power != DATA_UNAVAILABLE; + } + + public float getPower() { + return power; + } + + public long getCreationTime() { + return creationTimestamp; + } + + public boolean hasBatteryLevel() { + return batteryLevel != DATA_UNAVAILABLE; + } + + public float getBatteryLevel() { + return batteryLevel; + } +} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/content/sensor/SensorState.java b/myTracks/src/main/java/com/google/android/apps/mytracks/content/sensor/SensorState.java new file mode 100644 index 000000000..bd95c231f --- /dev/null +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/content/sensor/SensorState.java @@ -0,0 +1,27 @@ +package com.google.android.apps.mytracks.content.sensor; + +import android.content.Context; + +import com.google.android.maps.mytracks.R; + +public enum SensorState { + NONE, + CONNECTING, + CONNECTED, + DISCONNECTED; + + public static String getStateAsString(SensorState state, Context c) { + switch (state) { + case NONE: + return c.getString(R.string.value_none); + case CONNECTING: + return c.getString(R.string.sensor_state_connecting); + case CONNECTED: + return c.getString(R.string.sensor_state_connected); + case DISCONNECTED: + return c.getString(R.string.sensor_state_disconnected); + default: + return ""; + } + } +} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ChartFragment.java b/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ChartFragment.java index 3e62cf549..93bfdfdc2 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ChartFragment.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ChartFragment.java @@ -32,13 +32,12 @@ import androidx.fragment.app.FragmentActivity; import com.google.android.apps.mytracks.ChartView; import com.google.android.apps.mytracks.TrackDetailActivity; import com.google.android.apps.mytracks.content.MyTracksLocation; -import com.google.android.apps.mytracks.content.Sensor; -import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.TrackDataHub; import com.google.android.apps.mytracks.content.TrackDataListener; import com.google.android.apps.mytracks.content.TrackDataType; import com.google.android.apps.mytracks.content.Waypoint; +import com.google.android.apps.mytracks.content.sensor.SensorDataSet; import com.google.android.apps.mytracks.stats.TripStatistics; import com.google.android.apps.mytracks.stats.TripStatisticsUpdater; import com.google.android.apps.mytracks.util.LocationUtils; @@ -478,23 +477,16 @@ public class ChartFragment extends Fragment implements TrackDataListener { } pace = speed == 0 ? 0.0 : 60.0 / speed; } - if (location instanceof MyTracksLocation - && ((MyTracksLocation) location).getSensorDataSet() != null) { + if (location instanceof MyTracksLocation && ((MyTracksLocation) location).getSensorDataSet() != null) { SensorDataSet sensorDataSet = ((MyTracksLocation) location).getSensorDataSet(); - if (sensorDataSet.hasHeartRate() - && sensorDataSet.getHeartRate().getState() == Sensor.SensorState.SENDING - && sensorDataSet.getHeartRate().hasValue()) { - heartRate = sensorDataSet.getHeartRate().getValue(); + if (sensorDataSet.hasHeartRate()) { + heartRate = sensorDataSet.getHeartRate(); } - if (sensorDataSet.hasCadence() - && sensorDataSet.getCadence().getState() == Sensor.SensorState.SENDING - && sensorDataSet.getCadence().hasValue()) { - cadence = sensorDataSet.getCadence().getValue(); + if (sensorDataSet.hasCadence()) { + cadence = sensorDataSet.getCadence(); } - if (sensorDataSet.hasPower() - && sensorDataSet.getPower().getState() == Sensor.SensorState.SENDING - && sensorDataSet.getPower().hasValue()) { - power = sensorDataSet.getPower().getValue(); + if (sensorDataSet.hasPower()) { + power = sensorDataSet.getPower(); } } diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/exporter/GpxTrackWriter.java b/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/exporter/GpxTrackWriter.java index 61a4c8f2e..09f7bbc61 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/exporter/GpxTrackWriter.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/exporter/GpxTrackWriter.java @@ -33,6 +33,7 @@ import java.util.Locale; * * @author Sandor Dornbush */ +//TODO Can we export Sensor.Data in GPX? public class GpxTrackWriter implements TrackWriter { private static final NumberFormat ELEVATION_FORMAT = NumberFormat.getInstance(Locale.US); diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/exporter/KmlTrackWriter.java b/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/exporter/KmlTrackWriter.java index 02684b831..0f1b4c339 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/exporter/KmlTrackWriter.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/exporter/KmlTrackWriter.java @@ -19,18 +19,17 @@ import android.content.Context; import android.database.Cursor; import android.location.Location; import android.net.Uri; + import androidx.annotation.VisibleForTesting; import com.google.android.apps.mytracks.content.DescriptionGenerator; import com.google.android.apps.mytracks.content.DescriptionGeneratorImpl; import com.google.android.apps.mytracks.content.MyTracksLocation; import com.google.android.apps.mytracks.content.MyTracksProviderUtils; -import com.google.android.apps.mytracks.content.Sensor; -import com.google.android.apps.mytracks.content.Sensor.SensorData; -import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.Waypoint; import com.google.android.apps.mytracks.content.Waypoint.WaypointType; +import com.google.android.apps.mytracks.content.sensor.SensorDataSet; import com.google.android.apps.mytracks.io.file.TrackFileFormat; import com.google.android.apps.mytracks.util.StringUtils; import com.google.android.maps.mytracks.R; @@ -75,9 +74,9 @@ public class KmlTrackWriter implements TrackWriter { private final MyTracksProviderUtils myTracksProviderUtils; private PrintWriter printWriter; - private ArrayList powerList = new ArrayList<>(); - private ArrayList cadenceList = new ArrayList<>(); - private ArrayList heartRateList = new ArrayList<>(); + private ArrayList powerList = new ArrayList<>(); + private ArrayList cadenceList = new ArrayList<>(); + private ArrayList heartRateList = new ArrayList<>(); private boolean hasPower; private boolean hasCadence; private boolean hasHeartRate; @@ -264,36 +263,17 @@ public class KmlTrackWriter implements TrackWriter { printWriter.println("" + getCoordinates(location, " ") + ""); if (location instanceof MyTracksLocation) { SensorDataSet sensorDataSet = ((MyTracksLocation) location).getSensorDataSet(); - int power = -1; - int cadence = -1; - int heartRate = -1; - if (sensorDataSet != null) { - if (sensorDataSet.hasPower()) { - SensorData sensorData = sensorDataSet.getPower(); - if (sensorData.hasValue() && sensorData.getState() == Sensor.SensorState.SENDING) { - hasPower = true; - power = sensorData.getValue(); - } + if (sensorDataSet.hasHeartRate()) { + heartRateList.add(sensorDataSet.getHeartRate()); } if (sensorDataSet.hasCadence()) { - SensorData sensorData = sensorDataSet.getCadence(); - if (sensorData.hasValue() && sensorData.getState() == Sensor.SensorState.SENDING) { - hasCadence = true; - cadence = sensorData.getValue(); - } + cadenceList.add(sensorDataSet.getCadence()); } - if (sensorDataSet.hasHeartRate()) { - SensorData sensorData = sensorDataSet.getHeartRate(); - if (sensorData.hasValue() && sensorData.getState() == Sensor.SensorState.SENDING) { - hasHeartRate = true; - heartRate = sensorData.getValue(); - } + if (sensorDataSet.hasPower()) { + powerList.add(sensorDataSet.getPower()); } } - powerList.add(power); - cadenceList.add(cadence); - heartRateList.add(heartRate); } } } @@ -304,7 +284,7 @@ public class KmlTrackWriter implements TrackWriter { * @param list a list of sensor data * @param name the name of the sensor data */ - private void writeSensorData(ArrayList list, String name) { + private void writeSensorData(ArrayList list, String name) { printWriter.println(""); for (int i = 0; i < list.size(); i++) { printWriter.println("" + list.get(i) + ""); diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/importer/KmlFileTrackImporter.java b/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/importer/KmlFileTrackImporter.java index 1c5fdb2eb..a7c4edf1a 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/importer/KmlFileTrackImporter.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/importer/KmlFileTrackImporter.java @@ -24,9 +24,8 @@ import androidx.annotation.VisibleForTesting; import com.google.android.apps.mytracks.content.MyTracksLocation; import com.google.android.apps.mytracks.content.MyTracksProviderUtils; -import com.google.android.apps.mytracks.content.Sensor; -import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; import com.google.android.apps.mytracks.content.Waypoint.WaypointType; +import com.google.android.apps.mytracks.content.sensor.SensorDataSet; import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -223,9 +222,9 @@ public class KmlFileTrackImporter extends AbstractFileTrackImporter { protected void onTrackSegmentStart() { super.onTrackSegmentStart(); locationList = new ArrayList<>(); - powerList = new ArrayList<>(); - cadenceList = new ArrayList<>(); heartRateList = new ArrayList<>(); + cadenceList = new ArrayList<>(); + powerList = new ArrayList<>(); } /** @@ -233,9 +232,9 @@ public class KmlFileTrackImporter extends AbstractFileTrackImporter { */ private void onTrackSegmentEnd() { // Close a track segment by inserting the segment locations - boolean hasPower = powerList.size() == locationList.size(); - boolean hasCadence = cadenceList.size() == locationList.size(); boolean hasHeartRate = heartRateList.size() == locationList.size(); + boolean hasCadence = cadenceList.size() == locationList.size(); + boolean hasPower = powerList.size() == locationList.size(); for (int i = 0; i < locationList.size(); i++) { Location location = locationList.get(i); @@ -243,21 +242,11 @@ public class KmlFileTrackImporter extends AbstractFileTrackImporter { if (!hasPower && !hasCadence && !hasHeartRate) { insertTrackPoint(location); } else { - SensorDataSet.Builder builder = Sensor.SensorDataSet.newBuilder(); - if (hasPower) { - builder.setPower(Sensor.SensorData.newBuilder() - .setValue(powerList.get(i)).setState(Sensor.SensorState.SENDING)); - } - if (hasCadence) { - builder.setCadence(Sensor.SensorData.newBuilder() - .setValue(cadenceList.get(i)).setState(Sensor.SensorState.SENDING)); - } - if (hasHeartRate) { - builder.setHeartRate(Sensor.SensorData.newBuilder() - .setValue(heartRateList.get(i)).setState(Sensor.SensorState.SENDING)); - } - SensorDataSet sensorDataSet = builder.setCreationTime(location.getTime()).build(); - MyTracksLocation myTracksLocation = new MyTracksLocation(location, sensorDataSet); + float heartrate = hasHeartRate ? heartRateList.get(i) : SensorDataSet.DATA_UNAVAILABLE; + float cadence = hasHeartRate ? cadenceList.get(i) : SensorDataSet.DATA_UNAVAILABLE; + float power = hasHeartRate ? powerList.get(i) : SensorDataSet.DATA_UNAVAILABLE; + + MyTracksLocation myTracksLocation = new MyTracksLocation(location, new SensorDataSet(heartrate, cadence, power, SensorDataSet.DATA_UNAVAILABLE, location.getTime())); insertTrackPoint(myTracksLocation); } } diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/ITrackRecordingService.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/ITrackRecordingService.java index 512e125d8..84482c37d 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/ITrackRecordingService.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/services/ITrackRecordingService.java @@ -18,6 +18,8 @@ package com.google.android.apps.mytracks.services; import android.location.Location; import com.google.android.apps.mytracks.content.WaypointCreationRequest; +import com.google.android.apps.mytracks.content.sensor.SensorDataSet; +import com.google.android.apps.mytracks.content.sensor.SensorState; /** * MyTracks service. @@ -98,14 +100,14 @@ public interface ITrackRecordingService { /** * Gets the current sensor data. Returns null if there is no data. - * @return a byte array of the binary version of the Sensor.SensorDataSet object. + * @return SensorDataSet object. */ - byte[] getSensorData(); + SensorDataSet getSensorData(); /** * Gets the current sensor manager state. * * return a Sensor.SensorState enum value. */ - int getSensorState(); + SensorState getSensorState(); } diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/TrackRecordingService.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/TrackRecordingService.java index b60a0ad91..68c205c8d 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/TrackRecordingService.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/services/TrackRecordingService.java @@ -49,12 +49,12 @@ import com.google.android.apps.mytracks.content.MyTracksLocation; import com.google.android.apps.mytracks.content.MyTracksProvider; import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.MyTracksProviderUtils.LocationIterator; -import com.google.android.apps.mytracks.content.Sensor; -import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.Waypoint; import com.google.android.apps.mytracks.content.Waypoint.WaypointType; import com.google.android.apps.mytracks.content.WaypointCreationRequest; +import com.google.android.apps.mytracks.content.sensor.SensorDataSet; +import com.google.android.apps.mytracks.content.sensor.SensorState; import com.google.android.apps.mytracks.services.sensors.SensorManager; import com.google.android.apps.mytracks.services.sensors.SensorManagerFactory; import com.google.android.apps.mytracks.services.tasks.AnnouncementPeriodicTaskFactory; @@ -1129,7 +1129,7 @@ public class TrackRecordingService extends Service { } @Override - public byte[] getSensorData() { + public SensorDataSet getSensorData() { if (trackRecordingService.sensorManager == null) { Log.d(TAG, "sensorManager is null."); return null; @@ -1138,16 +1138,16 @@ public class TrackRecordingService extends Service { Log.d(TAG, "Sensor data set is null."); return null; } - return trackRecordingService.sensorManager.getSensorDataSet().toByteArray(); + return trackRecordingService.sensorManager.getSensorDataSet(); } @Override - public int getSensorState() { + public SensorState getSensorState() { if (trackRecordingService.sensorManager == null) { Log.d(TAG, "sensorManager is null."); - return Sensor.SensorState.NONE.getNumber(); + return SensorState.NONE; } - return trackRecordingService.sensorManager.getSensorState().getNumber(); + return trackRecordingService.sensorManager.getSensorState(); } /** diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/BluetoothConnectionManager.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/BluetoothConnectionManager.java index 79313559e..cbc5b9c5a 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/BluetoothConnectionManager.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/BluetoothConnectionManager.java @@ -30,8 +30,7 @@ import android.util.Log; import androidx.annotation.NonNull; -import com.google.android.apps.mytracks.content.Sensor; -import com.google.android.apps.mytracks.content.Sensor.SensorState; +import com.google.android.apps.mytracks.content.sensor.SensorState; import java.util.UUID; @@ -123,7 +122,7 @@ public class BluetoothConnectionManager { * * @param sensorState the sensor state */ - private synchronized void setState(Sensor.SensorState sensorState) { + private synchronized void setState(SensorState sensorState) { this.sensorState = sensorState; } @@ -132,7 +131,7 @@ public class BluetoothConnectionManager { */ public synchronized void reset() { //TODO Disconnect - setState(Sensor.SensorState.NONE); + setState(SensorState.NONE); } /** @@ -144,6 +143,6 @@ public class BluetoothConnectionManager { Log.d(TAG, "connect to: " + bluetoothDevice); bluetoothDevice.connectGatt(this.context, false, this.connectCallback); - setState(Sensor.SensorState.CONNECTING); + setState(SensorState.CONNECTING); } } diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/BluetoothSensorManager.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/BluetoothSensorManager.java index 8df9ea283..930dfd8b4 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/BluetoothSensorManager.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/BluetoothSensorManager.java @@ -25,9 +25,8 @@ import android.os.Message; import android.util.Log; import android.widget.Toast; -import com.google.android.apps.mytracks.content.Sensor; -import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; -import com.google.android.apps.mytracks.content.Sensor.SensorState; +import com.google.android.apps.mytracks.content.sensor.SensorDataSet; +import com.google.android.apps.mytracks.content.sensor.SensorState; import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.apps.mytracks.util.UnitConversions; import com.google.android.maps.mytracks.R; @@ -98,10 +97,7 @@ public class BluetoothSensorManager extends SensorManager { Toast.makeText(context, context.getString(R.string.settings_sensor_connected, deviceName), Toast.LENGTH_LONG).show(); break; case BluetoothConnectionManager.MESSAGE_READ: - sensorDataSet = SensorDataSet.newBuilder() - .setHeartRate(Sensor.SensorData.newBuilder().setValue(message.arg1) - .setState(SensorState.SENDING)) - .build(); + sensorDataSet = new SensorDataSet(message.arg1, SensorDataSet.DATA_UNAVAILABLE, SensorDataSet.DATA_UNAVAILABLE); break; default: break; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/SensorManager.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/SensorManager.java index c8f9a3c8e..4c6cdbeab 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/SensorManager.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/SensorManager.java @@ -16,11 +16,11 @@ package com.google.android.apps.mytracks.services.sensors; -import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; -import com.google.android.apps.mytracks.content.Sensor.SensorState; - import android.util.Log; +import com.google.android.apps.mytracks.content.sensor.SensorDataSet; +import com.google.android.apps.mytracks.content.sensor.SensorState; + import java.util.Timer; import java.util.TimerTask; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/SensorUtils.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/SensorUtils.java deleted file mode 100644 index 7d38f1038..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/SensorUtils.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * 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.content.Sensor; -import com.google.android.maps.mytracks.R; - -import android.content.Context; - -/** - * A collection of methods for message parsers. - * - * @author Sandor Dornbush - * @author Nico Laum - */ -public class SensorUtils { - - private SensorUtils() { - } - - /** - * Extract one unsigned short from a big endian byte array. - * - * @param buffer the buffer to extract the short from - * @param index the first byte to be interpreted as part of the short - * @return The unsigned short at the given index in the buffer - */ - public static int unsignedShortToInt(byte[] buffer, int index) { - int r = (buffer[index] & 0xFF) << 8; - r |= buffer[index + 1] & 0xFF; - return r; - } - - /** - * Extract one unsigned short from a little endian byte array. - * - * @param buffer the buffer to extract the short from - * @param index the first byte to be interpreted as part of the short - * @return The unsigned short at the given index in the buffer - */ - public static int unsignedShortToIntLittleEndian(byte[] buffer, int index) { - int r = buffer[index] & 0xFF; - r |= (buffer[index + 1] & 0xFF) << 8; - return r; - } - - /** - * Returns CRC8 (polynomial 0x8C) from byte array buffer[start] to - * (excluding) buffer[start + length] - * - * @param buffer the byte array of data (payload) - * @param start the position in the byte array where the payload begins - * @param length the length - * @return CRC8 value - */ - public static byte getCrc8(byte[] buffer, int start, int length) { - byte crc = 0x0; - - for (int i = start; i < (start + length); i++) { - crc = crc8PushByte(crc, buffer[i]); - } - return crc; - } - - /** - * Updates a CRC8 value by using the next byte passed to this method - * - * @param crc int of crc value - * @param add the next byte to add to the CRC8 calculation - */ - private static byte crc8PushByte(byte crc, byte add) { - crc = (byte) (crc ^ add); - - for (int i = 0; i < 8; i++) { - if ((crc & 0x1) != 0x0) { - // Using a 0xFF bit assures that 0-bits are introduced during the shift operation. - // Otherwise, implicit casts to signed int could shift in 1-bits if the signed bit is 1. - crc = (byte) (((crc & 0xFF) >> 1) ^ 0x8C); - } else { - crc = (byte) ((crc & 0xFF) >> 1); - } - } - return crc; - } - - public static String getStateAsString(Sensor.SensorState state, Context c) { - switch (state) { - case NONE: - return c.getString(R.string.value_none); - case CONNECTING: - return c.getString(R.string.sensor_state_connecting); - case CONNECTED: - return c.getString(R.string.sensor_state_connected); - case DISCONNECTED: - return c.getString(R.string.sensor_state_disconnected); - case SENDING: - return c.getString(R.string.sensor_state_sending); - default: - return ""; - } - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/settings/SensorSettingsActivity.java b/myTracks/src/main/java/com/google/android/apps/mytracks/settings/SensorSettingsActivity.java index 0b6603880..524d049bf 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/settings/SensorSettingsActivity.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/settings/SensorSettingsActivity.java @@ -65,31 +65,33 @@ public class SensorSettingsActivity extends AbstractSettingsActivity { * Configures the bluetooth sensor. */ private void configBluetoothSensor() { - ListPreference preference = (ListPreference) findPreference( - getString(R.string.bluetooth_sensor_key)); - String value = PreferencesUtils.getString( - this, R.string.bluetooth_sensor_key, PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT); - List optionsList = new ArrayList<>(); - List valuesList = new ArrayList<>(); + ListPreference preference = (ListPreference) findPreference(getString(R.string.bluetooth_sensor_key)); + String value = PreferencesUtils.getString(this, R.string.bluetooth_sensor_key, PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT); + List devicesNameList = new ArrayList<>(); + List devicesAddressList = new ArrayList<>(); BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter != null) { - BluetoothDeviceUtils.populateDeviceLists(bluetoothAdapter, optionsList, valuesList); + BluetoothDeviceUtils.populateDeviceLists(bluetoothAdapter, devicesNameList, devicesAddressList); } - if (valuesList.size() == 1) { - if (!valuesList.get(0).equals(value)) { - value = valuesList.get(0); + //TODO Investigate why the settings are also written here? + if (devicesAddressList.size() == 1) { + if (!devicesAddressList.get(0).equals(value)) { + value = devicesAddressList.get(0); PreferencesUtils.setString(this, R.string.bluetooth_sensor_key, value); } } else { - if (!valuesList.contains(value)) { + if (!devicesAddressList.contains(value)) { value = PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT; PreferencesUtils.setString(this, R.string.bluetooth_sensor_key, value); } } - String[] options = optionsList.toArray(new String[0]); - String[] values = valuesList.toArray(new String[0]); + devicesNameList.add(0, getString(R.string.value_none)); + devicesAddressList.add(0, PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT); + + String[] options = devicesNameList.toArray(new String[0]); + String[] values = devicesAddressList.toArray(new String[0]); configureListPreference(preference, options, options, values, value, null); } } diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/util/BluetoothDeviceUtils.java b/myTracks/src/main/java/com/google/android/apps/mytracks/util/BluetoothDeviceUtils.java index ed1631070..f1db3fcb2 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/util/BluetoothDeviceUtils.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/util/BluetoothDeviceUtils.java @@ -39,8 +39,7 @@ public class BluetoothDeviceUtils { * @param deviceNames list of device names * @param deviceAddresses list of device addresses */ - public static void populateDeviceLists( - BluetoothAdapter bluetoothAdapter, List deviceNames, List deviceAddresses) { + public static void populateDeviceLists(BluetoothAdapter bluetoothAdapter, List deviceNames, List deviceAddresses) { // Ensure the bluetooth adapter is not in discovery mode. bluetoothAdapter.cancelDiscovery(); @@ -48,7 +47,7 @@ public class BluetoothDeviceUtils { for (BluetoothDevice device : pairedDevices) { BluetoothClass bluetoothClass = device.getBluetoothClass(); if (bluetoothClass != null) { - // Not really sure what we want, but I know what we don't want. + //TODO Not really sure what we want, but I know what we don't want. switch (bluetoothClass.getMajorDeviceClass()) { case BluetoothClass.Device.Major.COMPUTER: case BluetoothClass.Device.Major.PHONE: