mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-11-25 19:36:50 +01:00
Fix bug in non-DST time where still being in DST was assumed
This affects InfiniTime and Huami For InfiniTime it probably resulted in the wrong time being displayed For Huami is resulted to request the wrong data from the band/watch We used timezone.getDSTOffset() which always returns the DST offset (also in non DST time) We need to pass the time being observed to calendar.getOffset() to get the real offset including DST at that specfic time which then either includes DST offset or not.
This commit is contained in:
parent
5ff08a031d
commit
998f8775d9
@ -219,18 +219,21 @@ public class BLETypeConversions {
|
||||
* @return sint8 value from -48..+56
|
||||
*/
|
||||
public static byte mapTimeZone(TimeZone timeZone) {
|
||||
return mapTimeZone(timeZone, TZ_FLAG_NONE);
|
||||
int offsetMillis = timeZone.getRawOffset();
|
||||
int utcOffsetInQuarterHours = (offsetMillis / (1000 * 60 * 15));
|
||||
return (byte) utcOffsetInQuarterHours;
|
||||
}
|
||||
|
||||
/**
|
||||
* https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.time_zone.xml
|
||||
* @param timeZone
|
||||
*
|
||||
* @param calendar
|
||||
* @return sint8 value from -48..+56
|
||||
*/
|
||||
public static byte mapTimeZone(TimeZone timeZone, int timezoneFlags) {
|
||||
int offsetMillis = timeZone.getRawOffset();
|
||||
public static byte mapTimeZone(Calendar calendar, int timezoneFlags) {
|
||||
int offsetMillis = calendar.getTimeZone().getRawOffset();
|
||||
if (timezoneFlags == TZ_FLAG_INCLUDE_DST_IN_TZ) {
|
||||
offsetMillis += timeZone.getDSTSavings();
|
||||
offsetMillis = calendar.getTimeZone().getOffset(calendar.getTimeInMillis());
|
||||
}
|
||||
int utcOffsetInQuarterHours = (offsetMillis / (1000 * 60 * 15));
|
||||
return (byte) utcOffsetInQuarterHours;
|
||||
|
@ -324,7 +324,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
||||
} else {
|
||||
throw new IllegalArgumentException("Unsupported precision, only MINUTES and SECONDS are supported till now");
|
||||
}
|
||||
byte[] tail = new byte[] { 0, BLETypeConversions.mapTimeZone(calendar.getTimeZone(), BLETypeConversions.TZ_FLAG_INCLUDE_DST_IN_TZ) };
|
||||
byte[] tail = new byte[] { 0, BLETypeConversions.mapTimeZone(calendar, BLETypeConversions.TZ_FLAG_INCLUDE_DST_IN_TZ) };
|
||||
// 0 = adjust reason bitflags? or DST offset?? , timezone
|
||||
// byte[] tail = new byte[] { 0x2 }; // reason
|
||||
byte[] all = BLETypeConversions.join(bytes, tail);
|
||||
|
@ -288,7 +288,7 @@ public class PineTimeJFSupport extends AbstractBTLEDeviceSupport implements DfuL
|
||||
// Since this is a standard we should generalize this in Gadgetbridge (properly)
|
||||
GregorianCalendar now = BLETypeConversions.createCalendar();
|
||||
byte[] bytes = BLETypeConversions.calendarToRawBytes(now);
|
||||
byte[] tail = new byte[]{0, BLETypeConversions.mapTimeZone(now.getTimeZone(), BLETypeConversions.TZ_FLAG_INCLUDE_DST_IN_TZ)};
|
||||
byte[] tail = new byte[]{0, BLETypeConversions.mapTimeZone(now, BLETypeConversions.TZ_FLAG_INCLUDE_DST_IN_TZ)};
|
||||
byte[] all = BLETypeConversions.join(bytes, tail);
|
||||
|
||||
TransactionBuilder builder = new TransactionBuilder("set time");
|
||||
|
Loading…
Reference in New Issue
Block a user