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
parent
f93e141d52
commit
5e9b753acb
|
@ -13,6 +13,7 @@ import androidx.annotation.CallSuper
|
||||||
import androidx.annotation.IdRes
|
import androidx.annotation.IdRes
|
||||||
import androidx.annotation.VisibleForTesting
|
import androidx.annotation.VisibleForTesting
|
||||||
import androidx.annotation.VisibleForTesting.PROTECTED
|
import androidx.annotation.VisibleForTesting.PROTECTED
|
||||||
|
import androidx.appcompat.app.ActionBar
|
||||||
import androidx.appcompat.widget.Toolbar
|
import androidx.appcompat.widget.Toolbar
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.navigation.NavDestination
|
import androidx.navigation.NavDestination
|
||||||
|
@ -20,6 +21,7 @@ import androidx.navigation.NavDirections
|
||||||
import androidx.navigation.fragment.NavHostFragment
|
import androidx.navigation.fragment.NavHostFragment
|
||||||
import androidx.navigation.ui.AppBarConfiguration
|
import androidx.navigation.ui.AppBarConfiguration
|
||||||
import androidx.navigation.ui.NavigationUI
|
import androidx.navigation.ui.NavigationUI
|
||||||
|
import kotlinx.android.synthetic.main.activity_home.*
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import mozilla.components.browser.search.SearchEngine
|
import mozilla.components.browser.search.SearchEngine
|
||||||
import mozilla.components.browser.session.Session
|
import mozilla.components.browser.session.Session
|
||||||
|
@ -73,6 +75,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity() {
|
||||||
|
|
||||||
private val hotStartMonitor = HotStartPerformanceMonitor()
|
private val hotStartMonitor = HotStartPerformanceMonitor()
|
||||||
|
|
||||||
|
private var isToolbarInflated = false
|
||||||
|
|
||||||
private val navHost by lazy {
|
private val navHost by lazy {
|
||||||
supportFragmentManager.findFragmentById(R.id.container) as NavHostFragment
|
supportFragmentManager.findFragmentById(R.id.container) as NavHostFragment
|
||||||
}
|
}
|
||||||
|
@ -94,7 +98,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity() {
|
||||||
setupThemeAndBrowsingMode(getModeFromIntentOrLastKnown(intent))
|
setupThemeAndBrowsingMode(getModeFromIntentOrLastKnown(intent))
|
||||||
setContentView(R.layout.activity_home)
|
setContentView(R.layout.activity_home)
|
||||||
Performance.instrumentColdStartupToHomescreenTime(this)
|
Performance.instrumentColdStartupToHomescreenTime(this)
|
||||||
setupToolbarAndNavigation()
|
|
||||||
|
externalSourceIntentProcessors.any { it.process(intent, navHost.navController, this.intent) }
|
||||||
|
|
||||||
if (intent.getBooleanExtra(EXTRA_FINISH_ONBOARDING, false)) {
|
if (intent.getBooleanExtra(EXTRA_FINISH_ONBOARDING, false)) {
|
||||||
FenixOnboarding(this).finish()
|
FenixOnboarding(this).finish()
|
||||||
|
@ -220,17 +225,29 @@ open class HomeActivity : LocaleAwareAppCompatActivity() {
|
||||||
themeManager.applyStatusBarTheme(this)
|
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
|
// Add ids to this that we don't want to have a toolbar back button
|
||||||
val appBarConfiguration = AppBarConfiguration.Builder().build()
|
if (!isToolbarInflated) {
|
||||||
val navigationToolbar = findViewById<Toolbar>(R.id.navigationToolbar)
|
val navigationToolbar = navigationToolbarStub.inflate() as Toolbar
|
||||||
setSupportActionBar(navigationToolbar)
|
|
||||||
NavigationUI.setupWithNavController(navigationToolbar, navHost.navController, appBarConfiguration)
|
|
||||||
navigationToolbar.setNavigationOnClickListener {
|
|
||||||
onBackPressed()
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
protected open fun getIntentSessionId(intent: SafeIntent): String? = null
|
||||||
|
|
|
@ -12,6 +12,8 @@ import androidx.navigation.NavDirections
|
||||||
import androidx.navigation.NavOptions
|
import androidx.navigation.NavOptions
|
||||||
import androidx.navigation.Navigator
|
import androidx.navigation.Navigator
|
||||||
import androidx.navigation.fragment.NavHostFragment.findNavController
|
import androidx.navigation.fragment.NavHostFragment.findNavController
|
||||||
|
import kotlinx.android.synthetic.main.fragment_home.*
|
||||||
|
import org.mozilla.fenix.HomeActivity
|
||||||
import org.mozilla.fenix.components.Components
|
import org.mozilla.fenix.components.Components
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -40,7 +42,7 @@ fun Fragment.getPreferenceKey(@StringRes resourceId: Int): String = getString(re
|
||||||
*/
|
*/
|
||||||
fun Fragment.showToolbar(title: String) {
|
fun Fragment.showToolbar(title: String) {
|
||||||
(requireActivity() as AppCompatActivity).title = title
|
(requireActivity() as AppCompatActivity).title = title
|
||||||
(requireActivity() as AppCompatActivity).supportActionBar?.show()
|
(activity as HomeActivity).getSupportActionBarAndInflateIfNecessary().show()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -11,7 +11,6 @@ import android.view.MenuInflater
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
|
||||||
import androidx.fragment.app.activityViewModels
|
import androidx.fragment.app.activityViewModels
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
|
@ -37,6 +36,7 @@ import mozilla.components.concept.sync.AuthType
|
||||||
import mozilla.components.concept.sync.OAuthAccount
|
import mozilla.components.concept.sync.OAuthAccount
|
||||||
import mozilla.components.lib.state.ext.consumeFrom
|
import mozilla.components.lib.state.ext.consumeFrom
|
||||||
import mozilla.components.support.base.feature.UserInteractionHandler
|
import mozilla.components.support.base.feature.UserInteractionHandler
|
||||||
|
import org.mozilla.fenix.HomeActivity
|
||||||
import org.mozilla.fenix.R
|
import org.mozilla.fenix.R
|
||||||
import org.mozilla.fenix.components.FenixSnackbar
|
import org.mozilla.fenix.components.FenixSnackbar
|
||||||
import org.mozilla.fenix.components.StoreProvider
|
import org.mozilla.fenix.components.StoreProvider
|
||||||
|
@ -126,7 +126,7 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), UserInteractionHan
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
|
|
||||||
(activity as? AppCompatActivity)?.supportActionBar?.show()
|
(activity as HomeActivity).getSupportActionBarAndInflateIfNecessary().show()
|
||||||
context?.components?.backgroundServices?.accountManager?.let { accountManager ->
|
context?.components?.backgroundServices?.accountManager?.let { accountManager ->
|
||||||
sharedViewModel.observeAccountManager(accountManager, owner = this)
|
sharedViewModel.observeAccountManager(accountManager, owner = this)
|
||||||
accountManager.register(refreshOnSignInListener, owner = this)
|
accountManager.register(refreshOnSignInListener, owner = this)
|
||||||
|
|
|
@ -34,6 +34,7 @@ import mozilla.components.concept.storage.BookmarkNode
|
||||||
import mozilla.components.concept.storage.BookmarkNodeType
|
import mozilla.components.concept.storage.BookmarkNodeType
|
||||||
import mozilla.components.support.ktx.android.content.getColorFromAttr
|
import mozilla.components.support.ktx.android.content.getColorFromAttr
|
||||||
import mozilla.components.support.ktx.android.view.hideKeyboard
|
import mozilla.components.support.ktx.android.view.hideKeyboard
|
||||||
|
import org.mozilla.fenix.HomeActivity
|
||||||
import org.mozilla.fenix.R
|
import org.mozilla.fenix.R
|
||||||
import org.mozilla.fenix.components.FenixSnackbar
|
import org.mozilla.fenix.components.FenixSnackbar
|
||||||
import org.mozilla.fenix.components.metrics.Event
|
import org.mozilla.fenix.components.metrics.Event
|
||||||
|
@ -113,14 +114,15 @@ class EditBookmarkFragment : Fragment(R.layout.fragment_edit_bookmark) {
|
||||||
|
|
||||||
private fun initToolbar() {
|
private fun initToolbar() {
|
||||||
val activity = activity as? AppCompatActivity
|
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 {
|
context?.let {
|
||||||
toolbar?.setToolbarColors(
|
toolbar?.setToolbarColors(
|
||||||
foreground = it.getColorFromAttr(R.attr.primaryText),
|
foreground = it.getColorFromAttr(R.attr.primaryText),
|
||||||
background = it.getColorFromAttr(R.attr.foundation)
|
background = it.getColorFromAttr(R.attr.foundation)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
activity?.supportActionBar?.show()
|
actionBar.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
|
|
|
@ -28,6 +28,7 @@ import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import mozilla.components.browser.search.SearchEngine
|
import mozilla.components.browser.search.SearchEngine
|
||||||
|
import org.mozilla.fenix.HomeActivity
|
||||||
import org.mozilla.fenix.R
|
import org.mozilla.fenix.R
|
||||||
import org.mozilla.fenix.components.FenixSnackbar
|
import org.mozilla.fenix.components.FenixSnackbar
|
||||||
import org.mozilla.fenix.components.metrics.Event
|
import org.mozilla.fenix.components.metrics.Event
|
||||||
|
@ -118,7 +119,7 @@ class AddSearchEngineFragment : Fragment(), CompoundButton.OnCheckedChangeListen
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
(activity as AppCompatActivity).title = getString(R.string.search_engine_add_custom_search_engine_title)
|
(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) {
|
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
||||||
|
|
|
@ -15,7 +15,6 @@ import android.widget.Button
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.lifecycle.Observer
|
import androidx.lifecycle.Observer
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
|
@ -29,6 +28,7 @@ import kotlinx.coroutines.Dispatchers.IO
|
||||||
import kotlinx.coroutines.Dispatchers.Main
|
import kotlinx.coroutines.Dispatchers.Main
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import mozilla.components.feature.sitepermissions.SitePermissions
|
import mozilla.components.feature.sitepermissions.SitePermissions
|
||||||
|
import org.mozilla.fenix.HomeActivity
|
||||||
import org.mozilla.fenix.R
|
import org.mozilla.fenix.R
|
||||||
import org.mozilla.fenix.ext.components
|
import org.mozilla.fenix.ext.components
|
||||||
import org.mozilla.fenix.ext.loadIntoView
|
import org.mozilla.fenix.ext.loadIntoView
|
||||||
|
@ -44,7 +44,7 @@ class SitePermissionsExceptionsFragment :
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
(activity as AppCompatActivity).supportActionBar?.show()
|
(activity as HomeActivity).getSupportActionBarAndInflateIfNecessary().show()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onViewCreated(rootView: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(rootView: View, savedInstanceState: Bundle?) {
|
||||||
|
|
|
@ -10,16 +10,12 @@
|
||||||
android:id="@+id/rootContainer"
|
android:id="@+id/rootContainer"
|
||||||
tools:context=".HomeActivity">
|
tools:context=".HomeActivity">
|
||||||
|
|
||||||
<androidx.appcompat.widget.Toolbar
|
<ViewStub
|
||||||
android:id="@+id/navigationToolbar"
|
android:id="@+id/navigationToolbarStub"
|
||||||
|
android:inflatedId="@id/navigationToolbar"
|
||||||
|
android:layout="@layout/navigation_toolbar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="56dp"
|
android:layout_height="56dp" />
|
||||||
app:titleMarginStart="16dp"
|
|
||||||
app:titleMarginEnd="16dp"
|
|
||||||
app:titleTextAppearance="@style/ToolbarTitleTextStyle"
|
|
||||||
android:background="?above"
|
|
||||||
android:elevation="8dp">
|
|
||||||
</androidx.appcompat.widget.Toolbar>
|
|
||||||
|
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/container"
|
android:id="@+id/container"
|
||||||
|
|
|
@ -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>
|
Loading…
Reference in New Issue