mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2025-01-30 11:37:33 +01:00
More Huami refactoring
- Rename MiBand2Service to HuamiService - Move preferences around (Mi Band 2 has its own device specific settings now) - Fix Cor menu items not syncing immediately in settings - Try to support settings menu items on Mi Band 3 (buggy, disabled code for now)
This commit is contained in:
parent
f464604b27
commit
cc7f6d7263
@ -60,7 +60,9 @@ import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs;
|
import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
||||||
|
|
||||||
|
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_DATEFORMAT;
|
||||||
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_DISPLAY_ITEMS;
|
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_DISPLAY_ITEMS;
|
||||||
|
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_ENABLE_TEXT_NOTIFICATIONS;
|
||||||
import static nodomain.freeyourgadget.gadgetbridge.model.ActivityUser.PREF_USER_HEIGHT_CM;
|
import static nodomain.freeyourgadget.gadgetbridge.model.ActivityUser.PREF_USER_HEIGHT_CM;
|
||||||
import static nodomain.freeyourgadget.gadgetbridge.model.ActivityUser.PREF_USER_SLEEP_DURATION;
|
import static nodomain.freeyourgadget.gadgetbridge.model.ActivityUser.PREF_USER_SLEEP_DURATION;
|
||||||
import static nodomain.freeyourgadget.gadgetbridge.model.ActivityUser.PREF_USER_STEPS_GOAL;
|
import static nodomain.freeyourgadget.gadgetbridge.model.ActivityUser.PREF_USER_STEPS_GOAL;
|
||||||
@ -360,6 +362,64 @@ public class SettingsActivity extends AbstractSettingsActivity {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
final Preference setDateFormat = findPreference(PREF_MI2_DATEFORMAT);
|
||||||
|
setDateFormat.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object newVal) {
|
||||||
|
invokeLater(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
GBApplication.deviceService().onSendConfiguration(PREF_MI2_DATEFORMAT);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
final Preference miBand2DisplayItems = findPreference(PREF_MI2_DISPLAY_ITEMS);
|
||||||
|
miBand2DisplayItems.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object newVal) {
|
||||||
|
invokeLater(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
GBApplication.deviceService().onSendConfiguration(PREF_MI2_DISPLAY_ITEMS);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
final Preference miBand3DisplayItems = findPreference("miband3_display_items");
|
||||||
|
miBand3DisplayItems.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object newVal) {
|
||||||
|
invokeLater(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
GBApplication.deviceService().onSendConfiguration(PREF_MI2_DISPLAY_ITEMS);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
|
||||||
|
final Preference corDisplayItems = findPreference("cor_display_items");
|
||||||
|
corDisplayItems.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object newVal) {
|
||||||
|
invokeLater(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
GBApplication.deviceService().onSendConfiguration(PREF_MI2_DISPLAY_ITEMS);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Get all receivers of Media Buttons
|
// Get all receivers of Media Buttons
|
||||||
Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
|
Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
|
||||||
|
|
||||||
@ -488,6 +548,7 @@ public class SettingsActivity extends AbstractSettingsActivity {
|
|||||||
PREF_USER_WEIGHT_KG,
|
PREF_USER_WEIGHT_KG,
|
||||||
PREF_USER_SLEEP_DURATION,
|
PREF_USER_SLEEP_DURATION,
|
||||||
PREF_USER_STEPS_GOAL,
|
PREF_USER_STEPS_GOAL,
|
||||||
|
PREF_MI2_ENABLE_TEXT_NOTIFICATIONS,
|
||||||
"weather_city",
|
"weather_city",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
package nodomain.freeyourgadget.gadgetbridge.devices.miband;
|
package nodomain.freeyourgadget.gadgetbridge.devices.huami;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -23,7 +23,7 @@ import java.util.UUID;
|
|||||||
|
|
||||||
import static nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLEDeviceSupport.BASE_UUID;
|
import static nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLEDeviceSupport.BASE_UUID;
|
||||||
|
|
||||||
public class MiBand2Service {
|
public class HuamiService {
|
||||||
|
|
||||||
|
|
||||||
public static final UUID UUID_SERVICE_MIBAND_SERVICE = UUID.fromString(String.format(BASE_UUID, "FEE0"));
|
public static final UUID UUID_SERVICE_MIBAND_SERVICE = UUID.fromString(String.format(BASE_UUID, "FEE0"));
|
@ -19,9 +19,9 @@ package nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip;
|
|||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service.DISPLAY_ITEM_BIT_CLOCK;
|
import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService.DISPLAY_ITEM_BIT_CLOCK;
|
||||||
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service.ENDPOINT_DISPLAY;
|
import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService.ENDPOINT_DISPLAY;
|
||||||
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service.ENDPOINT_DISPLAY_ITEMS;
|
import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService.ENDPOINT_DISPLAY_ITEMS;
|
||||||
|
|
||||||
public class AmazfitBipService {
|
public class AmazfitBipService {
|
||||||
public static final UUID UUID_CHARACTERISTIC_WEATHER = UUID.fromString("0000000e-0000-3512-2118-0009af100700");
|
public static final UUID UUID_CHARACTERISTIC_WEATHER = UUID.fromString("0000000e-0000-3512-2118-0009af100700");
|
||||||
|
@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
package nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitcor;
|
package nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitcor;
|
||||||
|
|
||||||
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service.DISPLAY_ITEM_BIT_CLOCK;
|
import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService.DISPLAY_ITEM_BIT_CLOCK;
|
||||||
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service.ENDPOINT_DISPLAY_ITEMS;
|
import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService.ENDPOINT_DISPLAY_ITEMS;
|
||||||
|
|
||||||
public class AmazfitCorService {
|
public class AmazfitCorService {
|
||||||
public static final byte[] COMMAND_CHANGE_SCREENS = new byte[]{ENDPOINT_DISPLAY_ITEMS, DISPLAY_ITEM_BIT_CLOCK, 0x20, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
|
public static final byte[] COMMAND_CHANGE_SCREENS = new byte[]{ENDPOINT_DISPLAY_ITEMS, DISPLAY_ITEM_BIT_CLOCK, 0x20, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
|
||||||
|
@ -27,7 +27,7 @@ import org.slf4j.LoggerFactory;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
|
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiCoordinator;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiCoordinator;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceCandidate;
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceCandidate;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
|
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
|
||||||
@ -43,7 +43,7 @@ public class MiBand2Coordinator extends HuamiCoordinator {
|
|||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public DeviceType getSupportedType(GBDeviceCandidate candidate) {
|
public DeviceType getSupportedType(GBDeviceCandidate candidate) {
|
||||||
if (candidate.supportsService(MiBand2Service.UUID_SERVICE_MIBAND2_SERVICE)) {
|
if (candidate.supportsService(HuamiService.UUID_SERVICE_MIBAND2_SERVICE)) {
|
||||||
return DeviceType.MIBAND2;
|
return DeviceType.MIBAND2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,25 @@
|
|||||||
|
/* Copyright (C) 2015-2018 Andreas Shimokawa
|
||||||
|
|
||||||
|
This file is part of Gadgetbridge.
|
||||||
|
|
||||||
|
Gadgetbridge is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published
|
||||||
|
by the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Gadgetbridge is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.devices.huami.miband3;
|
||||||
|
|
||||||
|
import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService.DISPLAY_ITEM_BIT_CLOCK;
|
||||||
|
import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService.ENDPOINT_DISPLAY_ITEMS;
|
||||||
|
|
||||||
|
public class MiBand3Service {
|
||||||
|
public static final byte[] COMMAND_CHANGE_SCREENS = new byte[]{ENDPOINT_DISPLAY_ITEMS, DISPLAY_ITEM_BIT_CLOCK, 0x30, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
|
||||||
|
}
|
@ -109,34 +109,6 @@ public class MiBandPreferencesActivity extends AbstractSettingsActivity {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
final Preference setDateFormat = findPreference(PREF_MI2_DATEFORMAT);
|
|
||||||
setDateFormat.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference, Object newVal) {
|
|
||||||
invokeLater(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
GBApplication.deviceService().onSendConfiguration(PREF_MI2_DATEFORMAT);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
final Preference displayPages = findPreference(PREF_MI2_DISPLAY_ITEMS);
|
|
||||||
displayPages.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference, Object newVal) {
|
|
||||||
invokeLater(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
GBApplication.deviceService().onSendConfiguration(PREF_MI2_DISPLAY_ITEMS);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
final Preference activateDisplayOnLift = findPreference(PREF_ACTIVATE_DISPLAY_ON_LIFT);
|
final Preference activateDisplayOnLift = findPreference(PREF_ACTIVATE_DISPLAY_ON_LIFT);
|
||||||
activateDisplayOnLift.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
activateDisplayOnLift.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
@ -440,7 +412,6 @@ public class MiBandPreferencesActivity extends AbstractSettingsActivity {
|
|||||||
prefKeys.add(ActivityUser.PREF_USER_STEPS_GOAL);
|
prefKeys.add(ActivityUser.PREF_USER_STEPS_GOAL);
|
||||||
prefKeys.add(PREF_MIBAND_RESERVE_ALARM_FOR_CALENDAR);
|
prefKeys.add(PREF_MIBAND_RESERVE_ALARM_FOR_CALENDAR);
|
||||||
prefKeys.add(PREF_MIBAND_DEVICE_TIME_OFFSET_HOURS);
|
prefKeys.add(PREF_MIBAND_DEVICE_TIME_OFFSET_HOURS);
|
||||||
prefKeys.add(PREF_MI2_ENABLE_TEXT_NOTIFICATIONS);
|
|
||||||
prefKeys.add(PREF_MI2_INACTIVITY_WARNINGS_THRESHOLD);
|
prefKeys.add(PREF_MI2_INACTIVITY_WARNINGS_THRESHOLD);
|
||||||
prefKeys.add(getNotificationPrefKey(VIBRATION_COUNT, ORIGIN_ALARM_CLOCK));
|
prefKeys.add(getNotificationPrefKey(VIBRATION_COUNT, ORIGIN_ALARM_CLOCK));
|
||||||
prefKeys.add(getNotificationPrefKey(VIBRATION_COUNT, ORIGIN_INCOMING_CALL));
|
prefKeys.add(getNotificationPrefKey(VIBRATION_COUNT, ORIGIN_INCOMING_CALL));
|
||||||
|
@ -60,12 +60,12 @@ import nodomain.freeyourgadget.gadgetbridge.devices.huami.ActivateDisplayOnLift;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiCoordinator;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiCoordinator;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipService;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.miband2.MiBand2FWHelper;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.miband2.MiBand2FWHelper;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.DateTimeDisplay;
|
import nodomain.freeyourgadget.gadgetbridge.devices.miband.DateTimeDisplay;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.DoNotDisturb;
|
import nodomain.freeyourgadget.gadgetbridge.devices.miband.DoNotDisturb;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2SampleProvider;
|
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2SampleProvider;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst;
|
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandCoordinator;
|
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandCoordinator;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandService;
|
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandService;
|
||||||
@ -185,7 +185,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
|
|
||||||
addSupportedService(MiBandService.UUID_SERVICE_MIBAND_SERVICE);
|
addSupportedService(MiBandService.UUID_SERVICE_MIBAND_SERVICE);
|
||||||
addSupportedService(MiBandService.UUID_SERVICE_MIBAND2_SERVICE);
|
addSupportedService(MiBandService.UUID_SERVICE_MIBAND2_SERVICE);
|
||||||
addSupportedService(MiBand2Service.UUID_SERVICE_FIRMWARE_SERVICE);
|
addSupportedService(HuamiService.UUID_SERVICE_FIRMWARE_SERVICE);
|
||||||
|
|
||||||
deviceInfoProfile = new DeviceInfoProfile<>(this);
|
deviceInfoProfile = new DeviceInfoProfile<>(this);
|
||||||
addSupportedProfile(deviceInfoProfile);
|
addSupportedProfile(deviceInfoProfile);
|
||||||
@ -211,13 +211,13 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
try {
|
try {
|
||||||
boolean authenticate = needsAuth;
|
boolean authenticate = needsAuth;
|
||||||
needsAuth = false;
|
needsAuth = false;
|
||||||
byte authFlags = MiBand2Service.AUTH_BYTE;
|
byte authFlags = HuamiService.AUTH_BYTE;
|
||||||
if (gbDevice.getType() == DeviceType.MIBAND3) {
|
if (gbDevice.getType() == DeviceType.MIBAND3) {
|
||||||
authFlags = 0x00;
|
authFlags = 0x00;
|
||||||
}
|
}
|
||||||
new InitOperation(authenticate, authFlags, this, builder).perform();
|
new InitOperation(authenticate, authFlags, this, builder).perform();
|
||||||
characteristicHRControlPoint = getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_HEART_RATE_CONTROL_POINT);
|
characteristicHRControlPoint = getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_HEART_RATE_CONTROL_POINT);
|
||||||
characteristicChunked = getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_CHUNKEDTRANSFER);
|
characteristicChunked = getCharacteristic(HuamiService.UUID_CHARACTERISTIC_CHUNKEDTRANSFER);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
GB.toast(getContext(), "Initializing Mi Band 2 failed", Toast.LENGTH_SHORT, GB.ERROR, e);
|
GB.toast(getContext(), "Initializing Mi Band 2 failed", Toast.LENGTH_SHORT, GB.ERROR, e);
|
||||||
}
|
}
|
||||||
@ -287,14 +287,14 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
builder.notify(getCharacteristic(MiBandService.UUID_CHARACTERISTIC_NOTIFICATION), enable);
|
builder.notify(getCharacteristic(MiBandService.UUID_CHARACTERISTIC_NOTIFICATION), enable);
|
||||||
builder.notify(getCharacteristic(GattService.UUID_SERVICE_CURRENT_TIME), enable);
|
builder.notify(getCharacteristic(GattService.UUID_SERVICE_CURRENT_TIME), enable);
|
||||||
// Notify CHARACTERISTIC9 to receive random auth code
|
// Notify CHARACTERISTIC9 to receive random auth code
|
||||||
builder.notify(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_AUTH), enable);
|
builder.notify(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_AUTH), enable);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HuamiSupport enableFurtherNotifications(TransactionBuilder builder, boolean enable) {
|
public HuamiSupport enableFurtherNotifications(TransactionBuilder builder, boolean enable) {
|
||||||
builder.notify(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), enable);
|
builder.notify(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), enable);
|
||||||
builder.notify(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_6_BATTERY_INFO), enable);
|
builder.notify(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_6_BATTERY_INFO), enable);
|
||||||
builder.notify(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_DEVICEEVENT), enable);
|
builder.notify(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_DEVICEEVENT), enable);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -357,7 +357,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
|
|
||||||
private HuamiSupport requestBatteryInfo(TransactionBuilder builder) {
|
private HuamiSupport requestBatteryInfo(TransactionBuilder builder) {
|
||||||
LOG.debug("Requesting Battery Info!");
|
LOG.debug("Requesting Battery Info!");
|
||||||
BluetoothGattCharacteristic characteristic = getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_6_BATTERY_INFO);
|
BluetoothGattCharacteristic characteristic = getCharacteristic(HuamiService.UUID_CHARACTERISTIC_6_BATTERY_INFO);
|
||||||
builder.read(characteristic);
|
builder.read(characteristic);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -377,14 +377,14 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
|
|
||||||
private HuamiSupport setFitnessGoal(TransactionBuilder transaction) {
|
private HuamiSupport setFitnessGoal(TransactionBuilder transaction) {
|
||||||
LOG.info("Attempting to set Fitness Goal...");
|
LOG.info("Attempting to set Fitness Goal...");
|
||||||
BluetoothGattCharacteristic characteristic = getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_8_USER_SETTINGS);
|
BluetoothGattCharacteristic characteristic = getCharacteristic(HuamiService.UUID_CHARACTERISTIC_8_USER_SETTINGS);
|
||||||
if (characteristic != null) {
|
if (characteristic != null) {
|
||||||
int fitnessGoal = GBApplication.getPrefs().getInt(ActivityUser.PREF_USER_STEPS_GOAL, 10000);
|
int fitnessGoal = GBApplication.getPrefs().getInt(ActivityUser.PREF_USER_STEPS_GOAL, 10000);
|
||||||
byte[] bytes = ArrayUtils.addAll(
|
byte[] bytes = ArrayUtils.addAll(
|
||||||
MiBand2Service.COMMAND_SET_FITNESS_GOAL_START,
|
HuamiService.COMMAND_SET_FITNESS_GOAL_START,
|
||||||
BLETypeConversions.fromUint16(fitnessGoal));
|
BLETypeConversions.fromUint16(fitnessGoal));
|
||||||
bytes = ArrayUtils.addAll(bytes,
|
bytes = ArrayUtils.addAll(bytes,
|
||||||
MiBand2Service.COMMAND_SET_FITNESS_GOAL_END);
|
HuamiService.COMMAND_SET_FITNESS_GOAL_END);
|
||||||
transaction.write(characteristic, bytes);
|
transaction.write(characteristic, bytes);
|
||||||
} else {
|
} else {
|
||||||
LOG.info("Unable to set Fitness Goal");
|
LOG.info("Unable to set Fitness Goal");
|
||||||
@ -400,7 +400,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
private HuamiSupport setUserInfo(TransactionBuilder transaction) {
|
private HuamiSupport setUserInfo(TransactionBuilder transaction) {
|
||||||
BluetoothGattCharacteristic characteristic = getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_8_USER_SETTINGS);
|
BluetoothGattCharacteristic characteristic = getCharacteristic(HuamiService.UUID_CHARACTERISTIC_8_USER_SETTINGS);
|
||||||
if (characteristic == null) {
|
if (characteristic == null) {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -432,7 +432,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
|
|
||||||
// FIXME: Do encoding like in PebbleProtocol, this is ugly
|
// FIXME: Do encoding like in PebbleProtocol, this is ugly
|
||||||
byte bytes[] = new byte[]{
|
byte bytes[] = new byte[]{
|
||||||
MiBand2Service.COMMAND_SET_USERINFO,
|
HuamiService.COMMAND_SET_USERINFO,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
(byte) (birth_year & 0xff),
|
(byte) (birth_year & 0xff),
|
||||||
@ -462,16 +462,16 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
*/
|
*/
|
||||||
private HuamiSupport setWearLocation(TransactionBuilder builder) {
|
private HuamiSupport setWearLocation(TransactionBuilder builder) {
|
||||||
LOG.info("Attempting to set wear location...");
|
LOG.info("Attempting to set wear location...");
|
||||||
BluetoothGattCharacteristic characteristic = getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_8_USER_SETTINGS);
|
BluetoothGattCharacteristic characteristic = getCharacteristic(HuamiService.UUID_CHARACTERISTIC_8_USER_SETTINGS);
|
||||||
if (characteristic != null) {
|
if (characteristic != null) {
|
||||||
builder.notify(characteristic, true);
|
builder.notify(characteristic, true);
|
||||||
int location = MiBandCoordinator.getWearLocation(getDevice().getAddress());
|
int location = MiBandCoordinator.getWearLocation(getDevice().getAddress());
|
||||||
switch (location) {
|
switch (location) {
|
||||||
case 0: // left hand
|
case 0: // left hand
|
||||||
builder.write(characteristic, MiBand2Service.WEAR_LOCATION_LEFT_WRIST);
|
builder.write(characteristic, HuamiService.WEAR_LOCATION_LEFT_WRIST);
|
||||||
break;
|
break;
|
||||||
case 1: // right hand
|
case 1: // right hand
|
||||||
builder.write(characteristic, MiBand2Service.WEAR_LOCATION_RIGHT_WRIST);
|
builder.write(characteristic, HuamiService.WEAR_LOCATION_RIGHT_WRIST);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
builder.notify(characteristic, false); // TODO: this should actually be in some kind of finally-block in the queue. It should also be sent asynchronously after the notifications have completely arrived and processed.
|
builder.notify(characteristic, false); // TODO: this should actually be in some kind of finally-block in the queue. It should also be sent asynchronously after the notifications have completely arrived and processed.
|
||||||
@ -525,10 +525,10 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
builder.notify(characteristicHRControlPoint, true);
|
builder.notify(characteristicHRControlPoint, true);
|
||||||
if (enableHrSleepSupport) {
|
if (enableHrSleepSupport) {
|
||||||
LOG.info("Enabling heartrate sleep support...");
|
LOG.info("Enabling heartrate sleep support...");
|
||||||
builder.write(characteristicHRControlPoint, MiBand2Service.COMMAND_ENABLE_HR_SLEEP_MEASUREMENT);
|
builder.write(characteristicHRControlPoint, HuamiService.COMMAND_ENABLE_HR_SLEEP_MEASUREMENT);
|
||||||
} else {
|
} else {
|
||||||
LOG.info("Disabling heartrate sleep support...");
|
LOG.info("Disabling heartrate sleep support...");
|
||||||
builder.write(characteristicHRControlPoint, MiBand2Service.COMMAND_DISABLE_HR_SLEEP_MEASUREMENT);
|
builder.write(characteristicHRControlPoint, HuamiService.COMMAND_DISABLE_HR_SLEEP_MEASUREMENT);
|
||||||
}
|
}
|
||||||
builder.notify(characteristicHRControlPoint, false); // TODO: this should actually be in some kind of finally-block in the queue. It should also be sent asynchronously after the notifications have completely arrived and processed.
|
builder.notify(characteristicHRControlPoint, false); // TODO: this should actually be in some kind of finally-block in the queue. It should also be sent asynchronously after the notifications have completely arrived and processed.
|
||||||
}
|
}
|
||||||
@ -539,7 +539,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
if (characteristicHRControlPoint != null) {
|
if (characteristicHRControlPoint != null) {
|
||||||
builder.notify(characteristicHRControlPoint, true);
|
builder.notify(characteristicHRControlPoint, true);
|
||||||
LOG.info("Setting heart rate measurement interval to " + minutes + " minutes");
|
LOG.info("Setting heart rate measurement interval to " + minutes + " minutes");
|
||||||
builder.write(characteristicHRControlPoint, new byte[]{MiBand2Service.COMMAND_SET_PERIODIC_HR_MEASUREMENT_INTERVAL, (byte) minutes});
|
builder.write(characteristicHRControlPoint, new byte[]{HuamiService.COMMAND_SET_PERIODIC_HR_MEASUREMENT_INTERVAL, (byte) minutes});
|
||||||
builder.notify(characteristicHRControlPoint, false); // TODO: this should actually be in some kind of finally-block in the queue. It should also be sent asynchronously after the notifications have completely arrived and processed.
|
builder.notify(characteristicHRControlPoint, false); // TODO: this should actually be in some kind of finally-block in the queue. It should also be sent asynchronously after the notifications have completely arrived and processed.
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
@ -615,7 +615,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
@Override
|
@Override
|
||||||
public void onSetAlarms(ArrayList<? extends Alarm> alarms) {
|
public void onSetAlarms(ArrayList<? extends Alarm> alarms) {
|
||||||
try {
|
try {
|
||||||
BluetoothGattCharacteristic characteristic = getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION);
|
BluetoothGattCharacteristic characteristic = getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION);
|
||||||
TransactionBuilder builder = performInitialized("Set alarm");
|
TransactionBuilder builder = performInitialized("Set alarm");
|
||||||
boolean anyAlarmEnabled = false;
|
boolean anyAlarmEnabled = false;
|
||||||
for (Alarm alarm : alarms) {
|
for (Alarm alarm : alarms) {
|
||||||
@ -639,9 +639,9 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
onAlarmClock(notificationSpec);
|
onAlarmClock(notificationSpec);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int alertLevel = MiBand2Service.ALERT_LEVEL_MESSAGE;
|
int alertLevel = HuamiService.ALERT_LEVEL_MESSAGE;
|
||||||
if (notificationSpec.type == NotificationType.UNKNOWN) {
|
if (notificationSpec.type == NotificationType.UNKNOWN) {
|
||||||
alertLevel = MiBand2Service.ALERT_LEVEL_VIBRATE_ONLY;
|
alertLevel = HuamiService.ALERT_LEVEL_VIBRATE_ONLY;
|
||||||
}
|
}
|
||||||
String message = NotificationUtils.getPreferredTextFor(notificationSpec, 40, 40, getContext()).trim();
|
String message = NotificationUtils.getPreferredTextFor(notificationSpec, 40, 40, getContext()).trim();
|
||||||
String origin = notificationSpec.type.getGenericType();
|
String origin = notificationSpec.type.getGenericType();
|
||||||
@ -659,7 +659,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
};
|
};
|
||||||
String message = NotificationUtils.getPreferredTextFor(notificationSpec, 40, 40, getContext());
|
String message = NotificationUtils.getPreferredTextFor(notificationSpec, 40, 40, getContext());
|
||||||
SimpleNotification simpleNotification = new SimpleNotification(message, AlertCategory.HighPriorityAlert, notificationSpec.type);
|
SimpleNotification simpleNotification = new SimpleNotification(message, AlertCategory.HighPriorityAlert, notificationSpec.type);
|
||||||
performPreferredNotification("alarm clock ringing", MiBandConst.ORIGIN_ALARM_CLOCK, simpleNotification, MiBand2Service.ALERT_LEVEL_VIBRATE_ONLY, abortAction);
|
performPreferredNotification("alarm clock ringing", MiBandConst.ORIGIN_ALARM_CLOCK, simpleNotification, HuamiService.ALERT_LEVEL_VIBRATE_ONLY, abortAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -692,7 +692,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
};
|
};
|
||||||
String message = NotificationUtils.getPreferredTextFor(callSpec);
|
String message = NotificationUtils.getPreferredTextFor(callSpec);
|
||||||
SimpleNotification simpleNotification = new SimpleNotification(message, AlertCategory.IncomingCall, null);
|
SimpleNotification simpleNotification = new SimpleNotification(message, AlertCategory.IncomingCall, null);
|
||||||
performPreferredNotification("incoming call", MiBandConst.ORIGIN_INCOMING_CALL, simpleNotification, MiBand2Service.ALERT_LEVEL_PHONE_CALL, abortAction);
|
performPreferredNotification("incoming call", MiBandConst.ORIGIN_INCOMING_CALL, simpleNotification, HuamiService.ALERT_LEVEL_PHONE_CALL, abortAction);
|
||||||
} else if ((callSpec.command == CallSpec.CALL_START) || (callSpec.command == CallSpec.CALL_END)) {
|
} else if ((callSpec.command == CallSpec.CALL_START) || (callSpec.command == CallSpec.CALL_END)) {
|
||||||
telephoneRinging = false;
|
telephoneRinging = false;
|
||||||
stopCurrentNotification();
|
stopCurrentNotification();
|
||||||
@ -745,7 +745,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public HuamiSupport sendReboot(TransactionBuilder builder) {
|
public HuamiSupport sendReboot(TransactionBuilder builder) {
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_FIRMWARE), new byte[] { MiBand2Service.COMMAND_FIRMWARE_REBOOT});
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_FIRMWARE), new byte[] { HuamiService.COMMAND_FIRMWARE_REBOOT});
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -824,9 +824,9 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
try {
|
try {
|
||||||
TransactionBuilder builder = performInitialized(enable ? "Enabling realtime steps notifications" : "Disabling realtime steps notifications");
|
TransactionBuilder builder = performInitialized(enable ? "Enabling realtime steps notifications" : "Disabling realtime steps notifications");
|
||||||
if (enable) {
|
if (enable) {
|
||||||
builder.read(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_7_REALTIME_STEPS));
|
builder.read(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_7_REALTIME_STEPS));
|
||||||
}
|
}
|
||||||
builder.notify(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_7_REALTIME_STEPS), enable);
|
builder.notify(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_7_REALTIME_STEPS), enable);
|
||||||
builder.queue(getQueue());
|
builder.queue(getQueue());
|
||||||
enableRealtimeSamplesTimer(enable);
|
enableRealtimeSamplesTimer(enable);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@ -927,7 +927,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
LOG.info("Sending " + requiredButtonPressMessage + " with button_id " + currentButtonActionId);
|
LOG.info("Sending " + requiredButtonPressMessage + " with button_id " + currentButtonActionId);
|
||||||
this.getContext().getApplicationContext().sendBroadcast(in);
|
this.getContext().getApplicationContext().sendBroadcast(in);
|
||||||
if (prefs.getBoolean(MiBandConst.PREF_MIBAND_BUTTON_ACTION_VIBRATE, false)) {
|
if (prefs.getBoolean(MiBandConst.PREF_MIBAND_BUTTON_ACTION_VIBRATE, false)) {
|
||||||
performPreferredNotification(null, null, null, MiBand2Service.ALERT_LEVEL_VIBRATE_ONLY, null);
|
performPreferredNotification(null, null, null, HuamiService.ALERT_LEVEL_VIBRATE_ONLY, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
currentButtonActionId = 0;
|
currentButtonActionId = 0;
|
||||||
@ -997,7 +997,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
try {
|
try {
|
||||||
TransactionBuilder builder = performInitialized("acknowledge find phone");
|
TransactionBuilder builder = performInitialized("acknowledge find phone");
|
||||||
|
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), AmazfitBipService.COMMAND_ACK_FIND_PHONE_IN_PROGRESS);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), AmazfitBipService.COMMAND_ACK_FIND_PHONE_IN_PROGRESS);
|
||||||
builder.queue(getQueue());
|
builder.queue(getQueue());
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
LOG.error("Error sending current weather", ex);
|
LOG.error("Error sending current weather", ex);
|
||||||
@ -1058,7 +1058,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
super.onCharacteristicChanged(gatt, characteristic);
|
super.onCharacteristicChanged(gatt, characteristic);
|
||||||
|
|
||||||
UUID characteristicUUID = characteristic.getUuid();
|
UUID characteristicUUID = characteristic.getUuid();
|
||||||
if (MiBand2Service.UUID_CHARACTERISTIC_6_BATTERY_INFO.equals(characteristicUUID)) {
|
if (HuamiService.UUID_CHARACTERISTIC_6_BATTERY_INFO.equals(characteristicUUID)) {
|
||||||
handleBatteryInfo(characteristic.getValue(), BluetoothGatt.GATT_SUCCESS);
|
handleBatteryInfo(characteristic.getValue(), BluetoothGatt.GATT_SUCCESS);
|
||||||
return true;
|
return true;
|
||||||
} else if (MiBandService.UUID_CHARACTERISTIC_REALTIME_STEPS.equals(characteristicUUID)) {
|
} else if (MiBandService.UUID_CHARACTERISTIC_REALTIME_STEPS.equals(characteristicUUID)) {
|
||||||
@ -1067,14 +1067,14 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
} else if (GattCharacteristic.UUID_CHARACTERISTIC_HEART_RATE_MEASUREMENT.equals(characteristicUUID)) {
|
} else if (GattCharacteristic.UUID_CHARACTERISTIC_HEART_RATE_MEASUREMENT.equals(characteristicUUID)) {
|
||||||
handleHeartrate(characteristic.getValue());
|
handleHeartrate(characteristic.getValue());
|
||||||
return true;
|
return true;
|
||||||
} else if (MiBand2Service.UUID_CHARACTERISTIC_AUTH.equals(characteristicUUID)) {
|
} else if (HuamiService.UUID_CHARACTERISTIC_AUTH.equals(characteristicUUID)) {
|
||||||
LOG.info("AUTHENTICATION?? " + characteristicUUID);
|
LOG.info("AUTHENTICATION?? " + characteristicUUID);
|
||||||
logMessageContent(characteristic.getValue());
|
logMessageContent(characteristic.getValue());
|
||||||
return true;
|
return true;
|
||||||
} else if (MiBand2Service.UUID_CHARACTERISTIC_DEVICEEVENT.equals(characteristicUUID)) {
|
} else if (HuamiService.UUID_CHARACTERISTIC_DEVICEEVENT.equals(characteristicUUID)) {
|
||||||
handleDeviceEvent(characteristic.getValue());
|
handleDeviceEvent(characteristic.getValue());
|
||||||
return true;
|
return true;
|
||||||
} else if (MiBand2Service.UUID_CHARACTERISTIC_7_REALTIME_STEPS.equals(characteristicUUID)) {
|
} else if (HuamiService.UUID_CHARACTERISTIC_7_REALTIME_STEPS.equals(characteristicUUID)) {
|
||||||
handleRealtimeSteps(characteristic.getValue());
|
handleRealtimeSteps(characteristic.getValue());
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
@ -1094,16 +1094,16 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
if (GattCharacteristic.UUID_CHARACTERISTIC_GAP_DEVICE_NAME.equals(characteristicUUID)) {
|
if (GattCharacteristic.UUID_CHARACTERISTIC_GAP_DEVICE_NAME.equals(characteristicUUID)) {
|
||||||
handleDeviceName(characteristic.getValue(), status);
|
handleDeviceName(characteristic.getValue(), status);
|
||||||
return true;
|
return true;
|
||||||
} else if (MiBand2Service.UUID_CHARACTERISTIC_6_BATTERY_INFO.equals(characteristicUUID)) {
|
} else if (HuamiService.UUID_CHARACTERISTIC_6_BATTERY_INFO.equals(characteristicUUID)) {
|
||||||
handleBatteryInfo(characteristic.getValue(), status);
|
handleBatteryInfo(characteristic.getValue(), status);
|
||||||
return true;
|
return true;
|
||||||
} else if (GattCharacteristic.UUID_CHARACTERISTIC_HEART_RATE_MEASUREMENT.equals(characteristicUUID)) {
|
} else if (GattCharacteristic.UUID_CHARACTERISTIC_HEART_RATE_MEASUREMENT.equals(characteristicUUID)) {
|
||||||
logHeartrate(characteristic.getValue(), status);
|
logHeartrate(characteristic.getValue(), status);
|
||||||
return true;
|
return true;
|
||||||
} else if (MiBand2Service.UUID_CHARACTERISTIC_7_REALTIME_STEPS.equals(characteristicUUID)) {
|
} else if (HuamiService.UUID_CHARACTERISTIC_7_REALTIME_STEPS.equals(characteristicUUID)) {
|
||||||
handleRealtimeSteps(characteristic.getValue());
|
handleRealtimeSteps(characteristic.getValue());
|
||||||
return true;
|
return true;
|
||||||
} else if (MiBand2Service.UUID_CHARACTERISTIC_DEVICEEVENT.equals(characteristicUUID)) {
|
} else if (HuamiService.UUID_CHARACTERISTIC_DEVICEEVENT.equals(characteristicUUID)) {
|
||||||
handleDeviceEvent(characteristic.getValue());
|
handleDeviceEvent(characteristic.getValue());
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
@ -1118,7 +1118,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
public boolean onCharacteristicWrite(BluetoothGatt gatt,
|
public boolean onCharacteristicWrite(BluetoothGatt gatt,
|
||||||
BluetoothGattCharacteristic characteristic, int status) {
|
BluetoothGattCharacteristic characteristic, int status) {
|
||||||
UUID characteristicUUID = characteristic.getUuid();
|
UUID characteristicUUID = characteristic.getUuid();
|
||||||
if (MiBand2Service.UUID_CHARACTERISTIC_AUTH.equals(characteristicUUID)) {
|
if (HuamiService.UUID_CHARACTERISTIC_AUTH.equals(characteristicUUID)) {
|
||||||
LOG.info("KEY AES SEND");
|
LOG.info("KEY AES SEND");
|
||||||
logMessageContent(characteristic.getValue());
|
logMessageContent(characteristic.getValue());
|
||||||
return true;
|
return true;
|
||||||
@ -1313,7 +1313,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
* @param builder
|
* @param builder
|
||||||
*/
|
*/
|
||||||
private HuamiSupport sendCalendarEvents(TransactionBuilder builder) {
|
private HuamiSupport sendCalendarEvents(TransactionBuilder builder) {
|
||||||
BluetoothGattCharacteristic characteristic = getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION);
|
BluetoothGattCharacteristic characteristic = getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION);
|
||||||
|
|
||||||
Prefs prefs = GBApplication.getPrefs();
|
Prefs prefs = GBApplication.getPrefs();
|
||||||
int availableSlots = prefs.getInt(MiBandConst.PREF_MIBAND_RESERVE_ALARM_FOR_CALENDAR, 0);
|
int availableSlots = prefs.getInt(MiBandConst.PREF_MIBAND_RESERVE_ALARM_FOR_CALENDAR, 0);
|
||||||
@ -1407,10 +1407,10 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
LOG.info("Setting date display to " + dateTimeDisplay);
|
LOG.info("Setting date display to " + dateTimeDisplay);
|
||||||
switch (dateTimeDisplay) {
|
switch (dateTimeDisplay) {
|
||||||
case TIME:
|
case TIME:
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.DATEFORMAT_TIME);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.DATEFORMAT_TIME);
|
||||||
break;
|
break;
|
||||||
case DATE_TIME:
|
case DATE_TIME:
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.DATEFORMAT_DATE_TIME);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.DATEFORMAT_DATE_TIME);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
@ -1420,9 +1420,9 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
boolean is24Format = DateFormat.is24HourFormat(getContext());
|
boolean is24Format = DateFormat.is24HourFormat(getContext());
|
||||||
LOG.info("Setting 24h time format to " + is24Format);
|
LOG.info("Setting 24h time format to " + is24Format);
|
||||||
if (is24Format) {
|
if (is24Format) {
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.DATEFORMAT_TIME_24_HOURS);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.DATEFORMAT_TIME_24_HOURS);
|
||||||
} else {
|
} else {
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.DATEFORMAT_TIME_12_HOURS);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.DATEFORMAT_TIME_12_HOURS);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -1431,9 +1431,9 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
boolean enable = HuamiCoordinator.getGoalNotification();
|
boolean enable = HuamiCoordinator.getGoalNotification();
|
||||||
LOG.info("Setting goal notification to " + enable);
|
LOG.info("Setting goal notification to " + enable);
|
||||||
if (enable) {
|
if (enable) {
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.COMMAND_ENABLE_GOAL_NOTIFICATION);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.COMMAND_ENABLE_GOAL_NOTIFICATION);
|
||||||
} else {
|
} else {
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.COMMAND_DISABLE_GOAL_NOTIFICATION);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.COMMAND_DISABLE_GOAL_NOTIFICATION);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -1444,13 +1444,13 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
|
|
||||||
switch (displayOnLift) {
|
switch (displayOnLift) {
|
||||||
case ON:
|
case ON:
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.COMMAND_ENABLE_DISPLAY_ON_LIFT_WRIST);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.COMMAND_ENABLE_DISPLAY_ON_LIFT_WRIST);
|
||||||
break;
|
break;
|
||||||
case OFF:
|
case OFF:
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.COMMAND_DISABLE_DISPLAY_ON_LIFT_WRIST);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.COMMAND_DISABLE_DISPLAY_ON_LIFT_WRIST);
|
||||||
break;
|
break;
|
||||||
case SCHEDULED:
|
case SCHEDULED:
|
||||||
byte[] cmd = MiBand2Service.COMMAND_SCHEDULE_DISPLAY_ON_LIFT_WRIST.clone();
|
byte[] cmd = HuamiService.COMMAND_SCHEDULE_DISPLAY_ON_LIFT_WRIST.clone();
|
||||||
|
|
||||||
Calendar calendar = GregorianCalendar.getInstance();
|
Calendar calendar = GregorianCalendar.getInstance();
|
||||||
|
|
||||||
@ -1464,7 +1464,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
cmd[6] = (byte) calendar.get(Calendar.HOUR_OF_DAY);
|
cmd[6] = (byte) calendar.get(Calendar.HOUR_OF_DAY);
|
||||||
cmd[7] = (byte) calendar.get(Calendar.MINUTE);
|
cmd[7] = (byte) calendar.get(Calendar.MINUTE);
|
||||||
|
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), cmd);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), cmd);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -1473,27 +1473,27 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
Set<String> pages = HuamiCoordinator.getDisplayItems();
|
Set<String> pages = HuamiCoordinator.getDisplayItems();
|
||||||
LOG.info("Setting display items to " + (pages == null ? "none" : pages));
|
LOG.info("Setting display items to " + (pages == null ? "none" : pages));
|
||||||
|
|
||||||
byte[] data = MiBand2Service.COMMAND_CHANGE_SCREENS.clone();
|
byte[] data = HuamiService.COMMAND_CHANGE_SCREENS.clone();
|
||||||
|
|
||||||
if (pages != null) {
|
if (pages != null) {
|
||||||
if (pages.contains(MiBandConst.PREF_MI2_DISPLAY_ITEM_STEPS)) {
|
if (pages.contains(MiBandConst.PREF_MI2_DISPLAY_ITEM_STEPS)) {
|
||||||
data[MiBand2Service.SCREEN_CHANGE_BYTE] |= MiBand2Service.DISPLAY_ITEM_BIT_STEPS;
|
data[HuamiService.SCREEN_CHANGE_BYTE] |= HuamiService.DISPLAY_ITEM_BIT_STEPS;
|
||||||
}
|
}
|
||||||
if (pages.contains(MiBandConst.PREF_MI2_DISPLAY_ITEM_DISTANCE)) {
|
if (pages.contains(MiBandConst.PREF_MI2_DISPLAY_ITEM_DISTANCE)) {
|
||||||
data[MiBand2Service.SCREEN_CHANGE_BYTE] |= MiBand2Service.DISPLAY_ITEM_BIT_DISTANCE;
|
data[HuamiService.SCREEN_CHANGE_BYTE] |= HuamiService.DISPLAY_ITEM_BIT_DISTANCE;
|
||||||
}
|
}
|
||||||
if (pages.contains(MiBandConst.PREF_MI2_DISPLAY_ITEM_CALORIES)) {
|
if (pages.contains(MiBandConst.PREF_MI2_DISPLAY_ITEM_CALORIES)) {
|
||||||
data[MiBand2Service.SCREEN_CHANGE_BYTE] |= MiBand2Service.DISPLAY_ITEM_BIT_CALORIES;
|
data[HuamiService.SCREEN_CHANGE_BYTE] |= HuamiService.DISPLAY_ITEM_BIT_CALORIES;
|
||||||
}
|
}
|
||||||
if (pages.contains(MiBandConst.PREF_MI2_DISPLAY_ITEM_HEART_RATE)) {
|
if (pages.contains(MiBandConst.PREF_MI2_DISPLAY_ITEM_HEART_RATE)) {
|
||||||
data[MiBand2Service.SCREEN_CHANGE_BYTE] |= MiBand2Service.DISPLAY_ITEM_BIT_HEART_RATE;
|
data[HuamiService.SCREEN_CHANGE_BYTE] |= HuamiService.DISPLAY_ITEM_BIT_HEART_RATE;
|
||||||
}
|
}
|
||||||
if (pages.contains(MiBandConst.PREF_MI2_DISPLAY_ITEM_BATTERY)) {
|
if (pages.contains(MiBandConst.PREF_MI2_DISPLAY_ITEM_BATTERY)) {
|
||||||
data[MiBand2Service.SCREEN_CHANGE_BYTE] |= MiBand2Service.DISPLAY_ITEM_BIT_BATTERY;
|
data[HuamiService.SCREEN_CHANGE_BYTE] |= HuamiService.DISPLAY_ITEM_BIT_BATTERY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), data);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), data);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1501,15 +1501,15 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
boolean enable = HuamiCoordinator.getRotateWristToSwitchInfo();
|
boolean enable = HuamiCoordinator.getRotateWristToSwitchInfo();
|
||||||
LOG.info("Setting rotate wrist to cycle info to " + enable);
|
LOG.info("Setting rotate wrist to cycle info to " + enable);
|
||||||
if (enable) {
|
if (enable) {
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.COMMAND_ENABLE_ROTATE_WRIST_TO_SWITCH_INFO);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.COMMAND_ENABLE_ROTATE_WRIST_TO_SWITCH_INFO);
|
||||||
} else {
|
} else {
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.COMMAND_DISABLE_ROTATE_WRIST_TO_SWITCH_INFO);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.COMMAND_DISABLE_ROTATE_WRIST_TO_SWITCH_INFO);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
private HuamiSupport setDisplayCaller(TransactionBuilder builder) {
|
private HuamiSupport setDisplayCaller(TransactionBuilder builder) {
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.COMMAND_ENABLE_DISPLAY_CALLER);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.COMMAND_ENABLE_DISPLAY_CALLER);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1518,27 +1518,27 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
LOG.info("Setting do not disturb to " + doNotDisturb);
|
LOG.info("Setting do not disturb to " + doNotDisturb);
|
||||||
switch (doNotDisturb) {
|
switch (doNotDisturb) {
|
||||||
case OFF:
|
case OFF:
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.COMMAND_DO_NOT_DISTURB_OFF);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.COMMAND_DO_NOT_DISTURB_OFF);
|
||||||
break;
|
break;
|
||||||
case AUTOMATIC:
|
case AUTOMATIC:
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.COMMAND_DO_NOT_DISTURB_AUTOMATIC);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.COMMAND_DO_NOT_DISTURB_AUTOMATIC);
|
||||||
break;
|
break;
|
||||||
case SCHEDULED:
|
case SCHEDULED:
|
||||||
byte[] data = MiBand2Service.COMMAND_DO_NOT_DISTURB_SCHEDULED.clone();
|
byte[] data = HuamiService.COMMAND_DO_NOT_DISTURB_SCHEDULED.clone();
|
||||||
|
|
||||||
Calendar calendar = GregorianCalendar.getInstance();
|
Calendar calendar = GregorianCalendar.getInstance();
|
||||||
|
|
||||||
Date start = HuamiCoordinator.getDoNotDisturbStart();
|
Date start = HuamiCoordinator.getDoNotDisturbStart();
|
||||||
calendar.setTime(start);
|
calendar.setTime(start);
|
||||||
data[MiBand2Service.DND_BYTE_START_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY);
|
data[HuamiService.DND_BYTE_START_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY);
|
||||||
data[MiBand2Service.DND_BYTE_START_MINUTES] = (byte) calendar.get(Calendar.MINUTE);
|
data[HuamiService.DND_BYTE_START_MINUTES] = (byte) calendar.get(Calendar.MINUTE);
|
||||||
|
|
||||||
Date end = HuamiCoordinator.getDoNotDisturbEnd();
|
Date end = HuamiCoordinator.getDoNotDisturbEnd();
|
||||||
calendar.setTime(end);
|
calendar.setTime(end);
|
||||||
data[MiBand2Service.DND_BYTE_END_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY);
|
data[HuamiService.DND_BYTE_END_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY);
|
||||||
data[MiBand2Service.DND_BYTE_END_MINUTES] = (byte) calendar.get(Calendar.MINUTE);
|
data[HuamiService.DND_BYTE_END_MINUTES] = (byte) calendar.get(Calendar.MINUTE);
|
||||||
|
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), data);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), data);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1551,10 +1551,10 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
LOG.info("Setting inactivity warnings to " + enable);
|
LOG.info("Setting inactivity warnings to " + enable);
|
||||||
|
|
||||||
if (enable) {
|
if (enable) {
|
||||||
byte[] data = MiBand2Service.COMMAND_ENABLE_INACTIVITY_WARNINGS.clone();
|
byte[] data = HuamiService.COMMAND_ENABLE_INACTIVITY_WARNINGS.clone();
|
||||||
|
|
||||||
int threshold = HuamiCoordinator.getInactivityWarningsThreshold();
|
int threshold = HuamiCoordinator.getInactivityWarningsThreshold();
|
||||||
data[MiBand2Service.INACTIVITY_WARNINGS_THRESHOLD] = (byte) threshold;
|
data[HuamiService.INACTIVITY_WARNINGS_THRESHOLD] = (byte) threshold;
|
||||||
|
|
||||||
Calendar calendar = GregorianCalendar.getInstance();
|
Calendar calendar = GregorianCalendar.getInstance();
|
||||||
|
|
||||||
@ -1567,34 +1567,34 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
|
|
||||||
// The first interval always starts when the warnings interval starts
|
// The first interval always starts when the warnings interval starts
|
||||||
calendar.setTime(intervalStart);
|
calendar.setTime(intervalStart);
|
||||||
data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_1_START_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY);
|
data[HuamiService.INACTIVITY_WARNINGS_INTERVAL_1_START_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY);
|
||||||
data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_1_START_MINUTES] = (byte) calendar.get(Calendar.MINUTE);
|
data[HuamiService.INACTIVITY_WARNINGS_INTERVAL_1_START_MINUTES] = (byte) calendar.get(Calendar.MINUTE);
|
||||||
|
|
||||||
if(enableDnd) {
|
if(enableDnd) {
|
||||||
// The first interval ends when the dnd interval starts
|
// The first interval ends when the dnd interval starts
|
||||||
calendar.setTime(dndStart);
|
calendar.setTime(dndStart);
|
||||||
data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_1_END_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY);
|
data[HuamiService.INACTIVITY_WARNINGS_INTERVAL_1_END_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY);
|
||||||
data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_1_END_MINUTES] = (byte) calendar.get(Calendar.MINUTE);
|
data[HuamiService.INACTIVITY_WARNINGS_INTERVAL_1_END_MINUTES] = (byte) calendar.get(Calendar.MINUTE);
|
||||||
|
|
||||||
// The second interval starts when the dnd interval ends
|
// The second interval starts when the dnd interval ends
|
||||||
calendar.setTime(dndEnd);
|
calendar.setTime(dndEnd);
|
||||||
data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_2_START_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY);
|
data[HuamiService.INACTIVITY_WARNINGS_INTERVAL_2_START_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY);
|
||||||
data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_2_START_MINUTES] = (byte) calendar.get(Calendar.MINUTE);
|
data[HuamiService.INACTIVITY_WARNINGS_INTERVAL_2_START_MINUTES] = (byte) calendar.get(Calendar.MINUTE);
|
||||||
|
|
||||||
// ... and it ends when the warnings interval ends
|
// ... and it ends when the warnings interval ends
|
||||||
calendar.setTime(intervalEnd);
|
calendar.setTime(intervalEnd);
|
||||||
data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_2_END_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY);
|
data[HuamiService.INACTIVITY_WARNINGS_INTERVAL_2_END_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY);
|
||||||
data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_2_END_MINUTES] = (byte) calendar.get(Calendar.MINUTE);
|
data[HuamiService.INACTIVITY_WARNINGS_INTERVAL_2_END_MINUTES] = (byte) calendar.get(Calendar.MINUTE);
|
||||||
} else {
|
} else {
|
||||||
// No Dnd, use the first interval
|
// No Dnd, use the first interval
|
||||||
calendar.setTime(intervalEnd);
|
calendar.setTime(intervalEnd);
|
||||||
data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_1_END_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY);
|
data[HuamiService.INACTIVITY_WARNINGS_INTERVAL_1_END_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY);
|
||||||
data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_1_END_MINUTES] = (byte) calendar.get(Calendar.MINUTE);
|
data[HuamiService.INACTIVITY_WARNINGS_INTERVAL_1_END_MINUTES] = (byte) calendar.get(Calendar.MINUTE);
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), data);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), data);
|
||||||
} else {
|
} else {
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.COMMAND_DISABLE_INACTIVITY_WARNINGS);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.COMMAND_DISABLE_INACTIVITY_WARNINGS);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
@ -1604,9 +1604,9 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
|
|||||||
MiBandConst.DistanceUnit unit = HuamiCoordinator.getDistanceUnit();
|
MiBandConst.DistanceUnit unit = HuamiCoordinator.getDistanceUnit();
|
||||||
LOG.info("Setting distance unit to " + unit);
|
LOG.info("Setting distance unit to " + unit);
|
||||||
if (unit == MiBandConst.DistanceUnit.METRIC) {
|
if (unit == MiBandConst.DistanceUnit.METRIC) {
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.COMMAND_DISTANCE_UNIT_METRIC);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.COMMAND_DISTANCE_UNIT_METRIC);
|
||||||
} else {
|
} else {
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.COMMAND_DISTANCE_UNIT_IMPERIAL);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.COMMAND_DISTANCE_UNIT_IMPERIAL);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.huami.actions;
|
|||||||
import android.bluetooth.BluetoothGatt;
|
import android.bluetooth.BluetoothGatt;
|
||||||
import android.bluetooth.BluetoothGattCharacteristic;
|
import android.bluetooth.BluetoothGattCharacteristic;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.AbortTransactionAction;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.AbortTransactionAction;
|
||||||
|
|
||||||
public abstract class StopNotificationAction extends AbortTransactionAction {
|
public abstract class StopNotificationAction extends AbortTransactionAction {
|
||||||
@ -34,7 +34,7 @@ public abstract class StopNotificationAction extends AbortTransactionAction {
|
|||||||
public boolean run(BluetoothGatt gatt) {
|
public boolean run(BluetoothGatt gatt) {
|
||||||
if (!super.run(gatt)) {
|
if (!super.run(gatt)) {
|
||||||
// send a signal to stop the vibration
|
// send a signal to stop the vibration
|
||||||
alertLevelCharacteristic.setValue(new byte[]{MiBand2Service.ALERT_LEVEL_NONE});
|
alertLevelCharacteristic.setValue(new byte[]{HuamiService.ALERT_LEVEL_NONE});
|
||||||
gatt.writeCharacteristic(alertLevelCharacteristic);
|
gatt.writeCharacteristic(alertLevelCharacteristic);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiWeatherConditions;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiWeatherConditions;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipFWHelper;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipFWHelper;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipService;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.CallSpec;
|
import nodomain.freeyourgadget.gadgetbridge.model.CallSpec;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
|
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
|
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
|
||||||
@ -131,9 +131,6 @@ public class AmazfitBipSupport extends HuamiSupport {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected AmazfitBipSupport setDisplayItems(TransactionBuilder builder) {
|
protected AmazfitBipSupport setDisplayItems(TransactionBuilder builder) {
|
||||||
if (gbDevice.getType() != DeviceType.AMAZFITBIP) {
|
|
||||||
return this; // Disable for Cor for now
|
|
||||||
}
|
|
||||||
if (gbDevice.getFirmwareVersion() == null) {
|
if (gbDevice.getFirmwareVersion() == null) {
|
||||||
LOG.warn("Device not initialized yet, won't set menu items");
|
LOG.warn("Device not initialized yet, won't set menu items");
|
||||||
return this;
|
return this;
|
||||||
@ -185,7 +182,7 @@ public class AmazfitBipSupport extends HuamiSupport {
|
|||||||
shortcut_alipay = true;
|
shortcut_alipay = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), command);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), command);
|
||||||
setShortcuts(builder, shortcut_weather, shortcut_alipay);
|
setShortcuts(builder, shortcut_weather, shortcut_alipay);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
@ -201,7 +198,7 @@ public class AmazfitBipSupport extends HuamiSupport {
|
|||||||
(byte) ((alipay && weather) ? 0x81 : 0x01), 0x01,
|
(byte) ((alipay && weather) ? 0x81 : 0x01), 0x01,
|
||||||
};
|
};
|
||||||
|
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), command);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), command);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -376,7 +373,7 @@ public class AmazfitBipSupport extends HuamiSupport {
|
|||||||
boolean handled = super.onCharacteristicChanged(gatt, characteristic);
|
boolean handled = super.onCharacteristicChanged(gatt, characteristic);
|
||||||
if (!handled) {
|
if (!handled) {
|
||||||
UUID characteristicUUID = characteristic.getUuid();
|
UUID characteristicUUID = characteristic.getUuid();
|
||||||
if (MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION.equals(characteristicUUID)) {
|
if (HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION.equals(characteristicUUID)) {
|
||||||
return handleConfigurationInfo(characteristic.getValue());
|
return handleConfigurationInfo(characteristic.getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -399,7 +396,7 @@ public class AmazfitBipSupport extends HuamiSupport {
|
|||||||
// this probably does more than only getting the GPS version...
|
// this probably does more than only getting the GPS version...
|
||||||
private AmazfitBipSupport requestGPSVersion(TransactionBuilder builder) {
|
private AmazfitBipSupport requestGPSVersion(TransactionBuilder builder) {
|
||||||
LOG.info("Requesting GPS version");
|
LOG.info("Requesting GPS version");
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), AmazfitBipService.COMMAND_REQUEST_GPS_VERSION);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), AmazfitBipService.COMMAND_REQUEST_GPS_VERSION);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -463,7 +460,7 @@ public class AmazfitBipSupport extends HuamiSupport {
|
|||||||
command_new = AmazfitBipService.COMMAND_SET_LANGUAGE_NEW_TEMPLATE;
|
command_new = AmazfitBipService.COMMAND_SET_LANGUAGE_NEW_TEMPLATE;
|
||||||
System.arraycopy(localeString.getBytes(), 0, command_new, 3, localeString.getBytes().length);
|
System.arraycopy(localeString.getBytes(), 0, command_new, 3, localeString.getBytes().length);
|
||||||
|
|
||||||
builder.add(new ConditionalWriteAction(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION)) {
|
builder.add(new ConditionalWriteAction(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION)) {
|
||||||
@Override
|
@Override
|
||||||
protected byte[] checkCondition() {
|
protected byte[] checkCondition() {
|
||||||
if (gbDevice.getType() == DeviceType.MIBAND3 ||
|
if (gbDevice.getType() == DeviceType.MIBAND3 ||
|
||||||
|
@ -33,7 +33,7 @@ import java.util.Locale;
|
|||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipService;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.WaitAction;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.WaitAction;
|
||||||
@ -75,12 +75,12 @@ public class AmazfitBipFetchLogsOperation extends AbstractFetchOperation {
|
|||||||
GregorianCalendar sinceWhen = BLETypeConversions.createCalendar();
|
GregorianCalendar sinceWhen = BLETypeConversions.createCalendar();
|
||||||
sinceWhen.add(Calendar.DAY_OF_MONTH, -10);
|
sinceWhen.add(Calendar.DAY_OF_MONTH, -10);
|
||||||
builder.write(characteristicFetch, BLETypeConversions.join(new byte[]{
|
builder.write(characteristicFetch, BLETypeConversions.join(new byte[]{
|
||||||
MiBand2Service.COMMAND_ACTIVITY_DATA_START_DATE,
|
HuamiService.COMMAND_ACTIVITY_DATA_START_DATE,
|
||||||
AmazfitBipService.COMMAND_ACTIVITY_DATA_TYPE_DEBUGLOGS},
|
AmazfitBipService.COMMAND_ACTIVITY_DATA_TYPE_DEBUGLOGS},
|
||||||
getSupport().getTimeBytes(sinceWhen, TimeUnit.MINUTES)));
|
getSupport().getTimeBytes(sinceWhen, TimeUnit.MINUTES)));
|
||||||
builder.add(new WaitAction(1000)); // TODO: actually wait for the success-reply
|
builder.add(new WaitAction(1000)); // TODO: actually wait for the success-reply
|
||||||
builder.notify(characteristicActivityData, true);
|
builder.notify(characteristicActivityData, true);
|
||||||
builder.write(characteristicFetch, new byte[]{MiBand2Service.COMMAND_FETCH_DATA});
|
builder.write(characteristicFetch, new byte[]{HuamiService.COMMAND_FETCH_DATA});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -27,9 +27,9 @@ import java.util.Set;
|
|||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitcor.AmazfitCorFWHelper;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitcor.AmazfitCorFWHelper;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitcor.AmazfitCorService;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitcor.AmazfitCorService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.AmazfitBipSupport;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.AmazfitBipSupport;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
||||||
@ -72,7 +72,7 @@ public class AmazfitCorSupport extends AmazfitBipSupport {
|
|||||||
command[2] |= 0x01;
|
command[2] |= 0x01;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), command);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), command);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -19,14 +19,58 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.huami.miband3;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
|
||||||
import java.io.IOException;
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.miband3.MiBand3FWHelper;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.miband3.MiBand3FWHelper;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.miband3.MiBand3Service;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.AmazfitBipSupport;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.AmazfitBipSupport;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
||||||
|
|
||||||
public class MiBand3Support extends AmazfitBipSupport {
|
public class MiBand3Support extends AmazfitBipSupport {
|
||||||
|
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(MiBand3Support.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AmazfitBipSupport setDisplayItems(TransactionBuilder builder) {
|
||||||
|
if (true) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Prefs prefs = GBApplication.getPrefs();
|
||||||
|
Set<String> pages = prefs.getStringSet("miband3_display_items", null);
|
||||||
|
LOG.info("Setting display items to " + (pages == null ? "none" : pages));
|
||||||
|
byte[] command = MiBand3Service.COMMAND_CHANGE_SCREENS.clone();
|
||||||
|
|
||||||
|
if (pages != null) {
|
||||||
|
if (pages.contains("notifications")) {
|
||||||
|
command[1] |= 0x02;
|
||||||
|
}
|
||||||
|
if (pages.contains("weather")) {
|
||||||
|
command[1] |= 0x04;
|
||||||
|
}
|
||||||
|
if (pages.contains("more")) {
|
||||||
|
command[1] |= 0x10;
|
||||||
|
}
|
||||||
|
if (pages.contains("status")) {
|
||||||
|
command[1] |= 0x20;
|
||||||
|
}
|
||||||
|
if (pages.contains("heart_rate")) {
|
||||||
|
command[1] |= 0x40;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), command);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HuamiFWHelper createFWHelper(Uri uri, Context context) throws IOException {
|
public HuamiFWHelper createFWHelper(Uri uri, Context context) throws IOException {
|
||||||
return new MiBand3FWHelper(uri, context);
|
return new MiBand3FWHelper(uri, context);
|
||||||
|
@ -36,7 +36,7 @@ import java.util.UUID;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.Logging;
|
import nodomain.freeyourgadget.gadgetbridge.Logging;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceBusyAction;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceBusyAction;
|
||||||
@ -87,10 +87,10 @@ public abstract class AbstractFetchOperation extends AbstractHuamiOperation {
|
|||||||
}
|
}
|
||||||
fetchCount++;
|
fetchCount++;
|
||||||
|
|
||||||
characteristicActivityData = getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_5_ACTIVITY_DATA);
|
characteristicActivityData = getCharacteristic(HuamiService.UUID_CHARACTERISTIC_5_ACTIVITY_DATA);
|
||||||
builder.notify(characteristicActivityData, false);
|
builder.notify(characteristicActivityData, false);
|
||||||
|
|
||||||
characteristicFetch = getCharacteristic(MiBand2Service.UUID_UNKNOWN_CHARACTERISTIC4);
|
characteristicFetch = getCharacteristic(HuamiService.UUID_UNKNOWN_CHARACTERISTIC4);
|
||||||
builder.notify(characteristicFetch, true);
|
builder.notify(characteristicFetch, true);
|
||||||
|
|
||||||
startFetching(builder);
|
startFetching(builder);
|
||||||
@ -105,10 +105,10 @@ public abstract class AbstractFetchOperation extends AbstractHuamiOperation {
|
|||||||
public boolean onCharacteristicChanged(BluetoothGatt gatt,
|
public boolean onCharacteristicChanged(BluetoothGatt gatt,
|
||||||
BluetoothGattCharacteristic characteristic) {
|
BluetoothGattCharacteristic characteristic) {
|
||||||
UUID characteristicUUID = characteristic.getUuid();
|
UUID characteristicUUID = characteristic.getUuid();
|
||||||
if (MiBand2Service.UUID_CHARACTERISTIC_5_ACTIVITY_DATA.equals(characteristicUUID)) {
|
if (HuamiService.UUID_CHARACTERISTIC_5_ACTIVITY_DATA.equals(characteristicUUID)) {
|
||||||
handleActivityNotif(characteristic.getValue());
|
handleActivityNotif(characteristic.getValue());
|
||||||
return true;
|
return true;
|
||||||
} else if (MiBand2Service.UUID_UNKNOWN_CHARACTERISTIC4.equals(characteristicUUID)) {
|
} else if (HuamiService.UUID_UNKNOWN_CHARACTERISTIC4.equals(characteristicUUID)) {
|
||||||
handleActivityMetadata(characteristic.getValue());
|
handleActivityMetadata(characteristic.getValue());
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
@ -140,7 +140,7 @@ public abstract class AbstractFetchOperation extends AbstractHuamiOperation {
|
|||||||
protected void handleActivityMetadata(byte[] value) {
|
protected void handleActivityMetadata(byte[] value) {
|
||||||
if (value.length == 15) {
|
if (value.length == 15) {
|
||||||
// first two bytes are whether our request was accepted
|
// first two bytes are whether our request was accepted
|
||||||
if (ArrayUtils.equals(value, MiBand2Service.RESPONSE_ACTIVITY_DATA_START_DATE_SUCCESS, 0)) {
|
if (ArrayUtils.equals(value, HuamiService.RESPONSE_ACTIVITY_DATA_START_DATE_SUCCESS, 0)) {
|
||||||
// the third byte (0x01 on success) = ?
|
// the third byte (0x01 on success) = ?
|
||||||
// the 4th - 7th bytes epresent the number of bytes/packets to expect, excluding the counter bytes
|
// the 4th - 7th bytes epresent the number of bytes/packets to expect, excluding the counter bytes
|
||||||
expectedDataLength = BLETypeConversions.toUint32(Arrays.copyOfRange(value, 3, 7));
|
expectedDataLength = BLETypeConversions.toUint32(Arrays.copyOfRange(value, 3, 7));
|
||||||
@ -157,7 +157,7 @@ public abstract class AbstractFetchOperation extends AbstractHuamiOperation {
|
|||||||
handleActivityFetchFinish(false);
|
handleActivityFetchFinish(false);
|
||||||
}
|
}
|
||||||
} else if (value.length == 3) {
|
} else if (value.length == 3) {
|
||||||
if (Arrays.equals(MiBand2Service.RESPONSE_FINISH_SUCCESS, value)) {
|
if (Arrays.equals(HuamiService.RESPONSE_FINISH_SUCCESS, value)) {
|
||||||
handleActivityFetchFinish(true);
|
handleActivityFetchFinish(true);
|
||||||
} else {
|
} else {
|
||||||
LOG.warn("Unexpected activity metadata: " + Logging.formatBytes(value));
|
LOG.warn("Unexpected activity metadata: " + Logging.formatBytes(value));
|
||||||
|
@ -33,7 +33,7 @@ import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
|||||||
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.devices.SampleProvider;
|
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandSampleProvider;
|
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandSampleProvider;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
|
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.Device;
|
import nodomain.freeyourgadget.gadgetbridge.entities.Device;
|
||||||
@ -69,10 +69,10 @@ public class FetchActivityOperation extends AbstractFetchOperation {
|
|||||||
@Override
|
@Override
|
||||||
protected void startFetching(TransactionBuilder builder) {
|
protected void startFetching(TransactionBuilder builder) {
|
||||||
GregorianCalendar sinceWhen = getLastSuccessfulSyncTime();
|
GregorianCalendar sinceWhen = getLastSuccessfulSyncTime();
|
||||||
builder.write(characteristicFetch, BLETypeConversions.join(new byte[] { MiBand2Service.COMMAND_ACTIVITY_DATA_START_DATE, MiBand2Service.COMMAND_ACTIVITY_DATA_TYPE_ACTIVTY }, getSupport().getTimeBytes(sinceWhen, TimeUnit.MINUTES)));
|
builder.write(characteristicFetch, BLETypeConversions.join(new byte[] { HuamiService.COMMAND_ACTIVITY_DATA_START_DATE, HuamiService.COMMAND_ACTIVITY_DATA_TYPE_ACTIVTY }, getSupport().getTimeBytes(sinceWhen, TimeUnit.MINUTES)));
|
||||||
builder.add(new WaitAction(1000)); // TODO: actually wait for the success-reply
|
builder.add(new WaitAction(1000)); // TODO: actually wait for the success-reply
|
||||||
builder.notify(characteristicActivityData, true);
|
builder.notify(characteristicActivityData, true);
|
||||||
builder.write(characteristicFetch, new byte[] { MiBand2Service.COMMAND_FETCH_DATA});
|
builder.write(characteristicFetch, new byte[] { HuamiService.COMMAND_FETCH_DATA});
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void handleActivityFetchFinish(boolean success) {
|
protected void handleActivityFetchFinish(boolean success) {
|
||||||
|
@ -33,7 +33,7 @@ import nodomain.freeyourgadget.gadgetbridge.Logging;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
|
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipService;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.BaseActivitySummary;
|
import nodomain.freeyourgadget.gadgetbridge.entities.BaseActivitySummary;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.export.ActivityTrackExporter;
|
import nodomain.freeyourgadget.gadgetbridge.export.ActivityTrackExporter;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.export.GPXExporter;
|
import nodomain.freeyourgadget.gadgetbridge.export.GPXExporter;
|
||||||
@ -73,12 +73,12 @@ public class FetchSportsDetailsOperation extends AbstractFetchOperation {
|
|||||||
GregorianCalendar sinceWhen = getLastSuccessfulSyncTime();
|
GregorianCalendar sinceWhen = getLastSuccessfulSyncTime();
|
||||||
|
|
||||||
builder.write(characteristicFetch, BLETypeConversions.join(new byte[] {
|
builder.write(characteristicFetch, BLETypeConversions.join(new byte[] {
|
||||||
MiBand2Service.COMMAND_ACTIVITY_DATA_START_DATE,
|
HuamiService.COMMAND_ACTIVITY_DATA_START_DATE,
|
||||||
AmazfitBipService.COMMAND_ACTIVITY_DATA_TYPE_SPORTS_DETAILS},
|
AmazfitBipService.COMMAND_ACTIVITY_DATA_TYPE_SPORTS_DETAILS},
|
||||||
getSupport().getTimeBytes(sinceWhen, TimeUnit.MINUTES)));
|
getSupport().getTimeBytes(sinceWhen, TimeUnit.MINUTES)));
|
||||||
builder.add(new WaitAction(1000)); // TODO: actually wait for the success-reply
|
builder.add(new WaitAction(1000)); // TODO: actually wait for the success-reply
|
||||||
builder.notify(characteristicActivityData, true);
|
builder.notify(characteristicActivityData, true);
|
||||||
builder.write(characteristicFetch, new byte[] { MiBand2Service.COMMAND_FETCH_DATA });
|
builder.write(characteristicFetch, new byte[] { HuamiService.COMMAND_FETCH_DATA });
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -35,8 +35,8 @@ import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.Logging;
|
import nodomain.freeyourgadget.gadgetbridge.Logging;
|
||||||
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.devices.huami.HuamiService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipService;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.BaseActivitySummary;
|
import nodomain.freeyourgadget.gadgetbridge.entities.BaseActivitySummary;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
|
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.Device;
|
import nodomain.freeyourgadget.gadgetbridge.entities.Device;
|
||||||
@ -68,12 +68,12 @@ public class FetchSportsSummaryOperation extends AbstractFetchOperation {
|
|||||||
LOG.info("start" + getName());
|
LOG.info("start" + getName());
|
||||||
GregorianCalendar sinceWhen = getLastSuccessfulSyncTime();
|
GregorianCalendar sinceWhen = getLastSuccessfulSyncTime();
|
||||||
builder.write(characteristicFetch, BLETypeConversions.join(new byte[] {
|
builder.write(characteristicFetch, BLETypeConversions.join(new byte[] {
|
||||||
MiBand2Service.COMMAND_ACTIVITY_DATA_START_DATE,
|
HuamiService.COMMAND_ACTIVITY_DATA_START_DATE,
|
||||||
AmazfitBipService.COMMAND_ACTIVITY_DATA_TYPE_SPORTS_SUMMARIES},
|
AmazfitBipService.COMMAND_ACTIVITY_DATA_TYPE_SPORTS_SUMMARIES},
|
||||||
getSupport().getTimeBytes(sinceWhen, TimeUnit.MINUTES)));
|
getSupport().getTimeBytes(sinceWhen, TimeUnit.MINUTES)));
|
||||||
builder.add(new WaitAction(1000)); // TODO: actually wait for the success-reply
|
builder.add(new WaitAction(1000)); // TODO: actually wait for the success-reply
|
||||||
builder.notify(characteristicActivityData, true);
|
builder.notify(characteristicActivityData, true);
|
||||||
builder.write(characteristicFetch, new byte[] { MiBand2Service.COMMAND_FETCH_DATA });
|
builder.write(characteristicFetch, new byte[] { HuamiService.COMMAND_FETCH_DATA });
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -36,7 +36,7 @@ import javax.crypto.IllegalBlockSizeException;
|
|||||||
import javax.crypto.NoSuchPaddingException;
|
import javax.crypto.NoSuchPaddingException;
|
||||||
import javax.crypto.spec.SecretKeySpec;
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLEOperation;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLEOperation;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
||||||
@ -65,17 +65,17 @@ public class InitOperation extends AbstractBTLEOperation<HuamiSupport> {
|
|||||||
if (needsAuth) {
|
if (needsAuth) {
|
||||||
builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.AUTHENTICATING, getContext()));
|
builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.AUTHENTICATING, getContext()));
|
||||||
// write key to miband2
|
// write key to miband2
|
||||||
byte[] sendKey = org.apache.commons.lang3.ArrayUtils.addAll(new byte[]{MiBand2Service.AUTH_SEND_KEY, authFlags}, getSecretKey());
|
byte[] sendKey = org.apache.commons.lang3.ArrayUtils.addAll(new byte[]{HuamiService.AUTH_SEND_KEY, authFlags}, getSecretKey());
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_AUTH), sendKey);
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_AUTH), sendKey);
|
||||||
} else {
|
} else {
|
||||||
builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZING, getContext()));
|
builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZING, getContext()));
|
||||||
// get random auth number
|
// get random auth number
|
||||||
builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_AUTH), requestAuthNumber());
|
builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_AUTH), requestAuthNumber());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] requestAuthNumber() {
|
private byte[] requestAuthNumber() {
|
||||||
return new byte[]{MiBand2Service.AUTH_REQUEST_RANDOM_AUTH_NUMBER, authFlags};
|
return new byte[]{HuamiService.AUTH_REQUEST_RANDOM_AUTH_NUMBER, authFlags};
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] getSecretKey() {
|
private byte[] getSecretKey() {
|
||||||
@ -91,31 +91,31 @@ public class InitOperation extends AbstractBTLEOperation<HuamiSupport> {
|
|||||||
public boolean onCharacteristicChanged(BluetoothGatt gatt,
|
public boolean onCharacteristicChanged(BluetoothGatt gatt,
|
||||||
BluetoothGattCharacteristic characteristic) {
|
BluetoothGattCharacteristic characteristic) {
|
||||||
UUID characteristicUUID = characteristic.getUuid();
|
UUID characteristicUUID = characteristic.getUuid();
|
||||||
if (MiBand2Service.UUID_CHARACTERISTIC_AUTH.equals(characteristicUUID)) {
|
if (HuamiService.UUID_CHARACTERISTIC_AUTH.equals(characteristicUUID)) {
|
||||||
try {
|
try {
|
||||||
byte[] value = characteristic.getValue();
|
byte[] value = characteristic.getValue();
|
||||||
getSupport().logMessageContent(value);
|
getSupport().logMessageContent(value);
|
||||||
if (value[0] == MiBand2Service.AUTH_RESPONSE &&
|
if (value[0] == HuamiService.AUTH_RESPONSE &&
|
||||||
value[1] == MiBand2Service.AUTH_SEND_KEY &&
|
value[1] == HuamiService.AUTH_SEND_KEY &&
|
||||||
value[2] == MiBand2Service.AUTH_SUCCESS) {
|
value[2] == HuamiService.AUTH_SUCCESS) {
|
||||||
TransactionBuilder builder = createTransactionBuilder("Sending the secret key to the band");
|
TransactionBuilder builder = createTransactionBuilder("Sending the secret key to the band");
|
||||||
builder.write(characteristic, requestAuthNumber());
|
builder.write(characteristic, requestAuthNumber());
|
||||||
getSupport().performImmediately(builder);
|
getSupport().performImmediately(builder);
|
||||||
} else if (value[0] == MiBand2Service.AUTH_RESPONSE &&
|
} else if (value[0] == HuamiService.AUTH_RESPONSE &&
|
||||||
value[1] == MiBand2Service.AUTH_REQUEST_RANDOM_AUTH_NUMBER &&
|
value[1] == HuamiService.AUTH_REQUEST_RANDOM_AUTH_NUMBER &&
|
||||||
value[2] == MiBand2Service.AUTH_SUCCESS) {
|
value[2] == HuamiService.AUTH_SUCCESS) {
|
||||||
// md5??
|
// md5??
|
||||||
byte[] eValue = handleAESAuth(value, getSecretKey());
|
byte[] eValue = handleAESAuth(value, getSecretKey());
|
||||||
byte[] responseValue = org.apache.commons.lang3.ArrayUtils.addAll(
|
byte[] responseValue = org.apache.commons.lang3.ArrayUtils.addAll(
|
||||||
new byte[]{MiBand2Service.AUTH_SEND_ENCRYPTED_AUTH_NUMBER, authFlags}, eValue);
|
new byte[]{HuamiService.AUTH_SEND_ENCRYPTED_AUTH_NUMBER, authFlags}, eValue);
|
||||||
|
|
||||||
TransactionBuilder builder = createTransactionBuilder("Sending the encrypted random key to the band");
|
TransactionBuilder builder = createTransactionBuilder("Sending the encrypted random key to the band");
|
||||||
builder.write(characteristic, responseValue);
|
builder.write(characteristic, responseValue);
|
||||||
getSupport().setCurrentTimeWithService(builder);
|
getSupport().setCurrentTimeWithService(builder);
|
||||||
getSupport().performImmediately(builder);
|
getSupport().performImmediately(builder);
|
||||||
} else if (value[0] == MiBand2Service.AUTH_RESPONSE &&
|
} else if (value[0] == HuamiService.AUTH_RESPONSE &&
|
||||||
value[1] == MiBand2Service.AUTH_SEND_ENCRYPTED_AUTH_NUMBER &&
|
value[1] == HuamiService.AUTH_SEND_ENCRYPTED_AUTH_NUMBER &&
|
||||||
value[2] == MiBand2Service.AUTH_SUCCESS) {
|
value[2] == HuamiService.AUTH_SUCCESS) {
|
||||||
TransactionBuilder builder = createTransactionBuilder("Authenticated, now initialize phase 2");
|
TransactionBuilder builder = createTransactionBuilder("Authenticated, now initialize phase 2");
|
||||||
builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZING, getContext()));
|
builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZING, getContext()));
|
||||||
getSupport().requestDeviceInfo(builder);
|
getSupport().requestDeviceInfo(builder);
|
||||||
|
@ -33,7 +33,7 @@ import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventDisplayMessage;
|
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventDisplayMessage;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceBusyAction;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceBusyAction;
|
||||||
@ -57,8 +57,8 @@ public class UpdateFirmwareOperation extends AbstractHuamiOperation {
|
|||||||
public UpdateFirmwareOperation(Uri uri, HuamiSupport support) {
|
public UpdateFirmwareOperation(Uri uri, HuamiSupport support) {
|
||||||
super(support);
|
super(support);
|
||||||
this.uri = uri;
|
this.uri = uri;
|
||||||
fwCControlChar = getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_FIRMWARE);
|
fwCControlChar = getCharacteristic(HuamiService.UUID_CHARACTERISTIC_FIRMWARE);
|
||||||
fwCDataChar = getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_FIRMWARE_DATA);
|
fwCDataChar = getCharacteristic(HuamiService.UUID_CHARACTERISTIC_FIRMWARE_DATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -132,20 +132,20 @@ public class UpdateFirmwareOperation extends AbstractHuamiOperation {
|
|||||||
getSupport().logMessageContent(value);
|
getSupport().logMessageContent(value);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
boolean success = value[2] == MiBand2Service.SUCCESS;
|
boolean success = value[2] == HuamiService.SUCCESS;
|
||||||
|
|
||||||
if (value[0] == MiBand2Service.RESPONSE && success) {
|
if (value[0] == HuamiService.RESPONSE && success) {
|
||||||
try {
|
try {
|
||||||
switch (value[1]) {
|
switch (value[1]) {
|
||||||
case MiBand2Service.COMMAND_FIRMWARE_INIT: {
|
case HuamiService.COMMAND_FIRMWARE_INIT: {
|
||||||
sendFirmwareData(getFirmwareInfo());
|
sendFirmwareData(getFirmwareInfo());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MiBand2Service.COMMAND_FIRMWARE_START_DATA: {
|
case HuamiService.COMMAND_FIRMWARE_START_DATA: {
|
||||||
sendChecksum(getFirmwareInfo());
|
sendChecksum(getFirmwareInfo());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MiBand2Service.COMMAND_FIRMWARE_CHECKSUM: {
|
case HuamiService.COMMAND_FIRMWARE_CHECKSUM: {
|
||||||
if (getFirmwareInfo().getFirmwareType() == HuamiFirmwareType.FIRMWARE) {
|
if (getFirmwareInfo().getFirmwareType() == HuamiFirmwareType.FIRMWARE) {
|
||||||
TransactionBuilder builder = performInitialized("reboot");
|
TransactionBuilder builder = performInitialized("reboot");
|
||||||
getSupport().sendReboot(builder);
|
getSupport().sendReboot(builder);
|
||||||
@ -156,7 +156,7 @@ public class UpdateFirmwareOperation extends AbstractHuamiOperation {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MiBand2Service.COMMAND_FIRMWARE_REBOOT: {
|
case HuamiService.COMMAND_FIRMWARE_REBOOT: {
|
||||||
LOG.info("Reboot command successfully sent.");
|
LOG.info("Reboot command successfully sent.");
|
||||||
GB.updateInstallNotification(getContext().getString(R.string.updatefirmwareoperation_update_complete), false, 100, getContext());
|
GB.updateInstallNotification(getContext().getString(R.string.updatefirmwareoperation_update_complete), false, 100, getContext());
|
||||||
// getSupport().onReboot();
|
// getSupport().onReboot();
|
||||||
@ -202,7 +202,7 @@ public class UpdateFirmwareOperation extends AbstractHuamiOperation {
|
|||||||
}
|
}
|
||||||
byte[] bytes = new byte[arraySize];
|
byte[] bytes = new byte[arraySize];
|
||||||
int i = 0;
|
int i = 0;
|
||||||
bytes[i++] = MiBand2Service.COMMAND_FIRMWARE_INIT;
|
bytes[i++] = HuamiService.COMMAND_FIRMWARE_INIT;
|
||||||
bytes[i++] = sizeBytes[0];
|
bytes[i++] = sizeBytes[0];
|
||||||
bytes[i++] = sizeBytes[1];
|
bytes[i++] = sizeBytes[1];
|
||||||
bytes[i++] = sizeBytes[2];
|
bytes[i++] = sizeBytes[2];
|
||||||
@ -243,7 +243,7 @@ public class UpdateFirmwareOperation extends AbstractHuamiOperation {
|
|||||||
if (prefs.getBoolean("mi_low_latency_fw_update", true)) {
|
if (prefs.getBoolean("mi_low_latency_fw_update", true)) {
|
||||||
getSupport().setLowLatency(builder);
|
getSupport().setLowLatency(builder);
|
||||||
}
|
}
|
||||||
builder.write(fwCControlChar, new byte[] { MiBand2Service.COMMAND_FIRMWARE_START_DATA });
|
builder.write(fwCControlChar, new byte[] { HuamiService.COMMAND_FIRMWARE_START_DATA });
|
||||||
|
|
||||||
for (int i = 0; i < packets; i++) {
|
for (int i = 0; i < packets; i++) {
|
||||||
byte[] fwChunk = Arrays.copyOfRange(fwbytes, i * packetLength, i * packetLength + packetLength);
|
byte[] fwChunk = Arrays.copyOfRange(fwbytes, i * packetLength, i * packetLength + packetLength);
|
||||||
@ -253,7 +253,7 @@ public class UpdateFirmwareOperation extends AbstractHuamiOperation {
|
|||||||
|
|
||||||
int progressPercent = (int) ((((float) firmwareProgress) / len) * 100);
|
int progressPercent = (int) ((((float) firmwareProgress) / len) * 100);
|
||||||
if ((i > 0) && (i % 100 == 0)) {
|
if ((i > 0) && (i % 100 == 0)) {
|
||||||
builder.write(fwCControlChar, new byte[]{MiBand2Service.COMMAND_FIRMWARE_UPDATE_SYNC});
|
builder.write(fwCControlChar, new byte[]{HuamiService.COMMAND_FIRMWARE_UPDATE_SYNC});
|
||||||
builder.add(new SetProgressAction(getContext().getString(R.string.updatefirmwareoperation_update_in_progress), true, progressPercent, getContext()));
|
builder.add(new SetProgressAction(getContext().getString(R.string.updatefirmwareoperation_update_in_progress), true, progressPercent, getContext()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -264,7 +264,7 @@ public class UpdateFirmwareOperation extends AbstractHuamiOperation {
|
|||||||
firmwareProgress = len;
|
firmwareProgress = len;
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.write(fwCControlChar, new byte[]{MiBand2Service.COMMAND_FIRMWARE_UPDATE_SYNC});
|
builder.write(fwCControlChar, new byte[]{HuamiService.COMMAND_FIRMWARE_UPDATE_SYNC});
|
||||||
builder.queue(getQueue());
|
builder.queue(getQueue());
|
||||||
|
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
@ -281,7 +281,7 @@ public class UpdateFirmwareOperation extends AbstractHuamiOperation {
|
|||||||
int crc16 = firmwareInfo.getCrc16();
|
int crc16 = firmwareInfo.getCrc16();
|
||||||
byte[] bytes = BLETypeConversions.fromUint16(crc16);
|
byte[] bytes = BLETypeConversions.fromUint16(crc16);
|
||||||
builder.write(fwCControlChar, new byte[] {
|
builder.write(fwCControlChar, new byte[] {
|
||||||
MiBand2Service.COMMAND_FIRMWARE_CHECKSUM,
|
HuamiService.COMMAND_FIRMWARE_CHECKSUM,
|
||||||
bytes[0],
|
bytes[0],
|
||||||
bytes[1],
|
bytes[1],
|
||||||
});
|
});
|
||||||
|
@ -192,6 +192,30 @@
|
|||||||
<item>@string/p_battery</item>
|
<item>@string/p_battery</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="pref_miband3_display_items">
|
||||||
|
<item>@string/menuitem_notifications</item>
|
||||||
|
<item>@string/menuitem_weather</item>
|
||||||
|
<item>@string/menuitem_more</item>
|
||||||
|
<item>@string/menuitem_status</item>
|
||||||
|
<item>@string/heart_rate</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="pref_miband3_display_items_values">
|
||||||
|
<item>@string/p_menuitem_notifications</item>
|
||||||
|
<item>@string/p_menuitem_weather</item>
|
||||||
|
<item>@string/p_menuitem_more</item>
|
||||||
|
<item>@string/p_menuitem_status</item>
|
||||||
|
<item>@string/p_heart_rate</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="pref_miband3_display_items_default">
|
||||||
|
<item>@string/p_menuitem_notifications</item>
|
||||||
|
<item>@string/p_menuitem_weather</item>
|
||||||
|
<item>@string/p_menuitem_more</item>
|
||||||
|
<item>@string/p_menuitem_status</item>
|
||||||
|
<item>@string/p_heart_rate</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
<string-array name="pref_bip_display_items">
|
<string-array name="pref_bip_display_items">
|
||||||
<item>@string/menuitem_shortcut_alipay</item>
|
<item>@string/menuitem_shortcut_alipay</item>
|
||||||
<item>@string/menuitem_shortcut_weather</item>
|
<item>@string/menuitem_shortcut_weather</item>
|
||||||
|
@ -250,6 +250,8 @@
|
|||||||
<string name="message_cannot_pair_no_mac">No MAC address passed, cannot pair.</string>
|
<string name="message_cannot_pair_no_mac">No MAC address passed, cannot pair.</string>
|
||||||
<string name="preferences_category_device_specific_settings">Device specific settings</string>
|
<string name="preferences_category_device_specific_settings">Device specific settings</string>
|
||||||
<string name="preferences_miband_settings">Mi Band / Amazfit settings</string>
|
<string name="preferences_miband_settings">Mi Band / Amazfit settings</string>
|
||||||
|
<string name="preferences_miband2_settings">Mi Band 2 settings</string>
|
||||||
|
<string name="preferences_miband3_settings">Mi Band 3 settings</string>
|
||||||
<string name="preferences_amazfitbip_settings">Amazfit Bip settings</string>
|
<string name="preferences_amazfitbip_settings">Amazfit Bip settings</string>
|
||||||
<string name="preferences_amazfitcor_settings">Amazfit Cor settings</string>s
|
<string name="preferences_amazfitcor_settings">Amazfit Cor settings</string>s
|
||||||
<string name="male">Male</string>
|
<string name="male">Male</string>
|
||||||
@ -390,7 +392,7 @@
|
|||||||
<string name="miband_prefs_reserve_alarm_calendar">Alarms to reserve for upcoming events</string>
|
<string name="miband_prefs_reserve_alarm_calendar">Alarms to reserve for upcoming events</string>
|
||||||
<string name="miband_prefs_hr_sleep_detection">Use heart rate sensor to improve sleep detection</string>
|
<string name="miband_prefs_hr_sleep_detection">Use heart rate sensor to improve sleep detection</string>
|
||||||
<string name="miband_prefs_device_time_offset_hours">Device time offset in hours (for detecting sleep of shift workers)</string>
|
<string name="miband_prefs_device_time_offset_hours">Device time offset in hours (for detecting sleep of shift workers)</string>
|
||||||
<string name="miband2_prefs_dateformat">Mi2: Date format</string>
|
<string name="miband2_prefs_dateformat">Date format</string>
|
||||||
<string name="dateformat_time">Time</string>
|
<string name="dateformat_time">Time</string>
|
||||||
<string name="dateformat_date_time"><![CDATA[Time & date]]></string>
|
<string name="dateformat_date_time"><![CDATA[Time & date]]></string>
|
||||||
<string name="mi2_prefs_button_actions">Button actions</string>
|
<string name="mi2_prefs_button_actions">Button actions</string>
|
||||||
@ -591,4 +593,5 @@
|
|||||||
<string name="menuitem_compass">Compass</string>
|
<string name="menuitem_compass">Compass</string>
|
||||||
<string name="menuitem_settings">Settings</string>
|
<string name="menuitem_settings">Settings</string>
|
||||||
<string name="menuitem_alipay">Alipay</string>
|
<string name="menuitem_alipay">Alipay</string>
|
||||||
|
<string name="menuitem_more">More</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
<item name="p_menuitem_settings" type="string">settings</item>
|
<item name="p_menuitem_settings" type="string">settings</item>
|
||||||
<item name="p_menuitem_alipay" type="string">alipay</item>
|
<item name="p_menuitem_alipay" type="string">alipay</item>
|
||||||
<item name="p_menuitem_notifications" type="string">notifications</item>
|
<item name="p_menuitem_notifications" type="string">notifications</item>
|
||||||
|
<item name="p_menuitem_more" type="string">more</item>
|
||||||
|
|
||||||
<item name="p_off" type="string">off</item>
|
<item name="p_off" type="string">off</item>
|
||||||
<item name="p_on" type="string">on</item>
|
<item name="p_on" type="string">on</item>
|
||||||
|
@ -113,15 +113,6 @@
|
|||||||
android:maxLength="2"
|
android:maxLength="2"
|
||||||
android:title="@string/miband_prefs_device_time_offset_hours" />
|
android:title="@string/miband_prefs_device_time_offset_hours" />
|
||||||
|
|
||||||
<MultiSelectListPreference
|
|
||||||
android:dialogTitle="@string/mi2_prefs_display_items"
|
|
||||||
android:defaultValue="@array/pref_mi2_display_items_default"
|
|
||||||
android:entries="@array/pref_mi2_display_items"
|
|
||||||
android:entryValues="@array/pref_mi2_display_items_values"
|
|
||||||
android:key="mi2_display_items"
|
|
||||||
android:summary="@string/mi2_prefs_display_items_summary"
|
|
||||||
android:title="@string/mi2_prefs_display_items"/>
|
|
||||||
|
|
||||||
<PreferenceScreen
|
<PreferenceScreen
|
||||||
android:persistent="false"
|
android:persistent="false"
|
||||||
android:title="@string/mi2_prefs_activate_display_on_lift">
|
android:title="@string/mi2_prefs_activate_display_on_lift">
|
||||||
@ -153,21 +144,6 @@
|
|||||||
android:key="mi2_rotate_wrist_to_switch_info"
|
android:key="mi2_rotate_wrist_to_switch_info"
|
||||||
android:title="@string/mi2_prefs_rotate_wrist_to_switch_info" />
|
android:title="@string/mi2_prefs_rotate_wrist_to_switch_info" />
|
||||||
|
|
||||||
<CheckBoxPreference
|
|
||||||
android:defaultValue="true"
|
|
||||||
android:key="mi2_enable_text_notifications"
|
|
||||||
android:summaryOn="@string/mi2_enable_text_notifications_summary"
|
|
||||||
android:summaryOff="@string/off"
|
|
||||||
android:title="@string/mi2_enable_text_notifications" />
|
|
||||||
|
|
||||||
<ListPreference
|
|
||||||
android:defaultValue="@string/p_dateformat_time"
|
|
||||||
android:entries="@array/mi2_dateformats"
|
|
||||||
android:entryValues="@array/mi2_dateformats_values"
|
|
||||||
android:key="mi2_dateformat"
|
|
||||||
android:title="@string/miband2_prefs_dateformat"
|
|
||||||
android:summary="%s" />
|
|
||||||
|
|
||||||
<PreferenceScreen
|
<PreferenceScreen
|
||||||
android:key="mi2_inactivity_warning_key"
|
android:key="mi2_inactivity_warning_key"
|
||||||
android:summary="@string/mi2_prefs_inactivity_warnings_summary"
|
android:summary="@string/mi2_prefs_inactivity_warnings_summary"
|
||||||
|
@ -183,6 +183,45 @@
|
|||||||
android:icon="@drawable/ic_device_miband"
|
android:icon="@drawable/ic_device_miband"
|
||||||
android:key="pref_key_miband"
|
android:key="pref_key_miband"
|
||||||
android:title="@string/preferences_miband_settings" />
|
android:title="@string/preferences_miband_settings" />
|
||||||
|
<PreferenceScreen
|
||||||
|
android:icon="@drawable/ic_device_miband"
|
||||||
|
android:title="@string/preferences_miband2_settings">
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="mi2_enable_text_notifications"
|
||||||
|
android:summaryOn="@string/mi2_enable_text_notifications_summary"
|
||||||
|
android:summaryOff="@string/off"
|
||||||
|
android:title="@string/mi2_enable_text_notifications" />
|
||||||
|
<ListPreference
|
||||||
|
android:defaultValue="@string/p_dateformat_time"
|
||||||
|
android:entries="@array/mi2_dateformats"
|
||||||
|
android:entryValues="@array/mi2_dateformats_values"
|
||||||
|
android:key="mi2_dateformat"
|
||||||
|
android:title="@string/miband2_prefs_dateformat"
|
||||||
|
android:summary="%s" />
|
||||||
|
<MultiSelectListPreference
|
||||||
|
android:dialogTitle="@string/mi2_prefs_display_items"
|
||||||
|
android:defaultValue="@array/pref_mi2_display_items_default"
|
||||||
|
android:entries="@array/pref_mi2_display_items"
|
||||||
|
android:entryValues="@array/pref_mi2_display_items_values"
|
||||||
|
android:key="mi2_display_items"
|
||||||
|
android:summary="@string/mi2_prefs_display_items_summary"
|
||||||
|
android:title="@string/mi2_prefs_display_items"/>
|
||||||
|
</PreferenceScreen>
|
||||||
|
<!--
|
||||||
|
<PreferenceScreen
|
||||||
|
android:icon="@drawable/ic_device_miband"
|
||||||
|
android:title="@string/preferences_miband3_settings">
|
||||||
|
<MultiSelectListPreference
|
||||||
|
android:dialogTitle="@string/mi2_prefs_display_items"
|
||||||
|
android:defaultValue="@array/pref_miband3_display_items_default"
|
||||||
|
android:entries="@array/pref_miband3_display_items"
|
||||||
|
android:entryValues="@array/pref_miband3_display_items_values"
|
||||||
|
android:key="miband3_display_items"
|
||||||
|
android:summary="@string/mi2_prefs_display_items_summary"
|
||||||
|
android:title="@string/mi2_prefs_display_items"/>
|
||||||
|
</PreferenceScreen>
|
||||||
|
-->
|
||||||
<PreferenceScreen
|
<PreferenceScreen
|
||||||
android:icon="@drawable/ic_device_hplus"
|
android:icon="@drawable/ic_device_hplus"
|
||||||
android:title="@string/preferences_amazfitbip_settings">
|
android:title="@string/preferences_amazfitbip_settings">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user