@@ -2,6 +2,7 @@ package com.record.upload
2
2
3
3
import android.Manifest
4
4
import android.os.Build
5
+ import android.util.Log
5
6
import androidx.activity.compose.rememberLauncherForActivityResult
6
7
import androidx.activity.result.contract.ActivityResultContracts
7
8
import androidx.annotation.RequiresApi
@@ -31,16 +32,22 @@ import androidx.compose.ui.res.painterResource
31
32
import androidx.compose.ui.text.style.TextAlign
32
33
import androidx.compose.ui.tooling.preview.Preview
33
34
import androidx.compose.ui.unit.dp
35
+ import androidx.hilt.navigation.compose.hiltViewModel
36
+ import androidx.lifecycle.compose.collectAsStateWithLifecycle
34
37
import com.google.accompanist.permissions.ExperimentalPermissionsApi
35
38
import com.google.accompanist.permissions.isGranted
36
39
import com.google.accompanist.permissions.rememberPermissionState
40
+ import com.google.accompanist.permissions.shouldShowRationale
37
41
import com.record.designsystem.R
38
42
import com.record.designsystem.component.button.RecordyButton
43
+ import com.record.designsystem.component.dialog.RecordyDialog
39
44
import com.record.designsystem.component.navbar.TopNavigationBar
40
45
import com.record.designsystem.component.textfield.RecordyBasicTextField
41
46
import com.record.designsystem.theme.Background
42
47
import com.record.designsystem.theme.RecordyTheme
43
48
import com.record.ui.extension.customClickable
49
+ import com.record.ui.lifecycle.LaunchedEffectWithLifecycle
50
+ import kotlinx.coroutines.flow.collectLatest
44
51
import kotlinx.coroutines.launch
45
52
import timber.log.Timber
46
53
@@ -49,20 +56,33 @@ import timber.log.Timber
49
56
@Composable
50
57
fun VideoPickerRoute (
51
58
paddingValues : PaddingValues ,
59
+ viewModel : UploadViewModel = hiltViewModel(),
52
60
navigateSelectedVideo : () -> Unit ,
53
61
) {
62
+ val state by viewModel.uiState.collectAsStateWithLifecycle()
63
+
64
+ LaunchedEffectWithLifecycle {
65
+ viewModel.sideEffect.collectLatest { }
66
+ }
67
+
54
68
VideoPickerScreen (
69
+ state = state,
55
70
navigateSelectedVideo = navigateSelectedVideo,
56
71
onClickKeyword = {},
72
+ showShouldShowRationaleDialog = viewModel::showShouldShowRationaleDialog,
73
+ hideShouldShowRationaleDialog = viewModel::hideShouldShowRationaleDialog,
57
74
)
58
75
}
59
76
60
77
@RequiresApi(Build .VERSION_CODES .TIRAMISU )
61
78
@OptIn(ExperimentalPermissionsApi ::class )
62
79
@Composable
63
80
fun VideoPickerScreen (
81
+ state : UploadState = UploadState (),
64
82
navigateSelectedVideo : () -> Unit ,
65
83
onClickKeyword : () -> Unit = {},
84
+ showShouldShowRationaleDialog : () -> Unit = {},
85
+ hideShouldShowRationaleDialog : () -> Unit = {},
66
86
) {
67
87
val cameraPermissionState = rememberPermissionState(Manifest .permission.READ_MEDIA_VIDEO )
68
88
@@ -107,15 +127,22 @@ fun VideoPickerScreen(
107
127
Box (
108
128
modifier = Modifier
109
129
.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
+ ),
119
146
) {
120
147
Column (
121
148
modifier = Modifier
@@ -190,12 +217,22 @@ fun VideoPickerScreen(
190
217
onValueChange = { normalValue = it },
191
218
)
192
219
RecordyButton (
193
- // modifier = Modifier.padding(16.dp),
194
220
text = " 키워드" ,
195
221
enabled = false ,
196
222
onClick = { Timber .d(" basic key word" ) },
197
223
)
198
224
}
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
+ }
199
236
}
200
237
}
201
238
0 commit comments