Skip to content

Commit

Permalink
Remove extension plugin from :movie
Browse files Browse the repository at this point in the history
  • Loading branch information
michaldrabik committed Aug 5, 2023
1 parent 7f5a3ba commit 42940c9
Show file tree
Hide file tree
Showing 9 changed files with 173 additions and 141 deletions.
1 change: 0 additions & 1 deletion ui-movie/build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
apply from: '../versions.gradle'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,22 @@ import com.michaldrabik.ui_base.utilities.extensions.navigateToSafe
import com.michaldrabik.ui_base.utilities.extensions.onClick
import com.michaldrabik.ui_base.utilities.extensions.trimWithSuffix
import com.michaldrabik.ui_base.utilities.extensions.visibleIf
import com.michaldrabik.ui_base.utilities.viewBinding
import com.michaldrabik.ui_model.Movie
import com.michaldrabik.ui_model.Person
import com.michaldrabik.ui_model.Person.Department
import com.michaldrabik.ui_movie.MovieDetailsEvent.OpenPeopleSheet
import com.michaldrabik.ui_movie.MovieDetailsEvent.OpenPersonSheet
import com.michaldrabik.ui_movie.MovieDetailsFragment
import com.michaldrabik.ui_movie.MovieDetailsViewModel
import com.michaldrabik.ui_movie.R
import com.michaldrabik.ui_movie.databinding.FragmentMovieDetailsPeopleBinding
import com.michaldrabik.ui_movie.sections.people.recycler.ActorsAdapter
import com.michaldrabik.ui_navigation.java.NavigationArgs.ARG_PERSON
import com.michaldrabik.ui_navigation.java.NavigationArgs.REQUEST_DETAILS
import com.michaldrabik.ui_people.details.PersonDetailsBottomSheet
import com.michaldrabik.ui_people.list.PeopleListBottomSheet
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.android.synthetic.main.fragment_movie_details.*
import kotlinx.android.synthetic.main.fragment_movie_details_people.*

@AndroidEntryPoint
class MovieDetailsPeopleFragment : BaseFragment<MovieDetailsPeopleViewModel>(R.layout.fragment_movie_details_people) {
Expand All @@ -39,6 +40,7 @@ class MovieDetailsPeopleFragment : BaseFragment<MovieDetailsPeopleViewModel>(R.l

private val parentViewModel by viewModels<MovieDetailsViewModel>({ requireParentFragment() })
override val viewModel by viewModels<MovieDetailsPeopleViewModel>()
private val binding by viewBinding(FragmentMovieDetailsPeopleBinding::bind)

private var actorsAdapter: ActorsAdapter? = null

Expand All @@ -57,7 +59,7 @@ class MovieDetailsPeopleFragment : BaseFragment<MovieDetailsPeopleViewModel>(R.l
actorsAdapter = ActorsAdapter().apply {
itemClickListener = { viewModel.loadPersonDetails(it) }
}
movieDetailsActorsRecycler.apply {
binding.movieDetailsActorsRecycler.apply {
setHasFixedSize(true)
adapter = actorsAdapter
layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
Expand All @@ -83,22 +85,24 @@ class MovieDetailsPeopleFragment : BaseFragment<MovieDetailsPeopleViewModel>(R.l

handleSheetResult()

val title = requireParentFragment().movieDetailsTitle.text.toString()
val title = (requireParentFragment() as MovieDetailsFragment).binding.movieDetailsTitle.text.toString()
val bundle = PeopleListBottomSheet.createBundle(movie.ids.trakt, title, Mode.MOVIES, department)
navigateToSafe(R.id.actionMovieDetailsFragmentToPeopleList, bundle)
}

private fun render(uiState: MovieDetailsPeopleUiState) {
with(uiState) {
actors?.let {
if (actorsAdapter?.itemCount != 0) return@let
actorsAdapter?.setItems(it)
movieDetailsActorsRecycler.visibleIf(actors.isNotEmpty(), gone = false)
movieDetailsActorsEmptyView.visibleIf(actors.isEmpty())
}
crew?.let { renderCrew(it) }
isLoading.let {
movieDetailsActorsProgress.visibleIf(it)
with(binding) {
actors?.let {
if (actorsAdapter?.itemCount != 0) return@let
actorsAdapter?.setItems(it)
movieDetailsActorsRecycler.visibleIf(actors.isNotEmpty(), gone = false)
movieDetailsActorsEmptyView.visibleIf(actors.isEmpty())
}
crew?.let { renderCrew(it) }
isLoading.let {
movieDetailsActorsProgress.visibleIf(it)
}
}
}
}
Expand Down Expand Up @@ -128,9 +132,11 @@ class MovieDetailsPeopleFragment : BaseFragment<MovieDetailsPeopleViewModel>(R.l
val writers = crew[Department.WRITING] ?: emptyList()
val sound = crew[Department.SOUND] ?: emptyList()

renderPeople(movieDetailsDirectingLabel, movieDetailsDirectingValue, directors, Department.DIRECTING)
renderPeople(movieDetailsWritingLabel, movieDetailsWritingValue, writers, Department.WRITING)
renderPeople(movieDetailsMusicLabel, movieDetailsMusicValue, sound, Department.SOUND)
with(binding) {
renderPeople(movieDetailsDirectingLabel, movieDetailsDirectingValue, directors, Department.DIRECTING)
renderPeople(movieDetailsWritingLabel, movieDetailsWritingValue, writers, Department.WRITING)
renderPeople(movieDetailsMusicLabel, movieDetailsMusicValue, sound, Department.SOUND)
}
}

private fun handleEvent(event: Event<*>) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.michaldrabik.ui_movie.sections.people.recycler

import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
import android.widget.FrameLayout
import com.bumptech.glide.Glide
Expand All @@ -18,18 +19,19 @@ import com.michaldrabik.ui_base.utilities.extensions.visible
import com.michaldrabik.ui_base.utilities.extensions.withFailListener
import com.michaldrabik.ui_model.Person
import com.michaldrabik.ui_movie.R
import kotlinx.android.synthetic.main.view_actor_movie.view.*
import com.michaldrabik.ui_movie.databinding.ViewActorMovieBinding

class ActorView : FrameLayout {

constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

private val binding = ViewActorMovieBinding.inflate(LayoutInflater.from(context), this)

private val cornerRadius by lazy { context.dimenToPx(R.dimen.actorMovieTileCorner) }

init {
inflate(context, R.layout.view_actor_movie, this)
layoutParams = LayoutParams(WRAP_CONTENT, WRAP_CONTENT)
clipChildren = false
}
Expand All @@ -38,32 +40,35 @@ class ActorView : FrameLayout {
clear()
tag = item.ids.tmdb.id
onClick { clickListener(item) }
actorMovieName.text = item.name.split(" ").joinToString("\n")
binding.actorMovieName.text = item.name.split(" ").joinToString("\n")
loadImage(item)
}

private fun loadImage(actor: Person) {
if (actor.imagePath.isNullOrBlank()) {
actorMoviePlaceholder.visible()
actorMovieImage.gone()
return
}

Glide.with(this)
.load("$TMDB_IMAGE_BASE_ACTOR_URL${actor.imagePath}")
.diskCacheStrategy(DATA)
.transform(CenterCrop(), RoundedCorners(cornerRadius))
.transition(withCrossFade(IMAGE_FADE_DURATION_MS))
.withFailListener {
with(binding) {
if (actor.imagePath.isNullOrBlank()) {
actorMoviePlaceholder.visible()
actorMovieImage.gone()
return
}
.into(actorMovieImage)
Glide.with(this@ActorView)
.load("$TMDB_IMAGE_BASE_ACTOR_URL${actor.imagePath}")
.diskCacheStrategy(DATA)
.transform(CenterCrop(), RoundedCorners(cornerRadius))
.transition(withCrossFade(IMAGE_FADE_DURATION_MS))
.withFailListener {
actorMoviePlaceholder.visible()
actorMovieImage.gone()
}
.into(actorMovieImage)
}
}

private fun clear() {
actorMovieImage.visible()
actorMoviePlaceholder.gone()
Glide.with(this).clear(actorMovieImage)
with(binding) {
actorMovieImage.visible()
actorMoviePlaceholder.gone()
Glide.with(this@ActorView).clear(actorMovieImage)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,20 @@ import com.michaldrabik.ui_base.utilities.events.MessageEvent
import com.michaldrabik.ui_base.utilities.extensions.launchAndRepeatStarted
import com.michaldrabik.ui_base.utilities.extensions.openImdbUrl
import com.michaldrabik.ui_base.utilities.extensions.openWebUrl
import com.michaldrabik.ui_base.utilities.viewBinding
import com.michaldrabik.ui_model.IdImdb
import com.michaldrabik.ui_movie.MovieDetailsViewModel
import com.michaldrabik.ui_movie.R
import com.michaldrabik.ui_movie.databinding.FragmentMovieDetailsRatingsBinding
import com.michaldrabik.ui_movie.helpers.MovieLink
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.android.synthetic.main.fragment_movie_details_ratings.movieDetailsRatings

@AndroidEntryPoint
class MovieDetailsRatingsFragment : BaseFragment<MovieDetailsRatingsViewModel>(R.layout.fragment_movie_details_ratings) {

private val parentViewModel by viewModels<MovieDetailsViewModel>({ requireParentFragment() })
override val viewModel by viewModels<MovieDetailsRatingsViewModel>()
private val binding by viewBinding(FragmentMovieDetailsRatingsBinding::bind)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Expand All @@ -33,21 +35,23 @@ class MovieDetailsRatingsFragment : BaseFragment<MovieDetailsRatingsViewModel>(R

private fun render(uiState: MovieDetailsRatingsUiState) {
with(uiState) {
ratings?.let {
if (movieDetailsRatings.isBound() && !isRefreshingRatings) {
return
}
movieDetailsRatings.bind(ratings)
movie?.let {
movieDetailsRatings.onTraktClick = { openMovieLink(MovieLink.TRAKT, movie.traktId.toString()) }
movieDetailsRatings.onImdbClick = { openMovieLink(MovieLink.IMDB, movie.ids.imdb.id) }
movieDetailsRatings.onMetaClick = { openMovieLink(MovieLink.METACRITIC, movie.title) }
movieDetailsRatings.onRottenClick = {
val url = it.rottenTomatoesUrl
if (!url.isNullOrBlank()) {
openWebUrl(url) ?: openMovieLink(MovieLink.ROTTEN, "${movie.title} ${movie.year}")
} else {
openMovieLink(MovieLink.ROTTEN, "${movie.title} ${movie.year}")
with(binding) {
ratings?.let {
if (movieDetailsRatings.isBound() && !isRefreshingRatings) {
return
}
movieDetailsRatings.bind(ratings)
movie?.let {
movieDetailsRatings.onTraktClick = { openMovieLink(MovieLink.TRAKT, movie.traktId.toString()) }
movieDetailsRatings.onImdbClick = { openMovieLink(MovieLink.IMDB, movie.ids.imdb.id) }
movieDetailsRatings.onMetaClick = { openMovieLink(MovieLink.METACRITIC, movie.title) }
movieDetailsRatings.onRottenClick = {
val url = it.rottenTomatoesUrl
if (!url.isNullOrBlank()) {
openWebUrl(url) ?: openMovieLink(MovieLink.ROTTEN, "${movie.title} ${movie.year}")
} else {
openMovieLink(MovieLink.ROTTEN, "${movie.title} ${movie.year}")
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,22 @@ import com.michaldrabik.ui_base.utilities.extensions.addDivider
import com.michaldrabik.ui_base.utilities.extensions.fadeIf
import com.michaldrabik.ui_base.utilities.extensions.launchAndRepeatStarted
import com.michaldrabik.ui_base.utilities.extensions.visibleIf
import com.michaldrabik.ui_base.utilities.viewBinding
import com.michaldrabik.ui_movie.MovieDetailsViewModel
import com.michaldrabik.ui_movie.R
import com.michaldrabik.ui_movie.databinding.FragmentMovieDetailsRelatedBinding
import com.michaldrabik.ui_movie.sections.related.recycler.RelatedListItem
import com.michaldrabik.ui_movie.sections.related.recycler.RelatedMovieAdapter
import com.michaldrabik.ui_navigation.java.NavigationArgs.ARG_MOVIE_ID
import com.michaldrabik.ui_navigation.java.NavigationArgs.REQUEST_ITEM_MENU
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.android.synthetic.main.fragment_movie_details_related.*

@AndroidEntryPoint
class MovieDetailsRelatedFragment : BaseFragment<MovieDetailsRelatedViewModel>(R.layout.fragment_movie_details_related) {

private val parentViewModel by viewModels<MovieDetailsViewModel>({ requireParentFragment() })
override val viewModel by viewModels<MovieDetailsRelatedViewModel>()
private val binding by viewBinding(FragmentMovieDetailsRelatedBinding::bind)

private var relatedAdapter: RelatedMovieAdapter? = null

Expand All @@ -46,7 +48,7 @@ class MovieDetailsRelatedFragment : BaseFragment<MovieDetailsRelatedViewModel>(R
itemLongClickListener = ::openContextMenu,
missingImageListener = { ids, force -> viewModel.loadMissingImage(ids, force) }
)
movieDetailsRelatedRecycler.apply {
binding.movieDetailsRelatedRecycler.apply {
setHasFixedSize(true)
adapter = relatedAdapter
layoutManager = LinearLayoutManager(requireContext(), HORIZONTAL, false)
Expand Down Expand Up @@ -75,13 +77,15 @@ class MovieDetailsRelatedFragment : BaseFragment<MovieDetailsRelatedViewModel>(R

private fun render(uiState: MovieDetailsRelatedUiState) {
with(uiState) {
relatedMovies?.let {
relatedAdapter?.setItems(it)
movieDetailsRelatedRecycler.visibleIf(it.isNotEmpty())
movieDetailsRelatedLabel.fadeIf(it.isNotEmpty(), hardware = true)
}
isLoading.let {
movieDetailsRelatedProgress.visibleIf(it)
with(binding) {
relatedMovies?.let {
relatedAdapter?.setItems(it)
movieDetailsRelatedRecycler.visibleIf(it.isNotEmpty())
movieDetailsRelatedLabel.fadeIf(it.isNotEmpty(), hardware = true)
}
isLoading.let {
movieDetailsRelatedProgress.visibleIf(it)
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.michaldrabik.ui_movie.sections.related.recycler
import android.content.Context
import android.content.res.ColorStateList
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
import android.widget.ImageView
import androidx.core.content.ContextCompat
Expand All @@ -17,16 +18,17 @@ import com.michaldrabik.ui_base.utilities.extensions.visibleIf
import com.michaldrabik.ui_model.ImageStatus.AVAILABLE
import com.michaldrabik.ui_model.ImageStatus.UNAVAILABLE
import com.michaldrabik.ui_movie.R
import kotlinx.android.synthetic.main.view_related_movie.view.*
import com.michaldrabik.ui_movie.databinding.ViewRelatedMovieBinding

class RelatedMovieView : MovieView<RelatedListItem> {

constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

private val binding = ViewRelatedMovieBinding.inflate(LayoutInflater.from(context), this)

init {
inflate(context, R.layout.view_related_movie, this)
layoutParams = LayoutParams(WRAP_CONTENT, WRAP_CONTENT)
clipChildren = false
onClick { itemClickListener?.invoke(item) }
Expand All @@ -36,40 +38,43 @@ class RelatedMovieView : MovieView<RelatedListItem> {
private val colorAccent by lazy { ContextCompat.getColor(context, R.color.colorAccent) }
private val colorGray by lazy { ContextCompat.getColor(context, R.color.colorGrayLight) }

override val imageView: ImageView = relatedMovieImage
override val placeholderView: ImageView = relatedMoviePlaceholder
override val imageView: ImageView = binding.relatedMovieImage
override val placeholderView: ImageView = binding.relatedMoviePlaceholder

private lateinit var item: RelatedListItem

override fun bind(item: RelatedListItem) {
clear()
this.item = item
relatedMovieTitle.text = item.movie.title
binding.relatedMovieTitle.text = item.movie.title

relatedMovieBadge.visibleIf(item.isFollowed || item.isWatchlist)
binding.relatedMovieBadge.visibleIf(item.isFollowed || item.isWatchlist)
val color = if (item.isFollowed) colorAccent else colorGray
ImageViewCompat.setImageTintList(relatedMovieBadge, ColorStateList.valueOf(color))
ImageViewCompat.setImageTintList(binding.relatedMovieBadge, ColorStateList.valueOf(color))

loadImage(item)
}

override fun loadImage(item: RelatedListItem) {
if (item.image.status == UNAVAILABLE) {
relatedMovieTitle.visible()
binding.relatedMovieTitle.visible()
}
super.loadImage(item)
}

override fun onImageLoadFail(item: RelatedListItem) {
super.onImageLoadFail(item)
if (item.image.status == AVAILABLE) {
relatedMovieTitle.visible()
binding.relatedMovieTitle.visible()
}
}

private fun clear() {
relatedMoviePlaceholder.gone()
relatedMovieTitle.gone()
Glide.with(this).clear(relatedMovieImage)
with(binding) {
relatedMoviePlaceholder.gone()
relatedMovieTitle.gone()
Glide.with(this@RelatedMovieView)
.clear(relatedMovieImage)
}
}
}
Loading

0 comments on commit 42940c9

Please sign in to comment.