diff --git a/src/main/java/de/dennisguse/opentracks/TrackDetailActivity.java b/src/main/java/de/dennisguse/opentracks/TrackDetailActivity.java index 301d69a04..7001510ea 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackDetailActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackDetailActivity.java @@ -54,6 +54,7 @@ import de.dennisguse.opentracks.settings.SettingsActivity; import de.dennisguse.opentracks.util.FileUtils; import de.dennisguse.opentracks.util.IntentUtils; import de.dennisguse.opentracks.util.PreferencesUtils; +import de.dennisguse.opentracks.util.StatsUtils; import de.dennisguse.opentracks.util.TrackIconUtils; import de.dennisguse.opentracks.util.TrackUtils; @@ -120,8 +121,7 @@ public class TrackDetailActivity extends AbstractListActivity implements ChooseA * Note that sharedPreferenceChangeListener cannot be an anonymous inner * class. Anonymous inner class will get garbage collected. */ - private final OnSharedPreferenceChangeListener - sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() { + private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { if (PreferencesUtils.isKey(TrackDetailActivity.this, R.string.recording_track_id_key, key)) { @@ -412,10 +412,16 @@ public class TrackDetailActivity extends AbstractListActivity implements ChooseA /** * Gets the track id. */ + // TODO Seems to be no used. + @Deprecated public long getTrackId() { return trackId; } + private void setBluetoothHeartRateSensorName(String sensorName) { + StatsUtils.setBluetoothHeartRateSensorName(this, sensorName, isRecording()); + } + /** * Handles the data in the intent. */ diff --git a/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothConnectionManager.java b/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothConnectionManager.java index 32578a14c..f928dc529 100644 --- a/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothConnectionManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothConnectionManager.java @@ -21,6 +21,7 @@ import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGattCallback; import android.bluetooth.BluetoothGattCharacteristic; import android.bluetooth.BluetoothGattDescriptor; +import android.bluetooth.BluetoothGattService; import android.bluetooth.BluetoothProfile; import android.content.Context; import android.os.Handler; @@ -45,7 +46,6 @@ public class BluetoothConnectionManager { static final int MESSAGE_READ = 3; static final int MESSAGE_DISCONNECTED = 4; - public static final UUID HEART_RATE_SERVICE_UUID = new UUID(0x180D00001000L, 0x800000805f9b34fbL); private static final UUID HEART_RATE_MEASUREMENT_CHAR_UUID = new UUID(0x2A3700001000L, 0x800000805f9b34fbL); private static final UUID CLIENT_CHARACTERISTIC_CONFIG_UUID = new UUID(0x290200001000L, 0x800000805f9b34fbL); @@ -90,10 +90,18 @@ public class BluetoothConnectionManager { @Override public void onServicesDiscovered(@NonNull BluetoothGatt gatt, int status) { - BluetoothGattCharacteristic characteristic = gatt - .getService(HEART_RATE_SERVICE_UUID) - .getCharacteristic(HEART_RATE_MEASUREMENT_CHAR_UUID); + BluetoothGattService service = gatt.getService(BluetoothUtils.HEART_RATE_SERVICE_UUID); + if (service == null) { + Log.e(TAG, "Could not get heart rate service for " + gatt.getDevice().getAddress()); + return; + } + + BluetoothGattCharacteristic characteristic = service.getCharacteristic(HEART_RATE_MEASUREMENT_CHAR_UUID); + if (characteristic == null) { + Log.e(TAG, "Could not get BluetoothCharacteristic for " + gatt.getDevice().getAddress()); + return; + } gatt.setCharacteristicNotification(characteristic, true); BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG_UUID); diff --git a/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothRemoteSensorManager.java b/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothRemoteSensorManager.java index 5f9a1b94a..d7e7b1d21 100644 --- a/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothRemoteSensorManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothRemoteSensorManager.java @@ -86,7 +86,7 @@ public class BluetoothRemoteSensorManager { @Override public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { if (bluetoothConnectionManager != null && PreferencesUtils.isKey(context, R.string.settings_sensor_bluetooth_heart_rate_key, key)) { - String address = PreferencesUtils.getString(context, R.string.settings_sensor_bluetooth_heart_rate_key, PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT); + String address = PreferencesUtils.getBluetoothHeartRateSensorAddress(context); if (address.equals(PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT)) { stop(); return; @@ -145,7 +145,8 @@ public class BluetoothRemoteSensorManager { return; } - String address = PreferencesUtils.getString(context, R.string.settings_sensor_bluetooth_heart_rate_key, PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT); +// String address = PreferencesUtils.getString(context, R.string.settings_sensor_bluetooth_heart_rate_key, PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT); + String address = PreferencesUtils.getBluetoothHeartRateSensorAddress(context); if (PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT.equals(address)) { Log.w(TAG, "No bluetooth address."); return; diff --git a/src/main/java/de/dennisguse/opentracks/settings/BluetoothLeListPreference.java b/src/main/java/de/dennisguse/opentracks/settings/BluetoothLePreference.java similarity index 83% rename from src/main/java/de/dennisguse/opentracks/settings/BluetoothLeListPreference.java rename to src/main/java/de/dennisguse/opentracks/settings/BluetoothLePreference.java index cd5413be9..49d2c56eb 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/BluetoothLeListPreference.java +++ b/src/main/java/de/dennisguse/opentracks/settings/BluetoothLePreference.java @@ -23,30 +23,29 @@ import java.util.ArrayList; import java.util.List; import de.dennisguse.opentracks.R; -import de.dennisguse.opentracks.services.sensors.BluetoothConnectionManager; import de.dennisguse.opentracks.util.BluetoothUtils; /** * Preference to select a discoverable Bluetooth LE device. * Based upon ListPreference. */ -public class BluetoothLeListPreference extends DialogPreference { +public class BluetoothLePreference extends DialogPreference { - private final static String TAG = BluetoothLeListPreference.class.getSimpleName(); + private final static String TAG = BluetoothLePreference.class.getSimpleName(); - public BluetoothLeListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + public BluetoothLePreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } - public BluetoothLeListPreference(Context context, AttributeSet attrs, int defStyleAttr) { + public BluetoothLePreference(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } - public BluetoothLeListPreference(Context context, AttributeSet attrs) { + public BluetoothLePreference(Context context, AttributeSet attrs) { super(context, attrs); } - public BluetoothLeListPreference(Context context) { + public BluetoothLePreference(Context context) { super(context); } @@ -79,7 +78,7 @@ public class BluetoothLeListPreference extends DialogPreference { return getValue(); } - public static class BluetoothLeListPreferenceDialog extends PreferenceDialogFragmentCompat { + public static class BluetoothLePreferenceDialog extends PreferenceDialogFragmentCompat { private int selectedEntryIndex; private BluetoothLeAdapter listAdapter = new BluetoothLeAdapter(); @@ -110,8 +109,8 @@ public class BluetoothLeListPreference extends DialogPreference { } }; - static BluetoothLeListPreferenceDialog newInstance(String key) { - final BluetoothLeListPreferenceDialog fragment = new BluetoothLeListPreferenceDialog(); + static BluetoothLePreferenceDialog newInstance(String key) { + final BluetoothLePreferenceDialog fragment = new BluetoothLePreferenceDialog(); final Bundle b = new Bundle(1); b.putString(ARG_KEY, key); fragment.setArguments(b); @@ -146,14 +145,14 @@ public class BluetoothLeListPreference extends DialogPreference { listAdapter.add(getContext().getString(R.string.value_none), deviceNone); selectedEntryIndex = 0; - BluetoothLeListPreference preference = (BluetoothLeListPreference) getPreference(); + BluetoothLePreference preference = (BluetoothLePreference) getPreference(); String deviceSelected = preference.getValue(); if (!deviceNone.equals(deviceSelected)) { listAdapter.add(preference.getValue(), preference.getValue()); selectedEntryIndex = 1; } - ScanFilter.Builder scanFilterBuilder = new ScanFilter.Builder().setServiceUuid(new ParcelUuid(BluetoothConnectionManager.HEART_RATE_SERVICE_UUID)); + ScanFilter.Builder scanFilterBuilder = new ScanFilter.Builder().setServiceUuid(new ParcelUuid(BluetoothUtils.HEART_RATE_SERVICE_UUID)); List scanFilter = new ArrayList<>(); scanFilter.add(scanFilterBuilder.build()); @@ -174,7 +173,7 @@ public class BluetoothLeListPreference extends DialogPreference { public void onClick(DialogInterface dialog, int which) { selectedEntryIndex = which; - BluetoothLeListPreferenceDialog.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE); + BluetoothLePreferenceDialog.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE); dialog.dismiss(); } }); @@ -190,7 +189,7 @@ public class BluetoothLeListPreference extends DialogPreference { if (positiveResult && selectedEntryIndex >= 0) { String value = listAdapter.get(selectedEntryIndex).getAddress(); - BluetoothLeListPreference preference = (BluetoothLeListPreference) getPreference(); + BluetoothLePreference preference = (BluetoothLePreference) getPreference(); if (preference.callChangeListener(value)) { preference.setValue(value); } diff --git a/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java b/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java index b8a9fb6c3..ad10f8b4f 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java +++ b/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java @@ -124,8 +124,8 @@ public class SettingsActivity extends AppCompatActivity implements ChooseActivit } else if (preference instanceof ActivityTypePreference) { activityPreferenceDialog = ActivityTypePreference.ActivityPreferenceDialog.newInstance(preference.getKey()); dialogFragment = activityPreferenceDialog; - } else if (preference instanceof BluetoothLeListPreference) { - dialogFragment = BluetoothLeListPreference.BluetoothLeListPreferenceDialog.newInstance(preference.getKey()); + } else if (preference instanceof BluetoothLePreference) { + dialogFragment = BluetoothLePreference.BluetoothLePreferenceDialog.newInstance(preference.getKey()); } if (dialogFragment != null) { @@ -157,7 +157,7 @@ public class SettingsActivity extends AppCompatActivity implements ChooseActivit private void updateBluetooth() { // Disable Bluetooth preference if device does not have Bluetooth - BluetoothLeListPreference bluetoothPreference = findPreference(getString(R.string.settings_sensor_bluetooth_heart_rate_key)); + BluetoothLePreference bluetoothPreference = findPreference(getString(R.string.settings_sensor_bluetooth_heart_rate_key)); bluetoothPreference.setVisible(BluetoothUtils.hasBluetooth(TAG)); } diff --git a/src/main/java/de/dennisguse/opentracks/util/BluetoothUtils.java b/src/main/java/de/dennisguse/opentracks/util/BluetoothUtils.java index 081a2df64..ab7897be6 100644 --- a/src/main/java/de/dennisguse/opentracks/util/BluetoothUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/BluetoothUtils.java @@ -22,6 +22,7 @@ import android.os.Looper; import android.util.Log; import java.util.ArrayList; +import java.util.UUID; /** * Utilities for dealing with bluetooth devices. @@ -30,6 +31,8 @@ import java.util.ArrayList; */ public class BluetoothUtils { + public static final UUID HEART_RATE_SERVICE_UUID = new UUID(0x180D00001000L, 0x800000805f9b34fbL); + private BluetoothUtils() { } diff --git a/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java b/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java index 307da1743..69d5c833b 100644 --- a/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java @@ -251,6 +251,13 @@ public class PreferencesUtils { PreferencesUtils.setBoolean(context, R.string.recording_track_paused_key, RECORDING_TRACK_PAUSED); } + public static boolean isBluetoothHeartRateSensorAddressDefault(Context context) { + return PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT.equals(getBluetoothHeartRateSensorAddress(context)); + } + + public static String getBluetoothHeartRateSensorAddress(Context context) { + return PreferencesUtils.getString(context, R.string.settings_sensor_bluetooth_heart_rate_key, PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT); + } public static boolean isChartByDistance(Context context) { final String CHART_X_AXIS_DEFAULT = context.getString(R.string.chart_x_axis_default); diff --git a/src/main/java/de/dennisguse/opentracks/util/StatsUtils.java b/src/main/java/de/dennisguse/opentracks/util/StatsUtils.java index 3d9de4318..f1a5dd608 100644 --- a/src/main/java/de/dennisguse/opentracks/util/StatsUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/StatsUtils.java @@ -108,7 +108,7 @@ public class StatsUtils { public static void setSensorData(Activity activity, SensorDataSet sensorDataSet, boolean isRecording) { // heart rate int isVisible = View.VISIBLE; - if (!isRecording || PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT.equals(PreferencesUtils.getString(activity, R.string.settings_sensor_bluetooth_heart_rate_key, PreferencesUtils.BLUETOOTH_SENSOR_DEFAULT))) { + if (!isRecording || PreferencesUtils.isBluetoothHeartRateSensorAddressDefault(activity)) { isVisible = View.INVISIBLE; } activity.findViewById(R.id.stats_sensor_container).setVisibility(isVisible); @@ -125,11 +125,18 @@ public class StatsUtils { } } - heartRateValue.setText(heartRate); + setBluetoothHeartRateSensorName(activity, sensor, isRecording); heartRateSensor.setText(sensor); } } + public static void setBluetoothHeartRateSensorName(Activity activity, String sensorName, boolean isRecording) { + if (isRecording) { + TextView heartRateSensor = activity.findViewById(R.id.stats_sensor_heart_rate_sensor_value); + heartRateSensor.setText(sensorName); + } + } + /** * Sets the total time value. * diff --git a/src/main/res/xml/settings.xml b/src/main/res/xml/settings.xml index 6e9eacd32..332f9dd38 100644 --- a/src/main/res/xml/settings.xml +++ b/src/main/res/xml/settings.xml @@ -130,7 +130,7 @@ limitations under the License. -