feat: Request external storage permission on recording start if not granted already

This commit is contained in:
Myzel394 2024-01-04 21:39:59 +01:00
parent fc9e6d7721
commit b1fc546f3b
No known key found for this signature in database
GPG Key ID: 79CC92F37B3E1A2B
2 changed files with 120 additions and 81 deletions

View File

@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.InsertDriveFile
import androidx.compose.material.icons.filled.Mic import androidx.compose.material.icons.filled.Mic
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ButtonDefaults
@ -29,8 +30,10 @@ import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import app.myzel394.alibi.R import app.myzel394.alibi.R
import app.myzel394.alibi.db.AppSettings import app.myzel394.alibi.db.AppSettings
import app.myzel394.alibi.ui.SUPPORTS_SCOPED_STORAGE
import app.myzel394.alibi.ui.components.atoms.PermissionRequester import app.myzel394.alibi.ui.components.atoms.PermissionRequester
import app.myzel394.alibi.ui.models.AudioRecorderModel import app.myzel394.alibi.ui.models.AudioRecorderModel
import app.myzel394.alibi.ui.utils.PermissionHelper
@Composable @Composable
fun AudioRecordingStart( fun AudioRecordingStart(
@ -52,16 +55,31 @@ fun AudioRecordingStart(
} }
PermissionRequester( PermissionRequester(
permission = Manifest.permission.RECORD_AUDIO, permission = Manifest.permission.WRITE_EXTERNAL_STORAGE,
icon = Icons.Default.Mic, icon = Icons.Default.InsertDriveFile,
onPermissionAvailable = { onPermissionAvailable = {
startRecording = true startRecording = true
} }
) { trigger -> ) { triggerExternalStorage ->
PermissionRequester(
permission = Manifest.permission.RECORD_AUDIO,
icon = Icons.Default.Mic,
onPermissionAvailable = {
if (!SUPPORTS_SCOPED_STORAGE && !PermissionHelper.hasGranted(
context,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
) {
triggerExternalStorage()
} else {
startRecording = true
}
}
) { triggerRecordAudio ->
val label = stringResource(R.string.ui_audioRecorder_action_start_label) val label = stringResource(R.string.ui_audioRecorder_action_start_label)
Button( Button(
onClick = trigger, onClick = triggerRecordAudio,
modifier = Modifier modifier = Modifier
.semantics { .semantics {
contentDescription = label contentDescription = label
@ -88,3 +106,4 @@ fun AudioRecordingStart(
} }
} }
} }
}

View File

@ -19,6 +19,7 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.CameraAlt import androidx.compose.material.icons.filled.CameraAlt
import androidx.compose.material.icons.filled.InsertDriveFile
import androidx.compose.material.ripple.rememberRipple import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ButtonDefaults
@ -44,6 +45,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel
import app.myzel394.alibi.R import app.myzel394.alibi.R
import app.myzel394.alibi.db.AppSettings import app.myzel394.alibi.db.AppSettings
import app.myzel394.alibi.ui.BIG_PRIMARY_BUTTON_SIZE import app.myzel394.alibi.ui.BIG_PRIMARY_BUTTON_SIZE
import app.myzel394.alibi.ui.SUPPORTS_SCOPED_STORAGE
import app.myzel394.alibi.ui.components.atoms.PermissionRequester import app.myzel394.alibi.ui.components.atoms.PermissionRequester
import app.myzel394.alibi.ui.models.VideoRecorderModel import app.myzel394.alibi.ui.models.VideoRecorderModel
import app.myzel394.alibi.ui.utils.PermissionHelper import app.myzel394.alibi.ui.utils.PermissionHelper
@ -78,13 +80,25 @@ fun VideoRecordingStart(
) )
} }
val hasGrantedStorage = SUPPORTS_SCOPED_STORAGE || PermissionHelper.hasGranted(
context,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
PermissionRequester(
permission = Manifest.permission.WRITE_EXTERNAL_STORAGE,
icon = Icons.Default.InsertDriveFile,
onPermissionAvailable = {
showSheet = true
}
) { triggerExternalStorage ->
PermissionRequester( PermissionRequester(
permission = Manifest.permission.CAMERA, permission = Manifest.permission.CAMERA,
icon = Icons.Default.CameraAlt, icon = Icons.Default.CameraAlt,
onPermissionAvailable = { onPermissionAvailable = {
showSheet = true showSheet = true
}, },
) { trigger -> ) { triggerCamera ->
val label = stringResource(R.string.ui_videoRecorder_action_start_label) val label = stringResource(R.string.ui_videoRecorder_action_start_label)
Column( Column(
@ -98,6 +112,11 @@ fun VideoRecordingStart(
interactionSource = remember { MutableInteractionSource() }, interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple(color = MaterialTheme.colorScheme.primary), indication = rememberRipple(color = MaterialTheme.colorScheme.primary),
onClick = { onClick = {
if (!hasGrantedStorage) {
triggerExternalStorage()
return@combinedClickable
}
if (PermissionHelper.hasGranted( if (PermissionHelper.hasGranted(
context, context,
Manifest.permission.CAMERA Manifest.permission.CAMERA
@ -140,3 +159,4 @@ fun VideoRecordingStart(
} }
} }
} }
}