diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/BluetoothCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/BluetoothCommunicationService.java index 7499413a2..1a620c50b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/BluetoothCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/BluetoothCommunicationService.java @@ -46,6 +46,8 @@ public class BluetoothCommunicationService extends Service { = "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.settime"; public static final String ACTION_SETMUSICINFO = "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.setmusicinfo"; + public static final String ACTION_REQUEST_VERSIONINFO + = "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.request_versioninfo"; private static final String TAG = "BluetoothCommunicationService"; private static final int NOTIFICATION_ID = 1; private BluetoothAdapter mBtAdapter = null; @@ -53,6 +55,7 @@ public class BluetoothCommunicationService extends Service { private BtSocketIoThread mBtSocketIoThread = null; private boolean mStarted = false; + private String mBtDeviceAddress; private void setReceiversEnableState(boolean enable) { final Class[] receiverClasses = { @@ -119,16 +122,22 @@ public class BluetoothCommunicationService extends Service { switch (cmdBundle.commandClass) { case MUSIC_CONTROL: Log.i(TAG, "Got command for MUSIC_CONTROL"); - Intent musicintent = new Intent(GBMusicControlReceiver.ACTION_MUSICCONTROL); - musicintent.putExtra("command", cmdBundle.command.ordinal()); - sendBroadcast(musicintent); + Intent musicIntent = new Intent(GBMusicControlReceiver.ACTION_MUSICCONTROL); + musicIntent.putExtra("command", cmdBundle.command.ordinal()); + sendBroadcast(musicIntent); break; case CALL_CONTROL: Log.i(TAG, "Got command for CALL_CONTROL"); - Intent callintent = new Intent(GBCallControlReceiver.ACTION_CALLCONTROL); - callintent.putExtra("command", cmdBundle.command.ordinal()); - sendBroadcast(callintent); + Intent callIntent = new Intent(GBCallControlReceiver.ACTION_CALLCONTROL); + callIntent.putExtra("command", cmdBundle.command.ordinal()); + sendBroadcast(callIntent); break; + case VERSION_INFO: + Log.i(TAG, "Got command for VERSION INFO"); + Intent versionIntent = new Intent(ControlCenter.ACTION_SET_VERSION); + versionIntent.putExtra("device_address", mBtDeviceAddress); + versionIntent.putExtra("firmware_version", cmdBundle.info); + sendBroadcast(versionIntent); default: break; } @@ -167,11 +176,11 @@ public class BluetoothCommunicationService extends Service { } else if (!mBtAdapter.isEnabled()) { Toast.makeText(this, "Bluetooth is disabled.", Toast.LENGTH_SHORT).show(); } else { - String btDeviceAddress = intent.getStringExtra("device_address"); + mBtDeviceAddress = intent.getStringExtra("device_address"); SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); - sharedPrefs.edit().putString("last_device_address", btDeviceAddress).commit(); + sharedPrefs.edit().putString("last_device_address", mBtDeviceAddress).commit(); - if (btDeviceAddress != null && (mBtSocket == null || !mBtSocket.isConnected())) { + if (mBtDeviceAddress != null && (mBtSocket == null || !mBtSocket.isConnected())) { // currently only one thread allowed if (mBtSocketIoThread != null) { mBtSocketIoThread.quit(); @@ -181,7 +190,7 @@ public class BluetoothCommunicationService extends Service { e.printStackTrace(); } } - mBtSocketIoThread = new BtSocketIoThread(btDeviceAddress); + mBtSocketIoThread = new BtSocketIoThread(mBtDeviceAddress); mBtSocketIoThread.start(); } } @@ -220,6 +229,9 @@ public class BluetoothCommunicationService extends Service { String track = intent.getStringExtra("music_track"); byte[] msg = PebbleProtocol.encodeSetMusicInfo(artist, album, track); mBtSocketIoThread.write(msg); + } else if (intent.getAction().equals(ACTION_REQUEST_VERSIONINFO)) { + byte[] msg = PebbleProtocol.encodeFirmwareVersionReq(); + mBtSocketIoThread.write(msg); } else if (intent.getAction().equals(ACTION_START)) { startForeground(NOTIFICATION_ID, createNotification("Gadgetbridge running")); mStarted = true; @@ -350,6 +362,7 @@ public class BluetoothCommunicationService extends Service { if (length == 1 && endpoint == PebbleProtocol.ENDPOINT_PHONEVERSION) { Log.i(TAG, "Pebble asked for Phone/App Version - repLYING!"); write(PebbleProtocol.encodePhoneVersion(PebbleProtocol.PHONEVERSION_REMOTE_OS_ANDROID)); + write(PebbleProtocol.encodeFirmwareVersionReq()); } else if (endpoint != PebbleProtocol.ENDPOINT_DATALOG) { GBCommandBundle cmdBundle = PebbleProtocol.decodeResponse(buffer); if (cmdBundle == null) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/ControlCenter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/ControlCenter.java index 295a61d2e..8cf0c00c4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/ControlCenter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/ControlCenter.java @@ -1,7 +1,6 @@ package nodomain.freeyourgadget.gadgetbridge; import android.app.Activity; -import android.app.NotificationManager; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; @@ -11,7 +10,6 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; -import android.support.v4.app.NotificationCompat; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -31,6 +29,9 @@ public class ControlCenter extends Activity { public static final String ACTION_QUIT = "nodomain.freeyourgadget.gadgetbride.controlcenter.action.quit"; + public static final String ACTION_SET_VERSION + = "nodomain.freeyourgadget.gadgetbride.controlcenter.action.set_version"; + ListView deviceListView; GBDeviceAdapter mGBDeviceAdapter; final List deviceList = new ArrayList<>(); @@ -38,8 +39,20 @@ public class ControlCenter extends Activity { private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals(ACTION_QUIT)) { + String action = intent.getAction(); + if (action.equals(ACTION_QUIT)) { finish(); + } else if (action.equals(ACTION_SET_VERSION)) { + String deviceAddress = intent.getStringExtra("device_address"); + String firmwareVersion = intent.getStringExtra("firmware_version"); + + for (GBDevice device : deviceList) { + if (device.getAddress().equals(deviceAddress)) { + device.setFirmwareVersion(firmwareVersion); + mGBDeviceAdapter.notifyDataSetChanged(); + break; + } + } } } }; @@ -63,7 +76,10 @@ public class ControlCenter extends Activity { } }); - registerReceiver(mReceiver, new IntentFilter(ACTION_QUIT)); + IntentFilter filter = new IntentFilter(); + filter.addAction(ACTION_QUIT); + filter.addAction(ACTION_SET_VERSION); + registerReceiver(mReceiver, filter); BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter(); if (btAdapter == null) { @@ -89,21 +105,13 @@ public class ControlCenter extends Activity { Intent enableIntent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); startActivity(enableIntent); } - Intent startIntent = new Intent(ControlCenter.this, BluetoothCommunicationService.class); + Intent startIntent = new Intent(this, BluetoothCommunicationService.class); startIntent.setAction(BluetoothCommunicationService.ACTION_START); startService(startIntent); - } - - private void testNotification() { - NotificationManager nManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); - NotificationCompat.Builder ncomp = new NotificationCompat.Builder(this); - ncomp.setContentTitle("Test Notification"); - ncomp.setContentText("This is a Test Notification from Gadgetbridge"); - ncomp.setTicker("This is a Test Notification from Gadgetbridge"); - ncomp.setSmallIcon(R.drawable.ic_launcher); - ncomp.setAutoCancel(true); - nManager.notify((int) System.currentTimeMillis(), ncomp.build()); + Intent versionInfoIntent = new Intent(this, BluetoothCommunicationService.class); + versionInfoIntent.setAction(BluetoothCommunicationService.ACTION_REQUEST_VERSIONINFO); + startService(versionInfoIntent); } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBCommand.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBCommand.java index e299c77cd..9241d75ed 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBCommand.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBCommand.java @@ -16,4 +16,6 @@ public enum GBCommand { MUSIC_PLAYPAUSE, MUSIC_NEXT, MUSIC_PREVIOUS, + + VERSION_FIRMWARE } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBCommandBundle.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBCommandBundle.java index 73d4597d0..f63f79c78 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBCommandBundle.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBCommandBundle.java @@ -4,4 +4,5 @@ package nodomain.freeyourgadget.gadgetbridge; public class GBCommandBundle { public GBCommandClass commandClass; public GBCommand command; + public String info; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBCommandClass.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBCommandClass.java index 60692a904..0fd5aeebf 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBCommandClass.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBCommandClass.java @@ -2,5 +2,6 @@ package nodomain.freeyourgadget.gadgetbridge; public enum GBCommandClass { MUSIC_CONTROL, - CALL_CONTROL + CALL_CONTROL, + VERSION_INFO } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBDevice.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBDevice.java index 3d9f2ab27..3c526bf76 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBDevice.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBDevice.java @@ -1,14 +1,20 @@ package nodomain.freeyourgadget.gadgetbridge; public class GBDevice { + private boolean isConnected = false; private final String name; private final String address; + private String firmwareVersion; public GBDevice(String address, String name) { this.address = address; this.name = name; } + public void setFirmwareVersion(String firmwareVersion) { + this.firmwareVersion = firmwareVersion; + } + public String getName() { return name; } @@ -18,6 +24,10 @@ public class GBDevice { } public String getStatus() { - return ""; + if (firmwareVersion != null) { + return "Firmware Version: " + firmwareVersion; + } else { + return null; + } } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/PebbleProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/PebbleProtocol.java index d8f7c8631..c1eadd93d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/PebbleProtocol.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/PebbleProtocol.java @@ -94,14 +94,15 @@ public class PebbleProtocol { static byte[] encodeMessage(short endpoint, byte type, int cookie, String[] parts) { // Calculate length first int length = LENGTH_PREFIX + 1; - for (String s : parts) { - if (s == null || s.equals("")) { - length++; // encode null or empty strings as 0x00 later - continue; + if (parts != null) { + for (String s : parts) { + if (s == null || s.equals("")) { + length++; // encode null or empty strings as 0x00 later + continue; + } + length += (1 + s.getBytes().length); } - length += (1 + s.getBytes().length); } - if (endpoint == ENDPOINT_PHONECONTROL) { length += 4; //for cookie; } @@ -117,19 +118,20 @@ public class PebbleProtocol { buf.putInt(cookie); } // Encode Pascal-Style Strings - for (String s : parts) { - if (s == null || s.equals("")) { - //buf.put((byte)0x01); - buf.put((byte) 0x00); - continue; + if (parts != null) { + for (String s : parts) { + if (s == null || s.equals("")) { + //buf.put((byte)0x01); + buf.put((byte) 0x00); + continue; + } + + int partlength = s.getBytes().length; + if (partlength > 255) partlength = 255; + buf.put((byte) partlength); + buf.put(s.getBytes(), 0, partlength); } - - int partlength = s.getBytes().length; - if (partlength > 255) partlength = 255; - buf.put((byte) partlength); - buf.put(s.getBytes(), 0, partlength); } - return buf.array(); } @@ -204,6 +206,10 @@ public class PebbleProtocol { return encodeMessage(ENDPOINT_MUSICCONTROL, MUSICCONTROL_SETMUSICINFO, 0, parts); } + public static byte[] encodeFirmwareVersionReq() { + return encodeMessage(ENDPOINT_FIRMWAREVERSION, (byte) 0, 0, null); + } + public static byte[] encodePhoneVersion(byte os) { ByteBuffer buf = ByteBuffer.allocate(LENGTH_PHONEVERSION); buf.order(ByteOrder.BIG_ENDIAN); @@ -270,6 +276,16 @@ public class PebbleProtocol { break; } break; + case ENDPOINT_FIRMWAREVERSION: + int version = buf.getInt(); + byte[] versionString = new byte[32]; + buf.get(versionString, 0, 32); + + cmd.commandClass = GBCommandClass.VERSION_INFO; + cmd.command = GBCommand.VERSION_FIRMWARE; + cmd.info = new String(versionString).trim(); + Log.i(TAG, "Got firmware version: " + cmd.info); + break; default: return null; }