diff --git a/app/src/main/java/com/kanyideveloper/muviz/MainActivity.kt b/app/src/main/java/com/kanyideveloper/muviz/MainActivity.kt index 1ec443f..823caaa 100644 --- a/app/src/main/java/com/kanyideveloper/muviz/MainActivity.kt +++ b/app/src/main/java/com/kanyideveloper/muviz/MainActivity.kt @@ -35,6 +35,7 @@ import com.ramcosta.composedestinations.generated.NavGraphs import com.ramcosta.composedestinations.generated.destinations.AccountScreenDestination import com.ramcosta.composedestinations.generated.destinations.FavoritesScreenDestination import com.ramcosta.composedestinations.generated.destinations.HomeScreenDestination +import com.ramcosta.composedestinations.generated.destinations.SearchScreenDestination import com.ramcosta.composedestinations.navigation.dependency import com.ramcosta.composedestinations.rememberNavHostEngine import dagger.hilt.android.AndroidEntryPoint @@ -65,7 +66,8 @@ class MainActivity : ComponentActivity() { showBottomBar = route in listOf( HomeScreenDestination.route, FavoritesScreenDestination.route, - AccountScreenDestination.route + AccountScreenDestination.route, + SearchScreenDestination.route, ) ) { innerPadding -> SharedTransitionLayout { diff --git a/app/src/main/java/com/kanyideveloper/muviz/common/domain/model/BottomNavItem.kt b/app/src/main/java/com/kanyideveloper/muviz/common/domain/model/BottomNavItem.kt index 1de2ada..091dd66 100644 --- a/app/src/main/java/com/kanyideveloper/muviz/common/domain/model/BottomNavItem.kt +++ b/app/src/main/java/com/kanyideveloper/muviz/common/domain/model/BottomNavItem.kt @@ -19,6 +19,7 @@ import com.kanyideveloper.muviz.R import com.ramcosta.composedestinations.generated.destinations.AccountScreenDestination import com.ramcosta.composedestinations.generated.destinations.FavoritesScreenDestination import com.ramcosta.composedestinations.generated.destinations.HomeScreenDestination +import com.ramcosta.composedestinations.generated.destinations.SearchScreenDestination sealed class BottomNavItem( val title: String, @@ -30,6 +31,11 @@ sealed class BottomNavItem( icon = R.drawable.ic_home, route = HomeScreenDestination.route ) + data object Search: BottomNavItem( + title = "Search", + icon = R.drawable.ic_search, + route = SearchScreenDestination.route, + ) data object Favorites: BottomNavItem( title = "Favorites", icon = R.drawable.ic_star, diff --git a/app/src/main/java/com/kanyideveloper/muviz/common/presentation/components/StandardScaffold.kt b/app/src/main/java/com/kanyideveloper/muviz/common/presentation/components/StandardScaffold.kt index b5d89b9..225de16 100644 --- a/app/src/main/java/com/kanyideveloper/muviz/common/presentation/components/StandardScaffold.kt +++ b/app/src/main/java/com/kanyideveloper/muviz/common/presentation/components/StandardScaffold.kt @@ -39,6 +39,7 @@ fun StandardScaffold( showBottomBar: Boolean = true, items: List = listOf( BottomNavItem.Home, + BottomNavItem.Search, BottomNavItem.Favorites, BottomNavItem.Account ), diff --git a/app/src/main/java/com/kanyideveloper/muviz/home/data/repository/MoviesRepository.kt b/app/src/main/java/com/kanyideveloper/muviz/home/data/repository/MoviesRepository.kt index c19f990..e5df382 100644 --- a/app/src/main/java/com/kanyideveloper/muviz/home/data/repository/MoviesRepository.kt +++ b/app/src/main/java/com/kanyideveloper/muviz/home/data/repository/MoviesRepository.kt @@ -19,6 +19,7 @@ import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData import com.kanyideveloper.muviz.common.data.network.TMDBApi +import com.kanyideveloper.muviz.common.util.Constants.PAGING_SIZE import com.kanyideveloper.muviz.home.domain.model.Movie import com.kanyideveloper.muviz.home.data.paging.NowPlayingMoviesSource import com.kanyideveloper.muviz.home.data.paging.PopularMoviesSource @@ -32,7 +33,7 @@ class MoviesRepository @Inject constructor(private val api: TMDBApi) { fun getTrendingMoviesThisWeek(): Flow> { return Pager( - config = PagingConfig(enablePlaceholders = false, pageSize = 27), + config = PagingConfig(enablePlaceholders = false, pageSize = PAGING_SIZE), pagingSourceFactory = { TrendingMoviesSource(api) } @@ -41,7 +42,7 @@ class MoviesRepository @Inject constructor(private val api: TMDBApi) { fun getUpcomingMovies(): Flow> { return Pager( - config = PagingConfig(enablePlaceholders = false, pageSize = 27), + config = PagingConfig(enablePlaceholders = false, pageSize = PAGING_SIZE), pagingSourceFactory = { UpcomingMoviesSource(api) } @@ -50,7 +51,7 @@ class MoviesRepository @Inject constructor(private val api: TMDBApi) { fun getTopRatedMovies(): Flow> { return Pager( - config = PagingConfig(enablePlaceholders = false, pageSize = 27), + config = PagingConfig(enablePlaceholders = false, pageSize = PAGING_SIZE), pagingSourceFactory = { TopRatedMoviesSource(api) } @@ -59,7 +60,7 @@ class MoviesRepository @Inject constructor(private val api: TMDBApi) { fun getNowPlayingMovies(): Flow> { return Pager( - config = PagingConfig(enablePlaceholders = false, pageSize = 27), + config = PagingConfig(enablePlaceholders = false, pageSize = PAGING_SIZE), pagingSourceFactory = { NowPlayingMoviesSource(api) } @@ -68,7 +69,7 @@ class MoviesRepository @Inject constructor(private val api: TMDBApi) { fun getPopularMovies(): Flow> { return Pager( - config = PagingConfig(enablePlaceholders = false, pageSize = 27), + config = PagingConfig(enablePlaceholders = false, pageSize = PAGING_SIZE), pagingSourceFactory = { PopularMoviesSource(api) } diff --git a/app/src/main/java/com/kanyideveloper/muviz/home/presentation/HomeScreen.kt b/app/src/main/java/com/kanyideveloper/muviz/home/presentation/HomeScreen.kt index 92a6f1c..a857f49 100644 --- a/app/src/main/java/com/kanyideveloper/muviz/home/presentation/HomeScreen.kt +++ b/app/src/main/java/com/kanyideveloper/muviz/home/presentation/HomeScreen.kt @@ -105,10 +105,6 @@ fun SharedTransitionScope.HomeScreen( navigator.navigateUp() } - HomeUiEvents.OnSearchClick -> { - navigator.navigate(SearchScreenDestination) - } - is HomeUiEvents.NavigateToFilmDetails -> { navigator.navigate( FilmDetailsScreenDestination( @@ -187,17 +183,6 @@ fun SharedTransitionScope.HomeScreenContent( }, modifier = Modifier.fillMaxWidth(), showBackArrow = false, - navActions = { - IconButton(onClick = { - onEvent(HomeUiEvents.OnSearchClick) - }) { - Icon( - painter = painterResource(id = R.drawable.ic_search), - contentDescription = null, - tint = MaterialTheme.colorScheme.onBackground.copy(.5f), - ) - } - } ) } ) { innerPadding -> diff --git a/app/src/main/java/com/kanyideveloper/muviz/home/presentation/HomeUiEvents.kt b/app/src/main/java/com/kanyideveloper/muviz/home/presentation/HomeUiEvents.kt index e37e38d..d4e2f0a 100644 --- a/app/src/main/java/com/kanyideveloper/muviz/home/presentation/HomeUiEvents.kt +++ b/app/src/main/java/com/kanyideveloper/muviz/home/presentation/HomeUiEvents.kt @@ -19,7 +19,6 @@ import com.kanyideveloper.muviz.common.domain.model.Film import com.kanyideveloper.muviz.genre.domain.model.Genre sealed interface HomeUiEvents { - data object OnSearchClick : HomeUiEvents data object NavigateBack : HomeUiEvents data object OnPullToRefresh : HomeUiEvents diff --git a/app/src/main/java/com/kanyideveloper/muviz/search/data/repository/SearchRepositoryImpl.kt b/app/src/main/java/com/kanyideveloper/muviz/search/data/repository/SearchRepositoryImpl.kt index 21e90f7..11f9333 100644 --- a/app/src/main/java/com/kanyideveloper/muviz/search/data/repository/SearchRepositoryImpl.kt +++ b/app/src/main/java/com/kanyideveloper/muviz/search/data/repository/SearchRepositoryImpl.kt @@ -15,12 +15,12 @@ */ package com.kanyideveloper.muviz.search.data.repository -import android.nfc.tech.MifareUltralight.PAGE_SIZE import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData import com.kanyideveloper.muviz.search.data.paging.SearchPagingSource import com.kanyideveloper.muviz.common.data.network.TMDBApi +import com.kanyideveloper.muviz.common.util.Constants.PAGING_SIZE import com.kanyideveloper.muviz.search.domain.model.Search import com.kanyideveloper.muviz.search.domain.repository.SearchRepository import kotlinx.coroutines.flow.Flow @@ -29,7 +29,7 @@ import javax.inject.Inject class SearchRepositoryImpl @Inject constructor(private val api: TMDBApi): SearchRepository { override fun multiSearch(queryParam: String): Flow> { return Pager( - config = PagingConfig(enablePlaceholders = false, pageSize = PAGE_SIZE), + config = PagingConfig(enablePlaceholders = false, pageSize = PAGING_SIZE), pagingSourceFactory = { SearchPagingSource(api, queryParam) } diff --git a/app/src/main/java/com/kanyideveloper/muviz/search/presentation/SearchScreen.kt b/app/src/main/java/com/kanyideveloper/muviz/search/presentation/SearchScreen.kt index 6e2702a..7988993 100644 --- a/app/src/main/java/com/kanyideveloper/muviz/search/presentation/SearchScreen.kt +++ b/app/src/main/java/com/kanyideveloper/muviz/search/presentation/SearchScreen.kt @@ -34,7 +34,7 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Search +import androidx.compose.material.icons.filled.Close import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.CircularProgressIndicator @@ -106,10 +106,6 @@ fun SearchScreen( state = searchUiState, onEvent = { event -> when (event) { - is SearchUiEvents.NavigateBack -> { - navigator.popBackStack() - } - is SearchUiEvents.SearchFilm -> { viewModel.searchAll(event.searchTerm) keyboardController?.hide() @@ -131,6 +127,10 @@ fun SearchScreen( ) } } + + SearchUiEvents.ClearSearchTerm -> { + viewModel.clearSearch() + } } } ) @@ -146,9 +146,6 @@ fun SearchScreenContent( Scaffold( topBar = { StandardToolbar( - onBackArrowClicked = { - onEvent(SearchUiEvents.NavigateBack) - }, title = { Text( text = stringResource(R.string.search_title), @@ -156,7 +153,6 @@ fun SearchScreenContent( ) }, modifier = Modifier.fillMaxWidth(), - showBackArrow = true ) } ) { innerPadding -> @@ -197,7 +193,7 @@ fun SearchScreenContent( searchResult.loadState.let { loadState -> when { - loadState.refresh is LoadState.Loading -> { + loadState.refresh is LoadState.Loading && state.searchTerm.isNotEmpty() -> { item { Column( modifier = Modifier @@ -330,14 +326,16 @@ fun SearchBar( maxLines = 1, singleLine = true, trailingIcon = { - IconButton(onClick = { - onEvent(SearchUiEvents.SearchFilm(searchTerm = state.searchTerm)) - }) { - Icon( - imageVector = Icons.Default.Search, - tint = MaterialTheme.colorScheme.onBackground.copy(.5f), - contentDescription = null - ) + if (state.searchTerm.isNotEmpty()) { + IconButton(onClick = { + onEvent(SearchUiEvents.ClearSearchTerm) + }) { + Icon( + imageVector = Icons.Default.Close, + tint = MaterialTheme.colorScheme.onBackground.copy(.5f), + contentDescription = null + ) + } } }, ) diff --git a/app/src/main/java/com/kanyideveloper/muviz/search/presentation/SearchUiEvents.kt b/app/src/main/java/com/kanyideveloper/muviz/search/presentation/SearchUiEvents.kt index 14849e0..970b9db 100644 --- a/app/src/main/java/com/kanyideveloper/muviz/search/presentation/SearchUiEvents.kt +++ b/app/src/main/java/com/kanyideveloper/muviz/search/presentation/SearchUiEvents.kt @@ -24,5 +24,5 @@ sealed interface SearchUiEvents { data class OpenFilmDetails(val search: Search?) : SearchUiEvents - data object NavigateBack : SearchUiEvents + data object ClearSearchTerm: SearchUiEvents } diff --git a/app/src/main/java/com/kanyideveloper/muviz/search/presentation/SearchViewModel.kt b/app/src/main/java/com/kanyideveloper/muviz/search/presentation/SearchViewModel.kt index 79ca3bd..ff8052e 100644 --- a/app/src/main/java/com/kanyideveloper/muviz/search/presentation/SearchViewModel.kt +++ b/app/src/main/java/com/kanyideveloper/muviz/search/presentation/SearchViewModel.kt @@ -26,6 +26,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import javax.inject.Inject @@ -122,4 +123,13 @@ class SearchViewModel @Inject constructor( } } } + + fun clearSearch() { + _searchUiState.update { + it.copy( + searchResult = emptyFlow(), + searchTerm = "" + ) + } + } }