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:
parent
50c451d2af
commit
04efe502d6
@ -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()")
|
||||
|
||||
|
5
app/src/main/res/drawable/ic_outline_table_rows_24.xml
Normal file
5
app/src/main/res/drawable/ic_outline_table_rows_24.xml
Normal 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>
|
@ -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"
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user