Browse Source

Merge pull request #9073 from accumulator/android_qr_scanner_fix

qml: don't unbind/unregister the ActivityResultListener from within the ActivityResultListener handler func
master
ghost43 2 years ago committed by GitHub
parent
commit
183bdd1464
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      electrum/gui/qml/components/main.qml
  2. 48
      electrum/gui/qml/qeqrscanner.py

2
electrum/gui/qml/components/main.qml

@ -413,7 +413,7 @@ ApplicationWindow
Component {
id: _scanDialog
QRScanner {
//onClosed: destroy()
onFinished: destroy()
}
}
Component {

48
electrum/gui/qml/qeqrscanner.py

@ -1,6 +1,6 @@
import os
from PyQt6.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject
from PyQt6.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, Qt
from PyQt6.QtGui import QGuiApplication
from electrum.util import send_exception_to_crash_reporter, UserFacingException
@ -10,7 +10,7 @@ from electrum.i18n import _
if 'ANDROID_DATA' in os.environ:
from jnius import autoclass, cast
from jnius import autoclass
from android import activity
jpythonActivity = autoclass('org.kivy.android.PythonActivity').mActivity
@ -23,10 +23,18 @@ class QEQRScanner(QObject):
found = pyqtSignal()
finished = pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
self._hint = _("Scan a QR code.")
self._scan_data = "" # decoded qr code result
self.finished.connect(self._unbind, Qt.ConnectionType.QueuedConnection)
self.destroyed.connect(lambda: self.on_destroy())
def on_destroy(self):
self._unbind()
@pyqtProperty(str)
def hint(self):
@ -49,34 +57,34 @@ class QEQRScanner(QObject):
if 'ANDROID_DATA' not in os.environ:
self._scan_qr_non_android()
return
SimpleScannerActivity = autoclass("org.electrum.qr.SimpleScannerActivity")
intent = jIntent(jpythonActivity, SimpleScannerActivity)
jSimpleScannerActivity = autoclass("org.electrum.qr.SimpleScannerActivity")
intent = jIntent(jpythonActivity, jSimpleScannerActivity)
intent.putExtra(jIntent.EXTRA_TEXT, jString(self._hint))
def on_qr_result(requestCode, resultCode, intent):
try:
if resultCode == -1: # RESULT_OK:
# this doesn't work due to some bug in jnius:
# contents = intent.getStringExtra("text")
contents = intent.getStringExtra(jString("text"))
#self._logger.info(f"on_qr_result. {contents=!r}")
self.scanData = contents
self.found.emit()
except Exception as e: # exc would otherwise get lost
send_exception_to_crash_reporter(e)
finally:
activity.unbind(on_activity_result=on_qr_result)
activity.bind(on_activity_result=on_qr_result)
activity.bind(on_activity_result=self.on_qr_activity_result)
jpythonActivity.startActivityForResult(intent, 0)
def on_qr_activity_result(self, requestCode, resultCode, intent):
try:
if resultCode == -1: # RESULT_OK:
contents = intent.getStringExtra(jString("text"))
self.scanData = contents
self.found.emit()
except Exception as e: # exc would otherwise get lost
send_exception_to_crash_reporter(e)
finally:
self.finished.emit()
@pyqtSlot()
def close(self):
pass
def _unbind(self):
if 'ANDROID_DATA' in os.environ:
activity.unbind(on_activity_result=self.on_qr_activity_result)
def _scan_qr_non_android(self):
data = QGuiApplication.clipboard().text()
self.scanData = data
self.found.emit()
self.finished.emit()
return
# from electrum import qrscanner
# from .qeapp import ElectrumQmlApplication

Loading…
Cancel
Save