mirror of
https://github.com/mueller-ma/PrepaidBalance.git
synced 2024-09-20 00:12:15 +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.Manifest.permission.READ_PHONE_STATE
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.os.Environment
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
import android.telephony.SubscriptionManager
|
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.room.AppDatabase
|
||||||
import com.github.muellerma.prepaidbalance.utils.hasPermissions
|
import com.github.muellerma.prepaidbalance.utils.hasPermissions
|
||||||
import com.github.muellerma.prepaidbalance.utils.prefs
|
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
|
||||||
import com.github.muellerma.prepaidbalance.work.CheckBalanceWorker.Companion.CheckResult
|
import com.github.muellerma.prepaidbalance.work.CheckBalanceWorker.Companion.CheckResult
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
|
||||||
class MainActivity : AbstractBaseActivity(), SwipeRefreshLayout.OnRefreshListener {
|
class MainActivity : AbstractBaseActivity(), SwipeRefreshLayout.OnRefreshListener {
|
||||||
@ -99,6 +103,10 @@ class MainActivity : AbstractBaseActivity(), SwipeRefreshLayout.OnRefreshListene
|
|||||||
}
|
}
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
R.id.export -> {
|
||||||
|
exportAsCsv()
|
||||||
|
true
|
||||||
|
}
|
||||||
android.R.id.home -> {
|
android.R.id.home -> {
|
||||||
onBackPressedDispatcher.onBackPressed()
|
onBackPressedDispatcher.onBackPressed()
|
||||||
true
|
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() {
|
override fun onRefresh() {
|
||||||
Log.d(TAG, "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"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
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
|
<item
|
||||||
android:id="@+id/preferences"
|
android:id="@+id/preferences"
|
||||||
android:title="@string/preferences"
|
android:title="@string/preferences"
|
||||||
|
@ -48,6 +48,13 @@
|
|||||||
<string name="close">Close</string>
|
<string name="close">Close</string>
|
||||||
<string name="no_response_saved">No response saved</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 -->
|
<!-- About menu -->
|
||||||
<string name="about">About Prepaid Balance</string>
|
<string name="about">About Prepaid Balance</string>
|
||||||
<string name="error_no_browser_found">No browser found</string>
|
<string name="error_no_browser_found">No browser found</string>
|
||||||
|
Loading…
Reference in New Issue
Block a user