🐛 coorection display medias

master
Julien THEME 2 years ago
parent d6f162ce92
commit a5e9129f61

@ -12,6 +12,6 @@
</deviceKey> </deviceKey>
</Target> </Target>
</targetSelectedWithDropDown> </targetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2023-02-05T14:31:31.881994Z" /> <timeTargetWasSelectedWithDropDown value="2023-02-11T19:19:16.483021Z" />
</component> </component>
</project> </project>

@ -88,6 +88,8 @@ dependencies {
implementation 'androidx.lifecycle:lifecycle-service:2.4.0' implementation 'androidx.lifecycle:lifecycle-service:2.4.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.4.0' implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.4.0'
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")

@ -5,10 +5,10 @@ import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import com.example.cinapp.databinding.ActivityMainBinding import com.example.cinapp.databinding.ActivityMainBinding
import com.example.cinapp.fragments.HomeFragment import com.example.cinapp.ui.fragments.HomeFragment
import com.example.cinapp.fragments.MovieFragment import com.example.cinapp.ui.fragments.MovieFragment
import com.example.cinapp.fragments.SearchFragment import com.example.cinapp.ui.fragments.SearchFragment
import com.example.cinapp.fragments.SerieFragment import com.example.cinapp.ui.fragments.SerieFragment
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {

@ -1,6 +1,7 @@
package com.example.cinapp.Request package com.example.cinapp.api
import android.util.Log import android.util.Log
import com.example.cinapp.api.dto.Demmy
import com.example.cinapp.model.Media import com.example.cinapp.model.Media
import retrofit2.Call import retrofit2.Call
import retrofit2.Callback import retrofit2.Callback
@ -24,7 +25,7 @@ class MediaApi {
response.enqueue(object : Callback<Demmy> { response.enqueue(object : Callback<Demmy> {
override fun onResponse(call: Call<Demmy>, response: Response<Demmy>) { override fun onResponse(call: Call<Demmy>, response: Response<Demmy>) {
Log.d("Liste1", response.body().toString()) Log.d("Liste1 search", response.body().toString())
val allMedia = response.body() val allMedia = response.body()
val listMediaResponse = allMedia?.results val listMediaResponse = allMedia?.results
listMediaResponse?.forEach { mediaResponse -> listMediaResponse?.forEach { mediaResponse ->

@ -1,5 +1,6 @@
package com.example.cinapp.Request package com.example.cinapp.api
import com.example.cinapp.api.dto.MediaResponse
import com.example.cinapp.model.Media import com.example.cinapp.model.Media
import com.example.cinapp.model.Movie import com.example.cinapp.model.Movie
import com.example.cinapp.model.Serie import com.example.cinapp.model.Serie

@ -1,6 +1,7 @@
package com.example.cinapp.Request package com.example.cinapp.api
import com.example.cinapp.BuildConfig import com.example.cinapp.BuildConfig
import com.example.cinapp.api.dto.Demmy
import retrofit2.Call import retrofit2.Call
import retrofit2.http.GET import retrofit2.http.GET
import retrofit2.http.Query import retrofit2.http.Query

@ -1,6 +1,4 @@
package com.example.cinapp.Request package com.example.cinapp.api.dto
import com.example.cinapp.model.Movie
class Demmy ( class Demmy (

@ -1,4 +1,4 @@
package com.example.cinapp.Request package com.example.cinapp.api.dto
import com.example.cinapp.model.Season import com.example.cinapp.model.Season

@ -1,4 +1,4 @@
package com.example.cinapp.Room.DAO package com.example.cinapp.data.persistance.DAO
import androidx.room.Dao import androidx.room.Dao

@ -1,7 +1,7 @@
package com.example.cinapp.Room.DAO package com.example.cinapp.data.persistance.DAO
import androidx.room.* import androidx.room.*
import com.example.cinapp.Room.Entity.MovieEntity import com.example.cinapp.data.persistance.Entity.MovieEntity
@Dao @Dao
interface MovieDAO { interface MovieDAO {

@ -1,9 +1,9 @@
package com.example.cinapp.Room.DAO package com.example.cinapp.data.persistance.DAO
import androidx.room.Dao import androidx.room.Dao
import androidx.room.Delete import androidx.room.Delete
import androidx.room.Query import androidx.room.Query
import com.example.cinapp.Room.Entity.SeasonEntity import com.example.cinapp.data.persistance.Entity.SeasonEntity
@Dao @Dao
interface SeasonDAO { interface SeasonDAO {

@ -1,7 +1,7 @@
package com.example.cinapp.Room.DAO package com.example.cinapp.data.persistance.DAO
import androidx.room.* import androidx.room.*
import com.example.cinapp.Room.Entity.SerieEntity import com.example.cinapp.data.persistance.Entity.SerieEntity
@Dao @Dao
interface SerieDAO { interface SerieDAO {

@ -1,4 +1,4 @@
package com.example.cinapp.Room.Entity package com.example.cinapp.data.persistance.Entity
import androidx.room.Entity import androidx.room.Entity
import androidx.room.PrimaryKey import androidx.room.PrimaryKey

@ -1,4 +1,4 @@
package com.example.cinapp.Room.Entity package com.example.cinapp.data.persistance.Entity
import androidx.room.Entity import androidx.room.Entity
import androidx.room.PrimaryKey import androidx.room.PrimaryKey

@ -1,4 +1,4 @@
package com.example.cinapp.Room.Entity package com.example.cinapp.data.persistance.Entity
import androidx.room.Entity import androidx.room.Entity
import androidx.room.PrimaryKey import androidx.room.PrimaryKey

@ -1,4 +1,4 @@
package com.example.cinapp.Room.Entity package com.example.cinapp.data.persistance.Entity
import androidx.room.Entity import androidx.room.Entity
import androidx.room.PrimaryKey import androidx.room.PrimaryKey

@ -1,15 +1,15 @@
package com.example.cinapp.Room package com.example.cinapp.data.persistance
import androidx.room.Database import androidx.room.Database
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
import com.example.cinapp.Room.DAO.EpisodeDAO import com.example.cinapp.data.persistance.DAO.EpisodeDAO
import com.example.cinapp.Room.DAO.MovieDAO import com.example.cinapp.data.persistance.DAO.MovieDAO
import com.example.cinapp.Room.DAO.SeasonDAO import com.example.cinapp.data.persistance.DAO.SeasonDAO
import com.example.cinapp.Room.DAO.SerieDAO import com.example.cinapp.data.persistance.DAO.SerieDAO
import com.example.cinapp.Room.Entity.EpisodeEntity import com.example.cinapp.data.persistance.Entity.EpisodeEntity
import com.example.cinapp.Room.Entity.MovieEntity import com.example.cinapp.data.persistance.Entity.MovieEntity
import com.example.cinapp.Room.Entity.SeasonEntity import com.example.cinapp.data.persistance.Entity.SeasonEntity
import com.example.cinapp.Room.Entity.SerieEntity import com.example.cinapp.data.persistance.Entity.SerieEntity
@Database(entities = [SeasonEntity::class, EpisodeEntity::class, MovieEntity::class, SerieEntity::class], version = 1) @Database(entities = [SeasonEntity::class, EpisodeEntity::class, MovieEntity::class, SerieEntity::class], version = 1)
abstract class MediaDatabase: RoomDatabase() { abstract class MediaDatabase: RoomDatabase() {

@ -1,5 +1,8 @@
package com.example.cinapp.model package com.example.cinapp.model
import android.os.Parcel
import android.os.Parcelable
open class Media ( open class Media (
val adult: Boolean? = null, val adult: Boolean? = null,
val id: Int, val id: Int,
@ -14,6 +17,56 @@ open class Media (
val posterPath: String? = null, val posterPath: String? = null,
val voteAverage: Double? = null, val voteAverage: Double? = null,
val voteCount: Int? = null, val voteCount: Int? = null,
val genreIds: List<Int>? = null val genreIds: List<Int>? = null,
){ val isView: Boolean? = null
) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readValue(Boolean::class.java.classLoader) as? Boolean,
parcel.readInt(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.createStringArrayList(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readValue(Double::class.java.classLoader) as? Double,
parcel.readString(),
parcel.readValue(Double::class.java.classLoader) as? Double,
parcel.readValue(Int::class.java.classLoader) as? Int,
TODO("genreIds"),
parcel.readValue(Boolean::class.java.classLoader) as? Boolean
) {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeValue(adult)
parcel.writeInt(id)
parcel.writeString(title)
parcel.writeString(backdropPath)
parcel.writeString(releaseDate)
parcel.writeStringList(originCountry)
parcel.writeString(originalLanguage)
parcel.writeString(originalName)
parcel.writeString(overview)
parcel.writeValue(popularity)
parcel.writeString(posterPath)
parcel.writeValue(voteAverage)
parcel.writeValue(voteCount)
parcel.writeValue(isView)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<Media> {
override fun createFromParcel(parcel: Parcel): Media {
return Media(parcel)
}
override fun newArray(size: Int): Array<Media?> {
return arrayOfNulls(size)
}
}
} }

@ -14,7 +14,8 @@ class Movie(
posterPath: String? = null, posterPath: String? = null,
voteAverage: Double? = null, voteAverage: Double? = null,
voteCount: Int? = null, voteCount: Int? = null,
genreIds: List<Int>? = null genreIds: List<Int>? = null,
isView: Boolean? = null
): Media( ): Media(
adult, adult,
id, id,
@ -29,6 +30,7 @@ class Movie(
posterPath, posterPath,
voteAverage, voteAverage,
voteCount, voteCount,
genreIds genreIds,
isView
) { ) {
} }

@ -15,6 +15,7 @@ class Serie(
voteAverage: Double? = null, voteAverage: Double? = null,
voteCount: Int? = null, voteCount: Int? = null,
genreIds: List<Int>? = null, genreIds: List<Int>? = null,
isView: Boolean? = null,
var seasons: List<Season>? = null, var seasons: List<Season>? = null,
var numberOfSeasons: Int? = null, var numberOfSeasons: Int? = null,
var numberOfEpisodes: Int? = null var numberOfEpisodes: Int? = null
@ -32,6 +33,7 @@ class Serie(
posterPath, posterPath,
voteAverage, voteAverage,
voteCount, voteCount,
genreIds genreIds,
isView
) { ) {
} }

@ -0,0 +1,30 @@
package com.example.cinapp.ui.activity
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import com.example.cinapp.R
import com.example.cinapp.model.Media
import com.example.cinapp.ui.viewModel.MediaViewModel
class MediaDetailActivity : AppCompatActivity() {
/*private lateinit var viewModel: MediaViewModel
public lateinit var media: Media
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.movie_view)
val media = intent.getIntExtra("MEDIA", 0)
viewModel = ViewModelProvider(this).get(MediaViewModel::class.java)
var textView = findViewById<TextView>(R.id.info_name)
viewModel.getMediaLiveData(mediaId).observe(this, Observer { media ->
textView.text = media.title
})
}*/
}

@ -0,0 +1,40 @@
package com.example.cinapp.ui.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.cinapp.R
import com.example.cinapp.model.Media
import com.example.cinapp.ui.viewModel.MediaViewModel
class InfosMediaAdapter(private val viewModel: MediaViewModel) : RecyclerView.Adapter<InfosMediaAdapter.MediaViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MediaViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.movie_view, parent, false)
return MediaViewHolder(itemView)
}
override fun onBindViewHolder(holder: MediaViewHolder, position: Int) {
/*val media = mediaList[position]
holder.bind(media)*/
}
override fun getItemCount(): Int {
/*return mediaList.size*/
return 0
}
inner class MediaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
/*private val titleTextView: TextView = itemView.findViewById(R.id.title_text_view)
private val descriptionTextView: TextView = itemView.findViewById(R.id.description_text_view)
private val mediaImageView: ImageView = itemView.findViewById(R.id.media_image_view)
fun bind(media: Media) {
titleTextView.text = media.title
descriptionTextView.text = media.description
// Ajoutez une logique pour charger l'image à partir de l'URL pour le média
}*/
}
}

@ -1,34 +1,61 @@
package com.example.cinapp.adapter package com.example.cinapp.ui.adapter
import android.util.Log import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import androidx.lifecycle.LiveData
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.example.cinapp.R import com.example.cinapp.R
import com.example.cinapp.model.Media import com.example.cinapp.model.Media
class MediaAdapter(private val medias: List<Media>) : RecyclerView.Adapter<MediaAdapter.ViewHolder>() { /*class MediaAdapter(private val viewModel: MainViewModel, private val lifecycleOwner: LifecycleOwner, private val nbLiveData: Int) : RecyclerView.Adapter<MediaAdapter.ViewHolder>() {*/
class MediaAdapter(private val mediaList: LiveData<List<Media>>) : RecyclerView.Adapter<MediaAdapter.ViewHolder>() {
//private var mediaList = emptyList<Media>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_movie, parent, false) val view = LayoutInflater.from(parent.context).inflate(R.layout.item_movie, parent, false)
Log.d("MediaAdapter", "onCreateViewHolder: $view")
return ViewHolder(view) return ViewHolder(view)
} }
/*fun subscribe(viewModel: MainViewModel, lifecycleOwner: LifecycleOwner, nbLiveData: Int) {
viewModel.getMediaLiveData(nbLiveData).observe(lifecycleOwner, Observer {
mediaList = it
notifyDataSetChanged()
Log.d("MediaAdapter", "subscribe: $it")
})
}*/
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val movie = medias[position] mediaList.observeForever {
var media = it[position]
Glide.with(holder.itemView.context) Glide.with(holder.itemView.context)
.load("https://image.tmdb.org/t/p/w500" + movie.posterPath) .load("https://image.tmdb.org/t/p/w500" + media.posterPath)
.override(400, 600) .override(400, 600)
.into(holder.poster) .into(holder.poster)
Log.d("MediaAdapter", "onBindViewHolder: $media")
holder.poster.setOnClickListener { holder.poster.setOnClickListener {
Log.d("MediaAdapter", "onBindViewHolder: $movie") Log.d("MediaAdapter", "onBindViewHolder: $media")
} }
}
/*Log.d("MediaAdapter", "onBindViewHolder: $media")*/
/* subscribe(viewModel, lifecycleOwner, nbLiveData)*/
/*val movie = mediaList[position]
Glide.with(holder.itemView.context)
.load("https://image.tmdb.org/t/p/w500" + movie.posterPath)
.override(400, 600)
.into(holder.poster)*/
/* holder.poster.setOnClickListener {
Log.d("MediaAdapter", "onBindViewHolder: $media")
}*/
} }
override fun getItemCount(): Int { override fun getItemCount(): Int {
return medias.size return mediaList.value?.size ?: 0
} }
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val poster: ImageView = itemView.findViewById(R.id.poster) val poster: ImageView = itemView.findViewById(R.id.poster)

@ -1,16 +1,14 @@
package com.example.cinapp.fragments package com.example.cinapp.ui.fragments
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.lifecycle.MutableLiveData
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.example.cinapp.R import com.example.cinapp.R
import com.example.cinapp.adapter.MediaAdapter
import com.example.cinapp.Request.MediaApi
import com.example.cinapp.model.Media import com.example.cinapp.model.Media
import com.example.cinapp.ui.viewModel.HomeViewModel
// TODO: Rename parameter arguments, choose names that match // TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
@ -26,6 +24,7 @@ class HomeFragment : Fragment() {
// TODO: Rename and change types of parameters // TODO: Rename and change types of parameters
private var param1: String? = null private var param1: String? = null
private var param2: String? = null private var param2: String? = null
private var viewModel = HomeViewModel()
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -35,42 +34,44 @@ class HomeFragment : Fragment() {
} }
} }
override fun onCreateView( override fun onSaveInstanceState(outState: Bundle) {
inflater: LayoutInflater, container: ViewGroup?, super.onSaveInstanceState(outState)
savedInstanceState: Bundle? val popularMoviesList = viewModel.popularMovies.value
): View? { val popularMoviesArrayList = popularMoviesList?.toCollection(ArrayList())
//getPopularMovies
// Inflate the layout for this fragment
val rootView = inflater.inflate(R.layout.fragment_home, container, false)
MediaApi().getPopularMovies() { listMedia -> val popularSeriesList = viewModel.popularTvShows.value
val recyclerView = rootView.findViewById<RecyclerView>(R.id.rc_popular_movies) val popularSeriesArrayList = popularSeriesList?.toCollection(ArrayList())
addMediaToRecyclerView(listMedia, recyclerView)
}
MediaApi().getPopularSeries() { listMedia -> val topRatedMoviesList = viewModel.topRatedMovies.value
val recyclerView = rootView.findViewById<RecyclerView>(R.id.rc_popular_series) val topRatedMoviesArrayList = topRatedMoviesList?.toCollection(ArrayList())
addMediaToRecyclerView(listMedia, recyclerView)
}
MediaApi().getTopRatedMovie() { listMedia -> val topRatedSeriesList = viewModel.topRatedTvShows.value
val recyclerView = rootView.findViewById<RecyclerView>(R.id.rc_top_rated_movies) val topRatedSeriesArrayList = topRatedSeriesList?.toCollection(ArrayList())
addMediaToRecyclerView(listMedia, recyclerView)
}
MediaApi().getTopRatedSerie() { listMedia -> outState.putParcelableArrayList("popularMovies", popularMoviesArrayList)
val recyclerView = rootView.findViewById<RecyclerView>(R.id.rc_top_rated_series) outState.putParcelableArrayList("popularSeries", popularSeriesArrayList)
addMediaToRecyclerView(listMedia, recyclerView) outState.putParcelableArrayList("topRatedMovies", topRatedMoviesArrayList)
outState.putParcelableArrayList("topRatedSeries", topRatedSeriesArrayList)
} }
return rootView override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val rootView = inflater.inflate(R.layout.fragment_home, container, false)
if (savedInstanceState != null) {
val list = savedInstanceState.getParcelableArrayList<Media>("popularMovies")
viewModel.popularMovies.postValue(list)
val list2 = savedInstanceState.getParcelableArrayList<Media>("popularSeries")
viewModel.popularTvShows.postValue(list2)
val list3 = savedInstanceState.getParcelableArrayList<Media>("topRatedMovies")
viewModel.topRatedMovies.postValue(list3)
val list4 = savedInstanceState.getParcelableArrayList<Media>("topRatedSeries")
viewModel.topRatedTvShows.postValue(list4)
} }
viewModel = HomeViewModel()
fun addMediaToRecyclerView(listMedia: List<Media>, recyclerView: RecyclerView) { viewModel.addMedia(rootView)
val layoutManager = StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.HORIZONTAL) return rootView
recyclerView.layoutManager = layoutManager
val adapter = MediaAdapter(listMedia)
recyclerView.adapter = adapter
} }
companion object { companion object {

@ -1,16 +1,11 @@
package com.example.cinapp.fragments package com.example.cinapp.ui.fragments
import android.os.Bundle import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.example.cinapp.R import com.example.cinapp.R
import com.example.cinapp.Request.*
// TODO: Rename parameter arguments, choose names that match // TODO: Rename parameter arguments, choose names that match

@ -1,4 +1,4 @@
package com.example.cinapp.fragments package com.example.cinapp.ui.fragments
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment

@ -1,4 +1,4 @@
package com.example.cinapp.fragments package com.example.cinapp.ui.fragments
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
@ -10,8 +10,10 @@ import androidx.appcompat.widget.SearchView
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelProviders import androidx.lifecycle.ViewModelProviders
import com.example.cinapp.R import com.example.cinapp.R
import com.example.cinapp.viewModel.MediaViewModel import com.example.cinapp.model.Media
import com.example.cinapp.viewModel.SearchViewModel import com.example.cinapp.ui.viewModel.HomeViewModel
import com.example.cinapp.ui.viewModel.MediaViewModel
import com.example.cinapp.ui.viewModel.SearchViewModel
// TODO: Rename parameter arguments, choose names that match // TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
@ -50,11 +52,27 @@ class SearchFragment : Fragment() {
Log.d("InfoSearch", "onCreateView: ") Log.d("InfoSearch", "onCreateView: ")
val rootView = inflater.inflate(R.layout.fragment_search, container, false) val rootView = inflater.inflate(R.layout.fragment_search, container, false)
val viewModelProvider = ViewModelProvider(this) val viewModelProvider = ViewModelProvider(this)
searchViewModel = viewModelProvider.get(SearchViewModel::class.java) searchViewModel = viewModelProvider.get(SearchViewModel::class.java)
searchViewModel.setSearchView(rootView) searchViewModel.setSearchView(rootView)
savedInstanceState?.let {
val searchList = it.getParcelableArrayList<Media>("popularMovies")
searchViewModel.medias.postValue(searchList)
Log.d("InfoSearch", "onCreateView: ${searchList?.size}")
}
return rootView return rootView
} }
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
val searchmedias = searchViewModel.medias.value
val searchmediasArrayList = searchmedias?.toCollection(ArrayList())
outState.putParcelableArrayList("searchMedias", searchmediasArrayList)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
} }

@ -1,4 +1,4 @@
package com.example.cinapp.fragments package com.example.cinapp.ui.fragments
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment

@ -1,4 +1,4 @@
package com.example.cinapp.fragments package com.example.cinapp.ui.fragments
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment

@ -0,0 +1,74 @@
package com.example.cinapp.ui.viewModel
import android.annotation.SuppressLint
import android.util.Log
import android.view.View
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.example.cinapp.MainActivity
import com.example.cinapp.R
import com.example.cinapp.api.MediaApi
import com.example.cinapp.model.Media
import com.example.cinapp.ui.adapter.MediaAdapter
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class HomeViewModel: ViewModel() {
var popularMovies = MutableLiveData<List<Media>>()
var popularTvShows = MutableLiveData<List<Media>>()
var topRatedMovies = MutableLiveData<List<Media>>()
var topRatedTvShows = MutableLiveData<List<Media>>()
@SuppressLint("StaticFieldLeak")
val context : MainActivity = MainActivity()
fun addMedia(rootView: View) {
viewModelScope.launch(Dispatchers.IO){
MediaApi().getPopularMovies { listMedia ->
popularMovies.postValue(listMedia)
val recyclerView = rootView.findViewById<RecyclerView>(R.id.rc_popular_movies)
addMediaToRecyclerView(recyclerView, popularMovies)
}
}
viewModelScope.launch(Dispatchers.IO){
MediaApi().getPopularSeries { listMedia ->
popularTvShows.postValue(listMedia)
val recyclerView = rootView.findViewById<RecyclerView>(R.id.rc_popular_series)
addMediaToRecyclerView(recyclerView, popularTvShows)
}
}
viewModelScope.launch(Dispatchers.IO){
MediaApi().getTopRatedMovie { listMedia ->
topRatedMovies.postValue(listMedia)
val recyclerView = rootView.findViewById<RecyclerView>(R.id.rc_top_rated_movies)
addMediaToRecyclerView(recyclerView, topRatedMovies)
}
}
viewModelScope.launch(Dispatchers.IO) {
MediaApi().getTopRatedSerie { listMedia ->
topRatedTvShows.postValue(listMedia)
val recyclerView = rootView.findViewById<RecyclerView>(R.id.rc_top_rated_series)
addMediaToRecyclerView(recyclerView, topRatedTvShows)
}
}
}
fun addMediaToRecyclerView(recyclerView: RecyclerView, mediaList: MutableLiveData<List<Media>>) {
Log.d("HomeViewModel ------", "addMediaToRecyclerView: $recyclerView")
val layoutManager = StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.HORIZONTAL)
recyclerView.layoutManager = layoutManager
recyclerView.adapter = MediaAdapter(mediaList)
}
}

@ -1,4 +1,4 @@
package com.example.cinapp.viewModel package com.example.cinapp.ui.viewModel
import android.content.Intent import android.content.Intent
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
@ -9,4 +9,8 @@ class MediaViewModel: ViewModel() {
fun onMediaClicked(media: Media) { fun onMediaClicked(media: Media) {
} }
fun getMediaLiveData(mediaId: Int): Any {
return Intent()
}
} }

@ -1,20 +1,23 @@
package com.example.cinapp.viewModel package com.example.cinapp.ui.viewModel
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.util.Log import android.util.Log
import android.view.View import android.view.View
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.lifecycle.ViewModel import androidx.lifecycle.*
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.example.cinapp.MainActivity import com.example.cinapp.MainActivity
import com.example.cinapp.R import com.example.cinapp.R
import com.example.cinapp.adapter.MediaAdapter import com.example.cinapp.ui.adapter.MediaAdapter
import com.example.cinapp.Request.MediaApi import com.example.cinapp.api.MediaApi
import com.example.cinapp.model.Media
@SuppressLint("StaticFieldLeak") @SuppressLint("StaticFieldLeak")
class SearchViewModel : ViewModel() { class SearchViewModel : ViewModel() {
var medias = MutableLiveData<List<Media>>()
var searchView: SearchView? = null var searchView: SearchView? = null
val context : MainActivity = MainActivity() val context : MainActivity = MainActivity()
@ -32,9 +35,10 @@ class SearchViewModel : ViewModel() {
if(listMedia.isEmpty()){ if(listMedia.isEmpty()){
textView.visibility = View.VISIBLE textView.visibility = View.VISIBLE
}else{ }else{
medias.postValue(listMedia)
textView.visibility = View.GONE textView.visibility = View.GONE
recyclerView.layoutManager = GridLayoutManager(context, 2) recyclerView.layoutManager = GridLayoutManager(context, 2)
recyclerView.adapter = MediaAdapter(listMedia) recyclerView.adapter = MediaAdapter(medias)
} }
} }
return false return false
@ -45,8 +49,4 @@ class SearchViewModel : ViewModel() {
} }
}) })
} }
/*fun onMediaClicked(media: Media) {
Log.d("SearchViewModel", "onMediaClicked: $media")
}*/
} }

@ -12,7 +12,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/first_grey" android:background="@color/first_grey"
tools:context=".fragments.HomeFragment"> tools:context=".ui.fragments.HomeFragment">
<!-- TODO: Update blank fragment layout --> <!-- TODO: Update blank fragment layout -->

@ -5,7 +5,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/first_grey" android:background="@color/first_grey"
tools:context=".fragments.MovieFragment"> tools:context=".ui.fragments.MovieFragment">
<com.google.android.material.tabs.TabLayout <com.google.android.material.tabs.TabLayout

@ -3,7 +3,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".fragments.Movies2SeeFragment"> tools:context=".ui.fragments.Movies2SeeFragment">
<!-- TODO: Update blank fragment layout --> <!-- TODO: Update blank fragment layout -->
<TextView <TextView

@ -5,7 +5,7 @@
<data> <data>
<variable <variable
name="viewModel" name="viewModel"
type="com.example.cinapp.viewModel.SearchViewModel" /> type="com.example.cinapp.ui.viewModel.SearchViewModel" />
</data> </data>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
@ -13,7 +13,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/first_grey" android:background="@color/first_grey"
tools:context=".fragments.SearchFragment"> tools:context=".ui.fragments.SearchFragment">
<androidx.appcompat.widget.SearchView <androidx.appcompat.widget.SearchView
android:id="@+id/searchView" android:id="@+id/searchView"

@ -3,7 +3,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".fragments.SeenMoviesFragment"> tools:context=".ui.fragments.SeenMoviesFragment">
<!-- TODO: Update blank fragment layout --> <!-- TODO: Update blank fragment layout -->
<TextView <TextView

@ -5,7 +5,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/purple_200" android:background="@color/purple_200"
tools:context=".fragments.SerieFragment"> tools:context=".ui.fragments.SerieFragment">
<com.google.android.material.tabs.TabLayout <com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout" android:id="@+id/tabLayout"

@ -1,11 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView android:layout_width="wrap_content" <androidx.cardview.widget.CardView xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_marginHorizontal="5dp" android:layout_marginHorizontal="5dp"
app:cardBackgroundColor="@color/first_grey" app:cardBackgroundColor="@color/first_grey"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/cardview"> android:id="@+id/cardview"
tools:ignore="OnClick">
<ImageView <ImageView
android:id="@+id/poster" android:id="@+id/poster"

@ -2,18 +2,19 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/movie_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<ImageView <ImageView
android:id="@+id/imageView" android:id="@+id/info_image"
android:layout_width="409dp" android:layout_width="409dp"
android:layout_height="187dp" android:layout_height="187dp"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/textView2" android:id="@+id/info_name"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="12dp" android:layout_marginStart="12dp"
@ -23,17 +24,17 @@
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/textView7" android:id="@+id/info_time_type"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="12dp" android:layout_marginStart="12dp"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:text="Heure - Type" android:text="Heure - Type"
app:layout_constraintStart_toStartOf="@+id/imageView" app:layout_constraintStart_toStartOf="@+id/info_image"
app:layout_constraintTop_toBottomOf="@+id/textView2" /> app:layout_constraintTop_toBottomOf="@+id/info_name" />
<TextView <TextView
android:id="@+id/textView9" android:id="@+id/info_date"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
@ -42,7 +43,7 @@
tools:layout_editor_absoluteY="148dp" /> tools:layout_editor_absoluteY="148dp" />
<TextView <TextView
android:id="@+id/textView10" android:id="@+id/info_view"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="12dp" android:layout_marginStart="12dp"
@ -51,22 +52,24 @@
tools:layout_editor_absoluteY="148dp" /> tools:layout_editor_absoluteY="148dp" />
<TextView <TextView
android:id="@+id/textView11" android:id="@+id/info_title_overview"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="24dp" android:layout_marginStart="24dp"
android:layout_marginTop="20dp" android:layout_marginTop="20dp"
android:text="Info film" android:text="Info film"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView" /> app:layout_constraintTop_toBottomOf="@+id/info_image" />
<Button <Button
android:id="@+id/button" android:id="@+id/info_add_view"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="28dp"
android:text="Vu" android:text="Vu"
tools:layout_editor_absoluteX="301dp" app:layout_constraintEnd_toEndOf="parent"
tools:layout_editor_absoluteY="194dp" /> app:layout_constraintTop_toBottomOf="@+id/info_image" />
<ImageView <ImageView
android:id="@+id/imageView2" android:id="@+id/imageView2"
@ -75,7 +78,7 @@
android:layout_marginStart="12dp" android:layout_marginStart="12dp"
android:layout_marginTop="48dp" android:layout_marginTop="48dp"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView7" app:layout_constraintTop_toBottomOf="@+id/info_time_type"
app:srcCompat="@drawable/ic_outline_calendar_month_24" /> app:srcCompat="@drawable/ic_outline_calendar_month_24" />
<ImageView <ImageView
@ -83,17 +86,17 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="68dp" android:layout_marginStart="68dp"
app:layout_constraintStart_toEndOf="@+id/textView9" app:layout_constraintStart_toEndOf="@+id/info_date"
app:srcCompat="@drawable/ic_outline_remove_red_eye_24" app:srcCompat="@drawable/ic_outline_remove_red_eye_24"
tools:layout_editor_absoluteY="146dp" /> tools:layout_editor_absoluteY="146dp" />
<TextView <TextView
android:id="@+id/textView12" android:id="@+id/info_overview"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="24dp" android:layout_marginStart="24dp"
android:layout_marginTop="24dp" android:layout_marginTop="24dp"
android:text="La description" android:text="La description"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView11" /> app:layout_constraintTop_toBottomOf="@+id/info_title_overview" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
Loading…
Cancel
Save