Fix permission request issue
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
+28
@@ -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,
|
||||||
|
)
|
||||||
|
}
|
||||||
+3
@@ -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()
|
||||||
|
|||||||
+86
@@ -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
@@ -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>
|
||||||
@@ -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>
|
||||||
Reference in New Issue
Block a user