diff --git a/CHANGELOG.md b/CHANGELOG.md
index 64adc34bb..14baf4985 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,11 @@
### Changelog
+#### Version 0.43.0
+* Initial support for Fossil Hybrid HR (needs complicated key extraction, read wiki)
+* Fossil: Allow switching off the Q Icon and use the default Gadgetbridge icon
+* Fix VoIP call handling during DND
+* Fix find-my-phone for Android 10
+* Huami: Fix crash when calendar event desctription or title was null
+* Huami: Igore all-day events when syncing calendar events
#### Version 0.42.1
* Fix accepting/rejecting calls on Android 9
diff --git a/README.md b/README.md
index 4cdefbedc..d22d0a34c 100644
--- a/README.md
+++ b/README.md
@@ -29,13 +29,14 @@ vendor's servers.
## Supported Devices (Some of them WIP and some of them without maintainer)
* Amazfit Bip [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Bip)
-* Amazfit Bip Lite (NOT RECOMMENDED, NEEDS MI FIT WITH ACCOUNT ONCE) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Bip-Lite)
+* Amazfit Bip Lite (WARNING: NEEDS MI FIT WITH ACCOUNT ONCE) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Bip-Lite)
* Amazfit Cor [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Cor)
* Amazfit Cor 2 [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Cor-2)
-* Amazfit GTR (NOT RECOMMENDED, NEEDS MI FIT WITH ACCOUNT ONCE) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-GTR)
-* Amazfit GTS (NOT RECOMMENDED, NEEDS MI FIT WITH ACCOUNT ONCE) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-GTS)
+* Amazfit GTR (WARNING: NEEDS MI FIT WITH ACCOUNT ONCE) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-GTR)
+* Amazfit GTS (WARNING: NEEDS MI FIT WITH ACCOUNT ONCE) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-GTS)
* BFH-16
* Casio GB-6900B
+* Fossil Hybrid HR (WARNING: NEEDS FOSSIL APP WITH ACCOUNT ONCE AND COMPLICATED PROCEDURE) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Fossil-Hybrid-HR)
* Fossil Q Hybrid
* HPlus Devices (e.g. ZeBand) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/HPlus)
* iTag
@@ -81,7 +82,7 @@ Please see [FEATURES.md](https://codeberg.org/Freeyourgadget/Gadgetbridge/src/ma
* Jean-François Greffier (Mi Scale 2)
* Johannes Schmitt (BFH-16)
* Lukas Schwichtenberg (Makibes HR3)
-* Daniel Dakhno (Fossil Q Hybrid)
+* Daniel Dakhno (Fossil Q Hybrid, Fossil Hybrid HR)
* Gordon Williams (Bangle.js)
* Pavel Elagin (JYou Y5)
* Taavi Eomäe (iTag)
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java
index b74575ba2..80cf5e004 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java
@@ -28,4 +28,6 @@ public class DeviceSettingsPreferenceConst {
public static final String PREF_BUTTON_1_FUNCTION = "button_1_function";
public static final String PREF_BUTTON_2_FUNCTION = "button_2_function";
public static final String PREF_BUTTON_3_FUNCTION = "button_3_function";
+ public static final String PREF_VIBRATION_STRENGH_PERCENTAGE = "vibration_strength";
+ public static final String PREF_RELAX_FIRMWARE_CHECKS = "relax_firmware_checks";
}
\ No newline at end of file
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 2c9ce0c49..dbd96d8a6 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
@@ -45,6 +45,7 @@ import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.Dev
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_DATEFORMAT;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_SCREEN_ORIENTATION;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_TIMEFORMAT;
+import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_VIBRATION_STRENGH_PERCENTAGE;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_WEARLOCATION;
import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_ACTIVATE_DISPLAY_ON_LIFT;
import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISCONNECT_NOTIFICATION;
@@ -319,6 +320,7 @@ public class DeviceSpecificSettingsFragment extends PreferenceFragmentCompat {
addPreferenceHandlerFor(PREF_BUTTON_1_FUNCTION);
addPreferenceHandlerFor(PREF_BUTTON_2_FUNCTION);
addPreferenceHandlerFor(PREF_BUTTON_3_FUNCTION);
+ addPreferenceHandlerFor(PREF_VIBRATION_STRENGH_PERCENTAGE);
String displayOnLiftState = prefs.getString(PREF_ACTIVATE_DISPLAY_ON_LIFT, PREF_DO_NOT_DISTURB_OFF);
boolean displayOnLiftScheduled = displayOnLiftState.equals(PREF_DO_NOT_DISTURB_SCHEDULED);
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipLiteCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipLiteCoordinator.java
index e104c514e..6fe18a135 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipLiteCoordinator.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipLiteCoordinator.java
@@ -26,7 +26,9 @@ import androidx.annotation.NonNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
+import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceCandidate;
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
@@ -63,4 +65,21 @@ public class AmazfitBipLiteCoordinator extends AmazfitBipCoordinator {
public int getBondingStyle() {
return BONDING_STYLE_REQUIRE_KEY;
}
+
+ @Override
+ public int[] getSupportedDeviceSpecificSettings(GBDevice device) {
+ return new int[]{
+ R.xml.devicesettings_amazfitbip,
+ R.xml.devicesettings_timeformat,
+ R.xml.devicesettings_wearlocation,
+ R.xml.devicesettings_custom_emoji_font,
+ R.xml.devicesettings_liftwrist_display,
+ R.xml.devicesettings_disconnectnotification,
+ R.xml.devicesettings_sync_calendar,
+ R.xml.devicesettings_expose_hr_thirdparty,
+ R.xml.devicesettings_buttonactions_with_longpress,
+ R.xml.devicesettings_pairingkey,
+ R.xml.devicesettings_relax_firmware_checks,
+ };
+ }
}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbips/AmazfitBipSCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbips/AmazfitBipSCoordinator.java
new file mode 100644
index 000000000..9acf0a5dd
--- /dev/null
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbips/AmazfitBipSCoordinator.java
@@ -0,0 +1,99 @@
+/* Copyright (C) 2017-2020 Andreas Shimokawa, Carsten Pfeiffer, Daniele
+ Gobbetti, João Paulo Barraca, Nephiel, vanous
+
+ This file is part of Gadgetbridge.
+
+ Gadgetbridge is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Gadgetbridge is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see . */
+package nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbips;
+
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+import android.net.Uri;
+
+import androidx.annotation.NonNull;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import nodomain.freeyourgadget.gadgetbridge.R;
+import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
+import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiCoordinator;
+import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
+import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceCandidate;
+import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
+
+public class AmazfitBipSCoordinator extends HuamiCoordinator {
+ private static final Logger LOG = LoggerFactory.getLogger(AmazfitBipSCoordinator.class);
+
+ @Override
+ public DeviceType getDeviceType() {
+ return DeviceType.AMAZFITBIPS;
+ }
+
+ @NonNull
+ @Override
+ public DeviceType getSupportedType(GBDeviceCandidate candidate) {
+ try {
+ BluetoothDevice device = candidate.getDevice();
+ String name = device.getName();
+ if (name != null && (name.equalsIgnoreCase("Amazfit Bip S"))) {
+ return DeviceType.AMAZFITBIPS;
+ }
+ } catch (Exception ex) {
+ LOG.error("unable to check device support", ex);
+ }
+ return DeviceType.UNKNOWN;
+ }
+
+ @Override
+ public InstallHandler findInstallHandler(Uri uri, Context context) {
+ return null;
+ }
+
+ @Override
+ public boolean supportsHeartRateMeasurement(GBDevice device) {
+ return true;
+ }
+
+ @Override
+ public boolean supportsActivityTracks() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsWeather() {
+ return true;
+ }
+
+ @Override
+ public int[] getSupportedDeviceSpecificSettings(GBDevice device) {
+ return new int[]{
+ R.xml.devicesettings_amazfitbip,
+ R.xml.devicesettings_timeformat,
+ R.xml.devicesettings_wearlocation,
+ R.xml.devicesettings_custom_emoji_font,
+ R.xml.devicesettings_liftwrist_display,
+ R.xml.devicesettings_disconnectnotification,
+ R.xml.devicesettings_sync_calendar,
+ R.xml.devicesettings_expose_hr_thirdparty,
+ R.xml.devicesettings_buttonactions_with_longpress,
+ R.xml.devicesettings_pairingkey
+ };
+ }
+
+ @Override
+ public int getBondingStyle() {
+ return BONDING_STYLE_REQUIRE_KEY;
+ }
+}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java
index e8b9e25e6..789c2f585 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java
@@ -43,6 +43,7 @@ public enum DeviceType {
AMAZFITBIP_LITE(17, R.drawable.ic_device_hplus, R.drawable.ic_device_hplus_disabled, R.string.devicetype_amazfit_bip_lite),
AMAZFITGTR(18, R.drawable.ic_device_hplus, R.drawable.ic_device_hplus_disabled, R.string.devicetype_amazfit_gtr),
AMAZFITGTS(19, R.drawable.ic_device_hplus, R.drawable.ic_device_hplus_disabled, R.string.devicetype_amazfit_gts),
+ AMAZFITBIPS(20, R.drawable.ic_device_hplus, R.drawable.ic_device_hplus_disabled, R.string.devicetype_amazfit_bips),
LIVEVIEW(30, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_liveview),
HPLUS(40, R.drawable.ic_device_hplus, R.drawable.ic_device_hplus_disabled, R.string.devicetype_hplus),
MAKIBESF68(41, R.drawable.ic_device_hplus, R.drawable.ic_device_hplus_disabled, R.string.devicetype_makibes_f68),
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java
index 858c34954..691dc0a30 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java
@@ -36,6 +36,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.casiogb6900.CasioGB6
import nodomain.freeyourgadget.gadgetbridge.service.devices.hplus.HPlusSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.AmazfitBipLiteSupport;
+import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.AmazfitBipSSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.AmazfitBipSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitgtr.AmazfitGTRSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitcor.AmazfitCorSupport;
@@ -148,6 +149,9 @@ public class DeviceSupportFactory {
case AMAZFITBIP_LITE:
deviceSupport = new ServiceDeviceSupport(new AmazfitBipLiteSupport(), EnumSet.of(ServiceDeviceSupport.Flags.BUSY_CHECKING));
break;
+ case AMAZFITBIPS:
+ deviceSupport = new ServiceDeviceSupport(new AmazfitBipSSupport(), EnumSet.of(ServiceDeviceSupport.Flags.BUSY_CHECKING));
+ break;
case AMAZFITGTR:
deviceSupport = new ServiceDeviceSupport(new AmazfitGTRSupport(), EnumSet.of(ServiceDeviceSupport.Flags.BUSY_CHECKING));
break;
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 6069ae144..7616846c6 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
@@ -1697,6 +1697,9 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
int iteration = 0;
for (CalendarEvents.CalendarEvent mEvt : mEvents) {
+ if (mEvt.isAllDay()) {
+ continue;
+ }
if (iteration >= availableSlots || iteration > 2) {
break;
}
@@ -1724,6 +1727,10 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
int iteration = 0;
for (CalendarEvents.CalendarEvent calendarEvent : calendarEvents) {
+ if (calendarEvent.isAllDay()) {
+ continue;
+ }
+
if (iteration > 8) { // limit ?
break;
}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipLiteFirmwareInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipLiteFirmwareInfo.java
index bfe279e8e..98607ec98 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipLiteFirmwareInfo.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipLiteFirmwareInfo.java
@@ -19,11 +19,14 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip;
import java.util.HashMap;
import java.util.Map;
+import nodomain.freeyourgadget.gadgetbridge.GBApplication;
+import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiFirmwareInfo;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiFirmwareType;
import nodomain.freeyourgadget.gadgetbridge.util.ArrayUtils;
+import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
public class AmazfitBipLiteFirmwareInfo extends HuamiFirmwareInfo {
@@ -66,6 +69,15 @@ public class AmazfitBipLiteFirmwareInfo extends HuamiFirmwareInfo {
if (searchString32BitAligned(bytes, "Amazfit Bip Lite")) {
return HuamiFirmwareType.FIRMWARE;
}
+ GBDevice device = GBApplication.app().getDeviceManager().getSelectedDevice();
+ if (device != null) {
+ Prefs prefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(device.getAddress()));
+ if (prefs.getBoolean(DeviceSettingsPreferenceConst.PREF_RELAX_FIRMWARE_CHECKS, false)) {
+ if (searchString32BitAligned(bytes, "Amazfit Bip")) {
+ return HuamiFirmwareType.FIRMWARE;
+ }
+ }
+ }
return HuamiFirmwareType.INVALID;
}
if (ArrayUtils.startsWith(bytes, WATCHFACE_HEADER)) {
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipSSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipSSupport.java
new file mode 100644
index 000000000..71b308efd
--- /dev/null
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipSSupport.java
@@ -0,0 +1,48 @@
+/* Copyright (C) 2017-2020 Andreas Shimokawa, Carsten Pfeiffer
+
+ This file is part of Gadgetbridge.
+
+ Gadgetbridge is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Gadgetbridge is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see . */
+package nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip;
+
+import android.content.Context;
+import android.net.Uri;
+
+import java.io.IOException;
+
+import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper;
+import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
+
+public class AmazfitBipSSupport extends AmazfitBipSupport {
+
+ @Override
+ public byte getCryptFlags() {
+ return (byte) 0x80;
+ }
+
+ @Override
+ public void onNotification(NotificationSpec notificationSpec) {
+ super.sendNotificationNew(notificationSpec, true);
+ }
+
+ @Override
+ protected byte getAuthFlags() {
+ return 0x00;
+ }
+
+ @Override
+ public HuamiFWHelper createFWHelper(Uri uri, Context context) throws IOException {
+ return null;
+ }
+}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil_hr/FossilHRWatchAdapter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil_hr/FossilHRWatchAdapter.java
index 41a5eaed8..ad8d955e0 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil_hr/FossilHRWatchAdapter.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil_hr/FossilHRWatchAdapter.java
@@ -106,7 +106,7 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
loadNotificationConfigurations();
queueWrite(new NotificationFilterPutHRRequest(this.notificationConfigurations, this));
- setVibrationStrength((short) 75);
+ setVibrationStrength();
syncSettings();
@@ -123,6 +123,15 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
queueWrite(new SetDeviceStateRequest(GBDevice.State.INITIALIZED));
}
+ private void setVibrationStrength() {
+ Prefs prefs = new Prefs(getDeviceSpecificPreferences());
+ int vibrationStrengh = prefs.getInt(DeviceSettingsPreferenceConst.PREF_VIBRATION_STRENGH_PERCENTAGE, 2);
+ if (vibrationStrengh > 0) {
+ vibrationStrengh = (vibrationStrengh + 1) * 25; // Seems 0,50,75,100 are working...
+ }
+ setVibrationStrength((short) (vibrationStrengh));
+ }
+
@Override
public void setVibrationStrength(short strength) {
negotiateSymmetricKey();
@@ -692,6 +701,9 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
case DeviceSettingsPreferenceConst.PREF_BUTTON_2_FUNCTION:
case DeviceSettingsPreferenceConst.PREF_BUTTON_3_FUNCTION:
overwriteButtons(null);
+ break;
+ case DeviceSettingsPreferenceConst.PREF_VIBRATION_STRENGH_PERCENTAGE:
+ setVibrationStrength();
}
}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/requests/fossil/notification/PlayNotificationRequest.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/requests/fossil/notification/PlayNotificationRequest.java
index 977c6e0d2..b3e0c9f09 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/requests/fossil/notification/PlayNotificationRequest.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/requests/fossil/notification/PlayNotificationRequest.java
@@ -19,6 +19,7 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fo
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.charset.Charset;
+import java.util.Arrays;
import java.util.zip.CRC32;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter;
@@ -57,7 +58,9 @@ public abstract class PlayNotificationRequest extends FilePutRequest {
byte[] senderBytes = nullTerminatedSender.getBytes(charsetUTF8);
String nullTerminatedMessage = StringUtils.terminateNull(message);
byte[] messageBytes = nullTerminatedMessage.getBytes(charsetUTF8);
-
+ if (messageBytes.length > 490) {
+ messageBytes = Arrays.copyOf(messageBytes, 490);
+ }
short mainBufferLength = (short) (lengthBufferLength + uidLength + appBundleCRCLength + titleBytes.length + senderBytes.length + messageBytes.length);
ByteBuffer mainBuffer = ByteBuffer.allocate(mainBufferLength);
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java
index e904758d1..cda97642a 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java
@@ -48,6 +48,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.hplus.EXRIZUK8Coordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.hplus.HPlusCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.hplus.MakibesF68Coordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipLiteCoordinator;
+import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbips.AmazfitBipSCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitgtr.AmazfitGTRCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitgts.AmazfitGTSCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.itag.ITagCoordinator;
@@ -216,6 +217,7 @@ public class DeviceHelper {
result.add(new AmazfitCor2Coordinator());
result.add(new AmazfitGTRCoordinator());
result.add(new AmazfitGTSCoordinator());
+ result.add(new AmazfitBipSCoordinator());
result.add(new MiBand3Coordinator());
result.add(new MiBand4Coordinator());
result.add(new MiBand2HRXCoordinator());
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 144d7a464..3fdf5b3a4 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -335,7 +335,7 @@
Accions del botó
Especifiqueu les accions en prémer el botó
Nombre de pulsacions del botó
- Nombre de vegades que cal prémer el botó per activar la difusió de missatge
+ Nombre de vegades que cal prémer el botó per activar un Esdeveniment 1. Després, prémer el mateix nombre de vegades crearà un Esdeveniment 2, i successivament.
Missatge de difusió a enviar
Activa el botó d\'acció
Activa un acció en prémer un botó un cert nombre de vegades
@@ -347,7 +347,7 @@
Notificació d\'objectiu
La polsera vibrarà quan l\'objectiu diari de passes siga assolit
Elements a mostrar
- Escolliu els elements a mostrar en la pantalla de la polsera
+ Escolliu els elements a mostrar a la pantalla de la polsera
Activa la pantalla en alçar-la
Gira el canell per canviar la informació
No molesteu
@@ -437,7 +437,7 @@
No enviïs l\'ACK de les dades d\'activitats
Si l\'arribada de les dades d\'activitats no és notificada a la polsera, aquestes dades no s\'eliminaran. Aquesta opció pot ser útil si feu servir el Gadgebridge també amb altres aplicacions.
Les dades d\'activitats de la Mi Band es guardaran fins i tot després de sincronitzar. Aquesta opció pot ser útil si feu servir el Gadgebridge també amb altres aplicacions.
- Messatge que s\'enviarà quan s\'hagi premut el botó el nombre de vegades establert
+ Difón el missatge enviat amb l\'esdeveniment. El paràmetre `button_id` és afegit automàticament a cada missatge.
Retard després d\'una acció de botó (el nombre és a l\'intent extra de button_id) o 0 per procedir immediatament
Desa dades sense processar a la base de dades
Desa les dades \"tal qual\", tot augmentant l\'ús de la base de dades per tal de permetre possibles interpretacions més tard.
@@ -793,4 +793,56 @@
Fes servir la teva banda per a reproduir el to del telèfon.
Aquest aparell requereix una clau d\'autenticació secreta, mantingueu premut sobre l\'aparell per a introduir-la. Consulteu la wiki.
Augmenta la velocitat de transferència, però pot ser que no funcioni en alguns aparells Android.
+ Fossil Q Hybrid
+ Configuració de Q Hybrid
+ Rellotge no connectat
+ intensitat de vibració:
+ Objectiu en passes
+ decalat horari
+ decalat del segon fus horari relatiu a UTC
+ sobreescriu els botons
+ utilitza la maneta d\'activitat com a comptador de notificacions
+ Si us plau, estableix el comptador de passes a un milió per a activar-ho.
+ Botons sobreescrits
+ Error al sobreescriure botons
+ decala el fus horari en
+ el canvi pot trigar uns segons…
+ temps decalat en
+ Desactiva el nou escaneig BLE
+ Marca aquesta opció si el teu aparell no pot ser trobat durant la detecció
+ Bangle.js
+ Y5
+ Acció d\'esdeveniment 1
+ Acció d\'esdeveniment 2
+ Acció d\'esdeveniment 3
+ Configuració detallada de premuda de botó
+ Acció de premuda llarga de botó
+ Posposa
+ S\'ha de permetre i activar l\'accés a la localitztació per al correcte funcionament de l\'escaneig
+ iTag
+ Permet una alta MTU
+ Activa les alertes de calendari, fins i tot quan estigui desconnectat
+ Sincronitza els esdeveniments del calendari
+ Ritme cardíac
+ Passes
+ Data
+ Minuts actius
+ Calories
+ Bateria
+ El temps
+ Res
+ Trobat!
+ Força l\'esquema de color blanc sobre negre
+ Útil si si el teu rellotge té les manetes negres
+ Troba el meu telèfon
+ Notificacions de Gadgetbridge d\'alta prioritat
+ Mostra l\'icona de notificació específica de l\'aparell
+ Mostra l\'icona de notificació d\'Android específica de l\'aparell enlloc de l\'icona de Gadgetbridge quan estigui connectat
+ Benestar
+ Entrenament
+ Cronòmetre
+ Desplçament
+ Botó superior
+ Botó mitger
+ Botó inferior
\ No newline at end of file
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 45b125244..10f5a1199 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -845,4 +845,14 @@
Gefunden!
Schwarz-Weiß-Farbschema erzwingen
Nützlich, wenn deine Uhr dunkle Zeiger hat
+ Mein Telefon finden
+ Gadgetbridge-Benachrichtigungen mit hoher Priorität
+ Gerätespezifisches Benachrichtigungssymbol anzeigen
+ Zeige ein gerätespezifisches Android-Benachrichtigungssymbol anstelle des Gadgetbridge-Symbols, wenn eine Verbindung besteht
+ Wellness
+ Training
+ Stoppuhr
+ Obere Taste
+ Mittlere Taste
+ Untere Taste
\ No newline at end of file
diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml
index 992426208..eb828e2ec 100644
--- a/app/src/main/res/values-he/strings.xml
+++ b/app/src/main/res/values-he/strings.xml
@@ -838,4 +838,15 @@
מצאתי!
לאכוף ערכת צבעים שחור על לבן
שימושי לידיים כהות
+ איתור הטלפון שלי
+ התראות מ־Gadgetbridge בעדיפות גבוהה
+ הצגת סמל התראה ייעודי למכשיר
+ הצגת התראת Android תואמת מכשיר במקום הסמל של Gadgetbridge כשיש חיבור
+ רווחה
+ אימון
+ שעון עצר
+ התניידות
+ כפתור עליון
+ כפתור אמצעי
+ כפתור תחתון
\ No newline at end of file
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 2c526e21f..51b13ea2f 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -836,4 +836,15 @@
Gevonden!
Zwart op wit kleurenschema forceren
Nuttig als je horloge donkere wijzers heeft
+ Vind mijn telefoon
+ Gadgetbridge hoge prioriteit meldingen
+ Toon apparaat specifieke meldingspictogram
+ Toon een apparaatspecifiek Android-meldpictogram in plaats van het Gadgetbridge-pictogram indien verbonden
+ Welzijn
+ Training
+ Stopwatch
+ Woon-werkverkeer
+ Bovenste knop
+ Middelste knop
+ Onderste knop
\ No newline at end of file
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 6d7ff4cd4..a8763b31a 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -848,4 +848,15 @@
Encontrei!
Forçar preto no esquema de cores branco
Útil se seu relógio possui ponteiros escuros
+ Localizar meu telefone
+ Notificações de Gadgetbridge de alta prioridade
+ Mostrar ícone de notificação específica do dispositivo
+ Mostra o ícone de notificação Android específico de um dispositivo em vez do ícone do Gadgetbridge quando conectado
+ Bem-estar
+ Treino
+ Cronômetro
+ Comutar
+ Botão superior
+ Botão do meio
+ Botão inferior
\ No newline at end of file
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index de90c736f..012ea5aee 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -823,4 +823,9 @@
iTag
Разрешить высокий MTU
Увеличивает скорость передачи данных, но может не работать на некоторых Android-устройствах.
+ Включает уведомления календаря, даже когда отключено
+ Синхронизировать события в календаре
+ Найти телефон
+ Показывать собственную иконку устройства
+ При подключении показывать в уведомлении собственную иконку устройства вместо иконки Gadgetbridge
\ No newline at end of file
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index e141dca60..16d63a097 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -838,4 +838,13 @@
如果您双手颜色较深,将会有帮助
查找我的手机
Gadgetbridge 通知高优先级
+ 显示设备特定的通知图标
+ 显示设备指定的 Android 通知图标以替代已连接时的 Gadgetbridge 图标
+ 健康
+ 健身
+ 秒表
+ 通勤
+ 上按钮
+ 中按钮
+ 下按钮
\ No newline at end of file
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 86e4e6d5d..87526176f 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -401,4 +401,71 @@
您即將安裝 %s。
裝置電量不足!
%1$s 電量剩餘:%2$s%%
+ 經度
+ 螢幕逾時
+ 螢幕逾時(秒)
+ 最低心率
+ 測試
+ 無法連線。藍芽位址無效?
+ 不適用
+ 正在與 %s 配對…
+ 未輸入 MAC 位址,無法配對。
+ 未提供有效的使用者資料,目前使用假定資料。
+ 請確認您的裝置可以被偵測到。已連接的裝置將無法被偵測。請在 Android 6 以上的裝置啟用位置權限(如:GPS)。請對 Gadgetbridge 停用隱私守衛,因為這可能會導致您的手機崩潰並重新啟動。如果在數分鐘後仍未找到任何裝置,請重新啟動您的手機並再試一次。
+ 備註:
+ 正在初始化
+ 低電量警告
+ 取消以停止振動。
+ 上次充電:%s
+\n
+ 匯出資料庫失敗!請檢查您的設定值。
+ 韌體安裝完成
+ 韌體安裝完成,正在重啟裝置…
+ 步數
+ 卡路里
+ 距離
+ 尋找手機
+ 正在安裝韌體
+ 您確定要匯入資料?
+ 匯入資料庫時發生錯誤:%1$s
+ 資料已刪除。
+ 資料庫的自動匯出位置已設定為:
+ 自動匯出
+ 立即執行自動匯出
+ 正在匯出資料庫…
+ 取消
+ 刪除
+ 配對
+ 運動
+ GPS 誤差校正
+ 資源包
+ 未知的裝置
+ 測試用裝置
+ 支付寶(捷徑)
+ 鬧鐘
+ 支付寶
+ 通知過濾
+ 輸入要進行比對的字,使用換行作為分隔
+ 通知過濾已儲存
+ 不過濾
+ 在包含這些字時顯示
+ 在包含這些字時隱藏
+ 部份符合
+ 完全符合
+ 請至少輸入一個字
+ 過濾模式
+ 模式設定
+ 新增小工具
+ 貪睡
+ 允許較高的 MTU 值
+ 提高傳送速度,但可能無法在某些 Android 裝置上使用。
+ 啟用日曆事件通知,即便在未連線時
+ 同步日曆事件
+ 心率
+ 步數
+ 日期
+ 電量
+ 天氣
+ 找到了!
+ 尋找我的手機
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ab354ee0f..6f3901e4e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -186,6 +186,9 @@
Increases transfer speed, but might not work on some Android devices.
Enables calendar alerts, even when disconnected
Sync calendar events
+ Relax firmware checks
+ Enable this if you want to flash a firmware not intended for you device (at your own risk)
+ Vibration strength
Connect new device button
Always visible
Visible only if no device is added
@@ -678,6 +681,7 @@
Amazfit Cor
Amazfit Cor 2
Amazfit GTR
+ Amazfit Bip S
Vibratissimo
LiveView
HPlus
diff --git a/app/src/main/res/xml/changelog_master.xml b/app/src/main/res/xml/changelog_master.xml
index 5f6349d9b..ed8f95ab3 100644
--- a/app/src/main/res/xml/changelog_master.xml
+++ b/app/src/main/res/xml/changelog_master.xml
@@ -1,5 +1,13 @@
+
+ Initial support for Fossil Hybrid HR (needs complicated key extraction, read wiki)
+ Fossil: Allow switching off the Q Icon and use the default Gadgetbridge icon
+ Fix VoIP call handling during DND
+ Fix find-my-phone for Android 10
+ Huami: Fix crash when calendar event desctription or title was null
+ Huami: Igore all-day events when syncing calendar events
+
Fix accepting/rejecting calls on Android 9
Mi Band 3/4, Amazfit Bip/Cor/GTS/GTR: Option to sync calender events as reminder
diff --git a/app/src/main/res/xml/devicesettings_fossilhybridhr.xml b/app/src/main/res/xml/devicesettings_fossilhybridhr.xml
index a2a2e608b..4217e9401 100644
--- a/app/src/main/res/xml/devicesettings_fossilhybridhr.xml
+++ b/app/src/main/res/xml/devicesettings_fossilhybridhr.xml
@@ -1,5 +1,6 @@
-
+
+
+
diff --git a/app/src/main/res/xml/devicesettings_relax_firmware_checks.xml b/app/src/main/res/xml/devicesettings_relax_firmware_checks.xml
new file mode 100644
index 000000000..aad1eca53
--- /dev/null
+++ b/app/src/main/res/xml/devicesettings_relax_firmware_checks.xml
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/fastlane/metadata/android/en-US/changelogs/169.txt b/fastlane/metadata/android/en-US/changelogs/169.txt
new file mode 100644
index 000000000..88e4575e0
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/169.txt
@@ -0,0 +1,6 @@
+* Initial support for Fossil Hybrid HR (needs complicated key extraction, read wiki)
+* Fossil: Allow switching off the Q Icon and use the default Gadgetbridge icon
+* Fix VoIP call handling during DND
+* Fix find-my-phone for Android 10
+* Huami: Fix crash when calendar event desctription or title was null
+* Huami: Igore all-day events when syncing calendar events