diff --git a/UsingRetrofit/app/build.gradle b/UsingRetrofit/app/build.gradle index 3915e0e..2c58518 100644 --- a/UsingRetrofit/app/build.gradle +++ b/UsingRetrofit/app/build.gradle @@ -2,9 +2,12 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { + buildFeatures { + viewBinding true + } + compileSdkVersion compileSdkVer defaultConfig { applicationId "com.developers.usingretrofit" @@ -21,7 +24,7 @@ android { } } buildTypes.each { - it.buildConfigField('String', "TV_KEY", API_KEY) + it.buildConfigField('String', "TV_KEY", "\"API_KEY\"") } } @@ -38,7 +41,7 @@ dependencies { implementation "com.squareup.retrofit2:converter-gson:$retrofitConverterGsonVer" implementation "androidx.recyclerview:recyclerview:$supportVer" - implementation "androidx.cardview:cardview:$supportVer" + implementation "androidx.cardview:cardview:1.0.0" implementation "com.squareup.picasso:picasso:$picassoVersion" } diff --git a/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/ApiInterface.kt b/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/ApiInterface.kt index 4a8c355..dfc9ac3 100644 --- a/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/ApiInterface.kt +++ b/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/ApiInterface.kt @@ -1,7 +1,7 @@ package com.developers.usingretrofit import com.developers.usingretrofit.model.MovieResult -import com.developers.usingretrofit.utils.Constants +import com.developers.usingretrofit.utils.BASE_URL import retrofit2.Call import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory @@ -22,9 +22,9 @@ interface ApiInterface { fun create(): ApiInterface { val retrofit = Retrofit.Builder() - .addConverterFactory(GsonConverterFactory.create()) - .baseUrl(Constants.BASE_URL) - .build() + .addConverterFactory(GsonConverterFactory.create()) + .baseUrl(BASE_URL) + .build() return retrofit.create(ApiInterface::class.java); diff --git a/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/MainActivity.kt b/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/MainActivity.kt index d24d316..48a8783 100644 --- a/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/MainActivity.kt +++ b/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/MainActivity.kt @@ -1,25 +1,31 @@ package com.developers.usingretrofit -import android.content.Context import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Toast import androidx.recyclerview.widget.GridLayoutManager +import com.developers.usingretrofit.BuildConfig.TV_KEY import com.developers.usingretrofit.adapter.MovieAdapter +import com.developers.usingretrofit.databinding.ActivityMainBinding import com.developers.usingretrofit.model.MovieResult -import kotlinx.android.synthetic.main.activity_main.* +import com.developers.usingretrofit.utils.lazyUI +import com.developers.usingretrofit.utils.showMessage +import com.developers.usingretrofit.utils.viewBinding import retrofit2.Call import retrofit2.Callback import retrofit2.Response class MainActivity : AppCompatActivity() { + private val binding by viewBinding(ActivityMainBinding::inflate) + + private val apiCall by lazyUI(ApiInterface::create) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - val apiCall = ApiInterface.create() - apiCall.getMovies(BuildConfig.TV_KEY, 1).enqueue(object : Callback { + + apiCall.getMovies(TV_KEY, 1).enqueue(object : Callback { override fun onFailure(call: Call?, t: Throwable?) { showError(t?.message) } @@ -36,11 +42,6 @@ class MainActivity : AppCompatActivity() { }) } - private fun showError(message: String?) { - toast(message.toString()) - } - - fun Context.toast(msg: String) { - Toast.makeText(applicationContext, msg, Toast.LENGTH_SHORT).show() - } + private fun showError(message: String?) = + showMessage(message.toString()) } diff --git a/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/adapter/MovieAdapter.kt b/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/adapter/MovieAdapter.kt index 3c516e6..8ceedbb 100644 --- a/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/adapter/MovieAdapter.kt +++ b/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/adapter/MovieAdapter.kt @@ -7,51 +7,56 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.developers.usingretrofit.R +import com.developers.usingretrofit.databinding.ListRowBinding import com.developers.usingretrofit.model.Result -import com.developers.usingretrofit.utils.Constants +import com.developers.usingretrofit.utils.BASE_URL +import com.developers.usingretrofit.utils.viewBinding import com.squareup.picasso.Callback import com.squareup.picasso.Picasso -import kotlinx.android.synthetic.main.list_row.view.* /** * Created by Amanjeet Singh on 30/11/17. */ -class MovieAdapter(val context: Context, private val resultList: List?) : RecyclerView.Adapter() { +class MovieAdapter(val context: Context, private val resultList: List?) : + RecyclerView.Adapter() { - override fun onBindViewHolder(holder: MyViewHolder, position: Int) { + override fun onBindViewHolder(holder: MyViewHolder, position: Int) = holder.bindItems(resultList?.get(position)) - } - override fun getItemCount(): Int { - return resultList?.size!! - } + override fun getItemCount(): Int = + resultList?.size ?: 0 - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { - val view = LayoutInflater.from(context).inflate(R.layout.list_row, parent, false) - return MyViewHolder(view) - } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder = + MyViewHolder(LayoutInflater.from(context).inflate(R.layout.list_row, parent, false)) class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val binding by viewBinding(ListRowBinding::bind) + fun bindItems(result: Result?) { - itemView.movie_title.text = result?.title - val posterUri = Uri.parse(Constants.IMAGE_BASE_URL).buildUpon() - .appendEncodedPath(result?.posterPath) - .build() - itemView.progress_bar.visibility = View.VISIBLE - Picasso.with(itemView.context).load(posterUri.toString()) - .into(itemView.image_view_movie, object : Callback { - - override fun onError() { - //Show Error here - } - - override fun onSuccess() { - itemView.progress_bar.visibility = View.GONE - } - - }) + result?.let { + binding.apply { + movieTitle.text = it.title + binding.progressBar.visibility = View.VISIBLE + + val posterUri = Uri.parse(BASE_URL).buildUpon() + .appendEncodedPath(it.posterPath) + .build() + + Picasso.with(itemView.context).load(posterUri.toString()) + .into(imageViewMovie, object : Callback { + + override fun onError() { + //Show Error here + } + + override fun onSuccess() { + progressBar.visibility = View.GONE + } + }) + } + } } } } \ No newline at end of file diff --git a/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/utils/Constants.kt b/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/utils/Constants.kt index 2b8a7a8..d367c6f 100644 --- a/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/utils/Constants.kt +++ b/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/utils/Constants.kt @@ -3,13 +3,6 @@ package com.developers.usingretrofit.utils /** * Created by Amanjeet Singh on 29/11/17. */ -class Constants { - companion object { - @JvmField - val BASE_URL = "https://api.themoviedb.org/3/movie/"; - @JvmField - val IMAGE_BASE_URL = "http://image.tmdb.org/t/p/w185/" - } - -} \ No newline at end of file +const val BASE_URL = "https://api.themoviedb.org/3/movie/" +const val IMAGE_BASE_URL = "http://image.tmdb.org/t/p/w185/" \ No newline at end of file diff --git a/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/utils/Lazy.kt b/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/utils/Lazy.kt new file mode 100644 index 0000000..f37707b --- /dev/null +++ b/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/utils/Lazy.kt @@ -0,0 +1,4 @@ +package com.developers.usingretrofit.utils + +fun lazyUI(initializer: () -> T): Lazy = + lazy(LazyThreadSafetyMode.NONE) { initializer.invoke() } \ No newline at end of file diff --git a/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/utils/ViewBinding.kt b/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/utils/ViewBinding.kt new file mode 100644 index 0000000..93da1c3 --- /dev/null +++ b/UsingRetrofit/app/src/main/java/com/developers/usingretrofit/utils/ViewBinding.kt @@ -0,0 +1,21 @@ +package com.developers.usingretrofit.utils + +import android.view.LayoutInflater +import android.view.View +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.RecyclerView +import androidx.viewbinding.ViewBinding + +inline fun AppCompatActivity.viewBinding( + crossinline bindingInflater: (LayoutInflater) -> T +) = + lazyUI { + bindingInflater(layoutInflater) + } + +inline fun RecyclerView.ViewHolder.viewBinding( + crossinline bindingBinder: (View) -> T +) = + lazyUI { + bindingBinder(itemView) + } diff --git a/UsingRetrofit/build.gradle b/UsingRetrofit/build.gradle index 00999d1..b030fa4 100644 --- a/UsingRetrofit/build.gradle +++ b/UsingRetrofit/build.gradle @@ -1,11 +1,11 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - apply from: '../dependencies.gradle' + apply from: rootProject.projectDir.absolutePath + '/dependencies.gradle' repositories { google() - jcenter() + mavenCentral() } dependencies { classpath "com.android.tools.build:gradle:$androidPluginVer" @@ -19,12 +19,12 @@ buildscript { allprojects { repositories { google() - jcenter() + mavenCentral() } } subprojects { - apply from: '../../dependencies.gradle' + apply from: rootProject.projectDir.absolutePath + '/dependencies.gradle' } task clean(type: Delete) { diff --git a/UsingRetrofit/dependencies.gradle b/UsingRetrofit/dependencies.gradle new file mode 100644 index 0000000..fac206e --- /dev/null +++ b/UsingRetrofit/dependencies.gradle @@ -0,0 +1,52 @@ +ext{ + +kotlin_version = "1.5.20" +constraintLayoutVersion = "2.0.4" +compileSdkVer = 30 +targetSdkVer = 30 +androidPluginVer = "4.2.0" +buildToolsVer = "1.3.0" +minSdkVer = 19 +supportVer = "1.2.1" +coreKtxVersion = "1.1.0" +designVersion= "1.0.0" + +//Test dependencies +junitVer = "4.13.1" +androidTestRunnerVer = "1.4.0" +espressoCoreVersion = "3.4.0" + +//Rx +rxJavaAndroidVersion = "2.1.0" +rxJavaVersion = "2.2.2" +rxJavaRetrofitAdapterVer = "2.3.0" +rxBindingVer = "2.1.1" +rxAdapterRetrofitVer = "2.3.0" + +apolloPluginVersion = "0.3.2" +ankoVersion = "0.10.5" +gmsPlayVersionMaps = "17.0.0" +retrofitVersion = "2.6.0" +retrofitConverterGsonVer = "2.6.0" +roomVersion = "1.1.1" +kotlinCoroutinesAdapterVer = "0.9.2" +coroutinesCoreVer = "1.3.1" +coroutinesAndroidVer = "1.3.1" +dataBindingVer = "3.3.1" +jacksonKotlinModuleVer = "2.9.0" +picassoVersion = "2.5.2" +retrofitJacksonConverter = "2.3.0" +kodeInVersion = "4.1.0" +koinVersion = "0.8.2" +kotlinTestVersion = "2.0.7" +googlePlayServicesVer = "18.0.0" +moshiVersion = "1.5.0" +moshiRetrofitConverterVer = "2.0.0" +daggerVersion = "2.9" +realmVersion = "4.3.0" +timberVersion = "4.7.1" +firebaseJobDispatcherVer = "0.7.0" +sugarVersion = "1.5" +archComponentsVersion = "1.1.1" +pagingLibraryVersion = "1.0.1" +}