From 654a224b527af0a0f8d257708de395bae8b0b45c Mon Sep 17 00:00:00 2001 From: orhoj Date: Mon, 4 Mar 2024 13:12:02 +0100 Subject: [PATCH 1/2] Graceful handling of export of transaction logs when there are none --- CHANGELOG.md | 1 + .../export/ExportTransactionLogActivity.kt | 1 + .../export/ExportTransactionLogViewModel.kt | 20 ++++++++++++++++--- .../activity_export_transaction_log.xml | 5 +++++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 25 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26f85aeb..73a9cf44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ - Exiting the wallet after accepting an identity verification error - Incorrect environment name in a private key export file for Mainnet - Improper handling of rejected identity verification when setting up a new wallet +- An issue where exporting transaction logs for an account without any transactions would be stuck at 0% ### Changed - Suggest running a recovery when facing account or identity creation errors diff --git a/app/src/main/java/com/concordium/wallet/ui/more/export/ExportTransactionLogActivity.kt b/app/src/main/java/com/concordium/wallet/ui/more/export/ExportTransactionLogActivity.kt index cef7d724..73aad80e 100644 --- a/app/src/main/java/com/concordium/wallet/ui/more/export/ExportTransactionLogActivity.kt +++ b/app/src/main/java/com/concordium/wallet/ui/more/export/ExportTransactionLogActivity.kt @@ -86,6 +86,7 @@ class ExportTransactionLogActivity : BaseActivity( binding.successLayout.isVisible = downloadState is FileDownloadScreenState.Downloaded binding.failedLayout.isVisible = downloadState is FileDownloadScreenState.Failed + binding.noContentLayout.isVisible = downloadState is FileDownloadScreenState.NoContent binding.generate.isVisible = downloadState is FileDownloadScreenState.Idle binding.cancel.isVisible = downloadState is FileDownloadScreenState.Downloading diff --git a/app/src/main/java/com/concordium/wallet/ui/more/export/ExportTransactionLogViewModel.kt b/app/src/main/java/com/concordium/wallet/ui/more/export/ExportTransactionLogViewModel.kt index bf859d6a..cd007b14 100644 --- a/app/src/main/java/com/concordium/wallet/ui/more/export/ExportTransactionLogViewModel.kt +++ b/app/src/main/java/com/concordium/wallet/ui/more/export/ExportTransactionLogViewModel.kt @@ -21,6 +21,7 @@ import kotlinx.coroutines.launch import okhttp3.OkHttpClient import okhttp3.ResponseBody import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Response import retrofit2.Retrofit import retrofit2.http.GET import retrofit2.http.Streaming @@ -31,7 +32,7 @@ import java.util.concurrent.TimeUnit interface FileDownloadApi { @Streaming @GET - suspend fun downloadFile(@Url url: String?): ResponseBody + suspend fun downloadFile(@Url url: String?): Response } sealed class FileDownloadScreenState { @@ -39,12 +40,16 @@ sealed class FileDownloadScreenState { data class Downloading(val progress: Int) : FileDownloadScreenState() object Failed : FileDownloadScreenState() object Downloaded : FileDownloadScreenState() + object NoContent : FileDownloadScreenState() } class ExportTransactionLogViewModel(application: Application) : AndroidViewModel(application) { lateinit var account: Account private lateinit var api: FileDownloadApi + val HTTP_OK = 200 + val HTTP_NO_CONTENT = 204 + val textResourceInt: MutableLiveData by lazy { MutableLiveData() } private sealed class DownloadState { @@ -78,8 +83,17 @@ class ExportTransactionLogViewModel(application: Application) : AndroidViewModel ) ) - api.downloadFile(downloadFile) - .saveFile(destinationFolder) + val response = api.downloadFile(downloadFile) + val statusCode = response.code() + if (statusCode == HTTP_NO_CONTENT) { + this@ExportTransactionLogViewModel.downloadState.postValue(FileDownloadScreenState.NoContent) + return@launch + } else if (statusCode != HTTP_OK || response.body() == null) { + this@ExportTransactionLogViewModel.downloadState.postValue(FileDownloadScreenState.Failed) + return@launch + } + + response.body()!!.saveFile(destinationFolder) .collect { downloadState -> // Add visual delay and ensure the coroutine is active. delay(300) diff --git a/app/src/main/res/layout/activity_export_transaction_log.xml b/app/src/main/res/layout/activity_export_transaction_log.xml index 5f1d124e..d63c36f4 100644 --- a/app/src/main/res/layout/activity_export_transaction_log.xml +++ b/app/src/main/res/layout/activity_export_transaction_log.xml @@ -100,6 +100,11 @@ style="@style/CryptoX_Container_Error.TextView" android:text="@string/export_transaction_log_failed" /> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bf451a8c..538f2a80 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1022,6 +1022,7 @@ Cancel The transaction logs have been saved Failed to download transaction logs + There are no transaction logs available for this account %1$d%% Downloading transaction logs… From f389e20474d4f9cef7b0b22209aef831ff321f40 Mon Sep 17 00:00:00 2001 From: orhoj Date: Mon, 4 Mar 2024 13:24:22 +0100 Subject: [PATCH 2/2] Stop setting state to idle when navigating back --- .../wallet/ui/more/export/ExportTransactionLogActivity.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/concordium/wallet/ui/more/export/ExportTransactionLogActivity.kt b/app/src/main/java/com/concordium/wallet/ui/more/export/ExportTransactionLogActivity.kt index 73aad80e..63ddb540 100644 --- a/app/src/main/java/com/concordium/wallet/ui/more/export/ExportTransactionLogActivity.kt +++ b/app/src/main/java/com/concordium/wallet/ui/more/export/ExportTransactionLogActivity.kt @@ -34,7 +34,6 @@ class ExportTransactionLogActivity : BaseActivity( viewModel.onIdleRequested() hideActionBarBack(isVisible = true) { - viewModel.onIdleRequested() finish() } }