Fix permission request issue

This commit is contained in:
2021-09-07 12:39:28 +02:00
parent abb21c994f
commit 6f56d8bf07
10 changed files with 17051 additions and 13 deletions
+1
View File
@@ -102,6 +102,7 @@ dependencies {
implementation(Libs.accompanist_pager)
implementation(Libs.accompanist_glide)
implementation(Libs.accompanist_pager_indicators)
implementation(Libs.accompanist_permissions)
implementation(Libs.accompanist_placeholder)
implementation(Libs.accompanist_navigation_animation)
@@ -9,12 +9,15 @@ import androidx.compose.material.Surface
import com.ericampire.android.androidstudycase.presentation.screen.main.ui.MainScreen
import com.ericampire.android.androidstudycase.presentation.theme.AndroidStudyCaseTheme
import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
@ExperimentalMaterialApi
@ExperimentalPagerApi
@ExperimentalPermissionsApi
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
@@ -10,6 +10,7 @@ import com.ericampire.android.androidstudycase.presentation.screen.login.ui.Logi
import com.ericampire.android.androidstudycase.presentation.screen.preview.ui.PreviewScreen
import com.ericampire.android.androidstudycase.util.Destination
import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.permissions.ExperimentalPermissionsApi
@ExperimentalMaterialApi
fun NavGraphBuilder.addHomeScreen(navController: NavController) {
@@ -34,6 +35,7 @@ fun NavGraphBuilder.addLoginScreen(navController: NavController) {
}
}
@ExperimentalPermissionsApi
fun NavGraphBuilder.addPreviewScreen(navController: NavController) {
composable(Destination.Preview.route) {
PreviewScreen(navController = navController)
@@ -0,0 +1,28 @@
package com.ericampire.android.androidstudycase.presentation.custom
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.airbnb.lottie.compose.*
@Composable
fun LottieAnimationView(
modifier: Modifier = Modifier,
resId: Int
) {
val composition by rememberLottieComposition(
spec = LottieCompositionSpec.RawRes(resId)
)
val progress by animateLottieCompositionAsState(
composition = composition,
iterations = LottieConstants.IterateForever,
)
LottieAnimation(
modifier = modifier.padding(10.dp),
composition = composition,
progress = progress,
)
}
@@ -25,9 +25,12 @@ import com.ericampire.android.androidstudycase.util.Destination
import com.google.accompanist.insets.navigationBarsPadding
import com.google.accompanist.insets.statusBarsPadding
import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.permissions.ExperimentalPermissionsApi
@ExperimentalMaterialApi
@ExperimentalPagerApi
@ExperimentalPermissionsApi
@Composable
fun MainScreen() {
val navController = rememberNavController()
@@ -2,17 +2,32 @@ package com.ericampire.android.androidstudycase.presentation.screen.preview.ui
import android.view.LayoutInflater
import android.widget.Toast
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Button
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Scaffold
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.navigation.NavController
import com.budiyev.android.codescanner.CodeScanner
import com.budiyev.android.codescanner.CodeScannerView
import com.ericampire.android.androidstudycase.R
import com.ericampire.android.androidstudycase.presentation.custom.LottieAnimationView
import com.ericampire.android.androidstudycase.presentation.custom.LottiePreviewDialog
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.PermissionRequired
import com.google.accompanist.permissions.rememberPermissionState
@ExperimentalPermissionsApi
@Composable
fun PreviewScreen(navController: NavController) {
@@ -20,6 +35,12 @@ fun PreviewScreen(navController: NavController) {
var lottieFileUrl by remember { mutableStateOf("") }
val context = LocalContext.current
val cameraPermissionState = rememberPermissionState(android.Manifest.permission.CAMERA)
LaunchedEffect(true) {
cameraPermissionState.launchPermissionRequest()
}
DisposableEffect(true) {
onDispose {
codeScanner?.stopPreview()
@@ -27,6 +48,7 @@ fun PreviewScreen(navController: NavController) {
}
Scaffold(
modifier = Modifier.fillMaxSize(),
content = {
if (lottieFileUrl.isNotEmpty()) {
LottiePreviewDialog(
@@ -40,19 +62,83 @@ fun PreviewScreen(navController: NavController) {
}
)
}
AndroidView(
factory = { context ->
val view = LayoutInflater.from(context).inflate(R.layout.code_scanner, null, false)
val scannerView = view.findViewById<CodeScannerView>(R.id.scanner_view)
codeScanner = CodeScanner(context, scannerView).apply {
startPreview()
}
codeScanner?.setDecodeCallback {
lottieFileUrl = it.text
}
view
PermissionRequired(
permissionState = cameraPermissionState,
permissionNotGrantedContent = {
PermissionNotAvailableContent(
descriptionMessage = stringResource(R.string.txt_camera_permssion_required),
onPermissionRequest = {
cameraPermissionState.launchPermissionRequest()
}
)
},
update = { }
permissionNotAvailableContent = {
PermissionNotAvailableContent(
descriptionMessage = stringResource(R.string.txt_permission_denied),
onPermissionRequest = {
cameraPermissionState.launchPermissionRequest()
}
)
},
content = {
AndroidView(
factory = { context ->
val view = LayoutInflater.from(context).inflate(R.layout.code_scanner, null, false)
val scannerView = view.findViewById<CodeScannerView>(R.id.scanner_view)
codeScanner = CodeScanner(context, scannerView).apply {
startPreview()
}
codeScanner?.setDecodeCallback {
lottieFileUrl = it.text
}
view
},
update = { }
)
}
)
}
)
}
@Composable
fun PermissionNotAvailableContent(
descriptionMessage: String,
onPermissionRequest: () -> Unit
) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center,
content = {
Column(
modifier = Modifier.padding(16.dp),
verticalArrangement = Arrangement.spacedBy(16.dp),
horizontalAlignment = Alignment.CenterHorizontally,
content = {
LottieAnimationView(
modifier = Modifier.size(200.dp),
resId = R.raw.camera_moving
)
Text(
modifier = Modifier.padding(horizontal = 16.dp),
text = descriptionMessage,
textAlign = TextAlign.Center
)
Spacer(modifier = Modifier.height(8.dp))
Button(
modifier = Modifier
.width(200.dp)
.height(50.dp),
shape = RoundedCornerShape(32.dp),
onClick = onPermissionRequest,
content = {
Text(
text = stringResource(R.string.txt_request),
style = MaterialTheme.typography.h6
)
}
)
}
)
}
)
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+2
View File
@@ -1,3 +1,5 @@
<resources>
<string name="txt_featured_animation">Featured Animations</string>
<string name="txt_open_setting">Open Settings</string>
<string name="txt_request">Request permission</string>
</resources>