1414 */
1515package org.mydomain.myscan
1616
17- import android.content.Context
1817import android.content.Intent
1918import android.media.MediaScannerConnection
19+ import android.net.Uri
2020import android.os.Bundle
2121import android.os.Environment
2222import android.util.Log
@@ -25,18 +25,15 @@ import androidx.activity.ComponentActivity
2525import androidx.activity.compose.setContent
2626import androidx.activity.enableEdgeToEdge
2727import androidx.activity.viewModels
28- import androidx.compose.foundation.layout.Column
2928import androidx.compose.runtime.getValue
30- import androidx.compose.ui.platform.LocalContext
3129import androidx.core.content.FileProvider
30+ import androidx.core.net.toFile
3231import androidx.lifecycle.compose.collectAsStateWithLifecycle
3332import org.mydomain.myscan.ui.theme.MyScanTheme
3433import org.mydomain.myscan.view.CameraScreen
3534import org.mydomain.myscan.view.DocumentScreen
3635import org.opencv.android.OpenCVLoader
3736import java.io.File
38- import java.io.FileOutputStream
39- import java.io.IOException
4037
4138class MainActivity : ComponentActivity () {
4239
@@ -49,7 +46,6 @@ class MainActivity : ComponentActivity() {
4946 val currentScreen by viewModel.currentScreen.collectAsStateWithLifecycle()
5047 val liveAnalysisState by viewModel.liveAnalysisState.collectAsStateWithLifecycle()
5148 val pageIds by viewModel.pageIds.collectAsStateWithLifecycle()
52- val context = LocalContext .current
5349 MyScanTheme {
5450 when (val screen = currentScreen) {
5551 is Screen .Camera -> {
@@ -66,8 +62,13 @@ class MainActivity : ComponentActivity() {
6662 initialPage = screen.initialPage,
6763 imageLoader = { id -> viewModel.getBitmap(id) },
6864 toCameraScreen = { viewModel.navigateTo(Screen .Camera ) },
69- onSavePressed = savePdf(viewModel, context),
70- onSharePressed = sharePdf(viewModel, context),
65+ // TODO Save and share files with the filename chosen by the user
66+ pdfActions = PdfGenerationActions (
67+ generatePdf = viewModel::generatePdf,
68+ onShare = { uri -> sharePdf(uri) },
69+ onSave = { uri -> savePdf(uri) },
70+ onOpen = { uri -> savePdf(uri) /* TODO Open */ }
71+ ),
7172 onStartNew = {
7273 viewModel.startNewDocument()
7374 viewModel.navigateTo(Screen .Camera ) },
@@ -79,57 +80,32 @@ class MainActivity : ComponentActivity() {
7980 }
8081 }
8182
82- private fun sharePdf (
83- viewModel : MainViewModel ,
84- context : Context
85- ): () -> Unit = {
86- val outputDir = File (cacheDir, " pdfs" ).apply { mkdirs() }
87- val outputFile = File (outputDir, " scan_${System .currentTimeMillis()} .pdf" )
88- var success = true
89- try {
90- val fileOutputStream = FileOutputStream (outputFile)
91- viewModel.createPdf(fileOutputStream)
92- } catch (_: IOException ) {
93- Toast .makeText(context, " Failed to share PDF" , Toast .LENGTH_SHORT ).show()
94- success = false
95- }
96- if (success) {
97- val uri = FileProvider .getUriForFile(
98- context,
99- " ${applicationContext.packageName} .fileprovider" ,
100- outputFile
101- )
102- val shareIntent = Intent (Intent .ACTION_SEND ).apply {
103- type = " application/pdf"
104- putExtra(Intent .EXTRA_STREAM , uri)
105- addFlags(Intent .FLAG_GRANT_READ_URI_PERMISSION )
106- }
107- startActivity(Intent .createChooser(shareIntent, " Share PDF" ))
83+ private fun sharePdf (fileUri : Uri ) {
84+ val fileUri = FileProvider .getUriForFile(
85+ this ,
86+ " ${applicationContext.packageName} .fileprovider" ,
87+ fileUri.toFile()
88+ )
89+ val shareIntent = Intent (Intent .ACTION_SEND ).apply {
90+ type = " application/pdf"
91+ putExtra(Intent .EXTRA_STREAM , fileUri)
92+ addFlags(Intent .FLAG_GRANT_READ_URI_PERMISSION )
10893 }
94+ startActivity(Intent .createChooser(shareIntent, " Share PDF" ))
10995 }
11096
111- private fun savePdf (
112- viewModel : MainViewModel ,
113- context : Context
114- ): () -> Unit = {
115- try {
116- val downloadsDir = Environment .getExternalStoragePublicDirectory(Environment .DIRECTORY_DOWNLOADS )
117- if (! downloadsDir.exists()) downloadsDir.mkdirs()
118- val file = File (downloadsDir, " scan_${System .currentTimeMillis()} .pdf" )
119- val outputStream = FileOutputStream (file)
120- viewModel.createPdf(outputStream)
121- outputStream.flush()
122- outputStream.close()
123-
124- MediaScannerConnection .scanFile(
125- context, arrayOf(file.absolutePath), arrayOf(" application/pdf" ), null
126- )
127-
128- Toast .makeText(context, " Saved PDF in Downloads" , Toast .LENGTH_SHORT ).show()
129- } catch (e: Exception ) {
130- Log .e(" MyScan" , " Failed to save PDF" , e)
131- Toast .makeText(context, " Failed to save PDF" , Toast .LENGTH_SHORT ).show()
97+ private fun savePdf (fileUri : Uri ) {
98+ val downloadsDir = Environment .getExternalStoragePublicDirectory(Environment .DIRECTORY_DOWNLOADS )
99+ if (! downloadsDir.exists()) {
100+ downloadsDir.mkdirs()
132101 }
102+ val generatedFile = fileUri.toFile()
103+ val targetFile = File (downloadsDir, generatedFile.name)
104+ generatedFile.copyTo(targetFile)
105+ MediaScannerConnection .scanFile(
106+ this , arrayOf(targetFile.absolutePath), arrayOf(" application/pdf" ), null
107+ )
108+ Toast .makeText(this , " Saved PDF in Downloads" , Toast .LENGTH_SHORT ).show()
133109 }
134110
135111 private fun initLibraries () {
0 commit comments