mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-12-26 02:25:50 +01:00
makibes hr3.
added quite hours.
This commit is contained in:
parent
5570ac8349
commit
4437220c54
@ -25,6 +25,9 @@ public final class MakibesHR3Constants {
|
|||||||
// TODO: breaking someone else's device support.
|
// TODO: breaking someone else's device support.
|
||||||
public static final String PREF_HEADS_UP_SCREEN = "activate_display_on_lift_wrist";
|
public static final String PREF_HEADS_UP_SCREEN = "activate_display_on_lift_wrist";
|
||||||
public static final String PREF_LOST_REMINDER = "disconnect_notification";
|
public static final String PREF_LOST_REMINDER = "disconnect_notification";
|
||||||
|
public static final String PREF_DO_NOT_DISTURB = "do_not_disturb_no_auto";
|
||||||
|
public static final String PREF_DO_NOT_DISTURB_START = "do_not_disturb_no_auto_start";
|
||||||
|
public static final String PREF_DO_NOT_DISTURB_END = "do_not_disturb_no_auto_end";
|
||||||
|
|
||||||
public static final UUID UUID_SERVICE = UUID.fromString("6e400001-b5a3-f393-e0a9-e50e24dcca9e");
|
public static final UUID UUID_SERVICE = UUID.fromString("6e400001-b5a3-f393-e0a9-e50e24dcca9e");
|
||||||
public static final UUID UUID_CHARACTERISTIC_CONTROL = UUID.fromString("6e400002-b5a3-f393-e0a9-e50e24dcca9e");
|
public static final UUID UUID_CHARACTERISTIC_CONTROL = UUID.fromString("6e400002-b5a3-f393-e0a9-e50e24dcca9e");
|
||||||
|
@ -16,6 +16,10 @@
|
|||||||
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.makibeshr3;
|
package nodomain.freeyourgadget.gadgetbridge.devices.makibeshr3;
|
||||||
|
|
||||||
|
import java.text.DateFormat;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.GregorianCalendar;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@ -35,6 +39,7 @@ import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSett
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractDeviceCoordinator;
|
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractDeviceCoordinator;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
|
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
|
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiCoordinator;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
|
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.Device;
|
import nodomain.freeyourgadget.gadgetbridge.entities.Device;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.MakibesHR3ActivitySampleDao;
|
import nodomain.freeyourgadget.gadgetbridge.entities.MakibesHR3ActivitySampleDao;
|
||||||
@ -75,6 +80,34 @@ public class MakibesHR3Coordinator extends AbstractDeviceCoordinator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param startOut out Only hour/minute are used.
|
||||||
|
* @param endOut out Only hour/minute are used.
|
||||||
|
* @return True if quite hours are enabled.
|
||||||
|
*/
|
||||||
|
public static boolean getQuiteHours(SharedPreferences sharedPrefs, Calendar startOut, Calendar endOut) {
|
||||||
|
String doNotDisturb = sharedPrefs.getString(MakibesHR3Constants.PREF_DO_NOT_DISTURB, getContext().getString(R.string.p_off));
|
||||||
|
|
||||||
|
if (doNotDisturb.equals(getContext().getString(R.string.p_off))) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
String start = sharedPrefs.getString(MakibesHR3Constants.PREF_DO_NOT_DISTURB_START, "00:00");
|
||||||
|
String end = sharedPrefs.getString(MakibesHR3Constants.PREF_DO_NOT_DISTURB_END, "00:00");
|
||||||
|
|
||||||
|
DateFormat df = new SimpleDateFormat("HH:mm");
|
||||||
|
|
||||||
|
try {
|
||||||
|
startOut.setTime(df.parse(start));
|
||||||
|
endOut.setTime(df.parse(end));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOG.error("Unexpected exception in MiBand2Coordinator.getTime: " + e.getMessage());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public DeviceType getSupportedType(GBDeviceCandidate candidate) {
|
public DeviceType getSupportedType(GBDeviceCandidate candidate) {
|
||||||
@ -191,7 +224,8 @@ public class MakibesHR3Coordinator extends AbstractDeviceCoordinator {
|
|||||||
return new int[]{
|
return new int[]{
|
||||||
R.xml.devicesettings_timeformat,
|
R.xml.devicesettings_timeformat,
|
||||||
R.xml.devicesettings_liftwrist_display,
|
R.xml.devicesettings_liftwrist_display,
|
||||||
R.xml.devicesettings_disconnectnotification
|
R.xml.devicesettings_disconnectnotification,
|
||||||
|
R.xml.devicesettings_donotdisturb_no_auto
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,17 @@
|
|||||||
// TODO: GB sometimes fails to connect until a connection with WearFit was made. This must be caused
|
// TODO: GB sometimes fails to connect until a connection with WearFit was made. This must be caused
|
||||||
// TODO: by GB, not by Makibes hr3 support. Charging the watch, attempting to pair, delete and
|
// TODO: by GB, not by Makibes hr3 support. Charging the watch, attempting to pair, delete and
|
||||||
// TODO: re-add might also help. This needs further research.
|
// TODO: re-add, scan for devices and go back, might also help. This needs further research.
|
||||||
|
|
||||||
// TODO: All the commands that aren't supported by GB should be added to device specific settings.
|
// TODO: All the commands that aren't supported by GB should be added to device specific settings.
|
||||||
|
|
||||||
// TODO: It'd be cool if we could change the language. There's no official way to do so, but the
|
// TODO: It'd be cool if we could change the language. There's no official way to do so, but the
|
||||||
// TODO: watch is sold as chinese/english. Screen-on-time would be nice too.
|
// TODO: watch is sold as chinese/english. Screen-on-time would be nice too.
|
||||||
|
|
||||||
// TODO: Firmware upgrades.
|
// TODO: Firmware upgrades. WearFit tries to connect to Wake up Technology at
|
||||||
|
// TODO: http://47.112.119.52/app.php/Api/hardUpdate/type/55
|
||||||
|
// TODO: But that server resets the connection.
|
||||||
|
// TODO: The host is supposed to be www.iwhop.com, but that domain no longer exists.
|
||||||
|
// TODO: I think /app.php is missing a closing php tag.
|
||||||
|
|
||||||
package nodomain.freeyourgadget.gadgetbridge.service.devices.makibeshr3;
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.makibeshr3;
|
||||||
|
|
||||||
@ -29,10 +33,10 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.GregorianCalendar;
|
import java.util.GregorianCalendar;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -65,13 +69,10 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
|
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
|
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLEDeviceSupport;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLEDeviceSupport;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.Transaction;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.serial.GBDeviceProtocol;
|
import nodomain.freeyourgadget.gadgetbridge.service.serial.GBDeviceProtocol;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
|
|
||||||
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_TIMEFORMAT;
|
|
||||||
|
|
||||||
public class MakibesHR3DeviceSupport extends AbstractBTLEDeviceSupport implements SharedPreferences.OnSharedPreferenceChangeListener {
|
public class MakibesHR3DeviceSupport extends AbstractBTLEDeviceSupport implements SharedPreferences.OnSharedPreferenceChangeListener {
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(MakibesHR3DeviceSupport.class);
|
private static final Logger LOG = LoggerFactory.getLogger(MakibesHR3DeviceSupport.class);
|
||||||
@ -79,7 +80,9 @@ public class MakibesHR3DeviceSupport extends AbstractBTLEDeviceSupport implement
|
|||||||
private Handler mVibrationHandler = new Handler();
|
private Handler mVibrationHandler = new Handler();
|
||||||
private Vibrator mVibrator;
|
private Vibrator mVibrator;
|
||||||
|
|
||||||
private CountDownTimer mFetchCountDown = new CountDownTimer(1000, 1000) {
|
// The delay must be at least as long as it takes the watch to respond.
|
||||||
|
// Reordering the requests could maybe reduce the delay, but this works fine too.
|
||||||
|
private CountDownTimer mFetchCountDown = new CountDownTimer(2000, 2000) {
|
||||||
@Override
|
@Override
|
||||||
public void onTick(long millisUntilFinished) {
|
public void onTick(long millisUntilFinished) {
|
||||||
|
|
||||||
@ -515,6 +518,7 @@ public class MakibesHR3DeviceSupport extends AbstractBTLEDeviceSupport implement
|
|||||||
|
|
||||||
this.setTimeMode(transaction, sharedPreferences);
|
this.setTimeMode(transaction, sharedPreferences);
|
||||||
this.setDateTime(transaction);
|
this.setDateTime(transaction);
|
||||||
|
this.setQuiteHours(transaction, sharedPreferences);
|
||||||
|
|
||||||
this.setHeadsUpScreen(transaction, sharedPreferences);
|
this.setHeadsUpScreen(transaction, sharedPreferences);
|
||||||
this.setLostReminder(transaction, sharedPreferences);
|
this.setLostReminder(transaction, sharedPreferences);
|
||||||
@ -547,6 +551,10 @@ public class MakibesHR3DeviceSupport extends AbstractBTLEDeviceSupport implement
|
|||||||
this.setHeadsUpScreen(transactionBuilder, sharedPreferences);
|
this.setHeadsUpScreen(transactionBuilder, sharedPreferences);
|
||||||
} else if (key.equals(MakibesHR3Constants.PREF_LOST_REMINDER)) {
|
} else if (key.equals(MakibesHR3Constants.PREF_LOST_REMINDER)) {
|
||||||
this.setLostReminder(transactionBuilder, sharedPreferences);
|
this.setLostReminder(transactionBuilder, sharedPreferences);
|
||||||
|
} else if (key.equals(MakibesHR3Constants.PREF_DO_NOT_DISTURB) ||
|
||||||
|
key.equals(MakibesHR3Constants.PREF_DO_NOT_DISTURB_START) ||
|
||||||
|
key.equals(MakibesHR3Constants.PREF_DO_NOT_DISTURB_END)) {
|
||||||
|
this.setQuiteHours(transactionBuilder, sharedPreferences);
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -901,8 +909,6 @@ public class MakibesHR3DeviceSupport extends AbstractBTLEDeviceSupport implement
|
|||||||
int yearHeartRateAfter, int monthHeartRateAfter, int dayHeartRateAfter,
|
int yearHeartRateAfter, int monthHeartRateAfter, int dayHeartRateAfter,
|
||||||
int hourHeartRateAfter, int minuteHeartRateAfter) {
|
int hourHeartRateAfter, int minuteHeartRateAfter) {
|
||||||
|
|
||||||
this.fetch(true);
|
|
||||||
|
|
||||||
byte[] data = this.craftData(MakibesHR3Constants.CMD_REQUEST_FITNESS,
|
byte[] data = this.craftData(MakibesHR3Constants.CMD_REQUEST_FITNESS,
|
||||||
new byte[]{
|
new byte[]{
|
||||||
(byte) 0x00,
|
(byte) 0x00,
|
||||||
@ -920,6 +926,8 @@ public class MakibesHR3DeviceSupport extends AbstractBTLEDeviceSupport implement
|
|||||||
|
|
||||||
transaction.write(this.mControlCharacteristic, data);
|
transaction.write(this.mControlCharacteristic, data);
|
||||||
|
|
||||||
|
this.fetch(true);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -937,10 +945,10 @@ public class MakibesHR3DeviceSupport extends AbstractBTLEDeviceSupport implement
|
|||||||
|
|
||||||
MakibesHR3ActivitySample latestSample = provider.getLatestActivitySample();
|
MakibesHR3ActivitySample latestSample = provider.getLatestActivitySample();
|
||||||
|
|
||||||
if (true || latestSample == null) {
|
if (latestSample == null) {
|
||||||
this.requestFitness(transaction,
|
this.requestFitness(transaction,
|
||||||
0, 0, 0, 0, 0,
|
2000, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0);
|
2000, 0, 0, 0, 0);
|
||||||
} else {
|
} else {
|
||||||
Calendar calendar = new GregorianCalendar();
|
Calendar calendar = new GregorianCalendar();
|
||||||
calendar.setTime(new Date(latestSample.getTimestamp() * 1000l));
|
calendar.setTime(new Date(latestSample.getTimestamp() * 1000l));
|
||||||
@ -1044,6 +1052,33 @@ public class MakibesHR3DeviceSupport extends AbstractBTLEDeviceSupport implement
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private MakibesHR3DeviceSupport setQuiteHours(TransactionBuilder transactionBuilder,
|
||||||
|
boolean enable,
|
||||||
|
int hourStart, int minuteStart,
|
||||||
|
int hourEnd, int minuteEnd) {
|
||||||
|
byte[] data = this.craftData(MakibesHR3Constants.CMD_SET_QUITE_HOURS, new byte[]{
|
||||||
|
(byte) (enable ? 0x01 : 0x00),
|
||||||
|
(byte) hourStart, (byte) minuteStart,
|
||||||
|
(byte) hourEnd, (byte) minuteEnd
|
||||||
|
});
|
||||||
|
|
||||||
|
transactionBuilder.write(this.mControlCharacteristic, data);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private MakibesHR3DeviceSupport setQuiteHours(TransactionBuilder transactionBuilder,
|
||||||
|
SharedPreferences sharedPreferences) {
|
||||||
|
|
||||||
|
Calendar start = new GregorianCalendar();
|
||||||
|
Calendar end = new GregorianCalendar();
|
||||||
|
boolean enable = MakibesHR3Coordinator.getQuiteHours(sharedPreferences, start, end);
|
||||||
|
|
||||||
|
return this.setQuiteHours(transactionBuilder, enable,
|
||||||
|
start.get(Calendar.HOUR_OF_DAY), start.get(Calendar.MINUTE),
|
||||||
|
end.get(Calendar.HOUR_OF_DAY), end.get(Calendar.MINUTE));
|
||||||
|
}
|
||||||
|
|
||||||
private MakibesHR3DeviceSupport setHeadsUpScreen(TransactionBuilder transactionBuilder, SharedPreferences sharedPreferences) {
|
private MakibesHR3DeviceSupport setHeadsUpScreen(TransactionBuilder transactionBuilder, SharedPreferences sharedPreferences) {
|
||||||
return this.setHeadsUpScreen(transactionBuilder,
|
return this.setHeadsUpScreen(transactionBuilder,
|
||||||
MakibesHR3Coordinator.shouldEnableHeadsUpScreen(sharedPreferences));
|
MakibesHR3Coordinator.shouldEnableHeadsUpScreen(sharedPreferences));
|
||||||
|
@ -162,6 +162,15 @@
|
|||||||
<item>MM/dd/yyyy</item>
|
<item>MM/dd/yyyy</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="do_not_disturb_no_auto">
|
||||||
|
<item>@string/mi2_dnd_off</item>
|
||||||
|
<item>@string/mi2_dnd_scheduled</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="do_not_disturb_no_auto_values">
|
||||||
|
<item>@string/p_off</item>
|
||||||
|
<item>@string/p_scheduled</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
<string-array name="mi2_do_not_disturb">
|
<string-array name="mi2_do_not_disturb">
|
||||||
<item>@string/mi2_dnd_off</item>
|
<item>@string/mi2_dnd_off</item>
|
||||||
<item>@string/mi2_dnd_automatic</item>
|
<item>@string/mi2_dnd_automatic</item>
|
||||||
|
34
app/src/main/res/xml/devicesettings_donotdisturb_no_auto.xml
Normal file
34
app/src/main/res/xml/devicesettings_donotdisturb_no_auto.xml
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<PreferenceScreen
|
||||||
|
android:icon="@drawable/ic_do_not_disturb"
|
||||||
|
android:key="screen_do_not_disturb_no_auto"
|
||||||
|
android:persistent="false"
|
||||||
|
android:summary="@string/mi2_prefs_do_not_disturb_summary"
|
||||||
|
android:title="@string/mi2_prefs_do_not_disturb">
|
||||||
|
|
||||||
|
<!-- workaround for missing toolbar -->
|
||||||
|
<PreferenceCategory android:title="@string/mi2_prefs_do_not_disturb" />
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
android:defaultValue="@string/p_off"
|
||||||
|
android:entries="@array/do_not_disturb_no_auto"
|
||||||
|
android:entryValues="@array/do_not_disturb_no_auto_values"
|
||||||
|
android:key="do_not_disturb_no_auto"
|
||||||
|
android:summary="%s"
|
||||||
|
android:title="@string/mi2_prefs_do_not_disturb" />
|
||||||
|
|
||||||
|
<nodomain.freeyourgadget.gadgetbridge.util.XTimePreference
|
||||||
|
android:defaultValue="01:00"
|
||||||
|
android:key="do_not_disturb_no_auto_start"
|
||||||
|
android:title="@string/mi2_prefs_do_not_disturb_start" />
|
||||||
|
|
||||||
|
<nodomain.freeyourgadget.gadgetbridge.util.XTimePreference
|
||||||
|
android:defaultValue="06:00"
|
||||||
|
android:key="do_not_disturb_no_auto_end"
|
||||||
|
android:title="@string/mi2_prefs_do_not_disturb_end" />
|
||||||
|
|
||||||
|
</PreferenceScreen>
|
||||||
|
|
||||||
|
|
||||||
|
</androidx.preference.PreferenceScreen>
|
Loading…
Reference in New Issue
Block a user