home
This commit is contained in:
@@ -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() }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ class HomeViewModel : ViewModel() {
|
||||
_isScanning.value = true
|
||||
}
|
||||
|
||||
private fun stopScanning() {
|
||||
fun stopScanning() {
|
||||
_isScanning.value = false
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user