Skip to content

Commit

Permalink
[Paint Preview] Remove PaintPreviewWindowAndroidHelper class
Browse files Browse the repository at this point in the history
This CL removes the helper class in StartupPaintPreviewHelper that kept
the activity-specific variables and moves all the variables to
StartupPaintPreviewHelper instead.
UnownedUserDataSupplier is used to supply the StartupPaintPreviewHelper
objects per activity.

Bug: 1157482
Change-Id: If0bd603f051ae42a56b3f786e60cd2c8ad45ba62
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2584367
Commit-Queue: Yashar Dabiran <yashard@chromium.org>
Reviewed-by: Filip Gorski <fgorski@chromium.org>
Reviewed-by: Mehran Mahmoudi <mahmoudi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#859125}
  • Loading branch information
Yashar Dabiran authored and Chromium LUCI CQ committed Mar 2, 2021
1 parent 83e2f22 commit f9f096e
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 99 deletions.
1 change: 1 addition & 0 deletions chrome/android/chrome_java_sources.gni
Expand Up @@ -1061,6 +1061,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/page_info/PageInfoIPHController.java",
"java/src/org/chromium/chrome/browser/page_info/SiteSettingsHelper.java",
"java/src/org/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelper.java",
"java/src/org/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelperSupplier.java",
"java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmark.java",
"java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksFaviconThrottle.java",
"java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksProviderIterator.java",
Expand Down
Expand Up @@ -51,6 +51,7 @@
import org.chromium.base.supplier.OneshotSupplier;
import org.chromium.base.supplier.OneshotSupplierImpl;
import org.chromium.base.supplier.Supplier;
import org.chromium.base.supplier.UnownedUserDataSupplier;
import org.chromium.base.task.PostTask;
import org.chromium.cc.input.BrowserControlsState;
import org.chromium.chrome.R;
Expand Down Expand Up @@ -115,6 +116,7 @@
import org.chromium.chrome.browser.ntp.NewTabPageUma;
import org.chromium.chrome.browser.omnibox.OmniboxFocusReason;
import org.chromium.chrome.browser.paint_preview.StartupPaintPreviewHelper;
import org.chromium.chrome.browser.paint_preview.StartupPaintPreviewHelperSupplier;
import org.chromium.chrome.browser.partnercustomizations.PartnerBrowserCustomizations;
import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
import org.chromium.chrome.browser.profiles.Profile;
Expand Down Expand Up @@ -299,6 +301,9 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent

private NextTabPolicySupplier mNextTabPolicySupplier;

private final UnownedUserDataSupplier<StartupPaintPreviewHelper>
mStartupPaintPreviewHelperSupplier = new StartupPaintPreviewHelperSupplier();

private final OneshotSupplierImpl<LayoutStateProvider> mLayoutStateProviderOneshotSupplier =
new OneshotSupplierImpl<>();
// TODO(crbug.com/1108496): Removed after all usages has been migrated to LayoutStateProvider.
Expand Down Expand Up @@ -1512,6 +1517,8 @@ public void performPreInflationStartup() {
supportRequestWindowFeature(Window.FEATURE_ACTION_MODE_OVERLAY);

IncognitoTabHostRegistry.getInstance().register(mIncognitoTabHost);

mStartupPaintPreviewHelperSupplier.attach(getWindowAndroid().getUnownedUserDataHost());
}

@Override
Expand Down Expand Up @@ -1586,14 +1593,17 @@ public void performPostInflationStartup() {

mInactivityTracker = new ChromeInactivityTracker(
ChromePreferenceKeys.TABBED_ACTIVITY_LAST_BACKGROUNDED_TIME_MS_PREF);

assert getActivityTabStartupMetricsTracker() != null;
StartupPaintPreviewHelper.initialize(getWindowAndroid(), getOnCreateTimestampMs(),
getBrowserControlsManager(), getTabModelSelector(),
shouldShowTabSwitcherOnStart(), () -> {
return getToolbarManager() == null
? null
: getToolbarManager().getProgressBarCoordinator();
}, getActivityTabStartupMetricsTracker()::pagePreviewRendered);
if (StartupPaintPreviewHelper.isEnabled()) {
mStartupPaintPreviewHelperSupplier.set(new StartupPaintPreviewHelper(getWindowAndroid(),
getOnCreateTimestampMs(), getBrowserControlsManager(), getTabModelSelector(),
shouldShowTabSwitcherOnStart(), () -> {
return getToolbarManager() == null
? null
: getToolbarManager().getProgressBarCoordinator();
}, getActivityTabStartupMetricsTracker()::pagePreviewRendered));
}
}

@Override
Expand Down Expand Up @@ -2239,6 +2249,10 @@ public void onDestroyInternal() {
mStartSurfaceSupplier.get().destroy();
}

if (mStartupPaintPreviewHelperSupplier != null) {
mStartupPaintPreviewHelperSupplier.destroy();
}

IncognitoTabHostRegistry.getInstance().unregister(mIncognitoTabHost);

TabObscuringHandler tabObscuringHandler = getTabObscuringHandler();
Expand Down
Expand Up @@ -4,12 +4,9 @@

package org.chromium.chrome.browser.paint_preview;

import android.app.Activity;
import android.content.Context;
import android.os.SystemClock;

import org.chromium.base.ActivityState;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.Callback;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.browser.flags.BooleanCachedFieldTrialParameter;
Expand All @@ -29,9 +26,6 @@
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.WindowAndroid;

import java.util.HashMap;
import java.util.Map;

/**
* Glue code for the Paint Preview show-on-startup feature.
*/
Expand All @@ -47,20 +41,12 @@ public class StartupPaintPreviewHelper {
private static boolean sShouldShowOnRestore;

/**
* A map for keeping Activity-specific variables and classes. New entries are added on calls to
* {@link #initialize}. Entries are automatically removed when their respective Activity is
* destroyed.
*/
private static final Map<WindowAndroid, PaintPreviewWindowAndroidHelper>
sWindowAndroidHelperMap = new HashMap<>();

/**
* Sets whether a Paint Preview should attempt to be shown on restoration of a tab. If the
* feature is not enabled this is effectively a no-op.
* Tracks the activity creation time in ms from {@link SystemClock#elapsedRealtime}.
*/
public static void setShouldShowOnRestore(boolean shouldShowOnRestore) {
sShouldShowOnRestore = shouldShowOnRestore;
}
private final long mActivityCreationTime;
private final BrowserControlsManager mBrowserControlsManager;
private final Supplier<LoadProgressCoordinator> mProgressBarCoordinatorSupplier;
private final Callback<Long> mVisibleContentCallback;

/**
* Initializes the logic required for the Paint Preview on startup feature. Mainly, observes a
Expand All @@ -74,22 +60,21 @@ public static void setShouldShowOnRestore(boolean shouldShowOnRestore) {
* @param willShowStartSurface Whether the start surface will be shown.
* @param progressBarCoordinatorSupplier Supplier for the progress bar.
*/
public static void initialize(WindowAndroid windowAndroid, long activityCreationTime,
public StartupPaintPreviewHelper(WindowAndroid windowAndroid, long activityCreationTime,
BrowserControlsManager browserControlsManager, TabModelSelector tabModelSelector,
boolean willShowStartSurface,
Supplier<LoadProgressCoordinator> progressBarCoordinatorSupplier,
Callback<Long> visibleContentCallback) {
if (!CachedFeatureFlags.isEnabled(ChromeFeatureList.PAINT_PREVIEW_SHOW_ON_STARTUP)) return;
mActivityCreationTime = activityCreationTime;
mBrowserControlsManager = browserControlsManager;
mProgressBarCoordinatorSupplier = progressBarCoordinatorSupplier;
mVisibleContentCallback = visibleContentCallback;

if (MultiWindowUtils.getInstance().areMultipleChromeInstancesRunning(
windowAndroid.getContext().get())
|| willShowStartSurface) {
sShouldShowOnRestore = false;
}
sWindowAndroidHelperMap.put(windowAndroid,
new PaintPreviewWindowAndroidHelper(windowAndroid, activityCreationTime,
browserControlsManager, progressBarCoordinatorSupplier,
visibleContentCallback));

// TODO(crbug/1074428): verify this doesn't cause a memory leak if the user exits Chrome
// prior to onTabStateInitialized being called.
Expand Down Expand Up @@ -125,12 +110,29 @@ private boolean preventShowOnRestore(Tab tab) {
});
}

/**
* Checks whether the paint preview feature is enabled
* @return the feature availability
*/
public static boolean isEnabled() {
return CachedFeatureFlags.isEnabled(ChromeFeatureList.PAINT_PREVIEW_SHOW_ON_STARTUP);
}

/**
* Sets whether a Paint Preview should attempt to be shown on restoration of a tab. If the
* feature is not enabled this is effectively a no-op.
*/
public static void setShouldShowOnRestore(boolean shouldShowOnRestore) {
sShouldShowOnRestore = shouldShowOnRestore;
}

/**
* Attempts to display the Paint Preview representation for the given Tab.
*/
public static void showPaintPreviewOnRestore(Tab tab) {
if (!CachedFeatureFlags.isEnabled(ChromeFeatureList.PAINT_PREVIEW_SHOW_ON_STARTUP)
|| !sShouldShowOnRestore) {
StartupPaintPreviewHelper paintPreviewHelper =
StartupPaintPreviewHelperSupplier.from(tab.getWindowAndroid()).get();
if (paintPreviewHelper == null || !sShouldShowOnRestore) {
return;
}

Expand All @@ -139,26 +141,24 @@ public static void showPaintPreviewOnRestore(Tab tab) {
return;
}

PaintPreviewWindowAndroidHelper windowAndroidHelper =
sWindowAndroidHelperMap.get(tab.getWindowAndroid());
if (windowAndroidHelper == null) return;

sShouldShowOnRestore = false;
LoadProgressCoordinator loadProgressCoordinator =
paintPreviewHelper.mProgressBarCoordinatorSupplier.get();
Runnable progressSimulatorCallback = () -> {
if (windowAndroidHelper.getLoadProgressCoordinator() == null) return;
windowAndroidHelper.getLoadProgressCoordinator().simulateLoadProgressCompletion();
if (loadProgressCoordinator == null) return;
loadProgressCoordinator.simulateLoadProgressCompletion();
};
Callback<Boolean> progressPreventionCallback = (preventProgressbar) -> {
if (windowAndroidHelper.getLoadProgressCoordinator() == null) return;
windowAndroidHelper.getLoadProgressCoordinator().setPreventUpdates(preventProgressbar);
if (loadProgressCoordinator == null) return;
loadProgressCoordinator.setPreventUpdates(preventProgressbar);
};

StartupPaintPreview startupPaintPreview = new StartupPaintPreview(tab,
windowAndroidHelper.getBrowserControlsManager().getBrowserVisibilityDelegate(),
paintPreviewHelper.mBrowserControlsManager.getBrowserVisibilityDelegate(),
progressSimulatorCallback, progressPreventionCallback,
windowAndroidHelper.getVisibleContentCallback());
paintPreviewHelper.mVisibleContentCallback);
startupPaintPreview.setActivityCreationTimestampMs(
windowAndroidHelper.getActivityCreationTime());
paintPreviewHelper.mActivityCreationTime);
startupPaintPreview.setShouldRecordFirstPaint(
() -> UmaUtils.hasComeToForeground() && !UmaUtils.hasComeToBackground());
startupPaintPreview.setIsOfflinePage(() -> OfflinePageUtils.isOfflinePage(tab));
Expand All @@ -172,58 +172,4 @@ public void onFirstMeaningfulPaint(WebContents webContents, long navigationId,
PageLoadMetrics.addObserver(observer);
startupPaintPreview.show(() -> PageLoadMetrics.removeObserver(observer));
}

/**
* A helper class for keeping activity-specific variables and classes.
*/
private static class PaintPreviewWindowAndroidHelper
implements ApplicationStatus.ActivityStateListener {
/**
* Tracks the activity creation time in ms from {@link SystemClock#elapsedRealtime}.
*/
private final long mActivityCreationTime;
private final WindowAndroid mWindowAndroid;
private final BrowserControlsManager mBrowserControlsManager;
private final Supplier<LoadProgressCoordinator> mProgressBarCoordinatorSupplier;
private final Callback<Long> mVisibleContentCallback;

PaintPreviewWindowAndroidHelper(WindowAndroid windowAndroid, long activityCreationTime,
BrowserControlsManager browserControlsManager,
Supplier<LoadProgressCoordinator> progressBarCoordinatorSupplier,
Callback<Long> visibleContentCallback) {
mWindowAndroid = windowAndroid;
mActivityCreationTime = activityCreationTime;
mBrowserControlsManager = browserControlsManager;
mProgressBarCoordinatorSupplier = progressBarCoordinatorSupplier;
mVisibleContentCallback = visibleContentCallback;
ApplicationStatus.registerStateListenerForActivity(
this, mWindowAndroid.getActivity().get());
}

long getActivityCreationTime() {
return mActivityCreationTime;
}

LoadProgressCoordinator getLoadProgressCoordinator() {
return mProgressBarCoordinatorSupplier.get();
}

BrowserControlsManager getBrowserControlsManager() {
return mBrowserControlsManager;
}

Callback<Long> getVisibleContentCallback() {
return mVisibleContentCallback;
}

@Override
public void onActivityStateChange(Activity activity, @ActivityState int newState) {
if (newState == ActivityState.DESTROYED) {
sWindowAndroidHelperMap.remove(mWindowAndroid);
ApplicationStatus.unregisterActivityStateListener(this);
}
}
}

private StartupPaintPreviewHelper() {}
}
@@ -0,0 +1,36 @@
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.chrome.browser.paint_preview;

import org.chromium.base.UnownedUserDataKey;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.UnownedUserDataSupplier;
import org.chromium.ui.base.WindowAndroid;

/**
* A {@link UnownedUserDataSupplier} which manages the supplier and UnownedUserData for a
* {@link StartupPaintPreviewHelper}.
*/
public class StartupPaintPreviewHelperSupplier
extends UnownedUserDataSupplier<StartupPaintPreviewHelper> {
private static final UnownedUserDataKey<StartupPaintPreviewHelperSupplier> KEY =
new UnownedUserDataKey<>(StartupPaintPreviewHelperSupplier.class);

/**
* Return {@link StartupPaintPreviewHelper} supplier associated with the given {@link
* WindowAndroid}.
*/
public static ObservableSupplier<StartupPaintPreviewHelper> from(WindowAndroid windowAndroid) {
return KEY.retrieveDataFromHost(windowAndroid.getUnownedUserDataHost());
}

/**
* Constructs a StartupPaintPreviewHelperSupplier and attaches it to the {@link
* WindowAndroid}
*/
public StartupPaintPreviewHelperSupplier() {
super(KEY);
}
}

0 comments on commit f9f096e

Please sign in to comment.