Système_de_proximité
louwar 2 years ago
parent 56658b6b73
commit 1fdca22aa4

@ -74,4 +74,8 @@ dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'androidx.fragment:fragment-ktx:1.5.6' implementation 'androidx.fragment:fragment-ktx:1.5.6'
implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1'
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
} }

@ -1,9 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- Ajoutez cette ligne pour autoriser l'accès à Internet -->
<uses-permission android:name="android.permission.INTERNET" />
<application <application
android:allowBackup="true" android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"

@ -0,0 +1,15 @@
package fr.iut.cinecool.API
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
object ApiClient {
private const val BASE_URL = "https://api.themoviedb.org/3/"
private val retrofit: Retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
val apiService: ApiService = retrofit.create(ApiService::class.java)
}

@ -0,0 +1,20 @@
package fr.iut.cinecool.API
import retrofit2.http.GET
import retrofit2.http.Query
interface ApiService {
@GET("movie/popular")
suspend fun getPopularMovies(
@Query("api_key") apiKey: String,
@Query("page") page: Int
): MovieResponse
@GET("search/movie")
suspend fun searchMovies(
@Query("api_key") apiKey: String,
@Query("query") query: String,
@Query("page") page: Int
): MovieResponse
}

@ -0,0 +1,15 @@
package fr.iut.cinecool.API
data class MovieResponse(
val page: Int,
val results: List<Movie>,
val total_pages: Int,
val total_results: Int
)
data class Movie(
val id: Int,
val title: String,
val poster_path: String?,
val overview: String
)

@ -0,0 +1,13 @@
package fr.iut.cinecool.API
class Repository {
private val apiService = ApiClient.apiService
suspend fun getPopularMovies(apiKey: String, page: Int): MovieResponse {
return apiService.getPopularMovies(apiKey, page)
}
suspend fun searchMovies(apiKey: String, query: String, page: Int): MovieResponse {
return apiService.searchMovies(apiKey, query, page)
}
}

@ -1,17 +1,7 @@
package fr.iut.cinecool package fr.iut.cinecool
import android.os.Bundle import android.os.Bundle
import android.widget.ImageButton
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import fr.iut.cinecool.interfaces.ITheMovieDbApiCallback
import fr.iut.cinecool.model.Movie
import fr.iut.cinecool.model.MovieAPI
import fr.iut.cinecool.services.TheMovieDbApiClient
import retrofit2.Call
import retrofit2.Response
import javax.security.auth.callback.Callback
class DetailActivity : AppCompatActivity() { class DetailActivity : AppCompatActivity() {

@ -0,0 +1,29 @@
package fr.iut.cinecool
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
import androidx.lifecycle.MutableLiveData
import fr.iut.cinecool.API.Movie
import fr.iut.cinecool.API.Repository
class MovieViewModel : ViewModel() {
private val repository = Repository()
val popularMovies = MutableLiveData<List<Movie>>()
val searchResults = MutableLiveData<List<Movie>>()
fun getPopularMovies(apiKey: String, page: Int) {
viewModelScope.launch {
val movies = repository.getPopularMovies(apiKey, page)
popularMovies.postValue(movies.results)
}
}
fun searchMovies(apiKey: String, query: String, page: Int) {
viewModelScope.launch {
val movies = repository.searchMovies(apiKey, query, page)
searchResults.postValue(movies.results)
}
}
}

@ -6,36 +6,63 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Button import android.widget.Button
import androidx.fragment.app.viewModels
import android.widget.LinearLayout import android.widget.LinearLayout
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import fr.iut.cinecool.adapter.MovieAdapter import fr.iut.cinecool.adapter.MovieAdapter
import fr.iut.cinecool.databinding.FragmentMoviesBinding
import fr.iut.cinecool.model.Movie import fr.iut.cinecool.model.Movie
import fr.iut.cinecool.model.Stub import fr.iut.cinecool.model.Stub
class MoviesFragment : Fragment() { class MoviesFragment : Fragment() {
private lateinit var recycler: RecyclerView private var _binding: FragmentMoviesBinding? = null
private lateinit var movieList: ArrayList<Movie> private val binding get() = _binding!!
private lateinit var movieAdapter: MovieAdapter private lateinit var movieAdapter: MovieAdapter
private val movieViewModel: MovieViewModel by viewModels()
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
// Inflate the layout for this fragment _binding = FragmentMoviesBinding.inflate(inflater, container, false)
val view = inflater.inflate(R.layout.fragment_movies, container, false) return binding.root
val button = view.findViewById<Button>(R.id.button) }
button.setOnClickListener {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.button.setOnClickListener {
findNavController().navigate(R.id.movies_to_sessions) findNavController().navigate(R.id.movies_to_sessions)
} }
recycler = view.findViewById(R.id.recyclerMovie)
recycler.setHasFixedSize(true) initRecyclerView()
recycler.layoutManager = LinearLayoutManager(context)
val stub = Stub() // Observe les changements des données des films populaires
stub.loading() movieViewModel.popularMovies.observe(viewLifecycleOwner, { movies ->
movieList=stub.movies movieAdapter.updateMovies(movies)
movieAdapter = MovieAdapter(movieList) })
recycler.adapter = movieAdapter
return view // Charge les films populaires
loadPopularMovies()
}
private fun initRecyclerView() {
binding.recyclerMovie.setHasFixedSize(true)
binding.recyclerMovie.layoutManager = LinearLayoutManager(context)
movieAdapter = MovieAdapter(ArrayList())
binding.recyclerMovie.adapter = movieAdapter
}
private fun loadPopularMovies() {
// Remplacez YOUR_API_KEY par votre clé d'API The Movie DB
movieViewModel.getPopularMovies("a97243d7813d31446f6c43284e6854d5", 1)
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
} }
} }

@ -1,25 +0,0 @@
package fr.iut.cinecool
import fr.iut.cinecool.services.TheMovieDbApiClient
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit
object RetrofitClient {
private const val BASE_URL = "https://api.themoviedb.org/3/"
private val okHttpClient = OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build()
private val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
val api: TheMovieDbApiClient = retrofit.create(TheMovieDbApiClient::class.java)
}

@ -7,10 +7,10 @@ import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import fr.iut.cinecool.R import fr.iut.cinecool.R
import fr.iut.cinecool.model.Movie import com.bumptech.glide.Glide
import fr.iut.cinecool.API.Movie
class MovieAdapter(private val moviesList: ArrayList<Movie>) :
class MovieAdapter(private var moviesList: List<Movie>) :
RecyclerView.Adapter<MovieAdapter.MovieViewHolder>() { RecyclerView.Adapter<MovieAdapter.MovieViewHolder>() {
class MovieViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { class MovieViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
@ -30,8 +30,21 @@ class MovieAdapter(private val moviesList: ArrayList<Movie>) :
override fun onBindViewHolder(holder: MovieViewHolder, position: Int) { override fun onBindViewHolder(holder: MovieViewHolder, position: Int) {
val movie = moviesList[position] val movie = moviesList[position]
holder.imageView.setImageResource(movie.icon) val imageUrl = "https://image.tmdb.org/t/p/w500${movie.poster_path}"
holder.MovieName.text = movie.name
holder.OtherInformations.text = movie.realisator +" "+ movie.duration +" "+ movie.mark Glide.with(holder.itemView.context)
.load(imageUrl)
.placeholder(R.drawable.imitation_game)
.into(holder.imageView)
holder.MovieName.text = movie.title
// Pour cet exemple, je mets l'overview en tant qu'OtherInformations, vous pouvez le personnaliser selon vos besoins
holder.OtherInformations.text = movie.overview
}
// Ajoutez cette méthode pour mettre à jour la liste des films
fun updateMovies(newMovies: List<Movie>) {
moviesList = newMovies
notifyDataSetChanged()
} }
} }

@ -1,6 +0,0 @@
package fr.iut.cinecool.interfaces
interface ITheMovieDbApiCallback<T> {
fun onSuccess(result: T)
fun onError(error: Throwable)
}

@ -1,12 +0,0 @@
package fr.iut.cinecool.interfaces
import fr.iut.cinecool.model.Movie
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Path
import retrofit2.http.Query
interface ITheMovieDbService {
@GET("movie/{movieId}")
fun getMovieDetails(@Path("movieId") movieId: Int, @Query("api_key") apiKey: String): Call<Movie>
}

@ -4,11 +4,3 @@ import android.graphics.drawable.Drawable
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
data class Movie(val id:Int, val name:String, var mark:Int, val realisator:String, var duration: Double, val icon:Int) data class Movie(val id:Int, val name:String, var mark:Int, val realisator:String, var duration: Double, val icon:Int)
// D'après l'API (TheMovieDB)
data class MovieAPI(
@SerializedName("id") val id: Int,
@SerializedName("title") val title: String,
@SerializedName("overview") val overview: String,
@SerializedName("poster_path") val posterPath: String?,
@SerializedName("vote_average") val voteAverage: Float
)

@ -1,57 +0,0 @@
package fr.iut.cinecool.services
import fr.iut.cinecool.interfaces.ITheMovieDbApiCallback
import fr.iut.cinecool.interfaces.ITheMovieDbService
import fr.iut.cinecool.model.MovieAPI
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
class TheMovieDbApiClient(apiKey: String) {
private val service: ITheMovieDbService = Retrofit.Builder()
.baseUrl("https://api.themoviedb.org/3/")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ITheMovieDbService::class.java)
private val apiKeyInterceptor = Interceptor { chain ->
val url = chain.request().url.newBuilder()
.addQueryParameter("tmdb_api_key", apiKey)
.build()
val request = chain.request().newBuilder()
.url(url)
.build()
chain.proceed(request)
}
private val client: OkHttpClient = OkHttpClient.Builder()
.addInterceptor(apiKeyInterceptor)
.build()
/*fun getMovieDetails(movieId: Int, callback: ITheMovieDbApiCallback<MovieAPI>) {
service.getMovieDetails(movieId).enqueue(object : Callback<MovieAPI> {
override fun onResponse(call: Call<MovieAPI>, response: Response<MovieAPI>) {
if (response.isSuccessful) {
val result = response.body()
if (result != null) {
callback.onSuccess(result)
} else {
callback.onError(Throwable("Empty response body"))
}
} else {
callback.onError(Throwable("Error ${response.code()}: ${response.message()}"))
}
}
override fun onFailure(call: Call<MovieAPI>, t: Throwable) {
callback.onError(t)
}
})
}*/
}
Loading…
Cancel
Save