From e52798ae2adf1911b25b09f7658b148206b6d45f Mon Sep 17 00:00:00 2001 From: Alex Pan Date: Thu, 7 Apr 2022 11:31:24 +0300 Subject: [PATCH] homework 3. network --- HomeWorkNetwork/app/build.gradle | 17 +++++++++- .../java/com/pg/homeworknetwork/Models.kt | 28 ++++++++++++++-- .../pg/homeworknetwork/MovieDetailFragment.kt | 24 ++++++++++---- .../pg/homeworknetwork/MovieListFragment.kt | 14 ++++++-- .../java/com/pg/homeworknetwork/Network.kt | 33 ++++++++++++++++++- HomeworkTemplate/build.gradle | 4 +-- 6 files changed, 105 insertions(+), 15 deletions(-) diff --git a/HomeWorkNetwork/app/build.gradle b/HomeWorkNetwork/app/build.gradle index d5e6ad0..c160feb 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", '"8c36877bfc3c8db80235da73a301a630"' buildConfigField "String", "API_IMAGE_BASE_URL", '"https://image.tmdb.org/t/p/w500"' applicationId "com.pg.homeworknetwork" @@ -46,4 +46,19 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'com.google.android.material:material:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' + + //KTOR + 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' + + + //Coroutine + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0' + + //test + 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..3bb96dc 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,29 @@ package com.pg.homeworknetwork +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -class Movies +@Serializable +data class Movies ( + @SerialName("page") + val page: Int, + @SerialName("results") + val movies: MutableList +) -class Movie \ No newline at end of file +@Serializable +data class Movie ( + @SerialName("id") + val id: Int, + @SerialName("title") + val title: String, + @SerialName("poster_path") + val posterPath: String, + @SerialName("original_title") + val originalTitle: String?, + @SerialName("overview") + val overview: String?, + @SerialName("popularity") + val popularity: Double?, + @SerialName("release_date") + val releaseDate: String? +) \ 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..7d30776 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,8 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction import coil.load import coil.transform.RoundedCornersTransformation +import kotlinx.coroutines.* +import kotlin.coroutines.CoroutineContext class MovieDetailFragment : Fragment(R.layout.fragment_movie_preview) { lateinit var poster: ImageView @@ -18,6 +20,9 @@ class MovieDetailFragment : Fragment(R.layout.fragment_movie_preview) { lateinit var popularity: TextView lateinit var releaseDate: TextView + private val context: CoroutineContext = SupervisorJob() + Dispatchers.IO + private val scope = CoroutineScope(context) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) with(view) { @@ -29,14 +34,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 = MovieApi().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..fd0663b 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,16 @@ 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 +import kotlin.coroutines.CoroutineContext class MovieListFragment : Fragment(R.layout.fragment_movie_list) { lateinit var recycler: RecyclerView + private val context: CoroutineContext = SupervisorJob() + Dispatchers.IO + private val scope = CoroutineScope(context) private val goToDetails = object : MovieItemAdapter.IOnItemClick { override fun onItemClick(movie: Movie) { @@ -31,8 +38,11 @@ class MovieListFragment : Fragment(R.layout.fragment_movie_list) { } } val adapter = (recycler.adapter as MovieItemAdapter) - val movies = //получаем фильмы - adapter.submitList(movies) + //TODO получаем фильмы + scope.launch { + val movies = MovieApi().getListMovies() + adapter.submitList(movies.movies) + } 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..6575735 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,36 @@ package com.pg.homeworknetwork -class Api { +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 MovieApi { + private val client = HttpClient(Android){ + install(JsonFeature) { + serializer = KotlinxSerializer(serialJson { + prettyPrint = true + isLenient = true + ignoreUnknownKeys = true + }) + } + } + + suspend fun getListMovies(): Movies = client.get( + host = BuildConfig.API_BASE_URL, + path = "3/movie/popular" + ) { + parameter("api_key", BuildConfig.API_KEY) + parameter("language", "ru") + } + + suspend fun getMovieById(id: Int): Movie = client.get( + host = BuildConfig.API_BASE_URL, + path = "3/movie/${id}" + ) { + parameter("api_key", BuildConfig.API_KEY) + parameter("language", "ru") + } } \ No newline at end of file diff --git a/HomeworkTemplate/build.gradle b/HomeworkTemplate/build.gradle index 84ed49d..0ccd671 100644 --- a/HomeworkTemplate/build.gradle +++ b/HomeworkTemplate/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '7.1.1' apply false - id 'com.android.library' version '7.1.1' apply false + id 'com.android.application' version '7.1.2' apply false + id 'com.android.library' version '7.1.2' apply false id 'org.jetbrains.kotlin.android' version '1.6.10' apply false }