1
0
Fork 0
fenix/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt

157 lines
6.0 KiB
Kotlin
Raw Normal View History

2019-01-09 23:22:58 +01:00
/* 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
2019-01-29 00:26:37 +01:00
import android.content.res.Resources
import android.graphics.drawable.BitmapDrawable
2019-01-09 23:22:58 +01:00
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.motion.widget.MotionLayout
import androidx.fragment.app.Fragment
import androidx.navigation.Navigation
import kotlinx.android.synthetic.main.fragment_home.*
import kotlinx.android.synthetic.main.fragment_home.view.*
import org.mozilla.fenix.HomeActivity
2019-01-09 23:22:58 +01:00
import org.mozilla.fenix.R
import org.mozilla.fenix.ThemeManager
import org.mozilla.fenix.ext.requireComponents
2019-01-28 17:46:39 +01:00
import org.mozilla.fenix.home.sessions.SessionsComponent
import org.mozilla.fenix.home.sessions.layoutComponents
import org.mozilla.fenix.isPrivate
2019-01-28 17:46:39 +01:00
import org.mozilla.fenix.mvi.ActionBusFactory
2019-01-29 00:26:37 +01:00
import kotlin.math.roundToInt
2019-01-09 23:22:58 +01:00
class HomeFragment : Fragment() {
override fun onCreateView(
2019-01-30 17:36:14 +01:00
inflater: LayoutInflater,
container: ViewGroup?,
2019-01-09 23:22:58 +01:00
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_home, container, false)
SessionsComponent(view.homeLayout, ActionBusFactory.get(this))
ActionBusFactory.get(this).logMergedObservables()
return view
2019-01-09 23:22:58 +01:00
}
2019-01-10 01:07:33 +01:00
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
(activity as AppCompatActivity).supportActionBar?.hide()
layoutComponents(view.homeLayout)
2019-01-29 00:26:37 +01:00
val searchIcon = requireComponents.search.searchEngineManager.getDefaultSearchEngine(requireContext()).let {
BitmapDrawable(resources, it.icon)
}
2019-01-25 17:11:43 +01:00
// Temporary so we can easily test settings
view.menuButton.setOnClickListener {
Navigation.findNavController(it).navigate(R.id.action_homeFragment_to_settingsFragment, null, null)
}
view.toolbar.setCompoundDrawablesWithIntrinsicBounds(searchIcon, null, null, null)
2019-01-30 17:36:14 +01:00
val roundToInt = (toolbarPaddingDp * Resources.getSystem().displayMetrics.density).roundToInt()
view.toolbar.compoundDrawablePadding = roundToInt
view.toolbar.setOnClickListener { it ->
2019-01-30 01:55:37 +01:00
Navigation.findNavController(it).navigate(R.id.action_homeFragment_to_searchFragment, null, null)
}
// There is currently an issue with visibility changes in ConstraintLayout 2.0.0-alpha3
// https://issuetracker.google.com/issues/122090772
// For now we're going to manually implement KeyTriggers.
view.homeLayout.setTransitionListener(object : MotionLayout.TransitionListener {
private val firstKeyTrigger = KeyTrigger(
firstKeyTriggerFrame,
{ view.toolbar_wrapper.transitionToDark() },
{ view.toolbar_wrapper.transitionToLight() }
)
private val secondKeyTrigger = KeyTrigger(
secondKeyTriggerFrame,
{ view.toolbar_wrapper.transitionToDarkNoBorder() },
{ view.toolbar_wrapper.transitionToDarkFromNoBorder() }
)
override fun onTransitionChange(
motionLayout: MotionLayout?,
startId: Int,
endId: Int,
progress: Float
) {
firstKeyTrigger.conditionallyFire(progress)
secondKeyTrigger.conditionallyFire(progress)
}
override fun onTransitionCompleted(p0: MotionLayout?, p1: Int) { }
})
view.toolbar_wrapper.isPrivateModeEnabled = (requireActivity() as HomeActivity)
.themeManager
.currentTheme
.isPrivate()
privateBrowsingButton.setOnClickListener {
// When we build out private mode we will want to handle this logic elsewhere.
(requireActivity() as HomeActivity).themeManager.apply {
val newTheme = when (this.currentTheme) {
ThemeManager.Theme.Light -> ThemeManager.Theme.Private
ThemeManager.Theme.Private -> ThemeManager.Theme.Light
}
setTheme(newTheme)
}
}
}
@SuppressWarnings("MagicNumber")
private class KeyTrigger(
frame: Int,
private val onPositiveCross: () -> Unit,
private val onNegativeCross: () -> Unit
) {
private val fireThreshhold = (frame + 0.5F) / 100.0F
private var negativeReset = false
private var positiveReset = false
private var lastFirePosition = 0f
private val triggerSlack = 0.1f
fun conditionallyFire(progress: Float) {
var offset: Float
var lastOffset: Float
if (negativeReset) {
offset = progress - fireThreshhold
lastOffset = lastFirePosition - fireThreshhold
if (offset * lastOffset < 0.0f && offset < 0.0f) {
onNegativeCross.invoke()
negativeReset = false
}
} else if (Math.abs(progress - fireThreshhold) > triggerSlack) {
negativeReset = true
}
if (positiveReset) {
offset = progress - fireThreshhold
lastOffset = lastFirePosition - fireThreshhold
if (offset * lastOffset < 0.0f && offset > 0.0f) {
onPositiveCross.invoke()
positiveReset = false
}
} else if (Math.abs(progress - fireThreshhold) > triggerSlack) {
positiveReset = true
}
lastFirePosition = progress
}
2019-01-10 01:07:33 +01:00
}
2019-01-30 17:36:14 +01:00
companion object {
const val toolbarPaddingDp = 12f
const val firstKeyTriggerFrame = 55
const val secondKeyTriggerFrame = 90
2019-01-30 17:36:14 +01:00
}
2019-01-09 23:22:58 +01:00
}