taler-android

Android apps for GNU Taler (wallet, PoS, cashier)
Log | Files | Refs | README | LICENSE

commit b9beb8d5ebe1b5cfaaf4d23bd5db81d7486c35b7
parent 0634c1e01481bd78fa0136c37150dc4f77dae135
Author: Iván Ávalos <avalos@disroot.org>
Date:   Thu, 26 Dec 2024 16:57:02 +0100

[wallet] fix crash when closing the app via back button and then relaunching

Diffstat:
Mwallet/build.gradle | 2+-
Mwallet/src/main/java/net/taler/wallet/MainActivity.kt | 3+++
Mwallet/src/main/java/net/taler/wallet/MainViewModel.kt | 8++++++++
Mwallet/src/main/java/net/taler/wallet/backend/BackendManager.kt | 21++++++++++++---------
Mwallet/src/main/java/net/taler/wallet/backend/WalletBackendApi.kt | 11+++++++++--
5 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/wallet/build.gradle b/wallet/build.gradle @@ -23,7 +23,7 @@ plugins { id "com.google.protobuf" version "0.9.4" } -def qtart_version = "0.14.0" +def qtart_version = "0.14.1" static def versionCodeEpoch() { return (new Date().getTime() / 1000).toInteger() diff --git a/wallet/src/main/java/net/taler/wallet/MainActivity.kt b/wallet/src/main/java/net/taler/wallet/MainActivity.kt @@ -92,6 +92,8 @@ class MainActivity : AppCompatActivity(), OnPreferenceStartFragmentCallback { } } + model.startWallet() + // TODO: refactor and unify progress bar handling // model.showProgressBar.observe(this) { show -> // ui.content.progressBar.visibility = if (show) VISIBLE else INVISIBLE @@ -262,5 +264,6 @@ class MainActivity : AppCompatActivity(), OnPreferenceStartFragmentCallback { override fun onDestroy() { super.onDestroy() TalerNfcService.clearUri(this) + model.stopWallet() } } diff --git a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt @@ -136,6 +136,14 @@ class MainViewModel( @set:Synchronized private var scanQrContext = ScanQrContext.Unknown + fun startWallet() { + api.startWallet() + } + + fun stopWallet() { + api.stopWallet() + } + override fun onVersionReceived(versionInfo: WalletCoreVersion) { walletVersion = versionInfo.implementationSemver walletVersionHash = versionInfo.implementationGitHash diff --git a/wallet/src/main/java/net/taler/wallet/backend/BackendManager.kt b/wallet/src/main/java/net/taler/wallet/backend/BackendManager.kt @@ -49,18 +49,21 @@ class BackendManager( private val requestManager = RequestManager() private val networkInterface = NetworkInterface() - init { - // TODO using Dagger/Hilt and @Singleton would be nice as well - if (initialized.getAndSet(true)) error("Already initialized") - walletCore.setMessageHandler { onMessageReceived(it) } - walletCore.setHttpClient(networkInterface) - if (BuildConfig.DEBUG) walletCore.setStdoutHandler { - Log.d(TAG_CORE, it) + fun run() { + if (!initialized.getAndSet(true)) { + walletCore.setMessageHandler { onMessageReceived(it) } + walletCore.setHttpClient(networkInterface) + if (BuildConfig.DEBUG) walletCore.setStdoutHandler { + Log.d(TAG_CORE, it) + } + walletCore.run() } } - fun run() { - walletCore.run() + fun destroy() { + if (initialized.getAndSet(false)) { + walletCore.destroy() + } } suspend fun send(operation: String, args: JSONObject? = null): ApiResponse = diff --git a/wallet/src/main/java/net/taler/wallet/backend/WalletBackendApi.kt b/wallet/src/main/java/net/taler/wallet/backend/WalletBackendApi.kt @@ -42,13 +42,20 @@ class WalletBackendApi( private val backendManager = BackendManager(notificationReceiver) - init { + fun startWallet() { + backendManager.run() GlobalScope.launch(Dispatchers.IO) { - backendManager.run() sendInitMessage() } } + fun stopWallet() { + GlobalScope.launch(Dispatchers.IO) { + sendRequest("shutdown") + backendManager.destroy() + } + } + private suspend fun sendInitMessage() { val db = if (File(app.filesDir, "talerwalletdb.sql").isFile) { // can be removed after a reasonable migration period (2024-02-02)