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.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
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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?) {
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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