From ed2e177fcb706d2a8ce3db453c0dc185d5a43854 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Wed, 1 Apr 2015 18:34:52 +0200 Subject: [PATCH] Remove direct PebbleProtocol usage. Add GBDeviceProtocol as a base class for all protocols. Also add a empty MibandProtocol --- .../BluetoothCommunicationService.java | 65 ++++++++++--------- .../gadgetbridge/ControlCenter.java | 3 +- .../protocol/GBDeviceProtocol.java | 46 +++++++++++++ .../gadgetbridge/protocol/MibandProtocol.java | 5 ++ .../gadgetbridge/protocol/PebbleProtocol.java | 22 +++---- app/src/main/res/values/styles.xml~ | 8 --- 6 files changed, 99 insertions(+), 50 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/protocol/GBDeviceProtocol.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/protocol/MibandProtocol.java delete mode 100644 app/src/main/res/values/styles.xml~ diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/BluetoothCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/BluetoothCommunicationService.java index 1514dfb54..6f49f5f3f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/BluetoothCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/BluetoothCommunicationService.java @@ -36,6 +36,8 @@ import nodomain.freeyourgadget.gadgetbridge.protocol.GBDeviceCommandAppManagemen import nodomain.freeyourgadget.gadgetbridge.protocol.GBDeviceCommandCallControl; import nodomain.freeyourgadget.gadgetbridge.protocol.GBDeviceCommandMusicControl; import nodomain.freeyourgadget.gadgetbridge.protocol.GBDeviceCommandVersionInfo; +import nodomain.freeyourgadget.gadgetbridge.protocol.GBDeviceProtocol; +import nodomain.freeyourgadget.gadgetbridge.protocol.MibandProtocol; import nodomain.freeyourgadget.gadgetbridge.protocol.PebbleProtocol; public class BluetoothCommunicationService extends Service { @@ -70,7 +72,8 @@ public class BluetoothCommunicationService extends Service { private boolean mStarted = false; - private GBDevice gbdevice = null; + private GBDevice mGBDevice = null; + private GBDeviceProtocol mGBDeviceProtocol = null; private void setReceiversEnableState(boolean enable) { final Class[] receiverClasses = { @@ -148,11 +151,11 @@ public class BluetoothCommunicationService extends Service { break; case VERSION_INFO: Log.i(TAG, "Got command for VERSION_INFO"); - if (gbdevice == null) { + if (mGBDevice == null) { return; } GBDeviceCommandVersionInfo infoCmd = (GBDeviceCommandVersionInfo) deviceCmd; - gbdevice.setFirmwareVersion(infoCmd.fwVersion); + mGBDevice.setFirmwareVersion(infoCmd.fwVersion); sendDeviceUpdateIntent(); break; case APP_INFO: @@ -180,7 +183,7 @@ public class BluetoothCommunicationService extends Service { break; case SUCCESS: // refresh app list - mBtSocketIoThread.write(PebbleProtocol.encodeAppInfoReq()); + mBtSocketIoThread.write(mGBDeviceProtocol.encodeAppInfoReq()); break; default: break; @@ -196,9 +199,9 @@ public class BluetoothCommunicationService extends Service { private void sendDeviceUpdateIntent() { Intent deviceUpdateIntent = new Intent(ControlCenter.ACTION_REFRESH_DEVICELIST); - deviceUpdateIntent.putExtra("device_address", gbdevice.getAddress()); - deviceUpdateIntent.putExtra("device_state", gbdevice.getState().ordinal()); - deviceUpdateIntent.putExtra("firmware_version", gbdevice.getFirmwareVersion()); + deviceUpdateIntent.putExtra("device_address", mGBDevice.getAddress()); + deviceUpdateIntent.putExtra("device_state", mGBDevice.getState().ordinal()); + deviceUpdateIntent.putExtra("firmware_version", mGBDevice.getFirmwareVersion()); LocalBroadcastManager.getInstance(this).sendBroadcast(deviceUpdateIntent); } @@ -255,34 +258,38 @@ public class BluetoothCommunicationService extends Service { GBDevice.Type deviceType = GBDevice.Type.UNKNOWN; if (btDevice.getName().indexOf("Pebble") == 0) { deviceType = GBDevice.Type.PEBBLE; + mGBDeviceProtocol = new PebbleProtocol(); } else if (btDevice.getName().equals("MI")) { deviceType = GBDevice.Type.MIBAND; + mGBDeviceProtocol = new MibandProtocol(); } - gbdevice = new GBDevice(btDeviceAddress, btDevice.getName(), deviceType); - gbdevice.setState(GBDevice.State.CONNECTING); - sendDeviceUpdateIntent(); + if (mGBDeviceProtocol != null ) { + mGBDevice = new GBDevice(btDeviceAddress, btDevice.getName(), deviceType); + mGBDevice.setState(GBDevice.State.CONNECTING); + sendDeviceUpdateIntent(); - mBtSocketIoThread = new BtSocketIoThread(btDeviceAddress); - mBtSocketIoThread.start(); + mBtSocketIoThread = new BtSocketIoThread(btDeviceAddress); + mBtSocketIoThread.start(); + } } } } } else if (action.equals(ACTION_NOTIFICATION_GENERIC)) { String title = intent.getStringExtra("notification_title"); String body = intent.getStringExtra("notification_body"); - byte[] msg = PebbleProtocol.encodeSMS(title, body); + byte[] msg = mGBDeviceProtocol.encodeSMS(title, body); mBtSocketIoThread.write(msg); } else if (action.equals(ACTION_NOTIFICATION_SMS)) { String sender = intent.getStringExtra("notification_sender"); String body = intent.getStringExtra("notification_body"); String senderName = getContactDisplayNameByNumber(sender); - byte[] msg = PebbleProtocol.encodeSMS(senderName, body); + byte[] msg = mGBDeviceProtocol.encodeSMS(senderName, body); mBtSocketIoThread.write(msg); } else if (action.equals(ACTION_NOTIFICATION_EMAIL)) { String sender = intent.getStringExtra("notification_sender"); String subject = intent.getStringExtra("notification_subject"); String body = intent.getStringExtra("notification_body"); - byte[] msg = PebbleProtocol.encodeEmail(sender, subject, body); + byte[] msg = mGBDeviceProtocol.encodeEmail(sender, subject, body); mBtSocketIoThread.write(msg); } else if (action.equals(ACTION_CALLSTATE)) { GBCommand command = GBCommand.values()[intent.getIntExtra("call_command", 0)]; // UGLY @@ -291,30 +298,30 @@ public class BluetoothCommunicationService extends Service { if (phoneNumber != null) { callerName = getContactDisplayNameByNumber(phoneNumber); } - byte[] msg = PebbleProtocol.encodeSetCallState(phoneNumber, callerName, command); + byte[] msg = mGBDeviceProtocol.encodeSetCallState(phoneNumber, callerName, command); mBtSocketIoThread.write(msg); } else if (action.equals(ACTION_SETTIME)) { - byte[] msg = PebbleProtocol.encodeSetTime(-1); + byte[] msg = mGBDeviceProtocol.encodeSetTime(-1); mBtSocketIoThread.write(msg); } else if (action.equals(ACTION_SETMUSICINFO)) { String artist = intent.getStringExtra("music_artist"); String album = intent.getStringExtra("music_album"); String track = intent.getStringExtra("music_track"); - byte[] msg = PebbleProtocol.encodeSetMusicInfo(artist, album, track); + byte[] msg = mGBDeviceProtocol.encodeSetMusicInfo(artist, album, track); mBtSocketIoThread.write(msg); } else if (action.equals(ACTION_REQUEST_VERSIONINFO)) { - if (gbdevice != null && gbdevice.getFirmwareVersion() == null) { - byte[] msg = PebbleProtocol.encodeFirmwareVersionReq(); + if (mGBDevice != null && mGBDevice.getFirmwareVersion() == null) { + byte[] msg = mGBDeviceProtocol.encodeFirmwareVersionReq(); mBtSocketIoThread.write(msg); } else { sendDeviceUpdateIntent(); } } else if (action.equals(ACTION_REQUEST_APPINFO)) { - mBtSocketIoThread.write(PebbleProtocol.encodeAppInfoReq()); + mBtSocketIoThread.write(mGBDeviceProtocol.encodeAppInfoReq()); } else if (action.equals(ACTION_DELETEAPP)) { int id = intent.getIntExtra("app_id", -1); int index = intent.getIntExtra("app_index", -1); - mBtSocketIoThread.write(PebbleProtocol.encodeAppDelete(id, index)); + mBtSocketIoThread.write(mGBDeviceProtocol.encodeAppDelete(id, index)); } else if (action.equals(ACTION_START)) { startForeground(NOTIFICATION_ID, createNotification("Gadgetbridge running")); mStarted = true; @@ -400,7 +407,7 @@ public class BluetoothCommunicationService extends Service { mBtSocket = null; return false; } - gbdevice.setState(GBDevice.State.CONNECTED); + mGBDevice.setState(GBDevice.State.CONNECTED); sendDeviceUpdateIntent(); updateNotification("connected to " + btDevice.getName()); @@ -447,17 +454,17 @@ 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()); + write(mGBDeviceProtocol.encodePhoneVersion(PebbleProtocol.PHONEVERSION_REMOTE_OS_ANDROID)); + write(mGBDeviceProtocol.encodeFirmwareVersionReq()); // this does not really belong here, but since the pebble only asks for our version once it should do the job SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(BluetoothCommunicationService.this); if (sharedPrefs.getBoolean("datetime_synconconnect", true)) { Log.i(TAG, "syncing time"); - write(PebbleProtocol.encodeSetTime(-1)); + write(mGBDeviceProtocol.encodeSetTime(-1)); } } else if (endpoint != PebbleProtocol.ENDPOINT_DATALOG) { - GBDeviceCommand deviceCmd = PebbleProtocol.decodeResponse(buffer); + GBDeviceCommand deviceCmd = mGBDeviceProtocol.decodeResponse(buffer); if (deviceCmd == null) { Log.i(TAG, "unhandled message to endpoint " + endpoint + " (" + bytes + " bytes)"); } else { @@ -471,7 +478,7 @@ public class BluetoothCommunicationService extends Service { } } catch (IOException e) { if (e.getMessage().contains("socket closed")) { //FIXME: this does not feel right - gbdevice.setState(GBDevice.State.CONNECTING); + mGBDevice.setState(GBDevice.State.CONNECTING); sendDeviceUpdateIntent(); updateNotification("connection lost, trying to reconnect"); @@ -501,7 +508,7 @@ public class BluetoothCommunicationService extends Service { } mBtSocket = null; updateNotification("not connected"); - gbdevice.setState(GBDevice.State.NOT_CONNECTED); + mGBDevice.setState(GBDevice.State.NOT_CONNECTED); sendDeviceUpdateIntent(); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/ControlCenter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/ControlCenter.java index d47be4c21..daa65f72d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/ControlCenter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/ControlCenter.java @@ -176,8 +176,7 @@ public class ControlCenter extends Activity { deviceType = GBDevice.Type.PEBBLE; } else if (device.getName().equals("MI")) { deviceType = GBDevice.Type.MIBAND; - } - else { + } else { continue; } deviceList.add(new GBDevice(device.getAddress(), device.getName(), deviceType)); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/protocol/GBDeviceProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/protocol/GBDeviceProtocol.java new file mode 100644 index 000000000..6a9bb9777 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/protocol/GBDeviceProtocol.java @@ -0,0 +1,46 @@ +package nodomain.freeyourgadget.gadgetbridge.protocol; + +import nodomain.freeyourgadget.gadgetbridge.GBCommand; + +public abstract class GBDeviceProtocol { + + public byte[] encodeSMS(String from, String body) { + return null; + } + + public byte[] encodeEmail(String from, String subject, String body) { + return null; + } + + public byte[] encodeSetTime(long ts) { + return null; + } + + public byte[] encodeSetCallState(String number, String name, GBCommand command) { + return null; + } + + public byte[] encodeSetMusicInfo(String artist, String album, String track) { + return null; + } + + public byte[] encodeFirmwareVersionReq() { + return null; + } + + public byte[] encodeAppInfoReq() { + return null; + } + + public byte[] encodeAppDelete(int id, int index) { + return null; + } + + public byte[] encodePhoneVersion(byte os) { + return null; + } + + public GBDeviceCommand decodeResponse(byte[] responseData) { + return null; + } +} \ No newline at end of file diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/protocol/MibandProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/protocol/MibandProtocol.java new file mode 100644 index 000000000..380f9d776 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/protocol/MibandProtocol.java @@ -0,0 +1,5 @@ +package nodomain.freeyourgadget.gadgetbridge.protocol; + +public class MibandProtocol extends GBDeviceProtocol { + /* implement methonds from GBDeviceProtocol here which make sense on the MiBand*/ +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/protocol/PebbleProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/protocol/PebbleProtocol.java index 2cec28d30..ebc9d3c99 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/protocol/PebbleProtocol.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/protocol/PebbleProtocol.java @@ -10,7 +10,7 @@ import java.util.TimeZone; import nodomain.freeyourgadget.gadgetbridge.GBCommand; import nodomain.freeyourgadget.gadgetbridge.GBDeviceApp; -public class PebbleProtocol { +public class PebbleProtocol extends GBDeviceProtocol { static private String TAG = "PebbleProtocol"; @@ -148,7 +148,7 @@ public class PebbleProtocol { return buf.array(); } - public static byte[] encodeSMS(String from, String body) { + public byte[] encodeSMS(String from, String body) { Long ts = System.currentTimeMillis() / 1000; TimeZone tz = SimpleTimeZone.getDefault(); ts += (tz.getOffset(ts) + tz.getDSTSavings()) / 1000; @@ -158,7 +158,7 @@ public class PebbleProtocol { return encodeMessage(ENDPOINT_NOTIFICATION, NOTIFICATION_SMS, 0, parts); } - public static byte[] encodeEmail(String from, String subject, String body) { + public byte[] encodeEmail(String from, String subject, String body) { Long ts = System.currentTimeMillis() / 1000; TimeZone tz = SimpleTimeZone.getDefault(); ts += (tz.getOffset(ts) + tz.getDSTSavings()) / 1000; @@ -168,7 +168,7 @@ public class PebbleProtocol { return encodeMessage(ENDPOINT_NOTIFICATION, NOTIFICATION_EMAIL, 0, parts); } - public static byte[] encodeSetTime(long ts) { + public byte[] encodeSetTime(long ts) { if (ts == -1) { ts = System.currentTimeMillis() / 1000; TimeZone tz = SimpleTimeZone.getDefault(); @@ -184,7 +184,7 @@ public class PebbleProtocol { return buf.array(); } - public static byte[] encodeSetCallState(String number, String name, GBCommand command) { + public byte[] encodeSetCallState(String number, String name, GBCommand command) { String[] parts = {number, name}; byte pebbleCmd; switch (command) { @@ -217,20 +217,20 @@ public class PebbleProtocol { return encodeMessage(ENDPOINT_PHONECONTROL, pebbleCmd, 0, parts); } - public static byte[] encodeSetMusicInfo(String artist, String album, String track) { + public byte[] encodeSetMusicInfo(String artist, String album, String track) { String[] parts = {artist, album, track}; return encodeMessage(ENDPOINT_MUSICCONTROL, MUSICCONTROL_SETMUSICINFO, 0, parts); } - public static byte[] encodeFirmwareVersionReq() { + public byte[] encodeFirmwareVersionReq() { return encodeMessage(ENDPOINT_FIRMWAREVERSION, FIRMWAREVERSION_GETVERSION, 0, null); } - public static byte[] encodeAppInfoReq() { + public byte[] encodeAppInfoReq() { return encodeMessage(ENDPOINT_APPMANAGER, APPMANAGER_GETAPPBANKSTATUS, 0, null); } - public static byte[] encodeAppDelete(int id, int index) { + public byte[] encodeAppDelete(int id, int index) { ByteBuffer buf = ByteBuffer.allocate(LENGTH_PREFIX + LENGTH_REMOVEAPP); buf.order(ByteOrder.BIG_ENDIAN); buf.putShort(LENGTH_REMOVEAPP); @@ -242,7 +242,7 @@ public class PebbleProtocol { return buf.array(); } - public static byte[] encodePhoneVersion(byte os) { + public byte[] encodePhoneVersion(byte os) { ByteBuffer buf = ByteBuffer.allocate(LENGTH_PREFIX + LENGTH_PHONEVERSION); buf.order(ByteOrder.BIG_ENDIAN); buf.putShort(LENGTH_PHONEVERSION); @@ -265,7 +265,7 @@ public class PebbleProtocol { return buf.array(); } - public static GBDeviceCommand decodeResponse(byte[] responseData) { + public GBDeviceCommand decodeResponse(byte[] responseData) { ByteBuffer buf = ByteBuffer.wrap(responseData); buf.order(ByteOrder.BIG_ENDIAN); short length = buf.getShort(); diff --git a/app/src/main/res/values/styles.xml~ b/app/src/main/res/values/styles.xml~ deleted file mode 100644 index 766ab9930..000000000 --- a/app/src/main/res/values/styles.xml~ +++ /dev/null @@ -1,8 +0,0 @@ - - - - - -