@@ -37,9 +37,8 @@ import androidx.compose.runtime.Composable
3737import androidx.compose.runtime.DisposableEffect
3838import androidx.compose.runtime.LaunchedEffect
3939import androidx.compose.runtime.getValue
40- import androidx.compose.runtime.mutableStateOf
40+ import androidx.compose.runtime.produceState
4141import androidx.compose.runtime.remember
42- import androidx.compose.runtime.setValue
4342import androidx.compose.ui.Alignment
4443import androidx.compose.ui.Modifier
4544import androidx.compose.ui.graphics.Color
@@ -101,16 +100,31 @@ private fun CameraPreview(
101100 /* *
102101 * Camera Permission Request
103102 */
104- var isGranted by remember {
105- mutableStateOf(
106- ContextCompat .checkSelfPermission(context, permission) == PackageManager .PERMISSION_GRANTED ,
107- )
103+ val isGranted by produceState(
104+ initialValue = ContextCompat .checkSelfPermission(context, permission) == PackageManager .PERMISSION_GRANTED ,
105+ key1 = lifecycleOwner, // lifecycle 변경 시 재설정
106+ ) {
107+ // 최초 동기화
108+ value = ContextCompat .checkSelfPermission(context, permission) == PackageManager .PERMISSION_GRANTED
109+
110+ // 포그라운드 복귀 시 OS 권한 동기화
111+ val observer = LifecycleEventObserver { _, event ->
112+ if (event == Lifecycle .Event .ON_RESUME ) {
113+ value = ContextCompat .checkSelfPermission(context, permission) == PackageManager .PERMISSION_GRANTED
114+ if (value) {
115+ state.eventSink(OcrUiEvent .OnHidePermissionDialog )
116+ } else {
117+ state.eventSink(OcrUiEvent .OnShowPermissionDialog )
118+ }
119+ }
120+ }
121+ lifecycleOwner.lifecycle.addObserver(observer)
122+ awaitDispose { lifecycleOwner.lifecycle.removeObserver(observer) }
108123 }
124+
109125 val permissionLauncher = rememberLauncherForActivityResult(
110126 contract = ActivityResultContracts .RequestPermission (),
111127 ) { granted ->
112- isGranted = granted
113-
114128 if (! granted) {
115129 state.eventSink(OcrUiEvent .OnShowPermissionDialog )
116130 }
@@ -127,22 +141,6 @@ private fun CameraPreview(
127141 }
128142 }
129143
130- // 앱이 포그라운드로 북귀할 때 OS 권한 동기화
131- DisposableEffect (Unit ) {
132- val observer = LifecycleEventObserver { _, event ->
133- if (event == Lifecycle .Event .ON_RESUME ) {
134- isGranted = ContextCompat .checkSelfPermission(context, permission) == PackageManager .PERMISSION_GRANTED
135- if (isGranted) {
136- state.eventSink(OcrUiEvent .OnHidePermissionDialog )
137- } else {
138- state.eventSink(OcrUiEvent .OnShowPermissionDialog )
139- }
140- }
141- }
142- lifecycleOwner.lifecycle.addObserver(observer)
143- onDispose { lifecycleOwner.lifecycle.removeObserver(observer) }
144- }
145-
146144 /* *
147145 * Camera Controller
148146 */
0 commit comments