diff --git a/CHANGELOG.md b/CHANGELOG.md index fade77367..79ff5d59a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ ### Changelog +#### Version 0.23.2 +* Mi Band 1S: Fix sync problem with firmware 4.16.11.15 (probably also Mi Band 1.0.15.0 and Mi Band 1A 5.16.11.15) +* Amazfit Cor: Fix problem with firmware >=1.0.6.27 being detected as Mi Band 2 + +#### Version 0.23.1 +* Initial support for Omnijaws weather service +* Amazfit Bip: Allow installation of latest gps firmware +* Amazfit Cor: Fixes for installing newer firmware versions + #### Version 0.23.0 * Initial support for LineageOS/CyanogenMod weather provider * Amazfit Bip/Cor: Support for current weather temperature diff --git a/FEATURES.md b/FEATURES.md index 2607eb333..fbd3740ed 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -4,7 +4,7 @@ |-----------------------------------| ----------|---------------|---------|-----------|-------------| |Calls Notification | YES | YES | YES | YES | YES | |Reject Calls | YES | YES | NO | NO | YES | -|Accept Calls | NO(2) | NO(2) | NO | NO | NO(3) | +|Accept Calls | NO(2) | NO(2) | NO | NO | NO | |Generic Notification | YES | YES | YES | YES | YES | |Dismiss Notifications on Phone | YES | YES | NO | NO | NO | |Predefined Replies | YES | YES | NO | NO | NO | @@ -18,7 +18,7 @@ |HR Tracking | N/A | YES | YES | YES | YES | |Realtime Activity Tracking | NO | NO | YES | YES | YES | |Music Control | YES | YES | NO | NO | NO | -|Watchapp/face Installation | YES | YES | NO | NO | NO | +|Watchapp/face Installation | YES | YES | NO | NO | YES | |Firmware Installaton | YES | YES | YES | YES | YES | |Taking Screenshots | YES | YES | NO | NO | NO | |Support Android Companion Apps | YES | YES | NO | NO | NO | diff --git a/README.md b/README.md index 21823bcf4..9edbe1381 100644 --- a/README.md +++ b/README.md @@ -22,14 +22,14 @@ vendor's servers. [List of changes](https://github.com/Freeyourgadget/Gadgetbridge/blob/master/CHANGELOG.md) ## Supported Devices -* Pebble, Pebble Steel, Pebble Time, Pebble Time Steel, Pebble Time Round [Wiki section about this device](https://github.com/Freeyourgadget/Gadgetbridge/wiki/Pebble) -* Pebble 2 (add the device from within Gadgetbridge!) [Wiki section about pebble](https://github.com/Freeyourgadget/Gadgetbridge/wiki/Pebble), most parts apply to Pebble 2 as well -* Mi Band, Mi Band 1A, Mi Band 1S [Wiki section about this device](https://github.com/Freeyourgadget/Gadgetbridge/wiki/Mi-Band) -* Mi Band 2 [Wiki section about mi band](https://github.com/Freeyourgadget/Gadgetbridge/wiki/Mi-Band), some parts apply to mi band 2 as well -* Amazfit Bip [Wiki section about the Amazfit Bip](https://github.com/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Bip) -* Amazfit Cor (no maintainer) [Wiki section about the Amazfit Cor](https://github.com/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Cor) -* HPlus Devices (e.g. ZeBand) [Wiki section about this device](https://github.com/Freeyourgadget/Gadgetbridge/wiki/HPlus) -* Teclast H30 (WIP) +* Pebble, Pebble Steel, Pebble Time, Pebble Time Steel, Pebble Time Round [Wiki](https://github.com/Freeyourgadget/Gadgetbridge/wiki/Pebble) +* Pebble 2 [Wiki](https://github.com/Freeyourgadget/Gadgetbridge/wiki/Pebble) +* Mi Band, Mi Band 1A, Mi Band 1S [Wiki](https://github.com/Freeyourgadget/Gadgetbridge/wiki/Mi-Band) +* Mi Band 2 [Wiki](https://github.com/Freeyourgadget/Gadgetbridge/wiki/Mi-Band-2) +* Amazfit Bip [Wiki](https://github.com/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Bip) +* Amazfit Cor (no maintainer) [Wiki](https://github.com/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Cor) +* HPlus Devices (e.g. ZeBand) [Wiki](https://github.com/Freeyourgadget/Gadgetbridge/wiki/HPlus) +* Teclast H10, H30 (WIP) * NO.1 F1 (WIP) * Liveview * Vibratissimo (experimental) diff --git a/app/build.gradle b/app/build.gradle index 8534d1abe..9f8edcc39 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,8 +26,8 @@ android { targetSdkVersion 25 // note: always bump BOTH versionCode and versionName! - versionName "0.23.0" - versionCode 114 + versionName "0.23.2" + versionCode 116 vectorDrawables.useSupportLibrary = true } buildTypes { @@ -75,7 +75,7 @@ dependencies { exclude group: 'com.google.android', module: 'android' } compile 'org.slf4j:slf4j-api:1.7.12' - compile 'com.github.PhilJay:MPAndroidChart:v3.0.2' + compile 'com.github.Freeyourgadget:MPAndroidChart:40c924deab89945a2c7820f51c2fed8b1b803cb4' compile 'com.github.pfichtner:durationformatter:0.1.1' compile 'de.cketti.library.changelog:ckchangelog:1.2.2' compile 'net.e175.klaus:solarpositioning:0.0.9' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 147060ead..57fb6c530 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,6 +21,7 @@ + (); + + int count = c.getCount(); + if (count > 0) { + for (int i = 0; i < count; i++) { + c.moveToPosition(i); + if (i == 0) { + + weatherSpec.location = c.getString(0); + weatherSpec.currentConditionCode = Weather.mapToOpenWeatherMapCondition(c.getInt(2)); + weatherSpec.currentCondition = Weather.getConditionString(weatherSpec.currentConditionCode); + //alternatively the following would also be possible + //weatherSpec.currentCondition = c.getString(1); + + weatherSpec.currentTemp = toKelvin(c.getFloat(3)); + weatherSpec.currentHumidity = (int) c.getFloat(4); + weatherSpec.todayMinTemp = toKelvin(c.getFloat(5)); + weatherSpec.todayMaxTemp = toKelvin(c.getFloat(6)); + weatherSpec.timestamp = (int) (Long.valueOf(c.getString(9)) / 1000); + } else { + + WeatherSpec.Forecast gbForecast = new WeatherSpec.Forecast(); + gbForecast.minTemp = toKelvin(c.getFloat(5)); + gbForecast.maxTemp = toKelvin(c.getFloat(6)); + gbForecast.conditionCode = Weather.mapToOpenWeatherMapCondition(c.getInt(8)); + weatherSpec.forecasts.add(gbForecast); + } + } + } + + Weather.getInstance().setWeatherSpec(weatherSpec); + GBApplication.deviceService().onSendWeather(weatherSpec); + + } finally { + c.close(); + } + } + + } + + private void updateWeather() { + Intent updateIntent = new Intent(Intent.ACTION_MAIN) + .setClassName(SERVICE_PACKAGE, SERVICE_PACKAGE + ".WeatherService"); + updateIntent.setAction(SERVICE_PACKAGE + ".ACTION_UPDATE"); + mContext.startService(updateIntent); + } + + private boolean isOmniJawsServiceAvailable() throws NameNotFoundException { + final PackageManager pm = mContext.getPackageManager(); + pm.getPackageInfo("org.omnirom.omnijaws", 0); + return true; + } + + private void checkSettings() { + if (!mInstalled) { + return; + } + final Cursor c = mContext.getContentResolver().query(SETTINGS_URI, SETTINGS_PROJECTION, + null, null, null); + if (c != null) { + int count = c.getCount(); + if (count == 1) { + c.moveToPosition(0); + mEnabled = c.getInt(0) == 1 ? true : false; + mMetric = c.getInt(1) == 0 ? true : false; + } + } + } + + private int toKelvin(double temperature) { + if (mMetric) { + return (int) (temperature + 273.15); + } + return (int) ((temperature - 32) * 0.5555555555555556D + 273.15); + } + +} \ No newline at end of file diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/AppNotificationType.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/AppNotificationType.java index e7c021201..db6c3de18 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/AppNotificationType.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/AppNotificationType.java @@ -69,6 +69,9 @@ public class AppNotificationType extends HashMap { // Telegram put("org.telegram.messenger", NotificationType.TELEGRAM); + // Threema + put("ch.threema.app", NotificationType.THREEMA); + // Twitter put("org.mariotaku.twidere", NotificationType.TWITTER); put("com.twitter.android", NotificationType.TWITTER); @@ -139,6 +142,9 @@ public class AppNotificationType extends HashMap { // Transit put("com.thetransitapp.droid", NotificationType.TRANSIT); + + // Etar + put("ws.xsoh.etar", NotificationType.GENERIC_CALENDAR); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/NotificationType.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/NotificationType.java index 936a1f60d..9349bacce 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/NotificationType.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/NotificationType.java @@ -57,6 +57,7 @@ public enum NotificationType { SLACK(PebbleIconID.NOTIFICATION_SLACK, PebbleColor.Folly), SNAPCHAT(PebbleIconID.NOTIFICATION_SNAPCHAT, PebbleColor.Icterine), TELEGRAM(PebbleIconID.NOTIFICATION_TELEGRAM, PebbleColor.VividCerulean), + THREEMA(PebbleIconID.NOTIFICATION_HIPCHAT, PebbleColor.JaegerGreen), TRANSIT(PebbleIconID.LOCATION, PebbleColor.JaegerGreen), TWITTER(PebbleIconID.NOTIFICATION_TWITTER, PebbleColor.BlueMoon), VIBER(PebbleIconID.NOTIFICATION_VIBER, PebbleColor.VividViolet), @@ -101,6 +102,7 @@ public enum NotificationType { case RIOT: case SIGNAL: case TELEGRAM: + case THREEMA: case WHATSAPP: case GOOGLE_MESSENGER: case GOOGLE_HANGOUTS: diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java index 3b6c00799..0215568d0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java @@ -30,6 +30,7 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; +import android.os.Handler; import android.os.IBinder; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; @@ -53,6 +54,7 @@ import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothPairingReque import nodomain.freeyourgadget.gadgetbridge.externalevents.CMWeatherReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.CalendarReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.MusicPlaybackReceiver; +import nodomain.freeyourgadget.gadgetbridge.externalevents.OmniJawsObserver; import nodomain.freeyourgadget.gadgetbridge.externalevents.PebbleReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.PhoneCallReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.SMSReceiver; @@ -175,6 +177,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere private AlarmReceiver mAlarmReceiver = null; private CalendarReceiver mCalendarReceiver = null; private CMWeatherReceiver mCMWeatherReceiver = null; + private OmniJawsObserver mOmniJawsObserver = null; private Random mRandom = new Random(); private final String[] mMusicActions = { @@ -588,7 +591,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere LOG.info("Setting broadcast receivers to: " + enable); if (enable && initialized && coordinator != null && coordinator.supportsCalendarEvents()) { - if (mCalendarReceiver == null && getPrefs().getBoolean("enable_calendar_sync", true)) { + if (mCalendarReceiver == null && getPrefs().getBoolean("enable_calendar_sync", true)) { if (!(GBApplication.isRunningMarshmallowOrLater() && ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) == PackageManager.PERMISSION_DENIED)) { IntentFilter calendarIntentFilter = new IntentFilter(); calendarIntentFilter.addAction("android.intent.action.PROVIDER_CHANGED"); @@ -632,7 +635,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere if (mMusicPlaybackReceiver == null) { mMusicPlaybackReceiver = new MusicPlaybackReceiver(); IntentFilter filter = new IntentFilter(); - for (String action : mMusicActions){ + for (String action : mMusicActions) { filter.addAction(action); } registerReceiver(mMusicPlaybackReceiver, filter); @@ -663,6 +666,14 @@ public class DeviceCommunicationService extends Service implements SharedPrefere mCMWeatherReceiver = new CMWeatherReceiver(); registerReceiver(mCMWeatherReceiver, new IntentFilter("GB_UPDATE_WEATHER")); } + if (mOmniJawsObserver == null && coordinator != null && coordinator.supportsWeather()) { + try { + mOmniJawsObserver = new OmniJawsObserver(new Handler()); + getContentResolver().registerContentObserver(mOmniJawsObserver.WEATHER_URI, true, mOmniJawsObserver); + } catch (PackageManager.NameNotFoundException e) { + //Nothing wrong, it just means we're not running on omnirom. + } + } } else { if (mPhoneCallReceiver != null) { unregisterReceiver(mPhoneCallReceiver); @@ -701,6 +712,9 @@ public class DeviceCommunicationService extends Service implements SharedPrefere unregisterReceiver(mCMWeatherReceiver); mCMWeatherReceiver = null; } + if (mOmniJawsObserver != null) { + getContentResolver().unregisterContentObserver(mOmniJawsObserver); + } } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BLETypeConversions.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BLETypeConversions.java index 47b46a172..c5a41aad1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BLETypeConversions.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BLETypeConversions.java @@ -327,6 +327,7 @@ public class BLETypeConversions { case SKYPE: case SNAPCHAT: case TELEGRAM: + case THREEMA: case TWITTER: case WHATSAPP: case VIBER: diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/amazfitbip/AmazfitBipFirmwareInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/amazfitbip/AmazfitBipFirmwareInfo.java index cfc50290c..bea180990 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/amazfitbip/AmazfitBipFirmwareInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/amazfitbip/AmazfitBipFirmwareInfo.java @@ -26,7 +26,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiFirmwareT import nodomain.freeyourgadget.gadgetbridge.util.ArrayUtils; public class AmazfitBipFirmwareInfo extends HuamiFirmwareInfo { - // total crap maybe + // gps detection is totally bogus, just the first 16 bytes private static final byte[] GPS_HEADER = new byte[]{ (byte) 0xcb, 0x51, (byte) 0xc1, 0x30, 0x41, (byte) 0x9e, 0x5e, (byte) 0xd3, 0x51, 0x35, (byte) 0xdf, 0x66, (byte) 0xed, (byte) 0xd9, 0x5f, (byte) 0xa7 @@ -35,6 +35,10 @@ public class AmazfitBipFirmwareInfo extends HuamiFirmwareInfo { 0x10, 0x50, 0x26, 0x76, (byte) 0x8f, 0x4a, (byte) 0xa1, 0x49, (byte) 0xa7, 0x26, (byte) 0xd0, (byte) 0xe6, 0x4a, 0x21, (byte) 0x88, (byte) 0xd4 }; + private static final byte[] GPS_HEADER3 = new byte[]{ + (byte) 0xeb, (byte) 0xfa, (byte) 0xc5, (byte) 0x89, (byte) 0xf0, 0x5c, 0x2e, (byte) 0xcc, + (byte) 0xfa, (byte) 0xf3, 0x62, (byte) 0xeb, (byte) 0x92, (byte) 0xc6, (byte) 0xa1, (byte) 0xbb + }; // guessed - at least it is the same across versions from 0.0.7.x to 0.0.9.x // and different from other devices @@ -76,6 +80,8 @@ public class AmazfitBipFirmwareInfo extends HuamiFirmwareInfo { crcToVersion.put(26714, "0.1.0.11"); crcToVersion.put(64160, "0.1.0.17"); crcToVersion.put(43028, "0.1.0.27"); + crcToVersion.put(59462, "0.1.0.33"); + crcToVersion.put(55277, "0.1.0.39"); // resources crcToVersion.put(12586, "0.0.8.74"); @@ -85,11 +91,14 @@ public class AmazfitBipFirmwareInfo extends HuamiFirmwareInfo { crcToVersion.put(22051, "0.0.9.40"); crcToVersion.put(46233, "0.0.9.49-0.1.0.11"); crcToVersion.put(12098, "0.1.0.17"); - crcToVersion.put(28696, "0.1.0.27"); + crcToVersion.put(28696, "0.1.0.26-0.1.0.27"); + crcToVersion.put(5650, "0.1.0.33"); + crcToVersion.put(16117, "0.1.0.39"); // gps crcToVersion.put(61520, "9367,8f79a91,0,0,"); crcToVersion.put(8784, "9565,dfbd8fa,0,0,"); + crcToVersion.put(16716, "9565,dfbd8faf42,0"); } public AmazfitBipFirmwareInfo(byte[] bytes) { @@ -104,7 +113,7 @@ public class AmazfitBipFirmwareInfo extends HuamiFirmwareInfo { } return HuamiFirmwareType.RES; } - if (ArrayUtils.startsWith(bytes, GPS_HEADER) || ArrayUtils.startsWith(bytes, GPS_HEADER2)) { + if (ArrayUtils.startsWith(bytes, GPS_HEADER) || ArrayUtils.startsWith(bytes, GPS_HEADER2) || ArrayUtils.startsWith(bytes, GPS_HEADER3)) { return HuamiFirmwareType.GPS; } if (ArrayUtils.startsWith(bytes, GPS_ALMANAC_HEADER)) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiIcon.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiIcon.java index 2e388ab1a..bf1720a12 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiIcon.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiIcon.java @@ -60,7 +60,6 @@ public class HuamiIcon { public static final byte WEATHER = 35; public static final byte HR_WARNING_36 = 36; - public static byte mapToIconId(NotificationType type) { switch (type) { case UNKNOWN: @@ -104,6 +103,8 @@ public class HuamiIcon { return SNAPCHAT; case TELEGRAM: return TELEGRAM; + case THREEMA: + return CHAT_BLUE_13; case VIBER: return VIBER; case WECHAT: @@ -115,4 +116,4 @@ public class HuamiIcon { } return APP_11; } -} \ No newline at end of file +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitcor/AmazfitCorFirmwareInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitcor/AmazfitCorFirmwareInfo.java index 314dec28b..5ceccc267 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitcor/AmazfitCorFirmwareInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitcor/AmazfitCorFirmwareInfo.java @@ -33,6 +33,7 @@ public class AmazfitCorFirmwareInfo extends HuamiFirmwareInfo { }; private static final int FW_HEADER_OFFSET = 0x9330; + private static final int FW_HEADER_OFFSET_2 = 0x9340; private static final int NEW_RES_HEADER_OFFSET = 0x9; private static Map crcToVersion = new HashMap<>(); @@ -61,7 +62,7 @@ public class AmazfitCorFirmwareInfo extends HuamiFirmwareInfo { return HuamiFirmwareType.RES; } else if (ArrayUtils.equals(bytes, RES_HEADER, NEW_RES_HEADER_OFFSET)) { return HuamiFirmwareType.RES_NEW; - } else if (ArrayUtils.equals(bytes, FW_HEADER, FW_HEADER_OFFSET)) { + } else if (ArrayUtils.equals(bytes, FW_HEADER, FW_HEADER_OFFSET) || ArrayUtils.equals(bytes, FW_HEADER, FW_HEADER_OFFSET_2)) { // TODO: this is certainly not a correct validation, but it works for now return HuamiFirmwareType.FIRMWARE; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/DeviceInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/DeviceInfo.java index 919a22965..090c97b5d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/DeviceInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/DeviceInfo.java @@ -95,6 +95,10 @@ public class DeviceInfo extends AbstractInfo { return fw2Version; } + public int getProfileVersion() { + return profileVersion; + } + public void setTest1AHRMode(boolean enableTestMode) { test1AHRMode = enableTestMode; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/operations/FetchActivityOperation.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/operations/FetchActivityOperation.java index ed4dc0250..6aaded69c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/operations/FetchActivityOperation.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/operations/FetchActivityOperation.java @@ -67,11 +67,11 @@ public class FetchActivityOperation extends AbstractMiBand1Operation { private final int activityMetadataLength = 11; - //temporary buffer, size is a multiple of 60 because we want to store complete minutes (1 minute = 3 or 4 bytes) - private final int activityDataHolderSize; private final boolean hasExtendedActivityData; + private final boolean hasPacketCounter; - private static class ActivityStruct { + private class ActivityStruct { + private int maxDataPacketLength = 20; private int lastNotifiedProgress; private final byte[] activityDataHolder; private final int activityDataHolderSize; @@ -86,21 +86,22 @@ public class FetchActivityOperation extends AbstractMiBand1Operation { //same as above, but remains untouched for the ack message private GregorianCalendar activityDataTimestampToAck = null; - ActivityStruct(int activityDataHolderSize) { + ActivityStruct(int activityDataHolderSize, int maxDataPacketLength) { this.activityDataHolderSize = activityDataHolderSize; + this.maxDataPacketLength = maxDataPacketLength; activityDataHolder = new byte[activityDataHolderSize]; } - public boolean hasRoomFor(byte[] value) { + boolean hasRoomFor(byte[] value) { return activityDataRemainingBytes >= value.length; } - public boolean isValidData(byte[] value) { + boolean isValidData(byte[] value) { //I don't like this clause, but until we figure out why we get different data sometimes this should work - return value.length == 20 || value.length == activityDataRemainingBytes; + return value.length == maxDataPacketLength || value.length == activityDataRemainingBytes; } - public boolean isBufferFull() { + boolean isBufferFull() { return activityDataHolderSize == activityDataHolderProgress; } @@ -116,11 +117,11 @@ public class FetchActivityOperation extends AbstractMiBand1Operation { GB.assertThat(activityDataRemainingBytes >= 0, "Illegal state, remaining bytes is negative"); } - public boolean isFirstChunk() { + boolean isFirstChunk() { return activityDataTimestampProgress == null; } - public void startNewBlock(GregorianCalendar timestamp, int dataUntilNextHeader) { + void startNewBlock(GregorianCalendar timestamp, int dataUntilNextHeader) { GB.assertThat(timestamp != null, "Timestamp must not be null"); if (isFirstChunk()) { @@ -140,11 +141,11 @@ public class FetchActivityOperation extends AbstractMiBand1Operation { validate(); } - public boolean isBlockFinished() { + boolean isBlockFinished() { return activityDataRemainingBytes == 0; } - public void bufferFlushed(int minutes) { + void bufferFlushed(int minutes) { activityDataTimestampProgress.add(Calendar.MINUTE, minutes); activityDataHolderProgress = 0; lastNotifiedProgress = 0; @@ -156,8 +157,11 @@ public class FetchActivityOperation extends AbstractMiBand1Operation { public FetchActivityOperation(MiBandSupport support) { super(support); hasExtendedActivityData = support.getDeviceInfo().supportsHeartrate(); - activityDataHolderSize = getBytesPerMinuteOfActivityData() * 60 * 4; // 4h - activityStruct = new ActivityStruct(activityDataHolderSize); + hasPacketCounter = support.getDeviceInfo().getProfileVersion() >= 0x02000700; + //temporary buffer, size is a multiple of 60 because we want to store complete minutes (1 minute = 3 or 4 bytes) + int activityDataHolderSize = getBytesPerMinuteOfActivityData() * 60 * 4; + int maxDataPacketLength = hasPacketCounter ? (hasExtendedActivityData ? 16 : 18) : 20; + activityStruct = new ActivityStruct(activityDataHolderSize, maxDataPacketLength); } @Override @@ -216,7 +220,13 @@ public class FetchActivityOperation extends AbstractMiBand1Operation { if (value.length == activityMetadataLength) { handleActivityMetadata(value); } else { - bufferActivityData(value); + if (hasPacketCounter) { + byte[] valueChopped = new byte[value.length - 1]; + System.arraycopy(value, 1, valueChopped, 0, value.length - 1); + bufferActivityData(valueChopped); + } else { + bufferActivityData(value); + } } if (LOG.isDebugEnabled()) { LOG.debug("activity data: length: " + value.length + ", remaining bytes: " + activityStruct.activityDataRemainingBytes); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/NotificationUtils.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/NotificationUtils.java index e5ed419e9..140eed573 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/NotificationUtils.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/NotificationUtils.java @@ -46,6 +46,7 @@ public class NotificationUtils { case SKYPE: case SNAPCHAT: case TELEGRAM: + case THREEMA: case TWITTER: case WHATSAPP: case VIBER: diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 1f335db61..626a3e46d 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -169,7 +169,7 @@ Παρακαλώ ενεργοποιήστε τις υπηρεσίες τοποθεσίας Η τοποθεσία βρέθηκε - Υποχρεωτικό πρωτόκολλο ειδοποιήσεων + Πρωτόκολλο υποχρεωτικών ειδοποιήσεων Αυτή η επιλογή υποχρεώνει την χρήση του πιο πρόσφατου πρωτοκόλλου ειδοποιήσεων ανάλογα με την έκδοση του λογισμικού. ΕΝΕΡΓΟΠΟΙΗΣΤΕ ΜΟΝΟ ΑΝ ΞΕΡΕΤΕ ΤΙ ΚΑΝΕΤΕ! Να επιτρέπονται τα μη δοκιμασμένα χαρακτηριστικά Χρήση μη δοκιμασμένων χαρακτηριστικών. ΕΝΕΡΓΟΠΟΙΗΣΤΕ ΜΟΝΟ ΑΝ ΞΕΡΕΤΕ ΤΙ ΚΑΝΕΤΕ! @@ -277,7 +277,7 @@ Ρυθμίσεις δόνησης Γενικές ειδοποιήσεις Ειδοποιήσεις email - Τοποθεσία καιρού + Τοποθεσία καιρού (για τις ROM Cyanogenmod ή LineageOS) Ειδοποιήσεις εισερχομένων κλήσεων Συζήτηση @@ -542,4 +542,5 @@ Exrizu K8 No.1 F1 Teclast H30 - +Καιρός + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index fa8e367ba..0fbe9f153 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -458,4 +458,30 @@ Cada 30 minutos Cada hora - + Tiempo + Ubicación para el tiempo (CM/LOS) + + Firmware + Datos no válidos + Fuente + Firmware del GPS + Almanaque GPS + Corrección de error del GPS + Recursos + Watchface + + Dispositivo desconocido + Dispositivo de prueba + Pebble + Mi Band + Mi Band 2 + Amazfit Bip + Amazfit Cor + Vibratissimo + LiveView + HPlus + Makibes F68 + Exrizu K8 + No.1 F1 + Teclast H30 + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d6ba5cd3a..4f7d4f0e8 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -51,7 +51,7 @@ Ce micrologiciel n\'a pas été testé et peut ne pas être compatible avec Gadgetbridge. \n \nIl n\'est pas conseillé de le flasher sur votre Mi Band ! - Si vous désirez continuer et que tout fonctionne correctement par la suite, veuillez en informer les développeurs de Gadgetbridge pour demander l\'ajout de ce micrologiciel à leur liste: %s + Si vous désirez continuer et que tout fonctionne correctement par la suite, veuillez en informer les développeurs de Gadgetbridge pour demander l\'ajout de ce micrologiciel à leur liste : %s Paramètres Paramètres généraux @@ -166,8 +166,8 @@ Installation du binaire %1$d/%2$d Échec de l\'installation Installation réalisée avec succès - VOUS TENTEZ D\'INSTALLER UN MICROLOGICIEL, PROCÉDEZ À VOS RISQUES ET PÉRILS.\n\n\nCe micrologiciel est pour la version de matériel: %s - Vous êtes sur le point d\'installer l\'application suivante:\n\n\n%1$s Version %2$s par %3$s\n + VOUS TENTEZ D\'INSTALLER UN MICROLOGICIEL, PROCÉDEZ À VOS RISQUES ET PÉRILS.\n\n\nCe micrologiciel est pour la version de matériel : %s + Vous êtes sur le point d\'installer l\'application suivante :\n\n\n%1$s Version %2$s par %3$s\n N.D. Initialisé %1$s par %2$s @@ -248,18 +248,18 @@ Objectif de pas par jour Erreur lors de l’exécution de %1$s\' Votre activité (ALPHA) - Impossible de se connecter: %1$s + Impossible de se connecter : %1$s Impossible de trouver un gestionnaire pour installer ce fichier. - Impossible d\'installer le ficher suivant: %1$s - Impossible d\'installer le micrologiciel spécifié: il ne correspond pas à la version du matériel de votre Pebble. + Impossible d\'installer le ficher suivant : %1$s + Impossible d\'installer le micrologiciel spécifié : il ne correspond pas à la version du matériel de votre Pebble. Veuillez patienter pendant la détermination de l\'état de l\'installation… Niveau de batterie faible ! - %1$s batterie restante: %2$s%% - Dernière charge: %s \n - Nombre de charges: %s + %1$s batterie restante : %2$s%% + Dernière charge : %s \n + Nombre de charges : %s Votre sommeil Sommeil cette semaine - Sommeil aujourd\'hui, objectif: %1$s + Sommeil aujourd\'hui, objectif : %1$s Pas de la semaine Votre activité et sommeil Mise à jour du micrologiciel… @@ -267,7 +267,7 @@ %1$s: %2$s %3$s Version compatible Version non-testée ! - Connexion à l\'appareil: %1$s + Connexion à l\'appareil : %1$s Micrologiciel Pebble %1$s Version du matériel correcte Version du matériel incorrecte ! @@ -284,7 +284,7 @@ Fréquence cardiaque Batterie Activité en direct - Nombre de pas aujourd\'hui, objectif: %1$s + Nombre de pas aujourd\'hui, objectif : %1$s Ne pas confirmer le transfert de données d\'activités Les données d\'activités ne seront pas effacées du bracelet si elles ne sont pas confirmées. Utile si GB est utilisé avec d\'autres applications. Les données d\'activités seront conservées sur le Mi Band après la synchronisation. Utile si GB est utilisé avec d\'autres applications. @@ -338,8 +338,8 @@ Temps de sommeil péféré en heures Une alarme a été enregistré pour %1$02d:%2$02d - Révision matérielle: %1$s - Version du micrologiciel: %1$s + Révision matérielle : %1$s + Version du micrologiciel : %1$s Erreur à la création de votre fichier log : %1$s "Révision matérielle : " Le micrologiciel se met à jour @@ -348,7 +348,7 @@ Temps de sommeil péféré en heures Fréquence cardiaque Stockez les enregistrements brut dans la base de données Si coché, les données sont stockées \"telles quelles\" et seront disponibles pour une interprétation ultérieure. -NOTE: la base de données sera bien évidement plus grande ! +NOTE : la base de données sera bien évidement plus grande ! Gestion de base de données Gestion de base de données Les opérations sur la base de donnée ont utilisé le chemin suivant sur votre appareil. @@ -357,13 +357,13 @@ NOTE: la base de données sera bien évidement plus grande ! Effacer l\'ancienne base de données Impossible d\'accéder au fichier d\'export. Merci de contacter les développeurs. Exporter vers : %1$s - Erreur d\'exportation de la base de données: %1$s - Erreur d\'exportation des préférences: %1$s + Erreur d\'exportation de la base de données : %1$s + Erreur d\'exportation des préférences : %1$s Importer des données ? Voulez-vous vraiment effacer la base de données actuelle ? Toutes vos données (si vous en avez) seront perdues. Importation réussie. - Erreur lors de l\'importation de la base de données: %1$s - Erreur d\'importation des préférences: %1$s + Erreur lors de l\'importation de la base de données : %1$s + Erreur d\'importation des préférences : %1$s Détruire les anciennes données ? Voulez-vous vraiment détruire entièrement la base de données ? Toutes vos données d\'activité et vos informations issues de vos appareils seront perdues. Les données ont été effacées. @@ -390,17 +390,17 @@ NOTE: la base de données sera bien évidement plus grande ! Réveil (%1$s) Vous l\'avez trouvé ! - Mi2: format de l\'heure + Mi2 : format de l\'heure Vous devez installer la version %1$s avant d\'installer ce micrologiciel ! Notifications textuelles - + Éteint Éteint Automatique (détection de sommeil) Programmé (intervalle de temps) Tentative de jumelage avec %1$s Le lien avec %1$s a échoué instantanément. - Tentative de connexion à: %1$s + Tentative de connexion à : %1$s Activez le Bluetooth pour trouver des dispositifs. Correctement lié à %1$s. Appairer avec %1$s ? @@ -411,7 +411,7 @@ NOTE: la base de données sera bien évidement plus grande ! \n \nVeuillez installer le micrologiciel .gps, ensuite le fichier .res, puis le fichier .fw. Votre montre redémarrera après installation du .fw. \n -\nNote: vous ne devez pas installer .res et .gps si ceux-ci sont identiques à ceux installés précédemment. +\nNote : vous ne devez pas installer .res et .gps si ceux-ci sont identiques à ceux installés précédemment. \n \nCONTINUEZ À VOS RISQUES ! Firmware Amazfit Bip %1$s @@ -443,7 +443,7 @@ NOTE: la base de données sera bien évidement plus grande ! \n \nVeuillez installer le micrologiciel .gps, ensuite le fichier .res, puis le fichier .fw. Votre montre redémarrera après installation du .fw. \n -\nNote: vous ne devez pas installer .res si celui-ci est identique à celui installé précédemment. +\nNote : vous ne devez pas installer .res si celui-ci est identique à celui installé précédemment. \n \nNON TESTÉ, PEUT BRICKER L\'APPAREIL. CONTINUEZ À VOS RISQUES ! Micrologiciel Amazfit Cor %1$s @@ -462,4 +462,30 @@ NOTE: la base de données sera bien évidement plus grande ! Toutes les 30 minutes Une fois par heure - + Météo + Emplacement météo (CM/LOS) + + Micrologiciel + Données non valides + Police + Micrologiciel GPS + Almanach GPS + Correction d\'erreurs GPS + Ressources + Watchface + + Appareil inconnu + Appareil de test + Pebble + Mi Band + Mi Band 2 + Amazfit Bip + Amazfit Cor + Vibratissimo + LiveView + HPlus + Makibes F68 + Exrizu K8 + No.1 F1 + Teclast H30 + diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 3f9897187..a2b0719c4 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -463,7 +463,7 @@ כל חצי שעה פעם בשעה - מיקום מזג אוויר + מיקום מזג אוויר (CM/LOS) קושחה נתונים שגויים @@ -487,4 +487,5 @@ Exrizu K8 No.1 F1 Teclast H30 - +מזג אוויר + diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 426cb586d..a46443297 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -456,4 +456,30 @@ 繁体中国語 英語 - + 天気 + 天気の場所 (CM/ロサンゼルス) + + ファームウェア + 無効なデータ + フォント + GPS ファームウェア + GPS 年鑑 + GPS エラー訂正 + リソース + ウォッチフェイス + + 不明なデバイス + テスト デバイス + Pebble + Mi Band + Mi Band 2 + Amazfit Bip + Amazfit Cor + Vibratissimo + LiveView + HPlus + Makibes F68 + Exrizu K8 + No.1 F1 + Teclast H30 + diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index bc36a9993..0a4de4e4a 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -48,7 +48,7 @@ Gadgetbru Gadgetbru - Dette vil slette enheten og all tilknyttet data + Dette vil slette enheten og all tilknyttet data! Du er i ferd med å installere fastvaren %s på din Amazfit Bip. \n \nForsikre deg om at du installerer .gps-fastvaren, så .res-fila, og til sist .fw-fila. Armbåndsuret ditt vil starte på nytt etter at .fw-fila er installert. @@ -298,7 +298,7 @@ Feil ved setting av alarm, prøv igjen. Alarmer sendt til enhet. Ingen data. Synkroniser enhet? - I ferd med å overføre %1$d med data fra %2$s + I ferd med å overføre %1$s med data fra %2$s Stegmål Feil under kjøring av \"%1$s\" Din aktivitet (alfa) @@ -426,7 +426,7 @@ Feil ved eksport av innstilling: %1$s Importer data? Vil du virkelig overskrive gjeldende database? All nåværende aktivitetsdata (hvis noen) vil gå tapt. - Importert + Importert. Feil ved import av DB: %1$s Feil ved import av innstilling: %1$s Slett aktivitetsdata? @@ -480,4 +480,65 @@ Åpne på telefonen Forstum Svar +Vær + Fastvare + Ugyldig data + Skrift + GPS-fastvare + Ressurser + Urskive + + Ukjent enhet + Test enhet + Pebble + Mi Band + Mi Band 2 + Skru på + + Vær-plassering (CM/LOS) + + Forhåndsutfylte meldinger + Vanlig endelse + Legg på røret + SKru på logging av klokkeprogram + Logger klokkeprogram i Gadgetbridge (krever omstart) + Send ACK til PebbleKit + Meldinger sendt til eksterne tredjepartsprogrammer vil alltid bli anerkjent umiddelbart + Demp skjerm etter + Tidsjustering i timer (for oppdagelse av søvn for skiftarbeidere) + Kringkast melding ved et gitt antall knappetrykk + Skru på knappehandling + Skru på handling ved gitt antall knappetrykk + Skru på båndvibrasjon + Skru på knappetrykk ved knappetrykk + Maksimal forsinkelse mellom trykk + Maksimal forsinkelse mellom knappetrykk i millisekunder + Forsinkelse etter knappetrykkshandling + Forsinkelse etter at én knappetrykkshandling samsvarer (nummeret er i button_id intent extra) eller 0 for umiddelbar + Aktiver skjerm ved løfting + Databaseoperasjoner bruker følgende sti på din enhet. +\nDenne stien er tilgjengelig for andre Android-programmer og din datamaskin. +\nForvent å finne din eksporterte database (eller plasser databasen du ønsker å importere) der: + Sletting av foreldet database + Får ikke tilgang til eksportstien. Kontakt utviklerne. + Forsikre deg om at denne drakten er iført Værmeldingsprogrammet for å få varsel på din Pebble. +\n +\nInget oppsett nødvendig. +\n +\nDu kan skru på systemværmeldingsprogrammet på din Pebble fra programbehandling. +\n +\nStøttede urskiver vil vise vær automatisk. + Web View-aktivitet + + GPS-almanakk + GPS-korrigering + Amazfit Bip + Amazfit Cor + Vibratissimo + LiveView + HPlus + Makibes F68 + Exrizu K8 + No.1 F1 + Teclast H30 diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 2b37e3c5f..2f1a1a5c9 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -22,7 +22,7 @@ Debug - + Applicatie Beheer Apps in de cache Geïnstalleerde apps Geïnstalleerde wijzerplaten @@ -34,7 +34,7 @@ deactiveren Activeer HRM Deactiveer HRM - Activeer het systeem weer app + Activeer de systeemweer-app Installeer de app voor weerbericht Configureren Verplaats naar de top @@ -42,13 +42,13 @@ Notificatie zwarte lijst U staat op het punt om firmware% s te installeren in plaats van die nu op uw Mi Band staat. - U staat op het punt om firmware% s te installeren in plaats van die nu op uw Amazfit Bip staat. -\n -\nZorg ervoor dat u de .gps firmware installeert, dan het .res-bestand en tenslotte het .fw-bestand. Uw horloge wordt opnieuw gestart na het installeren van het .fw-bestand. -\n -\nOpmerking: u hoeft geen .res en .gps te installeren als deze bestanden exact hetzelfde zijn als die welke eerder zijn geïnstalleerd. -\n -\nEXPERIMENTEEL, PROCEDURE OP JE EIGEN RISICO + U staat op het punt om firmware %s te installeren op uw Amazfit Bip. +\n +\nZorg ervoor dat u de .gps firmware installeert, dan het .res-bestand en tenslotte het .fw-bestand. Uw horloge wordt opnieuw gestart na het installeren van het .fw-bestand. +\n +\nOpmerking: u hoeft geen .res en .gps te installeren als deze bestanden exact hetzelfde zijn als die welke eerder zijn geïnstalleerd. +\n +\nGA VERDER OP EIGEN RISICO! U staat op het punt om firmwares %1$s en %2$s te installeren in plaats van die momenteel op uw Mi Band staat. Deze firmware is getest en is compatibel met Gadgetbridge. Deze firmware is niet getest en is mogelijk niet compatibel met Gadgetbridge. @@ -104,7 +104,7 @@ Verberg naam en nummer - Blacklist Apps + Apps op de zwarte lijst plaatsen Blacklist Kalenders Antwoorden @@ -117,14 +117,14 @@ Pebble instellingen - Activity trackers - Gewenste activiteit tracker + "Activiteit trackers " + Voorkeurs-activiteit tracker Synchroniseer Pebble Health Sync Misfit Sync Morpheuz Ondersteun uitgaande oproepen - Als u dit uitschakelt, wordt ook de Pebble 2/LE gestopt om voor uitgaande gesprekken te trillen + Als u dit uitschakelt, zal de Pebble 2/LE ook stoppen met trillen bij uitgaande gesprekken Toegang tot de Android App van 3de partij toestaan De experimentele ondersteuning voor Android Apps inschakelen met PebbleKit @@ -149,14 +149,397 @@ Activeer de netwerk locatie locatie gevonden - Succesvol gekoppeld aan %1$s. + Succesvol gekoppeld met %1$s. Koppel met %1$s? - Koppelen selecteren om uw apparaten te koppelen. Als dit mislukt, probeer het opnieuw zonder te koppelen. + Selecteer koppelen om uw apparaten te koppelen. Als dit mislukt, probeer het opnieuw zonder koppelen. Koppel Niet Koppelen - Open op de telefoon + Open op telefoon Dempen Antwoord %1$s: %2$s %3$s +Verbinden + Open het navigatie scherm + Sluit het navigatie scherm + Deactiveer de systeemweer-app + Kalenders op de zwarte lijst + + Firmware/Apps installeren + U staat op het punt om firmware %s te installeren op uw Amazfit Cor. +\n +\nZorg ervoor dat u het .res-bestand installeert en daarna het .fw-bestand. Uw horloge zal herstarten na de installatie van het .fw-bestand. +\n +\nOpmerking: U hoeft de .res niet te installeren als deze exact dezelfde is als degene die ervoor al was geïnstalleerd. +\n +\nNOG NIET GETEST, KAN UW TOESTEL ONBRUIKBAAR MAKEN, GA VERDER OP EIGEN RISICO! + Activeer links/rechts vegen in grafiek schermen + + Weer + Weer locatie (CM/LOS) + + Verwijder automatisch verworpen meldingen + Meldingen worden automatisch verwijderd op de Pebble als ze verworpen worden op het Android toestel + + Schuif de meldingstekst van het scherm + Voorgedefinieerde berichten + Verplicht notificatie protocol + Deze optie verplicht het gebruik van het laatste notificatie protocol, afhankelijk van de firmware versie. SCHAKEL DIT ALLEEN IN ALS JE WEET WAAR JE MEE BEZIG BENT! + Schakel niet geteste features in + Schakel features in die nog niet getest zijn. SCHAKEL DIT ALLEEN IN ALS JE WEET WAAR JE MEE BEZIG BENT! + Geef altijd de voorkeur aan BLE + Gebruik experimentele Pebble LE-ondersteuning voor alle Pebbels in plaats van BT classic, dit vereist het paren met een Pebble LE nadat een niet LE-versie eenmalig geconnecteerd is geweest. + Pebble 2/LE GATT MTU limiet + Als uw Pebble 2/Pebble LE niet werkt zoals verwacht, probeer deze instelling om de MTU te limiteren (geldig bereik: 20-512) + logging van horlogeapp inschakelen + Zorgt ervoor dat logs van horloge-apps gelogd zullen worden door Gadgetbridge (opnieuw verbinden vereist) + Vroegtijdige ACK PebbleKit + Zorgt ervoor dat berichten die door apps van derden worden verzonden, altijd en onmiddellijk herkend zullen worden + Schakel achtergrond JS in + Wanneer ingeschakeld, kunnen horloges het weer, batterijinformatie enz weergeven + + Pogingen tot opnieuw verbinden + + Eenheden + Tijd weergave + Scherm en duratie + Heel de dag door hartslag metingen uitvoeren + HPlus/Makibes instellingen + + Niet verbonden + Aan het verbinden + Verbonden + Onbekende staat + (onbekend) + Test + Test notificatie + Dit is een test notificatie van Gadgetbridge + Bluetooth is niet ondersteund. + Bluetooth is uitgeschakeld. + Tap op het verbonden toestel voor de App beheerder + Tap op het verbonden toestel voor activiteitsweergave + Tap op het verbonden toestel voor vibratie + Tap op een toestel om te verbinden + Kan niet verbinden. Is het Bluetooth adres ongeldig? + Gadgetbridge loopt + Binary installeren %1$d/%2$d + Installatie gefaald + Installatie succesvol + U PROBEERT EEN NIEUWE FIRMWARE TE INSTALLEREN, GA VERDER OP EIGEN RISICO. +\n +\n +\nDeze firmware is voor HW revisie: %s + U staat op het punt om volgende app te installeren: +\n +\n +\n%1$s Versie %2$s door %3$s +\n + N/B + Geïnitialiseerd + %1$s door %2$s + Naar apparaten scannen + + Stop met scannen + Start met scannen + Nieuw toestel verbinden + %1$s (%2$s) + Toestel koppelen + Gebruik het Android Bluetooth-venster om het toestel te koppelen. + Koppel uw Mi Band + Koppelen met %s… + Koppeling maken met %1$s (%2$s) + Niet in staat om te koppelen met %1$s (%2$s) + Bezig met koppelen: %1$s (%2$s) + Reeds gekoppeld met %1$s (%2$s), verbinden… + Geen MAC adres doorgegeven, kan niet koppelen. + Toestel specifieke instellingen + Mi Band / Amazfit instellingen + Amazfit Bip instellingen + Mannelijk + Vrouwelijk + Anders + Links + Rechts + Geen geldige gebruikers data ingegeven, voorlopig dummy gebruikersdata gebruiken. + Als uw Mi Band trilt en oplicht, tik een aantal keer na elkaar. + Installeren + Maak uw toestel zichtbaar. Toestellen die op dit moment verbonden zijn zullen waarschijnlijk niet zichtbaar zijn. Activeer locatie (b.v. GPS) op Android 6+. Schakel Privacy Guard voor Guadgetbridge uit, anders kan uw telefoon crashen en herstarten. Als er geen toestel gevonden is na een paar minuten, probeer dan opnieuw na het heropstarten van uw mobiel toestel. + Opmerking: + Toestel afbeelding + Naam + Vibratie nummer + + Slaapmonitor + Schrijf logbestanden + Initialiseren + Ophalen van activiteitsgegevens + Van %1$s aan %2$s + Links of rechts dragen? + Vibratie profiel + + Staccato + Kort + Medium + Lang + Waterdruppel + Ring + Alarm klok + Vibratie + + Proberen + SMS notificatie + Vibratie instellingen + Generieke melding + E-mail notificatie + Inkomend gesprek melding + Chat + Navigatie + Sociaal netwerk + + Hele dag HR-meting + een keer per minuut + iedere 5 minuten + iedere 10 minuten + iedere 30 minuten + een keer per uur + + Snelheidszones + Totale minuten + Stappen per minuut + + Zoek verloren toestel + Annuleer om vibratie te stoppen. + Uw activiteit + Alarmen configureren + Alarmen configureren + Alarm details + Zon + Ma + Di + Woe + Don + Vrij + Zat + Slim ontwaken + Er is een fout opgetreden bij het instellen van de alarmen. Probeer het opnieuw! + Alarmen verzonden naar het apparaat! + Geen data. Toestel synchroniseren? + Klaar om %1$s data over te dragen van %2$s + Doel aantal stappen per dag + Fout bij het uitvoeren van \'%1$s\' + Uw activiteit (ALPHA) + Kan niet verbinden: %1$s + Kan geen handler vinden om dit bestand te installeren. + Kan het gegeven bestand niet installeren: %1$s + Kan de gegeven firmware niet installeren: het komt niet overeen met jouw Pebble\'s hardware revisie. + Gelieve te wachten tijdens het bepalen van de installatie status… + Gadget batterij laag! + %1$s batterij resterend: %2$s%% + Laatste lading: %s +\n + Aantal ladingen: %s + Uw slaap + Slaap per week + Slaap vandaag, doel: %1$s + Stappen per week + Uw activiteit en slaap + Firmware updaten… + Bestand kan niet geïnstalleerd worden, toestel is niet gereed. + Compatibele versie + Niet geteste versie! + Verbinding met toestel: %1$s + Pebble Firmware %1$s + Correcte hardware revisie + Hardware revisie mismatch! + %1$s (%2$s) + Probleem met firmware-overdracht. START uw Mi Band NIET OPNIEUW OP! + Probleem met de firmware metadata-overdracht + Firmware installatie voltooid + Firmware installatie voltooid, opnieuw opstarten… + Firmware schrijven mislukt + Stappen + Calorieën + Afstand + Klok + Hartslag + Batterij + Live activiteit + Stappen vandaag, doel: %1$s + Bevestig de activiteitsdata transfer niet + Als de activiteitsdata niet geacked wordt naar de armband, zal deze niet gewist worden. Dit is nuttig als GB gebruikt wordt samen met andere apps. + Wij zullen activiteitsdata op de Mi Band houden zelfs na synchronisatie. Dit is nuttig als GB gebruikt wordt samen met andere apps. + Gebruik lage vertragingstijd modus voor Firmware updates + Dit kan helpen op toestellen waar firmware updates falen + + Stappen geschiedenis + Huidige stappen/min + Totale stappen + Stappen per minuut geschiedenis + Start uw activiteit + Activiteit + Lichte slaap + Diepe slaap + Niet gedragen + Niet verbonden. + Alle alarmen uitgeschakeld + Houd activiteitsdata op het toestel + Incompatibele firmware + Deze firmware is niet compatibel met het toestel + Alarmen voor te behouden voor toekomstige evenementen + Gebruik hartslag sensor om slaap detectie te verbeteren + Toestel tijdsverschuiving in uren (voor het detecteren van slaap van ploegarbeiders) + Mi2: Datum formaat + Tijd + Tijd & datum + Knoppen acties + Specificeer actie voor de Mi Band 2 knopdruk + Aantal knopdrukken + Aantal knopdrukken nodig om een melding uit te sturen + Uit te zenden bericht + Uit te zenden bericht bij het bereiken van een aantal gedefinieerde knopdrukken + Activeer knop actie + Activeer actie na een gegeven aantal knopdrukken + Schakel band vibratie in + Schakel band vibratie in als een knopactie gedetecteerd wordt + Maximum tijdsvertraging tussen knopdrukken + Maximum tijdsvertraging tussen knopdrukken in milliseconden + Vertraging na knopactie + Vertraag na één knopactie (nummer is button_id intent extra) of nul voor onmiddelijk + Doel notificatie + De armband zal trillen als het doel voor het dagelijks aantal stappen is bereikt + Toon items + Kies de items die weergegeven worden op het armbandscherm + Activeer het display bij optilling + Draai pols om info te switchen + Niet storen + De armband zal geen meldingen krijgen als hij actief is + Inactiviteitswaarschuwingen + De armband zal trillen als je een tijdje inactief bent + Inactiviteits-drempel (in minuten) + Schakel de inactiviteits-waarschuwing uit voor een bepaald tijdsinterval + Start tijd + Stop tijd + + Automatisch + Versimpeld Chinees + Traditioneel Chinees + Engels + + Op het punt om data over te zetten sinds %1$s + + Wachten om opnieuw te verbinden + + Over jou + Geboortejaar + Geslacht + Hoogte in cm + Gewicht in kg + + Authenticatie + Authenticatie vereist + + Zzz + Widget toevoegen + Gewenste slaapduur in uren + Een alarm is ingesteld voor %1$02d:%2$02d + Hardware revisie: %1$s + Firmware versie: %1$s + Fout tijdens het aanmaken van map voor logbestanden: %1$s + "HR: " + Firmware-update wordt uitgevoerd + Firmware niet verzonden + Hartslag + Hartslag + + Bewaar onbewerkte record in de database + Indien aangevinkt, wordt de data opgeslagen \"zoals ze is\" en zijn ze beschikbaar voor latere interpretatie. NB: De database zal groter zijn in dit geval! + Database beheer + Database beheer + De database operaties gebruiken het volgende pad op uw toestel. +\nDit pad is toegankelijk voor andere Android applicaties en uw computer. +\nVerwacht uw geëxporteerde database daar (of plaats de database die u wil importeren) terug te vinden: + Legacy-database verwijderen + Export pad is niet toegankelijk. Neem contact op met de ontwikkelaars. + Geëxporteerd naar: %1$s + Fout bij het exporteren DB: %1$s + Fout bij het exporteren voorkeur: %1$s + Data importeren? + Weet u zeker dat u de huidige database wil overschrijven? Al uw huidige activiteitsgegevens (indien aanwezig) zullen verloren gaan. + Importeren succesvol. + Fout bij het importeren DB: %1$s + Fout bij het importeren voorkeur: %1$s + Verwijder activeitsgegevens? + Weet u zeker dat u de volledige database wil verwijderen? Al uw activiteitsgegevens en informatie over uw toestellen zullen verloren gaan. + Gegevens succesvol verwijderd. + Verwijderen database mislukt. + Oude activiteitsdatabase verwijderen? + Weet u zeker dat u de oude activiteitsdatabase wil verwijderen? Activiteitsgegevens die niet geïmporteerd zijn zullen verloren gaan. + Oude activiteitsgegevens succesvol verwijderd. + Oude activiteitsdatabase verwijderen mislukt. + Overschrijven + Annuleren + Verwijderen + + Vibratie + + Pebble koppelen + Waarschijnlijk verschijnt er een koppelingsdialoogvenster op uw Android-apparaat. Als dat niet gebeurt, kijk dan tussen uw notificaties en accepteer het koppelingsverzoek. Accepteer daarna het koppelingsverzoek op uw Pebble + + Zorg ervoor dat deze skin is ingeschakeld in de Weermeldingen app om informatie over het weer op uw Pebble te krijgen. +\n +\nHier is geen configuratie nodig. +\n +\nU kunt de systeemweer-app van uw Pebble vanuit het app-beheer inschakelen. +\n +\nOndersteunde watchfaces geven het weer automatisch weer. + Schakel Bluetooth koppeling in + Deactiveer dit als u problemen hebt met verbinden + + Metriek + Imperiaal + + 24H + AM/PM + + Alarm klok + + Webweergave activiteit + + (%1$s) + U hebt het gevonden! + Mi2: Tijdsformaat + U moet versie %1$s installeren vooraleer deze firmware te installeren! + Tekst notificaties + Vereist firmware >= 1.0.1.28 en Mili_pro.ft* geïnstalleerd te hebben. + Uit + Uit + Automatisch (slaap detectie) + Gepland (tijdsinterval) + Proberen te koppelen met %1$s + Koppelen met %1$s faalde onmiddellijk. + Proberen te verbinden met: %1$s + Schakel Bluetooth in om toestellen te vinden. + Firmware + Ongeldige data + Lettertype + GPS Firmware + GPS Almanak + GPS Foutcorrectie + Middelen + Wijzerplaat + + Onbekend apparaat + Test Apparaat + Pebble + Mi Band + Mi Band 2 + Amazfit Bip + Amazfit Cor + Virbatissimo + Live beelden + HPlus + Makibes F68 + Exrizu K8 + No.1 F1 + Teclast H30 diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index baae89d9e..3cb7b0332 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -48,12 +48,12 @@ FW/App 安装器 您即将安装固件 %s ,代替当前在Mi Band上的固件。 - 您即将在您的华米手表青春版(Amazfit Bip)上安装固件 %s 。 -\n -\n请确保安装.gps固件,然后安装.res文件,最后安装.fw文件。 安装.fw文件后,手表将重新启动。 -\n -\n注意:如果这些文件与之前安装的完全一样,则不必安装.res和.gps文件。 -\n + 即将在您的米动手表青春版(Amazfit Bip)上安装固件 %s 。 +\n +\n请确保安装.gps固件,然后安装.res文件,最后安装.fw文件。 安装.fw文件后,手表将重新启动。 +\n +\n注意:如果这些文件与之前安装的完全一样,则不必安装.res和.gps文件。 +\n \n***继续需要您自担风险! 您即将在您的米动手环(Amazfit Cor)上安装固件 %s。 \n @@ -67,7 +67,7 @@ 此固件未经测试,可能与Gadgetbridge不兼容。 \n \n不建议把它安装到你的Mi Band! - 如果您仍想继续并且此固件在之后能够正常工作,请告知Gadgetbridge开发者将固件版本列入白名单: %s + 如果您仍想继续并且此固件在安装之后能够正常工作,请告知Gadgetbridge开发者将此固件列入白名单:%s 设置 @@ -90,7 +90,7 @@ 语言 隐藏 Gadgetbridge 通知 - 状态栏中的图标和锁定屏幕中的通知已开启 + 状态栏中的图标和锁定屏幕中的通知已被开启 状态栏中的图标和锁定屏幕中的通知已被隐藏 通知 @@ -117,7 +117,7 @@ 显示号码但隐藏姓名 隐藏姓名和号码 - 天气位置 + 天气位置(CM/LOS) 黑名单应用 黑名单列表 @@ -174,7 +174,7 @@ 应用程序日志将保存在Gadgetbridge中(需要重新连接) 这将导致发送到外部第三方应用程序的消息始终立即得到确认 启用后台JS - 启用后,允许表盘显示天气,电池等信息。 + 启用后,将允许表盘显示天气,电池等信息。 尝试重新连接 @@ -231,7 +231,7 @@ 没有 MAC 地址通过, 不能配对。 设备特定设置 小米手环/Amazfit手表设置 - 华米手表青春版设置 + 米动手表青春版设置 其它 @@ -273,7 +273,7 @@ 每5分钟一次 每10分钟一次 每30分钟一次 - 每一小时一次 + 每小时一次 速度 总分钟 @@ -335,13 +335,13 @@ 距离 时钟 心率 - 电池 + 电量 实时活动数据 今天的步数, 目标:%1$s 不要发送活动数据 如果活动数据未传输到设备,则不会被清除。 GB与其他应用程序一起使用时很有用。 即使在同步之后, 也会将活动数据保留在 Mi Band上。如果 GB 与其他应用程序一起使用, 这将非常有用。 - 使用低延迟模式(low-latency mode)进行固件更新 + 使用低延迟模式进行固件更新 这可能对更新固件失败的设备有帮助 步数历史 @@ -410,7 +410,7 @@ Zzz 添加小部件 - 期望的睡眠时间 + 睡眠时间目标 已设置一个闹钟为 %1$02d:%2$02d 硬件版本:%1$s 固件版本:%1$s @@ -424,8 +424,8 @@ 如果选中该复选框,则数据保持原样,并且稍后可以处理。注意:在这种情况下,数据将占用更多的空间! 数据库管理 数据库管理 - 在您的设备上使用此路径进行数据库操作。 -\n它可用于其他Android应用程序和您的计算机。 + 数据库操作会使用此路径在您的设备上进行。 +\n此路径可用于其它Android应用程序和您的计算机。 \n您可以在这里找到导出的数据库(或放置您要导入的数据库): 删除旧版数据库 无法访问导出路径。请与开发者联系。 @@ -475,7 +475,7 @@ (%1$s) 找到了! 小米手环2:时间格式 - 您需要安装版本号为%1$s的固件在安装此固件前。 + 您需要安装版本号为%1$s的固件在安装此固件前! 文本通知 需要已安装固件1.0.1.28 和 Mili_pro. ft * 。 @@ -504,6 +504,20 @@ 未知设备 小米手环 小米手环2 - 华米手表青春版 + 米动手表青春版 米动手环 + 天气 + 水滴 + 测试设备 + 总是优先使用低功耗蓝牙 + 表盘 + + 在内存缓冲区中的应用程序 + 在Pebble上升级 + + 振动配置 + + 响铃 + 要发送的广播消息 + Pebble diff --git a/app/src/main/res/xml/changelog_master.xml b/app/src/main/res/xml/changelog_master.xml index 9ed8658c7..e1b034adb 100644 --- a/app/src/main/res/xml/changelog_master.xml +++ b/app/src/main/res/xml/changelog_master.xml @@ -1,5 +1,14 @@ + + Mi Band 1S: Fix sync problem with firmware 4.16.11.15 (probably also Mi Band 1.0.15.0 and Mi Band 1A 5.16.11.15) + Amazfit Cor: Fix problem with firmware >=1.0.6.27 being detected as Mi Band 2 + + + Initial support for Omnijaws weather service + Amazfit Bip: Allow installation of latest gps firmware + Amazfit Cor: Fixes for installing newer firmware versions + Initial support for LineageOS/CyanogenMod weather provider Amazfit Bip/Cor: Support for current weather temperature diff --git a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/FirmwareTest.java b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/FirmwareTest.java index 7456e60a1..9a79ab040 100644 --- a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/FirmwareTest.java +++ b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/FirmwareTest.java @@ -17,7 +17,7 @@ import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; @Ignore("Disabled for travis -- needs vm parameter -DMiFirmwareDir=/path/to/firmware/directory/") public class FirmwareTest { - private static final long MAX_FILE_SIZE_BYTES = 1024 * 1024; // 1MB + private static final long MAX_FILE_SIZE_BYTES = 1024 * 1536; // 1.5MB private static final int MI_FW_VERSION = 0; // FIXME private static final int MI1A_FW_VERSION = 0; // FIXME private static final int MI1S_FW1_VERSION = 0; diff --git a/fastlane/metadata/android/en-US/changelogs/115.txt b/fastlane/metadata/android/en-US/changelogs/115.txt new file mode 100644 index 000000000..fba3fc3ba --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/115.txt @@ -0,0 +1,3 @@ +* Initial support for Omnijaws weather service +* Amazfit Bip: Allow installation of latest gps firmware +* Amazfit Cor: Fixes for installing newer firmware versions diff --git a/fastlane/metadata/android/en-US/changelogs/116.txt b/fastlane/metadata/android/en-US/changelogs/116.txt new file mode 100644 index 000000000..bb04462b8 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/116.txt @@ -0,0 +1,2 @@ +* Mi Band 1S: Fix sync problem with firmware 4.16.11.15 (probably also Mi Band 1.0.15.0 and Mi Band 1A 5.16.11.15) +* Amazfit Cor: Fix problem with firmware >=1.0.6.27 being detected as Mi Band 2