From fe16810ddbce8a0dc565aede1a2d1cffe5ffd82a Mon Sep 17 00:00:00 2001 From: Jeff Boek Date: Wed, 15 May 2019 21:30:57 -0700 Subject: [PATCH] For #2390 - Adds onboarding section headers --- .../sessioncontrol/SessionControlAdapter.kt | 12 +++++++++- .../sessioncontrol/SessionControlUIView.kt | 7 +++++- .../OnboardingSectionHeaderViewHolder.kt | 22 +++++++++++++++++++ .../res/layout/onboarding_section_header.xml | 15 +++++++++++++ app/src/main/res/values/strings.xml | 7 +++++- 5 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingSectionHeaderViewHolder.kt create mode 100644 app/src/main/res/layout/onboarding_section_header.xml diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt index 7b2590aed..c7ef6efbb 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.home.sessioncontrol +import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup 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.TabInCollectionViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingHeaderViewHolder +import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingSectionHeaderViewHolder import java.lang.IllegalStateException sealed class AdapterItem { data class TabHeader(val isPrivate: Boolean, val hasTabs: Boolean) : AdapterItem() object NoTabMessage : AdapterItem() data class TabItem(val tab: Tab) : AdapterItem() - object PrivateBrowsingDescription : AdapterItem() object SaveTabGroup : AdapterItem() object DeleteTabs : AdapterItem() + + object PrivateBrowsingDescription : AdapterItem() + object CollectionHeader : AdapterItem() object NoCollectionMessage : AdapterItem() data class CollectionItem(val collection: TabCollection) : AdapterItem() data class TabInCollectionItem(val collection: TabCollection, val tab: Tab, val isLastTab: Boolean) : AdapterItem() object OnboardingHeader : AdapterItem() + data class OnboardingSectionHeader(val labelBuilder: (Context) -> String) : AdapterItem() val viewType: Int get() = when (this) { @@ -49,6 +54,7 @@ sealed class AdapterItem { is CollectionItem -> CollectionViewHolder.LAYOUT_ID is TabInCollectionItem -> TabInCollectionViewHolder.LAYOUT_ID OnboardingHeader -> OnboardingHeaderViewHolder.LAYOUT_ID + is OnboardingSectionHeader -> OnboardingSectionHeaderViewHolder.LAYOUT_ID } } @@ -80,6 +86,7 @@ class SessionControlAdapter( CollectionViewHolder.LAYOUT_ID -> CollectionViewHolder(view, actionEmitter, job) TabInCollectionViewHolder.LAYOUT_ID -> TabInCollectionViewHolder(view, actionEmitter, job) OnboardingHeaderViewHolder.LAYOUT_ID -> OnboardingHeaderViewHolder(view) + OnboardingSectionHeaderViewHolder.LAYOUT_ID -> OnboardingSectionHeaderViewHolder(view) else -> throw IllegalStateException() } } @@ -114,6 +121,9 @@ class SessionControlAdapter( val item = items[position] as AdapterItem.TabInCollectionItem holder.bindSession(item.collection, item.tab, item.isLastTab) } + is OnboardingSectionHeaderViewHolder -> holder.bind( + (items[position] as AdapterItem.OnboardingSectionHeader).labelBuilder + ) } } } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlUIView.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlUIView.kt index 236091f89..577ed13d7 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlUIView.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlUIView.kt @@ -61,7 +61,12 @@ private fun privateModeAdapterItems(tabs: List): List { } private fun onboardingAdapterItems(): List = 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 = when (mode) { diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingSectionHeaderViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingSectionHeaderViewHolder.kt new file mode 100644 index 000000000..f7e704335 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingSectionHeaderViewHolder.kt @@ -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 + } +} diff --git a/app/src/main/res/layout/onboarding_section_header.xml b/app/src/main/res/layout/onboarding_section_header.xml new file mode 100644 index 000000000..00a39f18f --- /dev/null +++ b/app/src/main/res/layout/onboarding_section_header.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 11a7039e1..4e33fa551 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -487,6 +487,11 @@ URL copied - + Welcome to Firefox! + + Already have an account? + + Get to know %s