1
0
Fork 0

For #6980: Update Private browsing card.

Added test to description.
Added link to settings.
Updated unit tests.
master
mcarare 2020-01-22 15:29:41 +02:00 committed by Jeff Boek
parent 127169f5ff
commit 372b1e7f0e
9 changed files with 93 additions and 11 deletions

View File

@ -206,7 +206,8 @@ class HomeFragment : Fragment() {
invokePendingDeleteJobs = ::invokePendingDeleteJobs, invokePendingDeleteJobs = ::invokePendingDeleteJobs,
registerCollectionStorageObserver = ::registerCollectionStorageObserver, registerCollectionStorageObserver = ::registerCollectionStorageObserver,
scrollToTheTop = ::scrollToTheTop, scrollToTheTop = ::scrollToTheTop,
showDeleteCollectionPrompt = ::showDeleteCollectionPrompt showDeleteCollectionPrompt = ::showDeleteCollectionPrompt,
openSettingsScreen = :: openSettingsScreen
) )
) )
updateLayout(view) updateLayout(view)
@ -548,6 +549,11 @@ class HomeFragment : Fragment() {
nav(R.id.homeFragment, directions) nav(R.id.homeFragment, directions)
} }
private fun openSettingsScreen() {
val directions = HomeFragmentDirections.actionHomeFragmentToPrivateBrowsingFragment()
nav(R.id.homeFragment, directions)
}
private fun createHomeMenu(context: Context): HomeMenu { private fun createHomeMenu(context: Context): HomeMenu {
return HomeMenu(context) { return HomeMenu(context) {
when (it) { when (it) {

View File

@ -170,7 +170,7 @@ class SessionControlAdapter(
OnboardingManualSignInViewHolder.LAYOUT_ID -> OnboardingManualSignInViewHolder(view) OnboardingManualSignInViewHolder.LAYOUT_ID -> OnboardingManualSignInViewHolder(view)
OnboardingThemePickerViewHolder.LAYOUT_ID -> OnboardingThemePickerViewHolder(view) OnboardingThemePickerViewHolder.LAYOUT_ID -> OnboardingThemePickerViewHolder(view)
OnboardingTrackingProtectionViewHolder.LAYOUT_ID -> OnboardingTrackingProtectionViewHolder(view) OnboardingTrackingProtectionViewHolder.LAYOUT_ID -> OnboardingTrackingProtectionViewHolder(view)
OnboardingPrivateBrowsingViewHolder.LAYOUT_ID -> OnboardingPrivateBrowsingViewHolder(view) OnboardingPrivateBrowsingViewHolder.LAYOUT_ID -> OnboardingPrivateBrowsingViewHolder(view, interactor)
OnboardingPrivacyNoticeViewHolder.LAYOUT_ID -> OnboardingPrivacyNoticeViewHolder(view) OnboardingPrivacyNoticeViewHolder.LAYOUT_ID -> OnboardingPrivacyNoticeViewHolder(view)
OnboardingFinishViewHolder.LAYOUT_ID -> OnboardingFinishViewHolder(view, interactor) OnboardingFinishViewHolder.LAYOUT_ID -> OnboardingFinishViewHolder(view, interactor)
OnboardingWhatsNewViewHolder.LAYOUT_ID -> OnboardingWhatsNewViewHolder(view) OnboardingWhatsNewViewHolder.LAYOUT_ID -> OnboardingWhatsNewViewHolder(view)

View File

@ -139,6 +139,11 @@ interface SessionControlController {
*/ */
fun handleStartBrowsingClicked() fun handleStartBrowsingClicked()
/**
* @see [OnboardingInteractor.onOpenSettingsClicked]
*/
fun handleOpenSettingsClicked()
/** /**
* @see [CollectionInteractor.onToggleCollectionExpanded] * @see [CollectionInteractor.onToggleCollectionExpanded]
*/ */
@ -159,7 +164,8 @@ class DefaultSessionControlController(
private val invokePendingDeleteJobs: () -> Unit, private val invokePendingDeleteJobs: () -> Unit,
private val registerCollectionStorageObserver: () -> Unit, private val registerCollectionStorageObserver: () -> Unit,
private val scrollToTheTop: () -> Unit, private val scrollToTheTop: () -> Unit,
private val showDeleteCollectionPrompt: (tabCollection: TabCollection) -> Unit private val showDeleteCollectionPrompt: (tabCollection: TabCollection) -> Unit,
private val openSettingsScreen: () -> Unit
) : SessionControlController { ) : SessionControlController {
private val metrics: MetricController private val metrics: MetricController
get() = activity.components.analytics.metrics get() = activity.components.analytics.metrics
@ -358,6 +364,10 @@ class DefaultSessionControlController(
hideOnboarding() hideOnboarding()
} }
override fun handleOpenSettingsClicked() {
openSettingsScreen()
}
override fun handleToggleCollectionExpanded(collection: TabCollection, expand: Boolean) { override fun handleToggleCollectionExpanded(collection: TabCollection, expand: Boolean) {
store.dispatch(HomeFragmentAction.CollectionExpanded(collection, expand)) store.dispatch(HomeFragmentAction.CollectionExpanded(collection, expand))
} }

View File

@ -87,6 +87,11 @@ interface OnboardingInteractor {
* Hides the onboarding and navigates to Search. Called when a user clicks on the "Start Browsing" button. * Hides the onboarding and navigates to Search. Called when a user clicks on the "Start Browsing" button.
*/ */
fun onStartBrowsingClicked() fun onStartBrowsingClicked()
/**
* Hides the onboarding and navigates to Settings. Called when a user clicks on the "Open settings" button.
*/
fun onOpenSettingsClicked()
} }
/** /**
@ -262,6 +267,10 @@ class SessionControlInteractor(
controller.handleStartBrowsingClicked() controller.handleStartBrowsingClicked()
} }
override fun onOpenSettingsClicked() {
controller.handleOpenSettingsClicked()
}
override fun onToggleCollectionExpanded(collection: TabCollection, expand: Boolean) { override fun onToggleCollectionExpanded(collection: TabCollection, expand: Boolean) {
controller.handleToggleCollectionExpanded(collection, expand) controller.handleToggleCollectionExpanded(collection, expand)
} }

View File

@ -110,8 +110,8 @@ private fun onboardingAdapterItems(onboardingState: OnboardingState): List<Adapt
it.getString(R.string.onboarding_feature_section_header, appName) it.getString(R.string.onboarding_feature_section_header, appName)
}, },
AdapterItem.OnboardingWhatsNew, AdapterItem.OnboardingWhatsNew,
AdapterItem.OnboardingThemePicker,
AdapterItem.OnboardingTrackingProtection, AdapterItem.OnboardingTrackingProtection,
AdapterItem.OnboardingThemePicker,
AdapterItem.OnboardingPrivateBrowsing, AdapterItem.OnboardingPrivateBrowsing,
AdapterItem.OnboardingToolbarPositionPicker, AdapterItem.OnboardingToolbarPositionPicker,
AdapterItem.OnboardingPrivacyNotice, AdapterItem.OnboardingPrivacyNotice,

View File

@ -17,8 +17,12 @@ import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.onboarding_private_browsing.view.* import kotlinx.android.synthetic.main.onboarding_private_browsing.view.*
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.ext.setBounds import org.mozilla.fenix.ext.setBounds
import org.mozilla.fenix.home.sessioncontrol.OnboardingInteractor
class OnboardingPrivateBrowsingViewHolder(view: View) : RecyclerView.ViewHolder(view) { class OnboardingPrivateBrowsingViewHolder(
view: View,
private val interactor: OnboardingInteractor
) : RecyclerView.ViewHolder(view) {
init { init {
view.header_text.setOnboardingIcon(R.drawable.ic_onboarding_private_browsing) view.header_text.setOnboardingIcon(R.drawable.ic_onboarding_private_browsing)
@ -27,7 +31,7 @@ class OnboardingPrivateBrowsingViewHolder(view: View) : RecyclerView.ViewHolder(
val inlineIcon = PrivateBrowsingImageSpan( val inlineIcon = PrivateBrowsingImageSpan(
view.context, view.context,
R.drawable.ic_private_browsing, R.drawable.ic_private_browsing,
view.description_text.lineHeight view.description_text_once.lineHeight
) )
val text = SpannableString(view.context.getString(R.string.onboarding_private_browsing_description1)).apply { val text = SpannableString(view.context.getString(R.string.onboarding_private_browsing_description1)).apply {
@ -40,8 +44,11 @@ class OnboardingPrivateBrowsingViewHolder(view: View) : RecyclerView.ViewHolder(
) )
} }
view.description_text.text = text view.description_text_once.text = text
view.contentDescription = String.format(text.toString(), view.header_text.text) view.contentDescription = String.format(text.toString(), view.header_text.text)
view.open_settings_button.setOnClickListener {
interactor.onOpenSettingsClicked()
}
} }
class PrivateBrowsingImageSpan( class PrivateBrowsingImageSpan(

View File

@ -24,14 +24,53 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent" /> app:layout_constraintEnd_toEndOf="parent" />
<TextView <TextView
android:id="@+id/description_text" android:id="@+id/description_text_once"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAppearance="@style/Body14TextStyle" android:textAppearance="@style/Body14TextStyle"
android:layout_marginTop="14dp" android:layout_marginTop="14dp"
tools:text="@string/onboarding_private_browsing_description" tools:text="@string/onboarding_private_browsing_description1"
app:layout_constraintTop_toBottomOf="@id/header_text" app:layout_constraintTop_toBottomOf="@id/header_text"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" /> app:layout_constraintBottom_toTopOf="@id/description_text_always" />
<TextView
android:id="@+id/description_text_always"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/Body14TextStyle"
android:layout_marginTop="14dp"
android:text="@string/onboarding_private_browsing_always_description"
app:layout_constraintTop_toBottomOf="@id/description_text_once"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/open_settings_button" />
<FrameLayout
android:id="@+id/open_settings_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@drawable/button_background"
android:backgroundTint="?neutralFaded"
android:clickable="true"
android:focusable="true"
android:foreground="?android:attr/selectableItemBackground"
android:padding="10dp"
app:layout_constraintTop_toBottomOf="@id/description_text_always"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:clickable="false"
android:focusable="false"
android:textStyle="bold"
android:gravity="center"
android:text="@string/onboarding_private_browsing_button"
android:textColor="?primaryText"
android:textSize="14sp" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -92,6 +92,9 @@
<action <action
android:id="@+id/action_homeFragment_to_shareFragment" android:id="@+id/action_homeFragment_to_shareFragment"
app:destination="@id/shareFragment" /> app:destination="@id/shareFragment" />
<action
android:id="@+id/action_homeFragment_to_privateBrowsingFragment"
app:destination="@id/privateBrowsingFragment" />
</fragment> </fragment>
<fragment <fragment

View File

@ -47,6 +47,7 @@ class DefaultSessionControlControllerTest {
private val closeAllTabs: (isPrivateMode: Boolean) -> Unit = mockk(relaxed = true) private val closeAllTabs: (isPrivateMode: Boolean) -> Unit = mockk(relaxed = true)
private val getListOfTabs: () -> List<Tab> = { emptyList() } private val getListOfTabs: () -> List<Tab> = { emptyList() }
private val hideOnboarding: () -> Unit = mockk(relaxed = true) private val hideOnboarding: () -> Unit = mockk(relaxed = true)
private val openSettingsScreen: () -> Unit = mockk(relaxed = true)
private val invokePendingDeleteJobs: () -> Unit = mockk(relaxed = true) private val invokePendingDeleteJobs: () -> Unit = mockk(relaxed = true)
private val registerCollectionStorageObserver: () -> Unit = mockk(relaxed = true) private val registerCollectionStorageObserver: () -> Unit = mockk(relaxed = true)
private val scrollToTheTop: () -> Unit = mockk(relaxed = true) private val scrollToTheTop: () -> Unit = mockk(relaxed = true)
@ -81,7 +82,8 @@ class DefaultSessionControlControllerTest {
invokePendingDeleteJobs = invokePendingDeleteJobs, invokePendingDeleteJobs = invokePendingDeleteJobs,
registerCollectionStorageObserver = registerCollectionStorageObserver, registerCollectionStorageObserver = registerCollectionStorageObserver,
scrollToTheTop = scrollToTheTop, scrollToTheTop = scrollToTheTop,
showDeleteCollectionPrompt = showDeleteCollectionPrompt showDeleteCollectionPrompt = showDeleteCollectionPrompt,
openSettingsScreen = openSettingsScreen
) )
} }
@ -199,6 +201,12 @@ class DefaultSessionControlControllerTest {
verify { hideOnboarding() } verify { hideOnboarding() }
} }
@Test
fun handleOpenSettingsClicked() {
controller.handleOpenSettingsClicked()
verify { openSettingsScreen() }
}
@Test @Test
fun handleToggleCollectionExpanded() { fun handleToggleCollectionExpanded() {
val collection: TabCollection = mockk(relaxed = true) val collection: TabCollection = mockk(relaxed = true)