diff options
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.kt | 63 |
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 |