diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/BluetoothCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/BluetoothCommunicationService.java
index 44c604f1e..5ed8980fe 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/BluetoothCommunicationService.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/BluetoothCommunicationService.java
@@ -58,6 +58,8 @@ public class BluetoothCommunicationService extends Service {
= "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.install_pebbbleapp";
public static final String ACTION_REBOOT = "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.reboot";
public static final String ACTION_FETCH_ACTIVITY_DATA = "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.fetch_activity_data";
+ public static final String ACTION_DISCONNECT = "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.disconnect";
+
public static final String EXTRA_PERFORM_PAIR = "perform_pair";
private static final Logger LOG = LoggerFactory.getLogger(BluetoothCommunicationService.class);
@@ -76,7 +78,8 @@ public class BluetoothCommunicationService extends Service {
GBDevice device = intent.getParcelableExtra("device");
if (mGBDevice.equals(device)) {
mGBDevice = device;
- GB.setReceiversEnableState(mDeviceSupport.useAutoConnect() || mGBDevice.isConnected(), context);
+ boolean enableReceivers = mDeviceSupport != null && (mDeviceSupport.useAutoConnect() || mGBDevice.isConnected());
+ GB.setReceiversEnableState(enableReceivers, context);
GB.updateNotification(mGBDevice.getName() + " " + mGBDevice.getStateString(), context);
}
}
@@ -200,6 +203,11 @@ public class BluetoothCommunicationService extends Service {
mDeviceSupport.onFetchActivityData();
break;
}
+ case ACTION_DISCONNECT: {
+ mDeviceSupport.dispose();
+ mDeviceSupport = null;
+ break;
+ }
case ACTION_CALLSTATE:
GBCommand command = GBCommand.values()[intent.getIntExtra("call_command", 0)]; // UGLY
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/ControlCenter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/ControlCenter.java
index 9b2ef0b64..9c4dbe62e 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/ControlCenter.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/ControlCenter.java
@@ -160,10 +160,14 @@ public class ControlCenter extends Activity {
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
- getMenuInflater().inflate(
- R.menu.controlcenter_context, menu);
AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) menuInfo;
selectedDevice = deviceList.get(acmi.position);
+ if (selectedDevice != null && selectedDevice.isBusy()) {
+ // no context menu when device is busy
+ return;
+ }
+ getMenuInflater().inflate(
+ R.menu.controlcenter_context, menu);
menu.setHeaderTitle(selectedDevice.getName());
}
@@ -183,6 +187,13 @@ public class ControlCenter extends Activity {
startIntent.setAction(BluetoothCommunicationService.ACTION_FETCH_ACTIVITY_DATA);
startService(startIntent);
}
+ case R.id.controlcenter_disconnect:
+ if (selectedDevice != null) {
+ selectedDevice = null;
+ Intent startIntent = new Intent(this, BluetoothCommunicationService.class);
+ startIntent.setAction(BluetoothCommunicationService.ACTION_DISCONNECT);
+ startService(startIntent);
+ }
default:
return super.onContextItemSelected(item);
}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/btle/BtLEQueue.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/btle/BtLEQueue.java
index 6e6228ba7..fd7e521d9 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/btle/BtLEQueue.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/btle/BtLEQueue.java
@@ -161,6 +161,7 @@ public final class BtLEQueue {
mBluetoothGatt.disconnect();
mBluetoothGatt.close();
mBluetoothGatt = null;
+ setDeviceConnectionState(State.NOT_CONNECTED);
}
}
}
diff --git a/app/src/main/res/menu/controlcenter_context.xml b/app/src/main/res/menu/controlcenter_context.xml
index c27400800..9322d26b7 100644
--- a/app/src/main/res/menu/controlcenter_context.xml
+++ b/app/src/main/res/menu/controlcenter_context.xml
@@ -6,4 +6,7 @@
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 79a44bfc7..56dece173 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -107,5 +107,6 @@
initializing
Fetching Activity Data
Fetch Activity Data
+ Disconnect