Fix permission request issue
This commit is contained in:
@@ -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)
|
||||
|
||||
+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.statusBarsPadding
|
||||
import com.google.accompanist.pager.ExperimentalPagerApi
|
||||
import com.google.accompanist.permissions.ExperimentalPermissionsApi
|
||||
|
||||
@ExperimentalMaterialApi
|
||||
@ExperimentalPagerApi
|
||||
@ExperimentalPermissionsApi
|
||||
|
||||
@Composable
|
||||
fun MainScreen() {
|
||||
val navController = rememberNavController()
|
||||
|
||||
+98
-12
@@ -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
@@ -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>
|
||||
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<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="txt_home">Home</string>
|
||||
<string name="txt_explore">Explore</string>
|
||||
@@ -16,4 +17,8 @@
|
||||
<string name="txt_hello_stranger">Hello Stranger</string>
|
||||
<string name="txt_featured_animator">Featured Animators</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>
|
||||
Reference in New Issue
Block a user