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:
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)