Revision control
Copy as Markdown
/* 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
package org.mozilla.focus.fragment
import android.content.Context
import android.os.Bundle
import android.transition.TransitionInflater
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.viewpager.widget.ViewPager
import mozilla.components.support.utils.StatusBarUtils
import org.mozilla.focus.GleanMetrics.Onboarding
import org.mozilla.focus.R
import org.mozilla.focus.databinding.FragmentFirstrunBinding
import org.mozilla.focus.ext.requireComponents
import org.mozilla.focus.ext.settings
import org.mozilla.focus.firstrun.FirstrunPagerAdapter
import org.mozilla.focus.state.AppAction
import kotlin.math.abs
class FirstrunFragment : Fragment(), View.OnClickListener {
private var _binding: FragmentFirstrunBinding? = null
private val binding get() = _binding!!
override fun onAttach(context: Context) {
super.onAttach(context)
val transition =
TransitionInflater.from(context).inflateTransition(R.transition.firstrun_exit)
exitTransition = transition
// We will send a telemetry event whenever a new firstrun page is shown. However this page
// listener won't fire for the initial page we are showing. So we are going to firing here.
Onboarding.pageDisplayed.record(Onboarding.PageDisplayedExtra(0))
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View {
_binding = FragmentFirstrunBinding.inflate(inflater, container, false)
setupPager()
binding.tabs.setupWithViewPager(binding.pager, true)
binding.skip.setOnClickListener(this)
return binding.root
}
override fun onClick(view: View) {
val currentItem = binding.pager.currentItem
when (view.id) {
R.id.next -> {
binding.pager.currentItem = binding.pager.currentItem + 1
Onboarding.nextButtonTapped.record(Onboarding.NextButtonTappedExtra(currentItem))
}
R.id.skip -> {
finishFirstrun()
Onboarding.skipButtonTapped.record(Onboarding.SkipButtonTappedExtra(currentItem))
}
R.id.finish -> {
finishFirstrun()
Onboarding.finishButtonTapped.record(Onboarding.FinishButtonTappedExtra(currentItem))
}
else -> throw IllegalArgumentException("Unknown view")
}
}
@Suppress("MagicNumber")
private fun setupPager() {
val firstRunPagerAdapter = FirstrunPagerAdapter(requireContext(), this)
binding.pager.apply {
contentDescription = firstRunPagerAdapter.getPageAccessibilityDescription(0)
isFocusable = true
setPageTransformer(true) { page, position ->
page.alpha = 1 - 0.5f * abs(position)
}
clipToPadding = false
adapter = firstRunPagerAdapter
addOnPageChangeListener(
object : ViewPager.OnPageChangeListener {
override fun onPageSelected(position: Int) {
Onboarding.pageDisplayed.record(Onboarding.PageDisplayedExtra(0))
contentDescription =
firstRunPagerAdapter.getPageAccessibilityDescription(position)
}
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int,
) {}
override fun onPageScrollStateChanged(state: Int) {}
},
)
}
}
private fun finishFirstrun() {
requireContext().settings.isFirstRun = false
val selectedTabId = requireComponents.store.state.selectedTabId
requireComponents.appStore.dispatch(AppAction.FinishFirstRun(selectedTabId))
}
override fun onResume() {
super.onResume()
StatusBarUtils.getStatusBarHeight(binding.background) { statusBarHeight ->
binding.background.setPadding(
0,
statusBarHeight,
0,
0,
)
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
companion object {
const val FRAGMENT_TAG = "firstrun"
fun create(): FirstrunFragment {
val arguments = Bundle()
val fragment = FirstrunFragment()
fragment.arguments = arguments
return fragment
}
}
}