diff --git a/app/src/main/java/in/sminnovations/attendanceapp/screens/home/ui/home.kt b/app/src/main/java/in/sminnovations/attendanceapp/screens/home/ui/home.kt index d726f2f..436d88d 100644 --- a/app/src/main/java/in/sminnovations/attendanceapp/screens/home/ui/home.kt +++ b/app/src/main/java/in/sminnovations/attendanceapp/screens/home/ui/home.kt @@ -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 + } } -} \ No newline at end of file + + 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() } + } + } +} diff --git a/app/src/main/java/in/sminnovations/attendanceapp/screens/home/viewModel/homeVM.kt b/app/src/main/java/in/sminnovations/attendanceapp/screens/home/viewModel/homeVM.kt index 681182e..d7c91fa 100644 --- a/app/src/main/java/in/sminnovations/attendanceapp/screens/home/viewModel/homeVM.kt +++ b/app/src/main/java/in/sminnovations/attendanceapp/screens/home/viewModel/homeVM.kt @@ -19,7 +19,7 @@ class HomeViewModel : ViewModel() { _isScanning.value = true } - private fun stopScanning() { + fun stopScanning() { _isScanning.value = false }