1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-11-29 05:16:51 +01:00
This commit is contained in:
mamutcho 2019-12-15 18:28:19 +02:00
commit 0d8428437c
24 changed files with 124 additions and 104 deletions

View File

@ -1,5 +1,11 @@
### Changelog ### Changelog
#### Version 0.40.0 (WIP)
* Fossil Q Hybrid: Initial support
* Bangle.js: Initial support
* Reserve Alarm for Calendar feature restricted to Mi Band 1/2 and moved to per-device settings
* New icon for App Manager
#### Version 0.39.1 #### Version 0.39.1
* Try to actively re-connect when a connection gets interrupted (interval grows up to 64 seconds) * Try to actively re-connect when a connection gets interrupted (interval grows up to 64 seconds)
* Mi Band2/Amazfip Bip: Make button action settings per-device and enable for Amazfit Bip * Mi Band2/Amazfip Bip: Make button action settings per-device and enable for Amazfit Bip

View File

@ -15,7 +15,7 @@
<uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" /> <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />

View File

@ -106,7 +106,7 @@ public class GBApplication extends Application {
private static SharedPreferences sharedPrefs; private static SharedPreferences sharedPrefs;
private static final String PREFS_VERSION = "shared_preferences_version"; private static final String PREFS_VERSION = "shared_preferences_version";
//if preferences have to be migrated, increment the following and add the migration logic in migratePrefs below; see http://stackoverflow.com/questions/16397848/how-can-i-migrate-android-preferences-with-a-new-version //if preferences have to be migrated, increment the following and add the migration logic in migratePrefs below; see http://stackoverflow.com/questions/16397848/how-can-i-migrate-android-preferences-with-a-new-version
private static final int CURRENT_PREFS_VERSION = 6; private static final int CURRENT_PREFS_VERSION = 7;
private static LimitedQueue mIDSenderLookup = new LimitedQueue(16); private static LimitedQueue mIDSenderLookup = new LimitedQueue(16);
private static Prefs prefs; private static Prefs prefs;
private static GBPrefs gbPrefs; private static GBPrefs gbPrefs;
@ -888,6 +888,9 @@ public class GBApplication extends Application {
migrateStringPrefToPerDevicePref("mi_button_press_count_match_delay", "0", "button_action_broadcast_delay", new ArrayList<>(Collections.singletonList(MIBAND2))); migrateStringPrefToPerDevicePref("mi_button_press_count_match_delay", "0", "button_action_broadcast_delay", new ArrayList<>(Collections.singletonList(MIBAND2)));
migrateStringPrefToPerDevicePref("mi_button_press_broadcast", "nodomain.freeyourgadget.gadgetbridge.ButtonPressed", "button_action_broadcast", new ArrayList<>(Collections.singletonList(MIBAND2))); migrateStringPrefToPerDevicePref("mi_button_press_broadcast", "nodomain.freeyourgadget.gadgetbridge.ButtonPressed", "button_action_broadcast", new ArrayList<>(Collections.singletonList(MIBAND2)));
} }
if (oldVersion < 7) {
migrateStringPrefToPerDevicePref("mi_reserve_alarm_calendar","0","reserve_alarms_calendar", new ArrayList<>(Arrays.asList(MIBAND, MIBAND2)));
}
editor.putString(PREFS_VERSION, Integer.toString(CURRENT_PREFS_VERSION)); editor.putString(PREFS_VERSION, Integer.toString(CURRENT_PREFS_VERSION));
editor.apply(); editor.apply();

View File

@ -21,4 +21,5 @@ public class DeviceSettingsPreferenceConst {
public static final String PREF_TIMEFORMAT = "timeformat"; public static final String PREF_TIMEFORMAT = "timeformat";
public static final String PREF_WEARLOCATION = "wearlocation"; public static final String PREF_WEARLOCATION = "wearlocation";
public static final String PREF_SCREEN_ORIENTATION = "screen_orientation"; public static final String PREF_SCREEN_ORIENTATION = "screen_orientation";
public static final String PREF_RESERVER_ALARMS_CALENDAR = "reserve_alarms_calendar";
} }

View File

@ -395,7 +395,7 @@ public class DeviceSpecificSettingsFragment extends PreferenceFragmentCompat {
setInputTypeFor(HuamiConst.PREF_BUTTON_ACTION_PRESS_COUNT, InputType.TYPE_CLASS_NUMBER); setInputTypeFor(HuamiConst.PREF_BUTTON_ACTION_PRESS_COUNT, InputType.TYPE_CLASS_NUMBER);
setInputTypeFor(MiBandConst.PREF_MIBAND_DEVICE_TIME_OFFSET_HOURS, InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED); setInputTypeFor(MiBandConst.PREF_MIBAND_DEVICE_TIME_OFFSET_HOURS, InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
setInputTypeFor(MakibesHR3Constants.PREF_FIND_PHONE_DURATION, InputType.TYPE_CLASS_NUMBER); setInputTypeFor(MakibesHR3Constants.PREF_FIND_PHONE_DURATION, InputType.TYPE_CLASS_NUMBER);
setInputTypeFor(DeviceSettingsPreferenceConst.PREF_RESERVER_ALARMS_CALENDAR, InputType.TYPE_CLASS_NUMBER);
} }
static DeviceSpecificSettingsFragment newInstance(String settingsFileSuffix, @NonNull int[] supportedSettings) { static DeviceSpecificSettingsFragment newInstance(String settingsFileSuffix, @NonNull int[] supportedSettings) {

View File

@ -43,6 +43,8 @@ import de.greenrobot.dao.query.Query;
import de.greenrobot.dao.query.QueryBuilder; import de.greenrobot.dao.query.QueryBuilder;
import de.greenrobot.dao.query.WhereCondition; import de.greenrobot.dao.query.WhereCondition;
import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsActivity;
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst;
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst; import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst;
import nodomain.freeyourgadget.gadgetbridge.entities.ActivityDescription; import nodomain.freeyourgadget.gadgetbridge.entities.ActivityDescription;
@ -582,9 +584,9 @@ public class DBHelper {
@NonNull @NonNull
public static List<Alarm> getAlarms(@NonNull GBDevice gbDevice) { public static List<Alarm> getAlarms(@NonNull GBDevice gbDevice) {
DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(gbDevice); DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(gbDevice);
Prefs prefs = GBApplication.getPrefs(); Prefs prefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(gbDevice.getAddress()));
// TODO: this alarm reservation is a device dependent detail
int reservedSlots = prefs.getInt(MiBandConst.PREF_MIBAND_RESERVE_ALARM_FOR_CALENDAR, 0); int reservedSlots = prefs.getInt(DeviceSettingsPreferenceConst.PREF_RESERVER_ALARMS_CALENDAR, 0);
int alarmSlots = coordinator.getAlarmSlotCount(); int alarmSlots = coordinator.getAlarmSlotCount();
try (DBHandler db = GBApplication.acquireDB()) { try (DBHandler db = GBApplication.acquireDB()) {

View File

@ -1,25 +1,23 @@
package nodomain.freeyourgadget.gadgetbridge.devices.banglejs; package nodomain.freeyourgadget.gadgetbridge.devices.banglejs;
import android.annotation.TargetApi;
import android.app.Activity;
import android.bluetooth.le.ScanFilter;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.os.ParcelUuid;
import androidx.annotation.NonNull;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.bluetooth.le.ScanFilter;
import android.os.ParcelUuid;
import androidx.annotation.NonNull;
import nodomain.freeyourgadget.gadgetbridge.GBException;
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.hplus.HPlusConstants;
import nodomain.freeyourgadget.gadgetbridge.devices.id115.ID115SampleProvider;
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.HPlusHealthActivitySampleDao;
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.ActivitySample; import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
@ -37,7 +35,9 @@ public class BangleJSCoordinator extends AbstractDeviceCoordinator {
return "Espruino"; return "Espruino";
} }
@NonNull
@Override @Override
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public Collection<? extends ScanFilter> createBLEScanFilters() { public Collection<? extends ScanFilter> createBLEScanFilters() {
// TODO: filter on name beginning Bangle.js? Doesn't appear to be built-in :( // TODO: filter on name beginning Bangle.js? Doesn't appear to be built-in :(
// https://developer.android.com/reference/android/bluetooth/le/ScanFilter.Builder.html#setDeviceName(java.lang.String) // https://developer.android.com/reference/android/bluetooth/le/ScanFilter.Builder.html#setDeviceName(java.lang.String)
@ -46,6 +46,7 @@ public class BangleJSCoordinator extends AbstractDeviceCoordinator {
return Collections.singletonList(filter); return Collections.singletonList(filter);
} }
@NonNull
@Override @Override
public DeviceType getSupportedType(GBDeviceCandidate candidate) { public DeviceType getSupportedType(GBDeviceCandidate candidate) {
String name = candidate.getDevice().getName(); String name = candidate.getDevice().getName();
@ -130,7 +131,7 @@ public class BangleJSCoordinator extends AbstractDeviceCoordinator {
@Override @Override
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) throws GBException { protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) {
} }
@Override @Override

View File

@ -83,8 +83,9 @@ public class MiBand2Coordinator extends HuamiCoordinator {
R.xml.devicesettings_donotdisturb_withauto, R.xml.devicesettings_donotdisturb_withauto,
R.xml.devicesettings_liftwrist_display, R.xml.devicesettings_liftwrist_display,
R.xml.devicesettings_rotatewrist_cycleinfo, R.xml.devicesettings_rotatewrist_cycleinfo,
R.xml.devicesettings_expose_hr_thirdparty,
R.xml.devicesettings_buttonactions, R.xml.devicesettings_buttonactions,
R.xml.devicesettings_reserve_alarms_calendar,
R.xml.devicesettings_expose_hr_thirdparty,
R.xml.devicesettings_pairingkey R.xml.devicesettings_pairingkey
}; };
} }

View File

@ -26,7 +26,6 @@ public final class MiBandConst {
public static final String PREF_MIBAND_ADDRESS = "development_miaddr"; // FIXME: should be prefixed mi_ public static final String PREF_MIBAND_ADDRESS = "development_miaddr"; // FIXME: should be prefixed mi_
public static final String PREF_MIBAND_ALARMS = "mi_alarms"; public static final String PREF_MIBAND_ALARMS = "mi_alarms";
public static final String PREF_MIBAND_DONT_ACK_TRANSFER = "mi_dont_ack_transfer"; public static final String PREF_MIBAND_DONT_ACK_TRANSFER = "mi_dont_ack_transfer";
public static final String PREF_MIBAND_RESERVE_ALARM_FOR_CALENDAR = "mi_reserve_alarm_calendar";
public static final String PREF_MIBAND_USE_HR_FOR_SLEEP_DETECTION = "mi_hr_sleep_detection"; public static final String PREF_MIBAND_USE_HR_FOR_SLEEP_DETECTION = "mi_hr_sleep_detection";
public static final String PREF_MIBAND_DEVICE_TIME_OFFSET_HOURS = "device_time_offset_hours"; public static final String PREF_MIBAND_DEVICE_TIME_OFFSET_HOURS = "device_time_offset_hours";
public static final String PREF_MI2_DATEFORMAT = "mi2_dateformat"; public static final String PREF_MI2_DATEFORMAT = "mi2_dateformat";

View File

@ -248,8 +248,8 @@ public class MiBandCoordinator extends AbstractDeviceCoordinator {
} }
public static int getReservedAlarmSlots(String miBandAddress) throws IllegalArgumentException { public static int getReservedAlarmSlots(String miBandAddress) throws IllegalArgumentException {
Prefs prefs = GBApplication.getPrefs(); Prefs prefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(miBandAddress));
return prefs.getInt(MiBandConst.PREF_MIBAND_RESERVE_ALARM_FOR_CALENDAR, 0); return prefs.getInt(DeviceSettingsPreferenceConst.PREF_RESERVER_ALARMS_CALENDAR, 0);
} }
@Override @Override
@ -263,6 +263,7 @@ public class MiBandCoordinator extends AbstractDeviceCoordinator {
return new int[]{ return new int[]{
R.xml.devicesettings_wearlocation, R.xml.devicesettings_wearlocation,
R.xml.devicesettings_lowlatency_fwupdate, R.xml.devicesettings_lowlatency_fwupdate,
R.xml.devicesettings_reserve_alarms_calendar,
R.xml.devicesettings_fake_timeoffset R.xml.devicesettings_fake_timeoffset
}; };
} }

View File

@ -22,10 +22,11 @@ import android.os.Bundle;
import android.preference.Preference; import android.preference.Preference;
import android.widget.Toast; import android.widget.Toast;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.AbstractSettingsActivity; import nodomain.freeyourgadget.gadgetbridge.activities.AbstractSettingsActivity;
@ -36,13 +37,8 @@ import nodomain.freeyourgadget.gadgetbridge.model.NotificationType;
import nodomain.freeyourgadget.gadgetbridge.util.GB; import nodomain.freeyourgadget.gadgetbridge.util.GB;
import nodomain.freeyourgadget.gadgetbridge.util.Prefs; import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_ACTIVATE_DISPLAY_ON_LIFT;
import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISPLAY_ON_LIFT_END;
import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISPLAY_ON_LIFT_START;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.ORIGIN_ALARM_CLOCK; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.ORIGIN_ALARM_CLOCK;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.ORIGIN_INCOMING_CALL; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.ORIGIN_INCOMING_CALL;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_DO_NOT_DISTURB_OFF;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_DO_NOT_DISTURB_SCHEDULED;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_GOAL_NOTIFICATION; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_GOAL_NOTIFICATION;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_DND; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_DND;
@ -51,9 +47,7 @@ import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PR
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_END; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_END;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_START; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_START;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_THRESHOLD; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_THRESHOLD;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_ROTATE_WRIST_TO_SWITCH_INFO;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MIBAND_ADDRESS; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MIBAND_ADDRESS;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MIBAND_RESERVE_ALARM_FOR_CALENDAR;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MIBAND_USE_HR_FOR_SLEEP_DETECTION; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MIBAND_USE_HR_FOR_SLEEP_DETECTION;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_USER_ALIAS; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_USER_ALIAS;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.VIBRATION_COUNT; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.VIBRATION_COUNT;
@ -270,7 +264,6 @@ public class MiBandPreferencesActivity extends AbstractSettingsActivity {
prefKeys.add(PREF_USER_ALIAS); prefKeys.add(PREF_USER_ALIAS);
prefKeys.add(PREF_MIBAND_ADDRESS); prefKeys.add(PREF_MIBAND_ADDRESS);
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_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));

View File

@ -64,7 +64,7 @@ public enum DeviceType {
MISCALE2(131, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_miscale2), MISCALE2(131, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_miscale2),
BFH16(140, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_bfh16), BFH16(140, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_bfh16),
MAKIBESHR3(150, R.drawable.ic_device_default, R.drawable.ic_device_hplus_disabled, R.string.devicetype_makibes_hr3), MAKIBESHR3(150, R.drawable.ic_device_default, R.drawable.ic_device_hplus_disabled, R.string.devicetype_makibes_hr3),
BANGLEJS(160, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_banglejs), BANGLEJS(160, R.drawable.ic_device_zetime, R.drawable.ic_device_zetime_disabled, R.string.devicetype_banglejs),
MIJIA_LYWSD02(200, R.drawable.ic_device_pebble, R.drawable.ic_device_pebble_disabled, R.string.devicetype_mijia_lywsd02), MIJIA_LYWSD02(200, R.drawable.ic_device_pebble, R.drawable.ic_device_pebble_disabled, R.string.devicetype_mijia_lywsd02),
TEST(1000, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_test); TEST(1000, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_test);

View File

@ -1,44 +1,30 @@
package nodomain.freeyourgadget.gadgetbridge.service.devices.banglejs; package nodomain.freeyourgadget.gadgetbridge.service.devices.banglejs;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.TimeZone;
import java.util.UUID;
import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCharacteristic; import android.bluetooth.BluetoothGattCharacteristic;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull;
import org.slf4j.Logger; import org.json.JSONArray;
import org.slf4j.LoggerFactory;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import org.json.JSONArray; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.TimeZone;
import java.util.UUID;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
import nodomain.freeyourgadget.gadgetbridge.database.DBHelper;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventCallControl; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventCallControl;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventFindPhone; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventFindPhone;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventMusicControl; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventMusicControl;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventNotificationControl; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventNotificationControl;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventVersionInfo;
import nodomain.freeyourgadget.gadgetbridge.devices.banglejs.BangleJSConstants; import nodomain.freeyourgadget.gadgetbridge.devices.banglejs.BangleJSConstants;
import nodomain.freeyourgadget.gadgetbridge.devices.no1f1.No1F1Constants;
import nodomain.freeyourgadget.gadgetbridge.devices.no1f1.No1F1SampleProvider;
import nodomain.freeyourgadget.gadgetbridge.entities.No1F1ActivitySample;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.model.Alarm; import nodomain.freeyourgadget.gadgetbridge.model.Alarm;
import nodomain.freeyourgadget.gadgetbridge.model.BatteryState; import nodomain.freeyourgadget.gadgetbridge.model.BatteryState;
@ -56,8 +42,8 @@ import nodomain.freeyourgadget.gadgetbridge.util.GB;
public class BangleJSDeviceSupport extends AbstractBTLEDeviceSupport { public class BangleJSDeviceSupport extends AbstractBTLEDeviceSupport {
private static final Logger LOG = LoggerFactory.getLogger(BangleJSDeviceSupport.class); private static final Logger LOG = LoggerFactory.getLogger(BangleJSDeviceSupport.class);
public BluetoothGattCharacteristic rxCharacteristic = null; private BluetoothGattCharacteristic rxCharacteristic = null;
public BluetoothGattCharacteristic txCharacteristic = null; private BluetoothGattCharacteristic txCharacteristic = null;
private String receivedLine = ""; private String receivedLine = "";
@ -93,27 +79,21 @@ public class BangleJSDeviceSupport extends AbstractBTLEDeviceSupport {
} }
/// Write a string of data, and chunk it up /// Write a string of data, and chunk it up
public void uartTx(TransactionBuilder builder, String str) { private void uartTx(TransactionBuilder builder, String str) {
LOG.info("UART TX: ", str); LOG.info("UART TX: " + str);
byte bytes[]; byte[] bytes;
try { bytes = str.getBytes(StandardCharsets.UTF_8);
bytes = str.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
LOG.error("TX: UnsupportedEncodingException");
return;
}
for (int i=0;i<bytes.length;i+=20) { for (int i=0;i<bytes.length;i+=20) {
int l = bytes.length-i; int l = bytes.length-i;
if (l>20) l=20; if (l>20) l=20;
byte packet[] = new byte[l]; byte[] packet = new byte[l];
for (int b=0;b<l;b++) System.arraycopy(bytes, i, packet, 0, l);
packet[b] = bytes[i+b];
builder.write(txCharacteristic, packet); builder.write(txCharacteristic, packet);
} }
} }
/// Write a string of data, and chunk it up /// Write a string of data, and chunk it up
public void uartTxJSON(String taskName, JSONObject json) { private void uartTxJSON(String taskName, JSONObject json) {
try { try {
TransactionBuilder builder = performInitialized(taskName); TransactionBuilder builder = performInitialized(taskName);
uartTx(builder, "\u0010GB("+json.toString()+")\n"); uartTx(builder, "\u0010GB("+json.toString()+")\n");
@ -123,10 +103,10 @@ public class BangleJSDeviceSupport extends AbstractBTLEDeviceSupport {
} }
} }
void handleUartRxLine(String line) { private void handleUartRxLine(String line) {
LOG.info("UART RX LINE: " + line); LOG.info("UART RX LINE: " + line);
if (line==">Uncaught ReferenceError: \"gb\" is not defined") if (">Uncaught ReferenceError: \"gb\" is not defined".equals(line))
GB.toast(getContext(), "Gadgetbridge plugin not installed on Bangle.js", Toast.LENGTH_LONG, GB.ERROR); GB.toast(getContext(), "Gadgetbridge plugin not installed on Bangle.js", Toast.LENGTH_LONG, GB.ERROR);
else if (line.charAt(0)=='{') { else if (line.charAt(0)=='{') {
// JSON - we hope! // JSON - we hope!
@ -139,7 +119,7 @@ public class BangleJSDeviceSupport extends AbstractBTLEDeviceSupport {
} }
} }
void handleUartRxJSON(JSONObject json) throws JSONException { private void handleUartRxJSON(JSONObject json) throws JSONException {
switch (json.getString("t")) { switch (json.getString("t")) {
case "info": case "info":
GB.toast(getContext(), "Bangle.js: " + json.getString("msg"), Toast.LENGTH_LONG, GB.INFO); GB.toast(getContext(), "Bangle.js: " + json.getString("msg"), Toast.LENGTH_LONG, GB.INFO);
@ -222,11 +202,11 @@ public class BangleJSDeviceSupport extends AbstractBTLEDeviceSupport {
return true; return true;
} }
if (BangleJSConstants.UUID_CHARACTERISTIC_NORDIC_UART_RX.equals(characteristic.getUuid())) { if (BangleJSConstants.UUID_CHARACTERISTIC_NORDIC_UART_RX.equals(characteristic.getUuid())) {
byte chars[] = characteristic.getValue(); byte[] chars = characteristic.getValue();
String packetStr = new String(chars); String packetStr = new String(chars);
LOG.info("RX: " + packetStr); LOG.info("RX: " + packetStr);
receivedLine += packetStr; receivedLine += packetStr;
while (receivedLine.indexOf("\n")>=0) { while (receivedLine.contains("\n")) {
int p = receivedLine.indexOf("\n"); int p = receivedLine.indexOf("\n");
String line = receivedLine.substring(0,p-1); String line = receivedLine.substring(0,p-1);
receivedLine = receivedLine.substring(p+1); receivedLine = receivedLine.substring(p+1);
@ -316,7 +296,7 @@ public class BangleJSDeviceSupport extends AbstractBTLEDeviceSupport {
try { try {
JSONObject o = new JSONObject(); JSONObject o = new JSONObject();
o.put("t", "call"); o.put("t", "call");
String cmdString[] = {"","undefined","accept","incoming","outgoing","reject","start","end"}; String[] cmdString = {"", "undefined", "accept", "incoming", "outgoing", "reject", "start", "end"};
o.put("cmd", cmdString[callSpec.command]); o.put("cmd", cmdString[callSpec.command]);
o.put("name", callSpec.name); o.put("name", callSpec.name);
o.put("number", callSpec.number); o.put("number", callSpec.number);
@ -336,7 +316,7 @@ public class BangleJSDeviceSupport extends AbstractBTLEDeviceSupport {
try { try {
JSONObject o = new JSONObject(); JSONObject o = new JSONObject();
o.put("t", "musicstate"); o.put("t", "musicstate");
String musicStates[] = {"play","pause","stop",""}; String[] musicStates = {"play", "pause", "stop", ""};
o.put("state", musicStates[stateSpec.state]); o.put("state", musicStates[stateSpec.state]);
o.put("position", stateSpec.position); o.put("position", stateSpec.position);
o.put("shuffle", stateSpec.shuffle); o.put("shuffle", stateSpec.shuffle);

View File

@ -1542,8 +1542,8 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
private HuamiSupport sendCalendarEvents(TransactionBuilder builder) { private HuamiSupport sendCalendarEvents(TransactionBuilder builder) {
BluetoothGattCharacteristic characteristic = getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION); BluetoothGattCharacteristic characteristic = getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION);
Prefs prefs = GBApplication.getPrefs(); Prefs prefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(gbDevice.getAddress()));
int availableSlots = prefs.getInt(MiBandConst.PREF_MIBAND_RESERVE_ALARM_FOR_CALENDAR, 0); int availableSlots = prefs.getInt(DeviceSettingsPreferenceConst.PREF_RESERVER_ALARMS_CALENDAR, 0);
if (availableSlots > 0) { if (availableSlots > 0) {
CalendarEvents upcomingEvents = new CalendarEvents(); CalendarEvents upcomingEvents = new CalendarEvents();

View File

@ -24,6 +24,9 @@ import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -36,10 +39,9 @@ import java.util.GregorianCalendar;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import androidx.annotation.Nullable;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst;
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
import nodomain.freeyourgadget.gadgetbridge.database.DBHelper; import nodomain.freeyourgadget.gadgetbridge.database.DBHelper;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo;
@ -1224,16 +1226,18 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport {
TransactionBuilder builder = performInitialized("Send upcoming events"); TransactionBuilder builder = performInitialized("Send upcoming events");
BluetoothGattCharacteristic characteristic = getCharacteristic(MiBandService.UUID_CHARACTERISTIC_CONTROL_POINT); BluetoothGattCharacteristic characteristic = getCharacteristic(MiBandService.UUID_CHARACTERISTIC_CONTROL_POINT);
Prefs prefs = GBApplication.getPrefs(); Prefs prefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(gbDevice.getAddress()));
int availableSlots = prefs.getInt(MiBandConst.PREF_MIBAND_RESERVE_ALARM_FOR_CALENDAR, 0); int availableSlots = prefs.getInt(DeviceSettingsPreferenceConst.PREF_RESERVER_ALARMS_CALENDAR, 0);
if (availableSlots >3) {
availableSlots = 3;
}
if (availableSlots > 0) { if (availableSlots > 0) {
CalendarEvents upcomingEvents = new CalendarEvents(); CalendarEvents upcomingEvents = new CalendarEvents();
List<CalendarEvents.CalendarEvent> mEvents = upcomingEvents.getCalendarEventList(getContext()); List<CalendarEvents.CalendarEvent> mEvents = upcomingEvents.getCalendarEventList(getContext());
int iteration = 0; int iteration = 0;
for (CalendarEvents.CalendarEvent mEvt : mEvents) { for (CalendarEvents.CalendarEvent mEvt : mEvents) {
if (iteration >= availableSlots || iteration > 2) { if (iteration >= availableSlots) {
break; break;
} }
int slotToUse = 2 - iteration; int slotToUse = 2 - iteration;

View File

@ -201,7 +201,7 @@ public class FilePutRequest extends FossilRequest {
CRC32C crc = new CRC32C(); CRC32C crc = new CRC32C();
crc.update(file,0,data.length); crc.update(file,0,file.length);
buffer.putInt((int) crc.getValue()); buffer.putInt((int) crc.getValue());
byte[] data = buffer.array(); byte[] data = buffer.array();

View File

@ -813,9 +813,12 @@
<string name="qhybrid_overwrite_buttons">Tasten überschreiben</string> <string name="qhybrid_overwrite_buttons">Tasten überschreiben</string>
<string name="qhybrid_use_activity_hand_as_notification_counter">Aktivitätshand als Benachrichtigungszähler verwenden</string> <string name="qhybrid_use_activity_hand_as_notification_counter">Aktivitätshand als Benachrichtigungszähler verwenden</string>
<string name="qhybrid_prompt_million_steps">Bitte stelle die Schrittzahl auf eine Million ein, um dies zu aktivieren.</string> <string name="qhybrid_prompt_million_steps">Bitte stelle die Schrittzahl auf eine Million ein, um dies zu aktivieren.</string>
<string name="qhybrid_buttons_overwrite_success">Tasten erfolgreich überschrieben</string> <string name="qhybrid_buttons_overwrite_success">Tasten überschrieben</string>
<string name="qhybrid_buttons_overwrite_error">Fehler beim Überschreiben der Tasten</string> <string name="qhybrid_buttons_overwrite_error">Fehler beim Überschreiben der Tasten</string>
<string name="qhybrid_offset_timezone">Verschiebung der Zeitzone um</string> <string name="qhybrid_offset_timezone">Verschiebung der Zeitzone um</string>
<string name="qhybrid_changes_delay_prompt">Änderung kann einige Sekunden dauern...</string> <string name="qhybrid_changes_delay_prompt">Änderung kann einige Sekunden dauern</string>
<string name="qhybrid_offset_time_by">Zeitverschiebung um</string> <string name="qhybrid_offset_time_by">Zeitverschiebung um</string>
<string name="pref_disable_new_ble_scanning">Deaktivieren des neuen BLE-Scans</string>
<string name="pref_summary_disable_new_ble_scanning">Aktiviere diese Option, wenn dein Gerät bei der Erkennung nicht gefunden wird</string>
<string name="devicetype_banglejs">Bangle.js</string>
</resources> </resources>

View File

@ -799,7 +799,14 @@
<string name="qhybrid_second_timezone_offset_relative_to_utc">היסט אזור זמן שני ביחס ל־UTC</string> <string name="qhybrid_second_timezone_offset_relative_to_utc">היסט אזור זמן שני ביחס ל־UTC</string>
<string name="qhybrid_overwrite_buttons">דריסת כפתורים</string> <string name="qhybrid_overwrite_buttons">דריסת כפתורים</string>
<string name="qhybrid_prompt_million_steps">נא להגדיר את מניין הצעדים למיליון כדי להפעיל זאת.</string> <string name="qhybrid_prompt_million_steps">נא להגדיר את מניין הצעדים למיליון כדי להפעיל זאת.</string>
<string name="qhybrid_buttons_overwrite_success">הכפתורים נדרסו בהצלחה</string> <string name="qhybrid_buttons_overwrite_success">הכפתורים נדרסו</string>
<string name="qhybrid_buttons_overwrite_error">דריסת הכפתורים נכשלה</string> <string name="qhybrid_buttons_overwrite_error">דריסת הכפתורים נכשלה</string>
<string name="qhybrid_changes_delay_prompt">השינויים יתבצעו בהקדם…</string> <string name="qhybrid_changes_delay_prompt">השינויים יתבצעו בהקדם…</string>
<string name="tasker_notification">הקפצת התראה ב־Q Hybrid</string>
<string name="qhybrid_use_activity_hand_as_notification_counter">להשתמש ביד הפעילות כמונה התראות</string>
<string name="qhybrid_offset_timezone">מרחק מאזור זמן</string>
<string name="qhybrid_offset_time_by">מרחק מהשעה</string>
<string name="pref_disable_new_ble_scanning">השבתת סריקת BLE חדשה</string>
<string name="pref_summary_disable_new_ble_scanning">יש לסמן את האפשרות הזאת אם המכשיר שלך לא נמצא במהלך האיתור</string>
<string name="devicetype_banglejs">Bangle.js</string>
</resources> </resources>

View File

@ -792,4 +792,7 @@
\n \n
\nFORTSETT PÅ EGEN RISIKO!</string> \nFORTSETT PÅ EGEN RISIKO!</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string> <string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
<string name="watch_not_connected">Klokke ikke tilkoblet</string>
<string name="qhybrid_vibration_strength">vibrasjonsstyrke:</string>
<string name="devicetype_banglejs">Bangle.js</string>
</resources> </resources>

View File

@ -794,4 +794,22 @@
\n \n
\nGA VERDER OP EIGEN RISICO!</string> \nGA VERDER OP EIGEN RISICO!</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string> <string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
<string name="devicetype_qhybrid">Fossil Q Hybrid</string>
<string name="preferences_qhybrid_settings">Q Hybrid Instellingen</string>
<string name="watch_not_connected">Horloge niet verbonden</string>
<string name="qhybrid_vibration_strength">trillingssterkte:</string>
<string name="qhybrid_goal_in_steps">Doel in stappen</string>
<string name="qhybrid_time_shift">tijdsverschuiving</string>
<string name="qhybrid_second_timezone_offset_relative_to_utc">tweede tijdzone offset ten opzichte van UTC</string>
<string name="qhybrid_overwrite_buttons">knoppen overschrijven</string>
<string name="qhybrid_use_activity_hand_as_notification_counter">gebruik activiteitswijzer als notificatieteller</string>
<string name="qhybrid_prompt_million_steps">Zet het aantal stappen op een miljoen om dat te activeren.</string>
<string name="qhybrid_buttons_overwrite_success">Knoppen overschreven</string>
<string name="qhybrid_buttons_overwrite_error">Fout bij het overschrijven van knoppen</string>
<string name="qhybrid_offset_timezone">offset tijdzone met</string>
<string name="qhybrid_changes_delay_prompt">wijziging kan enkele seconden duren…</string>
<string name="qhybrid_offset_time_by">offset tijdzone met</string>
<string name="pref_disable_new_ble_scanning">Nieuwe BLE-scanning uitschakelen</string>
<string name="pref_summary_disable_new_ble_scanning">Vink deze optie aan als uw apparaat niet kan worden gevonden tijdens discovery</string>
<string name="devicetype_banglejs">Bangle.js</string>
</resources> </resources>

View File

@ -811,9 +811,12 @@
<string name="qhybrid_overwrite_buttons">sobrescrever botões</string> <string name="qhybrid_overwrite_buttons">sobrescrever botões</string>
<string name="qhybrid_use_activity_hand_as_notification_counter">usar mão de atividade como contador da notificação</string> <string name="qhybrid_use_activity_hand_as_notification_counter">usar mão de atividade como contador da notificação</string>
<string name="qhybrid_prompt_million_steps">Defina a contagem de passos para um milhão para ativá-lo.</string> <string name="qhybrid_prompt_million_steps">Defina a contagem de passos para um milhão para ativá-lo.</string>
<string name="qhybrid_buttons_overwrite_success">Botões sobrescritos com sucesso</string> <string name="qhybrid_buttons_overwrite_success">Botões sobrescritos</string>
<string name="qhybrid_buttons_overwrite_error">Erro ao sobrescrever botões</string> <string name="qhybrid_buttons_overwrite_error">Erro ao sobrescrever botões</string>
<string name="qhybrid_offset_timezone">deslocar fuso horário por</string> <string name="qhybrid_offset_timezone">deslocar fuso horário por</string>
<string name="qhybrid_changes_delay_prompt">a alteração pode levar alguns segundos...</string> <string name="qhybrid_changes_delay_prompt">a alteração pode levar alguns segundos</string>
<string name="qhybrid_offset_time_by">deslocar tempo por</string> <string name="qhybrid_offset_time_by">deslocar tempo por</string>
<string name="pref_disable_new_ble_scanning">Desabilitar nova varredura de BLE</string>
<string name="pref_summary_disable_new_ble_scanning">Marque essa opção se seu dispositivo não pode ser encontrado durante descobertas</string>
<string name="devicetype_banglejs">Bangle.js</string>
</resources> </resources>

View File

@ -804,9 +804,12 @@
<string name="qhybrid_overwrite_buttons">覆盖按钮</string> <string name="qhybrid_overwrite_buttons">覆盖按钮</string>
<string name="qhybrid_use_activity_hand_as_notification_counter">使用活动手作为通知计数</string> <string name="qhybrid_use_activity_hand_as_notification_counter">使用活动手作为通知计数</string>
<string name="qhybrid_prompt_million_steps">请将步数设置为100万来激活它。</string> <string name="qhybrid_prompt_million_steps">请将步数设置为100万来激活它。</string>
<string name="qhybrid_buttons_overwrite_success">已成功覆盖按钮</string> <string name="qhybrid_buttons_overwrite_success">按钮覆盖</string>
<string name="qhybrid_buttons_overwrite_error">覆盖按钮时出错</string> <string name="qhybrid_buttons_overwrite_error">覆盖按钮时出错</string>
<string name="qhybrid_offset_timezone">基于时区偏移</string> <string name="qhybrid_offset_timezone">基于时区偏移</string>
<string name="qhybrid_changes_delay_prompt">修改可能需要几秒…</string> <string name="qhybrid_changes_delay_prompt">修改可能需要几秒…</string>
<string name="qhybrid_offset_time_by">经由时间偏移</string> <string name="qhybrid_offset_time_by">经由时间偏移</string>
<string name="pref_disable_new_ble_scanning">禁用新低功率蓝牙扫描</string>
<string name="pref_summary_disable_new_ble_scanning">若您的设备无法在扫描过程中发现,请选中此选项</string>
<string name="devicetype_banglejs">Bangle.js</string>
</resources> </resources>

View File

@ -293,7 +293,6 @@
<!-- developer/debug preferences--> <!-- developer/debug preferences-->
<string name="pref_disable_new_ble_scanning">Disable new BLE scanning</string> <string name="pref_disable_new_ble_scanning">Disable new BLE scanning</string>
<string name="pref_summary_disable_new_ble_scanning">Check this option if your device cannot be found during discovery</string> <string name="pref_summary_disable_new_ble_scanning">Check this option if your device cannot be found during discovery</string>
<string name="not_connected">Not connected</string> <string name="not_connected">Not connected</string>
<string name="connecting">Connecting</string> <string name="connecting">Connecting</string>
<string name="connected">Connected</string> <string name="connected">Connected</string>
@ -808,10 +807,10 @@
<string name="qhybrid_overwrite_buttons">overwrite buttons</string> <string name="qhybrid_overwrite_buttons">overwrite buttons</string>
<string name="qhybrid_use_activity_hand_as_notification_counter">use activity hand as notification counter</string> <string name="qhybrid_use_activity_hand_as_notification_counter">use activity hand as notification counter</string>
<string name="qhybrid_prompt_million_steps">Please set the step count to a million to activate that.</string> <string name="qhybrid_prompt_million_steps">Please set the step count to a million to activate that.</string>
<string name="qhybrid_buttons_overwrite_success">Successfully overwritten buttons</string> <string name="qhybrid_buttons_overwrite_success">Buttons overwritten</string>
<string name="qhybrid_buttons_overwrite_error">Error overwriting buttons</string> <string name="qhybrid_buttons_overwrite_error">Error overwriting buttons</string>
<string name="qhybrid_offset_timezone">offset timezone by</string> <string name="qhybrid_offset_timezone">offset timezone by</string>
<string name="qhybrid_changes_delay_prompt">change might take some seconds...</string> <string name="qhybrid_changes_delay_prompt">change might take some seconds</string>
<string name="qhybrid_offset_time_by">offset time by</string> <string name="qhybrid_offset_time_by">offset time by</string>
<plurals name="widget_alarm_target_hours"> <plurals name="widget_alarm_target_hours">
<item quantity="one">%d hour</item> <item quantity="one">%d hour</item>

View File

@ -22,13 +22,6 @@
android:summary="@string/mi2_prefs_goal_notification_summary" android:summary="@string/mi2_prefs_goal_notification_summary"
android:title="@string/mi2_prefs_goal_notification" /> android:title="@string/mi2_prefs_goal_notification" />
<EditTextPreference
android:defaultValue="0"
android:inputType="number"
android:key="mi_reserve_alarm_calendar"
android:maxLength="1"
android:digits="0123"
android:title="@string/miband_prefs_reserve_alarm_calendar" />
<CheckBoxPreference <CheckBoxPreference
android:defaultValue="false" android:defaultValue="false"
android:key="mi_hr_sleep_detection" android:key="mi_hr_sleep_detection"