From 3dcd2719805780fb4413da43629cf51ad00102fd Mon Sep 17 00:00:00 2001 From: Paul Hawke Date: Mon, 25 Oct 2021 15:08:55 -0500 Subject: [PATCH] Swapped over to the ViewBinding version of adapterdelegates4 (#4687) --- app/build.gradle | 2 +- .../commons/nearby/PlaceAdapterDelegate.kt | 69 +++++++++++-------- .../NotificationAdapterDelegates.kt | 16 ++--- .../UploadCategoryAdapterDelegates.kt | 17 ++--- .../depicts/UploadDepictsAdapterDelegates.kt | 24 ++++--- app/src/main/res/layout/item_place.xml | 2 +- 6 files changed, 72 insertions(+), 58 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a97b32ee0..14af120a9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -48,7 +48,7 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' kapt "com.jakewharton:butterknife-compiler:$BUTTERKNIFE_VERSION" - implementation "com.hannesdorfmann:adapterdelegates4-kotlin-dsl-layoutcontainer:$ADAPTER_DELEGATES_VERSION" + implementation "com.hannesdorfmann:adapterdelegates4-kotlin-dsl-viewbinding:$ADAPTER_DELEGATES_VERSION" implementation "com.hannesdorfmann:adapterdelegates4-pagination:$ADAPTER_DELEGATES_VERSION" implementation "androidx.paging:paging-runtime-ktx:$PAGING_VERSION" testImplementation "androidx.paging:paging-common-ktx:$PAGING_VERSION" diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/PlaceAdapterDelegate.kt b/app/src/main/java/fr/free/nrw/commons/nearby/PlaceAdapterDelegate.kt index 632eadd47..63873de58 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/PlaceAdapterDelegate.kt +++ b/app/src/main/java/fr/free/nrw/commons/nearby/PlaceAdapterDelegate.kt @@ -5,12 +5,11 @@ import android.view.View.* import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.transition.TransitionManager -import com.hannesdorfmann.adapterdelegates4.dsl.AdapterDelegateLayoutContainerViewHolder -import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateLayoutContainer +import com.hannesdorfmann.adapterdelegates4.dsl.AdapterDelegateViewBindingViewHolder +import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import fr.free.nrw.commons.R import fr.free.nrw.commons.bookmarks.locations.BookmarkLocationsDao -import kotlinx.android.synthetic.main.item_place.* -import kotlinx.android.synthetic.main.nearby_row_button.* +import fr.free.nrw.commons.databinding.ItemPlaceBinding fun placeAdapterDelegate( @@ -21,29 +20,33 @@ fun placeAdapterDelegate( onBookmarkClicked: (Place, Boolean) -> Unit, onOverflowIconClicked: (Place, View) -> Unit, onDirectionsClicked: (Place) -> Unit -) = - adapterDelegateLayoutContainer(R.layout.item_place) { - containerView.setOnClickListener { _: View? -> +) = adapterDelegateViewBinding({ layoutInflater, parent -> + ItemPlaceBinding.inflate(layoutInflater, parent, false) +}) { + with(binding) { + root.setOnClickListener { _: View? -> showOrHideAndScrollToIfLast() onItemClick?.invoke(item) } - containerView.setOnFocusChangeListener { view1: View?, hasFocus: Boolean -> - if (!hasFocus && buttonLayout.isShown) { - buttonLayout.visibility = GONE - } else if (hasFocus && !buttonLayout.isShown) { + root.setOnFocusChangeListener { view1: View?, hasFocus: Boolean -> + if (!hasFocus && nearbyButtonLayout.buttonLayout.isShown) { + nearbyButtonLayout.buttonLayout.visibility = GONE + } else if (hasFocus && !nearbyButtonLayout.buttonLayout.isShown) { showOrHideAndScrollToIfLast() onItemClick?.invoke(item) } } - cameraButton.setOnClickListener { onCameraClicked(item) } - galleryButton.setOnClickListener { onGalleryClicked(item) } + nearbyButtonLayout.cameraButton.setOnClickListener { onCameraClicked(item) } + nearbyButtonLayout.galleryButton.setOnClickListener { onGalleryClicked(item) } bookmarkButtonImage.setOnClickListener { val isBookmarked = bookmarkLocationDao.updateBookmarkLocation(item) - bookmarkButtonImage.setImageResource(if (isBookmarked) R.drawable.ic_round_star_filled_24px else R.drawable.ic_round_star_border_24px) + bookmarkButtonImage.setImageResource( + if (isBookmarked) R.drawable.ic_round_star_filled_24px else R.drawable.ic_round_star_border_24px + ) onBookmarkClicked(item, isBookmarked) } - iconOverflow.setOnClickListener { onOverflowIconClicked(item, it) } - directionsButton.setOnClickListener { onDirectionsClicked(item) } + nearbyButtonLayout.iconOverflow.setOnClickListener { onOverflowIconClicked(item, it) } + nearbyButtonLayout.directionsButton.setOnClickListener { onDirectionsClicked(item) } bind { tvName.text = item.name val descriptionText: String = item.longDescription @@ -52,11 +55,13 @@ fun placeAdapterDelegate( tvDesc.visibility = INVISIBLE } else { // Remove the label and display only texts inside pharentheses (description) since too long - tvDesc.text = descriptionText.substringAfter(tvName.text.toString() + " (").substringBeforeLast(")"); + tvDesc.text = + descriptionText.substringAfter(tvName.text.toString() + " (") + .substringBeforeLast(")"); } distance.text = item.distance icon.setImageResource(item.label.icon) - iconOverflow.visibility = + nearbyButtonLayout.iconOverflow.visibility = if (item.hasCommonsLink() || item.hasWikidataLink()) VISIBLE else GONE @@ -68,18 +73,24 @@ fun placeAdapterDelegate( ) } } +} -private fun AdapterDelegateLayoutContainerViewHolder.showOrHideAndScrollToIfLast() { - TransitionManager.beginDelayedTransition(buttonLayout) - if (buttonLayout.isShown) { - buttonLayout.visibility = GONE - } else { - buttonLayout.visibility = VISIBLE - val recyclerView = containerView.parent as RecyclerView - val lastPosition = recyclerView.adapter!!.itemCount - 1 - if (recyclerView.getChildLayoutPosition(containerView) == lastPosition) { - (recyclerView.layoutManager as LinearLayoutManager?) - ?.scrollToPositionWithOffset(lastPosition, buttonLayout.height) +private fun AdapterDelegateViewBindingViewHolder.showOrHideAndScrollToIfLast() { + with(binding) { + TransitionManager.beginDelayedTransition(nearbyButtonLayout.buttonLayout) + if (nearbyButtonLayout.buttonLayout.isShown) { + nearbyButtonLayout.buttonLayout.visibility = GONE + } else { + nearbyButtonLayout.buttonLayout.visibility = VISIBLE + val recyclerView = root.parent as RecyclerView + val lastPosition = recyclerView.adapter!!.itemCount - 1 + if (recyclerView.getChildLayoutPosition(root) == lastPosition) { + (recyclerView.layoutManager as LinearLayoutManager?) + ?.scrollToPositionWithOffset( + lastPosition, + nearbyButtonLayout.buttonLayout.height + ) + } } } } diff --git a/app/src/main/java/fr/free/nrw/commons/notification/NotificationAdapterDelegates.kt b/app/src/main/java/fr/free/nrw/commons/notification/NotificationAdapterDelegates.kt index 3b4b682b0..01d12ae3e 100644 --- a/app/src/main/java/fr/free/nrw/commons/notification/NotificationAdapterDelegates.kt +++ b/app/src/main/java/fr/free/nrw/commons/notification/NotificationAdapterDelegates.kt @@ -1,18 +1,18 @@ package fr.free.nrw.commons.notification -import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateLayoutContainer -import fr.free.nrw.commons.R -import kotlinx.android.synthetic.main.activity_login.title -import kotlinx.android.synthetic.main.item_notification.* +import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding +import fr.free.nrw.commons.databinding.ItemNotificationBinding import org.wikipedia.util.StringUtil fun notificationDelegate(onNotificationClicked: (Notification) -> Unit) = - adapterDelegateLayoutContainer(R.layout.item_notification) { - containerView.setOnClickListener { onNotificationClicked(item) } + adapterDelegateViewBinding({ layoutInflater, parent -> + ItemNotificationBinding.inflate(layoutInflater, parent, false) + }) { + binding.root.setOnClickListener { onNotificationClicked(item) } bind { - title.text = item.processedNotificationText - time.text = item.date + binding.title.text = item.processedNotificationText + binding.time.text = item.date } } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoryAdapterDelegates.kt b/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoryAdapterDelegates.kt index 238b5b9de..dbe645a75 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoryAdapterDelegates.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoryAdapterDelegates.kt @@ -1,19 +1,20 @@ package fr.free.nrw.commons.upload.categories -import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateLayoutContainer -import fr.free.nrw.commons.R +import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import fr.free.nrw.commons.category.CategoryItem -import kotlinx.android.synthetic.main.layout_upload_categories_item.* +import fr.free.nrw.commons.databinding.LayoutUploadCategoriesItemBinding fun uploadCategoryDelegate(onCategoryClicked: (CategoryItem) -> Unit) = - adapterDelegateLayoutContainer(R.layout.layout_upload_categories_item) { - containerView.setOnClickListener { + adapterDelegateViewBinding({ layoutInflater, root -> + LayoutUploadCategoriesItemBinding.inflate(layoutInflater, root, false) + }) { + binding.root.setOnClickListener { item.isSelected = !item.isSelected - uploadCategoryCheckbox.isChecked = item.isSelected + binding.uploadCategoryCheckbox.isChecked = item.isSelected onCategoryClicked(item) } bind { - uploadCategoryCheckbox.isChecked = item.isSelected - uploadCategoryCheckbox.text = item.name + binding.uploadCategoryCheckbox.isChecked = item.isSelected + binding.uploadCategoryCheckbox.text = item.name } } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/depicts/UploadDepictsAdapterDelegates.kt b/app/src/main/java/fr/free/nrw/commons/upload/depicts/UploadDepictsAdapterDelegates.kt index c73953f53..8eec9e4ce 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/depicts/UploadDepictsAdapterDelegates.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/depicts/UploadDepictsAdapterDelegates.kt @@ -3,30 +3,32 @@ package fr.free.nrw.commons.upload.depicts import android.net.Uri import android.text.TextUtils import android.view.View -import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateLayoutContainer +import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import fr.free.nrw.commons.R +import fr.free.nrw.commons.databinding.LayoutUploadDepictsItemBinding import fr.free.nrw.commons.upload.structure.depictions.DepictedItem -import kotlinx.android.synthetic.main.layout_upload_depicts_item.* fun uploadDepictsDelegate(onDepictClicked: (DepictedItem) -> Unit) = - adapterDelegateLayoutContainer(R.layout.layout_upload_depicts_item) { + adapterDelegateViewBinding({ layoutInflater, parent -> + LayoutUploadDepictsItemBinding.inflate(layoutInflater, parent, false) + }) { val onClickListener = { _: View? -> item.isSelected = !item.isSelected - depict_checkbox.isChecked = item.isSelected + binding.depictCheckbox.isChecked = item.isSelected onDepictClicked(item) } - containerView.setOnClickListener(onClickListener) - depict_checkbox.setOnClickListener(onClickListener) + binding.root.setOnClickListener(onClickListener) + binding.depictCheckbox.setOnClickListener(onClickListener) bind { - depict_checkbox.isChecked = item.isSelected - depicts_label.text = item.name - description.text = item.description + binding.depictCheckbox.isChecked = item.isSelected + binding.depictsLabel.text = item.name + binding.description.text = item.description val imageUrl = item.imageUrl if (TextUtils.isEmpty(imageUrl)) { - depicted_image.setActualImageResource(R.drawable.ic_wikidata_logo_24dp) + binding.depictedImage.setActualImageResource(R.drawable.ic_wikidata_logo_24dp) } else { - depicted_image.setImageURI(Uri.parse(imageUrl)) + binding.depictedImage.setImageURI(Uri.parse(imageUrl)) } } } diff --git a/app/src/main/res/layout/item_place.xml b/app/src/main/res/layout/item_place.xml index f39bb05dd..82e431063 100644 --- a/app/src/main/res/layout/item_place.xml +++ b/app/src/main/res/layout/item_place.xml @@ -82,5 +82,5 @@ android:textAppearance="@style/TextAppearance.AppCompat.Body1" /> - + \ No newline at end of file