From 5e9b753acb639c7637f4a285e1df2e2a0a2047f6 Mon Sep 17 00:00:00 2001 From: Emma Malysz Date: Thu, 16 Jan 2020 10:03:18 -0800 Subject: [PATCH] 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. --- .../java/org/mozilla/fenix/HomeActivity.kt | 37 ++++++++++++++----- .../java/org/mozilla/fenix/ext/Fragment.kt | 4 +- .../library/bookmarks/BookmarkFragment.kt | 4 +- .../bookmarks/edit/EditBookmarkFragment.kt | 6 ++- .../search/AddSearchEngineFragment.kt | 3 +- .../SitePermissionsExceptionsFragment.kt | 4 +- app/src/main/res/layout/activity_home.xml | 14 +++---- .../main/res/layout/navigation_toolbar.xml | 16 ++++++++ 8 files changed, 61 insertions(+), 27 deletions(-) create mode 100644 app/src/main/res/layout/navigation_toolbar.xml diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index b1c21508b..1978fe0cd 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -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(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 diff --git a/app/src/main/java/org/mozilla/fenix/ext/Fragment.kt b/app/src/main/java/org/mozilla/fenix/ext/Fragment.kt index 081be3ddd..d27000e01 100644 --- a/app/src/main/java/org/mozilla/fenix/ext/Fragment.kt +++ b/app/src/main/java/org/mozilla/fenix/ext/Fragment.kt @@ -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() } /** diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt index 6bf29f4f6..1c4b817ee 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt @@ -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(), 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) diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt index a5ce19a11..0d3e0dd36 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt @@ -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(R.id.navigationToolbar) + val actionBar = (activity as HomeActivity).getSupportActionBarAndInflateIfNecessary() + val toolbar = activity.findViewById(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() { diff --git a/app/src/main/java/org/mozilla/fenix/settings/search/AddSearchEngineFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/search/AddSearchEngineFragment.kt index 71df0ca3e..525126695 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/search/AddSearchEngineFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/search/AddSearchEngineFragment.kt @@ -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) { diff --git a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsExceptionsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsExceptionsFragment.kt index 8b74ec428..66592e062 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsExceptionsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsExceptionsFragment.kt @@ -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?) { diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index f37e7e902..5dc4bdefa 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -10,16 +10,12 @@ android:id="@+id/rootContainer" tools:context=".HomeActivity"> - - + android:layout_height="56dp" /> + + + \ No newline at end of file