diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java index 949298556..46d128891 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java @@ -92,10 +92,12 @@ import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISCONNECT_NOTIFICATION_END; import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISCONNECT_NOTIFICATION_START; import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISPLAY_ITEMS; +import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISPLAY_ITEMS_SORTABLE; 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.huami.HuamiConst.PREF_EXPOSE_HR_THIRDPARTY; import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_SHORTCUTS; +import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_SHORTCUTS_SORTABLE; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_DO_NOT_DISTURB; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_DO_NOT_DISTURB_END; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_DO_NOT_DISTURB_OFF; @@ -352,7 +354,9 @@ public class DeviceSpecificSettingsFragment extends PreferenceFragmentCompat { addPreferenceHandlerFor(PREF_MI2_DATEFORMAT); addPreferenceHandlerFor(PREF_DATEFORMAT); addPreferenceHandlerFor(PREF_DISPLAY_ITEMS); + addPreferenceHandlerFor(PREF_DISPLAY_ITEMS_SORTABLE); addPreferenceHandlerFor(PREF_SHORTCUTS); + addPreferenceHandlerFor(PREF_SHORTCUTS_SORTABLE); addPreferenceHandlerFor(PREF_LANGUAGE); addPreferenceHandlerFor(PREF_EXPOSE_HR_THIRDPARTY); addPreferenceHandlerFor(PREF_WEARLOCATION); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiConst.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiConst.java index 1e0fafb4c..e3e1fefe7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiConst.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiConst.java @@ -61,7 +61,9 @@ public class HuamiConst { public static final String PREF_DISCONNECT_NOTIFICATION_END = "disconnect_notification_end"; public static final String PREF_DISPLAY_ITEMS = "display_items"; + public static final String PREF_DISPLAY_ITEMS_SORTABLE = "display_items_sortable"; public static final String PREF_SHORTCUTS = "shortcuts"; + public static final String PREF_SHORTCUTS_SORTABLE = "shortcuts_sortable"; public static final String PREF_EXPOSE_HR_THIRDPARTY = "expose_hr_thirdparty"; public static final String PREF_USE_CUSTOM_FONT = "use_custom_font"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java index ec06fc75c..31c31eabc 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java @@ -1884,9 +1884,11 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { setDisconnectNotification(builder); break; case HuamiConst.PREF_DISPLAY_ITEMS: + case HuamiConst.PREF_DISPLAY_ITEMS_SORTABLE: setDisplayItems(builder); break; case HuamiConst.PREF_SHORTCUTS: + case HuamiConst.PREF_SHORTCUTS_SORTABLE: setShortcuts(builder); break; case MiBandConst.PREF_MI2_ROTATE_WRIST_TO_SWITCH_INFO: @@ -2314,55 +2316,53 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { } protected HuamiSupport setDisplayItemsNew(TransactionBuilder builder, boolean isShortcuts, int defaultSettings, Map keyIdMap) { - if (gbDevice.getFirmwareVersion() == null) { - LOG.warn("Device not initialized yet, won't set menu items"); - return this; - } - SharedPreferences prefs = GBApplication.getDeviceSpecificSharedPrefs(gbDevice.getAddress()); - Set pages; + String pages; + List enabledList; byte menuType; if (isShortcuts) { menuType = (byte) 0xfd; - pages = prefs.getStringSet(HuamiConst.PREF_SHORTCUTS, new HashSet<>(Arrays.asList(getContext().getResources().getStringArray(R.array.pref_bips_shortcuts_default)))); - LOG.info("Setting shortcuts to " + (pages == null ? "none" : pages)); + pages = prefs.getString(HuamiConst.PREF_SHORTCUTS_SORTABLE, null); + LOG.info("Setting shortcuts"); } else { menuType = (byte) 0xff; - pages = prefs.getStringSet(HuamiConst.PREF_DISPLAY_ITEMS, new HashSet<>(Arrays.asList(getContext().getResources().getStringArray(defaultSettings)))); - LOG.info("Setting display items to " + (pages == null ? "none" : pages)); + pages = prefs.getString(HuamiConst.PREF_DISPLAY_ITEMS_SORTABLE, null); + LOG.info("Setting menu items"); } - - if (pages != null) { - byte[] command = new byte[keyIdMap.size() * 4 + 1]; - command[0] = 0x1e; - // it seem that we first have to put all ENABLED items into the array - int pos = 1; - int index = 0; - for (Map.Entry entry : keyIdMap.entrySet()) { - String key = entry.getKey(); - int id = entry.getValue(); - - if (pages.contains(key)) { - command[pos++] = (byte) index++; - command[pos++] = 0x00; - command[pos++] = menuType; - command[pos++] = (byte) id; - } - } - // And then all DISABLED ones - for (Map.Entry entry : keyIdMap.entrySet()) { - String key = entry.getKey(); - int id = entry.getValue(); - - if (!pages.contains(key)) { - command[pos++] = (byte) index++; - command[pos++] = 0x01; - command[pos++] = (byte) menuType; - command[pos++] = (byte) id; - } - } - writeToChunked(builder, 2, command); + if (pages == null) { + enabledList = Arrays.asList(getContext().getResources().getStringArray(defaultSettings)); + } else { + enabledList = Arrays.asList(pages.split(",")); } + LOG.info("enabled items" + enabledList); + + byte[] command = new byte[keyIdMap.size() * 4 + 1]; + command[0] = 0x1e; + // it seem that we first have to put all ENABLED items into the array, oder does matter + int pos = 1; + int index = 0; + for (String key : enabledList) { + Integer id = keyIdMap.get(key); + if (id != null) { + command[pos++] = (byte) index++; + command[pos++] = 0x00; + command[pos++] = menuType; + command[pos++] = id.byteValue(); + } + } + // And then all DISABLED ones, order does not matter + for (Map.Entry entry : keyIdMap.entrySet()) { + String key = entry.getKey(); + int id = entry.getValue(); + + if (!enabledList.contains(key)) { + command[pos++] = (byte) index++; + command[pos++] = 0x01; + command[pos++] = (byte) menuType; + command[pos++] = (byte) id; + } + } + writeToChunked(builder, 2, command); return this; } diff --git a/app/src/main/res/xml/devicesettings_amazfitbips.xml b/app/src/main/res/xml/devicesettings_amazfitbips.xml index 6e895e5a2..69bc2f5db 100644 --- a/app/src/main/res/xml/devicesettings_amazfitbips.xml +++ b/app/src/main/res/xml/devicesettings_amazfitbips.xml @@ -1,20 +1,22 @@ - - - -