From 94c0d6af9d7523ca962a0e7986592d0afe4f182d Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Sun, 11 Dec 2016 21:30:37 +0100 Subject: [PATCH 1/8] Mi2: Fix off-by-one in activity fetching --- .../devices/miband2/operations/FetchActivityOperation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/operations/FetchActivityOperation.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/operations/FetchActivityOperation.java index 768f9236a..85200a639 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/operations/FetchActivityOperation.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/operations/FetchActivityOperation.java @@ -218,7 +218,7 @@ public class FetchActivityOperation extends AbstractMiBand2Operation { private void handleActivityMetadata(byte[] value) { if (value.length == 15) { // first two bytes are whether our request was accepted - if (ArrayUtils.equals(MiBand2Service.RESPONSE_ACTIVITY_DATA_START_DATE_SUCCESS, value, 0, 2)) { + if (ArrayUtils.equals(MiBand2Service.RESPONSE_ACTIVITY_DATA_START_DATE_SUCCESS, value, 0, 3)) { // the third byte (0x01 on success) = ? // the 4th - 7th bytes probably somehow represent the number of bytes/packets to expect From 40354f8f5a33d24a0a79f4304cbdd4df124fc230 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Sun, 11 Dec 2016 21:31:09 +0100 Subject: [PATCH 2/8] Some @Override --- .../service/devices/miband/AbstractMi1FirmwareInfo.java | 3 +++ .../gadgetbridge/service/devices/miband/Mi1SFirmwareInfo.java | 1 + 2 files changed, 4 insertions(+) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/AbstractMi1FirmwareInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/AbstractMi1FirmwareInfo.java index e274c9ce4..627ea19fb 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/AbstractMi1FirmwareInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/AbstractMi1FirmwareInfo.java @@ -41,10 +41,12 @@ public abstract class AbstractMi1FirmwareInfo extends AbstractMiFirmwareInfo { return 0; } + @Override public int getFirmwareLength() { return wholeFirmwareBytes.length; } + @Override public int getFirmwareVersion() { return (wholeFirmwareBytes[getOffsetFirmwareVersionMajor()] << 24) | (wholeFirmwareBytes[getOffsetFirmwareVersionMinor()] << 16) @@ -89,6 +91,7 @@ public abstract class AbstractMi1FirmwareInfo extends AbstractMiFirmwareInfo { return false; } + @Override protected boolean isHeaderValid() { // TODO: not sure if this is a correct check! return ArrayUtils.equals(SINGLE_FW_HEADER, wholeFirmwareBytes, SINGLE_FW_HEADER_OFFSET, SINGLE_FW_HEADER_OFFSET + SINGLE_FW_HEADER.length); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/Mi1SFirmwareInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/Mi1SFirmwareInfo.java index 8ef2e65da..8de13acd4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/Mi1SFirmwareInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/Mi1SFirmwareInfo.java @@ -38,6 +38,7 @@ public class Mi1SFirmwareInfo extends CompositeMiFirmwareInfo { return false; } + @Override protected boolean isHeaderValid() { // TODO: not sure if this is a correct check! return ArrayUtils.equals(DOUBLE_FW_HEADER, wholeFirmwareBytes, DOUBLE_FW_HEADER_OFFSET, DOUBLE_FW_HEADER_OFFSET + DOUBLE_FW_HEADER.length); From bb5791485ccdaf2d4c5fc2777eef1f4e84b5b24c Mon Sep 17 00:00:00 2001 From: Daniele Gobbetti Date: Sun, 11 Dec 2016 22:48:12 +0100 Subject: [PATCH 3/8] Add log statements when notifications are not sent to gadget This should help debuggin #456 --- .../gadgetbridge/externalevents/NotificationListener.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java index ca1ef0e19..0c29c664f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java @@ -190,16 +190,19 @@ public class NotificationListener extends NotificationListenerService { if (!prefs.getBoolean("notifications_generic_whenscreenon", false)) { PowerManager powermanager = (PowerManager) getSystemService(POWER_SERVICE); if (powermanager.isScreenOn()) { + LOG.info("Not forwarding notification, screen seems to be on and settings do not allow this"); return; } } //don't forward group summary notifications to the wearable, they are meant for the android device only if ((notification.flags & Notification.FLAG_GROUP_SUMMARY) == Notification.FLAG_GROUP_SUMMARY) { + LOG.info("Not forwarding notification, FLAG_GROUP_SUMMARY is set"); return; } if ((notification.flags & Notification.FLAG_ONGOING_EVENT) == Notification.FLAG_ONGOING_EVENT) { + LOG.info("Not forwarding notification, FLAG_ONGOING_EVENT is set"); return; } @@ -212,6 +215,7 @@ public class NotificationListener extends NotificationListenerService { source.equals("com.android.systemui") || source.equals("com.android.dialer") || source.equals("com.cyanogenmod.eleven")) { + LOG.info("Not forwarding notification, is a system event"); return; } @@ -232,6 +236,7 @@ public class NotificationListener extends NotificationListenerService { } if (GBApplication.blacklist != null && GBApplication.blacklist.contains(source)) { + LOG.info("Not forwarding notification, application is blacklisted"); return; } From bcfc8bc110f6a27f3a9ccf68116a78850287bdc8 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Sun, 11 Dec 2016 21:57:20 +0100 Subject: [PATCH 4/8] Mi1/Mi2: fix firmware file probing for the different devices --- .../gadgetbridge/devices/miband2/MiBand2FWHelper.java | 3 +++ .../gadgetbridge/service/devices/miband2/Mi2FirmwareInfo.java | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband2/MiBand2FWHelper.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband2/MiBand2FWHelper.java index a4beb56d6..207aceef9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband2/MiBand2FWHelper.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband2/MiBand2FWHelper.java @@ -56,6 +56,9 @@ public class MiBand2FWHelper extends AbstractMiBandFWHelper { @Override protected void determineFirmwareInfo(byte[] wholeFirmwareBytes) { firmwareInfo = new Mi2FirmwareInfo(wholeFirmwareBytes); + if (!firmwareInfo.isHeaderValid()) { + throw new IllegalArgumentException("Not a Mi Band 2 firmware"); + } } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/Mi2FirmwareInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/Mi2FirmwareInfo.java index c0bb67178..6e9cb0a02 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/Mi2FirmwareInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/Mi2FirmwareInfo.java @@ -57,8 +57,8 @@ public class Mi2FirmwareInfo { return isHeaderValid() && device.getType() == DeviceType.MIBAND2; } - protected boolean isHeaderValid() { - // TODO: not sure if this is a correct check! + public boolean isHeaderValid() { + // TODO: this is certainly not a correct validation, but it works for now return ArrayUtils.equals(FW_HEADER, bytes, FW_HEADER_OFFSET, FW_HEADER_OFFSET + FW_HEADER.length); } From eb8129f62e046123a77781786dc9ee5d658a0065 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Sun, 11 Dec 2016 21:58:28 +0100 Subject: [PATCH 5/8] Remove outdated comment --- .../nodomain/freeyourgadget/gadgetbridge/test/LoggingTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/LoggingTest.java b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/LoggingTest.java index 13109a0ac..e7062bfd6 100644 --- a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/LoggingTest.java +++ b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/LoggingTest.java @@ -19,8 +19,6 @@ import static org.junit.Assert.fail; /** * Tests dynamic enablement and disablement of file appenders. - * Test is currently disabled because logback-android does not work - * inside a plain junit test. */ public class LoggingTest extends TestBase { From c69889d177d7523e4205fcf03c02a7d287520dd9 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Sun, 11 Dec 2016 23:29:22 +0100 Subject: [PATCH 6/8] Simplified + fixed ArrayUtils.equals() + added lots of testcases --- .../miband/AbstractMi1FirmwareInfo.java | 2 +- .../devices/miband/Mi1SFirmwareInfo.java | 2 +- .../devices/miband2/Mi2FirmwareInfo.java | 2 +- .../operations/FetchActivityOperation.java | 2 +- .../gadgetbridge/util/ArrayUtils.java | 32 +++-- .../gadgetbridge/test/ArrayUtilsTest.java | 117 ++++++++++++++++++ 6 files changed, 135 insertions(+), 22 deletions(-) create mode 100644 app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/ArrayUtilsTest.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/AbstractMi1FirmwareInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/AbstractMi1FirmwareInfo.java index 627ea19fb..a1a622b68 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/AbstractMi1FirmwareInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/AbstractMi1FirmwareInfo.java @@ -94,7 +94,7 @@ public abstract class AbstractMi1FirmwareInfo extends AbstractMiFirmwareInfo { @Override protected boolean isHeaderValid() { // TODO: not sure if this is a correct check! - return ArrayUtils.equals(SINGLE_FW_HEADER, wholeFirmwareBytes, SINGLE_FW_HEADER_OFFSET, SINGLE_FW_HEADER_OFFSET + SINGLE_FW_HEADER.length); + return ArrayUtils.equals(wholeFirmwareBytes, SINGLE_FW_HEADER, SINGLE_FW_HEADER_OFFSET); } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/Mi1SFirmwareInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/Mi1SFirmwareInfo.java index 8de13acd4..9a5a80ff8 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/Mi1SFirmwareInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/Mi1SFirmwareInfo.java @@ -41,7 +41,7 @@ public class Mi1SFirmwareInfo extends CompositeMiFirmwareInfo { @Override protected boolean isHeaderValid() { // TODO: not sure if this is a correct check! - return ArrayUtils.equals(DOUBLE_FW_HEADER, wholeFirmwareBytes, DOUBLE_FW_HEADER_OFFSET, DOUBLE_FW_HEADER_OFFSET + DOUBLE_FW_HEADER.length); + return ArrayUtils.equals(wholeFirmwareBytes, DOUBLE_FW_HEADER, DOUBLE_FW_HEADER_OFFSET); } @Nullable diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/Mi2FirmwareInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/Mi2FirmwareInfo.java index 6e9cb0a02..4dbf595e8 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/Mi2FirmwareInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/Mi2FirmwareInfo.java @@ -59,7 +59,7 @@ public class Mi2FirmwareInfo { public boolean isHeaderValid() { // TODO: this is certainly not a correct validation, but it works for now - return ArrayUtils.equals(FW_HEADER, bytes, FW_HEADER_OFFSET, FW_HEADER_OFFSET + FW_HEADER.length); + return ArrayUtils.equals(bytes, FW_HEADER, FW_HEADER_OFFSET); } public void checkValid() throws IllegalArgumentException { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/operations/FetchActivityOperation.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/operations/FetchActivityOperation.java index 85200a639..c83e6104b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/operations/FetchActivityOperation.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/operations/FetchActivityOperation.java @@ -218,7 +218,7 @@ public class FetchActivityOperation extends AbstractMiBand2Operation { private void handleActivityMetadata(byte[] value) { if (value.length == 15) { // first two bytes are whether our request was accepted - if (ArrayUtils.equals(MiBand2Service.RESPONSE_ACTIVITY_DATA_START_DATE_SUCCESS, value, 0, 3)) { + if (ArrayUtils.equals(value, MiBand2Service.RESPONSE_ACTIVITY_DATA_START_DATE_SUCCESS, 0)) { // the third byte (0x01 on success) = ? // the 4th - 7th bytes probably somehow represent the number of bytes/packets to expect diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/ArrayUtils.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/ArrayUtils.java index a7fbbf3e6..d0bee5773 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/ArrayUtils.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/ArrayUtils.java @@ -4,35 +4,31 @@ import java.util.Collection; public class ArrayUtils { /** - * Checks the two given arrays for equality, but comparing only a subset of the second - * array with the whole first array. + * Checks the two given arrays for equality, but comparing the second array with a specified + * subset of the first array. * - * @param first the whole array to compare against - * @param second the array, of which a subset shall be compared against the whole first array - * @param secondStartIndex the start index (inclusive) of the second array from which to start the comparison - * @param secondEndIndex the end index (exclusive) of the second array until which to compare - * @return whether the first byte array is equal to the specified subset of the second byte array - * @throws IllegalArgumentException when one of the arrays is null or start and end index are wrong + * @param first the array in which to look for the second array + * @param second the data to look for inside the first array + * @param startIndex the start index (inclusive) inside the first array from which to start the comparison + * @return whether the second byte array is equal to the specified subset of the first byte array + * @throws IllegalArgumentException when one of the arrays is null or start index/length are wrong */ - public static boolean equals(byte[] first, byte[] second, int secondStartIndex, int secondEndIndex) { + public static boolean equals(byte[] first, byte[] second, int startIndex) { if (first == null) { throw new IllegalArgumentException("first must not be null"); } if (second == null) { throw new IllegalArgumentException("second must not be null"); } - if (secondStartIndex >= secondEndIndex) { - throw new IllegalArgumentException("secondStartIndex must be smaller than secondEndIndex"); + if (startIndex < 0) { + throw new IllegalArgumentException("startIndex must be >= 0"); } - if (second.length < secondEndIndex) { - throw new IllegalArgumentException("secondStartIndex must be smaller than secondEndIndex"); - } - int len = secondEndIndex - secondStartIndex; - if (first.length != len) { + + if (second.length + startIndex > first.length) { return false; } - for (int i = 0; i < len; i++) { - if (first[i] != second[secondStartIndex + i]) { + for (int i = 0; i < second.length; i++) { + if (first[startIndex + i] != second[i]) { return false; } } diff --git a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/ArrayUtilsTest.java b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/ArrayUtilsTest.java new file mode 100644 index 000000000..d6bc5bca1 --- /dev/null +++ b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/ArrayUtilsTest.java @@ -0,0 +1,117 @@ +package nodomain.freeyourgadget.gadgetbridge.test; + +import org.junit.Test; + +import nodomain.freeyourgadget.gadgetbridge.util.ArrayUtils; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Tests ArrayUtils + */ +public class ArrayUtilsTest extends TestBase { + + private static final byte[] EMPTY = new byte[0]; + private static final byte[] DATA_5 = new byte[] { 1, 2, 3, 4, 5}; + + public ArrayUtilsTest() throws Exception { + } + + @Test + public void testEqualsException1() throws Exception { + try { + ArrayUtils.equals(null, EMPTY, 0); + fail("equals should throw on bad argument"); + } catch (IllegalArgumentException ex) { + // expected + } + } + + @Test + public void testEqualsException2() throws Exception { + try { + ArrayUtils.equals(EMPTY, null, 0); + fail("equals should throw on bad argument"); + } catch (IllegalArgumentException ex) { + // expected + } + } + + @Test + public void testEqualsException5() throws Exception { + try { + ArrayUtils.equals(EMPTY, EMPTY, -1); + fail("equals should throw on bad argument"); + } catch (IllegalArgumentException ex) { + // expected + } + } + + @Test + public void testEqualsEmptyData() throws Exception { + assertFalse(ArrayUtils.equals(EMPTY, DATA_5, 0)); + } + + @Test + public void testEqualsEmptyTest() throws Exception { + // testing for 0 equal bytes may be senseless, but always true + assertTrue(ArrayUtils.equals(EMPTY, EMPTY, 0)); + assertTrue(ArrayUtils.equals(DATA_5, EMPTY, 0)); + } + + @Test + public void testEquals1() throws Exception { + assertTrue(ArrayUtils.equals(DATA_5, b(1), 0)); + } + + @Test + public void testEquals2() throws Exception { + assertTrue(ArrayUtils.equals(DATA_5, b(2), 1)); + } + + @Test + public void testEquals5() throws Exception { + assertTrue(ArrayUtils.equals(DATA_5, b(5), 4)); + } + + @Test + public void testEqualsOutOfRange() throws Exception { + assertFalse(ArrayUtils.equals(DATA_5, b(5), 5)); + } + + @Test + public void testEquals123() throws Exception { + assertTrue(ArrayUtils.equals(DATA_5, new byte[] {1, 2, 3}, 0)); + } + + @Test + public void testEquals234() throws Exception { + assertTrue(ArrayUtils.equals(DATA_5, new byte[] {2, 3, 4}, 1)); + } + + @Test + public void testEquals345() throws Exception { + assertTrue(ArrayUtils.equals(DATA_5, new byte[] {3, 4, 5}, 2)); + } + + @Test + public void testEquals12345() throws Exception { + assertTrue(ArrayUtils.equals(DATA_5, DATA_5, 0)); + } + + @Test + public void testEqualsWrongStart() throws Exception { + assertFalse(ArrayUtils.equals(DATA_5, new byte[] {0, 2, 3}, 0)); + } + + @Test + public void testEqualsWrongEnd() throws Exception { + assertFalse(ArrayUtils.equals(DATA_5, new byte[] {3, 4, 6}, 2)); + } + + private byte[] b(int b) { + return new byte[] {(byte) b}; + } +} From 6e633e948a0c44cec9b456213eb291cff1c0f6ba Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Sun, 11 Dec 2016 23:36:41 +0100 Subject: [PATCH 7/8] Updated translations from transifex (Thanks!) --- app/src/main/res/values-es/strings.xml | 54 ++++++++------- app/src/main/res/values-hu/strings.xml | 92 +++++++++++++++++--------- 2 files changed, 91 insertions(+), 55 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index a360dd93a..3214d1713 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -36,7 +36,7 @@ Estás a punto de instalar el firmware %s en lugar del que está en tu MiBand. Estás a punto de instalar los firmwares %1$s y %2$s en lugar de los que están en tu MiBand. Este firmware ha sido probado y se sabe que es compatible con Gadgetbridge. - Este firmware no ha sido probado y puede no sea compatible con Gadgetbridge.\n\nNO se recomienda la instalación en tu MiBand!. + Este firmware no ha sido probado y puede que no sea compatible con Gadgetbridge.\n\nNO se recomienda la instalación en tu MiBand!. Si aún así quieres seguir y las cosas continúan funcionando correctamente después de esto, por favor indícales a los desarrolladores de Gadgetbridge que la versión del firmware: %s funciona bien. Ajustes @@ -49,15 +49,16 @@ Sincronizar hora Sincroniza la hora en el dispositivo cuando se conecte o se cambie la hora o zona horaria en Android Tema - Ligero + Claro Oscuro - Lenguaje + Idioma Notificaciones Repeticiones Llamadas telefónicas SMS K9-Mail Mensajes de Pebble + Soporte para aplicaciones que envían notificaciones a Pebble a través de PebbleKit. Soporte para notificaciones genéricas … también con pantalla encendida No Molestar @@ -66,7 +67,7 @@ cuando la pantalla está apagada nunca Excluir aplicaciones - Mensajes preservados + Mensajes predeterminados Respuestas Sufijo habitual Rechazar llamada @@ -81,8 +82,8 @@ Sincronizar con Morpheuz Permitir el acceso a aplicaciones Android de terceros Permitir el soporte experimental para aplicaciones Android que usan PebbleKit - Salida y Puesta de Sol - Enviar los tiempos de Salida y Puesta del sol basándose en la localización a la línea cronológica del Pebble + Salida y puesta de Sol + Enviar las horas de salida y puesta de Sol basándose en la localización a la línea cronológica del Pebble Localización Buscar localización Latitud @@ -96,6 +97,7 @@ Habilitar características no probadas Habilita características que no han sido probadas. ¡HABILÍTALO SOLO SI SABES LO QUE ESTÁS HACIENDO! Preferir siempre BLE + Usar el soporte experimental de Pebble LE para todos los Pebble en lugar del bluetooth clásico. Requiere vincular \"Pebble LE\" si un Pebble no-LE ha sido vinculado antes. Activar crear registros de la App del Reloj Producirá registros de las apps del reloj que Gadgetbridge guardará (necesita reconexión) Intentos de reconexión @@ -109,8 +111,8 @@ Probar Probar notificación Notificación de prueba desde Gadgetbridge - Bluetooth no está soportado. - Bluetooth está desactivado. + El Bluetooth no está soportado. + El Bluetooth está desactivado. Pulsa el dispositivo conectado para Gestión de App Pulsa el dispositivo conectado para Actividad Pulsa el dispositivo conectado para Vibración @@ -119,14 +121,14 @@ Gadgetbridge funcionando instalando binario %1$d/%2$d ¡La instalación ha fallado! - instalación satisfactoria + instalación correcta ESTÁS INTENTANDO INSTALAR UN FIRMWARE, CONTINÚA BAJO TU RESPONSABILIDAD.\n\n\n Este firmware es para la revisión de HW: %s Estás a punto de instalar la siguiente app:\n\n\n%1$s Versión %2$s de %3$s\n N/A iniciado %1$s de %2$s Detección de dispositivos - Finalizar el escaneo + Detener el escaneo Comenzar la detección Conectar un nuevo dispositivo %1$s (%2$s) @@ -136,20 +138,20 @@ Emparejando con %s... Creando emparejamiento con %1$s (%2$s) No se ha podido emparejar con %1$s (%2$s) - Emparejamiento en progreso: %1$s (%2$s) + Emparejamiento en curso: %1$s (%2$s) Emparejado con %1$s (%2$s), conectando… - Ninguna dirección MAC aprobada, no se puede emparejar. + Ninguna dirección MAC proporcionada, no se puede emparejar. Ajustes específicos del dispositivo Ajustes de MiBand - masculino - femenino - otro + Hombre + Mujer + Otro izquierda derecha No se han proporcionado datos de usuario válidos, se usarán datos de usuario por defecto. Cuando tu MiBand vibre y parpadee, púlsala repetidas veces. Instalar - Haga su dispositivo detectable. Actualmente los dispositivos conectados no serán detectables. En Android 6 o superior, necesita activar la localización (ej. GPS). Si su dispositivo no aparece en dos minutos, vuelva a intentarlo tras reiniciar su teléfono. + Haga su dispositivo detectable. Los dispositivos conectados no serán detectables. En Android 6 o superior, necesita activar la localización (ej. GPS). Si su dispositivo no aparece en dos minutos, vuelva a intentarlo tras reiniciar su teléfono. Nota: Imagen del dispositivo Nombre/Apodo @@ -169,7 +171,7 @@ Ring Alarma Vibración - Intentar + Probar Notificación de SMS Ajustes de vibración Notificación genérica @@ -191,7 +193,7 @@ Jue Vie Sáb - Despertar avanzado + Alarma inteligente Hubo un error al configurar las alarmas, ¡Por favor, inténtalo de nuevo! ¡Alarmas enviadas al dispositivo! Sin datos. ¿Sincronizar dispositivo? @@ -219,9 +221,9 @@ Conexión al dispositivo: %1$s Pebble firmware %1$s Revisión de hardware correcta - La revisión de hardware incorrecta! + La revisión de hardware es incorrecta! %1$s (%2$s) - Hubo un problema con la transferencia de firmware. NO REINICIES tu MiBand! + Hubo un problema con la transferencia de firmware. NO REINICIES tu Mi Band! Hubo un problema con la transferencia de metadatos del firmware Instalación del firmware completa Instalación del firmware completa, reiniciando dispositivo... @@ -230,8 +232,8 @@ Actividad Pasos hoy, objetivo: %1$s No confirmar transferencia - Si los datos no son marcados como descargados, no serán borrados de tu MiBand. Útil si Gadgetbridge se usa conjuntamente con otras apps. - Mantendrá los datos de actividad en la MiBand incluso después de la sincronización. Útil si GB se usa junto con otras apps. + Si los datos no son marcados como descargados, no serán borrados de tu Mi Band. Útil si Gadgetbridge se usa conjuntamente con otras apps. + Mantendrá los datos de actividad en la Mi Band incluso después de la sincronización. Útil si GB se usa junto con otras apps. Usa el modo de baja latencia para las actualizaciones de FW Esto podría ayudar en dispositivos donde las actualizaciones de firmware fallan Historial de pasos @@ -279,11 +281,17 @@ Importar Base de Datos Importar datos de actividad antiguos + Desde Gadgetbridge 0.12.0 usamos un nuevo formato de base de datos. +Se pueden importar los antiguos datos de actividad y asociarlos con el dispoditivo al que se está conectando (%1$s).\n +\n +Si no importas los antiguos datos de actividad ahora, siempre lo podrás hacer después seleccionando \"MERGE OLD ACTIVITY DATA\" en el apartado de gestión de base de datos de actividad.\n +\n +Por favor, ten en cuenta que puedes importar datos desde Mi Band, Pebble Health y Morpheuz pero NO desde Pebble Misfit. Almacenar datos en bruto en la base de datos Seleccionado, los datos archivados se guardan en bruto y están disponibles para ser interpretados más tarde. La base de datos será más grande. Administración de Bases de Datos Administración de Bases de Datos - La base de datos usa la siguiente ubicación en su dispositivo. \nThis path es accesible a otras aplicaciones Android y a su ordenador. \nExpect para encontrar sus bases de datos exportadas (o ponga la base de datos que quiere importar) ahí: + La base de datos usa la siguiente ubicación en su dispositivo. \nEsta ubicación está accesible para otras aplicaciones Android y para su ordenador. \nEncontrará sus bases de datos exportadas (o la que quiere importar) aquí: Los datos de actividad grabados con versiones anteriores de Gadgetbridge a 0.12 deben ser convertidos a un nuevo formato. \nPuede hacerlo utilizando el botón de abajo. ¡Tenga en cuenta que debe estar conectado con el dispositivo al que desea asociar los antiguos datos de la actividad! \nSi ya importó sus datos y está satisfecho con el resultado, es posible eliminar la base de datos antigua. Importar/Borrar Base de Datos Antigua No se puede acceder a la ruta para exportar . Por favor, contacta con los desarrolladores. diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 53475354b..6c9eec168 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -12,29 +12,32 @@ 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! + Az eszköz é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 + Alkalmazáskezelő + Gyorsítótárazott alkalmazások + Telepített alkalmazások Telepített számlapok Törlés Törlés és eltávolítás a gyorsítótárból Újratelepítés + Keresés a Pebble alkalmazás-áruházban Aktiválás Deaktiválás + Pulzusmérő aktiválása + Pulzusmérő deaktiválása 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. + A %s firmware-változatot tervezed telepíteni a Mi Band-edre a mostani helyett. + A %1$s és %2$s firmware-változatokat tervezed telepíteni a Mi Band-edre a mostani helyett. 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 + 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 %s firmware-változatot. Beállítások Általános beállítások @@ -54,8 +57,8 @@ 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ó. + Pebble üzenetek + Támogatás az alkalmazásoknak, amik értesítéseket küldenek a Pebble-nek a PebbleKit-en keresztül. Általános értesítési támogatás … és amikor a kijelző be van kapcsolva Ne zavarj mód @@ -64,13 +67,16 @@ amikor a kijelző ki van kapcsolva soha Tiltott alkalmazások + Előre beállított üzenetek Előre megírt válaszok Közös előtag + Hívás elutasítás + Frissítés a Pebble-n 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 + Preferált Aktivitásmérő Pebble Health szinkronizálása Misfit szinkronizálás Morpheuz szinkronizálás @@ -78,16 +84,22 @@ 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 + Pozició + Pozició meghatározása Szélesség Hosszúság + Pozició frissentartása + Aktuális pozició meghatározásának megpróbálása futásidőben, hiba esetén a letárolt pozició használata 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! + Hely meghatározva + Értesítési protokoll erőltetése + Ez az opció a legfrissebb értesítési protokollt erőlteti 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! + Mindig preferálja a BLE-t + A kísérleti LE támogatás használata minden Pebble-hez a klasszikus BT helyett, párosítani kell hozzá egy \"Pebble LE\"-t, miután a nem-LE-t párosítva lett egyszer. + Óraalkalmazás-naplózás engedélyezése + Az óra-alkalmazások naplóit a Gadgetbridge is naplózni fogja (újracsatlakozást igényel) Újracsatlakozási kísérletek száma nincs csatlakozva csatlakozás @@ -101,21 +113,21 @@ 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 + Koppints az eszközre az alkalmazáskezelőhöz + Koppints az eszközre az Aktivitáshoz + Koppints az eszközre a rezgetéshez. + Koppints az eszközre a csatlakozáshoz Nem lehet csatlakozni. Rossz Bluetooth cím? A Gadgetbridge fut. - bináris telepítés %1$d/%2$d + %1$d/%2$d bináris telepítése 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 + A következő alkalmazást fogod telepíteni:\n\n\n%1$s Verzió %2$s , készítette: %3$s\n N/A inicializált - %1$s by %2$s - Eszköz fellelhetőség + %1$s , készítette: %2$s + Eszköz keresés Keresés leállítása Keresés kezdése Új eszköz csatlakoztatása @@ -123,7 +135,11 @@ 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… + %s párosítása... + Összeköttetés létesítése %1$s (%2$s) eszközzel + Sikertelen párosítás %1$s (%2$s) eszközzel + Összeköttetés folyamatban %1$s (%2$s) eszközzel + Meglévő párosítás %1$s (%2$s) eszközzel, kapcsolódá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 @@ -135,7 +151,7 @@ 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. + Tedd felfedezhetővé az eszközöd. A jelenleg csatlakoztatott eszközök valóüszínűleg nem fognak megjelenni. 6-os és frissebb Androidon engedélyezni kell a helymeghatározást (GPS). Ha az eszköz két perc után sem jelenik meg, próbáld újra a mobileszközöd újraindítása után. Megjegyzés: Eszköz kép Név/Alias @@ -144,7 +160,7 @@ Naplófájlok írása inicializálás Aktivitási adatok lekérdezése. - Ettől %1$s eddig %2$s + %1$s és %2$s között Melyik kezeden hordod? Rezgés profil Szaggatott @@ -161,6 +177,9 @@ Általános értesítések E-Mail értesítés Bejővő hívás értesítés + Csevegés + Navigáció + Közösségi háló Elveszett eszköz keresése A vibrálás leállításához: Mégse. Aktivitásod @@ -177,7 +196,7 @@ 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? + Nincs adat. Szinkronizáljunk? Adatok fogadása: %1$s %2$s -tól Napi céllépésszám Hiba a futtatáskor: \'%1$s\' @@ -212,10 +231,10 @@ 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 + Ne erősítse meg az aktivitásadatok átvitelét + Ha az aktivitásadatok átvitele nincs megerősítve a band felé, az nem kerülnek törlésre. Hasznos, ha a GB-t más alkalmzásokkal együtt használod. + Az adatokat meghagyja a Mi Band-en 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 @@ -234,6 +253,11 @@ 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.) + Mi2: dátumformátum + Idő + + Kijelző aktiválása felemeléskor + Adatok átvitele %1$s óta várakozás az újracsatlakozásra Rólad Születési év @@ -259,6 +283,7 @@ 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 + Ha bejelölöd, az adatok eredeti formában lesznek tárolva későbbi értelmezéshez. Megj.: az adatbázis ebben az esetben nagyobb lesz! 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. @@ -290,4 +315,7 @@ Törlés Rezgés + + Pebble párosítása + Egy párosítási párbeszédablaknak kéne megjelennie az Android eszközödön. Ha nem látod, nézd meg az értesítési sávban és fogadd el a párosítási kérelmet. Utána fogadd ela kérelmet a Pebble-n. From efe3f2773b45645cf5eab799ab8c0e015e810443 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Sun, 11 Dec 2016 23:43:13 +0100 Subject: [PATCH 8/8] Mi2: mention firmware update --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2c631edcd..85dd7da02 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,7 @@ For more information read [this wiki article](https://github.com/Freeyourgadget/ * Generic Android notifications * Synchronize the time to the Mi Band 2 * Display firmware version +* Firmware update (beta) * Heart rate measurement on demand and during sleep * Synchronize activity data (alpha) * Set alarms on the Mi Band 2