For #2390 - Adds onboarding section headers
parent
dfe14e1751
commit
fe16810ddb
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
package org.mozilla.fenix.home.sessioncontrol
|
package org.mozilla.fenix.home.sessioncontrol
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
@ -20,21 +21,25 @@ import org.mozilla.fenix.home.sessioncontrol.viewholders.NoCollectionMessageView
|
||||||
import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder
|
import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder
|
||||||
import org.mozilla.fenix.home.sessioncontrol.viewholders.TabInCollectionViewHolder
|
import org.mozilla.fenix.home.sessioncontrol.viewholders.TabInCollectionViewHolder
|
||||||
import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingHeaderViewHolder
|
import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingHeaderViewHolder
|
||||||
|
import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingSectionHeaderViewHolder
|
||||||
import java.lang.IllegalStateException
|
import java.lang.IllegalStateException
|
||||||
|
|
||||||
sealed class AdapterItem {
|
sealed class AdapterItem {
|
||||||
data class TabHeader(val isPrivate: Boolean, val hasTabs: Boolean) : AdapterItem()
|
data class TabHeader(val isPrivate: Boolean, val hasTabs: Boolean) : AdapterItem()
|
||||||
object NoTabMessage : AdapterItem()
|
object NoTabMessage : AdapterItem()
|
||||||
data class TabItem(val tab: Tab) : AdapterItem()
|
data class TabItem(val tab: Tab) : AdapterItem()
|
||||||
object PrivateBrowsingDescription : AdapterItem()
|
|
||||||
object SaveTabGroup : AdapterItem()
|
object SaveTabGroup : AdapterItem()
|
||||||
object DeleteTabs : AdapterItem()
|
object DeleteTabs : AdapterItem()
|
||||||
|
|
||||||
|
object PrivateBrowsingDescription : AdapterItem()
|
||||||
|
|
||||||
object CollectionHeader : AdapterItem()
|
object CollectionHeader : AdapterItem()
|
||||||
object NoCollectionMessage : AdapterItem()
|
object NoCollectionMessage : AdapterItem()
|
||||||
data class CollectionItem(val collection: TabCollection) : AdapterItem()
|
data class CollectionItem(val collection: TabCollection) : AdapterItem()
|
||||||
data class TabInCollectionItem(val collection: TabCollection, val tab: Tab, val isLastTab: Boolean) : AdapterItem()
|
data class TabInCollectionItem(val collection: TabCollection, val tab: Tab, val isLastTab: Boolean) : AdapterItem()
|
||||||
|
|
||||||
object OnboardingHeader : AdapterItem()
|
object OnboardingHeader : AdapterItem()
|
||||||
|
data class OnboardingSectionHeader(val labelBuilder: (Context) -> String) : AdapterItem()
|
||||||
|
|
||||||
val viewType: Int
|
val viewType: Int
|
||||||
get() = when (this) {
|
get() = when (this) {
|
||||||
|
@ -49,6 +54,7 @@ sealed class AdapterItem {
|
||||||
is CollectionItem -> CollectionViewHolder.LAYOUT_ID
|
is CollectionItem -> CollectionViewHolder.LAYOUT_ID
|
||||||
is TabInCollectionItem -> TabInCollectionViewHolder.LAYOUT_ID
|
is TabInCollectionItem -> TabInCollectionViewHolder.LAYOUT_ID
|
||||||
OnboardingHeader -> OnboardingHeaderViewHolder.LAYOUT_ID
|
OnboardingHeader -> OnboardingHeaderViewHolder.LAYOUT_ID
|
||||||
|
is OnboardingSectionHeader -> OnboardingSectionHeaderViewHolder.LAYOUT_ID
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,6 +86,7 @@ class SessionControlAdapter(
|
||||||
CollectionViewHolder.LAYOUT_ID -> CollectionViewHolder(view, actionEmitter, job)
|
CollectionViewHolder.LAYOUT_ID -> CollectionViewHolder(view, actionEmitter, job)
|
||||||
TabInCollectionViewHolder.LAYOUT_ID -> TabInCollectionViewHolder(view, actionEmitter, job)
|
TabInCollectionViewHolder.LAYOUT_ID -> TabInCollectionViewHolder(view, actionEmitter, job)
|
||||||
OnboardingHeaderViewHolder.LAYOUT_ID -> OnboardingHeaderViewHolder(view)
|
OnboardingHeaderViewHolder.LAYOUT_ID -> OnboardingHeaderViewHolder(view)
|
||||||
|
OnboardingSectionHeaderViewHolder.LAYOUT_ID -> OnboardingSectionHeaderViewHolder(view)
|
||||||
else -> throw IllegalStateException()
|
else -> throw IllegalStateException()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -114,6 +121,9 @@ class SessionControlAdapter(
|
||||||
val item = items[position] as AdapterItem.TabInCollectionItem
|
val item = items[position] as AdapterItem.TabInCollectionItem
|
||||||
holder.bindSession(item.collection, item.tab, item.isLastTab)
|
holder.bindSession(item.collection, item.tab, item.isLastTab)
|
||||||
}
|
}
|
||||||
|
is OnboardingSectionHeaderViewHolder -> holder.bind(
|
||||||
|
(items[position] as AdapterItem.OnboardingSectionHeader).labelBuilder
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,12 @@ private fun privateModeAdapterItems(tabs: List<Tab>): List<AdapterItem> {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onboardingAdapterItems(): List<AdapterItem> = listOf(
|
private fun onboardingAdapterItems(): List<AdapterItem> = listOf(
|
||||||
AdapterItem.OnboardingHeader
|
AdapterItem.OnboardingHeader,
|
||||||
|
AdapterItem.OnboardingSectionHeader() { it.getString(R.string.onboarding_fxa_section_header) },
|
||||||
|
AdapterItem.OnboardingSectionHeader() {
|
||||||
|
val appName = it.getString(R.string.app_name)
|
||||||
|
it.getString(R.string.onboarding_feature_section_header, appName)
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
private fun SessionControlState.toAdapterList(): List<AdapterItem> = when (mode) {
|
private fun SessionControlState.toAdapterList(): List<AdapterItem> = when (mode) {
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
/* 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.home.sessioncontrol.viewholders.onboarding
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.view.View
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import kotlinx.android.synthetic.main.onboarding_section_header.view.*
|
||||||
|
import org.mozilla.fenix.R
|
||||||
|
|
||||||
|
class OnboardingSectionHeaderViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {
|
||||||
|
|
||||||
|
fun bind(labelBuilder: (Context) -> String) {
|
||||||
|
view.section_header_text.text = labelBuilder(view.context)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val LAYOUT_ID = R.layout.onboarding_section_header
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- 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/. -->
|
||||||
|
<FrameLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/onboarding_header"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/section_header_text"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="@style/HeaderTextStyle" />
|
||||||
|
</FrameLayout>
|
|
@ -487,6 +487,11 @@
|
||||||
<string name="url_copied">URL copied</string>
|
<string name="url_copied">URL copied</string>
|
||||||
|
|
||||||
<!-- Onboarding -->
|
<!-- Onboarding -->
|
||||||
<!-- Header text for onboarding -->
|
<!-- Text for onboarding welcome message-->
|
||||||
<string name="onboarding_header">Welcome to Firefox!</string>
|
<string name="onboarding_header">Welcome to Firefox!</string>
|
||||||
|
<!-- text for the Firefox Accounts section header -->
|
||||||
|
<string name="onboarding_fxa_section_header">Already have an account?</string>
|
||||||
|
<!-- text for the Firefox Preview feature section header
|
||||||
|
The first parameter is the name of the app defined in app_name (for example: Firefox Preview) -->
|
||||||
|
<string name="onboarding_feature_section_header">Get to know %s</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Loading…
Reference in New Issue