From d4d5c35f43656ec24933c40e7b7820c6f2e1f188 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 25 Sep 2025 17:09:22 -0700 Subject: [PATCH] wifi metered button --- system/ui/widgets/list_view.py | 8 ++++++-- system/ui/widgets/network.py | 29 +++++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/system/ui/widgets/list_view.py b/system/ui/widgets/list_view.py index 7b876cd87d..45a9f78e3d 100644 --- a/system/ui/widgets/list_view.py +++ b/system/ui/widgets/list_view.py @@ -174,7 +174,7 @@ class MultipleButtonAction(ItemAction): # Check button state mouse_pos = rl.get_mouse_position() - is_hovered = rl.check_collision_point_rec(mouse_pos, button_rect) + is_hovered = rl.check_collision_point_rec(mouse_pos, button_rect) and self.enabled is_pressed = is_hovered and rl.is_mouse_button_down(rl.MouseButton.MOUSE_BUTTON_LEFT) and self.is_pressed is_selected = i == self.selected_button @@ -186,6 +186,9 @@ class MultipleButtonAction(ItemAction): else: bg_color = rl.Color(57, 57, 57, 255) # Gray + if not self.enabled: + bg_color = rl.Color(bg_color.r, bg_color.g, bg_color.b, 150) # Dim + # Draw button rl.draw_rectangle_rounded(button_rect, 1.0, 20, bg_color) @@ -193,7 +196,8 @@ class MultipleButtonAction(ItemAction): text_size = measure_text_cached(self._font, text, 40) text_x = button_x + (self.button_width - text_size.x) / 2 text_y = button_y + (BUTTON_HEIGHT - text_size.y) / 2 - rl.draw_text_ex(self._font, text, rl.Vector2(text_x, text_y), 40, 0, rl.Color(228, 228, 228, 255)) + text_color = rl.Color(228, 228, 228, 255) if self.enabled else rl.Color(150, 150, 150, 255) + rl.draw_text_ex(self._font, text, rl.Vector2(text_x, text_y), 40, 0, text_color) # Handle click if is_hovered and rl.is_mouse_button_released(rl.MouseButton.MOUSE_BUTTON_LEFT) and self.is_pressed: diff --git a/system/ui/widgets/network.py b/system/ui/widgets/network.py index dbd72507c6..d9b78dec16 100644 --- a/system/ui/widgets/network.py +++ b/system/ui/widgets/network.py @@ -6,14 +6,14 @@ import pyray as rl from openpilot.common.filter_simple import FirstOrderFilter from openpilot.system.ui.lib.application import gui_app, DEFAULT_FPS from openpilot.system.ui.lib.scroll_panel import GuiScrollPanel -from openpilot.system.ui.lib.wifi_manager import WifiManager, SecurityType, Network +from openpilot.system.ui.lib.wifi_manager import WifiManager, SecurityType, Network, MeteredType from openpilot.system.ui.widgets import Widget from openpilot.system.ui.widgets.button import ButtonStyle, Button from openpilot.system.ui.widgets.confirm_dialog import ConfirmDialog from openpilot.system.ui.widgets.keyboard import Keyboard from openpilot.system.ui.widgets.label import TextAlignment, gui_label from openpilot.system.ui.widgets.scroller import Scroller -from openpilot.system.ui.widgets.list_view import toggle_item, text_item, button_item, dual_button_item, TextAction, ListItem, ToggleAction +from openpilot.system.ui.widgets.list_view import toggle_item, text_item, button_item, dual_button_item, TextAction, ListItem, ToggleAction, multiple_button_item, MultipleButtonAction NM_DEVICE_STATE_NEED_AUTH = 60 MIN_PASSWORD_LENGTH = 8 @@ -133,12 +133,24 @@ class AdvancedNetworkSettings(Widget): self._tethering_btn = ListItem(title="Enable Tethering", action_item=self._tethering_action, callback=self._tethering_toggled) # Metered - + self._wifi_metered_action = MultipleButtonAction(["default", "metered", "unmetered"], 255, 0, callback=self._wifi_metered_toggled) + self._wifi_metered_btn = ListItem(title="Wi-Fi Network Metered", description="Prevent large data uploads when on a metered Wi-Fi connection", icon=None, action_item=self._wifi_metered_action) + + # self._metered_button = multiple_button_item( + # "Wi-Fi Network Metered", + # "Prevent large data uploads when on a metered Wi-Fi connection", + # buttons=["default", "metered", "unmetered"], + # button_width=255, + # # callback=self._set_longitudinal_personality, + # selected_index=0, # self._params.get("LongitudinalPersonality", return_default=True), + # # icon="speed_limit.png" + # ) items = [ self._tethering_btn, button_item("Tethering Password", "EDIT", callback=self._edit_tethering_password), - text_item("IP Address", lambda: self._wifi_manager.ipv4_address) + text_item("IP Address", lambda: self._wifi_manager.ipv4_address), + self._wifi_metered_btn, ] self._scroller = Scroller(items, line_separator=True, spacing=0) @@ -148,6 +160,10 @@ class AdvancedNetworkSettings(Widget): def _on_network_updated(self, networks: list[Network]): self._tethering_action.set_enabled(True) self._tethering_action.set_state(self._wifi_manager.is_tethering_active()) + + metered = self._wifi_manager.current_network_metered + self._wifi_metered_action.set_enabled(True) + self._wifi_metered_action.selected_button = int(metered) if metered in (MeteredType.UNKNOWN, MeteredType.YES, MeteredType.NO) else 0 # ip_address = self._wifi_manager.ipv4_address # self._ip_address.title = ip_address if ip_address else "N/A" @@ -158,6 +174,11 @@ class AdvancedNetworkSettings(Widget): self._tethering_action.set_enabled(False) self._wifi_manager.set_tethering_active(checked) + def _wifi_metered_toggled(self, metered): + metered_type = {0: MeteredType.UNKNOWN, 1: MeteredType.YES, 2: MeteredType.NO}.get(metered, MeteredType.UNKNOWN) + self._wifi_metered_action.set_enabled(False) + self._wifi_manager.set_current_network_metered(metered_type) + def _edit_tethering_password(self): def update_password(result): if result != 1: