Skip to content

Commit fe26293

Browse files
committed
[feat] #62 shouldShowRationale dialog
1 parent babe5d8 commit fe26293

File tree

4 files changed

+75
-10
lines changed

4 files changed

+75
-10
lines changed
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.record.upload
2+
3+
import com.record.ui.base.SideEffect
4+
import com.record.ui.base.UiState
5+
6+
data class UploadState(
7+
val showShouldShowRationaleDialog: Boolean = false,
8+
) : UiState
9+
10+
sealed interface UploadSideEffect : SideEffect {
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.record.upload
2+
3+
import com.record.ui.base.BaseViewModel
4+
import dagger.hilt.android.lifecycle.HiltViewModel
5+
import javax.inject.Inject
6+
7+
@HiltViewModel
8+
class UploadViewModel @Inject constructor() :
9+
BaseViewModel<UploadState, UploadSideEffect>(UploadState()) {
10+
fun showShouldShowRationaleDialog() = intent {
11+
copy(showShouldShowRationaleDialog = true)
12+
}
13+
14+
fun hideShouldShowRationaleDialog() = intent {
15+
copy(showShouldShowRationaleDialog = false)
16+
}
17+
}

feature/upload/src/main/java/com/record/upload/VideoPickerScreen.kt

+47-10
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.record.upload
22

33
import android.Manifest
44
import android.os.Build
5+
import android.util.Log
56
import androidx.activity.compose.rememberLauncherForActivityResult
67
import androidx.activity.result.contract.ActivityResultContracts
78
import androidx.annotation.RequiresApi
@@ -31,16 +32,22 @@ import androidx.compose.ui.res.painterResource
3132
import androidx.compose.ui.text.style.TextAlign
3233
import androidx.compose.ui.tooling.preview.Preview
3334
import androidx.compose.ui.unit.dp
35+
import androidx.hilt.navigation.compose.hiltViewModel
36+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
3437
import com.google.accompanist.permissions.ExperimentalPermissionsApi
3538
import com.google.accompanist.permissions.isGranted
3639
import com.google.accompanist.permissions.rememberPermissionState
40+
import com.google.accompanist.permissions.shouldShowRationale
3741
import com.record.designsystem.R
3842
import com.record.designsystem.component.button.RecordyButton
43+
import com.record.designsystem.component.dialog.RecordyDialog
3944
import com.record.designsystem.component.navbar.TopNavigationBar
4045
import com.record.designsystem.component.textfield.RecordyBasicTextField
4146
import com.record.designsystem.theme.Background
4247
import com.record.designsystem.theme.RecordyTheme
4348
import com.record.ui.extension.customClickable
49+
import com.record.ui.lifecycle.LaunchedEffectWithLifecycle
50+
import kotlinx.coroutines.flow.collectLatest
4451
import kotlinx.coroutines.launch
4552
import timber.log.Timber
4653

@@ -49,20 +56,33 @@ import timber.log.Timber
4956
@Composable
5057
fun VideoPickerRoute(
5158
paddingValues: PaddingValues,
59+
viewModel: UploadViewModel = hiltViewModel(),
5260
navigateSelectedVideo: () -> Unit,
5361
) {
62+
val state by viewModel.uiState.collectAsStateWithLifecycle()
63+
64+
LaunchedEffectWithLifecycle {
65+
viewModel.sideEffect.collectLatest { }
66+
}
67+
5468
VideoPickerScreen(
69+
state = state,
5570
navigateSelectedVideo = navigateSelectedVideo,
5671
onClickKeyword = {},
72+
showShouldShowRationaleDialog = viewModel::showShouldShowRationaleDialog,
73+
hideShouldShowRationaleDialog = viewModel::hideShouldShowRationaleDialog,
5774
)
5875
}
5976

6077
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
6178
@OptIn(ExperimentalPermissionsApi::class)
6279
@Composable
6380
fun VideoPickerScreen(
81+
state: UploadState = UploadState(),
6482
navigateSelectedVideo: () -> Unit,
6583
onClickKeyword: () -> Unit = {},
84+
showShouldShowRationaleDialog: () -> Unit = {},
85+
hideShouldShowRationaleDialog: () -> Unit = {},
6686
) {
6787
val cameraPermissionState = rememberPermissionState(Manifest.permission.READ_MEDIA_VIDEO)
6888

@@ -107,15 +127,22 @@ fun VideoPickerScreen(
107127
Box(
108128
modifier = Modifier
109129
.background(RecordyTheme.colors.gray08, shape = RoundedCornerShape(16.dp))
110-
.customClickable(onClick = {
111-
if (cameraPermissionState.status.isGranted) {
112-
navigateSelectedVideo()
113-
return@customClickable
114-
}
115-
scope.launch {
116-
requestPermissionLauncher.launch(Manifest.permission.READ_MEDIA_VIDEO)
117-
}
118-
},),
130+
.customClickable(
131+
onClick = {
132+
if (cameraPermissionState.status.isGranted) {
133+
navigateSelectedVideo()
134+
return@customClickable
135+
}
136+
if (cameraPermissionState.status.shouldShowRationale) {
137+
Log.d("shouldShowRationale", "${cameraPermissionState.status.shouldShowRationale}")
138+
showShouldShowRationaleDialog()
139+
return@customClickable
140+
}
141+
scope.launch {
142+
requestPermissionLauncher.launch(Manifest.permission.READ_MEDIA_VIDEO)
143+
}
144+
},
145+
),
119146
) {
120147
Column(
121148
modifier = Modifier
@@ -190,12 +217,22 @@ fun VideoPickerScreen(
190217
onValueChange = { normalValue = it },
191218
)
192219
RecordyButton(
193-
// modifier = Modifier.padding(16.dp),
194220
text = "키워드",
195221
enabled = false,
196222
onClick = { Timber.d("basic key word") },
197223
)
198224
}
225+
if (state.showShouldShowRationaleDialog) {
226+
RecordyDialog(
227+
graphicAsset = R.drawable.img_allow,
228+
title = "필수 권한을 허용해주세요",
229+
subTitle = "사진 접근을 허용하여 영상을 업로드 하세요.",
230+
negativeButtonLabel = "닫기",
231+
positiveButtonLabel = "지금 설정",
232+
onDismissRequest = hideShouldShowRationaleDialog,
233+
onPositiveButtonClick = {},
234+
)
235+
}
199236
}
200237
}
201238

0 commit comments

Comments
 (0)