mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2025-01-13 03:07:32 +01:00
Merge branch 'master' into background-javascript
This commit is contained in:
commit
49bebc3440
@ -1,5 +1,12 @@
|
|||||||
### Changelog
|
### 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
|
#### Version 0.21.3
|
||||||
* Amazfit Bip: Auto-switch language on connect (English, Simplified Chinese, Traditional Chinese), requires FW 0.0.9.14+
|
* Amazfit Bip: Auto-switch language on connect (English, Simplified Chinese, Traditional Chinese), requires FW 0.0.9.14+
|
||||||
|
|
||||||
|
@ -26,8 +26,8 @@ android {
|
|||||||
targetSdkVersion 25
|
targetSdkVersion 25
|
||||||
|
|
||||||
// note: always bump BOTH versionCode and versionName!
|
// note: always bump BOTH versionCode and versionName!
|
||||||
versionName "0.21.3"
|
versionName "0.21.5"
|
||||||
versionCode 104
|
versionCode 105
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
}
|
}
|
||||||
buildTypes {
|
buildTypes {
|
||||||
|
@ -61,6 +61,8 @@ import static nodomain.freeyourgadget.gadgetbridge.model.ActivityUser.PREF_USER_
|
|||||||
public class SettingsActivity extends AbstractSettingsActivity {
|
public class SettingsActivity extends AbstractSettingsActivity {
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(SettingsActivity.class);
|
private static final Logger LOG = LoggerFactory.getLogger(SettingsActivity.class);
|
||||||
|
|
||||||
|
public static final String PREF_MEASUREMENT_SYSTEM = "measurement_system";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(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()) {
|
if (!GBApplication.isRunningMarshmallowOrLater()) {
|
||||||
pref = findPreference("notification_filter");
|
pref = findPreference("notification_filter");
|
||||||
PreferenceCategory category = (PreferenceCategory) findPreference("pref_key_notifications");
|
PreferenceCategory category = (PreferenceCategory) findPreference("pref_key_notifications");
|
||||||
@ -268,6 +285,13 @@ public class SettingsActivity extends AbstractSettingsActivity {
|
|||||||
audioPlayer.setDefaultValue(newValues[0]);
|
audioPlayer.setDefaultValue(newValues[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* delayed execution so that the preferences are applied first
|
||||||
|
*/
|
||||||
|
private void invokeLater(Runnable runnable) {
|
||||||
|
getListView().post(runnable);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String[] getPreferenceKeysWithSummary() {
|
protected String[] getPreferenceKeysWithSummary() {
|
||||||
return new String[]{
|
return new String[]{
|
||||||
|
@ -127,7 +127,6 @@ public final class HPlusConstants {
|
|||||||
|
|
||||||
public static final String PREF_HPLUS_SCREENTIME = "hplus_screentime";
|
public static final String PREF_HPLUS_SCREENTIME = "hplus_screentime";
|
||||||
public static final String PREF_HPLUS_ALLDAYHR = "hplus_alldayhr";
|
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_TIMEFORMAT = "hplus_timeformat";
|
||||||
public static final String PREF_HPLUS_WRIST = "hplus_wrist";
|
public static final String PREF_HPLUS_WRIST = "hplus_wrist";
|
||||||
public static final String PREF_HPLUS_SIT_START_TIME = "hplus_sit_start_time";
|
public static final String PREF_HPLUS_SIT_START_TIME = "hplus_sit_start_time";
|
||||||
|
@ -35,6 +35,7 @@ import de.greenrobot.dao.query.QueryBuilder;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBException;
|
import nodomain.freeyourgadget.gadgetbridge.GBException;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.activities.SettingsActivity;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity;
|
import nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractDeviceCoordinator;
|
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractDeviceCoordinator;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
|
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
|
||||||
@ -202,7 +203,7 @@ public class HPlusCoordinator extends AbstractDeviceCoordinator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static byte getUnit(String address) {
|
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))){
|
if(units.equals(getContext().getString(R.string.p_unit_metric))){
|
||||||
return HPlusConstants.ARG_UNIT_METRIC;
|
return HPlusConstants.ARG_UNIT_METRIC;
|
||||||
|
@ -50,13 +50,13 @@ public class MiBand2SampleProvider extends AbstractMiBandSampleProvider {
|
|||||||
public static final int TYPE_UNSET = -1;
|
public static final int TYPE_UNSET = -1;
|
||||||
public static final int TYPE_NO_CHANGE = 0;
|
public static final int TYPE_NO_CHANGE = 0;
|
||||||
public static final int TYPE_ACTIVITY = 1;
|
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_NONWEAR = 3;
|
||||||
public static final int TYPE_CHARGING = 6;
|
public static final int TYPE_CHARGING = 6;
|
||||||
public static final int TYPE_LIGHT_SLEEP = 9;
|
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_DEEP_SLEEP = 11;
|
||||||
public static final int TYPE_WAKE_UP = 12;
|
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) {
|
public MiBand2SampleProvider(GBDevice device, DaoSession session) {
|
||||||
super(device, session);
|
super(device, session);
|
||||||
@ -81,6 +81,11 @@ public class MiBand2SampleProvider extends AbstractMiBandSampleProvider {
|
|||||||
int lastValidKind = determinePreviousValidActivityType(samples.get(0));
|
int lastValidKind = determinePreviousValidActivityType(samples.get(0));
|
||||||
for (MiBandActivitySample sample : samples) {
|
for (MiBandActivitySample sample : samples) {
|
||||||
int rawKind = sample.getRawKind();
|
int rawKind = sample.getRawKind();
|
||||||
|
if (rawKind != TYPE_UNSET) {
|
||||||
|
rawKind &= 0xf;
|
||||||
|
sample.setRawKind(rawKind);
|
||||||
|
}
|
||||||
|
|
||||||
switch (rawKind) {
|
switch (rawKind) {
|
||||||
case TYPE_IGNORE:
|
case TYPE_IGNORE:
|
||||||
case TYPE_NO_CHANGE:
|
case TYPE_NO_CHANGE:
|
||||||
@ -100,11 +105,12 @@ public class MiBand2SampleProvider extends AbstractMiBandSampleProvider {
|
|||||||
qb.where(MiBandActivitySampleDao.Properties.DeviceId.eq(sample.getDeviceId()),
|
qb.where(MiBandActivitySampleDao.Properties.DeviceId.eq(sample.getDeviceId()),
|
||||||
MiBandActivitySampleDao.Properties.UserId.eq(sample.getUserId()),
|
MiBandActivitySampleDao.Properties.UserId.eq(sample.getUserId()),
|
||||||
MiBandActivitySampleDao.Properties.Timestamp.lt(sample.getTimestamp()),
|
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);
|
qb.limit(1);
|
||||||
List<MiBandActivitySample> result = qb.build().list();
|
List<MiBandActivitySample> result = qb.build().list();
|
||||||
if (result.size() > 0) {
|
if (result.size() > 0) {
|
||||||
return result.get(0).getRawKind();
|
return result.get(0).getRawKind() & 0xf;
|
||||||
}
|
}
|
||||||
return TYPE_UNSET;
|
return TYPE_UNSET;
|
||||||
}
|
}
|
||||||
@ -117,12 +123,13 @@ public class MiBand2SampleProvider extends AbstractMiBandSampleProvider {
|
|||||||
case TYPE_LIGHT_SLEEP:
|
case TYPE_LIGHT_SLEEP:
|
||||||
return ActivityKind.TYPE_LIGHT_SLEEP;
|
return ActivityKind.TYPE_LIGHT_SLEEP;
|
||||||
case TYPE_ACTIVITY:
|
case TYPE_ACTIVITY:
|
||||||
|
case TYPE_RUNNING:
|
||||||
|
case TYPE_WAKE_UP:
|
||||||
return ActivityKind.TYPE_ACTIVITY;
|
return ActivityKind.TYPE_ACTIVITY;
|
||||||
case TYPE_NONWEAR:
|
case TYPE_NONWEAR:
|
||||||
return ActivityKind.TYPE_NOT_WORN;
|
return ActivityKind.TYPE_NOT_WORN;
|
||||||
case TYPE_CHARGING:
|
case TYPE_CHARGING:
|
||||||
return ActivityKind.TYPE_NOT_WORN; //I believe it's a safe assumption
|
return ActivityKind.TYPE_NOT_WORN; //I believe it's a safe assumption
|
||||||
case TYPE_IGNORE:
|
|
||||||
default:
|
default:
|
||||||
case TYPE_UNSET: // fall through
|
case TYPE_UNSET: // fall through
|
||||||
return ActivityKind.TYPE_UNKNOWN;
|
return ActivityKind.TYPE_UNKNOWN;
|
||||||
|
@ -45,6 +45,7 @@ import java.util.List;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.activities.SettingsActivity;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo;
|
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.hplus.HPlusConstants;
|
import nodomain.freeyourgadget.gadgetbridge.devices.hplus.HPlusConstants;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.hplus.HPlusCoordinator;
|
import nodomain.freeyourgadget.gadgetbridge.devices.hplus.HPlusCoordinator;
|
||||||
@ -646,8 +647,18 @@ public class HPlusSupport extends AbstractBTLEDeviceSupport {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSendConfiguration(String config) {
|
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
|
@Override
|
||||||
|
@ -225,11 +225,6 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport {
|
|||||||
GregorianCalendar now = BLETypeConversions.createCalendar();
|
GregorianCalendar now = BLETypeConversions.createCalendar();
|
||||||
byte[] bytes = getTimeBytes(now, TimeUnit.SECONDS);
|
byte[] bytes = getTimeBytes(now, TimeUnit.SECONDS);
|
||||||
builder.write(getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_CURRENT_TIME), bytes);
|
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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.no1f1;
|
|||||||
import android.bluetooth.BluetoothGatt;
|
import android.bluetooth.BluetoothGatt;
|
||||||
import android.bluetooth.BluetoothGattCharacteristic;
|
import android.bluetooth.BluetoothGattCharacteristic;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.text.format.DateFormat;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -34,6 +35,7 @@ import java.util.UUID;
|
|||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.activities.SettingsActivity;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
|
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.database.DBHelper;
|
import nodomain.freeyourgadget.gadgetbridge.database.DBHelper;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo;
|
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo;
|
||||||
@ -142,6 +144,7 @@ public class No1F1Support extends AbstractBTLEDeviceSupport {
|
|||||||
case No1F1Constants.CMD_NOTIFICATION:
|
case No1F1Constants.CMD_NOTIFICATION:
|
||||||
case No1F1Constants.CMD_ICON:
|
case No1F1Constants.CMD_ICON:
|
||||||
case No1F1Constants.CMD_DEVICE_SETTINGS:
|
case No1F1Constants.CMD_DEVICE_SETTINGS:
|
||||||
|
case No1F1Constants.CMD_DISPLAY_SETTINGS:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
LOG.warn("Unhandled characteristic change: " + characteristicUUID + " code: " + Arrays.toString(data));
|
LOG.warn("Unhandled characteristic change: " + characteristicUUID + " code: " + Arrays.toString(data));
|
||||||
@ -315,7 +318,18 @@ public class No1F1Support extends AbstractBTLEDeviceSupport {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSendConfiguration(String config) {
|
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
|
@Override
|
||||||
@ -333,6 +347,33 @@ public class No1F1Support extends AbstractBTLEDeviceSupport {
|
|||||||
return true;
|
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) {
|
private void sendSettings(TransactionBuilder builder) {
|
||||||
// TODO Create custom settings page for changing hardcoded values
|
// TODO Create custom settings page for changing hardcoded values
|
||||||
|
|
||||||
@ -387,12 +428,7 @@ public class No1F1Support extends AbstractBTLEDeviceSupport {
|
|||||||
0x00
|
0x00
|
||||||
});
|
});
|
||||||
|
|
||||||
// display settings
|
setDisplaySettings(builder);
|
||||||
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
|
|
||||||
});
|
|
||||||
|
|
||||||
// heart rate measurement mode
|
// heart rate measurement mode
|
||||||
builder.write(ctrlCharacteristic, new byte[]{
|
builder.write(ctrlCharacteristic, new byte[]{
|
||||||
@ -643,8 +679,7 @@ public class No1F1Support extends AbstractBTLEDeviceSupport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void handleRealtimeHeartRateData(byte[] data) {
|
private void handleRealtimeHeartRateData(byte[] data) {
|
||||||
if (data.length==2)
|
if (data.length == 2) {
|
||||||
{
|
|
||||||
if (data[1] == (byte) 0x11)
|
if (data[1] == (byte) 0x11)
|
||||||
LOG.info("Heart rate measurement started.");
|
LOG.info("Heart rate measurement started.");
|
||||||
else
|
else
|
||||||
|
@ -571,20 +571,6 @@ class PebbleIoThread extends GBDeviceIoThread {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void installApp(Uri uri, int appId) {
|
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) {
|
if (mIsInstalling) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@ import java.util.UUID;
|
|||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.activities.SettingsActivity;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.Alarm;
|
import nodomain.freeyourgadget.gadgetbridge.model.Alarm;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.CalendarEventSpec;
|
import nodomain.freeyourgadget.gadgetbridge.model.CalendarEventSpec;
|
||||||
@ -67,7 +68,30 @@ public class PebbleSupport extends AbstractSerialDeviceSupport {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onInstallApp(Uri uri) {
|
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
|
@Override
|
||||||
|
@ -177,7 +177,7 @@
|
|||||||
<string name="action_discover">Connecter un nouvel appareil</string>
|
<string name="action_discover">Connecter un nouvel appareil</string>
|
||||||
<string name="device_with_rssi">%1$s (%2$s)</string>
|
<string name="device_with_rssi">%1$s (%2$s)</string>
|
||||||
<string name="title_activity_android_pairing">Appairer l\'appareil</string>
|
<string name="title_activity_android_pairing">Appairer l\'appareil</string>
|
||||||
<string name="android_pairing_hint">Utiliser le l\'appairage Bluetooth d\'Android pour jumeler l\'appareil</string>
|
<string name="android_pairing_hint">Utiliser l\'appairage Bluetooth d\'Android pour jumeler l\'appareil.</string>
|
||||||
<string name="title_activity_mi_band_pairing">Appairer votre Mi Band</string>
|
<string name="title_activity_mi_band_pairing">Appairer votre Mi Band</string>
|
||||||
<string name="pairing">Jumelage avec %s…</string>
|
<string name="pairing">Jumelage avec %s…</string>
|
||||||
<string name="pairing_creating_bond_with">Création d’un lien avec %1$s (%2$s)</string>
|
<string name="pairing_creating_bond_with">Création d’un lien avec %1$s (%2$s)</string>
|
||||||
@ -228,7 +228,7 @@
|
|||||||
<string name="stats_x_axis_label">Total de minutes</string>
|
<string name="stats_x_axis_label">Total de minutes</string>
|
||||||
<string name="stats_y_axis_label">Pas par minute</string>
|
<string name="stats_y_axis_label">Pas par minute</string>
|
||||||
<string name="control_center_find_lost_device">Trouver l\'appareil perdu</string>
|
<string name="control_center_find_lost_device">Trouver l\'appareil perdu</string>
|
||||||
<string name="control_center_cancel_to_stop_vibration">Annuler pour arrêter les vibrations</string>
|
<string name="control_center_cancel_to_stop_vibration">Annuler pour arrêter les vibrations.</string>
|
||||||
<string name="title_activity_charts">Votre activité</string>
|
<string name="title_activity_charts">Votre activité</string>
|
||||||
<string name="title_activity_set_alarm">Configurer les alarmes</string>
|
<string name="title_activity_set_alarm">Configurer les alarmes</string>
|
||||||
<string name="controlcenter_start_configure_alarms">Configurer les alarmes</string>
|
<string name="controlcenter_start_configure_alarms">Configurer les alarmes</string>
|
||||||
@ -399,10 +399,10 @@ NOTE: la base de données sera bien évidement plus grande !</string>
|
|||||||
<string name="mi2_dnd_automatic">Automatique (détection de sommeil)</string>
|
<string name="mi2_dnd_automatic">Automatique (détection de sommeil)</string>
|
||||||
<string name="mi2_dnd_scheduled">Programmé (intervalle de temps)</string>
|
<string name="mi2_dnd_scheduled">Programmé (intervalle de temps)</string>
|
||||||
<string name="discovery_attempting_to_pair">Tentative de jumelage avec %1$s</string>
|
<string name="discovery_attempting_to_pair">Tentative de jumelage avec %1$s</string>
|
||||||
<string name="discovery_bonding_failed_immediately">Le lien avec %1$s a échoué instantanément</string>
|
<string name="discovery_bonding_failed_immediately">Le lien avec %1$s a échoué instantanément.</string>
|
||||||
<string name="discovery_trying_to_connect_to">Tentative de connexion à: %1$s</string>
|
<string name="discovery_trying_to_connect_to">Tentative de connexion à: %1$s</string>
|
||||||
<string name="discovery_enable_bluetooth">Activez le Bluetooth pour trouver des dispositifs</string>
|
<string name="discovery_enable_bluetooth">Activez le Bluetooth pour trouver des dispositifs.</string>
|
||||||
<string name="discovery_successfully_bonded">Correctement lié à %1$s</string>
|
<string name="discovery_successfully_bonded">Correctement lié à %1$s.</string>
|
||||||
<string name="discovery_pair_title">Appairer avec %1$s ?</string>
|
<string name="discovery_pair_title">Appairer avec %1$s ?</string>
|
||||||
<string name="discovery_pair_question">Sélectionnez Jumeler pour associer vos dispositifs. Si cela échoue, essayez à nouveau sans jumelage.</string>
|
<string name="discovery_pair_question">Sélectionnez Jumeler pour associer vos dispositifs. Si cela échoue, essayez à nouveau sans jumelage.</string>
|
||||||
<string name="discovery_yes_pair">Jumelage</string>
|
<string name="discovery_yes_pair">Jumelage</string>
|
||||||
|
@ -422,4 +422,9 @@
|
|||||||
<string name="mi2_prefs_button_action_vibrate_summary">ボタンの動作をトリガーに band の振動を有効にします</string>
|
<string name="mi2_prefs_button_action_vibrate_summary">ボタンの動作をトリガーに band の振動を有効にします</string>
|
||||||
<string name="mi2_prefs_button_press_count_max_delay">ボタンを押す間の最大遅延時間</string>
|
<string name="mi2_prefs_button_press_count_max_delay">ボタンを押す間の最大遅延時間</string>
|
||||||
<string name="mi2_prefs_button_press_count_max_delay_summary">ボタンを押す間隔の最大遅延時間 (ミリ秒単位)</string>
|
<string name="mi2_prefs_button_press_count_max_delay_summary">ボタンを押す間隔の最大遅延時間 (ミリ秒単位)</string>
|
||||||
|
<string name="mi2_prefs_button_press_count_match_delay">ボタン操作の後に遅延</string>
|
||||||
|
<string name="mi2_prefs_button_press_count_match_delay_summary">1回のボタン操作に一致した後の遅滞 (数字は button_id インテント拡張内) 0 の場合はすぐ</string>
|
||||||
|
<string name="_pebble_watch_open_on_phone">電話で開く</string>
|
||||||
|
<string name="_pebble_watch_mute">ミュート</string>
|
||||||
|
<string name="_pebble_watch_reply">返信</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -1,5 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<changelog>
|
<changelog>
|
||||||
|
<release version="0.21.4" versioncode="105">
|
||||||
|
<change>Mi2/Bip: Fix sleep detection for newer firmwares</change>
|
||||||
|
<change>Mi2/Bip: Fix ancient bug resulting in wrong activity data at the beginning in diagrams and aggregate data</change>
|
||||||
|
<change>No.1 F1: Support setting time format and distance units (metric/imperial)</change>
|
||||||
|
<change>Pebble: Support setting distance units to miles for Health (need to reactivate Health in App Manager after toggling)</change>
|
||||||
|
<change>HPlus: Make changing distance unit system effective immediately on toggling</change>
|
||||||
|
</release>
|
||||||
<release version="0.21.3" versioncode="104">
|
<release version="0.21.3" versioncode="104">
|
||||||
<change>Amazfit Bip: Auto-switch language on connect (English, Simplified Chinese, Traditional Chinese), requires FW 0.0.9.14+</change>
|
<change>Amazfit Bip: Auto-switch language on connect (English, Simplified Chinese, Traditional Chinese), requires FW 0.0.9.14+</change>
|
||||||
</release>
|
</release>
|
||||||
|
@ -34,6 +34,13 @@
|
|||||||
android:entryValues="@array/pref_language_values"
|
android:entryValues="@array/pref_language_values"
|
||||||
android:defaultValue="default"
|
android:defaultValue="default"
|
||||||
android:summary="%s" />
|
android:summary="%s" />
|
||||||
|
<ListPreference
|
||||||
|
android:defaultValue="metric"
|
||||||
|
android:entries="@array/pref_entries_unit_system"
|
||||||
|
android:entryValues="@array/pref_values_unit_system"
|
||||||
|
android:key="measurement_system"
|
||||||
|
android:summary="%s"
|
||||||
|
android:title="@string/pref_title_unit_system" />
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
android:defaultValue="false"
|
android:defaultValue="false"
|
||||||
android:key="minimize_priority"
|
android:key="minimize_priority"
|
||||||
@ -463,14 +470,6 @@
|
|||||||
android:key="hplus_alldayhr"
|
android:key="hplus_alldayhr"
|
||||||
android:title="@string/prefs_title_all_day_heart_rate" />
|
android:title="@string/prefs_title_all_day_heart_rate" />
|
||||||
|
|
||||||
<ListPreference
|
|
||||||
android:defaultValue="metric"
|
|
||||||
android:entries="@array/pref_entries_unit_system"
|
|
||||||
android:entryValues="@array/pref_values_unit_system"
|
|
||||||
android:key="hplus_unit"
|
|
||||||
android:title="@string/pref_title_unit_system"
|
|
||||||
android:summary="%s" />
|
|
||||||
|
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
5
fastlane/metadata/android/en-US/changelogs/105.txt
Normal file
5
fastlane/metadata/android/en-US/changelogs/105.txt
Normal file
@ -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
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
|
|||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user