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_pager)
implementation(Libs.accompanist_glide) implementation(Libs.accompanist_glide)
implementation(Libs.accompanist_pager_indicators) implementation(Libs.accompanist_pager_indicators)
implementation(Libs.accompanist_permissions)
implementation(Libs.accompanist_placeholder) implementation(Libs.accompanist_placeholder)
implementation(Libs.accompanist_navigation_animation) 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.screen.main.ui.MainScreen
import com.ericampire.android.androidstudycase.presentation.theme.AndroidStudyCaseTheme import com.ericampire.android.androidstudycase.presentation.theme.AndroidStudyCaseTheme
import com.google.accompanist.pager.ExperimentalPagerApi import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
@ExperimentalMaterialApi @ExperimentalMaterialApi
@ExperimentalPagerApi @ExperimentalPagerApi
@ExperimentalPermissionsApi
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContent { 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.presentation.screen.preview.ui.PreviewScreen
import com.ericampire.android.androidstudycase.util.Destination import com.ericampire.android.androidstudycase.util.Destination
import com.google.accompanist.pager.ExperimentalPagerApi import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.permissions.ExperimentalPermissionsApi
@ExperimentalMaterialApi @ExperimentalMaterialApi
fun NavGraphBuilder.addHomeScreen(navController: NavController) { fun NavGraphBuilder.addHomeScreen(navController: NavController) {
@@ -34,6 +35,7 @@ fun NavGraphBuilder.addLoginScreen(navController: NavController) {
} }
} }
@ExperimentalPermissionsApi
fun NavGraphBuilder.addPreviewScreen(navController: NavController) { fun NavGraphBuilder.addPreviewScreen(navController: NavController) {
composable(Destination.Preview.route) { composable(Destination.Preview.route) {
PreviewScreen(navController = navController) 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.navigationBarsPadding
import com.google.accompanist.insets.statusBarsPadding import com.google.accompanist.insets.statusBarsPadding
import com.google.accompanist.pager.ExperimentalPagerApi import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.permissions.ExperimentalPermissionsApi
@ExperimentalMaterialApi @ExperimentalMaterialApi
@ExperimentalPagerApi @ExperimentalPagerApi
@ExperimentalPermissionsApi
@Composable @Composable
fun MainScreen() { fun MainScreen() {
val navController = rememberNavController() val navController = rememberNavController()
@@ -2,17 +2,32 @@ package com.ericampire.android.androidstudycase.presentation.screen.preview.ui
import android.view.LayoutInflater import android.view.LayoutInflater
import android.widget.Toast 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.Scaffold
import androidx.compose.material.Text
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext 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.compose.ui.viewinterop.AndroidView
import androidx.navigation.NavController import androidx.navigation.NavController
import com.budiyev.android.codescanner.CodeScanner import com.budiyev.android.codescanner.CodeScanner
import com.budiyev.android.codescanner.CodeScannerView import com.budiyev.android.codescanner.CodeScannerView
import com.ericampire.android.androidstudycase.R import com.ericampire.android.androidstudycase.R
import com.ericampire.android.androidstudycase.presentation.custom.LottieAnimationView
import com.ericampire.android.androidstudycase.presentation.custom.LottiePreviewDialog 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 @Composable
fun PreviewScreen(navController: NavController) { fun PreviewScreen(navController: NavController) {
@@ -20,6 +35,12 @@ fun PreviewScreen(navController: NavController) {
var lottieFileUrl by remember { mutableStateOf("") } var lottieFileUrl by remember { mutableStateOf("") }
val context = LocalContext.current val context = LocalContext.current
val cameraPermissionState = rememberPermissionState(android.Manifest.permission.CAMERA)
LaunchedEffect(true) {
cameraPermissionState.launchPermissionRequest()
}
DisposableEffect(true) { DisposableEffect(true) {
onDispose { onDispose {
codeScanner?.stopPreview() codeScanner?.stopPreview()
@@ -27,6 +48,7 @@ fun PreviewScreen(navController: NavController) {
} }
Scaffold( Scaffold(
modifier = Modifier.fillMaxSize(),
content = { content = {
if (lottieFileUrl.isNotEmpty()) { if (lottieFileUrl.isNotEmpty()) {
LottiePreviewDialog( LottiePreviewDialog(
@@ -40,6 +62,25 @@ fun PreviewScreen(navController: NavController) {
} }
) )
} }
PermissionRequired(
permissionState = cameraPermissionState,
permissionNotGrantedContent = {
PermissionNotAvailableContent(
descriptionMessage = stringResource(R.string.txt_camera_permssion_required),
onPermissionRequest = {
cameraPermissionState.launchPermissionRequest()
}
)
},
permissionNotAvailableContent = {
PermissionNotAvailableContent(
descriptionMessage = stringResource(R.string.txt_permission_denied),
onPermissionRequest = {
cameraPermissionState.launchPermissionRequest()
}
)
},
content = {
AndroidView( AndroidView(
factory = { context -> factory = { context ->
val view = LayoutInflater.from(context).inflate(R.layout.code_scanner, null, false) val view = LayoutInflater.from(context).inflate(R.layout.code_scanner, null, false)
@@ -56,4 +97,49 @@ fun PreviewScreen(navController: NavController) {
) )
} }
) )
}
)
}
@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> <resources>
<string name="txt_featured_animation">Featured Animations</string> <string name="txt_featured_animation">Featured Animations</string>
<string name="txt_open_setting">Open Settings</string>
<string name="txt_request">Request permission</string>
</resources> </resources>
+6 -1
View File
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="txt_featured_animation">Featured Animations</string>
<string name="txt_open_setting">Open Settings</string>
<string name="app_name">Lottiefile App</string> <string name="app_name">Lottiefile App</string>
<string name="txt_home">Home</string> <string name="txt_home">Home</string>
<string name="txt_explore">Explore</string> <string name="txt_explore">Explore</string>
@@ -16,4 +17,8 @@
<string name="txt_hello_stranger">Hello Stranger</string> <string name="txt_hello_stranger">Hello Stranger</string>
<string name="txt_featured_animator">Featured Animators</string> <string name="txt_featured_animator">Featured Animators</string>
<string name="txt_latest_story">Latest Stories</string> <string name="txt_latest_story">Latest Stories</string>
<string name="txt_permission_not_available">Permission Not available</string>
<string name="txt_feature_not_available">Feature not available</string>
<string name="txt_camera_permssion_required">The camera is important for this app. Please grant the permission.</string>
<string name="txt_permission_denied">Camera permission denied. See this FAQ with information about why we need this permission. Please, grant us access on the Settings screen.</string>
</resources> </resources>