Skip to content

Commit 0f77864

Browse files
committed
Request storage permission to save PDF on Android <= 9
1 parent b03af50 commit 0f77864

File tree

6 files changed

+41
-2
lines changed

6 files changed

+41
-2
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
/.idea/navEditor.xml
99
/.idea/assetWizardSettings.xml
1010
/.idea/androidTestResultsUserPreferences.xml
11+
/.idea/deviceManager.xml
12+
/.idea/deploymentTargetSelector.xml
1113
.DS_Store
1214
/build
1315
/captures

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
android:required="false" />
88
<uses-permission android:name="android.permission.CAMERA" />
99
<!-- Required (on Android 9 and lower) to save files -->
10-
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
10+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>
1111

1212
<application
1313
android:allowBackup="true"

app/src/main/java/org/fairscan/app/MainActivity.kt

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,28 @@
1414
*/
1515
package org.fairscan.app
1616

17+
import android.Manifest
1718
import android.content.ActivityNotFoundException
1819
import android.content.Intent
1920
import android.content.pm.PackageManager
21+
import android.content.pm.PackageManager.PERMISSION_GRANTED
2022
import android.media.MediaScannerConnection
2123
import android.net.Uri
24+
import android.os.Build.VERSION.SDK_INT
25+
import android.os.Build.VERSION_CODES.Q
2226
import android.os.Bundle
2327
import android.util.Log
2428
import android.widget.Toast
2529
import androidx.activity.ComponentActivity
30+
import androidx.activity.compose.ManagedActivityResultLauncher
31+
import androidx.activity.compose.rememberLauncherForActivityResult
2632
import androidx.activity.compose.setContent
2733
import androidx.activity.enableEdgeToEdge
34+
import androidx.activity.result.contract.ActivityResultContracts
2835
import androidx.activity.viewModels
2936
import androidx.compose.runtime.getValue
37+
import androidx.compose.ui.platform.LocalContext
38+
import androidx.core.content.ContextCompat.checkSelfPermission
3039
import androidx.core.content.FileProvider
3140
import androidx.core.net.toFile
3241
import androidx.core.net.toUri
@@ -59,10 +68,22 @@ class MainActivity : ComponentActivity() {
5968
}
6069
enableEdgeToEdge()
6170
setContent {
71+
val context = LocalContext.current
6272
val currentScreen by viewModel.currentScreen.collectAsStateWithLifecycle()
6373
val liveAnalysisState by viewModel.liveAnalysisState.collectAsStateWithLifecycle()
6474
val document by viewModel.documentUiModel.collectAsStateWithLifecycle()
6575
val cameraPermission = rememberCameraPermissionState()
76+
val savePdf = { savePdf(viewModel.getFinalPdf(), viewModel) }
77+
val storagePermissionLauncher = rememberLauncherForActivityResult(
78+
ActivityResultContracts.RequestPermission()
79+
) { isGranted ->
80+
if (isGranted) {
81+
savePdf()
82+
} else {
83+
val message = getString(R.string.storage_permission_denied)
84+
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
85+
}
86+
}
6687
MyScanTheme {
6788
val navigation = Navigation(
6889
toHomeScreen = { viewModel.navigateTo(Screen.Main.Home) },
@@ -112,7 +133,7 @@ class MainActivity : ComponentActivity() {
112133
setFilename = viewModel::setFilename,
113134
uiStateFlow = viewModel.pdfUiState,
114135
sharePdf = { sharePdf(viewModel.getFinalPdf(), viewModel) },
115-
savePdf = { savePdf(viewModel.getFinalPdf(), viewModel) },
136+
savePdf = { checkPermissionThen(storagePermissionLauncher, savePdf) },
116137
openPdf = { openPdf(viewModel.pdfUiState.value.savedFileUri) }
117138
),
118139
onCloseScan = {
@@ -154,6 +175,19 @@ class MainActivity : ComponentActivity() {
154175
startActivity(chooser)
155176
}
156177

178+
private fun checkPermissionThen(
179+
requestPermissionLauncher: ManagedActivityResultLauncher<String, Boolean>,
180+
action: () -> Unit
181+
) {
182+
val permission = Manifest.permission.WRITE_EXTERNAL_STORAGE
183+
if (SDK_INT < Q && checkSelfPermission(this, permission) != PERMISSION_GRANTED
184+
) {
185+
requestPermissionLauncher.launch(permission)
186+
} else {
187+
action()
188+
}
189+
}
190+
157191
private fun savePdf(generatedPdf: GeneratedPdf?, viewModel: MainViewModel) {
158192
if (generatedPdf == null)
159193
return

app/src/main/res/values-de/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
<string name="scan_in_progress">Scan läuft</string>
4242
<string name="share">Teilen</string>
4343
<string name="share_pdf">PDF teilen</string>
44+
<string name="storage_permission_denied">PDF-Datei kann nicht gespeichert werden: Berechtigung verweigert</string>
4445
<string name="unknown_size">Unbekannte Größe</string>
4546
<string name="version">Version</string>
4647
<string name="view_the_full_license">Vollständige Lizenz anzeigen</string>

app/src/main/res/values-fr/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
<string name="scan_in_progress">Scan en cours</string>
4242
<string name="share">Partager</string>
4343
<string name="share_pdf">Partager le PDF</string>
44+
<string name="storage_permission_denied">Impossible d’enregistrer le fichier PDF : permission refusée</string>
4445
<string name="unknown_size">Taille inconnue</string>
4546
<string name="version">Version</string>
4647
<string name="view_the_full_license">Voir la licence complète</string>

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
<string name="scan_in_progress">Scan in progress</string>
4343
<string name="share">Share</string>
4444
<string name="share_pdf">Share PDF</string>
45+
<string name="storage_permission_denied">Cannot save PDF file: permission was denied</string>
4546
<string name="unknown_size">Unknown size</string>
4647
<string name="version">Version</string>
4748
<string name="view_the_full_license">View the full license</string>

0 commit comments

Comments
 (0)