diff --git a/src/seedsigner/gui/screens/seed_screens.py b/src/seedsigner/gui/screens/seed_screens.py index 89e42daa..c552a377 100644 --- a/src/seedsigner/gui/screens/seed_screens.py +++ b/src/seedsigner/gui/screens/seed_screens.py @@ -844,17 +844,18 @@ class SeedAddPassphraseScreen(BaseTopNavScreen): keyboard_swap = False # Check our two possible exit conditions + # TODO: note the unusual return value, consider refactoring to a Response object in the future if input == HardwareButtonsConstants.KEY3: # Save! # First light up key3 self.hw_button3.is_selected = True self.hw_button3.render() self.renderer.show_image() - return self.passphrase + return dict(passphrase=self.passphrase) elif input == HardwareButtonsConstants.KEY_PRESS and self.top_nav.is_selected: # Back button clicked - return self.top_nav.selected_button + return dict(passphrase=self.passphrase, is_back_button=True) # Check for keyboard swaps if input == HardwareButtonsConstants.KEY1: diff --git a/src/seedsigner/views/seed_views.py b/src/seedsigner/views/seed_views.py index 215af14f..c4fbc4ed 100644 --- a/src/seedsigner/views/seed_views.py +++ b/src/seedsigner/views/seed_views.py @@ -355,20 +355,55 @@ class SeedAddPassphraseView(View): def run(self): passphrase_title=self.seed.passphrase_label - ret = self.run_screen(seed_screens.SeedAddPassphraseScreen, passphrase=self.seed.passphrase, title=passphrase_title) + ret_dict = self.run_screen(seed_screens.SeedAddPassphraseScreen, passphrase=self.seed.passphrase, title=passphrase_title) - if ret == RET_CODE__BACK_BUTTON: - return Destination(BackStackView) - # The new passphrase will be the return value; it might be empty. - self.seed.set_passphrase(ret) - if len(self.seed.passphrase) > 0: + self.seed.set_passphrase(ret_dict["passphrase"]) + + if "is_back_button" in ret_dict: + if len(self.seed.passphrase) > 0: + return Destination(SeedAddPassphraseExitDialogView) + else: + return Destination(BackStackView) + + elif len(self.seed.passphrase) > 0: return Destination(SeedReviewPassphraseView) + else: return Destination(SeedFinalizeView) +class SeedAddPassphraseExitDialogView(View): + EDIT = "Edit passphrase" + DISCARD = ("Discard passphrase", None, None, "red") + + def __init__(self): + super().__init__() + self.seed = self.controller.storage.get_pending_seed() + + + def run(self): + button_data = [self.EDIT, self.DISCARD] + + selected_menu_num = self.run_screen( + WarningScreen, + title="Discard passphrase?", + status_headline=None, + text=f"Your current passphrase entry will be erased", + show_back_button=False, + button_data=button_data, + ) + + if button_data[selected_menu_num] == self.EDIT: + return Destination(SeedAddPassphraseView) + + elif button_data[selected_menu_num] == self.DISCARD: + self.seed.set_passphrase("") + return Destination(SeedFinalizeView) + + + class SeedReviewPassphraseView(View): """ Display the completed passphrase back to the user. diff --git a/tests/screenshot_generator/generator.py b/tests/screenshot_generator/generator.py index a0160bed..810e5d6f 100644 --- a/tests/screenshot_generator/generator.py +++ b/tests/screenshot_generator/generator.py @@ -166,6 +166,7 @@ def test_generate_screenshots(target_locale): seed_views.SeedMnemonicInvalidView, seed_views.SeedFinalizeView, seed_views.SeedAddPassphraseView, + seed_views.SeedAddPassphraseExitDialogView, seed_views.SeedReviewPassphraseView, (seed_views.SeedOptionsView, dict(seed_num=0)), diff --git a/tests/test_flows_psbt.py b/tests/test_flows_psbt.py index fb8ac87c..c328fe24 100644 --- a/tests/test_flows_psbt.py +++ b/tests/test_flows_psbt.py @@ -82,7 +82,7 @@ class TestPSBTFlows(FlowTest): FlowStep(psbt_views.PSBTSelectSeedView, button_data_selection=psbt_views.PSBTSelectSeedView.SCAN_SEED), FlowStep(scan_views.ScanSeedQRView, before_run=load_seed_into_decoder), FlowStep(seed_views.SeedFinalizeView, button_data_selection=SettingsConstants.LABEL__BIP39_PASSPHRASE), - FlowStep(seed_views.SeedAddPassphraseView, screen_return_value="abc"), + FlowStep(seed_views.SeedAddPassphraseView, screen_return_value=dict(passphrase="abc")), FlowStep(seed_views.SeedReviewPassphraseView, button_data_selection=seed_views.SeedReviewPassphraseView.DONE), FlowStep(seed_views.SeedOptionsView, is_redirect=True), FlowStep(psbt_views.PSBTOverviewView), diff --git a/tests/test_flows_seed.py b/tests/test_flows_seed.py index 84b18eb8..63230319 100644 --- a/tests/test_flows_seed.py +++ b/tests/test_flows_seed.py @@ -41,9 +41,14 @@ class TestSeedFlows(FlowTest): FlowStep(MainMenuView, button_data_selection=MainMenuView.SCAN), FlowStep(scan_views.ScanView, before_run=load_seed_into_decoder), # simulate read SeedQR; ret val is ignored FlowStep(seed_views.SeedFinalizeView, button_data_selection=SettingsConstants.LABEL__BIP39_PASSPHRASE), - FlowStep(seed_views.SeedAddPassphraseView, screen_return_value="muhpassphrase"), + FlowStep(seed_views.SeedAddPassphraseView, screen_return_value=dict(passphrase="muhpassphrase", is_back_button=True)), + FlowStep(seed_views.SeedAddPassphraseExitDialogView, button_data_selection=seed_views.SeedAddPassphraseExitDialogView.DISCARD), + FlowStep(seed_views.SeedFinalizeView, button_data_selection=SettingsConstants.LABEL__BIP39_PASSPHRASE), + FlowStep(seed_views.SeedAddPassphraseView, screen_return_value=dict(passphrase="muhpassphrase", is_back_button=True)), + FlowStep(seed_views.SeedAddPassphraseExitDialogView, button_data_selection=seed_views.SeedAddPassphraseExitDialogView.EDIT), + FlowStep(seed_views.SeedAddPassphraseView, screen_return_value=dict(passphrase="muhpassphrase")), FlowStep(seed_views.SeedReviewPassphraseView, button_data_selection=seed_views.SeedReviewPassphraseView.EDIT), - FlowStep(seed_views.SeedAddPassphraseView, screen_return_value="muhpassphrase2"), + FlowStep(seed_views.SeedAddPassphraseView, screen_return_value=dict(passphrase="muhpassphrase")), FlowStep(seed_views.SeedReviewPassphraseView, button_data_selection=seed_views.SeedReviewPassphraseView.DONE), FlowStep(seed_views.SeedOptionsView), ]) diff --git a/tests/test_flows_tools.py b/tests/test_flows_tools.py index 555142ba..38d8325c 100644 --- a/tests/test_flows_tools.py +++ b/tests/test_flows_tools.py @@ -65,7 +65,7 @@ class TestToolsFlows(FlowTest): self.run_sequence( sequence=[ FlowStep(seed_views.SeedFinalizeView, button_data_selection=SettingsConstants.LABEL__BIP39_PASSPHRASE), - FlowStep(seed_views.SeedAddPassphraseView, screen_return_value="mypassphrase"), + FlowStep(seed_views.SeedAddPassphraseView, screen_return_value=dict(passphrase="mypassphrase")), FlowStep(seed_views.SeedReviewPassphraseView, button_data_selection=seed_views.SeedReviewPassphraseView.DONE), FlowStep(seed_views.SeedOptionsView, is_redirect=True), FlowStep(seed_views.SeedExportXpubScriptTypeView),