Skip to content

Commit a7ba642

Browse files
committed
1) viewBinding support added
2) Removed deprecated 'kotlin-android-extensions' plugin 3) Targeting to SDK version 32 4) Source / Target compatibility is set to Java 11 5) Now supporting viewBinding, Did code cleaning.
1 parent b2a98e5 commit a7ba642

File tree

15 files changed

+176
-122
lines changed

15 files changed

+176
-122
lines changed

app/build.gradle

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
apply plugin: 'com.android.application'
22
apply plugin: 'kotlin-android'
3-
apply plugin: 'kotlin-android-extensions'
43
apply plugin: 'kotlin-kapt'
54
apply plugin: 'dagger.hilt.android.plugin'
65

@@ -34,11 +33,15 @@ android {
3433
}
3534

3635
compileOptions {
37-
sourceCompatibility JavaVersion.VERSION_1_8
38-
targetCompatibility JavaVersion.VERSION_1_8
36+
sourceCompatibility JavaVersion.VERSION_11
37+
targetCompatibility JavaVersion.VERSION_11
3938
}
4039
kotlinOptions {
41-
jvmTarget = '1.8'
40+
jvmTarget = "11"
41+
}
42+
43+
buildFeatures {
44+
viewBinding true
4245
}
4346
}
4447

@@ -61,11 +64,11 @@ dependencies {
6164
//KTX
6265
implementation 'androidx.core:core-ktx:1.7.0'
6366
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
64-
implementation 'androidx.fragment:fragment-ktx:1.4.0'
67+
implementation 'androidx.fragment:fragment-ktx:1.4.1'
6568
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
66-
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.0'
67-
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2"
68-
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2"
69+
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.1'
70+
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0"
71+
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0"
6972

7073
// Room
7174
implementation "androidx.room:room-runtime:$roomVersion"
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.kotlin.mvvm.base
2+
3+
import android.os.Bundle
4+
import androidx.annotation.CallSuper
5+
import androidx.appcompat.app.AppCompatActivity
6+
import androidx.viewbinding.ViewBinding
7+
8+
abstract class BaseActivity<V : ViewBinding> : AppCompatActivity() {
9+
protected lateinit var binding: V
10+
11+
@CallSuper
12+
override fun onCreate(savedInstanceState: Bundle?) {
13+
super.onCreate(savedInstanceState)
14+
15+
val binding = createBinding()
16+
this.binding = binding
17+
setContentView(binding.root)
18+
}
19+
20+
abstract fun createBinding(): V
21+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.kotlin.mvvm.base
2+
3+
import android.os.Bundle
4+
import android.view.LayoutInflater
5+
import android.view.View
6+
import android.view.ViewGroup
7+
import androidx.annotation.CallSuper
8+
import androidx.fragment.app.Fragment
9+
import androidx.viewbinding.ViewBinding
10+
11+
abstract class BaseFragment<V : ViewBinding> : Fragment() {
12+
protected var binding: V? = null
13+
14+
override fun onCreateView(
15+
inflater: LayoutInflater,
16+
container: ViewGroup?,
17+
savedInstanceState: Bundle?
18+
): View? {
19+
val binding = onCreateBinding(inflater, container, savedInstanceState)
20+
this.binding = binding
21+
return binding.root
22+
}
23+
24+
@CallSuper
25+
override fun onDestroyView() {
26+
super.onDestroyView()
27+
binding = null
28+
}
29+
30+
abstract fun onCreateBinding(
31+
inflater: LayoutInflater,
32+
container: ViewGroup?,
33+
savedInstanceState: Bundle?
34+
): V
35+
}

app/src/main/java/com/kotlin/mvvm/repository/api/network/NetworkAndDBBoundResource.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ constructor(private val appExecutors: AppExecutors) {
4040
shouldFetch(data) -> fetchFromNetwork(dbSource)
4141
else -> {
4242
result.addSource(dbSource) { newData ->
43-
setValue(Resource.success(newData,result.value?.retrofitAPICode ?: 0))
43+
setValue(Resource.success(newData, result.value?.retrofitAPICode ?: 0))
4444
}
4545
}
4646
}

app/src/main/java/com/kotlin/mvvm/repository/db/AppDatabase.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@ import com.kotlin.mvvm.repository.model.news.News
1818
@Database(entities = [News::class, Country::class], version = 3, exportSchema = false)
1919
abstract class AppDatabase : RoomDatabase() {
2020

21-
/**
22-
* Get DAO's
23-
*/
2421
abstract fun newsArticlesDao(): NewsDao
2522

2623
abstract fun countriesDao(): CountriesDao

app/src/main/java/com/kotlin/mvvm/ui/DaggerActivity.kt

Lines changed: 0 additions & 10 deletions
This file was deleted.

app/src/main/java/com/kotlin/mvvm/ui/countries/CountriesActivity.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package com.kotlin.mvvm.ui.countries
22

3-
import android.content.SharedPreferences
43
import android.os.Bundle
54
import com.kotlin.mvvm.R
6-
import com.kotlin.mvvm.ui.BaseActivity
7-
import com.kotlin.mvvm.utils.extensions.toast
5+
import com.kotlin.mvvm.base.BaseActivity
6+
import com.kotlin.mvvm.databinding.ActivityCountiresBinding
87
import dagger.hilt.android.AndroidEntryPoint
98
import javax.inject.Inject
109

@@ -13,17 +12,22 @@ import javax.inject.Inject
1312
*/
1413

1514
@AndroidEntryPoint
16-
class CountriesActivity : BaseActivity() {
15+
class CountriesActivity : BaseActivity<ActivityCountiresBinding>() {
1716

1817
//Note: You can get SharedPreferences instance by injecting it
1918
/*@Inject
2019
lateinit var sharedPreferences: SharedPreferences*/
2120

21+
/**
22+
* Create Binding
23+
*/
24+
override fun createBinding(): ActivityCountiresBinding =
25+
ActivityCountiresBinding.inflate(layoutInflater)
26+
2227
/**
2328
*/
2429
override fun onCreate(savedInstanceState: Bundle?) {
2530
super.onCreate(savedInstanceState)
26-
setContentView(R.layout.activity_countires)
2731

2832
if (savedInstanceState == null) {
2933
supportFragmentManager

app/src/main/java/com/kotlin/mvvm/ui/countries/CountriesAdapter.kt

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,15 @@ package com.kotlin.mvvm.ui.countries
22

33
import android.net.Uri
44
import android.view.LayoutInflater
5-
import android.view.View
65
import android.view.ViewGroup
7-
import android.widget.ImageView
8-
import android.widget.TextView
96
import androidx.recyclerview.widget.RecyclerView
107
import com.bumptech.glide.Glide
118
import com.bumptech.glide.load.engine.DiskCacheStrategy
129
import com.bumptech.glide.request.RequestOptions
1310
import com.kotlin.mvvm.R
11+
import com.kotlin.mvvm.databinding.RowCountryListBinding
1412
import com.kotlin.mvvm.repository.model.countries.Country
15-
import kotlinx.android.synthetic.main.row_country_list.view.*
13+
import com.kotlin.mvvm.utils.load
1614

1715
class CountriesAdapter(private val countries: List<Country>) :
1816
RecyclerView.Adapter<CountriesAdapter.ViewHolder>() {
@@ -23,10 +21,11 @@ class CountriesAdapter(private val countries: List<Country>) :
2321
/**
2422
*
2523
*/
26-
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
27-
LayoutInflater.from(parent.context)
28-
.inflate(R.layout.row_country_list, parent, false)
29-
)
24+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
25+
val itemBinding =
26+
RowCountryListBinding.inflate(LayoutInflater.from(parent.context), parent, false)
27+
return ViewHolder(itemBinding)
28+
}
3029

3130
/**
3231
*
@@ -44,33 +43,25 @@ class CountriesAdapter(private val countries: List<Country>) :
4443
/**
4544
*
4645
*/
47-
inner class ViewHolder(private val mView: View) : RecyclerView.ViewHolder(mView) {
48-
private val imageViewCountry: ImageView = mView.iv_country_image
49-
private val textViewCountryName: TextView = mView.tv_country_name
46+
inner class ViewHolder(private val itemBinding: RowCountryListBinding) :
47+
RecyclerView.ViewHolder(itemBinding.root) {
5048

5149
init {
52-
mView.setOnClickListener {
50+
itemBinding.root.setOnClickListener {
5351
onCountryClicked?.invoke(countries[adapterPosition])
5452
}
5553
}
5654

5755
override fun toString(): String {
58-
return super.toString() + " '" + textViewCountryName.text + "'"
56+
return super.toString() + " '" + itemBinding.tvCountryName.text + "'"
5957
}
6058

6159
fun bindView(country: Country) {
62-
textViewCountryName.text = country.displayName
63-
64-
Glide.with(mView.context)
65-
.load(Uri.parse(country.countryFagUrl))
66-
.apply(
67-
RequestOptions()
68-
.placeholder(R.drawable.loading_banner_image)
69-
.error(R.drawable.loading_banner_image)
70-
.centerCrop()
71-
.diskCacheStrategy(DiskCacheStrategy.ALL)
72-
)
73-
.into(imageViewCountry)
60+
itemBinding.tvCountryName.text = country.displayName
61+
itemBinding.ivCountryImage.load(
62+
itemBinding.root.context,
63+
Uri.parse(country.countryFagUrl).toString()
64+
)
7465
}
7566
}
7667
}

app/src/main/java/com/kotlin/mvvm/ui/countries/CountriesFragment.kt

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,12 @@ import androidx.recyclerview.widget.LinearLayoutManager
88
import android.view.LayoutInflater
99
import android.view.View
1010
import android.view.ViewGroup
11-
import androidx.fragment.app.Fragment
1211
import androidx.fragment.app.activityViewModels
13-
import androidx.fragment.app.viewModels
14-
import androidx.lifecycle.Observer
15-
import androidx.lifecycle.ViewModelProvider
16-
import com.kotlin.mvvm.R
12+
import com.kotlin.mvvm.base.BaseFragment
13+
import com.kotlin.mvvm.databinding.FragmentCountryListBinding
1714
import com.kotlin.mvvm.repository.model.countries.Country
1815
import com.kotlin.mvvm.ui.news.NewsActivity
19-
import com.kotlin.mvvm.ui.news.NewsViewModel
2016
import dagger.hilt.android.AndroidEntryPoint
21-
import kotlinx.android.synthetic.main.fragment_country_list.view.*
22-
import javax.inject.Inject
2317

2418
/**
2519
* Created by Waheed on 08,November,2019
@@ -31,7 +25,7 @@ import javax.inject.Inject
3125
*/
3226

3327
@AndroidEntryPoint
34-
class CountriesFragment : Fragment() {
28+
class CountriesFragment : BaseFragment<FragmentCountryListBinding>() {
3529
/**
3630
* RegistrationViewModel is used to set the username and password information (attached to
3731
* Activity's lifecycle and shared between different fragments)
@@ -48,8 +42,15 @@ class CountriesFragment : Fragment() {
4842
private var columnCount = 1
4943
private lateinit var countriesAdapter: CountriesAdapter
5044
private var listOfCountries = ArrayList<Country>()
51-
private lateinit var thisView: View
5245

46+
/**
47+
* Create Binding
48+
*/
49+
override fun onCreateBinding(
50+
inflater: LayoutInflater,
51+
container: ViewGroup?,
52+
savedInstanceState: Bundle?
53+
): FragmentCountryListBinding = FragmentCountryListBinding.inflate(inflater, container, false)
5354

5455
/**
5556
*
@@ -80,30 +81,23 @@ class CountriesFragment : Fragment() {
8081
/**
8182
*
8283
*/
83-
override fun onCreateView(
84-
inflater: LayoutInflater,
85-
container: ViewGroup?,
86-
savedInstanceState: Bundle?
87-
): View {
88-
thisView = inflater.inflate(R.layout.fragment_country_list, container, false)
89-
84+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
85+
super.onViewCreated(view, savedInstanceState)
9086
load()
9187
observeCountries()
92-
93-
return thisView
9488
}
9589

9690
/**
9791
*
9892
*/
9993
private fun load() {
100-
thisView.recyclerview_countries.layoutManager =
94+
binding?.recyclerviewCountries?.layoutManager =
10195
if (columnCount <= 1) LinearLayoutManager(context) else GridLayoutManager(
10296
context,
10397
columnCount
10498
)
10599
countriesAdapter = CountriesAdapter(listOfCountries)
106-
thisView.recyclerview_countries.adapter = countriesAdapter
100+
binding?.recyclerviewCountries?.adapter = countriesAdapter
107101

108102
countriesAdapter.onCountryClicked = { country ->
109103
val intent = Intent(context, NewsActivity::class.java)
@@ -117,13 +111,13 @@ class CountriesFragment : Fragment() {
117111
*/
118112
@SuppressLint("NotifyDataSetChanged")
119113
private fun observeCountries() {
120-
countriesViewModel.getCountries().observe(viewLifecycleOwner, {
114+
countriesViewModel.getCountries().observe(viewLifecycleOwner) {
121115
// You'll get list of countries here
122116
it?.let {
123117
listOfCountries.clear()
124118
listOfCountries.addAll(it)
125119
countriesAdapter.notifyDataSetChanged()
126120
}
127-
})
121+
}
128122
}
129123
}

0 commit comments

Comments
 (0)