aboutsummaryrefslogtreecommitdiff
path: root/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt
diff options
context:
space:
mode:
Diffstat (limited to 'androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt')
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt63
1 files changed, 57 insertions, 6 deletions
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt
index 51d2f6d..08d7076 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt
@@ -22,12 +22,14 @@ import mx.trackermap.TrackerMap.android.R
import mx.trackermap.TrackerMap.android.databinding.UnitDetailsReportsBinding
import mx.trackermap.TrackerMap.android.details.UnitDetailsAdapter
import mx.trackermap.TrackerMap.android.map.MapWrapperFragment
+import mx.trackermap.TrackerMap.android.shared.FileCache
+import mx.trackermap.TrackerMap.android.shared.Utils
import mx.trackermap.TrackerMap.client.models.EventInformation
import mx.trackermap.TrackerMap.controllers.ReportController
import mx.trackermap.TrackerMap.utils.Formatter
import mx.trackermap.TrackerMap.utils.ReportDates
import org.koin.androidx.viewmodel.ext.android.viewModel
-import java.lang.Exception
+import java.io.*
import kotlin.math.max
import kotlin.time.ExperimentalTime
@@ -41,6 +43,13 @@ class UnitReportsFragment : Fragment() {
private val unitReportsViewModel: UnitReportsViewModel by viewModel()
private lateinit var mapFragment: MapWrapperFragment
+ private var reportFile: ReportController.Report.XlsxReport? = null
+ private var exportAction: UnitReportsViewModel.ExportAction? = null
+
+ private companion object {
+ const val XLSX_MIME_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+ }
+
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -104,6 +113,11 @@ class UnitReportsFragment : Fragment() {
showPeriodPopUp(it)
}
binding.exportButton.setOnClickListener {
+ exportAction = UnitReportsViewModel.ExportAction.ACTION_SAVE
+ unitReportsViewModel.fetchReportXlsx()
+ }
+ binding.shareButton.setOnClickListener {
+ exportAction = UnitReportsViewModel.ExportAction.ACTION_SHARE
unitReportsViewModel.fetchReportXlsx()
}
unitReportsViewModel.setReportPeriod(ReportDates.ReportPeriod.TODAY)
@@ -131,7 +145,12 @@ class UnitReportsFragment : Fragment() {
showMap(true)
}
is ReportController.Report.XlsxReport -> {
- downloadFile("report.xlsx")
+ reportFile = report
+ when (exportAction) {
+ UnitReportsViewModel.ExportAction.ACTION_SHARE -> shareFile()
+ UnitReportsViewModel.ExportAction.ACTION_SAVE -> saveFile()
+ else -> {}
+ }
}
is ReportController.Report.LoadingReport -> loading()
}
@@ -280,12 +299,12 @@ class UnitReportsFragment : Fragment() {
}
}
- private fun downloadFile(filename: String) {
+ private fun saveFile(filename: String = "reports.xlsx") {
val filesDir = requireContext().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
filesDir?.let {
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
- type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+ type = XLSX_MIME_TYPE
putExtra(Intent.EXTRA_TITLE, filename)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
putExtra(DocumentsContract.EXTRA_INITIAL_URI, filesDir)
@@ -295,10 +314,19 @@ class UnitReportsFragment : Fragment() {
}
}
+ private fun shareFile(filename: String = "reports.xlsx") {
+ context?.let { context ->
+ reportFile?.data?.let { data ->
+ val cacheFile = Utils.saveReportToCache(context, data, filename)
+ Utils.shareFile(context, cacheFile, XLSX_MIME_TYPE)
+ }
+ }
+ }
+
private val createDocumentResult =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == Activity.RESULT_OK) {
- (unitReportsViewModel.report.value as? ReportController.Report.XlsxReport)?.let { report ->
+ reportFile?.let { report ->
it?.data?.data?.also { uri ->
Log.d("UnitReportsFragment", "Downloading file into ${uri.path}")
val outputStream = context?.contentResolver?.openOutputStream(uri)
@@ -308,7 +336,23 @@ class UnitReportsFragment : Fragment() {
outputStream.flush()
outputStream.close()
Log.d("UnitReportsFragment", "Wrote file into ${uri.path}")
- } catch (e: Exception) {
+
+ activity?.let { context ->
+ // Copy file to cache so we can open it
+ val fc = FileCache(context)
+ fc.removeAll()
+ fc.cacheThis(listOf(uri))
+
+ val dir = File(context.cacheDir, "reports_tmp")
+ val files = dir.listFiles()
+ if (files?.isNotEmpty() == true) {
+ val intent =
+ Utils.openFileIntent(context, files[0], XLSX_MIME_TYPE)
+ openFileResult.launch(intent)
+ }
+ }
+
+ } catch (e: IOException) {
e.printStackTrace()
}
}
@@ -316,4 +360,11 @@ class UnitReportsFragment : Fragment() {
}
}
}
+
+ private val openFileResult =
+ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
+ if (it.resultCode == Activity.RESULT_OK) {
+ Log.d("UnitReportsFragment", "Opening file!")
+ }
+ }
} \ No newline at end of file