Skip to content

Commit 1cbce77

Browse files
authored
Migrate from Kotlin synthetics to Jetpack view binding (#5546)
1 parent b18117b commit 1cbce77

File tree

13 files changed

+73
-68
lines changed

13 files changed

+73
-68
lines changed

app/build.gradle

+4-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ apply from: '../gitutils.gradle'
55
apply plugin: 'com.android.application'
66
apply plugin: 'kotlin-android'
77
apply plugin: 'kotlin-kapt'
8-
apply plugin: 'kotlin-android-extensions'
8+
apply plugin: 'kotlin-parcelize'
99
apply from: "$rootDir/jacoco.gradle"
1010

1111
def isRunningOnTravisAndIsNotPRBuild = System.getenv("CI") == "true" && file('../play.p12').exists()
@@ -357,6 +357,9 @@ android {
357357
sourceCompatibility JavaVersion.VERSION_1_8
358358
targetCompatibility JavaVersion.VERSION_1_8
359359
}
360+
kotlinOptions {
361+
jvmTarget = "1.8"
362+
}
360363

361364
buildToolsVersion buildToolsVersion
362365

@@ -397,7 +400,3 @@ if (isRunningOnTravisAndIsNotPRBuild) {
397400
}
398401
}
399402
}
400-
401-
androidExtensions {
402-
experimental = true
403-
}

app/src/main/java/fr/free/nrw/commons/Media.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package fr.free.nrw.commons
22

33
import android.os.Parcelable
44
import fr.free.nrw.commons.location.LatLng
5-
import kotlinx.android.parcel.Parcelize
5+
import kotlinx.parcelize.Parcelize
66
import fr.free.nrw.commons.wikidata.model.page.PageTitle
77
import java.util.*
88

app/src/main/java/fr/free/nrw/commons/category/CategoryItem.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package fr.free.nrw.commons.category
22

33
import android.os.Parcelable
4-
import kotlinx.android.parcel.Parcelize
4+
import kotlinx.parcelize.Parcelize
55

66
@Parcelize
77
data class CategoryItem(val name: String, val description: String?,

app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import fr.free.nrw.commons.upload.UploadMediaDetail
1212
import fr.free.nrw.commons.upload.WikidataPlace
1313
import fr.free.nrw.commons.upload.WikidataPlace.Companion.from
1414
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
15-
import kotlinx.android.parcel.Parcelize
15+
import kotlinx.parcelize.Parcelize
1616
import java.util.*
1717

1818
@Entity(tableName = "contribution")

app/src/main/java/fr/free/nrw/commons/edit/EditActivity.kt

+28-30
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import android.animation.ValueAnimator
66
import android.content.Intent
77
import android.graphics.BitmapFactory
88
import android.graphics.Matrix
9-
import android.graphics.drawable.BitmapDrawable
109
import android.media.ExifInterface
1110
import android.os.Bundle
1211
import android.util.Log
@@ -18,10 +17,7 @@ import androidx.core.graphics.rotationMatrix
1817
import androidx.core.graphics.scaleMatrix
1918
import androidx.core.net.toUri
2019
import androidx.lifecycle.ViewModelProvider
21-
import fr.free.nrw.commons.R
22-
import kotlinx.android.synthetic.main.activity_edit.btn_save
23-
import kotlinx.android.synthetic.main.activity_edit.iv
24-
import kotlinx.android.synthetic.main.activity_edit.rotate_btn
20+
import fr.free.nrw.commons.databinding.ActivityEditBinding
2521
import timber.log.Timber
2622
import java.io.File
2723

@@ -37,10 +33,12 @@ class EditActivity : AppCompatActivity() {
3733
private var imageUri = ""
3834
private lateinit var vm: EditViewModel
3935
private val sourceExifAttributeList = mutableListOf<Pair<String, String?>>()
36+
private lateinit var binding: ActivityEditBinding
4037

4138
override fun onCreate(savedInstanceState: Bundle?) {
4239
super.onCreate(savedInstanceState)
43-
setContentView(R.layout.activity_edit)
40+
binding = ActivityEditBinding.inflate(layoutInflater)
41+
setContentView(binding.root)
4442
supportActionBar?.title = ""
4543
val intent = intent
4644
imageUri = intent.getStringExtra("image") ?: ""
@@ -87,9 +85,9 @@ class EditActivity : AppCompatActivity() {
8785
* for the "Rotate" and "Save" buttons.
8886
*/
8987
private fun init() {
90-
iv.adjustViewBounds = true
91-
iv.scaleType = ImageView.ScaleType.MATRIX
92-
iv.post(Runnable {
88+
binding.iv.adjustViewBounds = true
89+
binding.iv.scaleType = ImageView.ScaleType.MATRIX
90+
binding.iv.post(Runnable {
9391
val options = BitmapFactory.Options()
9492
options.inJustDecodeBounds = true
9593
BitmapFactory.decodeFile(imageUri, options)
@@ -104,26 +102,26 @@ class EditActivity : AppCompatActivity() {
104102
options.inSampleSize = scaleFactor
105103
options.inJustDecodeBounds = false
106104
val scaledBitmap = BitmapFactory.decodeFile(imageUri, options)
107-
iv.setImageBitmap(scaledBitmap)
105+
binding.iv.setImageBitmap(scaledBitmap)
108106
// Update the ImageView with the scaled bitmap
109-
val scale = iv.measuredWidth.toFloat() / scaledBitmap.width.toFloat()
110-
iv.layoutParams.height = (scale * scaledBitmap.height).toInt()
111-
iv.imageMatrix = scaleMatrix(scale, scale)
107+
val scale = binding.iv.measuredWidth.toFloat() / scaledBitmap.width.toFloat()
108+
binding.iv.layoutParams.height = (scale * scaledBitmap.height).toInt()
109+
binding.iv.imageMatrix = scaleMatrix(scale, scale)
112110
} else {
113111

114112
options.inJustDecodeBounds = false
115113
val bitmap = BitmapFactory.decodeFile(imageUri, options)
116-
iv.setImageBitmap(bitmap)
114+
binding.iv.setImageBitmap(bitmap)
117115

118-
val scale = iv.measuredWidth.toFloat() / bitmapWidth.toFloat()
119-
iv.layoutParams.height = (scale * bitmapHeight).toInt()
120-
iv.imageMatrix = scaleMatrix(scale, scale)
116+
val scale = binding.iv.measuredWidth.toFloat() / bitmapWidth.toFloat()
117+
binding.iv.layoutParams.height = (scale * bitmapHeight).toInt()
118+
binding.iv.imageMatrix = scaleMatrix(scale, scale)
121119
}
122120
})
123-
rotate_btn.setOnClickListener {
121+
binding.rotateBtn.setOnClickListener {
124122
animateImageHeight()
125123
}
126-
btn_save.setOnClickListener {
124+
binding.btnSave.setOnClickListener {
127125
getRotatedImage()
128126
}
129127
}
@@ -140,10 +138,10 @@ class EditActivity : AppCompatActivity() {
140138
* further rotation actions.
141139
*/
142140
private fun animateImageHeight() {
143-
val drawableWidth: Float = iv.getDrawable().getIntrinsicWidth().toFloat()
144-
val drawableHeight: Float = iv.getDrawable().getIntrinsicHeight().toFloat()
145-
val viewWidth: Float = iv.getMeasuredWidth().toFloat()
146-
val viewHeight: Float = iv.getMeasuredHeight().toFloat()
141+
val drawableWidth: Float = binding.iv.getDrawable().getIntrinsicWidth().toFloat()
142+
val drawableHeight: Float = binding.iv.getDrawable().getIntrinsicHeight().toFloat()
143+
val viewWidth: Float = binding.iv.getMeasuredWidth().toFloat()
144+
val viewHeight: Float = binding.iv.getMeasuredHeight().toFloat()
147145
val rotation = imageRotation % 360
148146
val newRotation = rotation + 90
149147

@@ -173,12 +171,12 @@ class EditActivity : AppCompatActivity() {
173171

174172
animator.addListener(object : AnimatorListener {
175173
override fun onAnimationStart(animation: Animator) {
176-
rotate_btn.setEnabled(false)
174+
binding.rotateBtn.setEnabled(false)
177175
}
178176

179177
override fun onAnimationEnd(animation: Animator) {
180178
imageRotation = newRotation % 360
181-
rotate_btn.setEnabled(true)
179+
binding.rotateBtn.setEnabled(true)
182180
}
183181

184182
override fun onAnimationCancel(animation: Animator) {
@@ -196,7 +194,7 @@ class EditActivity : AppCompatActivity() {
196194
(complementaryAnimVal * viewHeight + animVal * newViewHeight).toInt()
197195
val animatedScale = complementaryAnimVal * imageScale + animVal * newImageScale
198196
val animatedRotation = complementaryAnimVal * rotation + animVal * newRotation
199-
iv.getLayoutParams().height = animatedHeight
197+
binding.iv.getLayoutParams().height = animatedHeight
200198
val matrix: Matrix = rotationMatrix(
201199
animatedRotation,
202200
drawableWidth / 2,
@@ -209,11 +207,11 @@ class EditActivity : AppCompatActivity() {
209207
drawableHeight / 2
210208
)
211209
matrix.postTranslate(
212-
-(drawableWidth - iv.getMeasuredWidth()) / 2,
213-
-(drawableHeight - iv.getMeasuredHeight()) / 2
210+
-(drawableWidth - binding.iv.getMeasuredWidth()) / 2,
211+
-(drawableHeight - binding.iv.getMeasuredHeight()) / 2
214212
)
215-
iv.setImageMatrix(matrix)
216-
iv.requestLayout()
213+
binding.iv.setImageMatrix(matrix)
214+
binding.iv.requestLayout()
217215
}
218216

219217
animator.start()

app/src/main/java/fr/free/nrw/commons/explore/media/PageableMediaFragment.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ abstract class PageableMediaFragment : BasePagingFragment<Media>(), MediaDetailP
1818
* ViewBinding
1919
*/
2020
private var _binding: FragmentSearchPaginatedBinding? = null
21-
private val binding get() = _binding
21+
private val binding get() = _binding!!
2222

2323
override val pagedListAdapter by lazy {
2424
PagedMediaAdapter(categoryImagesCallback::onMediaClicked)
@@ -43,9 +43,9 @@ abstract class PageableMediaFragment : BasePagingFragment<Media>(), MediaDetailP
4343
inflater: LayoutInflater,
4444
container: ViewGroup?,
4545
savedInstanceState: Bundle?
46-
): View? {
46+
): View {
4747
_binding = FragmentSearchPaginatedBinding.inflate(inflater, container, false)
48-
return binding?.root
48+
return binding.root
4949
}
5050

5151
private val simpleDataObserver =
@@ -66,7 +66,7 @@ abstract class PageableMediaFragment : BasePagingFragment<Media>(), MediaDetailP
6666
pagedListAdapter.currentList?.get(position)?.takeIf { it.filename != null }
6767
.also {
6868
pagedListAdapter.currentList?.loadAround(position)
69-
binding?.paginatedSearchResultsList?.scrollToPosition(position)
69+
binding.paginatedSearchResultsList.scrollToPosition(position)
7070
}
7171

7272
override fun getTotalMediaCount(): Int = pagedListAdapter.itemCount

app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt

+9-7
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import androidx.paging.PagedListAdapter
66
import androidx.recyclerview.widget.DiffUtil
77
import fr.free.nrw.commons.Media
88
import fr.free.nrw.commons.R
9+
import fr.free.nrw.commons.databinding.LayoutCategoryImagesBinding
910
import fr.free.nrw.commons.explore.paging.BaseViewHolder
1011
import fr.free.nrw.commons.explore.paging.inflate
11-
import kotlinx.android.synthetic.main.layout_category_images.*
1212

1313
class PagedMediaAdapter(private val onImageClicked: (Int) -> Unit) :
1414
PagedListAdapter<Media, SearchImagesViewHolder>(object : DiffUtil.ItemCallback<Media>() {
@@ -32,17 +32,19 @@ class PagedMediaAdapter(private val onImageClicked: (Int) -> Unit) :
3232

3333
class SearchImagesViewHolder(containerView: View, val onImageClicked: (Int) -> Unit) :
3434
BaseViewHolder<Pair<Media, Int>>(containerView) {
35+
val binding = LayoutCategoryImagesBinding.bind(itemView)
36+
3537
override fun bind(item: Pair<Media, Int>) {
3638
val media = item.first
37-
categoryImageView.setOnClickListener { onImageClicked(item.second) }
38-
categoryImageTitle.text = media.mostRelevantCaption
39-
categoryImageView.setImageURI(media.thumbUrl)
39+
binding.categoryImageView.setOnClickListener { onImageClicked(item.second) }
40+
binding.categoryImageTitle.text = media.mostRelevantCaption
41+
binding.categoryImageView.setImageURI(media.thumbUrl)
4042
if (media.author?.isNotEmpty() == true) {
41-
categoryImageAuthor.visibility = View.VISIBLE
42-
categoryImageAuthor.text =
43+
binding.categoryImageAuthor.visibility = View.VISIBLE
44+
binding.categoryImageAuthor.text =
4345
containerView.context.getString(R.string.image_uploaded_by, media.user)
4446
} else {
45-
categoryImageAuthor.visibility = View.GONE
47+
binding.categoryImageAuthor.visibility = View.GONE
4648
}
4749
}
4850

app/src/main/java/fr/free/nrw/commons/explore/paging/BasePagingFragment.kt

+18-13
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import android.content.res.Configuration
55
import android.os.Bundle
66
import android.view.LayoutInflater
77
import android.view.View
8-
import android.view.View.*
8+
import android.view.View.GONE
9+
import android.view.View.VISIBLE
910
import android.view.ViewGroup
1011
import androidx.fragment.app.Fragment
1112
import androidx.lifecycle.LiveData
@@ -14,11 +15,9 @@ import androidx.paging.PagedList
1415
import androidx.paging.PagedListAdapter
1516
import androidx.recyclerview.widget.GridLayoutManager
1617
import androidx.recyclerview.widget.MergeAdapter
17-
import fr.free.nrw.commons.R
18+
import fr.free.nrw.commons.databinding.FragmentSearchPaginatedBinding
1819
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment
1920
import fr.free.nrw.commons.utils.ViewUtil
20-
import kotlinx.android.synthetic.main.fragment_search_paginated.*
21-
2221

2322
abstract class BasePagingFragment<T> : CommonsDaggerSupportFragment(),
2423
PagingContract.View<T> {
@@ -30,15 +29,21 @@ abstract class BasePagingFragment<T> : CommonsDaggerSupportFragment(),
3029
private val mergeAdapter by lazy { MergeAdapter(pagedListAdapter, loadingAdapter) }
3130
private var searchResults: LiveData<PagedList<T>>? = null
3231

32+
private var _binding: FragmentSearchPaginatedBinding? = null
33+
private val binding get() = _binding!!
34+
3335
override fun onCreateView(
3436
inflater: LayoutInflater,
3537
container: ViewGroup?,
3638
savedInstanceState: Bundle?
37-
) = inflater.inflate(R.layout.fragment_search_paginated, container, false)
39+
): View {
40+
_binding = FragmentSearchPaginatedBinding.inflate(inflater, container, false)
41+
return binding.root
42+
}
3843

3944
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
4045
super.onViewCreated(view, savedInstanceState)
41-
paginatedSearchResultsList.apply {
46+
binding.paginatedSearchResultsList.apply {
4247
layoutManager = GridLayoutManager(context, if (isPortrait) 1 else 2)
4348
adapter = mergeAdapter
4449
}
@@ -53,7 +58,7 @@ abstract class BasePagingFragment<T> : CommonsDaggerSupportFragment(),
5358
*/
5459
override fun onConfigurationChanged(newConfig: Configuration) {
5560
super.onConfigurationChanged(newConfig)
56-
paginatedSearchResultsList.apply {
61+
binding.paginatedSearchResultsList.apply {
5762
layoutManager = GridLayoutManager(context, if (isPortrait) 1 else 2)
5863
}
5964
}
@@ -77,30 +82,30 @@ abstract class BasePagingFragment<T> : CommonsDaggerSupportFragment(),
7782
}
7883

7984
override fun hideInitialLoadProgress() {
80-
paginatedSearchInitialLoadProgress.visibility = GONE
85+
binding.paginatedSearchInitialLoadProgress.visibility = GONE
8186
}
8287

8388
override fun showInitialLoadInProgress() {
84-
paginatedSearchInitialLoadProgress.visibility = VISIBLE
89+
binding.paginatedSearchInitialLoadProgress.visibility = VISIBLE
8590
}
8691

8792
override fun showSnackbar() {
88-
ViewUtil.showShortSnackbar(paginatedSearchResultsList, errorTextId)
93+
ViewUtil.showShortSnackbar(binding.paginatedSearchResultsList, errorTextId)
8994
}
9095

9196
fun onQueryUpdated(query: String) {
9297
injectedPresenter.onQueryUpdated(query)
9398
}
9499

95100
override fun showEmptyText(query: String) {
96-
contentNotFound.text = getEmptyText(query)
97-
contentNotFound.visibility = VISIBLE
101+
binding.contentNotFound.text = getEmptyText(query)
102+
binding.contentNotFound.visibility = VISIBLE
98103
}
99104

100105
abstract fun getEmptyText(query: String): String
101106

102107
override fun hideEmptyText() {
103-
contentNotFound.visibility = GONE
108+
binding.contentNotFound.visibility = GONE
104109
}
105110
}
106111

app/src/main/java/fr/free/nrw/commons/explore/paging/FooterAdapter.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import androidx.recyclerview.widget.DiffUtil
88
import androidx.recyclerview.widget.ListAdapter
99
import androidx.recyclerview.widget.RecyclerView
1010
import fr.free.nrw.commons.R
11+
import fr.free.nrw.commons.databinding.ListItemLoadMoreBinding
1112
import kotlinx.android.extensions.LayoutContainer
12-
import kotlinx.android.synthetic.main.list_item_load_more.*
1313

1414
class FooterAdapter(private val onRefreshClicked: () -> Unit) :
1515
ListAdapter<FooterItem, FooterViewHolder>(object :
@@ -45,8 +45,10 @@ open class FooterViewHolder(override val containerView: View) :
4545
class LoadingViewHolder(containerView: View) : FooterViewHolder(containerView)
4646
class RefreshViewHolder(containerView: View, onRefreshClicked: () -> Unit) :
4747
FooterViewHolder(containerView) {
48+
val binding = ListItemLoadMoreBinding.bind(itemView)
49+
4850
init {
49-
listItemLoadMoreButton.setOnClickListener { onRefreshClicked() }
51+
binding.listItemLoadMoreButton.setOnClickListener { onRefreshClicked() }
5052
}
5153
}
5254

app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetail.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package fr.free.nrw.commons.upload
22

33
import android.os.Parcelable
44
import fr.free.nrw.commons.nearby.Place
5-
import kotlinx.android.parcel.Parcelize
5+
import kotlinx.parcelize.Parcelize
66

77
/**
88
* Holds a description of an item being uploaded by [UploadActivity]

app/src/main/java/fr/free/nrw/commons/upload/WikidataPlace.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package fr.free.nrw.commons.upload
33
import android.os.Parcelable
44
import fr.free.nrw.commons.location.LatLng
55
import fr.free.nrw.commons.nearby.Place
6-
import kotlinx.android.parcel.Parcelize
6+
import kotlinx.parcelize.Parcelize
77

88
@Parcelize
99
data class WikidataPlace(

0 commit comments

Comments
 (0)