This commit is contained in:
sathwikcs
2024-10-16 17:49:23 +05:30
parent 394074e0ce
commit 81e4351695
2 changed files with 73 additions and 23 deletions

View File

@@ -1,47 +1,97 @@
package `in`.sminnovations.attendanceapp.screens.home.ui
import android.Manifest
import androidx.compose.foundation.layout.Column
import androidx.activity.compose.BackHandler
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.expandVertically
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.shrinkVertically
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material3.Button
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.isGranted
import com.google.accompanist.permissions.rememberPermissionState
import `in`.sminnovations.attendanceapp.screens.home.ui.componets.DefaultScreen
import `in`.sminnovations.attendanceapp.screens.home.ui.componets.LargeButton
import `in`.sminnovations.attendanceapp.screens.home.ui.componets.QRCodeScannerScreen
import `in`.sminnovations.attendanceapp.screens.home.ui.componets.RequestPermissions
import `in`.sminnovations.attendanceapp.screens.home.viewModel.HomeViewModel
@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun Home(){
val viewModel: HomeViewModel = viewModel()
fun HomeScreen(viewModel: HomeViewModel = viewModel()) {
val isScanning by viewModel.isScanning.collectAsState()
val qrCodeValue by viewModel.qrCodeValue.collectAsState()
// Request permissions
val cameraPermissionState = rememberPermissionState(Manifest.permission.CAMERA)
val locationPermissionState = rememberPermissionState(Manifest.permission.ACCESS_FINE_LOCATION)
// Function to check if all permissions are granted
val allPermissionsGranted = cameraPermissionState.status.isGranted &&
locationPermissionState.status.isGranted
if (!allPermissionsGranted) {
RequestPermissions(
cameraPermissionState = cameraPermissionState,
locationPermissionState = locationPermissionState
)
} else if (isScanning) {
QRCodeScannerScreen(viewModel::setQRCodeValue)
} else {
DefaultScreen(
qrCodeValue = qrCodeValue,
onScanClick = { viewModel.startScanning() },
onRetryClick = { viewModel.startScanning() }
)
val allPermissionsGranted = remember {
derivedStateOf {
cameraPermissionState.status.isGranted && locationPermissionState.status.isGranted
}
}
}
Box(modifier = Modifier.fillMaxSize()) {
if (!allPermissionsGranted.value) {
RequestPermissions(
cameraPermissionState = cameraPermissionState,
locationPermissionState = locationPermissionState
)
} else {
DefaultScreen(qrCodeValue = qrCodeValue)
AnimatedVisibility(
visible = isScanning,
enter = expandVertically(expandFrom = Alignment.Bottom) + fadeIn(),
exit = shrinkVertically(shrinkTowards = Alignment.Bottom) + fadeOut()
) {
Box(modifier = Modifier.fillMaxSize()) {
QRCodeScannerScreen(viewModel::setQRCodeValue)
IconButton(
onClick = { viewModel.stopScanning() },
modifier = Modifier
.align(Alignment.TopStart)
.padding(16.dp)
) {
Icon(Icons.Default.ArrowBack, contentDescription = "Back")
}
}
}
}
LargeButton(
text = if (isScanning) "Close" else "Scan",
onClick = if (isScanning) {
{ viewModel.stopScanning() }
} else {
{ viewModel.startScanning() }
},
modifier = Modifier
.align(Alignment.BottomCenter)
.padding(bottom = 24.dp)
)
if (isScanning) {
BackHandler { viewModel.stopScanning() }
}
}
}

View File

@@ -19,7 +19,7 @@ class HomeViewModel : ViewModel() {
_isScanning.value = true
}
private fun stopScanning() {
fun stopScanning() {
_isScanning.value = false
}