From 8b13e382fdca2e8344b057295741f7f14e9d7a70 Mon Sep 17 00:00:00 2001 From: mcarare Date: Wed, 14 Jul 2021 19:54:35 +0300 Subject: [PATCH] For #17917: Use View binding in lists. --- .../viewholders/ExceptionsHeaderViewHolder.kt | 5 +- .../recenttabs/view/RecentTabViewHolder.kt | 15 ++-- .../view/RecentTabsHeaderViewHolder.kt | 6 +- .../viewholders/CollectionViewHolder.kt | 21 ++--- .../NoCollectionsMessageViewHolder.kt | 27 ++++--- .../PrivateBrowsingDescriptionViewHolder.kt | 7 +- .../viewholders/TopSitePagerViewHolder.kt | 7 +- .../viewholders/TopSiteViewHolder.kt | 5 +- .../ExperimentDefaultBrowserCardViewHolder.kt | 7 +- .../topsites/TopSitesPagerAdapter.kt | 5 +- .../fenix/home/tips/ButtonTipViewHolder.kt | 61 +++++++------- .../view/CreditCardItemViewHolder.kt | 19 +++-- .../logins/view/LoginsListViewHolder.kt | 17 ++-- .../share/listadapters/ShareTabsAdapter.kt | 9 ++- .../viewholders/AccountDeviceViewHolder.kt | 80 ++++++++++--------- .../fenix/share/viewholders/AppViewHolder.kt | 8 +- .../viewholders/AbstractPageViewHolder.kt | 5 +- .../viewholders/SyncedTabsPageViewHolder.kt | 10 ++- 18 files changed, 172 insertions(+), 142 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/exceptions/viewholders/ExceptionsHeaderViewHolder.kt b/app/src/main/java/org/mozilla/fenix/exceptions/viewholders/ExceptionsHeaderViewHolder.kt index 97374247cb..de05538dac 100644 --- a/app/src/main/java/org/mozilla/fenix/exceptions/viewholders/ExceptionsHeaderViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/exceptions/viewholders/ExceptionsHeaderViewHolder.kt @@ -5,9 +5,9 @@ package org.mozilla.fenix.exceptions.viewholders import android.view.View +import android.widget.TextView import androidx.annotation.StringRes import androidx.recyclerview.widget.RecyclerView -import kotlinx.android.synthetic.main.exceptions_description.view.* import org.mozilla.fenix.R class ExceptionsHeaderViewHolder( @@ -16,7 +16,8 @@ class ExceptionsHeaderViewHolder( ) : RecyclerView.ViewHolder(view) { init { - view.exceptions_description.text = view.context.getString(description) + view.findViewById(R.id.exceptions_description).text = + view.context.getString(description) } companion object { diff --git a/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabViewHolder.kt index 200472cd9b..849b4d28c8 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabViewHolder.kt @@ -5,11 +5,11 @@ package org.mozilla.fenix.home.recenttabs.view import android.view.View -import kotlinx.android.synthetic.main.recent_tabs_list_row.* import mozilla.components.browser.icons.BrowserIcons import mozilla.components.browser.state.state.ContentState import mozilla.components.browser.state.state.TabSessionState import org.mozilla.fenix.R +import org.mozilla.fenix.databinding.RecentTabsListRowBinding import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.loadIntoView import org.mozilla.fenix.home.recenttabs.interactor.RecentTabInteractor @@ -23,25 +23,28 @@ import org.mozilla.fenix.utils.view.ViewHolder * in [ContentState.icon]. */ class RecentTabViewHolder( - view: View, + private val view: View, private val interactor: RecentTabInteractor, private val icons: BrowserIcons = view.context.components.core.icons ) : ViewHolder(view) { fun bindTab(tab: TabSessionState): View { // A page may take a while to retrieve a title, so let's show the url until we get one. - recent_tab_title.text = if (tab.content.title.isNotEmpty()) { + + val biding = RecentTabsListRowBinding.bind(view) + + biding.recentTabTitle.text = if (tab.content.title.isNotEmpty()) { tab.content.title } else { tab.content.url } if (tab.content.icon != null) { - recent_tab_icon.setImageBitmap(tab.content.icon) + biding.recentTabIcon.setImageBitmap(tab.content.icon) } else { - icons.loadIntoView(recent_tab_icon, tab.content.url) + icons.loadIntoView(biding.recentTabIcon, tab.content.url) } - recent_tab_icon.setImageBitmap(tab.content.icon) + biding.recentTabIcon.setImageBitmap(tab.content.icon) itemView.setOnClickListener { interactor.onRecentTabClicked(tab.id) diff --git a/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabsHeaderViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabsHeaderViewHolder.kt index 3933e1fd57..844bfbb164 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabsHeaderViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabsHeaderViewHolder.kt @@ -5,8 +5,8 @@ package org.mozilla.fenix.home.recenttabs.view import android.view.View -import kotlinx.android.synthetic.main.recent_tabs_header.* import org.mozilla.fenix.R +import org.mozilla.fenix.databinding.RecentTabsHeaderBinding import org.mozilla.fenix.home.recenttabs.interactor.RecentTabInteractor import org.mozilla.fenix.utils.view.ViewHolder @@ -21,7 +21,9 @@ class RecentTabsHeaderViewHolder( ) : ViewHolder(view) { init { - show_all_button.setOnClickListener { + + val binding = RecentTabsHeaderBinding.bind(view) + binding.showAllButton.setOnClickListener { interactor.onRecentTabShowAllClicked() } } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CollectionViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CollectionViewHolder.kt index 6e8e3ea9c3..ce2df3aac2 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CollectionViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CollectionViewHolder.kt @@ -8,12 +8,12 @@ import android.content.Context import android.view.View import androidx.core.graphics.BlendModeColorFilterCompat.createBlendModeColorFilterCompat import androidx.core.graphics.BlendModeCompat.SRC_IN -import kotlinx.android.synthetic.main.collection_home_list_row.* import mozilla.components.browser.menu.BrowserMenuBuilder import mozilla.components.browser.menu.item.SimpleBrowserMenuItem import mozilla.components.browser.state.selector.normalTabs import mozilla.components.feature.tab.collections.TabCollection import org.mozilla.fenix.R +import org.mozilla.fenix.databinding.CollectionHomeListRowBinding import org.mozilla.fenix.utils.view.ViewHolder import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.getIconColor @@ -32,8 +32,11 @@ class CollectionViewHolder( private lateinit var collection: TabCollection private var expanded = false private var collectionMenu: CollectionItemMenu + private var binding: CollectionHomeListRowBinding init { + binding = CollectionHomeListRowBinding.bind(view) + collectionMenu = CollectionItemMenu( view.context, { view.context.components.core.store.state.normalTabs.isNotEmpty() } @@ -46,14 +49,14 @@ class CollectionViewHolder( } } - collection_overflow_button.setOnClickListener { + binding.collectionOverflowButton.setOnClickListener { interactor.onCollectionMenuOpened() collectionMenu.menuBuilder .build(view.context) .show(anchor = it) } - collection_share_button.setOnClickListener { + binding.collectionShareButton.setOnClickListener { interactor.onCollectionShareTabsClicked(collection) } @@ -70,31 +73,31 @@ class CollectionViewHolder( } private fun updateCollectionUI() { - collection_title.text = collection.title + binding.collectionTitle.text = collection.title itemView.isActivated = expanded if (expanded) { - collection_share_button.apply { + binding.collectionShareButton.apply { showAndEnable() increaseTapArea(buttonIncreaseDps) } - collection_overflow_button.apply { + binding.collectionOverflowButton.apply { showAndEnable() increaseTapArea(buttonIncreaseDps) } } else { - collection_share_button.apply { + binding.collectionShareButton.apply { removeAndDisable() removeTouchDelegate() } - collection_overflow_button.apply { + binding.collectionOverflowButton.apply { removeAndDisable() removeTouchDelegate() } } - collection_icon.colorFilter = createBlendModeColorFilterCompat( + binding.collectionIcon.colorFilter = createBlendModeColorFilterCompat( collection.getIconColor(itemView.context), SRC_IN ) diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolder.kt index ed3c128d05..8311a8949e 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolder.kt @@ -7,7 +7,6 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders import android.view.View import androidx.core.view.isVisible import androidx.lifecycle.LifecycleOwner -import kotlinx.android.synthetic.main.no_collections_message.* import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.map @@ -16,6 +15,7 @@ import mozilla.components.browser.state.store.BrowserStore import mozilla.components.lib.state.ext.flowScoped import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged import org.mozilla.fenix.R +import org.mozilla.fenix.databinding.NoCollectionsMessageBinding import org.mozilla.fenix.ext.increaseTapArea import org.mozilla.fenix.home.sessioncontrol.CollectionInteractor import org.mozilla.fenix.utils.view.ViewHolder @@ -29,25 +29,30 @@ open class NoCollectionsMessageViewHolder( ) : ViewHolder(view) { init { - add_tabs_to_collections_button.setOnClickListener { - interactor.onAddTabsToCollectionTapped() - } + val binding = NoCollectionsMessageBinding.bind(view) - remove_collection_placeholder.increaseTapArea( - view.resources.getDimensionPixelSize(R.dimen.tap_increase_16) - ) + binding.addTabsToCollectionsButton.apply { - remove_collection_placeholder.setOnClickListener { - interactor.onRemoveCollectionsPlaceholder() + setOnClickListener { + interactor.onAddTabsToCollectionTapped() + } + isVisible = store.state.normalTabs.isNotEmpty() } - add_tabs_to_collections_button.isVisible = store.state.normalTabs.isNotEmpty() + binding.removeCollectionPlaceholder.apply { + increaseTapArea( + view.resources.getDimensionPixelSize(R.dimen.tap_increase_16) + ) + setOnClickListener { + interactor.onRemoveCollectionsPlaceholder() + } + } store.flowScoped(viewLifecycleOwner) { flow -> flow.map { state -> state.normalTabs.size } .ifChanged() .collect { tabs -> - add_tabs_to_collections_button.isVisible = tabs > 0 + binding.addTabsToCollectionsButton.isVisible = tabs > 0 } } } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/PrivateBrowsingDescriptionViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/PrivateBrowsingDescriptionViewHolder.kt index dc03292270..45aeb054d3 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/PrivateBrowsingDescriptionViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/PrivateBrowsingDescriptionViewHolder.kt @@ -7,8 +7,8 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders import android.text.method.LinkMovementMethod import android.view.View import androidx.recyclerview.widget.RecyclerView -import kotlinx.android.synthetic.main.private_browsing_description.view.* import org.mozilla.fenix.R +import org.mozilla.fenix.databinding.PrivateBrowsingDescriptionBinding import org.mozilla.fenix.ext.addUnderline import org.mozilla.fenix.home.sessioncontrol.TabSessionInteractor @@ -20,10 +20,11 @@ class PrivateBrowsingDescriptionViewHolder( init { val resources = view.resources val appName = resources.getString(R.string.app_name) - view.private_session_description.text = resources.getString( + val binding = PrivateBrowsingDescriptionBinding.bind(view) + binding.privateSessionDescription.text = resources.getString( R.string.private_browsing_placeholder_description_2, appName ) - with(view.private_session_common_myths) { + with(binding.privateSessionCommonMyths) { movementMethod = LinkMovementMethod.getInstance() addUnderline() setOnClickListener { diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSitePagerViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSitePagerViewHolder.kt index 72e44709e0..89b0692bbf 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSitePagerViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSitePagerViewHolder.kt @@ -8,10 +8,10 @@ import android.view.View import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 -import kotlinx.android.synthetic.main.component_top_sites_pager.view.* import mozilla.components.feature.top.sites.TopSite import org.mozilla.fenix.R import org.mozilla.fenix.components.metrics.Event +import org.mozilla.fenix.databinding.ComponentTopSitesPagerBinding import org.mozilla.fenix.ext.components import org.mozilla.fenix.home.sessioncontrol.AdapterItem import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor @@ -22,8 +22,9 @@ class TopSitePagerViewHolder( interactor: TopSiteInteractor ) : RecyclerView.ViewHolder(view) { + private val binding = ComponentTopSitesPagerBinding.bind(view) private val topSitesPagerAdapter = TopSitesPagerAdapter(interactor) - private val pageIndicator = view.page_indicator + private val pageIndicator = binding.pageIndicator private var currentPage = 0 private val topSitesPageChangeCallback = object : ViewPager2.OnPageChangeCallback() { @@ -42,7 +43,7 @@ class TopSitePagerViewHolder( } init { - view.top_sites_pager.apply { + binding.topSitesPager.apply { adapter = topSitesPagerAdapter registerOnPageChangeCallback(topSitesPageChangeCallback) // Retain one more TopSites pages to ensure a new layout request will measure the first page also. diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSiteViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSiteViewHolder.kt index 8dae733107..6f7a9ba3a8 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSiteViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSiteViewHolder.kt @@ -6,9 +6,9 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders import android.view.View import androidx.recyclerview.widget.RecyclerView -import kotlinx.android.synthetic.main.component_top_sites.view.* import mozilla.components.feature.top.sites.TopSite import org.mozilla.fenix.R +import org.mozilla.fenix.databinding.ComponentTopSitesBinding import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor import org.mozilla.fenix.home.sessioncontrol.viewholders.topsites.TopSitesAdapter import org.mozilla.fenix.utils.AccessibilityGridLayoutManager @@ -19,12 +19,13 @@ class TopSiteViewHolder( ) : RecyclerView.ViewHolder(view) { private val topSitesAdapter = TopSitesAdapter(interactor) + val binding = ComponentTopSitesBinding.bind(view) init { val gridLayoutManager = AccessibilityGridLayoutManager(view.context, SPAN_COUNT) - view.top_sites_list.apply { + binding.topSitesList.apply { adapter = topSitesAdapter layoutManager = gridLayoutManager } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/ExperimentDefaultBrowserCardViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/ExperimentDefaultBrowserCardViewHolder.kt index 27476132e2..a68a6f0233 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/ExperimentDefaultBrowserCardViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/ExperimentDefaultBrowserCardViewHolder.kt @@ -6,8 +6,8 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding import android.view.View import androidx.recyclerview.widget.RecyclerView -import kotlinx.android.synthetic.main.experiment_default_browser.view.* import org.mozilla.fenix.R +import org.mozilla.fenix.databinding.ExperimentDefaultBrowserBinding import org.mozilla.fenix.ext.increaseTapArea import org.mozilla.fenix.home.sessioncontrol.SessionControlInteractor @@ -17,11 +17,12 @@ class ExperimentDefaultBrowserCardViewHolder( ) : RecyclerView.ViewHolder(view) { init { - view.set_default_browser.setOnClickListener { + val binding = ExperimentDefaultBrowserBinding.bind(view) + binding.setDefaultBrowser.setOnClickListener { interactor.onSetDefaultBrowserClicked() } - view.close.apply { + binding.close.apply { increaseTapArea(CLOSE_BUTTON_EXTRA_DPS) setOnClickListener { interactor.onCloseExperimentCardClicked() diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSitesPagerAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSitesPagerAdapter.kt index d1eaa2b726..b13ba54d8c 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSitesPagerAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSitesPagerAdapter.kt @@ -9,7 +9,6 @@ import android.view.ViewGroup import androidx.annotation.VisibleForTesting import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter -import kotlinx.android.synthetic.main.component_top_sites.view.* import mozilla.components.feature.top.sites.TopSite import org.mozilla.fenix.home.sessioncontrol.AdapterItem.TopSitePagerPayload import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor @@ -35,7 +34,7 @@ class TopSitesPagerAdapter( onBindViewHolder(holder, position) } else { if (payloads[0] is TopSitePagerPayload) { - val adapter = holder.itemView.top_sites_list.adapter as TopSitesAdapter + val adapter = holder.binding.topSitesList.adapter as TopSitesAdapter val payload = payloads[0] as TopSitePagerPayload update(payload, position, adapter) @@ -79,7 +78,7 @@ class TopSitesPagerAdapter( } override fun onBindViewHolder(holder: TopSiteViewHolder, position: Int) { - val adapter = holder.itemView.top_sites_list.adapter as TopSitesAdapter + val adapter = holder.binding.topSitesList.adapter as TopSitesAdapter adapter.submitList(getItem(position)) } diff --git a/app/src/main/java/org/mozilla/fenix/home/tips/ButtonTipViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/tips/ButtonTipViewHolder.kt index 9a9bdeb53d..cd4f6cb021 100644 --- a/app/src/main/java/org/mozilla/fenix/home/tips/ButtonTipViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/tips/ButtonTipViewHolder.kt @@ -6,7 +6,6 @@ package org.mozilla.fenix.home.tips import android.view.View import androidx.core.view.isVisible -import kotlinx.android.synthetic.main.button_tip_item.* import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R @@ -14,6 +13,7 @@ import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.components.tips.Tip import org.mozilla.fenix.components.tips.TipType +import org.mozilla.fenix.databinding.ButtonTipItemBinding import org.mozilla.fenix.ext.addUnderline import org.mozilla.fenix.ext.components import org.mozilla.fenix.home.sessioncontrol.SessionControlInteractor @@ -21,7 +21,7 @@ import org.mozilla.fenix.utils.Settings import org.mozilla.fenix.utils.view.ViewHolder class ButtonTipViewHolder( - view: View, + private val view: View, private val interactor: SessionControlInteractor, private val metrics: MetricController = view.context.components.analytics.metrics, private val settings: Settings = view.context.components.settings @@ -30,46 +30,49 @@ class ButtonTipViewHolder( var tip: Tip? = null fun bind(tip: Tip) { + val binding = ButtonTipItemBinding.bind(view) require(tip.type is TipType.Button) this.tip = tip metrics.track(Event.TipDisplayed(tip.identifier)) - tip_header_text.text = tip.title - tip.titleDrawable?.let { - tip_header_text.setCompoundDrawablesWithIntrinsicBounds(it, null, null, null) - } - tip_description_text.text = tip.description - tip_button.text = tip.type.text + with(binding) { + tipHeaderText.text = tip.title + tip.titleDrawable?.let { + tipHeaderText.setCompoundDrawablesWithIntrinsicBounds(it, null, null, null) + } + tipDescriptionText.text = tip.description + tipButton.text = tip.type.text - tip_learn_more.isVisible = tip.learnMoreURL != null - if (tip.learnMoreURL != null) { - tip_learn_more.addUnderline() + tipLearnMore.isVisible = tip.learnMoreURL != null + if (tip.learnMoreURL != null) { + tipLearnMore.addUnderline() - tip_learn_more.setOnClickListener { - (itemView.context as HomeActivity).openToBrowserAndLoad( - searchTermOrURL = tip.learnMoreURL, - newTab = true, - from = BrowserDirection.FromHome - ) + tipLearnMore.setOnClickListener { + (itemView.context as HomeActivity).openToBrowserAndLoad( + searchTermOrURL = tip.learnMoreURL, + newTab = true, + from = BrowserDirection.FromHome + ) + } } - } - tip_button.setOnClickListener { - tip.type.action.invoke() - metrics.track(Event.TipPressed(tip.identifier)) - } + tipButton.setOnClickListener { + tip.type.action.invoke() + metrics.track(Event.TipPressed(tip.identifier)) + } - tip_close.setOnClickListener { - metrics.track(Event.TipClosed(tip.identifier)) + tipClose.setOnClickListener { + metrics.track(Event.TipClosed(tip.identifier)) - settings.preferences - .edit() - .putBoolean(tip.identifier, false) - .apply() + settings.preferences + .edit() + .putBoolean(tip.identifier, false) + .apply() - interactor.onCloseTip(tip) + interactor.onCloseTip(tip) + } } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/creditcards/view/CreditCardItemViewHolder.kt b/app/src/main/java/org/mozilla/fenix/settings/creditcards/view/CreditCardItemViewHolder.kt index 0e733bfb11..56081082fe 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/creditcards/view/CreditCardItemViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/creditcards/view/CreditCardItemViewHolder.kt @@ -5,10 +5,10 @@ package org.mozilla.fenix.settings.creditcards.view import android.view.View -import kotlinx.android.synthetic.main.credit_card_list_item.* import mozilla.components.concept.storage.CreditCard import mozilla.components.support.utils.creditCardIssuerNetwork import org.mozilla.fenix.R +import org.mozilla.fenix.databinding.CreditCardListItemBinding import org.mozilla.fenix.settings.creditcards.interactor.CreditCardsManagementInteractor import org.mozilla.fenix.utils.view.ViewHolder import java.text.SimpleDateFormat @@ -19,16 +19,18 @@ import java.util.Locale * View holder for a credit card list item. */ class CreditCardItemViewHolder( - view: View, + private val view: View, private val interactor: CreditCardsManagementInteractor ) : ViewHolder(view) { fun bind(creditCard: CreditCard) { - credit_card_logo.setImageResource(creditCard.cardType.creditCardIssuerNetwork().icon) + val binding = CreditCardListItemBinding.bind(view) - credit_card_number.text = creditCard.obfuscatedCardNumber + binding.creditCardLogo.setImageResource(creditCard.cardType.creditCardIssuerNetwork().icon) - bindCreditCardExpiryDate(creditCard) + binding.creditCardNumber.text = creditCard.obfuscatedCardNumber + + bindCreditCardExpiryDate(creditCard, binding) itemView.setOnClickListener { interactor.onSelectCreditCard(creditCard) @@ -38,7 +40,10 @@ class CreditCardItemViewHolder( /** * Set the credit card expiry date formatted according to the locale. */ - private fun bindCreditCardExpiryDate(creditCard: CreditCard) { + private fun bindCreditCardExpiryDate( + creditCard: CreditCard, + binding: CreditCardListItemBinding + ) { val dateFormat = SimpleDateFormat(DATE_PATTERN, Locale.getDefault()) val calendar = Calendar.getInstance() @@ -47,7 +52,7 @@ class CreditCardItemViewHolder( calendar.set(Calendar.MONTH, creditCard.expiryMonth.toInt() - 1) calendar.set(Calendar.YEAR, creditCard.expiryYear.toInt()) - expiry_date.text = dateFormat.format(calendar.time) + binding.expiryDate.text = dateFormat.format(calendar.time) } companion object { diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/view/LoginsListViewHolder.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/view/LoginsListViewHolder.kt index f6c89acbb1..d4a981e269 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/view/LoginsListViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/view/LoginsListViewHolder.kt @@ -6,7 +6,7 @@ package org.mozilla.fenix.settings.logins.view import android.view.View import androidx.core.view.isVisible -import kotlinx.android.synthetic.main.logins_item.* +import org.mozilla.fenix.databinding.LoginsItemBinding import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.loadIntoView import org.mozilla.fenix.settings.logins.SavedLogin @@ -14,7 +14,7 @@ import org.mozilla.fenix.settings.logins.interactor.SavedLoginsInteractor import org.mozilla.fenix.utils.view.ViewHolder class LoginsListViewHolder( - view: View, + val view: View, private val interactor: SavedLoginsInteractor ) : ViewHolder(view) { @@ -28,18 +28,19 @@ class LoginsListViewHolder( username = item.username, timeLastUsed = item.timeLastUsed ) - webAddressView.text = item.origin - usernameView.isVisible = item.username.isNotEmpty() - usernameView.text = item.username + val binding = LoginsItemBinding.bind(view) + binding.webAddressView.text = item.origin + binding.usernameView.isVisible = item.username.isNotEmpty() + binding.usernameView.text = item.username - updateFavIcon(item.origin) + updateFavIcon(binding, item.origin) itemView.setOnClickListener { interactor.onItemClicked(item) } } - private fun updateFavIcon(url: String) { - itemView.context.components.core.icons.loadIntoView(favicon_image, url) + private fun updateFavIcon(binding: LoginsItemBinding, url: String) { + itemView.context.components.core.icons.loadIntoView(binding.faviconImage, url) } } diff --git a/app/src/main/java/org/mozilla/fenix/share/listadapters/ShareTabsAdapter.kt b/app/src/main/java/org/mozilla/fenix/share/listadapters/ShareTabsAdapter.kt index 2e7671055d..80a3d9fe3c 100644 --- a/app/src/main/java/org/mozilla/fenix/share/listadapters/ShareTabsAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/share/listadapters/ShareTabsAdapter.kt @@ -10,9 +10,9 @@ import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView -import kotlinx.android.synthetic.main.share_tab_item.view.* import mozilla.components.concept.engine.prompt.ShareData import org.mozilla.fenix.R +import org.mozilla.fenix.databinding.ShareTabItemBinding import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.loadIntoView @@ -33,13 +33,14 @@ class ShareTabsAdapter : class ShareTabViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bind(item: ShareData) = with(itemView) { + val binding = ShareTabItemBinding.bind(this) val url = item.url if (!url.isNullOrEmpty()) { - context.components.core.icons.loadIntoView(itemView.share_tab_favicon, url) + context.components.core.icons.loadIntoView(binding.shareTabFavicon, url) } - itemView.share_tab_title.text = item.title - itemView.share_tab_url.text = item.url + binding.shareTabTitle.text = item.title + binding.shareTabUrl.text = item.url } } diff --git a/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt b/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt index 9b7dea5c7e..6b9536f195 100644 --- a/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt @@ -9,9 +9,9 @@ import android.view.View import androidx.annotation.VisibleForTesting import androidx.core.content.ContextCompat.getColor import androidx.recyclerview.widget.RecyclerView -import kotlinx.android.synthetic.main.account_share_list_item.view.* import mozilla.components.concept.sync.DeviceType import org.mozilla.fenix.R +import org.mozilla.fenix.databinding.AccountShareListItemBinding import org.mozilla.fenix.share.ShareToAccountDevicesInteractor import org.mozilla.fenix.share.listadapters.SyncShareOption import org.mozilla.fenix.utils.Do @@ -47,14 +47,15 @@ class AccountDeviceViewHolder( private fun bindView(option: SyncShareOption) { val (name, drawableRes, colorRes) = getNameIconBackground(context, option) + val binding = AccountShareListItemBinding.bind(itemView) - itemView.deviceIcon.apply { + binding.deviceIcon.apply { setImageResource(drawableRes) background.setTint(getColor(context, colorRes)) drawable.setTint(getColor(context, R.color.device_foreground)) } itemView.isClickable = option != SyncShareOption.Offline - itemView.deviceName.text = name + binding.deviceName.text = name } companion object { @@ -64,44 +65,45 @@ class AccountDeviceViewHolder( * Returns a triple with the name, icon drawable resource, and background color drawable resource * corresponding to the given [SyncShareOption]. */ - private fun getNameIconBackground(context: Context, option: SyncShareOption) = when (option) { - SyncShareOption.SignIn -> Triple( - context.getText(R.string.sync_sign_in), - R.drawable.mozac_ic_sync, - R.color.default_share_background - ) - SyncShareOption.Reconnect -> Triple( - context.getText(R.string.sync_reconnect), - R.drawable.mozac_ic_warning, - R.color.default_share_background - ) - SyncShareOption.Offline -> Triple( - context.getText(R.string.sync_offline), - R.drawable.mozac_ic_warning, - R.color.default_share_background - ) - SyncShareOption.AddNewDevice -> Triple( - context.getText(R.string.sync_connect_device), - R.drawable.mozac_ic_new, - R.color.default_share_background - ) - is SyncShareOption.SendAll -> Triple( - context.getText(R.string.sync_send_to_all), - R.drawable.mozac_ic_select_all, - R.color.default_share_background - ) - is SyncShareOption.SingleDevice -> when (option.device.deviceType) { - DeviceType.MOBILE -> Triple( - option.device.displayName, - R.drawable.mozac_ic_device_mobile, - R.color.device_type_mobile_background + private fun getNameIconBackground(context: Context, option: SyncShareOption) = + when (option) { + SyncShareOption.SignIn -> Triple( + context.getText(R.string.sync_sign_in), + R.drawable.mozac_ic_sync, + R.color.default_share_background ) - else -> Triple( - option.device.displayName, - R.drawable.mozac_ic_device_desktop, - R.color.device_type_desktop_background + SyncShareOption.Reconnect -> Triple( + context.getText(R.string.sync_reconnect), + R.drawable.mozac_ic_warning, + R.color.default_share_background ) + SyncShareOption.Offline -> Triple( + context.getText(R.string.sync_offline), + R.drawable.mozac_ic_warning, + R.color.default_share_background + ) + SyncShareOption.AddNewDevice -> Triple( + context.getText(R.string.sync_connect_device), + R.drawable.mozac_ic_new, + R.color.default_share_background + ) + is SyncShareOption.SendAll -> Triple( + context.getText(R.string.sync_send_to_all), + R.drawable.mozac_ic_select_all, + R.color.default_share_background + ) + is SyncShareOption.SingleDevice -> when (option.device.deviceType) { + DeviceType.MOBILE -> Triple( + option.device.displayName, + R.drawable.mozac_ic_device_mobile, + R.color.device_type_mobile_background + ) + else -> Triple( + option.device.displayName, + R.drawable.mozac_ic_device_desktop, + R.color.device_type_desktop_background + ) + } } - } } } diff --git a/app/src/main/java/org/mozilla/fenix/share/viewholders/AppViewHolder.kt b/app/src/main/java/org/mozilla/fenix/share/viewholders/AppViewHolder.kt index 52644dbe70..4778612c0d 100644 --- a/app/src/main/java/org/mozilla/fenix/share/viewholders/AppViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/share/viewholders/AppViewHolder.kt @@ -7,8 +7,8 @@ package org.mozilla.fenix.share.viewholders import android.view.View import androidx.annotation.VisibleForTesting import androidx.recyclerview.widget.RecyclerView -import kotlinx.android.synthetic.main.app_share_list_item.view.* import org.mozilla.fenix.R +import org.mozilla.fenix.databinding.AppShareListItemBinding import org.mozilla.fenix.share.ShareToAppsInteractor import org.mozilla.fenix.share.listadapters.AppShareOption @@ -29,9 +29,9 @@ class AppViewHolder( fun bind(item: AppShareOption) { application = item - - itemView.appName.text = item.name - itemView.appIcon.setImageDrawable(item.icon) + val binding = AppShareListItemBinding.bind(itemView) + binding.appName.text = item.name + binding.appIcon.setImageDrawable(item.icon) } companion object { diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/AbstractPageViewHolder.kt b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/AbstractPageViewHolder.kt index ff6055d90c..1819364024 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/AbstractPageViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/AbstractPageViewHolder.kt @@ -6,15 +6,14 @@ package org.mozilla.fenix.tabstray.viewholders import android.view.View import androidx.recyclerview.widget.RecyclerView -import kotlinx.android.extensions.LayoutContainer import org.mozilla.fenix.tabstray.TrayPagerAdapter /** * An abstract [RecyclerView.ViewHolder] for [TrayPagerAdapter] items. */ abstract class AbstractPageViewHolder constructor( - override val containerView: View -) : RecyclerView.ViewHolder(containerView), LayoutContainer { + val containerView: View +) : RecyclerView.ViewHolder(containerView) { abstract fun bind( adapter: RecyclerView.Adapter, diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/SyncedTabsPageViewHolder.kt b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/SyncedTabsPageViewHolder.kt index 601f78d210..a13820d6ad 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/SyncedTabsPageViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/SyncedTabsPageViewHolder.kt @@ -6,8 +6,8 @@ package org.mozilla.fenix.tabstray.viewholders import android.view.View import androidx.recyclerview.widget.RecyclerView -import kotlinx.android.synthetic.main.component_sync_tabs_tray_layout.* import org.mozilla.fenix.R +import org.mozilla.fenix.databinding.ComponentSyncTabsTrayLayoutBinding import org.mozilla.fenix.tabstray.TabsTrayStore class SyncedTabsPageViewHolder( @@ -19,10 +19,12 @@ class SyncedTabsPageViewHolder( adapter: RecyclerView.Adapter, layoutManager: RecyclerView.LayoutManager ) { - synced_tabs_list.layoutManager = layoutManager - synced_tabs_list.adapter = adapter + val binding = ComponentSyncTabsTrayLayoutBinding.bind(containerView) - synced_tabs_tray_layout.tabsTrayStore = tabsTrayStore + binding.syncedTabsList.layoutManager = layoutManager + binding.syncedTabsList.adapter = adapter + + binding.syncedTabsTrayLayout.tabsTrayStore = tabsTrayStore } companion object {