diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandler.java new file mode 100644 index 00000000..d6042375 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandler.java @@ -0,0 +1,28 @@ +package nodomain.freeyourgadget.gadgetbridge.service.devices.pebble; + + +import android.util.Pair; + +import java.util.ArrayList; +import java.util.UUID; + +import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent; + +public class AppMessageHandler { + protected final PebbleProtocol mPebbleProtocol; + protected final UUID mUUID; + + AppMessageHandler(UUID uuid, PebbleProtocol pebbleProtocol) { + mUUID = uuid; + mPebbleProtocol = pebbleProtocol; + } + + public UUID getUUID() { + return mUUID; + } + + public GBDeviceEvent[] handleMessage(ArrayList> pairs) { + return null; + } + +} \ No newline at end of file diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/GadgetbridgePblSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerGBPebble.java similarity index 87% rename from app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/GadgetbridgePblSupport.java rename to app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerGBPebble.java index 099fd8fc..667763d6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/GadgetbridgePblSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerGBPebble.java @@ -19,20 +19,18 @@ import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventSendBytes; import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider; -public class GadgetbridgePblSupport { +public class AppMessageHandlerGBPebble extends AppMessageHandler { public static final int KEY_TIMESTAMP = 1; public static final int KEY_SAMPLES = 2; - public static final UUID uuid = UUID.fromString("61476764-7465-7262-6469-656775527a6c"); - private final PebbleProtocol mPebbleProtocol; + private static final Logger LOG = LoggerFactory.getLogger(AppMessageHandlerGBPebble.class); - private static final Logger LOG = LoggerFactory.getLogger(GadgetbridgePblSupport.class); - - public GadgetbridgePblSupport(PebbleProtocol pebbleProtocol) { - mPebbleProtocol = pebbleProtocol; + AppMessageHandlerGBPebble(UUID uuid, PebbleProtocol pebbleProtocol) { + super(uuid, pebbleProtocol); } + @Override public GBDeviceEvent[] handleMessage(ArrayList> pairs) { int timestamp = 0; for (Pair pair : pairs) { @@ -74,7 +72,7 @@ public class GadgetbridgePblSupport { } } GBDeviceEventSendBytes sendBytes = new GBDeviceEventSendBytes(); - sendBytes.encodedBytes = mPebbleProtocol.encodeApplicationMessageAck(uuid, mPebbleProtocol.last_id); + sendBytes.encodedBytes = mPebbleProtocol.encodeApplicationMessageAck(mUUID, mPebbleProtocol.last_id); return new GBDeviceEvent[]{sendBytes}; } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/MorpheuzSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMorpheuz.java similarity index 78% rename from app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/MorpheuzSupport.java rename to app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMorpheuz.java index af368adc..305a4abe 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/MorpheuzSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMorpheuz.java @@ -19,7 +19,7 @@ import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventSleepMonit import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider; import nodomain.freeyourgadget.gadgetbridge.devices.pebble.MorpheuzSampleProvider; -public class MorpheuzSupport { +public class AppMessageHandlerMorpheuz extends AppMessageHandler { public static final int KEY_POINT = 1; public static final int KEY_CTRL = 2; @@ -37,28 +37,26 @@ public class MorpheuzSupport { public static final int CTRL_DO_NEXT = 8; public static final int CTRL_SET_LAST_SENT = 16; - public static final UUID uuid = UUID.fromString("5be44f1d-d262-4ea6-aa30-ddbec1e3cab2"); - private final PebbleProtocol mPebbleProtocol; - // data received from Morpheuz in native format private int smartalarm_from = -1; // time in minutes relative from 0:00 for smart alarm (earliest) private int smartalarm_to = -1;// time in minutes relative from 0:00 for smart alarm (latest) private int recording_base_timestamp = -1; // timestamp for the first "point", all folowing are +10 minutes offset each private int alarm_gone_off = -1; // time in minutes relative from 0:00 when alarm gone off - private static final Logger LOG = LoggerFactory.getLogger(MorpheuzSupport.class); + private static final Logger LOG = LoggerFactory.getLogger(AppMessageHandlerMorpheuz.class); - public MorpheuzSupport(PebbleProtocol pebbleProtocol) { - mPebbleProtocol = pebbleProtocol; + public AppMessageHandlerMorpheuz(UUID uuid, PebbleProtocol pebbleProtocol) { + super(uuid, pebbleProtocol); } private byte[] encodeMorpheuzMessage(int key, int value) { ArrayList> pairs = new ArrayList<>(); pairs.add(new Pair(key, value)); - return mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, uuid, pairs); + return mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs); } + @Override public GBDeviceEvent[] handleMessage(ArrayList> pairs) { int ctrl_message = 0; GBDeviceEventSleepMonitorResult sleepMonitorResult = null; @@ -80,7 +78,7 @@ public class MorpheuzSupport { case KEY_POINT: if (recording_base_timestamp == -1) { // we have no base timestamp but received points, stop this - ctrl_message = MorpheuzSupport.CTRL_VERSION_DONE | MorpheuzSupport.CTRL_GONEOFF_DONE | MorpheuzSupport.CTRL_TRANSMIT_DONE | MorpheuzSupport.CTRL_SET_LAST_SENT; + ctrl_message = AppMessageHandlerMorpheuz.CTRL_VERSION_DONE | AppMessageHandlerMorpheuz.CTRL_GONEOFF_DONE | AppMessageHandlerMorpheuz.CTRL_TRANSMIT_DONE | AppMessageHandlerMorpheuz.CTRL_SET_LAST_SENT; } else { short index = (short) ((int) pair.second >> 16); short intensity = (short) ((int) pair.second & 0xffff); @@ -105,32 +103,32 @@ public class MorpheuzSupport { } } - ctrl_message = MorpheuzSupport.CTRL_VERSION_DONE | MorpheuzSupport.CTRL_SET_LAST_SENT | MorpheuzSupport.CTRL_DO_NEXT; + ctrl_message = AppMessageHandlerMorpheuz.CTRL_VERSION_DONE | AppMessageHandlerMorpheuz.CTRL_SET_LAST_SENT | AppMessageHandlerMorpheuz.CTRL_DO_NEXT; } break; case KEY_FROM: smartalarm_from = (int) pair.second; LOG.info("got from: " + smartalarm_from / 60 + ":" + smartalarm_from % 60); - ctrl_message = MorpheuzSupport.CTRL_VERSION_DONE | MorpheuzSupport.CTRL_SET_LAST_SENT | MorpheuzSupport.CTRL_DO_NEXT; + ctrl_message = AppMessageHandlerMorpheuz.CTRL_VERSION_DONE | AppMessageHandlerMorpheuz.CTRL_SET_LAST_SENT | AppMessageHandlerMorpheuz.CTRL_DO_NEXT; break; case KEY_TO: smartalarm_to = (int) pair.second; LOG.info("got from: " + smartalarm_to / 60 + ":" + smartalarm_to % 60); - ctrl_message = MorpheuzSupport.CTRL_VERSION_DONE | MorpheuzSupport.CTRL_SET_LAST_SENT | MorpheuzSupport.CTRL_DO_NEXT; + ctrl_message = AppMessageHandlerMorpheuz.CTRL_VERSION_DONE | AppMessageHandlerMorpheuz.CTRL_SET_LAST_SENT | AppMessageHandlerMorpheuz.CTRL_DO_NEXT; break; case KEY_VERSION: LOG.info("got version: " + ((float) ((int) pair.second) / 10.0f)); - ctrl_message = MorpheuzSupport.CTRL_VERSION_DONE | MorpheuzSupport.CTRL_SET_LAST_SENT; + ctrl_message = AppMessageHandlerMorpheuz.CTRL_VERSION_DONE | AppMessageHandlerMorpheuz.CTRL_SET_LAST_SENT; break; case KEY_BASE: // fix timestamp TimeZone tz = SimpleTimeZone.getDefault(); recording_base_timestamp = (int) pair.second - (tz.getOffset(System.currentTimeMillis())) / 1000; LOG.info("got base: " + recording_base_timestamp); - ctrl_message = MorpheuzSupport.CTRL_VERSION_DONE | MorpheuzSupport.CTRL_SET_LAST_SENT | MorpheuzSupport.CTRL_DO_NEXT; + ctrl_message = AppMessageHandlerMorpheuz.CTRL_VERSION_DONE | AppMessageHandlerMorpheuz.CTRL_SET_LAST_SENT | AppMessageHandlerMorpheuz.CTRL_DO_NEXT; break; case KEY_AUTO_RESET: - ctrl_message = MorpheuzSupport.CTRL_VERSION_DONE | MorpheuzSupport.CTRL_SET_LAST_SENT | MorpheuzSupport.CTRL_DO_NEXT; + ctrl_message = AppMessageHandlerMorpheuz.CTRL_VERSION_DONE | AppMessageHandlerMorpheuz.CTRL_SET_LAST_SENT | AppMessageHandlerMorpheuz.CTRL_DO_NEXT; break; default: LOG.info("unhandled key: " + pair.first); @@ -140,13 +138,13 @@ public class MorpheuzSupport { // always ack GBDeviceEventSendBytes sendBytesAck = new GBDeviceEventSendBytes(); - sendBytesAck.encodedBytes = mPebbleProtocol.encodeApplicationMessageAck(uuid, mPebbleProtocol.last_id); + sendBytesAck.encodedBytes = mPebbleProtocol.encodeApplicationMessageAck(mUUID, mPebbleProtocol.last_id); // sometimes send control message GBDeviceEventSendBytes sendBytesCtrl = null; if (ctrl_message > 0) { sendBytesCtrl = new GBDeviceEventSendBytes(); - sendBytesCtrl.encodedBytes = encodeMorpheuzMessage(MorpheuzSupport.KEY_CTRL, ctrl_message); + sendBytesCtrl.encodedBytes = encodeMorpheuzMessage(AppMessageHandlerMorpheuz.KEY_CTRL, ctrl_message); } // ctrl and sleep monitor might be null, thats okay diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/WeatherNeatSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerWeatherNeat.java similarity index 78% rename from app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/WeatherNeatSupport.java rename to app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerWeatherNeat.java index fc2fc1c2..c32074d3 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/WeatherNeatSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerWeatherNeat.java @@ -12,7 +12,7 @@ import java.util.UUID; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventSendBytes; -public class WeatherNeatSupport { +public class AppMessageHandlerWeatherNeat extends AppMessageHandler { public static final int KEY_REQUEST = 0; public static final int KEY_CITY = 1; @@ -20,13 +20,10 @@ public class WeatherNeatSupport { public static final int KEY_CONDITION = 3; public static final int KEY_LIGHT_TIME = 5; - public static final UUID uuid = UUID.fromString("3684003b-a685-45f9-a713-abc6364ba051"); - private final PebbleProtocol mPebbleProtocol; + private static final Logger LOG = LoggerFactory.getLogger(AppMessageHandlerWeatherNeat.class); - private static final Logger LOG = LoggerFactory.getLogger(WeatherNeatSupport.class); - - public WeatherNeatSupport(PebbleProtocol pebbleProtocol) { - mPebbleProtocol = pebbleProtocol; + public AppMessageHandlerWeatherNeat(UUID uuid, PebbleProtocol pebbleProtocol) { + super(uuid, pebbleProtocol); } private byte[] encodeWeatherNeatMessage(String city, String temperature, String condition, int light_time) { @@ -36,8 +33,8 @@ public class WeatherNeatSupport { pairs.add(new Pair<>(3, (Object) condition)); pairs.add(new Pair<>(5, (Object) light_time)); // seconds for backlight on shake - byte[] ackMessage = mPebbleProtocol.encodeApplicationMessageAck(uuid, mPebbleProtocol.last_id); - byte[] testMessage = mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, uuid, pairs); + byte[] ackMessage = mPebbleProtocol.encodeApplicationMessageAck(mUUID, mPebbleProtocol.last_id); + byte[] testMessage = mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs); ByteBuffer buf = ByteBuffer.allocate(ackMessage.length + testMessage.length); @@ -48,6 +45,7 @@ public class WeatherNeatSupport { return buf.array(); } + @Override public GBDeviceEvent[] handleMessage(ArrayList> pairs) { GBDeviceEventSendBytes sendBytes = new GBDeviceEventSendBytes(); sendBytes.encodedBytes = encodeWeatherNeatMessage("Berlin", "22 C", "cloudy", 0); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java index 1eda9688..594b8d38 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java @@ -13,6 +13,8 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; import java.util.Random; import java.util.SimpleTimeZone; import java.util.UUID; @@ -327,9 +329,19 @@ public class PebbleProtocol extends GBDeviceProtocol { byte last_id = -1; private ArrayList tmpUUIDS = new ArrayList<>(); - private MorpheuzSupport mMorpheuzSupport = new MorpheuzSupport(PebbleProtocol.this); - private WeatherNeatSupport mWeatherNeatSupport = new WeatherNeatSupport(PebbleProtocol.this); - private GadgetbridgePblSupport mGadgetbridgePblSupport = new GadgetbridgePblSupport(PebbleProtocol.this); + private static final UUID UUID_GBPEBBLE = UUID.fromString("61476764-7465-7262-6469-656775527a6c"); + private static final UUID UUID_MORPHEUZ = UUID.fromString("5be44f1d-d262-4ea6-aa30-ddbec1e3cab2"); + private static final UUID UUID_WHETHERNEAT = UUID.fromString("3684003b-a685-45f9-a713-abc6364ba051"); + private static final UUID UUID_MISFIT = UUID.fromString("0b73b76a-cd65-4dc2-9585-aaa213320858"); + + private static Map mAppMessageHandlers = new HashMap<>(); + + { + mAppMessageHandlers.put(UUID_GBPEBBLE, new AppMessageHandlerGBPebble(UUID_GBPEBBLE, PebbleProtocol.this)); + mAppMessageHandlers.put(UUID_MORPHEUZ, new AppMessageHandlerMorpheuz(UUID_MORPHEUZ, PebbleProtocol.this)); + mAppMessageHandlers.put(UUID_WHETHERNEAT, new AppMessageHandlerWeatherNeat(UUID_WHETHERNEAT, PebbleProtocol.this)); + //mAppMessageHandlers.put(UUID_MISFIT,new AppMessageHandlerMisfit(UUID_MISFIT,PebbleProtocol.this)); + } private static byte[] encodeSimpleMessage(short endpoint, byte command) { ByteBuffer buf = ByteBuffer.allocate(LENGTH_PREFIX + LENGTH_SIMPLEMESSAGE); @@ -1453,7 +1465,7 @@ public class PebbleProtocol extends GBDeviceProtocol { buf.order(ByteOrder.BIG_ENDIAN); long uuid_high = buf.getLong(); long uuid_low = buf.getLong(); - int id = (int) (uuid_low & 0xffffffff); + int id = (int) (uuid_low & 0xffffffffL); byte action = buf.get(); if (action >= 0x01 && action <= 0x04) { GBDeviceEventNotificationControl dismissNotification = new GBDeviceEventNotificationControl(); @@ -1729,15 +1741,10 @@ public class PebbleProtocol extends GBDeviceProtocol { case APPLICATIONMESSAGE_PUSH: UUID uuid = new UUID(uuid_high, uuid_low); LOG.info("got APPLICATIONMESSAGE PUSH from UUID " + uuid); - if (WeatherNeatSupport.uuid.equals(uuid)) { + AppMessageHandler handler = mAppMessageHandlers.get(uuid); + if (handler != null) { ArrayList> dict = decodeDict(buf); - devEvts = mWeatherNeatSupport.handleMessage(dict); - } else if (MorpheuzSupport.uuid.equals(uuid)) { - ArrayList> dict = decodeDict(buf); - devEvts = mMorpheuzSupport.handleMessage(dict); - } else if (GadgetbridgePblSupport.uuid.equals(uuid)) { - ArrayList> dict = decodeDict(buf); - devEvts = mGadgetbridgePblSupport.handleMessage(dict); + devEvts = handler.handleMessage(dict); } else { try { devEvts = decodeDictToJSONAppMessage(uuid, buf);