tandroid: handle on-chain/lightning URI on app open - electrum - Electrum Bitcoin wallet
 (HTM) git clone https://git.parazyd.org/electrum
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
       ---
 (DIR) commit c66c54a254dd81dfd5526536aa4067c5a67dc8b6
 (DIR) parent f1d54d3cd8ba4784cad6ed957db6226a0a63b2ad
 (HTM) Author: SomberNight <somber.night@protonmail.com>
       Date:   Wed,  8 Jul 2020 04:16:30 +0200
       
       android: handle on-chain/lightning URI on app open
       
       fixes #6352
       
       Diffstat:
         M electrum/gui/kivy/main_window.py    |      31 ++++++++++++++++++++++++++-----
         M electrum/gui/kivy/uix/screens.py    |       7 +------
         M electrum/gui/qt/request_list.py     |       2 +-
       
       3 files changed, 28 insertions(+), 12 deletions(-)
       ---
 (DIR) diff --git a/electrum/gui/kivy/main_window.py b/electrum/gui/kivy/main_window.py
       t@@ -201,11 +201,31 @@ class ElectrumWindow(App):
                self.send_screen.set_ln_invoice(invoice)
        
            def on_new_intent(self, intent):
       -        data = intent.getDataString()
       -        if intent.getScheme() == 'bitcoin':
       -            self.set_URI(data)
       -        elif intent.getScheme() == 'lightning':
       -            self.set_ln_invoice(data)
       +        data = str(intent.getDataString())
       +        if str(intent.getScheme()).lower() in ('bitcoin', 'lightning'):
       +            self._process_invoice_str(data)
       +
       +    _invoice_intent_queued = None  # type: Optional[str]
       +    def _process_invoice_str(self, invoice: str) -> None:
       +        if not self.wallet:
       +            self._invoice_intent_queued = invoice
       +            return
       +        if not self.send_screen:
       +            self.switch_to('send')
       +            self._invoice_intent_queued = invoice
       +            return
       +        if invoice.lower().startswith('bitcoin:'):
       +            self.set_URI(invoice)
       +        elif invoice.lower().startswith('lightning:'):
       +            self.set_ln_invoice(invoice)
       +
       +    def _maybe_process_queued_invoice(self, *dt):
       +        if not self.wallet:
       +            return
       +        invoice_queued = self._invoice_intent_queued
       +        if invoice_queued:
       +            self._invoice_intent_queued = None
       +            self._process_invoice_str(invoice_queued)
        
            def on_language(self, instance, language):
                Logger.info('language: {}'.format(language))
       t@@ -377,6 +397,7 @@ class ElectrumWindow(App):
                self._trigger_update_interfaces = Clock.create_trigger(self.update_interfaces, .5)
        
                self._periodic_update_status_during_sync = Clock.schedule_interval(self.update_wallet_synchronizing_progress, .5)
       +        self._periodic_process_queued_invoice = Clock.schedule_interval(self._maybe_process_queued_invoice, .5)
        
                # cached dialogs
                self._settings_dialog = None
 (DIR) diff --git a/electrum/gui/kivy/uix/screens.py b/electrum/gui/kivy/uix/screens.py
       t@@ -177,12 +177,10 @@ class SendScreen(CScreen):
        
            kvname = 'send'
            payment_request = None  # type: Optional[PaymentRequest]
       -    payment_request_queued = None  # type: Optional[str]
            parsed_URI = None
        
            def set_URI(self, text: str):
                if not self.app.wallet:
       -            self.payment_request_queued = text
                    return
                try:
                    uri = parse_URI(text, self.app.on_pr, loop=self.app.asyncio_loop)
       t@@ -197,7 +195,7 @@ class SendScreen(CScreen):
                self.payment_request = None
                self.is_lightning = False
        
       -    def set_ln_invoice(self, invoice):
       +    def set_ln_invoice(self, invoice: str):
                try:
                    invoice = str(invoice).lower()
                    lnaddr = lndecode(invoice, expected_hrp=constants.net.SEGWIT_HRP)
       t@@ -213,9 +211,6 @@ class SendScreen(CScreen):
            def update(self):
                if self.app.wallet is None:
                    return
       -        if self.payment_request_queued:
       -            self.set_URI(self.payment_request_queued)
       -            self.payment_request_queued = None
                _list = self.app.wallet.get_invoices()
                _list.reverse()
                payments_container = self.ids.payments_container
 (DIR) diff --git a/electrum/gui/qt/request_list.py b/electrum/gui/qt/request_list.py
       t@@ -96,7 +96,7 @@ class RequestList(MyTreeView):
                    self.update()
                    return
                if req.is_lightning():
       -            self.parent.receive_payreq_e.setText(req.invoice)
       +            self.parent.receive_payreq_e.setText(req.invoice)  # TODO maybe prepend "lightning:" ??
                    self.parent.receive_address_e.setText(req.invoice)
                else:
                    self.parent.receive_payreq_e.setText(self.parent.wallet.get_request_URI(req))