From 7af0d0f6bd972c535fc1819d8b0f1c0c0eee5421 Mon Sep 17 00:00:00 2001 From: HamBP Date: Tue, 14 Jan 2025 00:45:10 +0900 Subject: [PATCH] =?UTF-8?q?fix=20:=20=EC=A0=84=ED=9B=84=EB=A9=B4=20?= =?UTF-8?q?=EC=B9=B4=EB=A9=94=EB=9D=BC=EA=B0=80=20=EB=91=98=20=EB=8B=A4=20?= =?UTF-8?q?=EC=9E=88=EC=9D=84=20=EA=B2=BD=EC=9A=B0=EC=97=90=EB=A7=8C=20?= =?UTF-8?q?=EC=B9=B4=EB=A9=94=EB=9D=BC=20=EB=B3=80=EA=B2=BD=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EC=BD=98=20=EB=85=B8=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boolti/presentation/QrScanActivity.kt | 8 +--- .../presentation/screen/qr/QrScanScreen.kt | 45 ++++++++++++++++--- 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/presentation/src/main/java/com/nexters/boolti/presentation/QrScanActivity.kt b/presentation/src/main/java/com/nexters/boolti/presentation/QrScanActivity.kt index b9aa1455..74e0fe15 100644 --- a/presentation/src/main/java/com/nexters/boolti/presentation/QrScanActivity.kt +++ b/presentation/src/main/java/com/nexters/boolti/presentation/QrScanActivity.kt @@ -1,14 +1,10 @@ package com.nexters.boolti.presentation import android.Manifest -import android.content.Context -import android.hardware.Camera -import android.os.Build import android.graphics.Color +import android.hardware.Camera import android.os.Bundle import android.os.VibrationEffect -import android.os.Vibrator -import android.os.VibratorManager import android.view.KeyEvent import androidx.activity.ComponentActivity import androidx.activity.SystemBarStyle @@ -34,7 +30,7 @@ import kotlinx.coroutines.launch @AndroidEntryPoint class QrScanActivity : ComponentActivity() { - var isBackCamera = true + private var isBackCamera = true private val barcodeView: DecoratedBarcodeView by lazy { DecoratedBarcodeView(this).apply { diff --git a/presentation/src/main/java/com/nexters/boolti/presentation/screen/qr/QrScanScreen.kt b/presentation/src/main/java/com/nexters/boolti/presentation/screen/qr/QrScanScreen.kt index fc23e62a..d1faec25 100644 --- a/presentation/src/main/java/com/nexters/boolti/presentation/screen/qr/QrScanScreen.kt +++ b/presentation/src/main/java/com/nexters/boolti/presentation/screen/qr/QrScanScreen.kt @@ -1,5 +1,8 @@ package com.nexters.boolti.presentation.screen.qr +import android.content.Context +import android.hardware.camera2.CameraCharacteristics +import android.hardware.camera2.CameraManager import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable @@ -9,15 +12,14 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.SnackbarDuration import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -25,13 +27,14 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource @@ -81,6 +84,9 @@ fun QrScanScreen( var borderColor: Color by remember { mutableStateOf(Color.Transparent) } var showingBorderJob: Job? = null + val context = LocalContext.current + val cameraSwitchable = rememberSaveable { hasBothSidesCameras(context) } + LaunchedEffect(barcodeView) { barcodeView.resume() } @@ -144,10 +150,12 @@ fun QrScanScreen( ) }, actionButtons = { - BtAppBarDefaults.AppBarIconButton( - onClick = onClickSwitchCamera, - iconRes = R.drawable.ic_camera_flip, - ) + if (cameraSwitchable) { + BtAppBarDefaults.AppBarIconButton( + onClick = onClickSwitchCamera, + iconRes = R.drawable.ic_camera_flip, + ) + } } ) }, @@ -271,3 +279,26 @@ private fun EntryCodeDialog( ) } } + +private fun hasBothSidesCameras(context: Context): Boolean { + val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager + val cameraIds = cameraManager.cameraIdList + + var hasFrontCamera = false + var hasBackCamera = false + + for (cameraId in cameraIds) { + val characteristics = cameraManager.getCameraCharacteristics(cameraId) + val lensFacing = characteristics.get(CameraCharacteristics.LENS_FACING) + + if (lensFacing == CameraCharacteristics.LENS_FACING_FRONT) { + hasFrontCamera = true + } + + if (lensFacing == CameraCharacteristics.LENS_FACING_BACK) { + hasBackCamera = true + } + } + + return hasFrontCamera && hasBackCamera +} \ No newline at end of file