forked from mozilla-mobile/fenix
-
Notifications
You must be signed in to change notification settings - Fork 0
/
TrayPagerAdapter.kt
137 lines (123 loc) · 5.37 KB
/
TrayPagerAdapter.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.tabstray
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.annotation.VisibleForTesting
import androidx.recyclerview.widget.ConcatAdapter
import androidx.recyclerview.widget.RecyclerView
import mozilla.components.browser.state.store.BrowserStore
import org.mozilla.fenix.sync.SyncedTabsAdapter
import org.mozilla.fenix.tabstray.browser.BrowserTabsAdapter
import org.mozilla.fenix.tabstray.browser.BrowserTrayInteractor
import org.mozilla.fenix.tabstray.browser.TitleHeaderAdapter
import org.mozilla.fenix.tabstray.browser.InactiveTabsAdapter
import org.mozilla.fenix.tabstray.browser.TabGroupAdapter
import org.mozilla.fenix.tabstray.syncedtabs.TabClickDelegate
import org.mozilla.fenix.tabstray.viewholders.AbstractPageViewHolder
import org.mozilla.fenix.tabstray.viewholders.NormalBrowserPageViewHolder
import org.mozilla.fenix.tabstray.viewholders.PrivateBrowserPageViewHolder
import org.mozilla.fenix.tabstray.viewholders.SyncedTabsPageViewHolder
class TrayPagerAdapter(
@VisibleForTesting internal val context: Context,
@VisibleForTesting internal val tabsTrayStore: TabsTrayStore,
@VisibleForTesting internal val browserInteractor: BrowserTrayInteractor,
@VisibleForTesting internal val navInteractor: NavigationInteractor,
@VisibleForTesting internal val interactor: TabsTrayInteractor,
@VisibleForTesting internal val browserStore: BrowserStore
) : RecyclerView.Adapter<AbstractPageViewHolder>() {
/**
* ⚠️ N.B: Scrolling to the selected tab depends on the order of these adapters. If you change
* the ordering or add/remove an adapter, please update [NormalBrowserPageViewHolder.scrollToTab] and
* the layout manager.
*/
private val normalAdapter by lazy {
ConcatAdapter(
InactiveTabsAdapter(context, browserInteractor, INACTIVE_TABS_FEATURE_NAME),
TabGroupAdapter(context, browserInteractor, tabsTrayStore, TAB_GROUP_FEATURE_NAME),
TitleHeaderAdapter(browserStore),
BrowserTabsAdapter(context, browserInteractor, tabsTrayStore, TABS_TRAY_FEATURE_NAME)
)
}
private val privateAdapter by lazy {
BrowserTabsAdapter(
context,
browserInteractor,
tabsTrayStore,
TABS_TRAY_FEATURE_NAME
)
}
private val syncedTabsAdapter by lazy {
SyncedTabsAdapter(TabClickDelegate(navInteractor))
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AbstractPageViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(viewType, parent, false)
return when (viewType) {
NormalBrowserPageViewHolder.LAYOUT_ID -> {
NormalBrowserPageViewHolder(
itemView,
tabsTrayStore,
browserStore,
interactor
)
}
PrivateBrowserPageViewHolder.LAYOUT_ID -> {
PrivateBrowserPageViewHolder(
itemView,
tabsTrayStore,
browserStore,
interactor
)
}
SyncedTabsPageViewHolder.LAYOUT_ID -> {
SyncedTabsPageViewHolder(
itemView,
tabsTrayStore
)
}
else -> throw IllegalStateException("Unknown viewType.")
}
}
override fun onBindViewHolder(viewHolder: AbstractPageViewHolder, position: Int) {
val adapter = when (position) {
POSITION_NORMAL_TABS -> normalAdapter
POSITION_PRIVATE_TABS -> privateAdapter
/* Gexsi begin: disable sync
POSITION_SYNCED_TABS -> syncedTabsAdapter
*/
else -> throw IllegalStateException("View type does not exist.")
}
viewHolder.bind(adapter)
}
override fun getItemViewType(position: Int): Int {
return when (position) {
POSITION_NORMAL_TABS -> NormalBrowserPageViewHolder.LAYOUT_ID
POSITION_PRIVATE_TABS -> PrivateBrowserPageViewHolder.LAYOUT_ID
/* Gexsi begin: disable sync
POSITION_SYNCED_TABS -> SyncedTabsPageViewHolder.LAYOUT_ID
*/
else -> throw IllegalStateException("Unknown position.")
}
}
override fun onViewAttachedToWindow(holder: AbstractPageViewHolder) {
holder.attachedToWindow()
}
override fun onViewDetachedFromWindow(holder: AbstractPageViewHolder) {
holder.detachedFromWindow()
}
override fun getItemCount(): Int = TRAY_TABS_COUNT
companion object {
const val TRAY_TABS_COUNT = 3
// Telemetry keys for identifying from which app features the a was opened / closed.
const val TABS_TRAY_FEATURE_NAME = "Tabs tray"
const val TAB_GROUP_FEATURE_NAME = "Tab group"
const val INACTIVE_TABS_FEATURE_NAME = "Inactive tabs"
val POSITION_NORMAL_TABS = Page.NormalTabs.ordinal
val POSITION_PRIVATE_TABS = Page.PrivateTabs.ordinal
/* Gexsi begin: disable sync
val POSITION_SYNCED_TABS = Page.SyncedTabs.ordinal
*/
}
}