Closes #17443: IllegalStateException in startPostponedEnterTransition on HomeFragment

pull/274/head
Christian Sadilek 3 years ago
parent d9ff67f330
commit f8359e72bf

@ -5,9 +5,7 @@
package org.mozilla.fenix.browser
import android.content.Context
import android.os.Bundle
import android.os.StrictMode
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.content.res.AppCompatResources
@ -54,17 +52,6 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler {
private var openInAppOnboardingObserver: OpenInAppOnboardingObserver? = null
private var pwaOnboardingObserver: PwaOnboardingObserver? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val view = super.onCreateView(inflater, container, savedInstanceState)
startPostponedEnterTransition()
return view
}
@Suppress("LongMethod")
override fun initializeUI(view: View): Session? {
val context = requireContext()

@ -113,7 +113,6 @@ import org.mozilla.fenix.settings.SupportUtils
import org.mozilla.fenix.settings.SupportUtils.SumoTopic.HELP
import org.mozilla.fenix.settings.deletebrowsingdata.deleteAndQuit
import org.mozilla.fenix.theme.ThemeManager
import org.mozilla.fenix.utils.FragmentPreDrawManager
import org.mozilla.fenix.utils.ToolbarPopupWindow
import org.mozilla.fenix.utils.allowUndo
import org.mozilla.fenix.whatsnew.WhatsNew
@ -170,7 +169,6 @@ class HomeFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
postponeEnterTransition()
bundleArgs = args.toBundle()
lifecycleScope.launch(IO) {
if (!onboarding.userHasBeenOnboarded()) {
@ -339,19 +337,7 @@ class HomeFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
FragmentPreDrawManager(this).execute {
homeViewModel.layoutManagerState?.also { parcelable ->
sessionControlView!!.view.layoutManager?.onRestoreInstanceState(parcelable)
}
homeViewModel.layoutManagerState = null
// We have to delay so that the keyboard collapses and the view is resized before the
// animation from SearchFragment happens
delay(ANIMATION_DELAY)
}
observeSearchEngineChanges()
createHomeMenu(requireContext(), WeakReference(view.menuButton))
createTabCounterMenu(view)
@ -654,12 +640,6 @@ class HomeFragment : Fragment() {
}.show()
}
override fun onStop() {
super.onStop()
homeViewModel.layoutManagerState =
sessionControlView!!.view.layoutManager?.onSaveInstanceState()
}
override fun onResume() {
super.onResume()
if (browsingModeManager.mode == BrowsingMode.Private) {

@ -4,7 +4,6 @@
package org.mozilla.fenix.home
import android.os.Parcelable
import androidx.lifecycle.ViewModel
class HomeScreenViewModel : ViewModel() {
@ -13,8 +12,6 @@ class HomeScreenViewModel : ViewModel() {
*/
var sessionToDelete: String? = null
var layoutManagerState: Parcelable? = null
/**
* Used to remember if we need to scroll to top of the homeFragment's recycleView (top sites) see #8561
* */

@ -1,30 +0,0 @@
/* 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.utils
import androidx.core.view.doOnPreDraw
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch
/**
* Helper class that allows executing code immediately before [Fragment]s View being drawn.
*/
class FragmentPreDrawManager(
private val fragment: Fragment
) {
init {
fragment.postponeEnterTransition()
}
fun execute(code: suspend () -> Unit) {
fragment.view?.doOnPreDraw {
fragment.viewLifecycleOwner.lifecycleScope.launch {
code()
fragment.startPostponedEnterTransition()
}
}
}
}

@ -1,33 +0,0 @@
/* 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.utils
import androidx.core.view.OneShotPreDrawListener
import androidx.fragment.app.Fragment
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import kotlinx.coroutines.test.runBlockingTest
import org.junit.Test
@ObsoleteCoroutinesApi
@ExperimentalCoroutinesApi
class FragmentPreDrawManagerTest {
private fun doNothing() { /*noop*/ }
@Test
fun `execute doOnPreDraw`() {
runBlockingTest {
val fragmentMock = mockk<Fragment>(relaxed = true)
val fragmentPreDrawManager = FragmentPreDrawManager(fragmentMock)
val listener = OneShotPreDrawListener.add(fragmentMock.view!!) { mockk() }
verify { fragmentMock.postponeEnterTransition() }
fragmentPreDrawManager.execute { doNothing() }
verify { fragmentMock.view?.viewTreeObserver?.addOnPreDrawListener(listener) }
}
}
}
Loading…
Cancel
Save