1
0
Fork 0

For #7473, delay inflation of toolbar

Improve performance of HomeActivity.onCreate by delaying this inflation.
We use a ViewStub and inflate the first time the actionbar is accessed.
master
Emma Malysz 2020-01-16 10:03:18 -08:00 committed by Emma Malysz
parent f93e141d52
commit 5e9b753acb
8 changed files with 61 additions and 27 deletions

View File

@ -13,6 +13,7 @@ import androidx.annotation.CallSuper
import androidx.annotation.IdRes
import androidx.annotation.VisibleForTesting
import androidx.annotation.VisibleForTesting.PROTECTED
import androidx.appcompat.app.ActionBar
import androidx.appcompat.widget.Toolbar
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavDestination
@ -20,6 +21,7 @@ import androidx.navigation.NavDirections
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.NavigationUI
import kotlinx.android.synthetic.main.activity_home.*
import kotlinx.coroutines.launch
import mozilla.components.browser.search.SearchEngine
import mozilla.components.browser.session.Session
@ -73,6 +75,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity() {
private val hotStartMonitor = HotStartPerformanceMonitor()
private var isToolbarInflated = false
private val navHost by lazy {
supportFragmentManager.findFragmentById(R.id.container) as NavHostFragment
}
@ -94,7 +98,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity() {
setupThemeAndBrowsingMode(getModeFromIntentOrLastKnown(intent))
setContentView(R.layout.activity_home)
Performance.instrumentColdStartupToHomescreenTime(this)
setupToolbarAndNavigation()
externalSourceIntentProcessors.any { it.process(intent, navHost.navController, this.intent) }
if (intent.getBooleanExtra(EXTRA_FINISH_ONBOARDING, false)) {
FenixOnboarding(this).finish()
@ -220,17 +225,29 @@ open class HomeActivity : LocaleAwareAppCompatActivity() {
themeManager.applyStatusBarTheme(this)
}
private fun setupToolbarAndNavigation() {
/**
* Returns the [supportActionBar], inflating it if necessary.
* Everyone should call this instead of supportActionBar.
*/
fun getSupportActionBarAndInflateIfNecessary(): ActionBar {
// Add ids to this that we don't want to have a toolbar back button
val appBarConfiguration = AppBarConfiguration.Builder().build()
val navigationToolbar = findViewById<Toolbar>(R.id.navigationToolbar)
setSupportActionBar(navigationToolbar)
NavigationUI.setupWithNavController(navigationToolbar, navHost.navController, appBarConfiguration)
navigationToolbar.setNavigationOnClickListener {
onBackPressed()
}
if (!isToolbarInflated) {
val navigationToolbar = navigationToolbarStub.inflate() as Toolbar
externalSourceIntentProcessors.any { it.process(intent, navHost.navController, this.intent) }
setSupportActionBar(navigationToolbar)
NavigationUI.setupWithNavController(
navigationToolbar,
navHost.navController,
AppBarConfiguration.Builder().build()
)
navigationToolbar.setNavigationOnClickListener {
onBackPressed()
}
isToolbarInflated = true
}
return supportActionBar!!
}
protected open fun getIntentSessionId(intent: SafeIntent): String? = null

View File

@ -12,6 +12,8 @@ import androidx.navigation.NavDirections
import androidx.navigation.NavOptions
import androidx.navigation.Navigator
import androidx.navigation.fragment.NavHostFragment.findNavController
import kotlinx.android.synthetic.main.fragment_home.*
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.components.Components
/**
@ -40,7 +42,7 @@ fun Fragment.getPreferenceKey(@StringRes resourceId: Int): String = getString(re
*/
fun Fragment.showToolbar(title: String) {
(requireActivity() as AppCompatActivity).title = title
(requireActivity() as AppCompatActivity).supportActionBar?.show()
(activity as HomeActivity).getSupportActionBarAndInflateIfNecessary().show()
}
/**

View File

@ -11,7 +11,6 @@ import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
@ -37,6 +36,7 @@ import mozilla.components.concept.sync.AuthType
import mozilla.components.concept.sync.OAuthAccount
import mozilla.components.lib.state.ext.consumeFrom
import mozilla.components.support.base.feature.UserInteractionHandler
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.components.FenixSnackbar
import org.mozilla.fenix.components.StoreProvider
@ -126,7 +126,7 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), UserInteractionHan
override fun onResume() {
super.onResume()
(activity as? AppCompatActivity)?.supportActionBar?.show()
(activity as HomeActivity).getSupportActionBarAndInflateIfNecessary().show()
context?.components?.backgroundServices?.accountManager?.let { accountManager ->
sharedViewModel.observeAccountManager(accountManager, owner = this)
accountManager.register(refreshOnSignInListener, owner = this)

View File

@ -34,6 +34,7 @@ import mozilla.components.concept.storage.BookmarkNode
import mozilla.components.concept.storage.BookmarkNodeType
import mozilla.components.support.ktx.android.content.getColorFromAttr
import mozilla.components.support.ktx.android.view.hideKeyboard
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.components.FenixSnackbar
import org.mozilla.fenix.components.metrics.Event
@ -113,14 +114,15 @@ class EditBookmarkFragment : Fragment(R.layout.fragment_edit_bookmark) {
private fun initToolbar() {
val activity = activity as? AppCompatActivity
val toolbar = activity?.findViewById<Toolbar>(R.id.navigationToolbar)
val actionBar = (activity as HomeActivity).getSupportActionBarAndInflateIfNecessary()
val toolbar = activity.findViewById<Toolbar>(R.id.navigationToolbar)
context?.let {
toolbar?.setToolbarColors(
foreground = it.getColorFromAttr(R.attr.primaryText),
background = it.getColorFromAttr(R.attr.foundation)
)
}
activity?.supportActionBar?.show()
actionBar.show()
}
override fun onPause() {

View File

@ -28,6 +28,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import mozilla.components.browser.search.SearchEngine
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.components.FenixSnackbar
import org.mozilla.fenix.components.metrics.Event
@ -118,7 +119,7 @@ class AddSearchEngineFragment : Fragment(), CompoundButton.OnCheckedChangeListen
override fun onResume() {
super.onResume()
(activity as AppCompatActivity).title = getString(R.string.search_engine_add_custom_search_engine_title)
(activity as AppCompatActivity).supportActionBar?.show()
(activity as HomeActivity).getSupportActionBarAndInflateIfNecessary().show()
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {

View File

@ -15,7 +15,6 @@ import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope
@ -29,6 +28,7 @@ import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Dispatchers.Main
import kotlinx.coroutines.launch
import mozilla.components.feature.sitepermissions.SitePermissions
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.loadIntoView
@ -44,7 +44,7 @@ class SitePermissionsExceptionsFragment :
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
(activity as AppCompatActivity).supportActionBar?.show()
(activity as HomeActivity).getSupportActionBarAndInflateIfNecessary().show()
}
override fun onViewCreated(rootView: View, savedInstanceState: Bundle?) {

View File

@ -10,16 +10,12 @@
android:id="@+id/rootContainer"
tools:context=".HomeActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/navigationToolbar"
<ViewStub
android:id="@+id/navigationToolbarStub"
android:inflatedId="@id/navigationToolbar"
android:layout="@layout/navigation_toolbar"
android:layout_width="match_parent"
android:layout_height="56dp"
app:titleMarginStart="16dp"
app:titleMarginEnd="16dp"
app:titleTextAppearance="@style/ToolbarTitleTextStyle"
android:background="?above"
android:elevation="8dp">
</androidx.appcompat.widget.Toolbar>
android:layout_height="56dp" />
<fragment
android:id="@+id/container"

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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/. -->
<androidx.appcompat.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/navigationToolbar"
android:layout_width="0dp"
android:layout_height="0dp"
app:titleMarginStart="16dp"
app:titleMarginEnd="16dp"
app:titleTextAppearance="@style/ToolbarTitleTextStyle"
android:background="?above"
android:elevation="8dp">
</androidx.appcompat.widget.Toolbar>