Browse Source

for #13479, added a VisualCompletenessQueue.kt class to handle all the functionality related to visual completeness

master^2
sraturi 11 months ago
committed by Michael Comella
parent
commit
5ccbca25c0
6 changed files with 46 additions and 21 deletions
  1. +5
    -5
      app/src/main/java/org/mozilla/fenix/FenixApplication.kt
  2. +4
    -13
      app/src/main/java/org/mozilla/fenix/HomeActivity.kt
  3. +2
    -1
      app/src/main/java/org/mozilla/fenix/components/PerformanceComponent.kt
  4. +1
    -1
      app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt
  5. +33
    -0
      app/src/main/java/org/mozilla/fenix/perf/VisualCompletenessQueue.kt
  6. +1
    -1
      app/src/main/java/org/mozilla/fenix/session/PerformanceActivityLifecycleCallbacks.kt

+ 5
- 5
app/src/main/java/org/mozilla/fenix/FenixApplication.kt View File

@@ -159,15 +159,15 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
}

private fun initVisualCompletenessQueueAndQueueTasks() {
val taskQueue = components.performance.visualCompletenessQueue
val queue = components.performance.visualCompletenessQueue.queue

fun initQueue() {
registerActivityLifecycleCallbacks(PerformanceActivityLifecycleCallbacks(taskQueue))
registerActivityLifecycleCallbacks(PerformanceActivityLifecycleCallbacks(queue))
}

fun queueInitExperiments() {
if (settings().isExperimentationEnabled) {
taskQueue.runIfReadyOrQueue {
queue.runIfReadyOrQueue {
Experiments.initialize(
applicationContext = applicationContext,
onExperimentsUpdated = {
@@ -188,7 +188,7 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
}

fun queueInitStorageAndServices() {
components.performance.visualCompletenessQueue.runIfReadyOrQueue {
components.performance.visualCompletenessQueue.queue.runIfReadyOrQueue {
GlobalScope.launch(Dispatchers.IO) {
logger.info("Running post-visual completeness tasks...")
logElapsedTime(logger, "Storage initialization") {
@@ -208,7 +208,7 @@ open class FenixApplication : LocaleAwareApplication(), Provider {

fun queueMetrics() {
if (SDK_INT >= Build.VERSION_CODES.O) { // required by StorageStatsMetrics.
taskQueue.runIfReadyOrQueue {
queue.runIfReadyOrQueue {
// Because it may be slow to capture the storage stats, it might be preferred to
// create a WorkManager task for this metric, however, I ran out of
// implementation time and WorkManager is harder to test.


+ 4
- 13
app/src/main/java/org/mozilla/fenix/HomeActivity.kt View File

@@ -21,7 +21,6 @@ import androidx.annotation.VisibleForTesting
import androidx.annotation.VisibleForTesting.PROTECTED
import androidx.appcompat.app.ActionBar
import androidx.appcompat.widget.Toolbar
import androidx.core.view.doOnPreDraw
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavDestination
import androidx.navigation.NavDirections
@@ -56,7 +55,6 @@ import mozilla.components.support.ktx.android.content.share
import mozilla.components.support.ktx.kotlin.isUrl
import mozilla.components.support.ktx.kotlin.toNormalizedUrl
import mozilla.components.support.locale.LocaleAwareAppCompatActivity
import mozilla.components.support.utils.RunWhenReadyQueue
import mozilla.components.support.utils.SafeIntent
import mozilla.components.support.utils.toSafeIntent
import mozilla.components.support.webextensions.WebExtensionPopupFeature
@@ -104,6 +102,7 @@ import org.mozilla.fenix.tabtray.TabTrayDialogFragmentDirections
import org.mozilla.fenix.theme.DefaultThemeManager
import org.mozilla.fenix.theme.ThemeManager
import org.mozilla.fenix.utils.BrowsersCache
import java.lang.ref.WeakReference

/**
* The main activity of the application. The application is primarily a single Activity (this one)
@@ -122,7 +121,6 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {

private var isVisuallyComplete = false

private var visualCompletenessQueue: RunWhenReadyQueue? = null
private var privateNotificationObserver: PrivateNotificationFeature<PrivateNotificationService>? = null

private var isToolbarInflated = false
@@ -164,13 +162,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {

// Must be after we set the content view
if (isVisuallyComplete) {
rootContainer.doOnPreDraw {
// This delay is temporary. We are delaying 5 seconds until the performance
// team can locate the real point of visual completeness.
it.postDelayed({
visualCompletenessQueue!!.ready()
}, delay)
}
components.performance.visualCompletenessQueue
.attachViewToRunVisualCompletenessQueueLater(WeakReference(rootContainer))
}

sessionObserver = UriOpenedObserver(this)
@@ -678,9 +671,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
* The root container is null at this point, so let the HomeActivity know that
* we are visually complete.
*/
fun postVisualCompletenessQueue(visualCompletenessQueue: RunWhenReadyQueue) {
fun setVisualCompletenessQueueReady() {
isVisuallyComplete = true
this.visualCompletenessQueue = visualCompletenessQueue
}

private fun captureSnapshotTelemetryMetrics() = CoroutineScope(Dispatchers.IO).launch {
@@ -717,7 +709,6 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
const val PRIVATE_BROWSING_MODE = "private_browsing_mode"
const val EXTRA_DELETE_PRIVATE_TABS = "notification_delete_and_open"
const val EXTRA_OPENED_FROM_NOTIFICATION = "notification_open"
const val delay = 5000L
const val START_IN_RECENTS_SCREEN = "start_in_recents_screen"

// PWA must have been used within last 30 days to be considered "recently used" for the


+ 2
- 1
app/src/main/java/org/mozilla/fenix/components/PerformanceComponent.kt View File

@@ -5,10 +5,11 @@
package org.mozilla.fenix.components

import mozilla.components.support.utils.RunWhenReadyQueue
import org.mozilla.fenix.perf.VisualCompletenessQueue

/**
* Component group for all functionality related to performance.
*/
class PerformanceComponent {
val visualCompletenessQueue by lazy { RunWhenReadyQueue() }
val visualCompletenessQueue by lazy { VisualCompletenessQueue(RunWhenReadyQueue()) }
}

+ 1
- 1
app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt View File

@@ -725,7 +725,7 @@ class GleanMetricsService(private val context: Context) : MetricsService {

// The code below doesn't need to execute immediately, so we'll add them to the visual
// completeness task queue to be run later.
context.components.performance.visualCompletenessQueue.runIfReadyOrQueue {
context.components.performance.visualCompletenessQueue.queue.runIfReadyOrQueue {
// We have to initialize Glean *on* the main thread, because it registers lifecycle
// observers. However, the activation ping must be sent *off* of the main thread,
// because it calls Google ad APIs that must be called *off* of the main thread.


+ 33
- 0
app/src/main/java/org/mozilla/fenix/perf/VisualCompletenessQueue.kt View File

@@ -0,0 +1,33 @@
/* 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.perf

import android.view.View
import androidx.core.view.doOnPreDraw
import mozilla.components.support.utils.RunWhenReadyQueue
import java.lang.ref.WeakReference

/**
* class for all functionality related to Visual completeness queue
*/
class VisualCompletenessQueue(val queue: RunWhenReadyQueue) {
@Suppress("MagicNumber")
val delay = 5000L

/**
*
* @param containerWeakReference a weak reference to the root view of a view hierarchy. Weak
* reference is to avoid memory leak.
*/
fun attachViewToRunVisualCompletenessQueueLater(containerWeakReference: WeakReference<View>) {
containerWeakReference.get()?.doOnPreDraw {
// This delay is temporary. We are delaying 5 seconds until the performance
// team can locate the real point of visual completeness.
it.postDelayed({
queue.ready()
}, delay)
}
}
}

+ 1
- 1
app/src/main/java/org/mozilla/fenix/session/PerformanceActivityLifecycleCallbacks.kt View File

@@ -51,7 +51,7 @@ class PerformanceActivityLifecycleCallbacks(
if (activity is HomeActivity) {
// We should delay the visualCompletenessQueue when reaching the HomeActivity
// to ensure all tasks are delayed until after visual completeness
activity.postVisualCompletenessQueue(visualCompletenessQueue)
activity.setVisualCompletenessQueueReady()
} else if (shouldStartVisualCompletenessQueueImmediately()) {
// If we do not go through the home activity, we have to start the tasks
// immediately to avoid spending time implementing it.


Loading…
Cancel
Save