From c87d08bf4b9a369f3ad2c5ce913015620b5fe627 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Thu, 20 Oct 2016 20:08:17 +0200 Subject: [PATCH 1/7] Small refactoring for initial support for Mi2 Alarms #323 --- .../gadgetbridge/SleepAlarmWidget.java | 8 ++--- .../devices/miband/MiBand2Coordinator.java | 2 +- .../devices/miband/MiBand2Service.java | 2 +- .../gadgetbridge/impl/GBAlarm.java | 8 +++-- .../devices/miband/MiBand2Support.java | 30 +++++++------------ .../service/devices/miband/MiBandSupport.java | 19 ++---------- 6 files changed, 25 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java index 552871c9..1c8ed55a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepAlarmWidget.java @@ -17,7 +17,6 @@ import java.util.GregorianCalendar; import nodomain.freeyourgadget.gadgetbridge.activities.ConfigureAlarms; import nodomain.freeyourgadget.gadgetbridge.impl.GBAlarm; import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser; -import nodomain.freeyourgadget.gadgetbridge.model.Alarm; import nodomain.freeyourgadget.gadgetbridge.util.GB; /** @@ -77,17 +76,18 @@ public class SleepAlarmWidget extends AppWidgetProvider { // add preferred sleep duration calendar.add(Calendar.HOUR_OF_DAY, userSleepDuration); - int hours = calendar.get(calendar.HOUR_OF_DAY); - int minutes = calendar.get(calendar.MINUTE); // overwrite the first alarm and activate it - GBAlarm alarm = new GBAlarm(0, true, true, Alarm.ALARM_ONCE, hours, minutes); + GBAlarm alarm = GBAlarm.createSingleShot(0, true, calendar); alarm.store(); if (GBApplication.isRunningLollipopOrLater()) { setAlarmViaAlarmManager(context, calendar.getTimeInMillis()); } + int hours = calendar.get(Calendar.HOUR_OF_DAY); + int minutes = calendar.get(Calendar.MINUTE); + GB.toast(context, String.format(context.getString(R.string.appwidget_alarms_set), hours, minutes), Toast.LENGTH_SHORT, GB.INFO); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Coordinator.java index 3de8fea9..32957537 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Coordinator.java @@ -43,7 +43,7 @@ public class MiBand2Coordinator extends MiBandCoordinator { @Override public boolean supportsAlarmConfiguration() { - return false; // not yet + return true; } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Service.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Service.java index 0051e3d4..a893d0aa 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Service.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Service.java @@ -17,7 +17,7 @@ public class MiBand2Service { public static final UUID UUID_UNKNOWN_CHARACTERISTIC1 = UUID.fromString("00000001-0000-3512-2118-0009af100700"); public static final UUID UUID_UNKNOWN_CHARACTERISTIC2 = UUID.fromString("00000002-0000-3512-2118-0009af100700"); public static final UUID UUID_UNKNOWN_CHARACTERISTIC3 = UUID.fromString("00000003-0000-3512-2118-0009af100700"); - public static final UUID UUID_UNKNOWN_CHARACTERISTIC4 = UUID.fromString("00000004-0000-3512-2118-0009af100700"); + public static final UUID UUID_UNKNOWN_CHARACTERISTIC4 = UUID.fromString("00000004-0000-3512-2118-0009af100700"); // Alarm related public static final UUID UUID_UNKNOWN_CHARACTERISTIC5 = UUID.fromString("00000005-0000-3512-2118-0009af100700"); public static final UUID UUID_UNKNOWN_CHARACTERISTIC6 = UUID.fromString("00000006-0000-3512-2118-0009af100700"); public static final UUID UUID_UNKNOWN_CHARACTERISTIC7 = UUID.fromString("00000007-0000-3512-2118-0009af100700"); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBAlarm.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBAlarm.java index 546bcee2..3a14da2b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBAlarm.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBAlarm.java @@ -27,7 +27,7 @@ public class GBAlarm implements Alarm { public static final String[] DEFAULT_ALARMS = {"2,false,false,0,15,30", "1,false,false,96,8,0", "0,false,true,31,7,30"}; - public GBAlarm(int index, boolean enabled, boolean smartWakeup, byte repetition, int hour, int minute) { + public GBAlarm(int index, boolean enabled, boolean smartWakeup, int repetition, int hour, int minute) { this.index = index; this.enabled = enabled; this.smartWakeup = smartWakeup; @@ -47,6 +47,10 @@ public class GBAlarm implements Alarm { this.minute = Integer.parseInt(tokens[5]); } + public static GBAlarm createSingleShot(int index, boolean smartWakeup, Calendar calendar) { + return new GBAlarm(index, true, smartWakeup, Alarm.ALARM_ONCE, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE)); + } + private static GBAlarm readFromParcel(Parcel pc) { int index = pc.readInt(); boolean enabled = Boolean.parseBoolean(pc.readString()); @@ -54,7 +58,7 @@ public class GBAlarm implements Alarm { int repetition = pc.readInt(); int hour = pc.readInt(); int minute = pc.readInt(); - return new GBAlarm(index, enabled, smartWakeup, (byte) repetition, hour, minute); + return new GBAlarm(index, enabled, smartWakeup, repetition, hour, minute); } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java index 159e61a7..d9bdb5b5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java @@ -33,6 +33,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandDateConverter; import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandFWHelper; import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandService; import nodomain.freeyourgadget.gadgetbridge.devices.miband.VibrationProfile; +import nodomain.freeyourgadget.gadgetbridge.impl.GBAlarm; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice.State; import nodomain.freeyourgadget.gadgetbridge.model.Alarm; @@ -226,6 +227,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { builder.notify(getCharacteristic(GattService.UUID_SERVICE_CURRENT_TIME), enable); // Notify CHARACTERISTIC9 to receive random auth code builder.notify(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_AUTH), enable); + builder.notify(getCharacteristic(MiBand2Service.UUID_UNKNOWN_CHARACTERISTIC4), enable); return this; } @@ -532,7 +534,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { @Override public void onSetAlarms(ArrayList alarms) { try { - BluetoothGattCharacteristic characteristic = getCharacteristic(MiBandService.UUID_CHARACTERISTIC_CONTROL_POINT); + BluetoothGattCharacteristic characteristic = getCharacteristic(MiBand2Service.UUID_UNKNOWN_CHARACTERISTIC4); TransactionBuilder builder = performInitialized("Set alarm"); boolean anyAlarmEnabled = false; for (Alarm alarm : alarms) { @@ -1054,6 +1056,8 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { // } } + private void queueAlarm(Calendar calender, boolean enabled, boolean smartWakeup, TransactionBuilder builder, BluetoothGattCharacteristic characteristic) { + } /** * Convert an alarm from the GB internal structure to a Mi Band message and put on the specified * builder queue as a write message for the passed characteristic @@ -1066,16 +1070,16 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { byte[] alarmCalBytes = MiBandDateConverter.calendarToRawBytes(alarm.getAlarmCal()); byte[] alarmMessage = new byte[]{ - MiBandService.COMMAND_SET_TIMER, - (byte) alarm.getIndex(), +// MiBandService.COMMAND_SET_TIMER, (byte) (alarm.isEnabled() ? 1 : 0), + (byte) alarm.getIndex(), alarmCalBytes[0], alarmCalBytes[1], alarmCalBytes[2], alarmCalBytes[3], alarmCalBytes[4], alarmCalBytes[5], - (byte) (alarm.isSmartWakeup() ? 30 : 0), + (byte) (alarm.isSmartWakeup() ? 38 : 0), (byte) alarm.getRepetitionMask() }; builder.write(characteristic, alarmMessage); @@ -1181,22 +1185,8 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { int slotToUse = 2 - iteration; Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(mEvt.getBegin()); - byte[] calBytes = MiBandDateConverter.calendarToRawBytes(calendar); - - byte[] alarmMessage = new byte[]{ - MiBandService.COMMAND_SET_TIMER, - (byte) slotToUse, - (byte) 1, - calBytes[0], - calBytes[1], - calBytes[2], - calBytes[3], - calBytes[4], - calBytes[5], - (byte) 0, - (byte) 0 - }; - builder.write(characteristic, alarmMessage); + Alarm alarm = GBAlarm.createSingleShot(slotToUse, false, calendar); + queueAlarm(alarm, builder, characteristic); iteration++; } builder.queue(getQueue()); 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 cb39f701..c3dc5bee 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 @@ -37,6 +37,7 @@ import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession; import nodomain.freeyourgadget.gadgetbridge.entities.Device; import nodomain.freeyourgadget.gadgetbridge.entities.MiBandActivitySample; import nodomain.freeyourgadget.gadgetbridge.entities.User; +import nodomain.freeyourgadget.gadgetbridge.impl.GBAlarm; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice.State; import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; @@ -1193,22 +1194,8 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { int slotToUse = 2 - iteration; Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(mEvt.getBegin()); - byte[] calBytes = MiBandDateConverter.calendarToRawBytes(calendar); - - byte[] alarmMessage = new byte[]{ - MiBandService.COMMAND_SET_TIMER, - (byte) slotToUse, - (byte) 1, - calBytes[0], - calBytes[1], - calBytes[2], - calBytes[3], - calBytes[4], - calBytes[5], - (byte) 0, - (byte) 0 - }; - builder.write(characteristic, alarmMessage); + Alarm alarm = GBAlarm.createSingleShot(slotToUse, false, calendar); + queueAlarm(alarm, builder, characteristic); iteration++; } builder.queue(getQueue()); From 839da4f06acc9dc1aa575bdb760b5200c87d3b94 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Thu, 20 Oct 2016 21:42:36 +0200 Subject: [PATCH 2/7] Shuffle some logging things around --- .../freeyourgadget/gadgetbridge/Logging.java | 8 +++++ .../btle/AbstractBTLEDeviceSupport.java | 34 ++++++++++++++----- .../devices/miband/MiBand2Support.java | 15 +------- .../service/devices/miband/MiBandSupport.java | 16 ++------- .../vibratissimo/VibratissimoSupport.java | 1 + 5 files changed, 37 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Logging.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Logging.java index 7ea3c8e9..75504d79 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Logging.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Logging.java @@ -125,4 +125,12 @@ public abstract class Logging { } return false; } + + public static void logBytes(Logger logger, byte[] value) { + if (value != null) { + for (byte b : value) { + logger.warn("DATA: " + String.format("0x%2x", b)); + } + } + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractBTLEDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractBTLEDeviceSupport.java index c65262c2..e87c50e3 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractBTLEDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractBTLEDeviceSupport.java @@ -6,7 +6,6 @@ import android.bluetooth.BluetoothGattDescriptor; import android.bluetooth.BluetoothGattService; import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.ArrayList; @@ -16,6 +15,7 @@ import java.util.List; import java.util.Set; import java.util.UUID; +import nodomain.freeyourgadget.gadgetbridge.Logging; import nodomain.freeyourgadget.gadgetbridge.service.AbstractDeviceSupport; import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.CheckInitializedAction; import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.AbstractBleProfile; @@ -32,15 +32,21 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.AbstractBlePro * @see BtLEQueue */ public abstract class AbstractBTLEDeviceSupport extends AbstractDeviceSupport implements GattCallback { - private static final Logger LOG = LoggerFactory.getLogger(AbstractBTLEDeviceSupport.class); - private BtLEQueue mQueue; private HashMap mAvailableCharacteristics; private final Set mSupportedServices = new HashSet<>(4); - private final List> mSupportedProfiles = new ArrayList<>(); + private Logger logger; + private final List> mSupportedProfiles = new ArrayList<>(); public static final String BASE_UUID = "0000%s-0000-1000-8000-00805f9b34fb"; //this is common for all BTLE devices. see http://stackoverflow.com/questions/18699251/finding-out-android-bluetooth-le-gatt-profiles + public AbstractBTLEDeviceSupport(Logger logger) { + this.logger = logger; + if (logger == null) { + throw new IllegalArgumentException("logger must not be null"); + } + } + @Override public boolean connect() { if (mQueue == null) { @@ -168,27 +174,27 @@ public abstract class AbstractBTLEDeviceSupport extends AbstractDeviceSupport im private void gattServicesDiscovered(List discoveredGattServices) { if (discoveredGattServices == null) { - LOG.warn("No gatt services discovered: null!"); + logger.warn("No gatt services discovered: null!"); return; } Set supportedServices = getSupportedServices(); mAvailableCharacteristics = new HashMap<>(); for (BluetoothGattService service : discoveredGattServices) { if (supportedServices.contains(service.getUuid())) { - LOG.debug("discovered supported service: " + BleNamesResolver.resolveServiceName(service.getUuid().toString()) + ": " + service.getUuid()); + logger.debug("discovered supported service: " + BleNamesResolver.resolveServiceName(service.getUuid().toString()) + ": " + service.getUuid()); List characteristics = service.getCharacteristics(); if (characteristics == null || characteristics.isEmpty()) { - LOG.warn("Supported LE service " + service.getUuid() + "did not return any characteristics"); + logger.warn("Supported LE service " + service.getUuid() + "did not return any characteristics"); continue; } HashMap intmAvailableCharacteristics = new HashMap<>(characteristics.size()); for (BluetoothGattCharacteristic characteristic : characteristics) { intmAvailableCharacteristics.put(characteristic.getUuid(), characteristic); - LOG.info(" characteristic: " + BleNamesResolver.resolveCharacteristicName(characteristic.getUuid().toString()) + ": " + characteristic.getUuid()); + logger.info(" characteristic: " + BleNamesResolver.resolveCharacteristicName(characteristic.getUuid().toString()) + ": " + characteristic.getUuid()); } mAvailableCharacteristics.putAll(intmAvailableCharacteristics); } else { - LOG.debug("discovered unsupported service: " + BleNamesResolver.resolveServiceName(service.getUuid().toString()) + ": " + service.getUuid()); + logger.debug("discovered unsupported service: " + BleNamesResolver.resolveServiceName(service.getUuid().toString()) + ": " + service.getUuid()); } } } @@ -197,6 +203,16 @@ public abstract class AbstractBTLEDeviceSupport extends AbstractDeviceSupport im return mSupportedServices; } + /** + * Utility method that may be used to log incoming messages when we don't know how to deal with them yet. + * + * @param value + */ + public void logMessageContent(byte[] value) { + logger.info("RECEIVED DATA WITH LENGTH: " + ((value != null) ? value.length : "(null)")); + Logging.logBytes(logger, value); + } + // default implementations of event handler methods (gatt callbacks) @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java index d9bdb5b5..50705976 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java @@ -106,6 +106,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { private final GBDeviceEventBatteryInfo batteryCmd = new GBDeviceEventBatteryInfo(); public MiBand2Support() { + super(LOG); addSupportedService(GattService.UUID_SERVICE_GENERIC_ACCESS); addSupportedService(GattService.UUID_SERVICE_GENERIC_ATTRIBUTE); addSupportedService(GattService.UUID_SERVICE_HEART_RATE); @@ -917,20 +918,6 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { return false; } - /** - * Utility method that may be used to log incoming messages when we don't know how to deal with them yet. - * - * @param value - */ - public void logMessageContent(byte[] value) { - LOG.info("RECEIVED DATA WITH LENGTH: " + ((value != null) ? value.length : "(null)")); - if (value != null) { - for (byte b : value) { - LOG.warn("DATA: " + String.format("0x%2x", b)); - } - } - } - public void logDate(byte[] value, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { GregorianCalendar calendar = MiBandDateConverter.rawBytesToCalendar(value); 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 c3dc5bee..7ae98b72 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 @@ -20,6 +20,7 @@ import java.util.List; import java.util.UUID; import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.Logging; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; import nodomain.freeyourgadget.gadgetbridge.database.DBHelper; @@ -103,6 +104,7 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { private RealtimeSamplesSupport realtimeSamplesSupport; public MiBandSupport() { + super(LOG); addSupportedService(GattService.UUID_SERVICE_GENERIC_ACCESS); addSupportedService(GattService.UUID_SERVICE_GENERIC_ATTRIBUTE); addSupportedService(MiBandService.UUID_SERVICE_MIBAND_SERVICE); @@ -873,20 +875,6 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { return false; } - /** - * Utility method that may be used to log incoming messages when we don't know how to deal with them yet. - * - * @param value - */ - public void logMessageContent(byte[] value) { - LOG.info("RECEIVED DATA WITH LENGTH: " + ((value != null) ? value.length : "(null)")); - if (value != null) { - for (byte b : value) { - LOG.warn("DATA: " + String.format("0x%2x", b)); - } - } - } - public void logDate(byte[] value, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { GregorianCalendar calendar = MiBandDateConverter.rawBytesToCalendar(value); 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 cacd8658..e53d63b8 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 @@ -53,6 +53,7 @@ public class VibratissimoSupport extends AbstractBTLEDeviceSupport { }; public VibratissimoSupport() { + super(LOG); addSupportedService(GattService.UUID_SERVICE_GENERIC_ACCESS); addSupportedService(GattService.UUID_SERVICE_GENERIC_ATTRIBUTE); addSupportedService(GattService.UUID_SERVICE_DEVICE_INFORMATION); From 15954d4561904a362bbea0815ddfb8f3b9a50984 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Fri, 21 Oct 2016 00:49:42 +0200 Subject: [PATCH 3/7] Initial support for alarms (one, atm) #323 (repetitinos not tested yet) --- .../devices/miband/MiBand2Support.java | 56 +++++++++++++------ 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java index 50705976..39956923 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java @@ -228,6 +228,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { builder.notify(getCharacteristic(GattService.UUID_SERVICE_CURRENT_TIME), enable); // Notify CHARACTERISTIC9 to receive random auth code builder.notify(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_AUTH), enable); + builder.notify(getCharacteristic(MiBand2Service.UUID_UNKNOWN_CHARACTERISTIC3), enable); builder.notify(getCharacteristic(MiBand2Service.UUID_UNKNOWN_CHARACTERISTIC4), enable); return this; } @@ -535,7 +536,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { @Override public void onSetAlarms(ArrayList alarms) { try { - BluetoothGattCharacteristic characteristic = getCharacteristic(MiBand2Service.UUID_UNKNOWN_CHARACTERISTIC4); + BluetoothGattCharacteristic characteristic = getCharacteristic(MiBand2Service.UUID_UNKNOWN_CHARACTERISTIC3); TransactionBuilder builder = performInitialized("Set alarm"); boolean anyAlarmEnabled = false; for (Alarm alarm : alarms) { @@ -1043,8 +1044,6 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { // } } - private void queueAlarm(Calendar calender, boolean enabled, boolean smartWakeup, TransactionBuilder builder, BluetoothGattCharacteristic characteristic) { - } /** * Convert an alarm from the GB internal structure to a Mi Band message and put on the specified * builder queue as a write message for the passed characteristic @@ -1054,22 +1053,43 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { * @param characteristic */ private void queueAlarm(Alarm alarm, TransactionBuilder builder, BluetoothGattCharacteristic characteristic) { - byte[] alarmCalBytes = MiBandDateConverter.calendarToRawBytes(alarm.getAlarmCal()); + Calendar calendar = alarm.getAlarmCal(); + int daysMask = 0; - byte[] alarmMessage = new byte[]{ -// MiBandService.COMMAND_SET_TIMER, - (byte) (alarm.isEnabled() ? 1 : 0), - (byte) alarm.getIndex(), - alarmCalBytes[0], - alarmCalBytes[1], - alarmCalBytes[2], - alarmCalBytes[3], - alarmCalBytes[4], - alarmCalBytes[5], - (byte) (alarm.isSmartWakeup() ? 38 : 0), - (byte) alarm.getRepetitionMask() + if (alarm.isEnabled()) { + if (alarm.getRepetition(Alarm.ALARM_MON)) { + daysMask |= 1; + } + if (alarm.getRepetition(Alarm.ALARM_TUE)) { + daysMask |= 2; + } + if (alarm.getRepetition(Alarm.ALARM_WED)) { + daysMask |= 4; + } + if (alarm.getRepetition(Alarm.ALARM_THU)) { + daysMask |= 8; + } + if (alarm.getRepetition(Alarm.ALARM_FRI)) { + daysMask |= 16; + } + if (alarm.getRepetition(Alarm.ALARM_SAT)) { + daysMask |= 32; + } + if (alarm.getRepetition(Alarm.ALARM_SUN)) { + daysMask |= 64; + } + } + + byte[] alarmMessage = new byte[] { + (byte) 0x2, // TODO what is this? 0x1 does not work + (byte) 128, // TODO: what is this? + (byte) calendar.get(Calendar.HOUR_OF_DAY), + (byte) calendar.get(Calendar.MINUTE), + (byte) daysMask, }; - builder.write(characteristic, alarmMessage); + if (alarm.isEnabled()) { + builder.write(characteristic, alarmMessage); + } } private void handleControlPointResult(byte[] value, int status) { @@ -1155,7 +1175,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { private void sendCalendarEvents() { try { TransactionBuilder builder = performInitialized("Send upcoming events"); - BluetoothGattCharacteristic characteristic = getCharacteristic(MiBandService.UUID_CHARACTERISTIC_CONTROL_POINT); + BluetoothGattCharacteristic characteristic = getCharacteristic(MiBand2Service.UUID_UNKNOWN_CHARACTERISTIC3); Prefs prefs = GBApplication.getPrefs(); int availableSlots = prefs.getInt(MiBandConst.PREF_MIBAND_RESERVE_ALARM_FOR_CALENDAR, 0); From ee24443b6ab7f8540bb9e0df7f5e51872d38d543 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Fri, 21 Oct 2016 01:01:30 +0200 Subject: [PATCH 4/7] Make it really clear, that only the first alarm works #323 --- .../service/devices/miband/MiBand2Support.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java index 39956923..de8debc7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java @@ -1056,6 +1056,11 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { Calendar calendar = alarm.getAlarmCal(); int daysMask = 0; + if (alarm.getIndex() != 0 && alarm.isEnabled()) { + GB.toast(getContext(), "Only the first alarm is currently supported.", Toast.LENGTH_LONG, GB.WARN); + return; + } + if (alarm.isEnabled()) { if (alarm.getRepetition(Alarm.ALARM_MON)) { daysMask |= 1; @@ -1087,9 +1092,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { (byte) calendar.get(Calendar.MINUTE), (byte) daysMask, }; - if (alarm.isEnabled()) { - builder.write(characteristic, alarmMessage); - } + builder.write(characteristic, alarmMessage); } private void handleControlPointResult(byte[] value, int status) { From 503bcee7b48f7b86c58ddc775effa5637181beb1 Mon Sep 17 00:00:00 2001 From: Daniele Gobbetti Date: Fri, 21 Oct 2016 13:07:07 +0200 Subject: [PATCH 5/7] Support record version 13 (firmware 4.2) --- .../service/devices/pebble/DatalogSessionHealthSteps.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSteps.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSteps.java index 9c9c6551..b5bd1678 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSteps.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSteps.java @@ -50,7 +50,7 @@ public class DatalogSessionHealthSteps extends DatalogSessionPebbleHealth { recordVersion = datalogMessage.getShort(); - if ((recordVersion != 5) && (recordVersion != 6) && (recordVersion != 7) && (recordVersion != 12)) + if ((recordVersion != 5) && (recordVersion != 6) && (recordVersion != 7) && (recordVersion != 12) && (recordVersion != 13)) return false; //we don't know how to deal with the data TODO: this is not ideal because we will get the same message again and again since we NACK it timestamp = datalogMessage.getInt(); @@ -101,7 +101,7 @@ public class DatalogSessionHealthSteps extends DatalogSessionPebbleHealth { } private class StepsRecord { - byte[] knownVersions = {5, 6, 7, 12}; + byte[] knownVersions = {5, 6, 7, 12, 13}; short version; int timestamp; int steps; From d08012709f69f8c45167b8fa94dcff85027a10c3 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Fri, 21 Oct 2016 13:13:08 +0200 Subject: [PATCH 6/7] bump version, add changelog --- CHANGELOG.md | 5 +++++ app/build.gradle | 4 ++-- app/src/main/res/xml/changelog_master.xml | 5 +++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a313ae1..a824d4fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ ###Changelog +####Version 0.13.5 +* Mi Band 2: Support setting one alarm +* Pebble: Health compatibility for Firmware 4.2 +* Improve support for K9 when generic notifications are used (K9 notifications set to never) + ####Version 0.13.4 * Mi Band: Initial support for recording heart and displaying rate values * Mi Band: Support for testing vibration patterns directly from the preferences diff --git a/app/build.gradle b/app/build.gradle index 9a239ded..0c2d27ae 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,8 +26,8 @@ android { targetSdkVersion 23 // note: always bump BOTH versionCode and versionName! - versionName "0.13.4" - versionCode 66 + versionName "0.13.5" + versionCode 67 } buildTypes { release { diff --git a/app/src/main/res/xml/changelog_master.xml b/app/src/main/res/xml/changelog_master.xml index b0feaee7..0378690b 100644 --- a/app/src/main/res/xml/changelog_master.xml +++ b/app/src/main/res/xml/changelog_master.xml @@ -1,5 +1,10 @@ + + Mi Band 2: Support setting one alarm + Pebble: Health compatibility for Firmware 4.2 + Improve support for K9 when generic notifications are used (K9 notifications set to never) + Mi Band: Initial support for recording heart and displaying rate values Mi Band: Support for testing vibration patterns directly from the preferences From 192b8e52edcb51f1d410c51b7e0da048cc03996d Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Fri, 21 Oct 2016 13:14:09 +0200 Subject: [PATCH 7/7] update hungarian from transifex (that is just transifex having reformatted the translation I tx pushed) --- app/src/main/res/values-hu/strings.xml | 577 +++++++++++++------------ 1 file changed, 291 insertions(+), 286 deletions(-) diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index fbe2b7bf..c0d6cfaa 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1,288 +1,293 @@ - + - Gadgetbridge - HR: - (ismeretlen) - Aktivitás - Mély alvás - Könnyű alvás - Nem viselt - Hibakeresés - Új eszköz csatlakoztatása - Kilépés - Beállítások - Rólad - Nem - Magasság cm-ben - Preferált alvási idő órában - Testsúly kg-ban - Születési év - Aktivitásod és alvásod - Widget hozzáadása - Pén - Hét - Szo - Okos ébresztés - Vas - Csü - Ked - Sze - mindig - Használja az Android Bluetooth párosítás ablakot eszköz párosításához. - Beállítás - A következő alkalmazást fogod telepíteni:\n\n\n%1$s Verzió %2$s : %3$s\n - Telepítés - Aktiválás - Deaktiválás - Törlés - Törlés és eltávolítás a gyorsítótárból - Újratelepítés - %1$s by %2$s - Ébresztő beállítva: %1$02d:%2$02d - Zzz - hitelesítés - hitelesítés szükséges - A Bluetooth ki van kapcsolva. - A Bluetooth nem támogatott. - Aktivitási adatok lekérdezése. - Eszköz kép - Nem lehet kapcsolódni: %1$s - Nem lehet csatlakozni. Rossz Bluetooth cím? - Nincs adat. Szinkronizáltál? - Lépések - Pulzus - csatlakoztatva - csatlakozás - FW: %1$s - HW: %1$s FW: %2$s - A vibrálás leállításához: Mégse. - Elveszett eszköz keresése - Szétcsatlakoztatás - Szinkronizálás - Elveszett eszköz keresése... - Aktivitásod (ALFA) - Ébresztők beállítása - Alvási adatok (ALFA) - Képernyőkép készítése - Hiba a futtatáskor: \'%1$s\' - FW: %1$s - HW: %1$s - Nincs csatlakoztatva. - %1$s (%2$s) - Engedélyezd a készüléked láthatóságát. A csatlakoztatott készülékek valószínűleg nem fognak megjelenni. Ha a készüléked nem jelenik meg 2 perc elteltével, próbáld újra, majd indítsd újra a telefonod. - Megjegyzés: - Keresés kezdése - Keresés leállítása - Hiba a könyvtár létrehozásakor a naplófájlok számára: %1$s - - FIRMWARE-T PRÓBÁLSZ TELEPÍTENI, CSAK SAJÁT FELELŐSSÉGRE TEDD!.\n\n\n Ez a firmware ehhez a hardware-verzióhoz tartozik: %s - Firmware-t fogsz telepíteni: %1$s és %2$s a mostani helyett a Mi Band-edre. - Firmware-t fogsz telepíteni: %s a mostani helyett a Mi Band-edre. - A fájlt nem lehet telepíteni, a készülék nincs készen. - Csatlakozás az eszközhöz: %1$s - Ez a firmware nem kompatibilis az eszközöddel. - A Gadgetbridge fut. - inicializált - inicializálás - sikertelen telepítés! - sikeres telepítés - A telepítéshez szükséges segédfájl nem található. - Kérlek várj a telepítési státusz megállapításáig... - bináris telepítés %1$d/%2$d - bal - Jelenlegi lépés/perc - Pulzus - Aktivitás kezdése - Lépésnapló - Lépés/perc napló - Összes lépés - Aktuális aktivitás - férfi - Nincs találat a MAC címre, nem lehet párosítani. - Ez a firmware tesztelt és ismerten kompatibilis a Gadgetbridge-dzsel. - Ha ennek ellenére is telepíteni szeretnéd, és a dolgok jól működnek, utána kérlek jelezd a Gadgetbridge fejlesztőinek, hogy fehérlistára tehessék a - "Ez a firmware nincs tesztelve, lehetséges, hogy nem kompatibilis a Gadgetbridge-dzsel.\n\nNem javasoljuk, hogy feltelepítsd a Mi Band-edre!" - Kompatibilis verzió - Nem kompatibilis firmware - Nem tesztelt verzió! - Mi Band Firmware %1$s - Párosítás: %s… - Amikor vibrálni kezd a Mi Band-ed, érintsd meg párszor egymás után. - Nem helyes felhasználói adatok vannak megadva, alapértelmezett adatokat fogok használni. - Név/Alias - Eszköz időeltolása órákban (Hogy az éjszakai műszakban dolgozók alvását is érzékelje.) - Napi céllépésszám - - Pulzus szenzor használata az alvás érzékelés javításához - Naptári események számára fentartott riasztások száma - Rezgés - Melyik kezeden hordod? - N/A - soha - nincs csatlakozva - Utoljára töltve: %s \n - Töltések száma: %s - %1$s fennmaradó akkumulátor töltés: %2$s%% - Alacsony akkumulátorszint - egyéb - Sikertelen telepítés: a firmware nem kompatibilis a Pebble hardver verzióddal. - Nem sikerült telepíteni a fájlt: %1$s - Pebble Firmware %1$s - %1$s (%2$s) - Helyes hardververzió - Hardververzió eltérés! - Tiltott alkalmazások - Alapértelmezett - Aktivitásmérők - Dátum és idő - Fejlesztői beállítások - Általános beállítások - Helység - Értesítések - Rezgésszám - Rezgésbeállítások - Általános értesítések - Bejővő hívás értesítés - E-Mail értesítés - Pebble értesítés - SMS értesítés - Rezgés profil - Idő szinkronizálása csatlakozásnál és Android idő- vagy időzónaváltoztatásnál. - Az adatokat a Mi Band-en fogja tárolni szinkronizálás után is. Hasznos, ha a GadgetBridge-et együtt használod más alkalmazásokkal. - Ez segíthet, ha a firmware frissítés sikertelen. - Értesítések tiltása a Ne zavarj üzemmód használatakor. - Támogatás az alkalmazásoknak, amik értesítést küldenek a Pebble-nek Intent-en keresztül. Ez beszélgetésre használható. - Ez az opció erőlteti az utolsó értesítési protokollt a firmware verziótól függően. CSAK AKKOR ENGEDÉLYEZD, HA TUDOD MIT CSINÁLSZ! - Nem tesztelt funkciók engedélyezése. CSAK AKKOR ENGEDÉLYEZD, HA TUDOD MIT CSINÁLSZ! - A napkelte és napnyugta idejének küldése a Pebble idővonalra a hely és idő alapján - Sötét - Világos - Preferált zenelejátszó - Előre megírt válaszok - Közös előtag - Idő szinkronizálás - Mi Band cím - Harmadik féltől származó Android alkalmazások hozzáférésének engedélyezése - Kapcsolódjon az eszközhöz a Bluetooth bekapcsolásakor - Újracsatlakozás automatikusan - Aktivitásadatok eszközön hagyása - Földrajzi hely - Szélesség - Hosszúság - Használja a low-latency módot a Firmware frissítésnél - Ne zavarj mód - Telefonhívások - Általános értesítési támogatás - K9-Mail - Pebble Üzenetek - Ismétlések - SMS - Preferált Aktivitásmérők - Erőltetett értesítés protokoll - Nem tesztelt funkciók engedélyezése - Újracsatlakozási kísérletek száma - Pebble beállítások - Pebble Health szinkronizálása - Misfit szinkronizálás - Morpheuz szinkronizálás - Napkelte és napnyugta - Téma - … és amikor a kijelző be van kapcsolva - Naplófájlok írása - Eszközspecifikus beállítások - MI Band beállítások - jobb - Ettől %1$s eddig %2$s - Az alvásod - Érintsd meg az eszközt a csatlakozáshoz - Érintsd meg az eszközt az aktivitáshoz - Érintsd meg az eszközt az alkalmazáskezelőhöz - Teszt - Teszt értesítés - Ez egy tesztértesítés a Gadgetbridge-től - Ébresztés részletek - Eszköz párosítása - Értesítés tiltólista - Alkalmazás kezelő - Aktivitásod - Gadgetbridge - Hibakeresés - Eszköz fellelhetőség - FW/Alkalmazás telepítő - Párosítsd a Mi Band-ed - Ébresztések beállítása - Beállítások - Alvástörténet - ismeretlen állapot - Nem küldött Firmware - Probléma volt a Firmware metaadatainak küldésekor - A Firmware telepítés kész - A Firmware telepítés kész, az eszköz újraindítása… - Firmware frissítés folyamatban - Probléma volt a firmware küldésekor. NE INDÍTSD ÚJRA a Mi Band-ed! - Firmware írási probléma - Firmware frissítése… - Mindegyik ébresztés tiltva van - Adatok fogadása: %1$s %2$s -tól - Hiba történt az ébresztések beállításakor, kérlek próbáld újra! - Ébresztések beállítva! - Ébresztőóra - Hosszú - Közepes - Csörgés - Rövid - Szaggatott - Vízcsepp - várakozás az újracsatlakozásra - Lépések ma, cél: %1$s - Lépések a héten - amikor a kijelző ki van kapcsolva - A tetejére mozgatás - Kísérleti támogatás engedélyezése az Android alkalmazások számára a PebbleKit használatára - Az aktivitás adatok a band-en maradnak. Hasznos, ha a GB-t más alkalamzásokkal együtt használod. - Hagyja az aktivitási adatokat a készüléken - Mégse - Törlés - Adatbáziskezelés - Régi/hagyaték adatok importálása / törlése - Applikációk gyorsítótárban - Telepített applikációk - Telepített számlapok - Eszköz törlése - Az eszköz törlésre és az összes hozzátartozó adat törlésre kerül! - %1$s törlése - Régi adatok összecsatolása az eszközzel - Az adatok sikeresen törölve lettek. - Adatbázistörlési hiba. - Törlöd az aktivitásadatokat? - Törlöd a régi aktivitási adatokat? - Biztosan törlöd a régi aktivitásadatokat? A nem importált aktivitási adatok elfognak veszni! - Hiba az exportálás során: %1$s - Hiba az importálás során: %1$s - Az adatbázisművelet ezt a helyet fogja használni. Ez a hely elérhető másik Android-alkalmazások és a számítógép számára. Itt keresd az exportált adatbázist is, illetve ide rakd az importálni kívánt adatbázist is. - "Az aktivitásadatok egy régebbi Gadgetbridge verzióval készültek, muszáj átkonvertálni az új formátumba. Ezt megteheted az alábbi gombbal. Tartsd figyelembe, hogy csatlakoztatva kell lennie a készülékednek, amihez szeretnéd párosítani az adatokat. Ha már importáltad azadataid és boldog vagy az eredménnyel, letörölheted a régi adatbázist. " - Hiba a régi aktivitásadatok importálása során az új adatbázisba. - %1$s exportálva - Adatok importálása? - Sikeres importálás. - Aktivitásadatok összefésülése - Nincs csatlakoztatva az adatokhoz rendelt eszköz. - Nem található régi aktivitás-adatbázis, nincs mit importálni. - Nem sikerült a régi aktivitás-adatbázis törlése. - Sikeresen törlésre kerültek a régi aktivitásadatok. - Felülírás - Biztosan felül akarod írni a jelenlegi adatbázist? Az összes jelenlegi aktivitás adatod (ha van) elfog veszni. - Kérlek várj, aktivitásadatok összefésülése… - Tényleg törölni akarod az egész adatbázist? Minden aktivitásadatod és rólad tárolt információ elfog veszni. - Nem elérhető az elérési út. Kérlek vedd fel a kapcsolatot a fejlesztőkkel. - Régi aktivitásadatok importálása - "A Gadgetbridge 0.12.0 verziója óta új adatbázis-formátumot használ. Lehetőség van a régi adatok importálására és azok párosítására a jelenleg csatlakozott eszközödhöz (%1$s) Kérlek, vedd figyelembe, hogy tudsz importálni a Mi Band, Pebble Health és Morpheuz eszközökből, de NEM tudsz a Pebble Misfit-ből. " - Nyelv - Nyers adatok tárolása az adatbázisban - Érintsd meg az eszközt a rezgéshez. - Adatbázis importálása - Rezgés - Lokáció megszerezve - Kérlek, engedélyezd a hálózati helymeghatározást. - Próba + Gadgetbridge + Gadgetbridge + Beállítások + Hibakeresés + Kilépés + Szinkronizálás + Alvási adatok (ALFA) + Elveszett eszköz keresése... + Képernyőkép készítése + Szétcsatlakoztatás + Eszköz törlése + %1$s törlése + Az eszköz törlésre és az összes hozzátartozó adat törlésre kerül! + Hibakeresés + + Alkalmazás kezelő + Applikációk gyorsítótárban + Telepített applikációk + Telepített számlapok + Törlés + Törlés és eltávolítás a gyorsítótárból + Újratelepítés + Aktiválás + Deaktiválás + Beállítás + A tetejére mozgatás + + Értesítés tiltólista + + FW/Alkalmazás telepítő + Firmware-t fogsz telepíteni: %s a mostani helyett a Mi Band-edre. + Firmware-t fogsz telepíteni: %1$s és %2$s a mostani helyett a Mi Band-edre. + Ez a firmware tesztelt és ismerten kompatibilis a Gadgetbridge-dzsel. + Ez a firmware nincs tesztelve, lehetséges, hogy nem kompatibilis a Gadgetbridge-dzsel.\n\nNem javasoljuk, hogy feltelepítsd a Mi Band-edre! + Ha ennek ellenére is telepíteni szeretnéd, és a dolgok jól működnek, utána kérlek jelezd a Gadgetbridge fejlesztőinek, hogy fehérlistára tehessék a + + Beállítások + Általános beállítások + Kapcsolódjon az eszközhöz a Bluetooth bekapcsolásakor + Újracsatlakozás automatikusan + Preferált zenelejátszó + Alapértelmezett + Dátum és idő + Idő szinkronizálás + Idő szinkronizálása csatlakozásnál és Android idő- vagy időzónaváltoztatásnál. + Téma + Világos + Sötét + Nyelv + Értesítések + Ismétlések + Telefonhívások + SMS + K9-Mail + Pebble Üzenetek + Támogatás az alkalmazásoknak, amik értesítést küldenek a Pebble-nek Intent-en keresztül. Ez beszélgetésre használható. + Általános értesítési támogatás + … és amikor a kijelző be van kapcsolva + Ne zavarj mód + Értesítések tiltása a Ne zavarj üzemmód használatakor. + mindig + amikor a kijelző ki van kapcsolva + soha + Tiltott alkalmazások + Előre megírt válaszok + Közös előtag + Fejlesztői beállítások + Mi Band cím + Pebble beállítások + Aktivitásmérők + Preferált Aktivitásmérők + Pebble Health szinkronizálása + Misfit szinkronizálás + Morpheuz szinkronizálás + Harmadik féltől származó Android alkalmazások hozzáférésének engedélyezése + Kísérleti támogatás engedélyezése az Android alkalmazások számára a PebbleKit használatára + Napkelte és napnyugta + A napkelte és napnyugta idejének küldése a Pebble idővonalra a hely és idő alapján + Helység + Földrajzi hely + Szélesség + Hosszúság + Kérlek, engedélyezd a hálózati helymeghatározást. + Lokáció megszerezve + Erőltetett értesítés protokoll + Ez az opció erőlteti az utolsó értesítési protokollt a firmware verziótól függően. CSAK AKKOR ENGEDÉLYEZD, HA TUDOD MIT CSINÁLSZ! + Nem tesztelt funkciók engedélyezése + Nem tesztelt funkciók engedélyezése. CSAK AKKOR ENGEDÉLYEZD, HA TUDOD MIT CSINÁLSZ! + Újracsatlakozási kísérletek száma + nincs csatlakozva + csatlakozás + csatlakoztatva + ismeretlen állapot + HW: %1$s FW: %2$s + FW: %1$s + (ismeretlen) + Teszt + Teszt értesítés + Ez egy tesztértesítés a Gadgetbridge-től + A Bluetooth nem támogatott. + A Bluetooth ki van kapcsolva. + Érintsd meg az eszközt az alkalmazáskezelőhöz + Érintsd meg az eszközt az aktivitáshoz + Érintsd meg az eszközt a rezgéshez. + Érintsd meg az eszközt a csatlakozáshoz + Nem lehet csatlakozni. Rossz Bluetooth cím? + A Gadgetbridge fut. + bináris telepítés %1$d/%2$d + sikertelen telepítés! + sikeres telepítés + FIRMWARE-T PRÓBÁLSZ TELEPÍTENI, CSAK SAJÁT FELELŐSSÉGRE TEDD!.\n\n\n Ez a firmware ehhez a hardware-verzióhoz tartozik: %s + A következő alkalmazást fogod telepíteni:\n\n\n%1$s Verzió %2$s : %3$s\n + N/A + inicializált + %1$s by %2$s + Eszköz fellelhetőség + Keresés leállítása + Keresés kezdése + Új eszköz csatlakoztatása + %1$s (%2$s) + Eszköz párosítása + Használja az Android Bluetooth párosítás ablakot eszköz párosításához. + Párosítsd a Mi Band-ed + Párosítás: %s… + Nincs találat a MAC címre, nem lehet párosítani. + Eszközspecifikus beállítások + MI Band beállítások + férfi + + egyéb + bal + jobb + Nem helyes felhasználói adatok vannak megadva, alapértelmezett adatokat fogok használni. + Amikor vibrálni kezd a Mi Band-ed, érintsd meg párszor egymás után. + Telepítés + Engedélyezd a készüléked láthatóságát. A csatlakoztatott készülékek valószínűleg nem fognak megjelenni. Ha a készüléked nem jelenik meg 2 perc elteltével, próbáld újra, majd indítsd újra a telefonod. + Megjegyzés: + Eszköz kép + Név/Alias + Rezgésszám + Alvástörténet + Naplófájlok írása + inicializálás + Aktivitási adatok lekérdezése. + Ettől %1$s eddig %2$s + Melyik kezeden hordod? + Rezgés profil + Szaggatott + Rövid + Közepes + Hosszú + Vízcsepp + Csörgés + Ébresztőóra + Rezgés + Próba + SMS értesítés + Rezgésbeállítások + Általános értesítések + E-Mail értesítés + Bejővő hívás értesítés + Elveszett eszköz keresése + A vibrálás leállításához: Mégse. + Aktivitásod + Ébresztések beállítása + Ébresztők beállítása + Ébresztés részletek + Vas + Hét + Ked + Sze + Csü + Pén + Szo + Okos ébresztés + Hiba történt az ébresztések beállításakor, kérlek próbáld újra! + Ébresztések beállítva! + Nincs adat. Szinkronizáltál? + Adatok fogadása: %1$s %2$s -tól + Napi céllépésszám + Hiba a futtatáskor: \'%1$s\' + Aktivitásod (ALFA) + Nem lehet kapcsolódni: %1$s + A telepítéshez szükséges segédfájl nem található. + Nem sikerült telepíteni a fájlt: %1$s + Sikertelen telepítés: a firmware nem kompatibilis a Pebble hardver verzióddal. + Kérlek várj a telepítési státusz megállapításáig... + Alacsony akkumulátorszint + %1$s fennmaradó akkumulátor töltés: %2$s%% + Utoljára töltve: %s \n + Töltések száma: %s + Az alvásod + Lépések a héten + Aktivitásod és alvásod + Firmware frissítése… + A fájlt nem lehet telepíteni, a készülék nincs készen. + Mi Band Firmware %1$s + Kompatibilis verzió + Nem tesztelt verzió! + Csatlakozás az eszközhöz: %1$s + Pebble Firmware %1$s + Helyes hardververzió + Hardververzió eltérés! + %1$s (%2$s) + Probléma volt a firmware küldésekor. NE INDÍTSD ÚJRA a Mi Band-ed! + Probléma volt a Firmware metaadatainak küldésekor + A Firmware telepítés kész + A Firmware telepítés kész, az eszköz újraindítása… + Firmware írási probléma + Lépések + Aktuális aktivitás + Lépések ma, cél: %1$s + Hagyja az aktivitási adatokat a készüléken + Az aktivitás adatok a band-en maradnak. Hasznos, ha a GB-t más alkalamzásokkal együtt használod. + Az adatokat a Mi Band-en fogja tárolni szinkronizálás után is. Hasznos, ha a GadgetBridge-et együtt használod más alkalmazásokkal. + Használja a low-latency módot a Firmware frissítésnél + Ez segíthet, ha a firmware frissítés sikertelen. + Lépésnapló + Jelenlegi lépés/perc + Összes lépés + Lépés/perc napló + Aktivitás kezdése + Aktivitás + Könnyű alvás + Mély alvás + Nem viselt + Nincs csatlakoztatva. + Mindegyik ébresztés tiltva van + Aktivitásadatok eszközön hagyása + Nem kompatibilis firmware + Ez a firmware nem kompatibilis az eszközöddel. + Naptári események számára fentartott riasztások száma + Pulzus szenzor használata az alvás érzékelés javításához + Eszköz időeltolása órákban (Hogy az éjszakai műszakban dolgozók alvását is érzékelje.) + várakozás az újracsatlakozásra + Rólad + Születési év + Nem + Magasság cm-ben + Testsúly kg-ban + hitelesítés + hitelesítés szükséges + Zzz + Widget hozzáadása + Preferált alvási idő órában + Ébresztő beállítva: %1$02d:%2$02d + HW: %1$s + FW: %1$s + Hiba a könyvtár létrehozásakor a naplófájlok számára: %1$s + HR: + Firmware frissítés folyamatban + Nem küldött Firmware + Pulzus + Pulzus + + Adatbázis importálása + Régi aktivitásadatok importálása + A Gadgetbridge 0.12.0 verziója óta új adatbázis-formátumot használ. Lehetőség van a régi adatok importálására és azok párosítására a jelenleg csatlakozott eszközödhöz (%1$s) Kérlek, vedd figyelembe, hogy tudsz importálni a Mi Band, Pebble Health és Morpheuz eszközökből, de NEM tudsz a Pebble Misfit-ből. + Nyers adatok tárolása az adatbázisban + Adatbáziskezelés + Adatbáziskezelés + Az adatbázisművelet ezt a helyet fogja használni. Ez a hely elérhető másik Android-alkalmazások és a számítógép számára. Itt keresd az exportált adatbázist is, illetve ide rakd az importálni kívánt adatbázist is. + Az aktivitásadatok egy régebbi Gadgetbridge verzióval készültek, muszáj átkonvertálni az új formátumba. Ezt megteheted az alábbi gombbal. Tartsd figyelembe, hogy csatlakoztatva kell lennie a készülékednek, amihez szeretnéd párosítani az adatokat. Ha már importáltad azadataid és boldog vagy az eredménnyel, letörölheted a régi adatbázist. + Régi/hagyaték adatok importálása / törlése + Nem elérhető az elérési út. Kérlek vedd fel a kapcsolatot a fejlesztőkkel. + %1$s exportálva + Hiba az exportálás során: %1$s + Adatok importálása? + Biztosan felül akarod írni a jelenlegi adatbázist? Az összes jelenlegi aktivitás adatod (ha van) elfog veszni. + Sikeres importálás. + Hiba az importálás során: %1$s + Nem található régi aktivitás-adatbázis, nincs mit importálni. + Nincs csatlakoztatva az adatokhoz rendelt eszköz. + Aktivitásadatok összefésülése + Kérlek várj, aktivitásadatok összefésülése… + Hiba a régi aktivitásadatok importálása során az új adatbázisba. + Régi adatok összecsatolása az eszközzel + Törlöd az aktivitásadatokat? + Tényleg törölni akarod az egész adatbázist? Minden aktivitásadatod és rólad tárolt információ elfog veszni. + Az adatok sikeresen törölve lettek. + Adatbázistörlési hiba. + Törlöd a régi aktivitási adatokat? + Biztosan törlöd a régi aktivitásadatokat? A nem importált aktivitási adatok elfognak veszni! + Sikeresen törlésre kerültek a régi aktivitásadatok. + Nem sikerült a régi aktivitás-adatbázis törlése. + Felülírás + Mégse + Törlés + + Rezgés