Skip to content

Commit ff35164

Browse files
lsakeeSangwook123
authored andcommitted
[feat] #62 set video screen
1 parent 5202277 commit ff35164

File tree

4 files changed

+60
-34
lines changed

4 files changed

+60
-34
lines changed

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

+4
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,12 @@ data class UploadState(
1515
val isSelectedDefinedContentSheetOpen: Boolean = false,
1616
val bucketUrl: String = "",
1717
val thumbnailUrl: String = "",
18+
val locationTextValue: String ="",
19+
val contentTextValue: String ="",
1820
) : UiState
1921

2022
sealed interface UploadSideEffect : SideEffect {
2123
data object PopBackStack : UploadSideEffect
24+
data object FocusLocation : UploadSideEffect
25+
data object FocusContent : UploadSideEffect
2226
}

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

+19-16
Original file line numberDiff line numberDiff line change
@@ -14,47 +14,41 @@ import dagger.hilt.android.lifecycle.HiltViewModel
1414
import kotlinx.coroutines.launch
1515
import java.io.File
1616
import java.net.URL
17-
import java.net.URLDecoder
1817
import javax.inject.Inject
1918

2019
@HiltViewModel
2120
class UploadViewModel @Inject constructor(
2221
private val uploadRepository: UploadRepository,
23-
) :
24-
BaseViewModel<UploadState, UploadSideEffect>(UploadState()) {
22+
) : BaseViewModel<UploadState, UploadSideEffect>(UploadState()) {
23+
2524
fun setSelectedList(selectedContent: String) = intent {
2625
val newSelectedList = selectedList.toMutableList()
27-
if (newSelectedList.contains(selectedContent)) {
26+
if (newSelectedList.contains(selectedContent))
2827
newSelectedList.remove(selectedContent)
29-
} else {
28+
else
3029
if (newSelectedList.size < 3) newSelectedList.add(selectedContent)
31-
}
3230
copy(selectedList = newSelectedList)
3331
}
3432

3533
suspend fun getPresignedUrl() = viewModelScope.launch {
3634
uploadRepository.getPresignedUrl().onSuccess {
37-
Log.d("success", "$it")
3835
bucket(it.videoUrl, it.imageUrl)
3936
}.onFailure {
4037
Log.d("failure", "${it.message}")
4138
}
4239
}
4340

44-
private fun decodeBase64(encodedString: String): String? {
45-
val decodedBytes = Base64.decode(encodedString, Base64.DEFAULT)
46-
val decodedString = String(decodedBytes, Charsets.UTF_8)
47-
return URLDecoder.decode(decodedString, "UTF-8")
48-
}
49-
5041
fun uploadVideoToS3Bucket(context: Context, file: File) =
5142
viewModelScope.launch {
5243
var a = ""
5344
var b = ""
54-
uploadFileToS3PresignedUrl(uiState.value.bucketUrl, uiState.value.thumbnailUrl, file) { success, message ->
45+
uploadFileToS3PresignedUrl(
46+
uiState.value.bucketUrl,
47+
uiState.value.thumbnailUrl,
48+
file
49+
) { success, message ->
5550
println(message)
5651
a = removeQueryParameters(message)
57-
Log.d("messageFile", "$message")
5852
if (success) {
5953
uploadFileToS3ThumbnailPresignedUrl(
6054
context,
@@ -63,7 +57,6 @@ class UploadViewModel @Inject constructor(
6357
) { success, message ->
6458
println(message)
6559
b = removeQueryParameters(message)
66-
Log.d("messageThumbnail", "$message ")
6760
uploadRecord(a, b)
6861
}
6962
}
@@ -85,16 +78,26 @@ class UploadViewModel @Inject constructor(
8578
}
8679
}
8780

81+
fun updateLocationTextField(locationValue: String) = intent {
82+
copy(locationTextValue = locationValue)
83+
}
84+
85+
fun updateContentTextField(contentValue: String) = intent {
86+
copy(contentTextValue = contentValue)
87+
}
88+
8889
private fun encodingString(contentValue: String): String {
8990
val bytes = contentValue.toByteArray(Charsets.UTF_8)
9091
val encodedString = Base64.encodeToString(bytes, Base64.DEFAULT)
9192
return encodedString
9293
}
94+
9395
fun removeQueryParameters(urlString: String): String {
9496
val url = URL(urlString)
9597
val cleanUrl = URL(url.protocol, url.host, url.port, url.path)
9698
return cleanUrl.toString()
9799
}
100+
98101
fun setVideo(video: GalleryVideo) = intent {
99102
copy(video = video)
100103
}

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

+37-11
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import androidx.compose.foundation.layout.padding
2727
import androidx.compose.foundation.layout.width
2828
import androidx.compose.foundation.rememberScrollState
2929
import androidx.compose.foundation.shape.RoundedCornerShape
30+
import androidx.compose.foundation.text.KeyboardActions
31+
import androidx.compose.foundation.text.KeyboardOptions
3032
import androidx.compose.foundation.verticalScroll
3133
import androidx.compose.material3.ExperimentalMaterial3Api
3234
import androidx.compose.material3.Text
@@ -36,13 +38,15 @@ import androidx.compose.runtime.getValue
3638
import androidx.compose.runtime.mutableStateOf
3739
import androidx.compose.runtime.remember
3840
import androidx.compose.runtime.rememberCoroutineScope
39-
import androidx.compose.runtime.setValue
4041
import androidx.compose.ui.Alignment
4142
import androidx.compose.ui.Modifier
4243
import androidx.compose.ui.draw.clip
44+
import androidx.compose.ui.focus.FocusRequester
45+
import androidx.compose.ui.focus.focusRequester
4346
import androidx.compose.ui.layout.ContentScale
4447
import androidx.compose.ui.platform.LocalContext
4548
import androidx.compose.ui.res.painterResource
49+
import androidx.compose.ui.text.input.ImeAction
4650
import androidx.compose.ui.text.style.TextAlign
4751
import androidx.compose.ui.tooling.preview.Preview
4852
import androidx.compose.ui.unit.dp
@@ -70,6 +74,7 @@ import com.record.upload.component.bottomsheet.DefinedContentBottomSheet
7074
import com.record.upload.component.bottomsheet.SelectedVideoBottomSheet
7175
import com.record.upload.extension.GalleryVideo
7276
import com.record.upload.extension.getAllVideos
77+
import kotlinx.coroutines.android.awaitFrame
7378
import kotlinx.coroutines.flow.collectLatest
7479
import kotlinx.coroutines.launch
7580
import timber.log.Timber
@@ -84,6 +89,8 @@ fun VideoPickerRoute(
8489
val state by viewModel.uiState.collectAsStateWithLifecycle()
8590
val context = LocalContext.current
8691
val coroutineScope = rememberCoroutineScope()
92+
val locationFocusRequester = remember { FocusRequester() }
93+
val contentFocusRequester = remember { FocusRequester() }
8794

8895
BackHandler(true) {
8996
coroutineScope.launch {
@@ -93,13 +100,21 @@ fun VideoPickerRoute(
93100

94101
LaunchedEffectWithLifecycle {
95102
viewModel.getPresignedUrl()
96-
viewModel.sideEffect.collectLatest { }
97103
}
98104

99105
LaunchedEffectWithLifecycle {
100106
viewModel.sideEffect.collectLatest { sideEffect ->
101107
when (sideEffect) {
102108
is UploadSideEffect.PopBackStack -> popBackStack()
109+
is UploadSideEffect.FocusLocation -> {
110+
awaitFrame()
111+
locationFocusRequester.requestFocus()
112+
}
113+
114+
is UploadSideEffect.FocusContent -> {
115+
awaitFrame()
116+
contentFocusRequester.requestFocus()
117+
}
103118
}
104119
}
105120
}
@@ -119,6 +134,10 @@ fun VideoPickerRoute(
119134
viewModel.uploadVideoToS3Bucket(context, it)
120135
},
121136
onClickBackStack = viewModel::popBackStack,
137+
updateLocationTextField = viewModel::updateLocationTextField,
138+
updateContentTextField = viewModel::updateContentTextField,
139+
locationFocusRequester = locationFocusRequester,
140+
contentFocusRequester = locationFocusRequester,
122141
)
123142
}
124143

@@ -142,6 +161,10 @@ fun VideoPickerScreen(
142161
onClickContentChip: (String) -> Unit,
143162
setVideo: (GalleryVideo) -> Unit,
144163
uploadVideoS3Bucket: (File) -> Unit,
164+
updateContentTextField: (String) -> Unit = {},
165+
updateLocationTextField: (String) -> Unit = {},
166+
locationFocusRequester: FocusRequester = remember { FocusRequester() },
167+
contentFocusRequester: FocusRequester = remember { FocusRequester() },
145168
) {
146169
val context = LocalContext.current
147170
val cameraPermissionState = rememberPermissionState(
@@ -165,9 +188,6 @@ fun VideoPickerScreen(
165188
) == PackageManager.PERMISSION_GRANTED,
166189
)
167190
}
168-
var normalValue by remember {
169-
mutableStateOf("")
170-
}
171191
val scope = rememberCoroutineScope()
172192
val imageLoader = ImageLoader.Builder(context)
173193
.components {
@@ -322,12 +342,14 @@ fun VideoPickerScreen(
322342
)
323343
RecordyBasicTextField(
324344
modifier = Modifier
325-
.padding(horizontal = 16.dp),
345+
.padding(horizontal = 16.dp)
346+
.focusRequester(locationFocusRequester),
326347
placeholder = "영상 속 위치는 어디인가요?",
327348
maxLines = 1,
328349
maxLength = 10,
329-
value = normalValue,
330-
onValueChange = { normalValue = it },
350+
value = state.locationTextValue,
351+
onValueChange = updateLocationTextField,
352+
keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Done),
331353
)
332354
Text(
333355
text = "내용",
@@ -342,11 +364,15 @@ fun VideoPickerScreen(
342364
maxLines = 20,
343365
maxLength = 300,
344366
minHeight = 148.dp,
345-
value = normalValue,
367+
value = state.contentTextValue,
346368
modifier = Modifier
347369
.padding(horizontal = 16.dp)
348-
.padding(bottom = 10.dp),
349-
onValueChange = { normalValue = it },
370+
.padding(bottom = 10.dp)
371+
.focusRequester(contentFocusRequester),
372+
onValueChange = updateContentTextField,
373+
keyboardOptions = KeyboardOptions.Default.copy(
374+
imeAction = ImeAction.Done
375+
)
350376
)
351377
Box(modifier = Modifier.padding(16.dp)) {
352378
RecordyButton(

feature/upload/src/main/java/com/record/upload/navigation/UploadNavigation.kt

-7
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import androidx.compose.ui.Modifier
77
import androidx.navigation.NavController
88
import androidx.navigation.NavGraphBuilder
99
import androidx.navigation.compose.composable
10-
import com.record.upload.SelectedVideoRoute
1110
import com.record.upload.VideoPickerRoute
1211

1312
fun NavController.navigateToUpload() {
@@ -26,14 +25,8 @@ fun NavGraphBuilder.uploadNavGraph(
2625
popBackStack = popBackStack,
2726
)
2827
}
29-
composable(route = UploadRoute.SELECTED_VIDEO) {
30-
SelectedVideoRoute(
31-
paddingValues = padding,
32-
)
33-
}
3428
}
3529

3630
object UploadRoute {
3731
const val ROUTE = "upload"
38-
const val SELECTED_VIDEO = "selected-video"
3932
}

0 commit comments

Comments
 (0)