Enhancement for issue #546

Provides 3 microSD options:
- Toast disabled
- 5-sec toast (default)
- SD card removal required* (fullscreen dialog,
cannot proceed unless microSD is removed)

- "SD card removal required" option: warning view
shown instead of fullscreen toast so user can
disable this setting without removing SD card.
This commit is contained in:
alvroble
2025-10-24 19:41:44 +02:00
parent 3455aa4958
commit 385af5f4e0
4 changed files with 50 additions and 4 deletions
+6 -2
View File
@@ -11,6 +11,7 @@ from seedsigner.models.psbt_parser import PSBTParser
from seedsigner.models.seed import Seed
from seedsigner.models.seed_storage import SeedStorage
from seedsigner.models.settings import Settings
from seedsigner.models.settings import SettingsConstants
from seedsigner.models.singleton import Singleton
from seedsigner.models.threads import BaseThread
from seedsigner.views.screensaver import ScreensaverScreen
@@ -252,7 +253,7 @@ class Controller(Singleton):
* initial_destination: The first View to run. If None, the MainMenuView is
used. Only used by the test suite.
"""
from seedsigner.views import MainMenuView, BackStackView
from seedsigner.views import MainMenuView, BackStackView, RemoveMicroSDWarningView
from seedsigner.views.screensaver import OpeningSplashView
from seedsigner.gui.toast import RemoveSDCardToastManagerThread
@@ -290,7 +291,10 @@ class Controller(Singleton):
next_destination = Destination(MainMenuView)
# Set up our one-time toast notification tip to remove the SD card
self.activate_toast(RemoveSDCardToastManagerThread())
if self.settings.get_value(SettingsConstants.SETTING__MICROSD_TOAST_TIMER) == SettingsConstants.MICROSD_TOAST_TIMER_FIVE_SECONDS:
self.activate_toast(RemoveSDCardToastManagerThread())
elif self.settings.get_value(SettingsConstants.SETTING__MICROSD_TOAST_TIMER) == SettingsConstants.MICROSD_TOAST_TIMER_FOREVER:
next_destination = Destination(RemoveMicroSDWarningView)
while True:
# Destination(None) is a special case; render the Home screen
+2 -2
View File
@@ -201,11 +201,11 @@ class BaseToastOverlayManagerThread(BaseThread):
class RemoveSDCardToastManagerThread(BaseToastOverlayManagerThread):
def __init__(self, activation_delay: int = 3, duration: int = 1e6):
def __init__(self, activation_delay: int = 3, duration: int = 5):
"""
* activation_delay: configurable so the screenshot generator can get the
toast to immediately render.
* duration: default value is essentially forever. Overrideable for the
* duration: default value is 5 seconds. Overrideable for the
screenshot generator.
"""
super().__init__(
@@ -293,6 +293,15 @@ class SettingsConstants:
(CUSTOM_DERIVATION, _mft("Custom Derivation")),
]
MICROSD_TOAST_TIMER_DISABLED = "D"
MICROSD_TOAST_TIMER_FIVE_SECONDS = "E"
MICROSD_TOAST_TIMER_FOREVER = "inf"
ALL_MICROSD_TOAST_TIMERS = [
(MICROSD_TOAST_TIMER_DISABLED, "Disabled"),
(MICROSD_TOAST_TIMER_FIVE_SECONDS, "5 seconds"),
(MICROSD_TOAST_TIMER_FOREVER, "Until SD removed")
]
WORDLIST_LANGUAGE__ENGLISH = "en"
WORDLIST_LANGUAGE__CHINESE_SIMPLIFIED = "zh_Hans_CN"
WORDLIST_LANGUAGE__CHINESE_TRADITIONAL = "zh_Hant_TW"
@@ -339,6 +348,7 @@ class SettingsConstants:
SETTING__DIRE_WARNINGS = "dire_warnings"
SETTING__QR_BRIGHTNESS_TIPS = "qr_brightness_tips"
SETTING__PARTNER_LOGOS = "partner_logos"
SETTING__MICROSD_TOAST_TIMER = "microsd_toast_timer"
SETTING__DEBUG = "debug"
@@ -665,6 +675,14 @@ class SettingsDefinition:
help_text=_mft("Native Segwit only"),
visibility=SettingsConstants.VISIBILITY__ADVANCED,
default_value=SettingsConstants.OPTION__DISABLED),
SettingsEntry(category=SettingsConstants.CATEGORY__FEATURES,
attr_name=SettingsConstants.SETTING__MICROSD_TOAST_TIMER,
display_name="MicroSD toast timer",
type=SettingsConstants.TYPE__SELECT_1,
visibility=SettingsConstants.VISIBILITY__ADVANCED,
selection_options=SettingsConstants.ALL_MICROSD_TOAST_TIMERS,
default_value=SettingsConstants.MICROSD_TOAST_TIMER_FIVE_SECONDS),
SettingsEntry(category=SettingsConstants.CATEGORY__FEATURES,
attr_name=SettingsConstants.SETTING__MESSAGE_SIGNING,
+24
View File
@@ -407,3 +407,27 @@ class OptionDisabledView(View):
return Destination(SettingsEntryUpdateSelectionView, view_args=dict(attr_name=self.settings_attr), clear_history=True)
else:
return Destination(MainMenuView, clear_history=True)
class RemoveMicroSDWarningView(View):
CONTINUE = ButtonOption("Continue")
DISMISS = ButtonOption("Dismiss")
def run(self):
button_data = [self.CONTINUE, self.DISMISS]
selected_menu_num = self.run_screen(
WarningScreen,
title=_("Action Required"),
status_icon_name=SeedSignerIconConstants.MICROSD,
status_headline=None,
text=_("You must remove the\nMicroSD card to continue."),
show_back_button=False,
button_data=button_data,
)
from seedsigner.hardware.microsd import MicroSD
if button_data[selected_menu_num] == self.CONTINUE and MicroSD.get_instance().is_inserted:
return Destination(RemoveMicroSDWarningView, clear_history=True)
else:
return Destination(MainMenuView, clear_history=True)