diff --git a/core/datetime/src/main/java/soup/movie/datetime/DateHelper.kt b/core/datetime/src/main/java/soup/movie/datetime/DateHelper.kt index cc0215762..0b17f7393 100644 --- a/core/datetime/src/main/java/soup/movie/datetime/DateHelper.kt +++ b/core/datetime/src/main/java/soup/movie/datetime/DateHelper.kt @@ -20,6 +20,7 @@ import java.time.LocalDate import java.time.LocalDateTime import java.time.ZoneId import java.time.format.DateTimeFormatter +import java.time.temporal.ChronoUnit private val ZONE_SEOUL = ZoneId.of("Asia/Seoul") fun currentTime(): LocalDateTime = LocalDateTime.now(ZONE_SEOUL) @@ -52,3 +53,20 @@ fun LocalDate.MM_DD(): String { fun LocalDate.YYYY_MM_DD(): String { return format(DateTimeFormatter.ofPattern("yyyy.MM.dd")) } + +fun calculateDDay(openDate: LocalDate?, today: LocalDate): Long? { + return openDate?.let { + ChronoUnit.DAYS.between(today, it) + } +} + +/** + * Valid format: YYYY.MM.DD + */ +fun String.toLocalDate(): LocalDate? = split(".").let { + return if (it.size == 3) { + LocalDate.of(it[0].toInt(), it[1].toInt(), it[2].toInt()) + } else { + null + } +} diff --git a/core/resources/src/main/kotlin/soup/movie/resources/Resources.kt b/core/resources/src/main/kotlin/soup/movie/resources/Resources.kt new file mode 100644 index 000000000..1e267f829 --- /dev/null +++ b/core/resources/src/main/kotlin/soup/movie/resources/Resources.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2021 SOUP + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package soup.movie.resources + +fun dDayStringResource(dDay: Long): String { + return when { + dDay <= 0 -> "NOW" + else -> "D-$dDay" + } +} diff --git a/data/database/impl/build.gradle b/data/database/impl/build.gradle index 7fca52f5e..d0b250592 100644 --- a/data/database/impl/build.gradle +++ b/data/database/impl/build.gradle @@ -21,6 +21,7 @@ android { dependencies { implementation projects.core.kotlin implementation projects.core.logger + implementation projects.core.datetime implementation projects.data.model implementation projects.data.database.api diff --git a/data/database/impl/src/main/java/soup/movie/data/database/impl/LocalDataSourceImpl.kt b/data/database/impl/src/main/java/soup/movie/data/database/impl/LocalDataSourceImpl.kt index 17f71b109..6982f6b16 100644 --- a/data/database/impl/src/main/java/soup/movie/data/database/impl/LocalDataSourceImpl.kt +++ b/data/database/impl/src/main/java/soup/movie/data/database/impl/LocalDataSourceImpl.kt @@ -31,6 +31,7 @@ import soup.movie.data.database.impl.mapper.toMovie import soup.movie.data.database.impl.mapper.toMovieEntity import soup.movie.data.database.impl.mapper.toOpenDateAlarm import soup.movie.data.database.impl.mapper.toOpenDateAlarmEntity +import soup.movie.datetime.today import soup.movie.log.Logger import soup.movie.model.MovieListModel import soup.movie.model.MovieModel @@ -73,8 +74,9 @@ class LocalDataSourceImpl @Inject constructor( } private fun getMovieListFlow(type: String): Flow> { + val today = today() return cacheDao.getMovieListByType(type) - .map { it.list.map { movieEntity -> movieEntity.toMovie() } } + .map { it.list.map { movieEntity -> movieEntity.toMovie(today = today) } } .catch { emit(emptyList()) } } @@ -100,8 +102,9 @@ class LocalDataSourceImpl @Inject constructor( private suspend fun getMovieListOf(type: String): List { return try { + val today = today() cacheDao.findByType(type).list - .map { movieEntity -> movieEntity.toMovie() } + .map { movieEntity -> movieEntity.toMovie(today = today) } } catch (t: Throwable) { Logger.w(t) emptyList() @@ -118,8 +121,9 @@ class LocalDataSourceImpl @Inject constructor( } override fun getFavoriteMovieList(): Flow> { + val today = today() return favoriteMovieDao.getFavoriteMovieList().map { - it.map { favoriteMovieEntity -> favoriteMovieEntity.toMovie() } + it.map { favoriteMovieEntity -> favoriteMovieEntity.toMovie(today = today) } } } diff --git a/data/database/impl/src/main/java/soup/movie/data/database/impl/mapper/EntityToModelMapper.kt b/data/database/impl/src/main/java/soup/movie/data/database/impl/mapper/EntityToModelMapper.kt index 0e71c8c14..38c8099b5 100644 --- a/data/database/impl/src/main/java/soup/movie/data/database/impl/mapper/EntityToModelMapper.kt +++ b/data/database/impl/src/main/java/soup/movie/data/database/impl/mapper/EntityToModelMapper.kt @@ -18,16 +18,34 @@ package soup.movie.data.database.impl.mapper import soup.movie.data.database.impl.entity.FavoriteMovieEntity import soup.movie.data.database.impl.entity.MovieEntity import soup.movie.data.database.impl.entity.OpenDateAlarmEntity +import soup.movie.datetime.calculateDDay +import soup.movie.datetime.toLocalDate import soup.movie.model.MovieModel import soup.movie.model.OpenDateAlarmModel import soup.movie.model.TheaterRatingsModel +import java.time.LocalDate -fun MovieEntity.toMovie() = MovieModel( - id, score, title, posterUrl, openDate, isNow, age, nationFilter, genres, boxOffice, - TheaterRatingsModel(cgv, lotte, megabox), -) +fun MovieEntity.toMovie(today: LocalDate): MovieModel { + val openLocalDate = openDate.toLocalDate() + return MovieModel( + id = id, + score = score, + title = title, + posterUrl = posterUrl, + openDate = openDate, + isNow = isNow, + age = age, + nationFilter = nationFilter, + genres = genres, + boxOffice = boxOffice, + theater = TheaterRatingsModel(cgv, lotte, megabox), + openLocalDate = openLocalDate, + dDay = if (!isNow) calculateDDay(openDate = openLocalDate, today = today) else null, + ) +} -fun FavoriteMovieEntity.toMovie(): MovieModel { +fun FavoriteMovieEntity.toMovie(today: LocalDate): MovieModel { + val openLocalDate = openDate.toLocalDate() return MovieModel( id = id, score = score, @@ -40,7 +58,15 @@ fun FavoriteMovieEntity.toMovie(): MovieModel { genres = genres, boxOffice = boxOffice, theater = TheaterRatingsModel(cgv, lotte, megabox), + openLocalDate = openLocalDate, + dDay = if (!isNow) calculateDDay(openDate = openLocalDate, today = today) else null, ) } -fun OpenDateAlarmEntity.toOpenDateAlarm() = OpenDateAlarmModel(movieId, title, openDate) +fun OpenDateAlarmEntity.toOpenDateAlarm(): OpenDateAlarmModel { + return OpenDateAlarmModel( + movieId = movieId, + title = title, + openDate = openDate, + ) +} diff --git a/data/model/src/main/java/soup/movie/model/MovieModel.kt b/data/model/src/main/java/soup/movie/model/MovieModel.kt index e64700f0b..cfc92c74a 100644 --- a/data/model/src/main/java/soup/movie/model/MovieModel.kt +++ b/data/model/src/main/java/soup/movie/model/MovieModel.kt @@ -15,6 +15,8 @@ */ package soup.movie.model +import java.time.LocalDate + /** * @param genres 장르 */ @@ -30,6 +32,8 @@ data class MovieModel( val genres: List?, val boxOffice: Int?, val theater: TheaterRatingsModel, + val openLocalDate: LocalDate?, + val dDay: Long?, ) { val isPlan: Boolean = !isNow diff --git a/data/network/api/build.gradle b/data/network/api/build.gradle index aab9609ea..087b8f2ae 100644 --- a/data/network/api/build.gradle +++ b/data/network/api/build.gradle @@ -8,6 +8,7 @@ android { } dependencies { + implementation projects.core.datetime implementation projects.data.model implementation libs.kotlin.stdlib implementation libs.kotlin.serialization diff --git a/data/network/api/src/main/java/soup/movie/data/network/response/MovieDetailResponse.kt b/data/network/api/src/main/java/soup/movie/data/network/response/MovieDetailResponse.kt index 77256d273..363389064 100644 --- a/data/network/api/src/main/java/soup/movie/data/network/response/MovieDetailResponse.kt +++ b/data/network/api/src/main/java/soup/movie/data/network/response/MovieDetailResponse.kt @@ -17,9 +17,12 @@ package soup.movie.data.network.response import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import soup.movie.datetime.calculateDDay +import soup.movie.datetime.toLocalDate import soup.movie.model.MovieDetailModel import soup.movie.model.MovieModel import soup.movie.model.TheaterRatingsModel +import java.time.LocalDate /** * @param genres 장르 @@ -59,7 +62,8 @@ class MovieDetailResponse( val trailers: List? = null, ) -fun MovieDetailResponse.asModel(): MovieDetailModel { +fun MovieDetailResponse.asModel(today: LocalDate): MovieDetailModel { + val openLocalDate = openDate.toLocalDate() return MovieDetailModel( movie = MovieModel( id = id, @@ -77,6 +81,8 @@ fun MovieDetailResponse.asModel(): MovieDetailModel { lotte = lotte?.star, megabox = megabox?.star, ), + openLocalDate = openLocalDate, + dDay = if (!isNow) calculateDDay(openDate = openLocalDate, today = today) else null, ), boxOffice = boxOffice?.asModel(), diff --git a/data/network/api/src/main/java/soup/movie/data/network/response/MovieListResponse.kt b/data/network/api/src/main/java/soup/movie/data/network/response/MovieListResponse.kt index 1a34cd1df..0b00e1a03 100644 --- a/data/network/api/src/main/java/soup/movie/data/network/response/MovieListResponse.kt +++ b/data/network/api/src/main/java/soup/movie/data/network/response/MovieListResponse.kt @@ -17,6 +17,7 @@ package soup.movie.data.network.response import kotlinx.serialization.Serializable import soup.movie.model.MovieListModel +import java.time.LocalDate @Serializable class MovieListResponse( @@ -24,9 +25,9 @@ class MovieListResponse( val list: List = emptyList(), ) -fun MovieListResponse.asModel(): MovieListModel { +fun MovieListResponse.asModel(today: LocalDate): MovieListModel { return MovieListModel( lastUpdateTime = lastUpdateTime, - list = list.map { it.asModel() }, + list = list.map { it.asModel(today = today) }, ) } diff --git a/data/network/api/src/main/java/soup/movie/data/network/response/MovieResponse.kt b/data/network/api/src/main/java/soup/movie/data/network/response/MovieResponse.kt index 127f34110..280a3025a 100644 --- a/data/network/api/src/main/java/soup/movie/data/network/response/MovieResponse.kt +++ b/data/network/api/src/main/java/soup/movie/data/network/response/MovieResponse.kt @@ -17,7 +17,10 @@ package soup.movie.data.network.response import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import soup.movie.datetime.calculateDDay +import soup.movie.datetime.toLocalDate import soup.movie.model.MovieModel +import java.time.LocalDate @Serializable class MovieResponse( @@ -35,7 +38,8 @@ class MovieResponse( val theater: TheaterRatingsResponse, ) -fun MovieResponse.asModel(): MovieModel { +fun MovieResponse.asModel(today: LocalDate): MovieModel { + val openLocalDate = openDate.toLocalDate() return MovieModel( id = id, score = score, @@ -48,5 +52,7 @@ fun MovieResponse.asModel(): MovieModel { genres = genres, boxOffice = boxOffice, theater = theater.asModel(), + openLocalDate = openLocalDate, + dDay = if (!isNow) calculateDDay(openDate = openLocalDate, today = today) else null, ) } diff --git a/data/repository/impl/build.gradle b/data/repository/impl/build.gradle index d037b17eb..7646c0c4b 100644 --- a/data/repository/impl/build.gradle +++ b/data/repository/impl/build.gradle @@ -10,6 +10,7 @@ android { dependencies { implementation projects.core.kotlin implementation projects.core.logger + implementation projects.core.datetime implementation projects.data.model implementation projects.data.network.api implementation projects.data.database.api diff --git a/data/repository/impl/src/main/java/soup/movie/data/repository/impl/MovieRepositoryImpl.kt b/data/repository/impl/src/main/java/soup/movie/data/repository/impl/MovieRepositoryImpl.kt index 70f63e864..4b10ec038 100644 --- a/data/repository/impl/src/main/java/soup/movie/data/repository/impl/MovieRepositoryImpl.kt +++ b/data/repository/impl/src/main/java/soup/movie/data/repository/impl/MovieRepositoryImpl.kt @@ -24,6 +24,7 @@ import soup.movie.data.network.RemoteDataSource import soup.movie.data.network.response.asModel import soup.movie.data.repository.MovieRepository import soup.movie.data.repository.impl.util.SearchHelper +import soup.movie.datetime.today import soup.movie.log.Logger import soup.movie.model.MovieDetailModel import soup.movie.model.MovieModel @@ -54,7 +55,7 @@ class MovieRepositoryImpl @Inject constructor( true } if (isStaleness) { - local.saveNowMovieList(remote.getNowMovieList().asModel()) + local.saveNowMovieList(remote.getNowMovieList().asModel(today = today())) } } @@ -78,14 +79,14 @@ class MovieRepositoryImpl @Inject constructor( true } if (isStaleness) { - local.savePlanMovieList(remote.getPlanMovieList().asModel()) + local.savePlanMovieList(remote.getPlanMovieList().asModel(today = today())) } } } override suspend fun getMovieDetail(movieId: String): MovieDetailModel { return withContext(ioDispatcher) { - remote.getMovieDetail(movieId).asModel() + remote.getMovieDetail(movieId).asModel(today = today()) } } diff --git a/domain/.gitignore b/domain/.gitignore deleted file mode 100644 index 42afabfd2..000000000 --- a/domain/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/domain/build.gradle b/domain/build.gradle deleted file mode 100644 index 2d96b43f0..000000000 --- a/domain/build.gradle +++ /dev/null @@ -1,17 +0,0 @@ -plugins { - id "moop.android.library" -} - -android { - namespace "soup.movie.domain" -} - -dependencies { - implementation projects.core.kotlin - implementation projects.core.datetime - implementation projects.data.model - - implementation libs.kotlin.stdlib - - testImplementation projects.testing -} diff --git a/domain/src/main/AndroidManifest.xml b/domain/src/main/AndroidManifest.xml deleted file mode 100644 index cc947c567..000000000 --- a/domain/src/main/AndroidManifest.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/domain/src/main/java/soup/movie/domain/movie/MovieExt.kt b/domain/src/main/java/soup/movie/domain/movie/MovieExt.kt deleted file mode 100644 index 687367d5e..000000000 --- a/domain/src/main/java/soup/movie/domain/movie/MovieExt.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2021 SOUP - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package soup.movie.domain.movie - -import soup.movie.datetime.today -import soup.movie.model.MovieModel -import java.time.LocalDate -import java.time.temporal.ChronoUnit - -fun MovieModel.getDDay(): Long = openDate.toLocalDate()?.let { - ChronoUnit.DAYS.between(today(), it) -} ?: 999 - -fun MovieModel.getDDayLabel(): String? = openDate.toLocalDate()?.let { - val dDay = ChronoUnit.DAYS.between(today(), it) - return when { - dDay <= 0 -> "NOW" - else -> "D-$dDay" - } -} - -private fun MovieModel.hasOpenDate(): Boolean = openDate.toLocalDate() != null - -fun MovieModel.isDDay(): Boolean = isPlan and hasOpenDate() - -fun MovieModel.screenDays(): Int { - val openDate = openDate.toLocalDate() - if (openDate != null) { - return ChronoUnit.DAYS.between(openDate, today()).toInt() - } - return 0 -} - -/** - * Valid format: YYYY.MM.DD - */ -private fun String.toLocalDate(): LocalDate? = split(".").let { - return if (it.size == 3) { - LocalDate.of(it[0].toInt(), it[1].toInt(), it[2].toInt()) - } else { - null - } -} diff --git a/feature/detail/impl/build.gradle b/feature/detail/impl/build.gradle index ee9a53b28..1c7b7da73 100644 --- a/feature/detail/impl/build.gradle +++ b/feature/detail/impl/build.gradle @@ -19,7 +19,6 @@ dependencies { implementation projects.core.datetime implementation projects.data.repository.api implementation projects.data.model - implementation projects.domain implementation projects.feature.home.api implementation projects.feature.detail.api diff --git a/feature/detail/impl/src/main/java/soup/movie/feature/detail/impl/DetailHeader.kt b/feature/detail/impl/src/main/java/soup/movie/feature/detail/impl/DetailHeader.kt index 44d6cf492..4b8ef82e7 100644 --- a/feature/detail/impl/src/main/java/soup/movie/feature/detail/impl/DetailHeader.kt +++ b/feature/detail/impl/src/main/java/soup/movie/feature/detail/impl/DetailHeader.kt @@ -46,11 +46,10 @@ import androidx.compose.ui.unit.sp import soup.movie.core.designsystem.icon.MovieIcons import soup.movie.core.designsystem.theme.MovieTheme import soup.movie.core.imageloading.AsyncImage -import soup.movie.domain.movie.getDDayLabel -import soup.movie.domain.movie.isDDay import soup.movie.feature.home.rememberHomeComposableFactory import soup.movie.model.MovieModel import soup.movie.resources.R +import soup.movie.resources.dDayStringResource @Composable internal fun DetailHeader( @@ -62,7 +61,11 @@ internal fun DetailHeader( val factory = rememberHomeComposableFactory() val movie: MovieModel = uiModel.movie Column(modifier = modifier) { - Row(modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp)) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + ) { Text( text = movie.title, modifier = Modifier @@ -75,7 +78,11 @@ internal fun DetailHeader( ) actions() } - Row(modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 8.dp)) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 8.dp), + ) { Box( contentAlignment = Alignment.TopEnd, ) { @@ -101,15 +108,21 @@ internal fun DetailHeader( age = movie.age, modifier = Modifier.padding(top = 12.dp), ) - if (movie.isDDay()) { - factory.MovieDDayTag( - text = movie.getDDayLabel().orEmpty(), - modifier = Modifier.padding(top = 4.dp), - ) + if (movie.isPlan) { + movie.dDay?.let { + factory.MovieDDayTag( + text = dDayStringResource(dDay = it), + modifier = Modifier.padding(top = 4.dp), + ) + } } } } - Column(modifier = Modifier.fillMaxWidth().padding(start = 12.dp)) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(start = 12.dp), + ) { if (movie.openDate.isNotEmpty()) { Row { Text( @@ -124,7 +137,9 @@ internal fun DetailHeader( color = MovieTheme.colorScheme.onBackground, style = MovieTheme.typography.bodyMedium, fontSize = 14.sp, - modifier = Modifier.fillMaxWidth().padding(start = 8.dp), + modifier = Modifier + .fillMaxWidth() + .padding(start = 8.dp), maxLines = 1, overflow = TextOverflow.Ellipsis, ) @@ -151,7 +166,9 @@ internal fun DetailHeader( color = MovieTheme.colorScheme.onBackground, style = MovieTheme.typography.bodyMedium, fontSize = 14.sp, - modifier = Modifier.fillMaxWidth().padding(start = 8.dp), + modifier = Modifier + .fillMaxWidth() + .padding(start = 8.dp), maxLines = 1, overflow = TextOverflow.Ellipsis, ) @@ -171,7 +188,9 @@ internal fun DetailHeader( color = MovieTheme.colorScheme.onBackground, style = MovieTheme.typography.bodyMedium, fontSize = 14.sp, - modifier = Modifier.fillMaxWidth().padding(start = 8.dp), + modifier = Modifier + .fillMaxWidth() + .padding(start = 8.dp), maxLines = 1, overflow = TextOverflow.Ellipsis, ) @@ -192,7 +211,9 @@ internal fun DetailHeader( color = MovieTheme.colorScheme.onBackground, style = MovieTheme.typography.bodyMedium, fontSize = 14.sp, - modifier = Modifier.fillMaxWidth().padding(start = 8.dp), + modifier = Modifier + .fillMaxWidth() + .padding(start = 8.dp), maxLines = 1, overflow = TextOverflow.Ellipsis, ) @@ -213,7 +234,9 @@ internal fun DetailHeader( color = MovieTheme.colorScheme.onBackground, style = MovieTheme.typography.bodyMedium, fontSize = 14.sp, - modifier = Modifier.fillMaxWidth().padding(start = 8.dp), + modifier = Modifier + .fillMaxWidth() + .padding(start = 8.dp), maxLines = 1, overflow = TextOverflow.Ellipsis, ) @@ -238,7 +261,9 @@ internal fun DetailHeader( color = MovieTheme.colorScheme.onBackground, style = MovieTheme.typography.bodyMedium, fontSize = 14.sp, - modifier = Modifier.fillMaxWidth().padding(start = 8.dp), + modifier = Modifier + .fillMaxWidth() + .padding(start = 8.dp), maxLines = 1, overflow = TextOverflow.Ellipsis, ) diff --git a/feature/detail/impl/src/main/java/soup/movie/feature/detail/impl/DetailViewModel.kt b/feature/detail/impl/src/main/java/soup/movie/feature/detail/impl/DetailViewModel.kt index 2b03c6482..7bfe47c43 100644 --- a/feature/detail/impl/src/main/java/soup/movie/feature/detail/impl/DetailViewModel.kt +++ b/feature/detail/impl/src/main/java/soup/movie/feature/detail/impl/DetailViewModel.kt @@ -28,11 +28,13 @@ import kotlinx.coroutines.withContext import soup.movie.common.DefaultDispatcher import soup.movie.data.repository.MovieRepository import soup.movie.datetime.MM_DD +import soup.movie.datetime.today import soup.movie.datetime.yesterday -import soup.movie.domain.movie.screenDays import soup.movie.log.Logger import soup.movie.model.MovieDetailModel +import soup.movie.model.MovieModel import soup.movie.model.OpenDateAlarmModel +import java.time.temporal.ChronoUnit import javax.inject.Inject @HiltViewModel @@ -210,5 +212,13 @@ class DetailViewModel @Inject constructor( companion object { private const val NO_RATING = "평점없음" + + private fun MovieModel.screenDays(): Int { + val openDate = openLocalDate + if (openDate != null) { + return ChronoUnit.DAYS.between(openDate, today()).toInt() + } + return 0 + } } } diff --git a/feature/home/impl/build.gradle b/feature/home/impl/build.gradle index fe65b5fc3..e912fb747 100644 --- a/feature/home/impl/build.gradle +++ b/feature/home/impl/build.gradle @@ -17,7 +17,6 @@ dependencies { implementation projects.data.settings.api implementation projects.data.repository.api implementation projects.data.model - implementation projects.domain implementation projects.feature.home.api implementation libs.kotlin.stdlib diff --git a/feature/home/impl/src/main/java/soup/movie/feature/home/impl/plan/HomePlanViewModel.kt b/feature/home/impl/src/main/java/soup/movie/feature/home/impl/plan/HomePlanViewModel.kt index 8113895b6..75878d78d 100644 --- a/feature/home/impl/src/main/java/soup/movie/feature/home/impl/plan/HomePlanViewModel.kt +++ b/feature/home/impl/src/main/java/soup/movie/feature/home/impl/plan/HomePlanViewModel.kt @@ -26,7 +26,6 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch import soup.movie.data.repository.MovieRepository import soup.movie.data.settings.AppSettings -import soup.movie.domain.movie.getDDay import soup.movie.feature.home.impl.domain.getMovieFilterFlow import soup.movie.log.Logger import soup.movie.model.MovieModel @@ -54,7 +53,7 @@ class HomePlanViewModel @Inject constructor( repository.getPlanMovieList() .combine(appSettings.getMovieFilterFlow()) { movieList, movieFilter -> movieList.asSequence() - .sortedBy { it.getDDay() } + .sortedBy { it.dDay ?: 999 } .filter { movieFilter(it) } .toList() } diff --git a/feature/home/impl/src/main/java/soup/movie/feature/home/impl/tab/MovieList.kt b/feature/home/impl/src/main/java/soup/movie/feature/home/impl/tab/MovieList.kt index 58a8c4cc3..8496eadca 100644 --- a/feature/home/impl/src/main/java/soup/movie/feature/home/impl/tab/MovieList.kt +++ b/feature/home/impl/src/main/java/soup/movie/feature/home/impl/tab/MovieList.kt @@ -37,12 +37,11 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import soup.movie.core.designsystem.theme.MovieTheme import soup.movie.core.imageloading.AsyncImage -import soup.movie.domain.movie.getDDayLabel -import soup.movie.domain.movie.isDDay import soup.movie.feature.home.impl.favorite.MovieAgeBadge import soup.movie.feature.home.impl.favorite.MovieDDayTag import soup.movie.model.MovieModel import soup.movie.model.TheaterRatingsModel +import soup.movie.resources.dDayStringResource @Composable fun MovieList( @@ -105,13 +104,15 @@ private fun MovieItem( .padding(7.dp) .align(Alignment.BottomStart), ) - if (movie.isDDay()) { - MovieDDayTag( - text = movie.getDDayLabel().orEmpty(), - modifier = Modifier - .padding(4.dp) - .align(Alignment.BottomEnd), - ) + if (movie.isPlan) { + movie.dDay?.let { + MovieDDayTag( + text = dDayStringResource(dDay = it), + modifier = Modifier + .padding(4.dp) + .align(Alignment.BottomEnd), + ) + } } } } @@ -152,6 +153,8 @@ private class MovieListPreviewParameterProvider : PreviewParameterProvider