diff --git a/CHANGELOG.md b/CHANGELOG.md index 81966738b..0400c30ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ ### Changelog +#### Version 0.21.4 +* Mi2/Bip: Fix sleep detection for newer firmwares +* Mi2/Bip: Fix ancient bug resulting in wrong activity data at the beginning in diagrams and aggregate data +* No.1 F1: Support setting time format and distance units (metric/imperial) +* Pebble: Support setting distance units to miles for Health (need to reactivate Health in App Manager after toggling) +* HPlus: Make changing distance unit system effective immediately on toggling + #### Version 0.21.3 * Amazfit Bip: Auto-switch language on connect (English, Simplified Chinese, Traditional Chinese), requires FW 0.0.9.14+ diff --git a/app/build.gradle b/app/build.gradle index a839c749a..c0a5d5c32 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.21.3" - versionCode 104 + versionName "0.21.5" + versionCode 105 vectorDrawables.useSupportLibrary = true } buildTypes { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java index 16cfe61e0..fb8a6b388 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java @@ -61,6 +61,8 @@ import static nodomain.freeyourgadget.gadgetbridge.model.ActivityUser.PREF_USER_ public class SettingsActivity extends AbstractSettingsActivity { private static final Logger LOG = LoggerFactory.getLogger(SettingsActivity.class); + public static final String PREF_MEASUREMENT_SYSTEM = "measurement_system"; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -172,6 +174,21 @@ public class SettingsActivity extends AbstractSettingsActivity { }); + final Preference unit = findPreference(PREF_MEASUREMENT_SYSTEM); + unit.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(PREF_MEASUREMENT_SYSTEM); + } + }); + preference.setSummary(newVal.toString()); + return true; + } + }); + if (!GBApplication.isRunningMarshmallowOrLater()) { pref = findPreference("notification_filter"); PreferenceCategory category = (PreferenceCategory) findPreference("pref_key_notifications"); @@ -268,6 +285,13 @@ public class SettingsActivity extends AbstractSettingsActivity { audioPlayer.setDefaultValue(newValues[0]); } + /* + * delayed execution so that the preferences are applied first + */ + private void invokeLater(Runnable runnable) { + getListView().post(runnable); + } + @Override protected String[] getPreferenceKeysWithSummary() { return new String[]{ diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusConstants.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusConstants.java index c52e016c0..3e7ba60d0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusConstants.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusConstants.java @@ -127,7 +127,6 @@ public final class HPlusConstants { public static final String PREF_HPLUS_SCREENTIME = "hplus_screentime"; public static final String PREF_HPLUS_ALLDAYHR = "hplus_alldayhr"; - public static final String PREF_HPLUS_UNIT = "hplus_unit"; public static final String PREF_HPLUS_TIMEFORMAT = "hplus_timeformat"; public static final String PREF_HPLUS_WRIST = "hplus_wrist"; public static final String PREF_HPLUS_SIT_START_TIME = "hplus_sit_start_time"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusCoordinator.java index e5d3d2c2e..5093e8784 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusCoordinator.java @@ -35,6 +35,7 @@ import de.greenrobot.dao.query.QueryBuilder; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.GBException; import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.activities.SettingsActivity; import nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity; import nodomain.freeyourgadget.gadgetbridge.devices.AbstractDeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler; @@ -202,7 +203,7 @@ public class HPlusCoordinator extends AbstractDeviceCoordinator { } public static byte getUnit(String address) { - String units = prefs.getString(HPlusConstants.PREF_HPLUS_UNIT, getContext().getString(R.string.p_unit_metric)); + String units = prefs.getString(SettingsActivity.PREF_MEASUREMENT_SYSTEM, getContext().getString(R.string.p_unit_metric)); if(units.equals(getContext().getString(R.string.p_unit_metric))){ return HPlusConstants.ARG_UNIT_METRIC; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2SampleProvider.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2SampleProvider.java index f87190ce5..be6c7cd15 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2SampleProvider.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2SampleProvider.java @@ -50,13 +50,13 @@ public class MiBand2SampleProvider extends AbstractMiBandSampleProvider { public static final int TYPE_UNSET = -1; public static final int TYPE_NO_CHANGE = 0; public static final int TYPE_ACTIVITY = 1; + public static final int TYPE_RUNNING = 2; public static final int TYPE_NONWEAR = 3; public static final int TYPE_CHARGING = 6; public static final int TYPE_LIGHT_SLEEP = 9; + public static final int TYPE_IGNORE = 10; public static final int TYPE_DEEP_SLEEP = 11; public static final int TYPE_WAKE_UP = 12; - // appears to be a measurement problem resulting in type = 10 and intensity = 20, at least with fw 1.0.0.39 - public static final int TYPE_IGNORE = 10; public MiBand2SampleProvider(GBDevice device, DaoSession session) { super(device, session); @@ -81,6 +81,11 @@ public class MiBand2SampleProvider extends AbstractMiBandSampleProvider { int lastValidKind = determinePreviousValidActivityType(samples.get(0)); for (MiBandActivitySample sample : samples) { int rawKind = sample.getRawKind(); + if (rawKind != TYPE_UNSET) { + rawKind &= 0xf; + sample.setRawKind(rawKind); + } + switch (rawKind) { case TYPE_IGNORE: case TYPE_NO_CHANGE: @@ -100,11 +105,12 @@ public class MiBand2SampleProvider extends AbstractMiBandSampleProvider { qb.where(MiBandActivitySampleDao.Properties.DeviceId.eq(sample.getDeviceId()), MiBandActivitySampleDao.Properties.UserId.eq(sample.getUserId()), MiBandActivitySampleDao.Properties.Timestamp.lt(sample.getTimestamp()), - MiBandActivitySampleDao.Properties.RawKind.notIn(TYPE_IGNORE, TYPE_NO_CHANGE)); + MiBandActivitySampleDao.Properties.RawKind.notIn(TYPE_NO_CHANGE, TYPE_IGNORE, TYPE_UNSET, 16, 80, 96, 112)); // all I ever had that are 0 when doing &=0xf + qb.orderDesc(MiBandActivitySampleDao.Properties.Timestamp); qb.limit(1); List result = qb.build().list(); if (result.size() > 0) { - return result.get(0).getRawKind(); + return result.get(0).getRawKind() & 0xf; } return TYPE_UNSET; } @@ -117,12 +123,13 @@ public class MiBand2SampleProvider extends AbstractMiBandSampleProvider { case TYPE_LIGHT_SLEEP: return ActivityKind.TYPE_LIGHT_SLEEP; case TYPE_ACTIVITY: + case TYPE_RUNNING: + case TYPE_WAKE_UP: return ActivityKind.TYPE_ACTIVITY; case TYPE_NONWEAR: return ActivityKind.TYPE_NOT_WORN; case TYPE_CHARGING: return ActivityKind.TYPE_NOT_WORN; //I believe it's a safe assumption - case TYPE_IGNORE: default: case TYPE_UNSET: // fall through return ActivityKind.TYPE_UNKNOWN; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java index 436efcf01..f891b2625 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java @@ -45,6 +45,7 @@ import java.util.List; import java.util.UUID; import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.activities.SettingsActivity; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo; import nodomain.freeyourgadget.gadgetbridge.devices.hplus.HPlusConstants; import nodomain.freeyourgadget.gadgetbridge.devices.hplus.HPlusCoordinator; @@ -646,8 +647,18 @@ public class HPlusSupport extends AbstractBTLEDeviceSupport { @Override public void onSendConfiguration(String config) { - LOG.info("Send Configuration: " + config); - + TransactionBuilder builder; + try { + builder = performInitialized("Sending configuration for option: " + config); + switch (config) { + case SettingsActivity.PREF_MEASUREMENT_SYSTEM: + setUnit(builder); + break; + } + builder.queue(getQueue()); + } catch (IOException e) { + GB.toast("Error setting configuration", Toast.LENGTH_LONG, GB.ERROR, e); + } } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java index e3f5047a7..c6e3f28e5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java @@ -225,11 +225,6 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { GregorianCalendar now = BLETypeConversions.createCalendar(); byte[] bytes = getTimeBytes(now, TimeUnit.SECONDS); builder.write(getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_CURRENT_TIME), bytes); - -// byte[] localtime = BLETypeConversions.calendarToLocalTimeBytes(now); -// builder.write(getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_LOCAL_TIME_INFORMATION), localtime); -// builder.write(getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_CURRENT_TIME), new byte[] {0x2, 0x00}); -// builder.write(getCharacteristic(MiBand2Service.UUID_UNKNOQN_CHARACTERISTIC0), new byte[] {0x03,0x00,(byte)0x8e,(byte)0xce,0x5a,0x09,(byte)0xb3,(byte)0xd8,0x55,0x57,0x10,0x2a,(byte)0xed,0x7d,0x6b,0x78,(byte)0xc5,(byte)0xd2}); return this; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/no1f1/No1F1Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/no1f1/No1F1Support.java index 54a40c4e5..416c3a9dd 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/no1f1/No1F1Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/no1f1/No1F1Support.java @@ -19,6 +19,7 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.no1f1; import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGattCharacteristic; import android.net.Uri; +import android.text.format.DateFormat; import android.widget.Toast; import org.slf4j.Logger; @@ -34,6 +35,7 @@ import java.util.UUID; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.activities.SettingsActivity; import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; import nodomain.freeyourgadget.gadgetbridge.database.DBHelper; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo; @@ -142,6 +144,7 @@ public class No1F1Support extends AbstractBTLEDeviceSupport { case No1F1Constants.CMD_NOTIFICATION: case No1F1Constants.CMD_ICON: case No1F1Constants.CMD_DEVICE_SETTINGS: + case No1F1Constants.CMD_DISPLAY_SETTINGS: return true; default: LOG.warn("Unhandled characteristic change: " + characteristicUUID + " code: " + Arrays.toString(data)); @@ -315,7 +318,18 @@ public class No1F1Support extends AbstractBTLEDeviceSupport { @Override public void onSendConfiguration(String config) { - + TransactionBuilder builder; + try { + builder = performInitialized("Sending configuration for option: " + config); + switch (config) { + case SettingsActivity.PREF_MEASUREMENT_SYSTEM: + setDisplaySettings(builder); + break; + } + builder.queue(getQueue()); + } catch (IOException e) { + GB.toast("Error setting configuration", Toast.LENGTH_LONG, GB.ERROR, e); + } } @Override @@ -333,6 +347,33 @@ public class No1F1Support extends AbstractBTLEDeviceSupport { return true; } + /** + * Set display settings (time format and measurement system) + * + * @param transaction + * @return + */ + private No1F1Support setDisplaySettings(TransactionBuilder transaction) { + byte[] displayBytes = new byte[]{ + No1F1Constants.CMD_DISPLAY_SETTINGS, + 0x00, // 1 - display distance in kilometers, 2 - in miles + 0x00 // 1 - display 24-hour clock, 2 - for 12-hour with AM/PM + }; + String units = GBApplication.getPrefs().getString(SettingsActivity.PREF_MEASUREMENT_SYSTEM, getContext().getString(R.string.p_unit_metric)); + if (units.equals(getContext().getString(R.string.p_unit_metric))) { + displayBytes[1] = 1; + } else { + displayBytes[1] = 2; + } + if (DateFormat.is24HourFormat(getContext())) { + displayBytes[2] = 1; + } else { + displayBytes[2] = 2; + } + transaction.write(ctrlCharacteristic, displayBytes); + return this; + } + private void sendSettings(TransactionBuilder builder) { // TODO Create custom settings page for changing hardcoded values @@ -387,12 +428,7 @@ public class No1F1Support extends AbstractBTLEDeviceSupport { 0x00 }); - // display settings - builder.write(ctrlCharacteristic, new byte[]{ - No1F1Constants.CMD_DISPLAY_SETTINGS, - 0x01, // 1 - display distance in kilometers, 2 - in miles - 0x01 // 1 - display 24-hour clock, 2 - for 12-hour with AM/PM - }); + setDisplaySettings(builder); // heart rate measurement mode builder.write(ctrlCharacteristic, new byte[]{ @@ -553,7 +589,7 @@ public class No1F1Support extends AbstractBTLEDeviceSupport { for (int i = 0; i < samples.size(); i++) { samples.get(i).setDeviceId(deviceId); samples.get(i).setUserId(userId); - if (samples.get(i).getRawIntensity()<7) + if (samples.get(i).getRawIntensity() < 7) samples.get(i).setRawKind(ActivityKind.TYPE_DEEP_SLEEP); else samples.get(i).setRawKind(ActivityKind.TYPE_LIGHT_SLEEP); @@ -643,16 +679,15 @@ public class No1F1Support extends AbstractBTLEDeviceSupport { } private void handleRealtimeHeartRateData(byte[] data) { - if (data.length==2) - { - if (data[1]==(byte) 0x11) + if (data.length == 2) { + if (data[1] == (byte) 0x11) LOG.info("Heart rate measurement started."); else LOG.info("Heart rate measurement stopped."); return; } // Check if data is valid. Otherwise ignore sample. - if (data[2]==0) { + if (data[2] == 0) { No1F1ActivitySample sample = new No1F1ActivitySample(); sample.setTimestamp((int) (GregorianCalendar.getInstance().getTimeInMillis() / 1000L)); sample.setHeartRate(data[3] & 0xff); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleIoThread.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleIoThread.java index 9059dec85..e7ce17c63 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleIoThread.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleIoThread.java @@ -571,20 +571,6 @@ class PebbleIoThread extends GBDeviceIoThread { } void installApp(Uri uri, int appId) { - if (uri.equals(Uri.parse("fake://health"))) { - write(mPebbleProtocol.encodeActivateHealth(true)); - write(mPebbleProtocol.encodeSetSaneDistanceUnit(true)); - return; - } - if (uri.equals(Uri.parse("fake://hrm"))) { - write(mPebbleProtocol.encodeActivateHRM(true)); - return; - } - if (uri.equals(Uri.parse("fake://weather"))) { - write(mPebbleProtocol.encodeActivateWeather(true)); - return; - } - if (mIsInstalling) { return; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleSupport.java index 8f0cb3495..3bd1bde31 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleSupport.java @@ -30,6 +30,7 @@ import java.util.UUID; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.activities.SettingsActivity; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.Alarm; import nodomain.freeyourgadget.gadgetbridge.model.CalendarEventSpec; @@ -67,7 +68,30 @@ public class PebbleSupport extends AbstractSerialDeviceSupport { @Override public void onInstallApp(Uri uri) { - getDeviceIOThread().installApp(uri, 0); + PebbleProtocol pebbleProtocol = (PebbleProtocol) getDeviceProtocol(); + PebbleIoThread pebbleIoThread = getDeviceIOThread(); + // catch fake urls first + if (uri.equals(Uri.parse("fake://health"))) { + getDeviceIOThread().write(pebbleProtocol.encodeActivateHealth(true)); + String units = GBApplication.getPrefs().getString(SettingsActivity.PREF_MEASUREMENT_SYSTEM, getContext().getString(R.string.p_unit_metric)); + if (units.equals(getContext().getString(R.string.p_unit_metric))) { + pebbleIoThread.write(pebbleProtocol.encodeSetSaneDistanceUnit(true)); + } else { + pebbleIoThread.write(pebbleProtocol.encodeSetSaneDistanceUnit(false)); + } + return; + } + if (uri.equals(Uri.parse("fake://hrm"))) { + getDeviceIOThread().write(pebbleProtocol.encodeActivateHRM(true)); + return; + } + if (uri.equals(Uri.parse("fake://weather"))) { + getDeviceIOThread().write(pebbleProtocol.encodeActivateWeather(true)); + return; + } + + // it is a real app + pebbleIoThread.installApp(uri, 0); } @Override diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 81ff1b2b2..32208cb16 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -177,7 +177,7 @@ Connecter un nouvel appareil %1$s (%2$s) Appairer l\'appareil - Utiliser le l\'appairage Bluetooth d\'Android pour jumeler l\'appareil + Utiliser l\'appairage Bluetooth d\'Android pour jumeler l\'appareil. Appairer votre Mi Band Jumelage avec %s… Création d’un lien avec %1$s (%2$s) @@ -228,7 +228,7 @@ Total de minutes Pas par minute Trouver l\'appareil perdu - Annuler pour arrêter les vibrations + Annuler pour arrêter les vibrations. Votre activité Configurer les alarmes Configurer les alarmes @@ -399,10 +399,10 @@ NOTE: la base de données sera bien évidement plus grande ! Automatique (détection de sommeil) Programmé (intervalle de temps) Tentative de jumelage avec %1$s - Le lien avec %1$s a échoué instantanément + Le lien avec %1$s a échoué instantanément. Tentative de connexion à: %1$s - Activez le Bluetooth pour trouver des dispositifs - Correctement lié à %1$s + Activez le Bluetooth pour trouver des dispositifs. + Correctement lié à %1$s. Appairer avec %1$s ? Sélectionnez Jumeler pour associer vos dispositifs. Si cela échoue, essayez à nouveau sans jumelage. Jumelage diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 2b1cf3d2b..a6567b934 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -422,4 +422,9 @@ ボタンの動作をトリガーに band の振動を有効にします ボタンを押す間の最大遅延時間 ボタンを押す間隔の最大遅延時間 (ミリ秒単位) - + ボタン操作の後に遅延 + 1回のボタン操作に一致した後の遅滞 (数字は button_id インテント拡張内) 0 の場合はすぐ + 電話で開く + ミュート + 返信 + diff --git a/app/src/main/res/xml/changelog_master.xml b/app/src/main/res/xml/changelog_master.xml index 53349e5a1..a1e6745ce 100644 --- a/app/src/main/res/xml/changelog_master.xml +++ b/app/src/main/res/xml/changelog_master.xml @@ -1,5 +1,12 @@ + + Mi2/Bip: Fix sleep detection for newer firmwares + Mi2/Bip: Fix ancient bug resulting in wrong activity data at the beginning in diagrams and aggregate data + No.1 F1: Support setting time format and distance units (metric/imperial) + Pebble: Support setting distance units to miles for Health (need to reactivate Health in App Manager after toggling) + HPlus: Make changing distance unit system effective immediately on toggling + Amazfit Bip: Auto-switch language on connect (English, Simplified Chinese, Traditional Chinese), requires FW 0.0.9.14+ diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 2922198cb..804c477f4 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -34,6 +34,13 @@ android:entryValues="@array/pref_language_values" android:defaultValue="default" android:summary="%s" /> + - - diff --git a/fastlane/metadata/android/en-US/changelogs/105.txt b/fastlane/metadata/android/en-US/changelogs/105.txt new file mode 100644 index 000000000..fb358ece9 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/105.txt @@ -0,0 +1,5 @@ +* Mi2/Bip: Fix sleep detection for newer firmwares +* Mi2/Bip: Fix ancient bug resulting in wrong activity data at the beginning in diagrams and aggregate data +* No.1 F1: Support setting time format and distance units (metric/imperial) +* Pebble: Support setting distance units to miles for Health (need to reactivate Health in App Manager after toggling) +* HPlus: Make changing distance unit system effective immediately on toggling diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e79f16af9..ceeb26604 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip