Skip to content

Commit

Permalink
For mozilla-mobile#17917: Use View binding in tabs tray
Browse files Browse the repository at this point in the history
  • Loading branch information
codrut.topliceanu authored and mergify[bot] committed Aug 20, 2021
1 parent 69fa9ab commit bf5b4a5
Show file tree
Hide file tree
Showing 13 changed files with 248 additions and 191 deletions.
31 changes: 19 additions & 12 deletions app/src/main/java/org/mozilla/fenix/sync/SyncedTabsViewHolder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,16 @@ import android.view.View.GONE
import android.view.View.VISIBLE
import android.view.animation.Animation
import android.view.animation.AnimationUtils
import androidx.annotation.VisibleForTesting
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.sync_tabs_error_row.view.*
import kotlinx.android.synthetic.main.sync_tabs_list_item.view.*
import kotlinx.android.synthetic.main.view_synced_tabs_group.view.*
import kotlinx.android.synthetic.main.view_synced_tabs_title.view.*
import mozilla.components.browser.toolbar.MAX_URI_LENGTH
import mozilla.components.feature.syncedtabs.view.SyncedTabsView
import org.mozilla.fenix.NavGraphDirections
import org.mozilla.fenix.R
import org.mozilla.fenix.databinding.SyncTabsErrorRowBinding
import org.mozilla.fenix.databinding.SyncTabsListItemBinding
import org.mozilla.fenix.databinding.ViewSyncedTabsGroupBinding
import org.mozilla.fenix.databinding.ViewSyncedTabsTitleBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.toShortUrl
import org.mozilla.fenix.sync.SyncedTabsAdapter.AdapterItem
Expand All @@ -42,8 +43,9 @@ sealed class SyncedTabsViewHolder(itemView: View) : RecyclerView.ViewHolder(item

private fun bindTab(tab: AdapterItem.Tab) {
val active = tab.tab.active()
itemView.synced_tab_item_title.text = active.title
itemView.synced_tab_item_url.text = active.url
val binding = SyncTabsListItemBinding.bind(itemView)
binding.syncedTabItemTitle.text = active.title
binding.syncedTabItemUrl.text = active.url
.toShortUrl(itemView.context.components.publicSuffixList)
.take(MAX_URI_LENGTH)
}
Expand All @@ -57,14 +59,15 @@ sealed class SyncedTabsViewHolder(itemView: View) : RecyclerView.ViewHolder(item

override fun <T : AdapterItem> bind(item: T, interactor: SyncedTabsView.Listener) {
val errorItem = item as AdapterItem.Error
val binding = SyncTabsErrorRowBinding.bind(itemView)

itemView.sync_tabs_error_description.text =
binding.syncTabsErrorDescription.text =
itemView.context.getString(errorItem.descriptionResId)
itemView.sync_tabs_error_cta_button.visibility = GONE
binding.syncTabsErrorCtaButton.visibility = GONE

errorItem.navController?.let { navController ->
itemView.sync_tabs_error_cta_button.visibility = VISIBLE
itemView.sync_tabs_error_cta_button.setOnClickListener {
binding.syncTabsErrorCtaButton.visibility = VISIBLE
binding.syncTabsErrorCtaButton.setOnClickListener {
navController.navigate(NavGraphDirections.actionGlobalTurnOnSync())
}
}
Expand All @@ -77,12 +80,15 @@ sealed class SyncedTabsViewHolder(itemView: View) : RecyclerView.ViewHolder(item

class DeviceViewHolder(itemView: View) : SyncedTabsViewHolder(itemView) {

@VisibleForTesting
internal val binding = ViewSyncedTabsGroupBinding.bind(itemView)

override fun <T : AdapterItem> bind(item: T, interactor: SyncedTabsView.Listener) {
bindHeader(item as AdapterItem.Device)
}

private fun bindHeader(device: AdapterItem.Device) {
itemView.synced_tabs_group_name.text = device.device.displayName
binding.syncedTabsGroupName.text = device.device.displayName
}

companion object {
Expand All @@ -101,7 +107,8 @@ sealed class SyncedTabsViewHolder(itemView: View) : RecyclerView.ViewHolder(item
class TitleViewHolder(itemView: View) : SyncedTabsViewHolder(itemView) {

override fun <T : AdapterItem> bind(item: T, interactor: SyncedTabsView.Listener) {
itemView.refresh_icon.setOnClickListener { v ->
val binding = ViewSyncedTabsTitleBinding.bind(itemView)
binding.refreshIcon.setOnClickListener { v ->
val rotation = AnimationUtils.loadAnimation(
itemView.context,
R.anim.full_rotation
Expand Down
117 changes: 76 additions & 41 deletions app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,6 @@ import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.tabs.TabLayout
import kotlinx.android.synthetic.main.component_tabstray2.*
import kotlinx.android.synthetic.main.component_tabstray2.view.*
import kotlinx.android.synthetic.main.component_tabstray_fab.*
import kotlinx.android.synthetic.main.fragment_tab_tray_dialog.*
import kotlinx.android.synthetic.main.tabs_tray_tab_counter2.*
import kotlinx.android.synthetic.main.tabstray_multiselect_items.*
import kotlinx.coroutines.Dispatchers
import mozilla.appservices.places.BookmarkRoot
import mozilla.components.browser.state.selector.normalTabs
Expand All @@ -40,6 +34,11 @@ import org.mozilla.fenix.components.FenixSnackbar
import org.mozilla.fenix.share.ShareFragment
import org.mozilla.fenix.components.StoreProvider
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.databinding.ComponentTabstray2Binding
import org.mozilla.fenix.databinding.ComponentTabstrayFabBinding
import org.mozilla.fenix.databinding.FragmentTabTrayDialogBinding
import org.mozilla.fenix.databinding.TabsTrayTabCounter2Binding
import org.mozilla.fenix.databinding.TabstrayMultiselectItemsBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.settings
Expand All @@ -60,7 +59,6 @@ import kotlin.math.max

@Suppress("TooManyFunctions", "LargeClass")
class TabsTrayFragment : AppCompatDialogFragment() {
private var fabView: View? = null
@VisibleForTesting internal lateinit var tabsTrayStore: TabsTrayStore
private lateinit var browserTrayInteractor: BrowserTrayInteractor
private lateinit var tabsTrayInteractor: TabsTrayInteractor
Expand All @@ -75,6 +73,16 @@ class TabsTrayFragment : AppCompatDialogFragment() {
private val tabsTrayCtaBinding = ViewBoundFeatureWrapper<TabsTrayInfoBannerBinding>()
private val secureTabsTrayBinding = ViewBoundFeatureWrapper<SecureTabsTrayBinding>()

@VisibleForTesting @Suppress("VariableNaming")
internal var _tabsTrayBinding: ComponentTabstray2Binding? = null
private val tabsTrayBinding get() = _tabsTrayBinding!!
@VisibleForTesting @Suppress("VariableNaming")
internal var _tabsTrayDialogBinding: FragmentTabTrayDialogBinding? = null
private val tabsTrayDialogBinding get() = _tabsTrayDialogBinding!!
@VisibleForTesting @Suppress("VariableNaming")
internal var _fabButtonBinding: ComponentTabstrayFabBinding? = null
private val fabButtonBinding get() = _fabButtonBinding!!

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE, R.style.TabTrayDialogStyle)
Expand All @@ -88,8 +96,21 @@ class TabsTrayFragment : AppCompatDialogFragment() {
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val containerView = inflater.inflate(R.layout.fragment_tab_tray_dialog, container, false)
inflater.inflate(R.layout.component_tabstray2, containerView as ViewGroup, true)
_tabsTrayDialogBinding = FragmentTabTrayDialogBinding.inflate(
inflater,
container,
false
)
_tabsTrayBinding = ComponentTabstray2Binding.inflate(
inflater,
tabsTrayDialogBinding.root,
true
)
_fabButtonBinding = ComponentTabstrayFabBinding.inflate(
LayoutInflater.from(tabsTrayDialogBinding.root.context),
tabsTrayDialogBinding.root,
true
)

val args by navArgs<TabsTrayFragmentArgs>()
val initialMode = if (args.enterMultiselect) {
Expand All @@ -106,10 +127,14 @@ class TabsTrayFragment : AppCompatDialogFragment() {
)
}

fabView = LayoutInflater.from(containerView.context)
.inflate(R.layout.component_tabstray_fab, containerView, true)
return tabsTrayDialogBinding.root
}

return containerView
override fun onDestroyView() {
super.onDestroyView()
_tabsTrayBinding = null
_tabsTrayDialogBinding = null
_fabButtonBinding = null
}

@Suppress("LongMethod")
Expand All @@ -118,7 +143,8 @@ class TabsTrayFragment : AppCompatDialogFragment() {
val activity = activity as HomeActivity

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
new_tab_button.accessibilityTraversalAfter = tab_layout.id
fabButtonBinding.newTabButton.accessibilityTraversalAfter =
tabsTrayBinding.tabLayout.id
}
requireComponents.analytics.metrics.track(Event.TabsTrayOpened)

Expand Down Expand Up @@ -165,7 +191,7 @@ class TabsTrayFragment : AppCompatDialogFragment() {
requireComponents.analytics.metrics
)

setupMenu(view, navigationInteractor)
setupMenu(navigationInteractor)
setupPager(
view.context,
tabsTrayStore,
Expand All @@ -180,7 +206,7 @@ class TabsTrayFragment : AppCompatDialogFragment() {
}

trayBehaviorManager = TabSheetBehaviorManager(
behavior = BottomSheetBehavior.from(view.tab_wrapper),
behavior = BottomSheetBehavior.from(tabsTrayBinding.tabWrapper),
orientation = resources.configuration.orientation,
maxNumberOfTabs = max(
requireContext().components.core.store.state.normalTabs.size,
Expand All @@ -199,7 +225,7 @@ class TabsTrayFragment : AppCompatDialogFragment() {
feature = TabsTrayInfoBannerBinding(
context = view.context,
store = requireComponents.core.store,
infoBannerView = view.info_banner,
infoBannerView = tabsTrayBinding.infoBanner,
settings = requireComponents.settings,
navigationInteractor = navigationInteractor
),
Expand All @@ -209,7 +235,7 @@ class TabsTrayFragment : AppCompatDialogFragment() {

tabLayoutMediator.set(
feature = TabLayoutMediator(
tabLayout = tab_layout,
tabLayout = tabsTrayBinding.tabLayout,
interactor = tabsTrayInteractor,
browsingModeManager = activity.browsingModeManager,
tabsTrayStore = tabsTrayStore,
Expand All @@ -219,10 +245,14 @@ class TabsTrayFragment : AppCompatDialogFragment() {
view = view
)

val tabsTrayTabCounter2Binding = TabsTrayTabCounter2Binding.bind(
tabsTrayBinding.tabLayout
)

tabCounterBinding.set(
feature = TabCounterBinding(
store = requireComponents.core.store,
counter = tab_counter
counter = tabsTrayTabCounter2Binding.tabCounter
),
owner = this,
view = view
Expand All @@ -231,32 +261,37 @@ class TabsTrayFragment : AppCompatDialogFragment() {
floatingActionButtonBinding.set(
feature = FloatingActionButtonBinding(
store = tabsTrayStore,
actionButton = new_tab_button,
actionButton = fabButtonBinding.newTabButton,
browserTrayInteractor = browserTrayInteractor
),
owner = this,
view = view
)

val tabsTrayMultiselectItemsBinding = TabstrayMultiselectItemsBinding.bind(
tabsTrayBinding.root
)

selectionBannerBinding.set(
feature = SelectionBannerBinding(
context = requireContext(),
binding = tabsTrayBinding,
store = tabsTrayStore,
navInteractor = navigationInteractor,
tabsTrayInteractor = tabsTrayInteractor,
containerView = view,
backgroundView = topBar,
backgroundView = tabsTrayBinding.topBar,
showOnSelectViews = VisibilityModifier(
collect_multi_select,
share_multi_select,
menu_multi_select,
multiselect_title,
exit_multi_select
tabsTrayMultiselectItemsBinding.collectMultiSelect,
tabsTrayMultiselectItemsBinding.shareMultiSelect,
tabsTrayMultiselectItemsBinding.menuMultiSelect,
tabsTrayBinding.multiselectTitle,
tabsTrayBinding.exitMultiSelect
),
showOnNormalViews = VisibilityModifier(
tab_layout,
tab_tray_overflow,
new_tab_button
tabsTrayBinding.tabLayout,
tabsTrayBinding.tabTrayOverflow,
fabButtonBinding.newTabButton
)
),
owner = this,
Expand All @@ -266,8 +301,8 @@ class TabsTrayFragment : AppCompatDialogFragment() {
selectionHandleBinding.set(
feature = SelectionHandleBinding(
store = tabsTrayStore,
handle = handle,
containerLayout = tab_wrapper
handle = tabsTrayBinding.handle,
containerLayout = tabsTrayBinding.tabWrapper
),
owner = this,
view = view
Expand Down Expand Up @@ -295,7 +330,7 @@ class TabsTrayFragment : AppCompatDialogFragment() {
trayBehaviorManager.updateDependingOnOrientation(newConfig.orientation)

if (requireContext().settings().gridTabView) {
tabsTray.adapter?.notifyDataSetChanged()
tabsTrayBinding.tabsTray.adapter?.notifyDataSetChanged()
}
}

Expand All @@ -321,7 +356,7 @@ class TabsTrayFragment : AppCompatDialogFragment() {
},
operation = { },
elevation = ELEVATION,
anchorView = if (new_tab_button.isVisible) new_tab_button else null
anchorView = if (fabButtonBinding.newTabButton.isVisible) fabButtonBinding.newTabButton else null
)
}

Expand All @@ -333,7 +368,7 @@ class TabsTrayFragment : AppCompatDialogFragment() {
browserInteractor: BrowserTrayInteractor,
navigationInteractor: NavigationInteractor
) {
tabsTray.apply {
tabsTrayBinding.tabsTray.apply {
adapter = TrayPagerAdapter(
context,
store,
Expand All @@ -347,16 +382,16 @@ class TabsTrayFragment : AppCompatDialogFragment() {
}

@VisibleForTesting
internal fun setupMenu(view: View, navigationInteractor: NavigationInteractor) {
view.tab_tray_overflow.setOnClickListener { anchor ->
internal fun setupMenu(navigationInteractor: NavigationInteractor) {
tabsTrayBinding.tabTrayOverflow.setOnClickListener { anchor ->

requireComponents.analytics.metrics.track(Event.TabsTrayMenuOpened)

val menu = getTrayMenu(
context = requireContext(),
browserStore = requireComponents.core.store,
tabsTrayStore = tabsTrayStore,
tabLayout = tab_layout,
tabLayout = tabsTrayBinding.tabLayout,
navigationInteractor = navigationInteractor
).build()

Expand All @@ -375,8 +410,8 @@ class TabsTrayFragment : AppCompatDialogFragment() {

@VisibleForTesting
internal fun setupBackgroundDismissalListener(block: (View) -> Unit) {
tabLayout.setOnClickListener(block)
handle.setOnClickListener(block)
tabsTrayDialogBinding.tabLayout.setOnClickListener(block)
tabsTrayBinding.handle.setOnClickListener(block)
}

@VisibleForTesting
Expand All @@ -396,8 +431,8 @@ class TabsTrayFragment : AppCompatDialogFragment() {

@VisibleForTesting
internal fun selectTabPosition(position: Int, smoothScroll: Boolean) {
tabsTray.setCurrentItem(position, smoothScroll)
tab_layout.getTabAt(position)?.select()
tabsTrayBinding.tabsTray.setCurrentItem(position, smoothScroll)
tabsTrayBinding.tabLayout.getTabAt(position)?.select()
}

@VisibleForTesting
Expand Down Expand Up @@ -447,7 +482,7 @@ class TabsTrayFragment : AppCompatDialogFragment() {
return if (requireComponents.settings.accessibilityServicesEnabled) {
null
} else {
new_tab_button
fabButtonBinding.newTabButton
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import androidx.appcompat.content.res.AppCompatResources
import androidx.appcompat.widget.AppCompatImageButton
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import kotlinx.android.synthetic.main.checkbox_item.view.*
import mozilla.components.browser.state.selector.findTabOrCustomTab
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.browser.tabstray.TabViewHolder
Expand Down Expand Up @@ -102,8 +101,8 @@ abstract class AbstractBrowserTabViewHolder(
}
}

fun showTabIsMultiSelectEnabled(isSelected: Boolean) {
itemView.selected_mask.isVisible = isSelected
fun showTabIsMultiSelectEnabled(selectedMaskView: View?, isSelected: Boolean) {
selectedMaskView?.isVisible = isSelected
closeView.isInvisible = trayStore.state.mode is TabsTrayState.Mode.Select
}

Expand Down

0 comments on commit bf5b4a5

Please sign in to comment.