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 350d9563f..a431da19a 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 @@ -20,9 +20,13 @@ import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionHeaderViewHol import org.mozilla.fenix.home.sessioncontrol.viewholders.NoCollectionMessageViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.TabInCollectionViewHolder +import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingFirefoxAccountViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingHeaderViewHolder +import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingPrivacyNoticeViewHolder +import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingPrivateBrowsingViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingSectionHeaderViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingThemePickerViewHolder +import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingTrackingProtectionViewHolder import java.lang.IllegalStateException sealed class AdapterItem { @@ -41,7 +45,11 @@ sealed class AdapterItem { object OnboardingHeader : AdapterItem() data class OnboardingSectionHeader(val labelBuilder: (Context) -> String) : AdapterItem() + object OnboardingFirefoxAccount : AdapterItem() object OnboardingThemePicker : AdapterItem() + object OnboardingTrackingProtection : AdapterItem() + object OnboardingPrivateBrowsing : AdapterItem() + object OnboardingPrivacyNotice : AdapterItem() val viewType: Int get() = when (this) { @@ -57,7 +65,11 @@ sealed class AdapterItem { is TabInCollectionItem -> TabInCollectionViewHolder.LAYOUT_ID OnboardingHeader -> OnboardingHeaderViewHolder.LAYOUT_ID is OnboardingSectionHeader -> OnboardingSectionHeaderViewHolder.LAYOUT_ID + OnboardingFirefoxAccount -> OnboardingFirefoxAccountViewHolder.LAYOUT_ID OnboardingThemePicker -> OnboardingThemePickerViewHolder.LAYOUT_ID + OnboardingTrackingProtection -> OnboardingTrackingProtectionViewHolder.LAYOUT_ID + OnboardingPrivateBrowsing -> OnboardingPrivateBrowsingViewHolder.LAYOUT_ID + OnboardingPrivacyNotice -> OnboardingPrivacyNoticeViewHolder.LAYOUT_ID } } @@ -90,7 +102,11 @@ class SessionControlAdapter( TabInCollectionViewHolder.LAYOUT_ID -> TabInCollectionViewHolder(view, actionEmitter, job) OnboardingHeaderViewHolder.LAYOUT_ID -> OnboardingHeaderViewHolder(view) OnboardingSectionHeaderViewHolder.LAYOUT_ID -> OnboardingSectionHeaderViewHolder(view) + OnboardingFirefoxAccountViewHolder.LAYOUT_ID -> OnboardingFirefoxAccountViewHolder(view) OnboardingThemePickerViewHolder.LAYOUT_ID -> OnboardingThemePickerViewHolder(view) + OnboardingTrackingProtectionViewHolder.LAYOUT_ID -> OnboardingTrackingProtectionViewHolder(view) + OnboardingPrivateBrowsingViewHolder.LAYOUT_ID -> OnboardingPrivateBrowsingViewHolder(view) + OnboardingPrivacyNoticeViewHolder.LAYOUT_ID -> OnboardingPrivacyNoticeViewHolder(view) else -> throw IllegalStateException() } } 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 d79e38c96..5bb5b1739 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 @@ -63,11 +63,15 @@ private fun privateModeAdapterItems(tabs: List): List { private fun onboardingAdapterItems(): List = listOf( AdapterItem.OnboardingHeader, AdapterItem.OnboardingSectionHeader() { it.getString(R.string.onboarding_fxa_section_header) }, + AdapterItem.OnboardingFirefoxAccount, AdapterItem.OnboardingSectionHeader() { val appName = it.getString(R.string.app_name) it.getString(R.string.onboarding_feature_section_header, appName) }, - AdapterItem.OnboardingThemePicker + AdapterItem.OnboardingThemePicker, + AdapterItem.OnboardingTrackingProtection, + AdapterItem.OnboardingPrivateBrowsing, + AdapterItem.OnboardingPrivacyNotice ) private fun SessionControlState.toAdapterList(): List = when (mode) { diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingFirefoxAccountViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingFirefoxAccountViewHolder.kt new file mode 100644 index 000000000..ac8136b45 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingFirefoxAccountViewHolder.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.view.View +import androidx.recyclerview.widget.RecyclerView +import kotlinx.android.synthetic.main.onboarding_firefox_account.view.* +import org.mozilla.fenix.R + +class OnboardingFirefoxAccountViewHolder(view: View) : RecyclerView.ViewHolder(view) { + + init { + val appName = view.context.getString(R.string.app_name) + view.header_text.text = view.context.getString(R.string.onboarding_firefox_account_header, appName) + } + + companion object { + const val LAYOUT_ID = R.layout.onboarding_firefox_account + } +} diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingHeaderViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingHeaderViewHolder.kt index bf6e2c270..5e5470e3a 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingHeaderViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingHeaderViewHolder.kt @@ -6,9 +6,16 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding import android.view.View import androidx.recyclerview.widget.RecyclerView +import kotlinx.android.synthetic.main.onboarding_header.view.* import org.mozilla.fenix.R class OnboardingHeaderViewHolder(view: View) : RecyclerView.ViewHolder(view) { + + init { + val appName = view.context.getString(R.string.app_name) + view.header_text.text = view.context.getString(R.string.onboarding_header, appName) + } + companion object { const val LAYOUT_ID = R.layout.onboarding_header } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingPrivacyNoticeViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingPrivacyNoticeViewHolder.kt new file mode 100644 index 000000000..b041d51ab --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingPrivacyNoticeViewHolder.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.view.View +import androidx.recyclerview.widget.RecyclerView +import kotlinx.android.synthetic.main.onboarding_theme_picker.view.* +import org.mozilla.fenix.R + +class OnboardingPrivacyNoticeViewHolder(view: View) : RecyclerView.ViewHolder(view) { + + init { + val appName = view.context.getString(R.string.app_name) + view.description_text.text = view.context.getString(R.string.onboarding_privacy_notice_description, appName) + } + + companion object { + const val LAYOUT_ID = R.layout.onboarding_privacy_notice + } +} diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingPrivateBrowsingViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingPrivateBrowsingViewHolder.kt new file mode 100644 index 000000000..b874bc5f4 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingPrivateBrowsingViewHolder.kt @@ -0,0 +1,36 @@ +/* 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.text.SpannableString +import android.text.Spanned +import android.text.style.ImageSpan +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import kotlinx.android.synthetic.main.onboarding_private_browsing.view.* +import org.mozilla.fenix.R + +class OnboardingPrivateBrowsingViewHolder(view: View) : RecyclerView.ViewHolder(view) { + + init { + val icon = ImageSpan(view.context, R.drawable.ic_private_browsing) + val text = SpannableString(view.context.getString(R.string.onboarding_private_browsing_description)) + + val spanStartIndex = text.indexOf(IMAGE_PLACEHOLDER) + text.setSpan( + icon, + spanStartIndex, + spanStartIndex + IMAGE_PLACEHOLDER.length, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + ) + + view.description_text.text = text + } + + companion object { + const val IMAGE_PLACEHOLDER = "%s" + const val LAYOUT_ID = R.layout.onboarding_private_browsing + } +} diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingTrackingProtectionViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingTrackingProtectionViewHolder.kt new file mode 100644 index 000000000..197e3a642 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingTrackingProtectionViewHolder.kt @@ -0,0 +1,24 @@ +/* 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.view.View +import androidx.recyclerview.widget.RecyclerView +import kotlinx.android.synthetic.main.onboarding_tracking_protection.view.* +import org.mozilla.fenix.R + +class OnboardingTrackingProtectionViewHolder(view: View) : RecyclerView.ViewHolder(view) { + + init { + val appName = view.context.getString(R.string.app_name) + view.description_text.text = view.context.getString( + R.string.onboarding_tracking_protection_description, + appName + ) + } + companion object { + const val LAYOUT_ID = R.layout.onboarding_tracking_protection + } +} diff --git a/app/src/main/res/layout/onboarding_firefox_account.xml b/app/src/main/res/layout/onboarding_firefox_account.xml new file mode 100644 index 000000000..c1946b61f --- /dev/null +++ b/app/src/main/res/layout/onboarding_firefox_account.xml @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/onboarding_privacy_notice.xml b/app/src/main/res/layout/onboarding_privacy_notice.xml new file mode 100644 index 000000000..27e206249 --- /dev/null +++ b/app/src/main/res/layout/onboarding_privacy_notice.xml @@ -0,0 +1,25 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/onboarding_private_browsing.xml b/app/src/main/res/layout/onboarding_private_browsing.xml new file mode 100644 index 000000000..a347a944e --- /dev/null +++ b/app/src/main/res/layout/onboarding_private_browsing.xml @@ -0,0 +1,25 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/onboarding_theme_picker.xml b/app/src/main/res/layout/onboarding_theme_picker.xml index 1cb077679..be0475f94 100644 --- a/app/src/main/res/layout/onboarding_theme_picker.xml +++ b/app/src/main/res/layout/onboarding_theme_picker.xml @@ -4,20 +4,20 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> + + + + + \ 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 cab9b3606..16e81afb4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -487,8 +487,9 @@ URL copied - - Welcome to Firefox! + + Welcome to %s! Already have an account? Save some battery and your eyesight by enabling dark mode. + + Get the most out of %s + + Protect yourself + + %s helps stop websites from tracking you online, making it + harder for ads to follow you around the web + + + Browse Privately + + Private Browsing is always just a tap or two away, just look + for the private browsing icon (%s) + + + Your Privacy + + We\'ve designed %s to give you control over what you share + online and what you share with us. +