diff --git a/app/build.gradle b/app/build.gradle index 0c25ddf..bd38d81 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -119,6 +119,9 @@ dependencies { annotationProcessor "com.github.bumptech.glide:compiler:$glide_version" implementation "com.github.bumptech.glide:compose:$glide_compose_version" + // Coil + implementation("io.coil-kt:coil-compose:2.4.0") + // Paging implementation "androidx.paging:paging-runtime:$pagingVersion" implementation "androidx.paging:paging-compose:$pagingComposeVersion" diff --git a/app/src/main/java/com/boostcamp/dailyfilm/presentation/calendar/DateViewModel.kt b/app/src/main/java/com/boostcamp/dailyfilm/presentation/calendar/DateViewModel.kt index b08e219..c046cfc 100644 --- a/app/src/main/java/com/boostcamp/dailyfilm/presentation/calendar/DateViewModel.kt +++ b/app/src/main/java/com/boostcamp/dailyfilm/presentation/calendar/DateViewModel.kt @@ -1,5 +1,8 @@ package com.boostcamp.dailyfilm.presentation.calendar +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.snapshots.SnapshotStateList +import androidx.compose.runtime.toMutableStateList import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -95,7 +98,7 @@ class DateViewModel @Inject constructor( fun reloadCalendar(itemList: List) { val tempCalendar = createCalendar(prevCalendar, day = prevMaxDay - (dayOfWeek - 2)) - val dateModelList = _dateFlow.value.toMutableList() + val dateModelList = _dateFlow.value.toMutableStateList() val prevDay = tempCalendar.day() val prevCnt = if (dayOfWeek == 1) { -1 @@ -152,14 +155,14 @@ class DateViewModel @Inject constructor( } fun setVideo(index: Int, dateModel: DateModel) { - val tmpList = _dateFlow.value.toMutableList() + val tmpList = _dateFlow.value.toMutableStateList() tmpList[index] = dateModel _dateFlow.value = tmpList } - fun initialDateList(): List { + fun initialDateList(): SnapshotStateList { val tempCalendar = createCalendar(prevCalendar, day = prevMaxDay - (dayOfWeek - 2)) - val dateModelList = mutableListOf() + val dateModelList = mutableStateListOf() for (i in 0 until 42) { val year = tempCalendar.year() diff --git a/app/src/main/java/com/boostcamp/dailyfilm/presentation/calendar/compose/CalendarView.kt b/app/src/main/java/com/boostcamp/dailyfilm/presentation/calendar/compose/CalendarView.kt index 4c91686..d53bad3 100644 --- a/app/src/main/java/com/boostcamp/dailyfilm/presentation/calendar/compose/CalendarView.kt +++ b/app/src/main/java/com/boostcamp/dailyfilm/presentation/calendar/compose/CalendarView.kt @@ -1,8 +1,12 @@ package com.boostcamp.dailyfilm.presentation.calendar.compose +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.MaterialTheme import androidx.compose.material3.Text @@ -15,8 +19,11 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.drawWithCache import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.ColorMatrix import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.Layout +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.Constraints @@ -25,6 +32,10 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle +import coil.compose.AsyncImage +import coil.compose.AsyncImagePainter +import coil.compose.rememberAsyncImagePainter +import coil.request.ImageRequest import com.boostcamp.dailyfilm.data.model.DailyFilmItem import com.boostcamp.dailyfilm.presentation.calendar.DateViewModel import com.boostcamp.dailyfilm.presentation.calendar.model.DateModel @@ -41,6 +52,7 @@ fun CalendarView( viewModel: DateViewModel, resetFilm: (List) -> Unit, imgClick: (Int, DateModel) -> Unit, + onMovePlayFilm: (Int, DateModel) -> Unit, ) { val lifecycleEvent = rememberLifecycleEvent() val itemList by viewModel.itemFlow.collectAsStateWithLifecycle(initialValue = null) @@ -58,7 +70,8 @@ fun CalendarView( viewModel.reloadCalendar(it) }, resetFilm = resetFilm, - imgClick = imgClick + imgClick = imgClick, + onMovePlayFilm = onMovePlayFilm ) } @@ -73,6 +86,7 @@ fun CalendarView( reloadCalendar: (List) -> Unit, resetFilm: (List) -> Unit, imgClick: (Int, DateModel) -> Unit, + onMovePlayFilm: (Int, DateModel) -> Unit, ) { val textSize = 12.sp @@ -85,15 +99,6 @@ fun CalendarView( Lifecycle.Event.ON_PAUSE -> { dateState.selectedDay = null } - - Lifecycle.Event.ON_RESUME -> { - // onResume 에서 가 아닌 repeatOnLifecycle 의 RESUMED 상태로 받아도 됐었음. - // LaunchedEffect(key1 = reloadList) 가 안됨 - resetFilm( - reloadList.filter { dateModel -> dateModel.videoUrl != null } - ) - } - else -> {} } } @@ -114,13 +119,31 @@ fun CalendarView( currentCalendar = currentCalendar, todayCalendar = todayCalendar, dateState = dateState, - imgClick = imgClick + imgClick = imgClick, + onMovePlayFilm = onMovePlayFilm ) } @OptIn(ExperimentalGlideComposeApi::class) @Composable private fun DateImage(background: Color, alpha: Float, url: String?, onClick: () -> Unit) { + /*val painter = rememberAsyncImagePainter(url) + val state = painter.state + + val transition by animateFloatAsState( + targetValue = if (state is AsyncImagePainter.State.Success) 1f else 0f, label = "" + ) + Image( + modifier = Modifier + .fillMaxSize() + .background(background) + .alpha(transition) + .padding(2.dp) + .clip(RoundedCornerShape(5.dp)) + .noRippleClickable(onClick = onClick), + painter = painter, + contentDescription = "custom transition based on painter state", + )*/ GlideImage( modifier = Modifier @@ -145,13 +168,13 @@ private fun CustomCalendarView( todayCalendar: Calendar, dateState: DateState, imgClick: (Int, DateModel) -> Unit, + onMovePlayFilm: (Int, DateModel) -> Unit, ) { - CustomCalendarView( textHeight = textHeight ) { reloadList.forEachIndexed { index, dateModel -> - + println("dateModel: $dateModel") val isNotCurrentMonth = isNotCurrentMonth( dateModel, currentCalendar.month(), @@ -173,13 +196,16 @@ private fun CustomCalendarView( alpha = dateState.alpha, url = dateModel.videoUrl ) { + println("DateImage: onCLick") if (!isNotCurrentMonth) { + println("isNotCurrentMonth: $isNotCurrentMonth") dateState.apply { - if (dateModel.videoUrl != null) { - selectedDay = null - imgClick(index, dateModel) + imgClick(index, dateModel) + selectedDay = if (dateModel.videoUrl != null) { + onMovePlayFilm(index, dateModel) + null } else { - selectedDay = index + index } } } diff --git a/app/src/main/java/com/boostcamp/dailyfilm/presentation/calendar/compose/DateComposeFragment.kt b/app/src/main/java/com/boostcamp/dailyfilm/presentation/calendar/compose/DateComposeFragment.kt index 3322073..a10827f 100644 --- a/app/src/main/java/com/boostcamp/dailyfilm/presentation/calendar/compose/DateComposeFragment.kt +++ b/app/src/main/java/com/boostcamp/dailyfilm/presentation/calendar/compose/DateComposeFragment.kt @@ -66,7 +66,10 @@ class DateComposeFragment : activityViewModel.emitFilm(it) }, imgClick = { idx, dateModel -> - Log.d("CalendarView", "${ArrayList(activityViewModel.filmFlow.value)}") + println("idx: $idx dateModel: $dateModel") + activityViewModel.changeSelectedItem(idx, dateModel) + }, + onMovePlayFilm = { idx, dateModel -> startForResult.launch( Intent(requireContext(), PlayFilmActivity::class.java).apply { putExtra( diff --git a/app/src/main/java/com/boostcamp/dailyfilm/presentation/playfilm/compose/PlayFilmComposeFragment.kt b/app/src/main/java/com/boostcamp/dailyfilm/presentation/playfilm/compose/PlayFilmComposeFragment.kt index 61405e2..0cc4cc7 100644 --- a/app/src/main/java/com/boostcamp/dailyfilm/presentation/playfilm/compose/PlayFilmComposeFragment.kt +++ b/app/src/main/java/com/boostcamp/dailyfilm/presentation/playfilm/compose/PlayFilmComposeFragment.kt @@ -27,6 +27,7 @@ import com.boostcamp.dailyfilm.presentation.selectvideo.SelectVideoActivity import com.boostcamp.dailyfilm.presentation.selectvideo.SelectVideoActivity.Companion.DATE_VIDEO_ITEM import com.boostcamp.dailyfilm.presentation.ui.theme.DailyFilmTheme import com.boostcamp.dailyfilm.presentation.uploadfilm.UploadFilmActivity +import com.boostcamp.dailyfilm.presentation.uploadfilm.UploadFilmComposeActivity import com.boostcamp.dailyfilm.presentation.uploadfilm.model.DateAndVideoModel import com.boostcamp.dailyfilm.presentation.util.network.NetworkManager import com.boostcamp.dailyfilm.presentation.util.network.NetworkState @@ -85,15 +86,17 @@ class PlayFilmComposeFragment : } }, dialogEvent = { resId -> - when(resId) { + when (resId) { R.string.delete -> { viewModel.setDialog(true) } + R.string.re_upload -> { activity?.let { it.startActivity( Intent( - it.applicationContext, SelectVideoActivity::class.java + it.applicationContext, + SelectVideoActivity::class.java ).apply { putExtra( KEY_CALENDAR_INDEX, @@ -104,7 +107,8 @@ class PlayFilmComposeFragment : putExtra( DATE_VIDEO_ITEM, DateAndVideoModel( - viewModel.videoUri.value ?: return@PlayFilmUI, + viewModel.videoUri.value + ?: return@PlayFilmUI, viewModel.dateModel.getDate() ) ) @@ -113,10 +117,17 @@ class PlayFilmComposeFragment : it.finish() } } + R.string.edit_text -> { startForResult.launch( - Intent(activity?.applicationContext, UploadFilmActivity::class.java).apply { - putExtra(KEY_CALENDAR_INDEX, activityViewModel.calendarIndex) + Intent( + activity?.applicationContext, + UploadFilmComposeActivity::class.java + ).apply { + putExtra( + KEY_CALENDAR_INDEX, + activityViewModel.calendarIndex + ) putExtra( DATE_VIDEO_ITEM, DateAndVideoModel(