0
0
mirror of https://github.com/mueller-ma/PrepaidBalance.git synced 2024-09-19 16:02:14 +02:00

Export data as CSV

A file called `prepaid-balance-<timestamp>.csv` will be created in the
downloads folder when the action bar icon is pressed.

Fixes #156
This commit is contained in:
mueller-ma 2022-11-17 08:23:46 +01:00
parent 50c451d2af
commit 04efe502d6
4 changed files with 65 additions and 0 deletions

View File

@ -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()")

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM19,5v3H5V5H19zM19,10v4H5v-4H19zM5,19v-3h14v3H5z"/>
</vector>

View File

@ -1,6 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/export"
android:title="@string/export"
app:showAsAction="ifRoom"
android:icon="@drawable/ic_outline_table_rows_24"
app:iconTint="?android:textColorSecondary" />
<item
android:id="@+id/preferences"
android:title="@string/preferences"

View File

@ -48,6 +48,13 @@
<string name="close">Close</string>
<string name="no_response_saved">No response saved</string>
<!-- Export as CSV -->
<string name="export">Export as CSV</string>
<string name="export_saved_file">Exported as \"%s\" to downloads folder</string>
<string name="export_error_saving_file">Export failed</string>
<string name="export_csv_header_balance">Balance</string>
<string name="export_csv_header_data">Date</string>
<!-- About menu -->
<string name="about">About Prepaid Balance</string>
<string name="error_no_browser_found">No browser found</string>