Skip to content

Commit

Permalink
Improve logic (#197)
Browse files Browse the repository at this point in the history
  • Loading branch information
AfigAliyev committed Oct 21, 2022
1 parent 50a785a commit 2c5fa39
Show file tree
Hide file tree
Showing 30 changed files with 96 additions and 333 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ fun CinemaxNavHost(
)
}
)
settingsGraph(onShowMessage = onShowMessage)
settingsGraph()
listGraph(
onBackButtonClick = onBackClick,
onNavigateToDetailsDestination = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,3 @@ fun <T> CinemaxResult<T>.handle(builder: CinemaxResultHandler<T>.() -> Unit) {

suspend fun <T> Flow<CinemaxResult<T>>.handle(builder: CinemaxResultHandler<T>.() -> Unit) =
collect { result -> result.handle(builder = builder) }

@JvmName("onEmptyT")
fun <T> CinemaxResultHandler<T>.onEmpty(block: () -> Unit) {
onSuccess { value -> if (value == null) block() }
}

@JvmName("onEmptyListT")
fun <T> CinemaxResultHandler<List<T>>.onEmpty(block: () -> Unit) {
onSuccess { value -> if (value.isEmpty()) block() }
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,27 +16,12 @@

package com.maximillianleonov.cinemax.core.data.repository

import com.maximillianleonov.cinemax.core.database.source.MovieDatabaseDataSource
import com.maximillianleonov.cinemax.core.database.source.MovieDetailsDatabaseDataSource
import com.maximillianleonov.cinemax.core.database.source.SettingsDatabaseDataSource
import com.maximillianleonov.cinemax.core.database.source.TvShowDatabaseDataSource
import com.maximillianleonov.cinemax.core.database.source.TvShowDetailsDatabaseDataSource
import com.maximillianleonov.cinemax.core.domain.repository.SettingsRepository
import javax.inject.Inject

class SettingsRepositoryImpl @Inject constructor(
private val databaseDataSource: SettingsDatabaseDataSource,
private val movieDatabaseDataSource: MovieDatabaseDataSource,
private val tvShowDatabaseDataSource: TvShowDatabaseDataSource,
private val movieDetailsDatabaseDataSource: MovieDetailsDatabaseDataSource,
private val tvShowDetailsDatabaseDataSource: TvShowDetailsDatabaseDataSource
databaseDataSource: SettingsDatabaseDataSource
) : SettingsRepository {
override fun getVersion(): String = databaseDataSource.getVersion()

override suspend fun clearCache() {
movieDatabaseDataSource.deleteAll()
tvShowDatabaseDataSource.deleteAll()
movieDetailsDatabaseDataSource.deleteAll()
tvShowDetailsDatabaseDataSource.deleteAll()
}
override val version = databaseDataSource.version
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,4 @@ interface MovieDao {

@Query("DELETE FROM $MOVIES WHERE media_type = :mediaType")
suspend fun deleteByMediaType(mediaType: MediaType.Movie)

@Query("DELETE FROM $MOVIES")
suspend fun deleteAll()
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,4 @@ interface MovieDetailsDao {

@Query("DELETE FROM $MOVIE_DETAILS WHERE id = :id")
suspend fun deleteById(id: Int)

@Query("DELETE FROM $MOVIE_DETAILS")
suspend fun deleteAll()
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,4 @@ interface TvShowDao {

@Query("DELETE FROM $TV_SHOWS WHERE media_type = :mediaType")
suspend fun deleteByMediaType(mediaType: MediaType.TvShow)

@Query("DELETE FROM $TV_SHOWS")
suspend fun deleteAll()
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,4 @@ interface TvShowDetailsDao {

@Query("DELETE FROM $TV_SHOW_DETAILS WHERE id = :id")
suspend fun deleteById(id: Int)

@Query("DELETE FROM $TV_SHOW_DETAILS")
suspend fun deleteAll()
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,6 @@ class MovieDatabaseDataSource @Inject constructor(
movieDao.insertAll(movies)
}

suspend fun deleteByMediaType(mediaType: MediaType.Movie) =
movieDao.deleteByMediaType(mediaType)

suspend fun deleteAll() = movieDao.deleteAll()

suspend fun getRemoteKeyByIdAndMediaType(id: Int, mediaType: MediaType.Movie) =
movieRemoteKeyDao.getByIdAndMediaType(id, mediaType)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,4 @@ class MovieDetailsDatabaseDataSource @Inject constructor(
movieDetailsDao.insert(movieDetails)
}
}

suspend fun deleteAll() {
movieDetailsDao.deleteAll()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ package com.maximillianleonov.cinemax.core.database.source
import com.maximillianleonov.cinemax.core.database.util.CinemaxVersionProvider
import javax.inject.Inject

class SettingsDatabaseDataSource @Inject constructor(
private val versionProvider: CinemaxVersionProvider
) {
fun getVersion() = versionProvider.version
class SettingsDatabaseDataSource @Inject constructor(versionProvider: CinemaxVersionProvider) {
val version = versionProvider.version
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,6 @@ class TvShowDatabaseDataSource @Inject constructor(
tvShowDao.insertAll(tvShows)
}

suspend fun deleteByMediaType(mediaType: MediaType.TvShow) =
tvShowDao.deleteByMediaType(mediaType)

suspend fun deleteAll() = tvShowDao.deleteAll()

suspend fun getRemoteKeyByIdAndMediaType(id: Int, mediaType: MediaType.TvShow) =
tvShowRemoteKeyDao.getByIdAndMediaType(id, mediaType)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,4 @@ class TvShowDetailsDatabaseDataSource @Inject constructor(
tvShowDetailsDao.insert(tvShowDetails)
}
}

suspend fun deleteAll() {
tvShowDetailsDao.deleteAll()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,5 @@
package com.maximillianleonov.cinemax.core.domain.repository

interface SettingsRepository {
fun getVersion(): String
suspend fun clearCache()
val version: String
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@ import com.maximillianleonov.cinemax.core.domain.repository.SettingsRepository
import javax.inject.Inject

class GetSettingsVersionUseCase @Inject constructor(private val repository: SettingsRepository) {
operator fun invoke() = repository.getVersion()
operator fun invoke() = repository.version
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,20 @@

package com.maximillianleonov.cinemax.core.domain.usecase

import com.maximillianleonov.cinemax.core.domain.model.WishlistModel
import com.maximillianleonov.cinemax.core.domain.repository.MovieDetailsRepository
import com.maximillianleonov.cinemax.core.domain.repository.WishlistRepository
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.flatMapLatest
import javax.inject.Inject

class GetWishlistMoviesUseCase @Inject constructor(private val wishlistRepository: WishlistRepository) {
operator fun invoke() = wishlistRepository.getMovies()
class GetWishlistMoviesUseCase @Inject constructor(
private val wishlistRepository: WishlistRepository,
private val movieDetailsRepository: MovieDetailsRepository
) {
@OptIn(ExperimentalCoroutinesApi::class)
operator fun invoke() = wishlistRepository.getMovies().flatMapLatest { wishlistMovies ->
val ids = wishlistMovies.map(WishlistModel::id)
movieDetailsRepository.getByIds(ids)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,20 @@

package com.maximillianleonov.cinemax.core.domain.usecase

import com.maximillianleonov.cinemax.core.domain.model.WishlistModel
import com.maximillianleonov.cinemax.core.domain.repository.TvShowDetailsRepository
import com.maximillianleonov.cinemax.core.domain.repository.WishlistRepository
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.flatMapLatest
import javax.inject.Inject

class GetWishlistTvShowsUseCase @Inject constructor(private val wishlistRepository: WishlistRepository) {
operator fun invoke() = wishlistRepository.getTvShows()
class GetWishlistTvShowsUseCase @Inject constructor(
private val wishlistRepository: WishlistRepository,
private val tvShowDetailsRepository: TvShowDetailsRepository
) {
@OptIn(ExperimentalCoroutinesApi::class)
operator fun invoke() = wishlistRepository.getTvShows().flatMapLatest { wishlistTvShows ->
val ids = wishlistTvShows.map(WishlistModel::id)
tvShowDetailsRepository.getByIds(ids)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,8 @@
* limitations under the License.
*/

package com.maximillianleonov.cinemax.core.domain.usecase
package com.maximillianleonov.cinemax.core.ui.common

import com.maximillianleonov.cinemax.core.domain.repository.SettingsRepository
import javax.inject.Inject

class SettingsClearCacheUseCase @Inject constructor(private val repository: SettingsRepository) {
suspend operator fun invoke() = repository.clearCache()
interface EventHandler<E> {
fun onEvent(event: E)
}
30 changes: 0 additions & 30 deletions core/core-ui/src/main/res/drawable/ic_trash.xml

This file was deleted.

6 changes: 1 addition & 5 deletions core/core-ui/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,9 @@
<string name="wishlist">Wishlist</string>
<string name="settings">Settings</string>

<string name="general">General</string>
<string name="more">More</string>
<string name="clear_cache">Clear Cache</string>
<string name="about">About</string>
<string name="version">Version</string>

<string name="cache_cleared">Your cache has been cleared.</string>

<string name="back">Back</string>
<string name="forward">Forward</string>
<string name="clear">Clear</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import com.maximillianleonov.cinemax.core.domain.usecase.RemoveTvShowFromWishlis
import com.maximillianleonov.cinemax.core.model.MediaType
import com.maximillianleonov.cinemax.core.model.UserMessage
import com.maximillianleonov.cinemax.core.ui.R
import com.maximillianleonov.cinemax.core.ui.common.EventHandler
import com.maximillianleonov.cinemax.core.ui.mapper.asMovieDetails
import com.maximillianleonov.cinemax.core.ui.mapper.asTvShowDetails
import com.maximillianleonov.cinemax.feature.details.navigation.DetailsDestination
Expand All @@ -49,13 +50,13 @@ class DetailsViewModel @Inject constructor(
private val removeMovieFromWishlistUseCase: RemoveMovieFromWishlistUseCase,
private val removeTvShowFromWishlistUseCase: RemoveTvShowFromWishlistUseCase,
savedStateHandle: SavedStateHandle
) : ViewModel() {
) : ViewModel(), EventHandler<DetailsEvent> {
private val _uiState = MutableStateFlow(getInitialUiState(savedStateHandle))
val uiState = _uiState.asStateFlow()

private var contentJob = loadContent()

fun onEvent(event: DetailsEvent) = when (event) {
override fun onEvent(event: DetailsEvent) = when (event) {
DetailsEvent.WishlistMovie -> onWishlistMovie()
DetailsEvent.WishlistTvShow -> onWishlistTvShow()
DetailsEvent.Refresh -> onRefresh()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@ package com.maximillianleonov.cinemax.feature.home
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.maximillianleonov.cinemax.core.common.result.handle
import com.maximillianleonov.cinemax.core.common.result.onEmpty
import com.maximillianleonov.cinemax.core.domain.model.MovieModel
import com.maximillianleonov.cinemax.core.domain.model.TvShowModel
import com.maximillianleonov.cinemax.core.domain.usecase.GetMoviesUseCase
import com.maximillianleonov.cinemax.core.domain.usecase.GetTvShowsUseCase
import com.maximillianleonov.cinemax.core.model.MediaType
import com.maximillianleonov.cinemax.core.model.Movie
import com.maximillianleonov.cinemax.core.model.TvShow
import com.maximillianleonov.cinemax.core.ui.common.EventHandler
import com.maximillianleonov.cinemax.core.ui.mapper.asMediaTypeModel
import com.maximillianleonov.cinemax.core.ui.mapper.asMovie
import com.maximillianleonov.cinemax.core.ui.mapper.asTvShow
Expand All @@ -42,15 +42,15 @@ import javax.inject.Inject
class HomeViewModel @Inject constructor(
private val getMoviesUseCase: GetMoviesUseCase,
private val getTvShowsUseCase: GetTvShowsUseCase
) : ViewModel() {
) : ViewModel(), EventHandler<HomeEvent> {
private val _uiState = MutableStateFlow(HomeUiState())
val uiState = _uiState.asStateFlow()

init {
loadContent()
}

fun onEvent(event: HomeEvent) = when (event) {
override fun onEvent(event: HomeEvent) = when (event) {
HomeEvent.Refresh -> onRefresh()
HomeEvent.Retry -> onRetry()
HomeEvent.ClearError -> onClearError()
Expand Down Expand Up @@ -106,7 +106,6 @@ class HomeViewModel @Inject constructor(
}
}
onFailure { error -> handleFailure(error = error, mediaType = mediaType) }
onEmpty(::handleEmpty)
}
}

Expand All @@ -131,7 +130,6 @@ class HomeViewModel @Inject constructor(
}
}
onFailure { error -> handleFailure(error = error, mediaType = mediaType) }
onEmpty(::handleEmpty)
}
}

Expand All @@ -144,14 +142,4 @@ class HomeViewModel @Inject constructor(
loadStates = it.loadStates + (mediaType to false)
)
}

private fun handleEmpty() {
val state = uiState.value

if (state.movies.values.all(List<Movie>::isEmpty) &&
state.tvShows.values.all(List<TvShow>::isEmpty)
) {
onRefresh()
}
}
}
Loading

0 comments on commit 2c5fa39

Please sign in to comment.