From 1cd9a09ce5d6fba9a75ca5695cf897451a70c33d Mon Sep 17 00:00:00 2001 From: Sebastian Kranz Date: Fri, 12 Jul 2019 08:08:52 +0200 Subject: [PATCH 1/8] BUGFIX: Really fix the timestamps now for everyone, everywhere. calculate the correct UTC of different timezones and daylight savings. --- .../devices/zetime/ZeTimeDeviceSupport.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/zetime/ZeTimeDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/zetime/ZeTimeDeviceSupport.java index 36ecf8605..ce493fb22 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/zetime/ZeTimeDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/zetime/ZeTimeDeviceSupport.java @@ -76,7 +76,7 @@ public class ZeTimeDeviceSupport extends AbstractBTLEDeviceSupport { private final GBDeviceEventBatteryInfo batteryCmd = new GBDeviceEventBatteryInfo(); private final GBDeviceEventVersionInfo versionCmd = new GBDeviceEventVersionInfo(); private final GBDeviceEventMusicControl musicCmd = new GBDeviceEventMusicControl(); - private final int sevenHourOffset = 25200; + private final int eightHourOffset = 28800; private byte[] lastMsg; private byte msgPart; private int availableSleepData; @@ -1171,8 +1171,10 @@ public class ZeTimeDeviceSupport extends AbstractBTLEDeviceSupport { private void handleStepsData(byte[] msg) { ZeTimeActivitySample sample = new ZeTimeActivitySample(); + Calendar now = GregorianCalendar.getInstance(); int timestamp = (msg[10] << 24)&0xff000000 | (msg[9] << 16)&0xff0000 | (msg[8] << 8)&0xff00 | (msg[7]&0xff); - timestamp += sevenHourOffset; // the timestamp from the watch has an offset of seven hours, do not know why... + timestamp += eightHourOffset; // the timestamp from the watch has an offset of eight hours, do not know why... + timestamp -= ((now.get(Calendar.ZONE_OFFSET)/1000) + (now.get(Calendar.DST_OFFSET)/1000)); // TimeZone hour + daylight saving sample.setTimestamp(timestamp); sample.setSteps((msg[14] << 24)&0xff000000 | (msg[13] << 16)&0xff0000 | (msg[12] << 8)&0xff00 | (msg[11]&0xff)); sample.setCaloriesBurnt((msg[18] << 24)&0xff000000 | (msg[17] << 16)&0xff0000 | (msg[16] << 8)&0xff00 | (msg[15]&0xff)); @@ -1217,8 +1219,10 @@ public class ZeTimeDeviceSupport extends AbstractBTLEDeviceSupport { private void handleSleepData(byte[] msg) { ZeTimeActivitySample sample = new ZeTimeActivitySample(); + Calendar now = GregorianCalendar.getInstance(); int timestamp = (msg[10] << 24)&0xff000000 | (msg[9] << 16)&0xff0000 | (msg[8] << 8)&0xff00 | (msg[7]&0xff); - timestamp += sevenHourOffset; // the timestamp from the watch has an offset of seven hours, do not know why... + timestamp += eightHourOffset; // the timestamp from the watch has an offset of eight hours, do not know why... + timestamp -= ((now.get(Calendar.ZONE_OFFSET)/1000) + (now.get(Calendar.DST_OFFSET)/1000)); // TimeZone hour + daylight saving sample.setTimestamp(timestamp); if(msg[11] == 0) { sample.setRawKind(ActivityKind.TYPE_DEEP_SLEEP); @@ -1260,8 +1264,10 @@ public class ZeTimeDeviceSupport extends AbstractBTLEDeviceSupport { private void handleHeartRateData(byte[] msg) { ZeTimeActivitySample sample = new ZeTimeActivitySample(); + Calendar now = GregorianCalendar.getInstance(); int timestamp = (msg[10] << 24)&0xff000000 | (msg[9] << 16)&0xff0000 | (msg[8] << 8)&0xff00 | (msg[7]&0xff); - timestamp += sevenHourOffset; // the timestamp from the watch has an offset of seven hours, do not know why... + timestamp += eightHourOffset; // the timestamp from the watch has an offset of eight hours, do not know why... + timestamp -= ((now.get(Calendar.ZONE_OFFSET)/1000) + (now.get(Calendar.DST_OFFSET)/1000)); // TimeZone hour + daylight saving sample.setHeartRate(msg[11]); sample.setTimestamp(timestamp); @@ -1278,10 +1284,11 @@ public class ZeTimeDeviceSupport extends AbstractBTLEDeviceSupport { progressHeartRate = (msg[5]&0xff) | ((msg[6] << 8)&0xff00); GB.updateTransferNotification(null, getContext().getString(R.string.busy_task_fetch_activity_data), true, (int) (progressHeartRate *100 / availableHeartRateData), getContext()); - if(((msg[4] << 8)&0xff00 | (msg[3]&0xff)) == 0xe) // if the message is longer than 0x7, than it has to measurements (payload = 0xe) + if(((msg[4] << 8)&0xff00 | (msg[3]&0xff)) == 0xe) // if the message is longer than 0x7, than it has two measurements (payload = 0xe) { timestamp = (msg[17] << 24)&0xff000000 | (msg[16] << 16)&0xff0000 | (msg[15] << 8)&0xff00 | (msg[14]&0xff); - timestamp += sevenHourOffset; // the timestamp from the watch has an offset of seven hours, do not know why... + timestamp += eightHourOffset; // the timestamp from the watch has an offset of eight hours, do not know why... + timestamp -= ((now.get(Calendar.ZONE_OFFSET)/1000) + (now.get(Calendar.DST_OFFSET)/1000)); // TimeZone hour + daylight saving sample.setHeartRate(msg[18]); sample.setTimestamp(timestamp); From c10ec59b78f52249dc37d9977143a3d68e6c41f6 Mon Sep 17 00:00:00 2001 From: Joan Perals Date: Thu, 11 Jul 2019 00:20:33 +0200 Subject: [PATCH 2/8] Add Catalan to list of available languages --- app/src/main/res/values/arrays.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 3c4694761..a95783159 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -13,6 +13,7 @@ System Default + Català Čeština Deutsch English @@ -31,6 +32,7 @@ default + ca cs de en From 905c6fdc3e400a37a5c16b36cf92bc053c170912 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Tue, 16 Jul 2019 14:22:30 +0200 Subject: [PATCH 3/8] update changelog, bump version --- CHANGELOG.md | 4 ++-- app/build.gradle | 4 ++-- app/src/main/res/xml/changelog_master.xml | 6 +++++- fastlane/metadata/android/en-US/changelogs/151.txt | 3 +++ 4 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/151.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c78971a2..60eb65e0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ ### Changelog -#### master -* Mi Band 4: Unconfirmed and probably completely broken initial support +#### Version 0.34.1 * Mi Band 1: Fix crash when entering per-device settings +* ZeTime: Fix timestmaps * Fix a crash when flashing an non-whitelisted firmware while using Gadgetbridge in Spanish #### Version 0.34.0 diff --git a/app/build.gradle b/app/build.gradle index 566b274e7..7ab1ce51b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,8 +25,8 @@ android { targetSdkVersion 27 // Note: always bump BOTH versionCode and versionName! - versionName "0.34.0" - versionCode 150 + versionName "0.34.1" + versionCode 151 vectorDrawables.useSupportLibrary = true } buildTypes { diff --git a/app/src/main/res/xml/changelog_master.xml b/app/src/main/res/xml/changelog_master.xml index 513ed4c74..847e71f79 100644 --- a/app/src/main/res/xml/changelog_master.xml +++ b/app/src/main/res/xml/changelog_master.xml @@ -1,6 +1,10 @@ - + + Mi Band 1: Fix crash when entering per-device settings + ZeTime: Fix timestmaps + Fix a crash when flashing an non-whitelisted firmware while using Gadgetbridge in Spanish + Mi Band 1/2/3/Bip/Cor: Migrate many settings to per-device settings (new settings icon in device card in main activity) Mi Band 3: Fix setting menu items with 2.4 firmware and add support for the new timer menu diff --git a/fastlane/metadata/android/en-US/changelogs/151.txt b/fastlane/metadata/android/en-US/changelogs/151.txt new file mode 100644 index 000000000..09a49bcb6 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/151.txt @@ -0,0 +1,3 @@ +* Mi Band 1: Fix crash when entering per-device settings +* ZeTime: Fix timestmaps +* Fix a crash when flashing an non-whitelisted firmware while using Gadgetbridge in Spanish From f7a4b3c06a3e4c8e58e00dda74581ceb791a47fc Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Tue, 16 Jul 2019 16:24:45 +0200 Subject: [PATCH 4/8] Mi Band 3: whitelist firmware 2.4.0.20 Closes #1557 --- .../service/devices/huami/miband3/MiBand3FirmwareInfo.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband3/MiBand3FirmwareInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband3/MiBand3FirmwareInfo.java index ca8112c58..4102c7fbd 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband3/MiBand3FirmwareInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband3/MiBand3FirmwareInfo.java @@ -60,6 +60,7 @@ public class MiBand3FirmwareInfo extends HuamiFirmwareInfo { crcToVersion.put(62735, "2.3.0.6"); crcToVersion.put(40949, "2.3.0.28"); crcToVersion.put(59213, "2.4.0.12"); + crcToVersion.put(10810, "2.4.0.20"); // firmware (Mi Band 3 NFC) crcToVersion.put(46724, "1.7.0.4"); @@ -73,7 +74,7 @@ public class MiBand3FirmwareInfo extends HuamiFirmwareInfo { crcToVersion.put(1815, "2.0.0.4"); crcToVersion.put(7225, "2.2.0.12-2.3.0.6"); crcToVersion.put(52754, "2.3.0.28"); - crcToVersion.put(17930, "2.4.0.12"); + crcToVersion.put(17930, "2.4.0.12-20"); // font crcToVersion.put(19775, "1"); From 8d50e8ef08cb235116d3a886ec1effc9f9b5182f Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Tue, 16 Jul 2019 23:48:08 +0200 Subject: [PATCH 5/8] Mi Band 3: Allow setting date format in per-device settings Closes #1544 --- .../DeviceSpecificSettingsFragment.java | 1 + .../devices/huami/HuamiService.java | 1 + .../huami/miband3/MiBand3Coordinator.java | 1 + .../service/devices/huami/HuamiSupport.java | 29 +++++++++++++++---- .../devices/huami/miband3/MiBand3Support.java | 2 +- app/src/main/res/values/arrays.xml | 12 ++++++++ 6 files changed, 40 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java index f23fa9910..33cadbb2e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java @@ -282,6 +282,7 @@ public class DeviceSpecificSettingsFragment extends PreferenceFragmentCompat { addPreferenceHandlerFor(PREF_SWIPE_UNLOCK); addPreferenceHandlerFor(PREF_MI2_DATEFORMAT); + addPreferenceHandlerFor("dateformat"); addPreferenceHandlerFor(HuamiConst.PREF_DISPLAY_ITEMS); String displayOnLiftState = prefs.getString(PREF_ACTIVATE_DISPLAY_ON_LIFT, PREF_DO_NOT_DISTURB_OFF); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiService.java index 2a5c6d7cc..f87c31d78 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiService.java @@ -136,6 +136,7 @@ public class HuamiService { public static final byte[] DATEFORMAT_TIME = new byte[] {ENDPOINT_DISPLAY, 0x0a, 0x0, 0x0 }; public static final byte[] DATEFORMAT_TIME_12_HOURS = new byte[] {ENDPOINT_DISPLAY, 0x02, 0x0, 0x0 }; public static final byte[] DATEFORMAT_TIME_24_HOURS = new byte[] {ENDPOINT_DISPLAY, 0x02, 0x0, 0x1 }; + public static final byte[] DATEFORMAT_DATE_MM_DD_YYYY = new byte[]{ENDPOINT_DISPLAY, 30, 0x00, 'M', 'M', '/', 'd', 'd', '/', 'y', 'y', 'y', 'y'}; public static final byte[] COMMAND_ENABLE_DISPLAY_ON_LIFT_WRIST = new byte[]{ENDPOINT_DISPLAY, 0x05, 0x00, 0x01}; public static final byte[] COMMAND_DISABLE_DISPLAY_ON_LIFT_WRIST = new byte[]{ENDPOINT_DISPLAY, 0x05, 0x00, 0x00}; public static final byte[] COMMAND_SCHEDULE_DISPLAY_ON_LIFT_WRIST = new byte[]{ENDPOINT_DISPLAY, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband3/MiBand3Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband3/MiBand3Coordinator.java index 3e5d116f5..4c2404159 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband3/MiBand3Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband3/MiBand3Coordinator.java @@ -103,6 +103,7 @@ public class MiBand3Coordinator extends HuamiCoordinator { public int[] getSupportedDeviceSpecificSettings(GBDevice device) { return new int[]{ R.xml.devicesettings_miband3, + R.xml.devicesettings_dateformat, R.xml.devicesettings_nightmode, R.xml.devicesettings_donotdisturb_withauto, R.xml.devicesettings_liftwrist_display, diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java index 343ae4916..e7b7cd0a1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java @@ -1553,6 +1553,9 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { case MiBandConst.PREF_SWIPE_UNLOCK: setBandScreenUnlock(builder); break; + case "dateformat": + setDateFormat(builder); + break; } builder.queue(getQueue()); } catch (IOException e) { @@ -1567,11 +1570,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { @Override public void onTestNewFunction() { - try { - new FetchSportsSummaryOperation(this).perform(); - } catch (IOException ex) { - LOG.error("Unable to fetch MI activity data", ex); - } + } @Override @@ -1593,6 +1592,26 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { return this; } + protected HuamiSupport setDateFormat(TransactionBuilder builder) { + String dateFormat = GBApplication.getDeviceSpecificSharedPrefs(gbDevice.getAddress()).getString("dateformat", "MM/dd/yyyy"); + if (dateFormat == null) { + return null; + } + switch (dateFormat) { + case "MM/dd/yyyy": + case "dd.MM.yyyy": + case "dd/MM/yyyy": + byte[] command = HuamiService.DATEFORMAT_DATE_MM_DD_YYYY; + System.arraycopy(dateFormat.getBytes(), 0, command, 3, 10); + builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), command); + break; + default: + LOG.warn("unsupported date format " + dateFormat); + } + + return this; + } + private HuamiSupport setTimeFormat(TransactionBuilder builder) { boolean is24Format = DateFormat.is24HourFormat(getContext()); LOG.info("Setting 24h time format to " + is24Format); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband3/MiBand3Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband3/MiBand3Support.java index db23c1fd9..2d7117b8f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband3/MiBand3Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband3/MiBand3Support.java @@ -36,7 +36,6 @@ import nodomain.freeyourgadget.gadgetbridge.devices.huami.miband3.MiBand3Coordin import nodomain.freeyourgadget.gadgetbridge.devices.huami.miband3.MiBand3FWHelper; import nodomain.freeyourgadget.gadgetbridge.devices.huami.miband3.MiBand3Service; import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst; -import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.AmazfitBipSupport; import nodomain.freeyourgadget.gadgetbridge.util.GB; @@ -164,6 +163,7 @@ public class MiBand3Support extends AmazfitBipSupport { setLanguage(builder); setBandScreenUnlock(builder); setNightMode(builder); + setDateFormat(builder); } @Override diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index a95783159..acf7efcad 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -150,6 +150,18 @@ @string/p_dateformat_datetime + + dd.MM.yyyy + dd/MM/yyyy + MM/dd/yyyy + + + + dd.MM.yyyy + dd/MM/yyyy + MM/dd/yyyy + + @string/mi2_dnd_off @string/mi2_dnd_automatic From 8d2ea3b9e8b9c7f179cc8ac6f576a81a17120d37 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Tue, 16 Jul 2019 23:50:28 +0200 Subject: [PATCH 6/8] update changelog --- CHANGELOG.md | 1 + app/src/main/res/xml/changelog_master.xml | 1 + fastlane/metadata/android/en-US/changelogs/151.txt | 1 + 3 files changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 60eb65e0d..ccff8844a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ #### Version 0.34.1 * Mi Band 1: Fix crash when entering per-device settings +* Mi Band 3: Allow setting date format in per-device settings * ZeTime: Fix timestmaps * Fix a crash when flashing an non-whitelisted firmware while using Gadgetbridge in Spanish diff --git a/app/src/main/res/xml/changelog_master.xml b/app/src/main/res/xml/changelog_master.xml index 847e71f79..b287cb27d 100644 --- a/app/src/main/res/xml/changelog_master.xml +++ b/app/src/main/res/xml/changelog_master.xml @@ -2,6 +2,7 @@ Mi Band 1: Fix crash when entering per-device settings + Mi Band 3: Allow setting date format in per-device settings ZeTime: Fix timestmaps Fix a crash when flashing an non-whitelisted firmware while using Gadgetbridge in Spanish diff --git a/fastlane/metadata/android/en-US/changelogs/151.txt b/fastlane/metadata/android/en-US/changelogs/151.txt index 09a49bcb6..54730f2b0 100644 --- a/fastlane/metadata/android/en-US/changelogs/151.txt +++ b/fastlane/metadata/android/en-US/changelogs/151.txt @@ -1,3 +1,4 @@ * Mi Band 1: Fix crash when entering per-device settings +* Mi Band 3: Allow setting date format in per-device settings * ZeTime: Fix timestmaps * Fix a crash when flashing an non-whitelisted firmware while using Gadgetbridge in Spanish From 54e814f848e1eb7ce6cf81f9d388e1c8442919d8 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Wed, 17 Jul 2019 11:26:36 +0200 Subject: [PATCH 7/8] add missing file travis is useless, lets remove that crap --- app/src/main/res/xml/devicesettings_dateformat.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 app/src/main/res/xml/devicesettings_dateformat.xml diff --git a/app/src/main/res/xml/devicesettings_dateformat.xml b/app/src/main/res/xml/devicesettings_dateformat.xml new file mode 100644 index 000000000..ce29ed05e --- /dev/null +++ b/app/src/main/res/xml/devicesettings_dateformat.xml @@ -0,0 +1,12 @@ + + + + + From be28da9430fc3943c1a3efce87f8250df7b03d85 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Wed, 17 Jul 2019 11:37:23 +0200 Subject: [PATCH 8/8] remove travis-ci badge Travis you have been a pain in the ass, travis you took more time from me than you saved me. Goodby Travis. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 2ba7baf31..87ca9dd7b 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,6 @@ vendor's servers. [![Donate](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/Gadgetbridge/donate) -[![Build](https://travis-ci.org/Freeyourgadget/Gadgetbridge.svg?branch=master)](https://travis-ci.org/Freeyourgadget/Gadgetbridge) [![Code Quality: Java](https://img.shields.io/lgtm/grade/java/g/Freeyourgadget/Gadgetbridge.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Freeyourgadget/Gadgetbridge/context:java) [![Total Alerts](https://img.shields.io/lgtm/alerts/g/Freeyourgadget/Gadgetbridge.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Freeyourgadget/Gadgetbridge/alerts)