diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/ZeppOsMenuType.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/ZeppOsMenuType.java index f1f621ab26..e1c0a3cd26 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/ZeppOsMenuType.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/ZeppOsMenuType.java @@ -71,6 +71,7 @@ public class ZeppOsMenuType { put("0000004B", "map"); put("0000004C", "zepp_pay"); put("0000004D", "heart_rate_push"); + put("00000052", "audio_control"); put("00000053", "golf"); put("00000056", "bio_charge"); put("00000100", "alexa"); @@ -83,11 +84,14 @@ public class ZeppOsMenuType { put("000F4258", "real_time_heart_rate"); put("000F4263", "watch_storage_space"); put("000F4259", "water_time"); + put("000F636F", "diary"); + put("000F63A5", "calorie_intake_record"); put("000F653B", "meditation"); put("0010132C", "breathing2"); put("00100446", "worldclock2"); put("00100F0A", "takephoto2"); put("0010660A", "zepp_flow"); + put("0010953E", "zepp_flow2"); put("000FFD3C", "jet_lag_manager"); }}; @@ -132,7 +136,7 @@ public class ZeppOsMenuType { put("000FFD39", "hrv"); }}; - public static final Map controlCenterNameLookup = new HashMap() {{ + public static final Map controlCenterNameLookup = new HashMap<>() {{ put("00000000", "flashlight"); put("00000001", "brightness"); put("00000002", "lockscreen"); @@ -158,5 +162,9 @@ public class ZeppOsMenuType { put("0000001A", "headphone"); put("0000001B", "night_display"); put("0000001C", "always_on_display"); + put("0000001E", "flashlight2"); + put("0000001D", "text_size"); + put("0000001F", "sos_flashlight"); + put("00000020", "mute"); }}; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/services/ZeppOsShortcutCardsService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/services/ZeppOsShortcutCardsService.java index 8fe7508eb6..1371262893 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/services/ZeppOsShortcutCardsService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/services/ZeppOsShortcutCardsService.java @@ -97,6 +97,7 @@ public class ZeppOsShortcutCardsService extends AbstractZeppOsService { WORLDCLOCK2("1049670", "1"), BREATHING2("1053484", "1"), ZEPP_FLOW("1074698", "1"), + ASK_ANYTHING("1086782", "1"), ; private final String appNum; diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 672ae995cc..94e17cfdd6 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -1103,14 +1103,18 @@ @string/hrv @string/menuitem_map @string/menuitem_heart_rate_push + @string/menuitem_audio_control @string/menuitem_bluetooth_scale_assistant @string/menuitem_calculator @string/menuitem_running_calculator @string/menuitem_real_time_heart_rate @string/menuitem_watch_storage_space @string/menuitem_water_time + @string/menuitem_diary + @string/menuitem_calorie_intake_record @string/activity_type_meditation @string/menuitem_zepp_flow + @string/menuitem_zepp_flow @string/menuitem_jet_lag_manager @string/menuitem_golf @string/menuitem_bio_charge @@ -1174,14 +1178,18 @@ hrv map heart_rate_push + audio_control bluetooth_scale_assistant calculator running_calculator real_time_heart_rate watch_storage_space water_time + diary + calorie_intake_record meditation zepp_flow + zepp_flow2 jet_lag_manager golf bio_charge @@ -1232,6 +1240,7 @@ @string/menuitem_bio_charge @string/menuitem_worldclock @string/menuitem_breathing + @string/menuitem_zepp_os_ask_anything_chat_bot @@ -1274,6 +1283,7 @@ bio_charge worldclock2 breathing2 + ask_anything @@ -1302,6 +1312,10 @@ @string/menuitem_countdown @string/menuitem_stopwatch @string/menuitem_alarm + @string/menuitem_flashlight + @string/menuitem_text_size + @string/menuitem_sos_flashlight + @string/_pebble_watch_mute @@ -1330,6 +1344,10 @@ countdown stopwatch alarm + flashlight2 + text_size + sos_flashlight + mute diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bfa1658a60..7118455904 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2240,6 +2240,9 @@ Apps shortcuts Map Heart Rate Push + Audio Control + Diary + Calorie Intake Record Bluetooth Scale Assistant Calculator Running Calculator @@ -2249,6 +2252,7 @@ Breathing Cycle Tracking Alarm + Ask Anything Countdown Compass Settings @@ -2291,6 +2295,8 @@ Weight Barometer Flashlight + Text Size + SOS Flashlight E-mail Countdown Personal Activity Intelligence diff --git a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/ZeppOsMenuTypeTest.java b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/ZeppOsMenuTypeTest.java new file mode 100644 index 0000000000..3814b9286e --- /dev/null +++ b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/ZeppOsMenuTypeTest.java @@ -0,0 +1,95 @@ +package nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.test.TestBase; + +public class ZeppOsMenuTypeTest extends TestBase { + @Test + public void testDisplayItemNameLookup_allValuesValid() { + final Set validAppValues = new HashSet<>(Arrays.asList( + getContext().getResources().getStringArray(R.array.pref_zepp_os_apps_values) + )); + + for (Map.Entry entry : ZeppOsMenuType.displayItemNameLookup.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + + assertTrue( + String.format("Value '%s' (key: %s) in displayItemNameLookup is not in pref_zepp_os_apps_values", + value, key), + validAppValues.contains(value) + ); + } + } + + @Test + public void testShortcutsNameLookup_allValuesValid() { + final Set validAppValues = new HashSet<>(Arrays.asList( + getContext().getResources().getStringArray(R.array.pref_zepp_os_apps_values) + )); + + for (Map.Entry entry : ZeppOsMenuType.shortcutsNameLookup.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + + assertTrue( + String.format("Value '%s' (key: %s) in shortcutsNameLookup is not in pref_zepp_os_apps_values", + value, key), + validAppValues.contains(value) + ); + } + } + + @Test + public void testControlCenterNameLookup_allValuesValid() { + final Set validControlCenterValues = new HashSet<>(Arrays.asList( + getContext().getResources().getStringArray(R.array.pref_huami2021_control_center_values) + )); + + for (Map.Entry entry : ZeppOsMenuType.controlCenterNameLookup.entrySet()) { + final String key = entry.getKey(); + final String value = entry.getValue(); + + assertTrue( + String.format("Value '%s' (key: %s) in controlCenterNameLookup is not in pref_huami2021_control_center_values", value, key), + validControlCenterValues.contains(value) + ); + } + } + + @Test + public void testAllKeys_areUppercaseHex() { + // Verify that all keys follow the expected format: 8-digit uppercase hex strings + final String hexPattern = "^[0-9A-F]{8}$"; + + for (String key : ZeppOsMenuType.displayItemNameLookup.keySet()) { + assertTrue( + String.format("Key '%s' in displayItemNameLookup should be 8-digit uppercase hex", key), + key.matches(hexPattern) + ); + } + + for (String key : ZeppOsMenuType.shortcutsNameLookup.keySet()) { + assertTrue( + String.format("Key '%s' in shortcutsNameLookup should be 8-digit uppercase hex", key), + key.matches(hexPattern) + ); + } + + for (String key : ZeppOsMenuType.controlCenterNameLookup.keySet()) { + assertTrue( + String.format("Key '%s' in controlCenterNameLookup should be 8-digit uppercase hex", key), + key.matches(hexPattern) + ); + } + } +}