diff --git a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothFactory.java b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothFactory.java index eada0eae..20b5ea66 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothFactory.java +++ b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothFactory.java @@ -17,6 +17,7 @@ package com.health.openscale.core.bluetooth; import android.content.Context; +import android.util.SparseArray; import java.util.Locale; @@ -118,7 +119,7 @@ public class BluetoothFactory { if (deviceName.equals("ADV") || deviceName.equals("Chipsea-BLE")) { return new BluetoothOKOK(context); } - if (deviceName.isEmpty()) { + if (deviceName.equals("NoName OkOk")) { return new BluetoothOKOK2(context); } if (deviceName.equals("BF105") || deviceName.equals("BF720")) { @@ -153,4 +154,11 @@ public class BluetoothFactory { } return null; } + + public static String convertNoNameToDeviceName(SparseArray manufacturerSpecificData) { + String deviceName = null; + deviceName = BluetoothOKOK2.convertNoNameToDeviceName(manufacturerSpecificData); + + return deviceName; + } } diff --git a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothOKOK2.java b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothOKOK2.java index 71a71f99..48d72498 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothOKOK2.java +++ b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothOKOK2.java @@ -15,6 +15,9 @@ */ package com.health.openscale.core.bluetooth; +import static com.health.openscale.core.utils.Converters.WeightUnit.LB; +import static com.health.openscale.core.utils.Converters.WeightUnit.ST; + import android.bluetooth.le.ScanFilter; import android.bluetooth.le.ScanResult; import android.content.Context; @@ -35,9 +38,6 @@ import java.util.List; import timber.log.Timber; -import static com.health.openscale.core.utils.Converters.WeightUnit.LB; -import static com.health.openscale.core.utils.Converters.WeightUnit.ST; - public class BluetoothOKOK2 extends BluetoothCommunication { private static final int IDX_WEIGHT_MSB = 0; private static final int IDX_WEIGHT_LSB = 1; @@ -66,6 +66,21 @@ public class BluetoothOKOK2 extends BluetoothCommunication { central = new BluetoothCentralManager(context, btCallback, new Handler(Looper.getMainLooper())); } + static String convertNoNameToDeviceName(SparseArray manufacturerSpecificData) { + int vendorIndex = -1; + for (int i = 0; i < manufacturerSpecificData.size(); i++) { + int vendorId = manufacturerSpecificData.keyAt(i); + if ((vendorId & 0xff) == 0xc0) { // 0x00c0-->0xffc0 + vendorIndex = vendorId; + } + } + if (vendorIndex == -1) { + return null; + } + + return "NoName OkOk"; + } + private final BluetoothCentralManagerCallback btCallback = new BluetoothCentralManagerCallback() { @Override public void onDiscoveredPeripheral(@NotNull BluetoothPeripheral peripheral, @NotNull ScanResult scanResult) { @@ -157,8 +172,6 @@ public class BluetoothOKOK2 extends BluetoothCommunication { byte[] mask = new byte[13]; mask[IDX_MAC_1] = mask[IDX_MAC_2] = mask[IDX_MAC_3] = mask[IDX_MAC_4] = mask[IDX_MAC_5] = mask[IDX_MAC_6] = (byte) 0xff; - // TODO: verify setAdvertisingDataTypeWithData on API33+ - // b.setAdvertisingDataTypeWithData(ScanRecord.DATA_TYPE_MANUFACTURER_SPECIFIC_DATA, data, mask); for (int i = 0x00; i <= 0xff; i++) { ScanFilter.Builder b = new ScanFilter.Builder(); b.setDeviceAddress(macAddress); diff --git a/android_app/app/src/main/java/com/health/openscale/gui/preferences/BluetoothSettingsFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/preferences/BluetoothSettingsFragment.java index 90cbcad4..8a4ee30a 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/preferences/BluetoothSettingsFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/preferences/BluetoothSettingsFragment.java @@ -322,11 +322,19 @@ public class BluetoothSettingsFragment extends Fragment { return; } - BluetoothDeviceView deviceView = new BluetoothDeviceView(context); - deviceView.setDeviceName(formatDeviceName(bleScanResult.getDevice())); + String deviceName = device.getName(); + if (deviceName == null) { + deviceName = BluetoothFactory.convertNoNameToDeviceName(bleScanResult.getScanRecord().getManufacturerSpecificData()); + } + if (deviceName == null) { + return; + } - String name = device.getName() != null ? device.getName() : ""; - BluetoothCommunication btDevice = BluetoothFactory.createDeviceDriver(context, name); + BluetoothDeviceView deviceView = new BluetoothDeviceView(context); + deviceView.setDeviceName(formatDeviceName(deviceName, device.getAddress())); + deviceView.setAlias(deviceName); + + BluetoothCommunication btDevice = BluetoothFactory.createDeviceDriver(context, deviceName); if (btDevice != null) { Timber.d("Found supported device %s (driver: %s)", formatDeviceName(device), btDevice.driverName()); @@ -394,6 +402,7 @@ public class BluetoothSettingsFragment extends Fragment { private TextView deviceName; private ImageView deviceIcon; private String deviceAddress; + private String deviceAlias; public BluetoothDeviceView(Context context) { super(context); @@ -423,6 +432,14 @@ public class BluetoothSettingsFragment extends Fragment { addView(deviceName); } + public void setAlias(String alias) { + deviceAlias = alias; + } + + public String getAlias() { + return deviceAlias; + } + public void setDeviceAddress(String address) { deviceAddress = address; } @@ -481,10 +498,10 @@ public class BluetoothSettingsFragment extends Fragment { prefs.edit() .putString(PREFERENCE_KEY_BLUETOOTH_HW_ADDRESS, device.getAddress()) - .putString(PREFERENCE_KEY_BLUETOOTH_DEVICE_NAME, device.getName()) + .putString(PREFERENCE_KEY_BLUETOOTH_DEVICE_NAME, getAlias()) .apply(); - Timber.d("Saved Bluetooth device " + device.getName() + " with address " + device.getAddress()); + Timber.d("Saved Bluetooth device " + getAlias() + " with address " + device.getAddress()); stopBluetoothDiscovery();