diff --git a/HomeWorkNetwork/.idea/gradle.xml b/HomeWorkNetwork/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/HomeWorkNetwork/.idea/gradle.xml +++ b/HomeWorkNetwork/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/HomeWorkNetwork/app/build.gradle b/HomeWorkNetwork/app/build.gradle index d5e6ad0..4158702 100644 --- a/HomeWorkNetwork/app/build.gradle +++ b/HomeWorkNetwork/app/build.gradle @@ -10,7 +10,7 @@ android { defaultConfig { buildConfigField "String", "API_BASE_URL", '"api.themoviedb.org"' - buildConfigField "String", "API_KEY", '"/*ваш ap_key*/"' + buildConfigField "String", "API_KEY", '"5312d0ab4e8530cb43126e5a47da49ca"' buildConfigField "String", "API_IMAGE_BASE_URL", '"https://image.tmdb.org/t/p/w500"' applicationId "com.pg.homeworknetwork" @@ -46,4 +46,22 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'com.google.android.material:material:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' + + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2' + implementation "com.squareup.okhttp3:okhttp:4.9.3" + implementation 'com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0' + implementation "io.reactivex.rxjava3:rxjava:3.1.4" + implementation "io.reactivex.rxjava3:rxandroid:3.0.0" + implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0' + implementation 'com.squareup.okhttp3:logging-interceptor:4.8.1' + + implementation "io.ktor:ktor-client-core:1.6.7" + implementation "io.ktor:ktor-client-android:1.6.7" + implementation 'io.ktor:ktor-client-serialization:1.6.7' + implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2' + implementation 'io.ktor:ktor-client-logging-jvm:1.6.7' + + implementation 'androidx.test.ext:junit-ktx:1.1.3' + } \ No newline at end of file diff --git a/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/Models.kt b/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/Models.kt index 69df05a..6292408 100644 --- a/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/Models.kt +++ b/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/Models.kt @@ -1,5 +1,30 @@ package com.pg.homeworknetwork -class Movies +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -class Movie \ No newline at end of file +@Serializable +data class Movies( + @SerialName("page") + val page: Int, + @SerialName("results") + val results: MutableList +) + +@Serializable +data class Movie( + @SerialName("id") + val id: Int, + @SerialName("title") + val title: String? = null, + @SerialName("poster_path") + val posterPath: String? = null, + @SerialName("overview") + val overview: String? = null, + @SerialName("release_date") + val releaseDate: String? = null, + @SerialName("original_title") + val originalTitle: String? = null, + @SerialName("popularity") + val popularity: Double? = null +) \ No newline at end of file diff --git a/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/MovieDetailFragment.kt b/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/MovieDetailFragment.kt index 338ddc7..d6c512b 100644 --- a/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/MovieDetailFragment.kt +++ b/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/MovieDetailFragment.kt @@ -10,6 +10,7 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction import coil.load import coil.transform.RoundedCornersTransformation +import kotlinx.coroutines.* class MovieDetailFragment : Fragment(R.layout.fragment_movie_preview) { lateinit var poster: ImageView @@ -18,6 +19,8 @@ class MovieDetailFragment : Fragment(R.layout.fragment_movie_preview) { lateinit var popularity: TextView lateinit var releaseDate: TextView + private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) with(view) { @@ -29,14 +32,19 @@ class MovieDetailFragment : Fragment(R.layout.fragment_movie_preview) { } val movieId = arguments?.getInt(ARG_ID) ?: 550 - val movie = //получаем фильм - poster.load("${BuildConfig.API_IMAGE_BASE_URL}${movie.posterPath}") { - transformations(RoundedCornersTransformation(16f)) + scope.launch { + //TODO получаем фильм + val movie = Api().getMovieById(movieId) + withContext(Dispatchers.Main) { + poster.load("${BuildConfig.API_IMAGE_BASE_URL}${movie.posterPath}") { + transformations(RoundedCornersTransformation(16f)) + } + originalTitle.text = movie.originalTitle + overview.text = movie.overview + popularity.text = movie.popularity.toString() + releaseDate.text = movie.releaseDate + } } - originalTitle.text = movie.originalTitle - overview.text = movie.overview - popularity.text = movie.popularity.toString() - releaseDate.text = movie.releaseDate activity?.onBackPressedDispatcher?.addCallback(this.viewLifecycleOwner, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { diff --git a/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/MovieListFragment.kt b/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/MovieListFragment.kt index 762a176..59d5f25 100644 --- a/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/MovieListFragment.kt +++ b/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/MovieListFragment.kt @@ -7,9 +7,14 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch class MovieListFragment : Fragment(R.layout.fragment_movie_list) { lateinit var recycler: RecyclerView + private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) private val goToDetails = object : MovieItemAdapter.IOnItemClick { override fun onItemClick(movie: Movie) { @@ -31,8 +36,10 @@ class MovieListFragment : Fragment(R.layout.fragment_movie_list) { } } val adapter = (recycler.adapter as MovieItemAdapter) - val movies = //получаем фильмы - adapter.submitList(movies) + scope.launch { + val movies = Api().getTopMovies() + adapter.submitList(movies.results) + } super.onViewCreated(view, savedInstanceState) } diff --git a/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/Network.kt b/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/Network.kt index af25f9f..94d1e00 100644 --- a/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/Network.kt +++ b/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/Network.kt @@ -1,5 +1,37 @@ package com.pg.homeworknetwork +import io.ktor.client.* +import io.ktor.client.engine.android.* +import io.ktor.client.features.json.* +import io.ktor.client.features.json.serializer.* +import io.ktor.client.request.* +import kotlinx.serialization.json.Json as serialJson + class Api { + private val client = HttpClient(Android){ + install(JsonFeature) { + serializer = KotlinxSerializer(serialJson { + prettyPrint = true + isLenient = true + ignoreUnknownKeys = true + }) + } + } + + suspend fun getTopMovies(): Movies { + return client.use { + it.get(host = BuildConfig.API_BASE_URL, path = "3/movie/top_rated") { + parameter("api_key", BuildConfig.API_KEY) + } + } + } + + suspend fun getMovieById(id: Int): Movie { + return client.use { + it.get(host = BuildConfig.API_BASE_URL, path = "3/movie/" + id.toString()) { + parameter("api_key", BuildConfig.API_KEY) + } + } + } } \ No newline at end of file