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 package `in`.sminnovations.attendanceapp.screens.home.ui
import android.Manifest 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.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue 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 androidx.lifecycle.viewmodel.compose.viewModel
import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.isGranted
import com.google.accompanist.permissions.rememberPermissionState import com.google.accompanist.permissions.rememberPermissionState
import `in`.sminnovations.attendanceapp.screens.home.ui.componets.DefaultScreen 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.QRCodeScannerScreen
import `in`.sminnovations.attendanceapp.screens.home.ui.componets.RequestPermissions import `in`.sminnovations.attendanceapp.screens.home.ui.componets.RequestPermissions
import `in`.sminnovations.attendanceapp.screens.home.viewModel.HomeViewModel import `in`.sminnovations.attendanceapp.screens.home.viewModel.HomeViewModel
@OptIn(ExperimentalPermissionsApi::class) @OptIn(ExperimentalPermissionsApi::class)
@Composable @Composable
fun Home(){ fun HomeScreen(viewModel: HomeViewModel = viewModel()) {
val viewModel: HomeViewModel = viewModel()
val isScanning by viewModel.isScanning.collectAsState() val isScanning by viewModel.isScanning.collectAsState()
val qrCodeValue by viewModel.qrCodeValue.collectAsState() val qrCodeValue by viewModel.qrCodeValue.collectAsState()
// Request permissions
val cameraPermissionState = rememberPermissionState(Manifest.permission.CAMERA) val cameraPermissionState = rememberPermissionState(Manifest.permission.CAMERA)
val locationPermissionState = rememberPermissionState(Manifest.permission.ACCESS_FINE_LOCATION) val locationPermissionState = rememberPermissionState(Manifest.permission.ACCESS_FINE_LOCATION)
// Function to check if all permissions are granted val allPermissionsGranted = remember {
val allPermissionsGranted = cameraPermissionState.status.isGranted && derivedStateOf {
locationPermissionState.status.isGranted 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() }
)
} }
}
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 _isScanning.value = true
} }
private fun stopScanning() { fun stopScanning() {
_isScanning.value = false _isScanning.value = false
} }