diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index 73e92121e..d3b554d24 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -45,6 +45,7 @@ import org.mozilla.fenix.ext.share import org.mozilla.fenix.ext.urlToTrimmedHost import org.mozilla.fenix.home.sessioncontrol.CollectionAction import org.mozilla.fenix.home.sessioncontrol.Mode +import org.mozilla.fenix.home.sessioncontrol.OnboardingAction import org.mozilla.fenix.home.sessioncontrol.SessionControlAction import org.mozilla.fenix.home.sessioncontrol.SessionControlChange import org.mozilla.fenix.home.sessioncontrol.SessionControlComponent @@ -219,6 +220,7 @@ class HomeFragment : Fragment(), CoroutineScope { when (it) { is SessionControlAction.Tab -> handleTabAction(it.action) is SessionControlAction.Collection -> handleCollectionAction(it.action) + is SessionControlAction.Onboarding -> handleOnboardingAction(it.action) } } } @@ -237,6 +239,17 @@ class HomeFragment : Fragment(), CoroutineScope { super.onStop() } + private fun handleOnboardingAction(action: OnboardingAction) { + Do exhaustive when (action) { + is OnboardingAction.Finish -> { + onboarding.finish() + + val mode = currentMode() + getManagedEmitter().onNext(SessionControlChange.ModeChange(mode)) + } + } + } + @SuppressWarnings("ComplexMethod") private fun handleTabAction(action: TabAction) { Do exhaustive when (action) { 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 a431da19a..4ea0db123 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,6 +20,7 @@ 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.OnboardingFinishViewHolder 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 @@ -50,6 +51,7 @@ sealed class AdapterItem { object OnboardingTrackingProtection : AdapterItem() object OnboardingPrivateBrowsing : AdapterItem() object OnboardingPrivacyNotice : AdapterItem() + object OnboardingFinish : AdapterItem() val viewType: Int get() = when (this) { @@ -70,6 +72,7 @@ sealed class AdapterItem { OnboardingTrackingProtection -> OnboardingTrackingProtectionViewHolder.LAYOUT_ID OnboardingPrivateBrowsing -> OnboardingPrivateBrowsingViewHolder.LAYOUT_ID OnboardingPrivacyNotice -> OnboardingPrivacyNoticeViewHolder.LAYOUT_ID + OnboardingFinish -> OnboardingFinishViewHolder.LAYOUT_ID } } @@ -107,6 +110,7 @@ class SessionControlAdapter( OnboardingTrackingProtectionViewHolder.LAYOUT_ID -> OnboardingTrackingProtectionViewHolder(view) OnboardingPrivateBrowsingViewHolder.LAYOUT_ID -> OnboardingPrivateBrowsingViewHolder(view) OnboardingPrivacyNoticeViewHolder.LAYOUT_ID -> OnboardingPrivacyNoticeViewHolder(view) + OnboardingFinishViewHolder.LAYOUT_ID -> OnboardingFinishViewHolder(view, actionEmitter) else -> throw IllegalStateException() } } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt index ac8c6aeea..64aa779b6 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt @@ -92,9 +92,14 @@ sealed class CollectionAction : Action { data class RemoveTab(val collection: TabCollection, val tab: Tab) : CollectionAction() } +sealed class OnboardingAction : Action { + object Finish : OnboardingAction() +} + sealed class SessionControlAction : Action { data class Tab(val action: TabAction) : SessionControlAction() data class Collection(val action: CollectionAction) : SessionControlAction() + data class Onboarding(val action: OnboardingAction) : SessionControlAction() } fun Observer.onNext(tabAction: TabAction) { @@ -105,6 +110,10 @@ fun Observer.onNext(collectionAction: CollectionAction) { onNext(SessionControlAction.Collection(collectionAction)) } +fun Observer.onNext(onboardingAction: OnboardingAction) { + onNext(SessionControlAction.Onboarding(onboardingAction)) +} + sealed class SessionControlChange : Change { data class TabsChange(val tabs: List) : SessionControlChange() data class ModeChange(val mode: Mode) : SessionControlChange() 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 5bb5b1739..83bd11754 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 @@ -71,7 +71,8 @@ private fun onboardingAdapterItems(): List = listOf( AdapterItem.OnboardingThemePicker, AdapterItem.OnboardingTrackingProtection, AdapterItem.OnboardingPrivateBrowsing, - AdapterItem.OnboardingPrivacyNotice + AdapterItem.OnboardingPrivacyNotice, + AdapterItem.OnboardingFinish ) private fun SessionControlState.toAdapterList(): List = when (mode) { diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingFinishViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingFinishViewHolder.kt new file mode 100644 index 000000000..afb0921a0 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingFinishViewHolder.kt @@ -0,0 +1,29 @@ +/* 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 io.reactivex.Observer +import kotlinx.android.synthetic.main.onboarding_finish.view.* +import org.mozilla.fenix.R +import org.mozilla.fenix.home.sessioncontrol.OnboardingAction +import org.mozilla.fenix.home.sessioncontrol.SessionControlAction +import org.mozilla.fenix.home.sessioncontrol.onNext + +class OnboardingFinishViewHolder( + view: View, + private val actionEmitter: Observer +) : RecyclerView.ViewHolder(view) { + + init { + view.finish_button.setOnClickListener { + actionEmitter.onNext(OnboardingAction.Finish) + } + } + companion object { + const val LAYOUT_ID = R.layout.onboarding_finish + } +} diff --git a/app/src/main/java/org/mozilla/fenix/onboarding/FenixOnboarding.kt b/app/src/main/java/org/mozilla/fenix/onboarding/FenixOnboarding.kt index 806760d1a..1a679810a 100644 --- a/app/src/main/java/org/mozilla/fenix/onboarding/FenixOnboarding.kt +++ b/app/src/main/java/org/mozilla/fenix/onboarding/FenixOnboarding.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.onboarding import android.content.Context import android.content.SharedPreferences +import org.mozilla.fenix.BuildConfig class FenixOnboarding(private val context: Context) { private val onboardingPrefs = context.applicationContext.getSharedPreferences( @@ -17,11 +18,23 @@ class FenixOnboarding(private val context: Context) { get() = getInt(OnboardingKeys.LAST_VERSION.key, 0) set(version) { edit().putInt(OnboardingKeys.LAST_VERSION.key, version).apply() } + // Temporary variable to keep track for building purposes only + private var tempFinish = false + fun finish() { + if (BuildConfig.DEBUG) { + tempFinish = true + return + } + onboardingPrefs.onboardedVersion = CURRENT_ONBOARDING_VERSION } - fun userHasBeenOnboarded(): Boolean = onboardingPrefs.onboardedVersion == CURRENT_ONBOARDING_VERSION + fun userHasBeenOnboarded(): Boolean { + if (!BuildConfig.DEBUG || tempFinish) return true + + return onboardingPrefs.onboardedVersion == CURRENT_ONBOARDING_VERSION + } private enum class OnboardingKeys(val key: String) { PREF_NAME("fenix.onboarding"), diff --git a/app/src/main/res/drawable/onboarding_button_background.xml b/app/src/main/res/drawable/onboarding_button_background.xml new file mode 100644 index 000000000..e4aaec8f3 --- /dev/null +++ b/app/src/main/res/drawable/onboarding_button_background.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/onboarding_finish.xml b/app/src/main/res/layout/onboarding_finish.xml new file mode 100644 index 000000000..bc8978530 --- /dev/null +++ b/app/src/main/res/layout/onboarding_finish.xml @@ -0,0 +1,29 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml index 5fd90c754..6ecfa35c8 100644 --- a/app/src/main/res/values/static_strings.xml +++ b/app/src/main/res/values/static_strings.xml @@ -17,4 +17,44 @@ %1$s puts you in control. \n\n%1$s is produced by Mozilla. + + + + Welcome to %s! + + Already have an account? + + Get to know %s + + Choose your theme + + 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. + + + Start browsing \ 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 16e81afb4..5f93e1d67 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -485,42 +485,4 @@ Entering full screen mode URL copied - - - - Welcome to %s! - - Already have an account? - - Get to know %s - - Choose your theme - - 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. -