diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceManager.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceManager.java index 994889316..f9856d4f6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceManager.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceManager.java @@ -27,6 +27,7 @@ import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper; public class DeviceManager { private static final Logger LOG = LoggerFactory.getLogger(DeviceManager.class); + public static final String BLUETOOTH_DEVICE_ACTION_ALIAS_CHANGED = "android.bluetooth.device.action.ALIAS_CHANGED"; /** * Intent action to notify that the list of devices has changed. */ @@ -50,10 +51,16 @@ public class DeviceManager { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); switch (action) { - case ACTION_REFRESH_DEVICELIST: + case ACTION_REFRESH_DEVICELIST: // fall through case BluetoothDevice.ACTION_BOND_STATE_CHANGED: refreshPairedDevices(); break; + case BluetoothDevice.ACTION_NAME_CHANGED: + case BLUETOOTH_DEVICE_ACTION_ALIAS_CHANGED: + BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); + String newName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME); + updateDeviceName(device, newName); + break; case GBDevice.ACTION_DEVICE_CHANGED: GBDevice dev = intent.getParcelableExtra(GBDevice.EXTRA_DEVICE); if (dev.getAddress() != null) { @@ -78,11 +85,28 @@ public class DeviceManager { filterLocal.addAction(GBDevice.ACTION_DEVICE_CHANGED); filterLocal.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); LocalBroadcastManager.getInstance(context).registerReceiver(mReceiver, filterLocal); - context.registerReceiver(mReceiver, new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED)); + + IntentFilter filterGlobal = new IntentFilter(); + filterGlobal.addAction(BluetoothDevice.ACTION_NAME_CHANGED); + filterGlobal.addAction(BLUETOOTH_DEVICE_ACTION_ALIAS_CHANGED); + filterGlobal.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); + context.registerReceiver(mReceiver, filterGlobal); refreshPairedDevices(); } + private void updateDeviceName(BluetoothDevice device, String newName) { + for (GBDevice dev : deviceList) { + if (device.getAddress().equals(dev.getAddress())) { + if (!dev.getName().equals(newName)) { + dev.setName(newName); + notifyDevicesChanged(); + return; + } + } + } + } + private void updateSelectedDevice(GBDevice dev) { if (selectedDevice == null) { selectedDevice = dev; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDevice.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDevice.java index 5297f8e43..53b16cbd2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDevice.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDevice.java @@ -43,7 +43,7 @@ public class GBDevice implements Parcelable { private static final String DEVINFO_HW_VER = "HW: "; private static final String DEVINFO_FW_VER = "FW: "; private static final String DEVINFO_ADDR = "ADDR: "; - private final String mName; + private String mName; private final String mAddress; private final DeviceType mDeviceType; private String mFirmwareVersion; @@ -109,6 +109,14 @@ public class GBDevice implements Parcelable { return mName; } + public void setName(String name) { + if (name == null) { + LOG.warn("Ignoring setting of GBDevice name to null for " + this); + return; + } + mName = name; + } + public String getAddress() { return mAddress; }