diff --git a/CineCool/app/build.gradle b/CineCool/app/build.gradle index e5353a1..01eb0df 100644 --- a/CineCool/app/build.gradle +++ b/CineCool/app/build.gradle @@ -37,13 +37,15 @@ android { dependencies { - implementation 'androidx.core:core-ktx:1.9.0' + implementation 'androidx.core:core-ktx:1.10.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.8.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3' implementation 'androidx.navigation:navigation-ui-ktx:2.5.3' implementation 'com.google.android.gms:play-services-location:21.0.1' + implementation 'androidx.core:core-ktx:1.10.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' @@ -69,7 +71,7 @@ dependencies { implementation "com.squareup.okhttp3:okhttp:4.9.3" implementation "com.squareup.okhttp3:logging-interceptor:4.9.3" implementation "com.google.code.gson:gson:2.8.9" - implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'androidx.fragment:fragment-ktx:1.5.6' diff --git a/CineCool/app/src/main/AndroidManifest.xml b/CineCool/app/src/main/AndroidManifest.xml index 248342b..0603c3a 100644 --- a/CineCool/app/src/main/AndroidManifest.xml +++ b/CineCool/app/src/main/AndroidManifest.xml @@ -17,14 +17,12 @@ android:supportsRtl="true" android:theme="@style/Theme.CineCool" tools:targetApi="31"> - + android:theme="@style/Theme.CineCool.NoActionBar" + tools:ignore="DuplicateActivity"> diff --git a/CineCool/app/src/main/java/fr/iut/cinecool/API/OSM/ApiClientOSM.kt b/CineCool/app/src/main/java/fr/iut/cinecool/API/OSM/ApiClientOSM.kt new file mode 100644 index 0000000..db11957 --- /dev/null +++ b/CineCool/app/src/main/java/fr/iut/cinecool/API/OSM/ApiClientOSM.kt @@ -0,0 +1,25 @@ +package fr.iut.cinecool.API.OSM + +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +object ApiClientOSM { + private const val OSM_BASE_URL = "https://nominatim.openstreetmap.org/" + private const val ORS_BASE_URL = "https://api.openrouteservice.org/" + + fun getOSMClient(): ApiService { + return Retrofit.Builder() + .baseUrl(OSM_BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .build() + .create(ApiService::class.java) + } + + fun getORSClient(): ApiService { + return Retrofit.Builder() + .baseUrl(ORS_BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .build() + .create(ApiService::class.java) + } +} diff --git a/CineCool/app/src/main/java/fr/iut/cinecool/API/OSM/ApiService.kt b/CineCool/app/src/main/java/fr/iut/cinecool/API/OSM/ApiService.kt new file mode 100644 index 0000000..4b238a3 --- /dev/null +++ b/CineCool/app/src/main/java/fr/iut/cinecool/API/OSM/ApiService.kt @@ -0,0 +1,22 @@ +package fr.iut.cinecool.API.OSM + +import fr.iut.cinecool.model.CinemaResult +import fr.iut.cinecool.model.RouteResult +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Query + +interface ApiService { + @GET("search") + fun searchCinemas( + @Query("q") query: String, + @Query("format") format: String = "json" + ): Call> + + @GET("v2/directions/driving-car") + fun getRoute( + @Query("api_key") apiKey: String, + @Query("start") start: String, + @Query("end") end: String + ): Call +} diff --git a/CineCool/app/src/main/java/fr/iut/cinecool/API/ApiClient.kt b/CineCool/app/src/main/java/fr/iut/cinecool/API/THMDB/ApiClientTHMDB.kt similarity index 86% rename from CineCool/app/src/main/java/fr/iut/cinecool/API/ApiClient.kt rename to CineCool/app/src/main/java/fr/iut/cinecool/API/THMDB/ApiClientTHMDB.kt index 178d92e..cc548fa 100644 --- a/CineCool/app/src/main/java/fr/iut/cinecool/API/ApiClient.kt +++ b/CineCool/app/src/main/java/fr/iut/cinecool/API/THMDB/ApiClientTHMDB.kt @@ -1,9 +1,9 @@ -package fr.iut.cinecool.API +package fr.iut.cinecool.API.THMDB import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory -object ApiClient { +object ApiClientTHMDB { private const val BASE_URL = "https://api.themoviedb.org/3/" private val retrofit: Retrofit = Retrofit.Builder() diff --git a/CineCool/app/src/main/java/fr/iut/cinecool/API/ApiService.kt b/CineCool/app/src/main/java/fr/iut/cinecool/API/THMDB/ApiService.kt similarity index 92% rename from CineCool/app/src/main/java/fr/iut/cinecool/API/ApiService.kt rename to CineCool/app/src/main/java/fr/iut/cinecool/API/THMDB/ApiService.kt index 81012be..1fc1174 100644 --- a/CineCool/app/src/main/java/fr/iut/cinecool/API/ApiService.kt +++ b/CineCool/app/src/main/java/fr/iut/cinecool/API/THMDB/ApiService.kt @@ -1,4 +1,4 @@ -package fr.iut.cinecool.API +package fr.iut.cinecool.API.THMDB import retrofit2.http.GET import retrofit2.http.Query diff --git a/CineCool/app/src/main/java/fr/iut/cinecool/API/MovieResponse.kt b/CineCool/app/src/main/java/fr/iut/cinecool/API/THMDB/MovieResponse.kt similarity index 96% rename from CineCool/app/src/main/java/fr/iut/cinecool/API/MovieResponse.kt rename to CineCool/app/src/main/java/fr/iut/cinecool/API/THMDB/MovieResponse.kt index 862daa3..56454cc 100644 --- a/CineCool/app/src/main/java/fr/iut/cinecool/API/MovieResponse.kt +++ b/CineCool/app/src/main/java/fr/iut/cinecool/API/THMDB/MovieResponse.kt @@ -1,4 +1,4 @@ -package fr.iut.cinecool.API +package fr.iut.cinecool.API.THMDB import android.os.Parcel import android.os.Parcelable diff --git a/CineCool/app/src/main/java/fr/iut/cinecool/API/Repository.kt b/CineCool/app/src/main/java/fr/iut/cinecool/API/THMDB/Repository.kt similarity index 78% rename from CineCool/app/src/main/java/fr/iut/cinecool/API/Repository.kt rename to CineCool/app/src/main/java/fr/iut/cinecool/API/THMDB/Repository.kt index 5894918..d9d05e3 100644 --- a/CineCool/app/src/main/java/fr/iut/cinecool/API/Repository.kt +++ b/CineCool/app/src/main/java/fr/iut/cinecool/API/THMDB/Repository.kt @@ -1,7 +1,7 @@ -package fr.iut.cinecool.API +package fr.iut.cinecool.API.THMDB class Repository { - private val apiService = ApiClient.apiService + private val apiService = ApiClientTHMDB.apiService suspend fun getPopularMovies(apiKey: String, page: Int): MovieResponse { return apiService.getPopularMovies(apiKey, page) diff --git a/CineCool/app/src/main/java/fr/iut/cinecool/CinemaActivity.kt b/CineCool/app/src/main/java/fr/iut/cinecool/CinemaActivity.kt deleted file mode 100644 index 7ad53b5..0000000 --- a/CineCool/app/src/main/java/fr/iut/cinecool/CinemaActivity.kt +++ /dev/null @@ -1,18 +0,0 @@ -package fr.iut.cinecool - -import android.app.Activity -import androidx.appcompat.app.AppCompatActivity -import android.os.Bundle -import androidx.navigation.NavController -import androidx.navigation.fragment.NavHostFragment - -class CinemaActivity : AppCompatActivity() { - private lateinit var navController: NavController - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_cinema) - val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragment) as NavHostFragment - navController = navHostFragment.navController - } - -} \ No newline at end of file diff --git a/CineCool/app/src/main/java/fr/iut/cinecool/MainActivity.kt b/CineCool/app/src/main/java/fr/iut/cinecool/MainActivity.kt index d6d302e..2a8c655 100644 --- a/CineCool/app/src/main/java/fr/iut/cinecool/MainActivity.kt +++ b/CineCool/app/src/main/java/fr/iut/cinecool/MainActivity.kt @@ -1,32 +1,17 @@ package fr.iut.cinecool -import android.content.Intent -import android.os.Bundle -import android.widget.EditText -import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import androidx.navigation.NavController +import androidx.navigation.fragment.NavHostFragment class MainActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { + private lateinit var navController: NavController + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - val loginButton = findViewById(R.id.loginButton) - loginButton.setOnClickListener(){ - login() - } - - - /*ActivityCompat.requestPermissions(this, - arrayOf(Manifest.permission.ACCESS_FINE_LOCATION,1) - )*/ - } - fun login(){ - val name = findViewById(R.id.name).text - if (name.isNotEmpty()){ - val intent = Intent(applicationContext,CinemaActivity::class.java) - startActivity(intent) - System.out.println(name) - } + setContentView(R.layout.activity_master) + val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragment) as NavHostFragment + navController = navHostFragment.navController } -} +} \ No newline at end of file diff --git a/CineCool/app/src/main/java/fr/iut/cinecool/adapter/MovieAdapter.kt b/CineCool/app/src/main/java/fr/iut/cinecool/adapter/MovieAdapter.kt index b999383..dae6658 100644 --- a/CineCool/app/src/main/java/fr/iut/cinecool/adapter/MovieAdapter.kt +++ b/CineCool/app/src/main/java/fr/iut/cinecool/adapter/MovieAdapter.kt @@ -8,7 +8,7 @@ import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import fr.iut.cinecool.R -import fr.iut.cinecool.API.Movie +import fr.iut.cinecool.API.THMDB.Movie class MovieAdapter(private var moviesList: List) : RecyclerView.Adapter() { diff --git a/CineCool/app/src/main/java/fr/iut/cinecool/data/Stub.kt b/CineCool/app/src/main/java/fr/iut/cinecool/data/Stub.kt deleted file mode 100644 index 2341384..0000000 --- a/CineCool/app/src/main/java/fr/iut/cinecool/data/Stub.kt +++ /dev/null @@ -1,18 +0,0 @@ -package fr.iut.cinecool.data - -import fr.iut.cinecool.R -import fr.iut.cinecool.model.Cinema -import fr.iut.cinecool.model.Movie -import fr.iut.cinecool.model.Session -import java.util.Date - -class Stub(var sessions:ArrayList = ArrayList(), var movies:ArrayList = ArrayList(), var cinemas:ArrayList = ArrayList()) { - fun loading(){ - val date = Date(2023,3,12) - sessions.addAll(listOf(Session(0,date,14,16,"2A"), Session(1,date,4,6,"5B"))) - movies.add(Movie(1,"trop bg",2,"Pas moi",2.0, R.drawable.no_pictures)) - movies.add(Movie(0,"Imitation Game",4,"Moi",3.0,R.drawable.imitation_game)) - cinemas.add(Cinema(0,12367,67894,"clf","CineJaude")) - cinemas.add(Cinema(1,87634,43567,"Aubière","CGR Le Paris")) - } -} \ No newline at end of file diff --git a/CineCool/app/src/main/java/fr/iut/cinecool/fragments/MovieDetailFragment.kt b/CineCool/app/src/main/java/fr/iut/cinecool/fragments/MovieDetailFragment.kt index c3c933c..4cd957a 100644 --- a/CineCool/app/src/main/java/fr/iut/cinecool/fragments/MovieDetailFragment.kt +++ b/CineCool/app/src/main/java/fr/iut/cinecool/fragments/MovieDetailFragment.kt @@ -1,52 +1,51 @@ package fr.iut.cinecool.fragments import android.os.Bundle +import android.text.method.ScrollingMovementMethod import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageButton +import android.widget.ImageView +import android.widget.TextView +import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController -import fr.iut.cinecool.API.Movie -// import fr.iut.cinecool.databinding.FragmentMovieDetailBinding +import com.bumptech.glide.Glide +import fr.iut.cinecool.R +import fr.iut.cinecool.viewModel.cineViewModel class MovieDetailFragment : Fragment() { - /*private var _binding: FragmentDetailMovieBinding? = null - private val binding get() = _binding!! + private val sharedViewModel: cineViewModel by activityViewModels() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - _binding = FragmentDetailMovieBinding.inflate(inflater, container, false) - return binding.root + // Inflate the layout for this fragment + val view = inflater.inflate(R.layout.fragment_detail, container, false) + return view } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - // Récupérez le film passé en argument - val movie: Movie? = arguments?.getParcelable("movie") - - // Mettez à jour les vues avec les données du film - if (movie != null) { - binding.titreFilm.text = movie.title - binding.description.text = movie.overview - - val imageUrl = "https://image.tmdb.org/t/p/w500${movie.poster_path}" - Glide.with(binding.afficheFilm.context) - .load(imageUrl) - .placeholder(R.drawable.imitation_game) - .into(binding.afficheFilm) - } - - // Gérer le clic sur le bouton de retour - binding.backButton.setOnClickListener { - findNavController().popBackStack() + init() + val button = view.findViewById(R.id.returnButton) + button.setOnClickListener { + findNavController().navigate(R.id.action_SessionFragment_to_fragment_movies) } } - - override fun onDestroyView() { - super.onDestroyView() - _binding = null - }*/ -} - + private fun init() { + requireView().findViewById(R.id.title).text= sharedViewModel.cine.value?.title + val desc = requireView().findViewById(R.id.description) + desc.text=sharedViewModel.cine.value?.overview + desc.isScrollContainer = true + desc.movementMethod = ScrollingMovementMethod() + val img=requireView().findViewById(R.id.afficheFilm) + + val imageUrl = "https://image.tmdb.org/t/p/w500${sharedViewModel.cine.value?.poster_path}" + + Glide.with(this.requireContext()) + .load(imageUrl) + .placeholder(R.drawable.no_pictures) + .into(img) + } +} \ No newline at end of file diff --git a/CineCool/app/src/main/java/fr/iut/cinecool/fragments/SessionFragment.kt b/CineCool/app/src/main/java/fr/iut/cinecool/fragments/SessionFragment.kt deleted file mode 100644 index df62431..0000000 --- a/CineCool/app/src/main/java/fr/iut/cinecool/fragments/SessionFragment.kt +++ /dev/null @@ -1,51 +0,0 @@ -package fr.iut.cinecool.fragments - -import android.os.Bundle -import android.text.method.ScrollingMovementMethod -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageButton -import android.widget.ImageView -import android.widget.TextView -import androidx.fragment.app.activityViewModels -import androidx.navigation.fragment.findNavController -import com.bumptech.glide.Glide -import fr.iut.cinecool.R -import fr.iut.cinecool.viewModel.cineViewModel - -class SessionFragment : Fragment() { - private val sharedViewModel: cineViewModel by activityViewModels() - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - val view = inflater.inflate(R.layout.fragment_session, container, false) - return view - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - init() - val button = view.findViewById(R.id.returnButton) - button.setOnClickListener { - findNavController().navigate(R.id.action_SessionFragment_to_fragment_movies) - } - } - private fun init() { - requireView().findViewById(R.id.title).text= sharedViewModel.cine.value?.title - val desc = requireView().findViewById(R.id.description) - desc.text=sharedViewModel.cine.value?.overview - desc.isScrollContainer = true - desc.movementMethod = ScrollingMovementMethod() - val img=requireView().findViewById(R.id.afficheFilm) - - val imageUrl = "https://image.tmdb.org/t/p/w500${sharedViewModel.cine.value?.poster_path}" - - Glide.with(this.requireContext()) - .load(imageUrl) - .placeholder(R.drawable.no_pictures) - .into(img) - } -} \ No newline at end of file diff --git a/CineCool/app/src/main/java/fr/iut/cinecool/model/Cinema.kt b/CineCool/app/src/main/java/fr/iut/cinecool/model/Cinema.kt index 6368c5e..f2ebcdf 100644 --- a/CineCool/app/src/main/java/fr/iut/cinecool/model/Cinema.kt +++ b/CineCool/app/src/main/java/fr/iut/cinecool/model/Cinema.kt @@ -1,3 +1,23 @@ package fr.iut.cinecool.model -data class Cinema (val id:Int, val latitude:Int, val longitude:Int, val city:String, val name:String, /*var movies:ArrayList*/) \ No newline at end of file +data class CinemaResult( + val lat: Double, + val lon: Double, + val display_name: String +) + +data class RouteResult( + val routes: List +) + +data class Route( + val segments: List +) + +data class Segment( + val steps: List +) + +data class Step( + val instruction: String +) diff --git a/CineCool/app/src/main/java/fr/iut/cinecool/viewModel/CineViewModel.kt b/CineCool/app/src/main/java/fr/iut/cinecool/viewModel/CineViewModel.kt index f8507d8..d5fcee1 100644 --- a/CineCool/app/src/main/java/fr/iut/cinecool/viewModel/CineViewModel.kt +++ b/CineCool/app/src/main/java/fr/iut/cinecool/viewModel/CineViewModel.kt @@ -3,13 +3,14 @@ package fr.iut.cinecool.viewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData +import fr.iut.cinecool.API.THMDB.Movie class cineViewModel : ViewModel() { - private val _cine = MutableLiveData() - val cine: LiveData = _cine + private val _cine = MutableLiveData() + val cine: LiveData = _cine - fun setCine(cine: fr.iut.cinecool.API.Movie) { + fun setCine(cine: Movie) { _cine.value = cine } diff --git a/CineCool/app/src/main/java/fr/iut/cinecool/viewModel/MovieViewModel.kt b/CineCool/app/src/main/java/fr/iut/cinecool/viewModel/MovieViewModel.kt index 3d0b0c0..1a19080 100644 --- a/CineCool/app/src/main/java/fr/iut/cinecool/viewModel/MovieViewModel.kt +++ b/CineCool/app/src/main/java/fr/iut/cinecool/viewModel/MovieViewModel.kt @@ -4,8 +4,8 @@ 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 +import fr.iut.cinecool.API.THMDB.Movie +import fr.iut.cinecool.API.THMDB.Repository class MovieViewModel : ViewModel() { private val repository = Repository() diff --git a/CineCool/app/src/main/res/layout/activity_main.xml b/CineCool/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index b21508c..0000000 --- a/CineCool/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/CineCool/app/src/main/res/layout/activity_cinema.xml b/CineCool/app/src/main/res/layout/activity_master.xml similarity index 89% rename from CineCool/app/src/main/res/layout/activity_cinema.xml rename to CineCool/app/src/main/res/layout/activity_master.xml index 28d1ee9..d10d6f4 100644 --- a/CineCool/app/src/main/res/layout/activity_cinema.xml +++ b/CineCool/app/src/main/res/layout/activity_master.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".CinemaActivity"> + tools:context=".MainActivity"> + tools:context=".fragments.MovieDetailFragment"> + tools:layout="@layout/fragment_detail"> diff --git a/CineCool/build.gradle b/CineCool/build.gradle index 3e76939..71ad002 100644 --- a/CineCool/build.gradle +++ b/CineCool/build.gradle @@ -2,5 +2,5 @@ plugins { id 'com.android.application' version '7.4.2' apply false id 'com.android.library' version '7.4.2' apply false - id 'org.jetbrains.kotlin.android' version '1.8.20-RC2' apply false + id 'org.jetbrains.kotlin.android' version '1.8.20' apply false } \ No newline at end of file