From 04efe502d642c9354f622095a726ae9a52f6dad9 Mon Sep 17 00:00:00 2001 From: mueller-ma Date: Thu, 17 Nov 2022 08:23:46 +0100 Subject: [PATCH] Export data as CSV A file called `prepaid-balance-.csv` will be created in the downloads folder when the action bar icon is pressed. Fixes #156 --- .../prepaidbalance/ui/MainActivity.kt | 47 +++++++++++++++++++ .../res/drawable/ic_outline_table_rows_24.xml | 5 ++ app/src/main/res/menu/main_menu.xml | 6 +++ app/src/main/res/values/strings.xml | 7 +++ 4 files changed, 65 insertions(+) create mode 100644 app/src/main/res/drawable/ic_outline_table_rows_24.xml diff --git a/app/src/main/java/com/github/muellerma/prepaidbalance/ui/MainActivity.kt b/app/src/main/java/com/github/muellerma/prepaidbalance/ui/MainActivity.kt index e22d340..b4aacc8 100644 --- a/app/src/main/java/com/github/muellerma/prepaidbalance/ui/MainActivity.kt +++ b/app/src/main/java/com/github/muellerma/prepaidbalance/ui/MainActivity.kt @@ -4,7 +4,9 @@ import android.Manifest.permission.CALL_PHONE import android.Manifest.permission.READ_PHONE_STATE import android.annotation.SuppressLint import android.content.Intent +import android.net.Uri import android.os.Bundle +import android.os.Environment import android.os.Handler import android.os.Looper import android.telephony.SubscriptionManager @@ -23,10 +25,12 @@ import com.github.muellerma.prepaidbalance.databinding.ActivityMainBinding import com.github.muellerma.prepaidbalance.room.AppDatabase import com.github.muellerma.prepaidbalance.utils.hasPermissions import com.github.muellerma.prepaidbalance.utils.prefs +import com.github.muellerma.prepaidbalance.utils.timestampForUi import com.github.muellerma.prepaidbalance.work.CheckBalanceWorker import com.github.muellerma.prepaidbalance.work.CheckBalanceWorker.Companion.CheckResult import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.launch +import java.io.File class MainActivity : AbstractBaseActivity(), SwipeRefreshLayout.OnRefreshListener { @@ -99,6 +103,10 @@ class MainActivity : AbstractBaseActivity(), SwipeRefreshLayout.OnRefreshListene } true } + R.id.export -> { + exportAsCsv() + true + } android.R.id.home -> { onBackPressedDispatcher.onBackPressed() true @@ -107,6 +115,45 @@ class MainActivity : AbstractBaseActivity(), SwipeRefreshLayout.OnRefreshListene } } + private fun exportAsCsv() { + launch { + val content = buildCsv() + + try { + val filename = "prepaid-balance-${System.currentTimeMillis()}.csv" + writeToFileInDownloads(content, filename) + showSnackbar(getString(R.string.export_saved_file, filename)) + return@launch + } catch (e: Exception) { + Log.e(TAG, "Error saving file", e) + } + + showSnackbar(R.string.export_error_saving_file) + } + } + + private fun buildCsv(): String { + val entries = database.balanceDao().getAll() + val csv = StringBuilder() + csv.appendLine("${getString(R.string.export_csv_header_balance)};${getString(R.string.export_csv_header_data)}") + entries.forEach { + csv.appendLine("${it.balance};${it.timestamp.timestampForUi(this@MainActivity)}") + } + return csv.toString() + } + + private fun writeToFileInDownloads(content: String, fileName: String) { + val dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + dir.mkdirs() + val file = Uri.fromFile(File(dir, fileName)) + + contentResolver.openOutputStream(file)?.use { outputStream -> + outputStream.write(content.toByteArray()) + outputStream.flush() + outputStream.close() + } + } + override fun onRefresh() { Log.d(TAG, "onRefresh()") diff --git a/app/src/main/res/drawable/ic_outline_table_rows_24.xml b/app/src/main/res/drawable/ic_outline_table_rows_24.xml new file mode 100644 index 0000000..4e1007e --- /dev/null +++ b/app/src/main/res/drawable/ic_outline_table_rows_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml index 7349a84..e1d7f7c 100644 --- a/app/src/main/res/menu/main_menu.xml +++ b/app/src/main/res/menu/main_menu.xml @@ -1,6 +1,12 @@ + Close No response saved + + Export as CSV + Exported as \"%s\" to downloads folder + Export failed + Balance + Date + About Prepaid Balance No browser found