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 'androidx.fragment:fragment-ktx:1.5.6'
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"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.ACCESS_COARSE_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
android:allowBackup="true"
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
import android.os.Bundle
import android.widget.ImageButton
import android.widget.ImageView
import android.widget.TextView
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() {

@ -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.ViewGroup
import android.widget.Button
import androidx.fragment.app.viewModels
import android.widget.LinearLayout
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import fr.iut.cinecool.adapter.MovieAdapter
import fr.iut.cinecool.databinding.FragmentMoviesBinding
import fr.iut.cinecool.model.Movie
import fr.iut.cinecool.model.Stub
class MoviesFragment : Fragment() {
private lateinit var recycler: RecyclerView
private lateinit var movieList: ArrayList<Movie>
private var _binding: FragmentMoviesBinding? = null
private val binding get() = _binding!!
private lateinit var movieAdapter: MovieAdapter
private val movieViewModel: MovieViewModel by viewModels()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_movies, container, false)
val button = view.findViewById<Button>(R.id.button)
button.setOnClickListener {
_binding = FragmentMoviesBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.button.setOnClickListener {
findNavController().navigate(R.id.movies_to_sessions)
}
recycler = view.findViewById(R.id.recyclerMovie)
recycler.setHasFixedSize(true)
recycler.layoutManager = LinearLayoutManager(context)
val stub = Stub()
stub.loading()
movieList=stub.movies
movieAdapter = MovieAdapter(movieList)
recycler.adapter = movieAdapter
return view
initRecyclerView()
// Observe les changements des données des films populaires
movieViewModel.popularMovies.observe(viewLifecycleOwner, { movies ->
movieAdapter.updateMovies(movies)
})
// 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 androidx.recyclerview.widget.RecyclerView
import fr.iut.cinecool.R
import fr.iut.cinecool.model.Movie
class MovieAdapter(private val moviesList: ArrayList<Movie>) :
import com.bumptech.glide.Glide
import fr.iut.cinecool.API.Movie
class MovieAdapter(private var moviesList: List<Movie>) :
RecyclerView.Adapter<MovieAdapter.MovieViewHolder>() {
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) {
val movie = moviesList[position]
holder.imageView.setImageResource(movie.icon)
holder.MovieName.text = movie.name
holder.OtherInformations.text = movie.realisator +" "+ movie.duration +" "+ movie.mark
val imageUrl = "https://image.tmdb.org/t/p/w500${movie.poster_path}"
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
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