Skip to content

Commit f83f6d8

Browse files
committed
ref: it compiles and runs
1 parent a8462b0 commit f83f6d8

File tree

6 files changed

+85
-52
lines changed

6 files changed

+85
-52
lines changed

app/src/main/kotlin/com/fernandocejas/sample/core/platform/BaseActivity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ abstract class BaseActivity : AppCompatActivity() {
4848
super.onBackPressed()
4949
}
5050

51+
fun toolbar() = binding.toolBarContainer.toolbar
52+
5153
fun fragmentContainer() = binding.fragmentContainer
5254
fun progressBar() = binding.toolBarContainer.progress
5355

app/src/main/kotlin/com/fernandocejas/sample/core/platform/BaseFragment.kt

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@
1616
package com.fernandocejas.sample.core.platform
1717

1818
import android.os.Bundle
19-
import android.view.LayoutInflater
2019
import android.view.View
21-
import android.view.ViewGroup
2220
import androidx.annotation.StringRes
2321
import androidx.core.content.ContextCompat
2422
import androidx.fragment.app.Fragment
@@ -36,15 +34,6 @@ import dagger.hilt.android.AndroidEntryPoint
3634
@AndroidEntryPoint
3735
abstract class BaseFragment : Fragment() {
3836

39-
abstract fun layoutId(): Int
40-
41-
override fun onCreateView(
42-
inflater: LayoutInflater,
43-
container: ViewGroup?,
44-
savedInstanceState: Bundle?
45-
): View =
46-
inflater.inflate(layoutId(), container, false)
47-
4837
open fun onBackPressed() {}
4938

5039
internal fun firstTimeCreated(savedInstanceState: Bundle?) = savedInstanceState == null

app/src/main/kotlin/com/fernandocejas/sample/features/login/LoginFragment.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@
1515
*/
1616
package com.fernandocejas.sample.features.login
1717

18-
import com.fernandocejas.sample.R
1918
import com.fernandocejas.sample.core.platform.BaseFragment
2019

21-
class LoginFragment : BaseFragment() {
22-
override fun layoutId() = R.layout.fragment_login
23-
}
20+
class LoginFragment : BaseFragment()

app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsFragment.kt

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,26 @@
1616
package com.fernandocejas.sample.features.movies
1717

1818
import android.os.Bundle
19+
import android.view.LayoutInflater
1920
import android.view.View
21+
import android.view.ViewGroup
2022
import androidx.core.os.bundleOf
2123
import androidx.fragment.app.viewModels
2224
import com.fernandocejas.sample.R
2325
import com.fernandocejas.sample.core.exception.Failure
2426
import com.fernandocejas.sample.core.exception.Failure.NetworkConnection
2527
import com.fernandocejas.sample.core.exception.Failure.ServerError
26-
import com.fernandocejas.sample.core.extension.*
28+
import com.fernandocejas.sample.core.extension.close
29+
import com.fernandocejas.sample.core.extension.failure
30+
import com.fernandocejas.sample.core.extension.isVisible
31+
import com.fernandocejas.sample.core.extension.loadFromUrl
32+
import com.fernandocejas.sample.core.extension.loadUrlAndPostponeEnterTransition
33+
import com.fernandocejas.sample.core.extension.observe
34+
import com.fernandocejas.sample.core.platform.BaseActivity
2735
import com.fernandocejas.sample.core.platform.BaseFragment
36+
import com.fernandocejas.sample.databinding.FragmentMovieDetailsBinding
2837
import com.fernandocejas.sample.features.movies.MovieFailure.NonExistentMovie
2938
import dagger.hilt.android.AndroidEntryPoint
30-
import kotlinx.android.synthetic.main.fragment_movie_details.*
31-
import kotlinx.android.synthetic.main.toolbar.*
3239
import javax.inject.Inject
3340

3441
@AndroidEntryPoint
@@ -47,7 +54,8 @@ class MovieDetailsFragment : BaseFragment() {
4754

4855
private val movieDetailsViewModel by viewModels<MovieDetailsViewModel>()
4956

50-
override fun layoutId() = R.layout.fragment_movie_details
57+
private var _binding: FragmentMovieDetailsBinding? = null
58+
private val binding get() = _binding!!
5159

5260
override fun onCreate(savedInstanceState: Bundle?) {
5361
super.onCreate(savedInstanceState)
@@ -59,41 +67,57 @@ class MovieDetailsFragment : BaseFragment() {
5967
}
6068
}
6169

70+
override fun onCreateView(
71+
inflater: LayoutInflater,
72+
container: ViewGroup?,
73+
savedInstanceState: Bundle?
74+
): View {
75+
_binding = FragmentMovieDetailsBinding.inflate(inflater, container, false)
76+
return binding.root
77+
}
78+
6279
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
6380
super.onViewCreated(view, savedInstanceState)
6481
if (firstTimeCreated(savedInstanceState)) {
6582
movieDetailsViewModel.loadMovieDetails((arguments?.get(PARAM_MOVIE) as MovieView).id)
6683
} else {
67-
movieDetailsAnimator.scaleUpView(moviePlay)
68-
movieDetailsAnimator.cancelTransition(moviePoster)
69-
moviePoster.loadFromUrl((requireArguments()[PARAM_MOVIE] as MovieView).poster)
84+
movieDetailsAnimator.scaleUpView(binding.moviePlay)
85+
movieDetailsAnimator.cancelTransition(binding.moviePoster)
86+
binding.moviePoster.loadFromUrl((requireArguments()[PARAM_MOVIE] as MovieView).poster)
7087
}
7188
}
7289

90+
override fun onDestroyView() {
91+
super.onDestroyView()
92+
_binding = null
93+
}
94+
7395
override fun onBackPressed() {
74-
movieDetailsAnimator.fadeInvisible(scrollView, movieDetails)
75-
if (moviePlay.isVisible())
76-
movieDetailsAnimator.scaleDownView(moviePlay)
96+
movieDetailsAnimator.fadeInvisible(binding.scrollView, binding.movieDetails)
97+
if (binding.moviePlay.isVisible())
98+
movieDetailsAnimator.scaleDownView(binding.moviePlay)
7799
else
78-
movieDetailsAnimator.cancelTransition(moviePoster)
100+
movieDetailsAnimator.cancelTransition(binding.moviePoster)
79101
}
80102

81103
private fun renderMovieDetails(movie: MovieDetailsView?) {
82104
movie?.let {
83105
with(movie) {
84106
activity?.let {
85-
moviePoster.loadUrlAndPostponeEnterTransition(poster, it)
86-
it.toolbar.title = title
107+
binding.moviePoster.loadUrlAndPostponeEnterTransition(poster, it)
108+
(it as BaseActivity).toolbar().title = title
109+
}
110+
with(binding) {
111+
movieSummary.text = summary
112+
movieCast.text = cast
113+
movieDirector.text = director
114+
movieYear.text = year.toString()
115+
moviePlay.setOnClickListener { movieDetailsViewModel.playMovie(trailer) }
87116
}
88-
movieSummary.text = summary
89-
movieCast.text = cast
90-
movieDirector.text = director
91-
movieYear.text = year.toString()
92-
moviePlay.setOnClickListener { movieDetailsViewModel.playMovie(trailer) }
93117
}
94118
}
95-
movieDetailsAnimator.fadeVisible(scrollView, movieDetails)
96-
movieDetailsAnimator.scaleUpView(moviePlay)
119+
movieDetailsAnimator.fadeVisible(binding.scrollView, binding.movieDetails)
120+
movieDetailsAnimator.scaleUpView(binding.moviePlay)
97121
}
98122

99123
private fun handleFailure(failure: Failure?) {

app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesAdapter.kt

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,41 +15,45 @@
1515
*/
1616
package com.fernandocejas.sample.features.movies
1717

18-
import android.view.View
18+
import android.annotation.SuppressLint
19+
import android.view.LayoutInflater
1920
import android.view.ViewGroup
2021
import androidx.recyclerview.widget.RecyclerView
21-
import com.fernandocejas.sample.R
22-
import com.fernandocejas.sample.core.extension.inflate
2322
import com.fernandocejas.sample.core.extension.loadFromUrl
2423
import com.fernandocejas.sample.core.navigation.Navigator
25-
import kotlinx.android.synthetic.main.row_movie.view.*
24+
import com.fernandocejas.sample.databinding.RowMovieBinding
2625
import javax.inject.Inject
2726
import kotlin.properties.Delegates
2827

28+
@SuppressLint("NotifyDataSetChanged")
2929
class MoviesAdapter
3030
@Inject constructor() : RecyclerView.Adapter<MoviesAdapter.ViewHolder>() {
3131

3232
internal var collection: List<MovieView> by Delegates.observable(emptyList()) { _, _, _ ->
33+
//TODO: go for a more efficient solution
3334
notifyDataSetChanged()
3435
}
3536

3637
internal var clickListener: (MovieView, Navigator.Extras) -> Unit = { _, _ -> }
3738

38-
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
39-
ViewHolder(parent.inflate(R.layout.row_movie))
39+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
40+
val rowMovieBinding = RowMovieBinding.inflate(LayoutInflater.from(parent.context), parent, false)
41+
return ViewHolder(rowMovieBinding)
42+
}
4043

41-
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) =
44+
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
4245
viewHolder.bind(collection[position], clickListener)
46+
}
4347

4448
override fun getItemCount() = collection.size
4549

46-
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
50+
class ViewHolder(private val rowMovieBinding: RowMovieBinding) : RecyclerView.ViewHolder(rowMovieBinding.root) {
4751
fun bind(movieView: MovieView, clickListener: (MovieView, Navigator.Extras) -> Unit) {
48-
itemView.moviePoster.loadFromUrl(movieView.poster)
52+
rowMovieBinding.moviePoster.loadFromUrl(movieView.poster)
4953
itemView.setOnClickListener {
5054
clickListener(
5155
movieView,
52-
Navigator.Extras(itemView.moviePoster)
56+
Navigator.Extras(rowMovieBinding.moviePoster)
5357
)
5458
}
5559
}

app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesFragment.kt

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
package com.fernandocejas.sample.features.movies
1717

1818
import android.os.Bundle
19+
import android.view.LayoutInflater
1920
import android.view.View
21+
import android.view.ViewGroup
2022
import androidx.annotation.StringRes
2123
import androidx.fragment.app.viewModels
2224
import androidx.recyclerview.widget.StaggeredGridLayoutManager
@@ -30,6 +32,7 @@ import com.fernandocejas.sample.core.extension.observe
3032
import com.fernandocejas.sample.core.extension.visible
3133
import com.fernandocejas.sample.core.navigation.Navigator
3234
import com.fernandocejas.sample.core.platform.BaseFragment
35+
import com.fernandocejas.sample.databinding.FragmentMoviesBinding
3336
import com.fernandocejas.sample.features.movies.MovieFailure.ListNotAvailable
3437
import dagger.hilt.android.AndroidEntryPoint
3538
import javax.inject.Inject
@@ -44,7 +47,8 @@ class MoviesFragment : BaseFragment() {
4447

4548
private val moviesViewModel: MoviesViewModel by viewModels()
4649

47-
override fun layoutId() = R.layout.fragment_movies
50+
private var _binding: FragmentMoviesBinding? = null
51+
private val binding get() = _binding!!
4852

4953
override fun onCreate(savedInstanceState: Bundle?) {
5054
super.onCreate(savedInstanceState)
@@ -55,24 +59,37 @@ class MoviesFragment : BaseFragment() {
5559
}
5660
}
5761

62+
override fun onCreateView(
63+
inflater: LayoutInflater,
64+
container: ViewGroup?,
65+
savedInstanceState: Bundle?
66+
): View {
67+
_binding = FragmentMoviesBinding.inflate(inflater, container, false)
68+
return binding.root
69+
}
70+
5871
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
5972
super.onViewCreated(view, savedInstanceState)
6073
initializeView()
6174
loadMoviesList()
6275
}
6376

77+
override fun onDestroyView() {
78+
super.onDestroyView()
79+
_binding = null
80+
}
6481

6582
private fun initializeView() {
66-
movieList.layoutManager = StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)
67-
movieList.adapter = moviesAdapter
83+
binding.movieList.layoutManager = StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)
84+
binding.movieList.adapter = moviesAdapter
6885
moviesAdapter.clickListener = { movie, navigationExtras ->
6986
navigator.showMovieDetails(requireActivity(), movie, navigationExtras)
7087
}
7188
}
7289

7390
private fun loadMoviesList() {
74-
emptyView.invisible()
75-
movieList.visible()
91+
binding.emptyView.invisible()
92+
binding.movieList.visible()
7693
showProgress()
7794
moviesViewModel.loadMovies()
7895
}
@@ -92,8 +109,8 @@ class MoviesFragment : BaseFragment() {
92109
}
93110

94111
private fun renderFailure(@StringRes message: Int) {
95-
movieList.invisible()
96-
emptyView.visible()
112+
binding.movieList.invisible()
113+
binding.emptyView.visible()
97114
hideProgress()
98115
notifyWithAction(message, R.string.action_refresh, ::loadMoviesList)
99116
}

0 commit comments

Comments
 (0)