diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/deviceevents/GBDeviceEventAppMessage.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/deviceevents/GBDeviceEventAppMessage.java index c16840a2b..2dd3f3dd9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/deviceevents/GBDeviceEventAppMessage.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/deviceevents/GBDeviceEventAppMessage.java @@ -19,6 +19,11 @@ package nodomain.freeyourgadget.gadgetbridge.deviceevents; import java.util.UUID; public class GBDeviceEventAppMessage extends GBDeviceEvent { + public static int TYPE_APPMESSAGE = 0; + public static int TYPE_ACK = 1; + public static int TYPE_NACK = 2; + + public int type; public UUID appUUID; public int id; public String message; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/EventHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/EventHandler.java index c2cea6fc7..7d72f401e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/EventHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/EventHandler.java @@ -63,7 +63,7 @@ public interface EventHandler { void onAppDelete(UUID uuid); - void onAppConfiguration(UUID appUuid, String config); + void onAppConfiguration(UUID appUuid, String config, Integer id); void onAppReorder(UUID uuids[]); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java index 6fd8f550c..578b5098e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java @@ -251,10 +251,14 @@ public class GBDeviceService implements DeviceService { } @Override - public void onAppConfiguration(UUID uuid, String config) { + public void onAppConfiguration(UUID uuid, String config, Integer id) { Intent intent = createIntent().setAction(ACTION_APP_CONFIGURE) .putExtra(EXTRA_APP_UUID, uuid) .putExtra(EXTRA_APP_CONFIG, config); + + if (id != null) { + intent.putExtra(EXTRA_APP_CONFIG_ID, id); + } invokeService(intent); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java index 033422a33..f89ed766c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java @@ -94,6 +94,7 @@ public interface DeviceService extends EventHandler { String EXTRA_APP_UUID = "app_uuid"; String EXTRA_APP_START = "app_start"; String EXTRA_APP_CONFIG = "app_config"; + String EXTRA_APP_CONFIG_ID = "app_config_id"; String EXTRA_URI = "uri"; String EXTRA_CONFIG = "config"; String EXTRA_ALARMS = "alarms"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java index 067febb52..cf4d77664 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java @@ -105,6 +105,7 @@ import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_ST import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_TEST_NEW_FUNCTION; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.EXTRA_ALARMS; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.EXTRA_APP_CONFIG; +import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.EXTRA_APP_CONFIG_ID; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.EXTRA_APP_START; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.EXTRA_APP_UUID; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.EXTRA_BOOLEAN_ENABLE; @@ -479,7 +480,11 @@ public class DeviceCommunicationService extends Service implements SharedPrefere case ACTION_APP_CONFIGURE: { UUID uuid = (UUID) intent.getSerializableExtra(EXTRA_APP_UUID); String config = intent.getStringExtra(EXTRA_APP_CONFIG); - mDeviceSupport.onAppConfiguration(uuid, config); + Integer id = null; + if (intent.hasExtra(EXTRA_APP_CONFIG_ID)) { + id = intent.getIntExtra(EXTRA_APP_CONFIG_ID, 0); + } + mDeviceSupport.onAppConfiguration(uuid, config, id); break; } case ACTION_APP_REORDER: { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java index 26b01e207..a1b7f67de 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java @@ -232,11 +232,11 @@ public class ServiceDeviceSupport implements DeviceSupport { } @Override - public void onAppConfiguration(UUID uuid, String config) { + public void onAppConfiguration(UUID uuid, String config, Integer id) { if (checkBusy("app configuration")) { return; } - delegate.onAppConfiguration(uuid, config); + delegate.onAppConfiguration(uuid, config, id); } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java index 843845cce..222d97a69 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java @@ -528,7 +528,7 @@ public class HPlusSupport extends AbstractBTLEDeviceSupport { } @Override - public void onAppConfiguration(UUID appUuid, String config) { + public void onAppConfiguration(UUID appUuid, String config, Integer id) { } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/liveview/LiveviewSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/liveview/LiveviewSupport.java index 5d6246b87..77cf63f68 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/liveview/LiveviewSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/liveview/LiveviewSupport.java @@ -60,7 +60,7 @@ public class LiveviewSupport extends AbstractSerialDeviceSupport { } @Override - public void onAppConfiguration(UUID uuid, String config) { + public void onAppConfiguration(UUID uuid, String config, Integer id) { //nothing to do ATM } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java index 694e80072..7b988b733 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java @@ -844,7 +844,7 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { } @Override - public void onAppConfiguration(UUID uuid, String config) { + public void onAppConfiguration(UUID uuid, String config, Integer id) { // not supported } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java index 3307e7660..9d860e6b2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java @@ -762,7 +762,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { } @Override - public void onAppConfiguration(UUID uuid, String config) { + public void onAppConfiguration(UUID uuid, String config, Integer id) { // not supported } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerHealthify.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerHealthify.java index a559ee26b..c4d8b692d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerHealthify.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerHealthify.java @@ -58,7 +58,7 @@ class AppMessageHandlerHealthify extends AppMessageHandler { ArrayList> pairs = new ArrayList<>(2); pairs.add(new Pair<>(KEY_CONDITIONS, (Object) weatherSpec.currentCondition)); pairs.add(new Pair<>(KEY_TEMPERATURE, (Object) (weatherSpec.currentTemp - 273))); - byte[] weatherMessage = mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs); + byte[] weatherMessage = mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs, null); ByteBuffer buf = ByteBuffer.allocate(weatherMessage.length); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMarioTime.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMarioTime.java index 2ac94ca35..aa776388f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMarioTime.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMarioTime.java @@ -44,7 +44,7 @@ class AppMessageHandlerMarioTime extends AppMessageHandler { ArrayList> pairs = new ArrayList<>(2); pairs.add(new Pair<>(KEY_WEATHER_ICON_ID, (Object) (byte) 1)); pairs.add(new Pair<>(KEY_WEATHER_TEMPERATURE, (Object) (byte) (weatherSpec.currentTemp - 273))); - byte[] weatherMessage = mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs); + byte[] weatherMessage = mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs, null); ByteBuffer buf = ByteBuffer.allocate(weatherMessage.length); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMorpheuz.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMorpheuz.java index 0057f8343..b97ad3563 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMorpheuz.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMorpheuz.java @@ -96,7 +96,7 @@ class AppMessageHandlerMorpheuz extends AppMessageHandler { ArrayList> pairs = new ArrayList<>(); pairs.add(new Pair(key, value)); - return mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs); + return mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs, null); } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerObsidian.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerObsidian.java index 9475c4d11..adbf89a2f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerObsidian.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerObsidian.java @@ -155,7 +155,7 @@ class AppMessageHandlerObsidian extends AppMessageHandler { pairs.add(new Pair<>(messageKeys.get("MSG_KEY_WEATHER_ICON"), (Object) getIconForConditionCode(weatherSpec.currentConditionCode, isNight))); //celsius pairs.add(new Pair<>(messageKeys.get("MSG_KEY_WEATHER_TEMP"), (Object) (weatherSpec.currentTemp - 273))); - return mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs); + return mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs, null); } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerPebStyle.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerPebStyle.java index 712feaa52..f2add3eb4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerPebStyle.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerPebStyle.java @@ -100,7 +100,7 @@ class AppMessageHandlerPebStyle extends AppMessageHandler { pairs.add(new Pair<>(KEY_WEATHER_TEMP, (Object) (weather.currentTemp - 273))); } - byte[] testMessage = mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs); + byte[] testMessage = mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs, null); ByteBuffer buf = ByteBuffer.allocate(testMessage.length); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerSquare.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerSquare.java index ac95f884b..1c5fd489f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerSquare.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerSquare.java @@ -67,7 +67,7 @@ class AppMessageHandlerSquare extends AppMessageHandler { pairs.add(new Pair<>(CfgKeyUseCelsius, (Object) 1)); pairs.add(new Pair<>(CfgKeyCelsiusTemperature, (Object) (weatherSpec.currentTemp - 273))); pairs.add(new Pair<>(CfgKeyWeatherLocation, (Object) (weatherSpec.location))); - byte[] weatherMessage = mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs); + byte[] weatherMessage = mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs, null); ByteBuffer buf = ByteBuffer.allocate(weatherMessage.length); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerTimeStylePebble.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerTimeStylePebble.java index cd1295104..243081a6e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerTimeStylePebble.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerTimeStylePebble.java @@ -145,7 +145,7 @@ class AppMessageHandlerTimeStylePebble extends AppMessageHandler { pairs.add(new Pair<>(messageKeys.get("WeatherForecastHighTemp"), (Object) (weatherSpec.todayMaxTemp - 273))); pairs.add(new Pair<>(messageKeys.get("WeatherForecastLowTemp"), (Object) (weatherSpec.todayMinTemp - 273))); - return mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs); + return mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs, null); } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerTrekVolle.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerTrekVolle.java index 6ee94bc09..e00b2c5fd 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerTrekVolle.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerTrekVolle.java @@ -91,7 +91,7 @@ class AppMessageHandlerTrekVolle extends AppMessageHandler { pairs.add(new Pair<>(MESSAGE_KEY_WEATHER_LOCATION, (Object) weatherSpec.location)); - return mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs); + return mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs, null); } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerZalewszczak.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerZalewszczak.java index bde7d7772..2c48ce707 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerZalewszczak.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerZalewszczak.java @@ -72,7 +72,7 @@ class AppMessageHandlerZalewszczak extends AppMessageHandler { ArrayList> pairs = new ArrayList<>(2); pairs.add(new Pair(KEY_TEMP, weatherSpec.currentTemp - 273 + "C")); pairs.add(new Pair(KEY_ICON, getIconForConditionCode(weatherSpec.currentConditionCode))); - byte[] weatherMessage = mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs); + byte[] weatherMessage = mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs, null); ByteBuffer buf = ByteBuffer.allocate(weatherMessage.length); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleIoThread.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleIoThread.java index ab4350723..41ebb4ea6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleIoThread.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleIoThread.java @@ -100,7 +100,9 @@ class PebbleIoThread extends GBDeviceIoThread { private void sendAppMessageJS(GBDeviceEventAppMessage appMessage) { WebViewSingleton.appMessage(appMessage); - write(mPebbleProtocol.encodeApplicationMessageAck(appMessage.appUUID, (byte) appMessage.id)); + if (appMessage.type == GBDeviceEventAppMessage.TYPE_APPMESSAGE) { + write(mPebbleProtocol.encodeApplicationMessageAck(appMessage.appUUID, (byte) appMessage.id)); + } } PebbleIoThread(PebbleSupport pebbleSupport, GBDevice gbDevice, GBDeviceProtocol gbDeviceProtocol, BluetoothAdapter btAdapter, Context context) { @@ -519,7 +521,7 @@ class PebbleIoThread extends GBDeviceIoThread { sendAppMessageJS((GBDeviceEventAppMessage) deviceEvent); if (mEnablePebblekit) { LOG.info("Got AppMessage event"); - if (mPebbleKitSupport != null) { + if (mPebbleKitSupport != null && ((GBDeviceEventAppMessage) deviceEvent).type == GBDeviceEventAppMessage.TYPE_APPMESSAGE) { mPebbleKitSupport.sendAppMessageIntent((GBDeviceEventAppMessage) deviceEvent); } } 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 8484fc908..7c3645681 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 @@ -417,6 +417,8 @@ public class PebbleProtocol extends GBDeviceProtocol { private final HashMap mDatalogSessions = new HashMap<>(); + private Integer[] idLookup = new Integer[256]; + private byte[] encodeSimpleMessage(short endpoint, byte command) { final short LENGTH_SIMPLEMESSAGE = 1; ByteBuffer buf = ByteBuffer.allocate(LENGTH_PREFIX + LENGTH_SIMPLEMESSAGE); @@ -1465,7 +1467,7 @@ public class PebbleProtocol extends GBDeviceProtocol { ArrayList> pairs = new ArrayList<>(); int param = start ? 1 : 0; pairs.add(new Pair<>(1, (Object) param)); - return encodeApplicationMessagePush(ENDPOINT_LAUNCHER, uuid, pairs); + return encodeApplicationMessagePush(ENDPOINT_LAUNCHER, uuid, pairs, null); } } @@ -1898,7 +1900,7 @@ public class PebbleProtocol extends GBDeviceProtocol { return new GBDeviceEvent[]{appMessage, sendBytesAck}; } - byte[] encodeApplicationMessagePush(short endpoint, UUID uuid, ArrayList> pairs) { + byte[] encodeApplicationMessagePush(short endpoint, UUID uuid, ArrayList> pairs, Integer ext_id) { int length = LENGTH_UUID + 3; // UUID + (PUSH + id + length of dict) for (Pair pair : pairs) { if (pair.first == null || pair.second == null) @@ -1960,6 +1962,8 @@ public class PebbleProtocol extends GBDeviceProtocol { } } + idLookup[last_id] = ext_id; + return buf.array(); } @@ -1999,7 +2003,7 @@ public class PebbleProtocol extends GBDeviceProtocol { } } - return encodeApplicationMessagePush(ENDPOINT_APPLICATIONMESSAGE, uuid, pairs); + return encodeApplicationMessagePush(ENDPOINT_APPLICATIONMESSAGE, uuid, pairs, null); } private byte reverseBits(byte in) { @@ -2597,12 +2601,24 @@ public class PebbleProtocol extends GBDeviceProtocol { } break; case APPLICATIONMESSAGE_ACK: - LOG.info("got APPLICATIONMESSAGE/LAUNCHER (EP " + endpoint + ") ACK"); - devEvts = new GBDeviceEvent[]{null}; - break; case APPLICATIONMESSAGE_NACK: - LOG.info("got APPLICATIONMESSAGE/LAUNCHER (EP " + endpoint + ") NACK"); - devEvts = new GBDeviceEvent[]{null}; + if (pebbleCmd == APPLICATIONMESSAGE_ACK) { + LOG.info("got APPLICATIONMESSAGE/LAUNCHER (EP " + endpoint + ") ACK"); + } else { + LOG.info("got APPLICATIONMESSAGE/LAUNCHER (EP " + endpoint + ") NACK"); + } + GBDeviceEventAppMessage evtAppMessage = null; + if (idLookup[last_id] != null) { + evtAppMessage = new GBDeviceEventAppMessage(); + if (pebbleCmd == APPLICATIONMESSAGE_ACK) { + evtAppMessage.type = GBDeviceEventAppMessage.TYPE_ACK; + } else { + evtAppMessage.type = GBDeviceEventAppMessage.TYPE_NACK; + } + evtAppMessage.id = idLookup[last_id]; + evtAppMessage.appUUID = uuid; + } + devEvts = new GBDeviceEvent[]{evtAppMessage}; break; case APPLICATIONMESSAGE_REQUEST: LOG.info("got APPLICATIONMESSAGE/LAUNCHER (EP " + endpoint + ") REQUEST"); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleSupport.java index d9bd9f2d0..8f0cb3495 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleSupport.java @@ -71,7 +71,7 @@ public class PebbleSupport extends AbstractSerialDeviceSupport { } @Override - public void onAppConfiguration(UUID uuid, String config) { + public void onAppConfiguration(UUID uuid, String config, Integer id) { try { ArrayList> pairs = new ArrayList<>(); @@ -92,7 +92,7 @@ public class PebbleSupport extends AbstractSerialDeviceSupport { } pairs.add(new Pair<>(Integer.parseInt(keyStr), object)); } - getDeviceIOThread().write(((PebbleProtocol) getDeviceProtocol()).encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, uuid, pairs)); + getDeviceIOThread().write(((PebbleProtocol) getDeviceProtocol()).encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, uuid, pairs, id)); } catch (JSONException e) { e.printStackTrace(); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/vibratissimo/VibratissimoSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/vibratissimo/VibratissimoSupport.java index 30d8ae362..3629fd19e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/vibratissimo/VibratissimoSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/vibratissimo/VibratissimoSupport.java @@ -196,7 +196,7 @@ public class VibratissimoSupport extends AbstractBTLEDeviceSupport { } @Override - public void onAppConfiguration(UUID appUuid, String config) { + public void onAppConfiguration(UUID appUuid, String config, Integer id) { } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/WebViewSingleton.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/WebViewSingleton.java index 2c35bd70e..fb2e86dae 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/WebViewSingleton.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/WebViewSingleton.java @@ -128,6 +128,11 @@ public class WebViewSingleton { return; } + // TODO: handle ACK and NACK types with ids + if (message.type != GBDeviceEventAppMessage.TYPE_APPMESSAGE) { + return; + } + final String appMessage = parseIncomingAppMessage(message.message, message.appUUID); LOG.debug("to WEBVIEW: " + appMessage); new Handler(webViewSingleton.mainLooper).post(new Runnable() { @@ -481,7 +486,7 @@ public class WebViewSingleton { } LOG.info("WEBVIEW message to pebble: " + out.toString()); - GBApplication.deviceService().onAppConfiguration(this.mUuid, out.toString()); + GBApplication.deviceService().onAppConfiguration(this.mUuid, out.toString(), null); // TODO: insert local id for transaction } catch (JSONException e) { LOG.warn(e.getMessage()); diff --git a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/TestDeviceSupport.java b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/TestDeviceSupport.java index f3239fb70..93414fae8 100644 --- a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/TestDeviceSupport.java +++ b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/TestDeviceSupport.java @@ -105,7 +105,7 @@ class TestDeviceSupport extends AbstractDeviceSupport { } @Override - public void onAppConfiguration(UUID appUuid, String config) { + public void onAppConfiguration(UUID appUuid, String config, Integer id) { }