From 894ea7f5834c70c09c39fde54302d9ec24a960ee Mon Sep 17 00:00:00 2001 From: gleb molotkov Date: Tue, 12 Apr 2022 21:53:48 +0300 Subject: [PATCH] 1ver --- HomeWorkNetwork/app/build.gradle | 30 +++++++++- .../java/com/pg/homeworknetwork/Models.kt | 37 +++++++++++- .../pg/homeworknetwork/MovieDetailFragment.kt | 32 +++++++++- .../pg/homeworknetwork/MovieListFragment.kt | 15 ++++- .../java/com/pg/homeworknetwork/Network.kt | 58 +++++++++++++++++++ 5 files changed, 165 insertions(+), 7 deletions(-) diff --git a/HomeWorkNetwork/app/build.gradle b/HomeWorkNetwork/app/build.gradle index d5e6ad0..f6d724c 100644 --- a/HomeWorkNetwork/app/build.gradle +++ b/HomeWorkNetwork/app/build.gradle @@ -7,14 +7,27 @@ plugins { android { compileSdk 31 + packagingOptions { + /* A failure occurred while executing com.android.build.gradle.internal.tasks.MergeJavaResWorkAction + */ + pickFirst 'META-INF/DEPENDENCIES' + pickFirst 'META-INF/INDEX.LIST' + pickFirst 'META-INF/io.netty.versions.properties' + } + + + + + defaultConfig { buildConfigField "String", "API_BASE_URL", '"api.themoviedb.org"' - buildConfigField "String", "API_KEY", '"/*ваш ap_key*/"' + buildConfigField "String", "API_KEY", '"14b7da11c0f7fbc92f26a7cbcd9ff925"' buildConfigField "String", "API_IMAGE_BASE_URL", '"https://image.tmdb.org/t/p/w500"' applicationId "com.pg.homeworknetwork" minSdk 30 + targetSdk 31 versionCode 1 versionName "1.0" @@ -28,6 +41,9 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + + + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -38,6 +54,7 @@ android { } dependencies { + def v_ktr = '1.6.8' //Coil (загрузка постеров) implementation "io.coil-kt:coil-compose:2.0.0-rc02" @@ -46,4 +63,15 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'com.google.android.material:material:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' + //my + implementation("io.ktor:ktor-server-core:${v_ktr}") + implementation("io.ktor:ktor-server-netty:${v_ktr}") + implementation("ch.qos.logback:logback-classic:1.2.5") + implementation("io.ktor:ktor-client-logging:${v_ktr}") + implementation("io.ktor:ktor-client-serialization:${v_ktr}") + implementation("io.ktor:ktor-client-cio:${v_ktr}") + implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2" + + + // } \ 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..001da52 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,40 @@ package com.pg.homeworknetwork +import kotlinx.serialization.* + +@Serializable class Movies +( + @SerialName("page") + val page: Int, + @SerialName("result") + val result : List =ArrayList(), + @SerialName("total_results") + val total_results: Int, + @SerialName("total_pages") + val total_pages: Int +) + -class Movie \ No newline at end of file +@Serializable +data class Movie + ( + @SerialName("id") //TODO рассказать + val id: Int, + @SerialName("title") + val title: String? = null, + @SerialName("poster") + val poster: String? = null, + // + @SerialName("poster_patch") + val posterPath: String? = null, + // + @SerialName("original_title") + val originalTitle: String? = null, + @SerialName("overview") + val overview: String? = null, + @SerialName("popularity") + val popularity: Double? = null, + @SerialName("release_date") + val releaseDate: String? = null +) 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..754d79d 100644 --- a/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/MovieDetailFragment.kt +++ b/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/MovieDetailFragment.kt @@ -10,8 +10,12 @@ 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 lateinit var originalTitle: TextView lateinit var overview: TextView @@ -21,6 +25,7 @@ class MovieDetailFragment : Fragment(R.layout.fragment_movie_preview) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) with(view) { + println("view:"+ view) poster = findViewById(R.id.poster) originalTitle = findViewById(R.id.originalTitle) overview = findViewById(R.id.overview) @@ -28,8 +33,8 @@ class MovieDetailFragment : Fragment(R.layout.fragment_movie_preview) { releaseDate = findViewById(R.id.releaseDate) } - val movieId = arguments?.getInt(ARG_ID) ?: 550 - val movie = //получаем фильм + // val movieId = arguments?.getInt(ARG_ID) ?: 550 + /*val movie = //получаем фильм poster.load("${BuildConfig.API_IMAGE_BASE_URL}${movie.posterPath}") { transformations(RoundedCornersTransformation(16f)) } @@ -37,6 +42,22 @@ class MovieDetailFragment : Fragment(R.layout.fragment_movie_preview) { overview.text = movie.overview popularity.text = movie.popularity.toString() releaseDate.text = movie.releaseDate + */ + CoroutineScope(SupervisorJob() + Dispatchers.IO).launch { + println("Корутина выполняется на потоке: ${Thread.currentThread().name}") + val movieId = arguments?.getInt(ARG_ID) ?: 550 + println("movieId:"+ movieId) + val movie: Movie = Api().getMovie(movieId) + //получаем фильм + println("Movie:"+ Movie) + 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 + } activity?.onBackPressedDispatcher?.addCallback(this.viewLifecycleOwner, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { @@ -46,6 +67,11 @@ class MovieDetailFragment : Fragment(R.layout.fragment_movie_preview) { transaction.commit() } }) + + + + + } companion object { 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..eaa24db 100644 --- a/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/MovieListFragment.kt +++ b/HomeWorkNetwork/app/src/main/java/com/pg/homeworknetwork/MovieListFragment.kt @@ -7,11 +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.* +import kotlin.coroutines.CoroutineContext class MovieListFragment : Fragment(R.layout.fragment_movie_list) { lateinit var recycler: RecyclerView - private val goToDetails = object : MovieItemAdapter.IOnItemClick { + private val goToDetails = object : MovieItemAdapter.IOnItemClick { override fun onItemClick(movie: Movie) { val manager: FragmentManager = parentFragmentManager val transaction: FragmentTransaction = manager.beginTransaction() @@ -31,8 +34,16 @@ class MovieListFragment : Fragment(R.layout.fragment_movie_list) { } } val adapter = (recycler.adapter as MovieItemAdapter) - val movies = //получаем фильмы + /* val movies = //получаем фильмы adapter.submitList(movies) + + */ + CoroutineScope(SupervisorJob() + Dispatchers.Main).launch (Dispatchers.IO) { + val movies: Movies = Api().getMovies() + println("movies:"+ movies) + adapter.submitList(movies.result) + println("adapter:"+ adapter) + } 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..7ca43af 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,63 @@ package com.pg.homeworknetwork +import io.ktor.client.* +import io.ktor.client.features.json.* +import io.ktor.client.features.json.serializer.* +import io.ktor.client.features.logging.* +import io.ktor.client.request.* +/*import kotlinx.coroutines.runBlocking*/ +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.json.Json +//@OptIn(ExperimentalSerializationApi::class) class Api { + private val _base = "api.themoviedb.org" + private val _movies = "3/movie/popular" + private val _movie = "3/movie/" + + + //TODO добавить в предыдущий пример + val kLogger = object : Logger { + override fun log(message: String) { + if (message.contains("api_key=")) { + println("${message.split("=").first()}=BuildConfig.API_KEY") + } else { + println(message) + } + } + } + + private val ktorClient = HttpClient() { + install(JsonFeature) { + serializer = KotlinxSerializer(kotlinx.serialization.json.Json { + prettyPrint = true + isLenient = true + ignoreUnknownKeys = true + }) + } + install(Logging) { + logger = kLogger + level = LogLevel.BODY + } + } + + suspend fun getMovie(movieId: Int): Movie = ktorClient.use { + it.get( + host = _base, + path = _movie + movieId.toString() + ) { + parameter("api_key", BuildConfig.API_KEY) + } + } + + suspend fun getMovies(): Movies = ktorClient.use { + it.get( + host = _base, + path = _movies + ) { + parameter("api_key", BuildConfig.API_KEY) + } + } + + } \ No newline at end of file