Commit 3685ae8b authored by Sky Malice's avatar Sky Malice Committed by Commit Bot

[Feed] Record metric for time until draw upper UI of NTP.

Bug: 889106
Change-Id: I7c5fa213d3ca323b495d1e785605e9e1f1b6f986
Reviewed-on: https://chromium-review.googlesource.com/c/1385482Reviewed-by: default avatarSteven Holte <holte@chromium.org>
Reviewed-by: default avatarTheresa <twellington@chromium.org>
Commit-Queue: Sky Malice <skym@chromium.org>
Cr-Commit-Position: refs/heads/master@{#619816}
parent 2b8d04e8
...@@ -238,7 +238,7 @@ public class FeedNewTabPage extends NewTabPage { ...@@ -238,7 +238,7 @@ public class FeedNewTabPage extends NewTabPage {
mNewTabPageLayout.initialize(mNewTabPageManager, mTab, mTileGroupDelegate, mNewTabPageLayout.initialize(mNewTabPageManager, mTab, mTileGroupDelegate,
mSearchProviderHasLogo, mSearchProviderHasLogo,
TemplateUrlService.getInstance().isDefaultSearchEngineGoogle(), mMediator, TemplateUrlService.getInstance().isDefaultSearchEngineGoogle(), mMediator,
mContextMenuManager, mUiConfig); mContextMenuManager, mUiConfig, mConstructedTimeNs);
} }
@Override @Override
......
...@@ -101,7 +101,7 @@ public class NewTabPage ...@@ -101,7 +101,7 @@ public class NewTabPage
private LocationBarVoiceRecognitionHandler mVoiceRecognitionHandler; private LocationBarVoiceRecognitionHandler mVoiceRecognitionHandler;
// The timestamp at which the constructor was called. // The timestamp at which the constructor was called.
private final long mConstructedTimeNs; protected final long mConstructedTimeNs;
// The timestamp at which this NTP was last shown to the user. // The timestamp at which this NTP was last shown to the user.
private long mLastShownTimeNs; private long mLastShownTimeNs;
...@@ -360,7 +360,7 @@ public class NewTabPage ...@@ -360,7 +360,7 @@ public class NewTabPage
mNewTabPageView.initialize(mNewTabPageManager, mTab, mTileGroupDelegate, mNewTabPageView.initialize(mNewTabPageManager, mTab, mTileGroupDelegate,
mSearchProviderHasLogo, mSearchProviderHasLogo,
TemplateUrlService.getInstance().isDefaultSearchEngineGoogle(), TemplateUrlService.getInstance().isDefaultSearchEngineGoogle(),
getScrollPositionFromNavigationEntry()); getScrollPositionFromNavigationEntry(), mConstructedTimeNs);
} }
/** /**
......
...@@ -20,12 +20,15 @@ import android.view.MotionEvent; ...@@ -20,12 +20,15 @@ import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewStub; import android.view.ViewStub;
import android.view.ViewTreeObserver;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import org.chromium.base.Log;
import org.chromium.base.TraceEvent; import org.chromium.base.TraceEvent;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver; import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver;
import org.chromium.chrome.browser.compositor.layouts.LayoutManager; import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
...@@ -64,6 +67,8 @@ import org.chromium.components.feature_engagement.Tracker; ...@@ -64,6 +67,8 @@ import org.chromium.components.feature_engagement.Tracker;
import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.widget.ViewRectProvider; import org.chromium.ui.widget.ViewRectProvider;
import java.util.concurrent.TimeUnit;
/** /**
* Layout for the new tab page. This positions the page elements in the correct vertical positions. * Layout for the new tab page. This positions the page elements in the correct vertical positions.
* There are no separate phone and tablet UIs; this layout adapts based on the available space. * There are no separate phone and tablet UIs; this layout adapts based on the available space.
...@@ -215,11 +220,12 @@ public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer ...@@ -215,11 +220,12 @@ public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer
* @param scrollDelegate The delegate used to obtain information about scroll state. * @param scrollDelegate The delegate used to obtain information about scroll state.
* @param contextMenuManager The manager for long-press context menus. * @param contextMenuManager The manager for long-press context menus.
* @param uiConfig UiConfig that provides display information about this view. * @param uiConfig UiConfig that provides display information about this view.
* @param constructedTimeNs The timestamp at which the new tab page's construction started.
*/ */
public void initialize(NewTabPageManager manager, Tab tab, TileGroup.Delegate tileGroupDelegate, public void initialize(NewTabPageManager manager, Tab tab, TileGroup.Delegate tileGroupDelegate,
boolean searchProviderHasLogo, boolean searchProviderIsGoogle, boolean searchProviderHasLogo, boolean searchProviderIsGoogle,
ScrollDelegate scrollDelegate, ContextMenuManager contextMenuManager, ScrollDelegate scrollDelegate, ContextMenuManager contextMenuManager, UiConfig uiConfig,
UiConfig uiConfig) { long constructedTimeNs) {
TraceEvent.begin(TAG + ".initialize()"); TraceEvent.begin(TAG + ".initialize()");
mScrollDelegate = scrollDelegate; mScrollDelegate = scrollDelegate;
mTab = tab; mTab = tab;
...@@ -293,6 +299,22 @@ public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer ...@@ -293,6 +299,22 @@ public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer
} }
} }
// Use preDraw instead of draw because api level 25 and earlier doesn't seem to call the
// onDraw listener. Also, the onDraw version cannot be removed inside of the notification,
// which complicates this.
getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
Log.e(TAG, "SKYM onPreDraw()");
long timeToFirstDrawMs =
TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - constructedTimeNs);
RecordHistogram.recordTimesHistogram(
"NewTabPage.TimeToFirstDraw", timeToFirstDrawMs, TimeUnit.MILLISECONDS);
getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
});
manager.addDestructionObserver(NewTabPageLayout.this::onDestroy); manager.addDestructionObserver(NewTabPageLayout.this::onDestroy);
mInitialized = true; mInitialized = true;
......
...@@ -106,9 +106,11 @@ public class NewTabPageView extends FrameLayout { ...@@ -106,9 +106,11 @@ public class NewTabPageView extends FrameLayout {
* @param searchProviderHasLogo Whether the search provider has a logo. * @param searchProviderHasLogo Whether the search provider has a logo.
* @param searchProviderIsGoogle Whether the search provider is Google. * @param searchProviderIsGoogle Whether the search provider is Google.
* @param scrollPosition The adapter scroll position to initialize to. * @param scrollPosition The adapter scroll position to initialize to.
* @param constructedTimeNs The timestamp at which the new tab page's construction started.
*/ */
public void initialize(NewTabPageManager manager, Tab tab, TileGroup.Delegate tileGroupDelegate, public void initialize(NewTabPageManager manager, Tab tab, TileGroup.Delegate tileGroupDelegate,
boolean searchProviderHasLogo, boolean searchProviderIsGoogle, int scrollPosition) { boolean searchProviderHasLogo, boolean searchProviderIsGoogle, int scrollPosition,
long constructedTimeNs) {
TraceEvent.begin(TAG + ".initialize()"); TraceEvent.begin(TAG + ".initialize()");
mTab = tab; mTab = tab;
mManager = manager; mManager = manager;
...@@ -125,7 +127,8 @@ public class NewTabPageView extends FrameLayout { ...@@ -125,7 +127,8 @@ public class NewTabPageView extends FrameLayout {
mTab.getWindowAndroid().addContextMenuCloseListener(mContextMenuManager); mTab.getWindowAndroid().addContextMenuCloseListener(mContextMenuManager);
mNewTabPageLayout.initialize(manager, tab, tileGroupDelegate, searchProviderHasLogo, mNewTabPageLayout.initialize(manager, tab, tileGroupDelegate, searchProviderHasLogo,
searchProviderIsGoogle, mRecyclerView, mContextMenuManager, mUiConfig); searchProviderIsGoogle, mRecyclerView, mContextMenuManager, mUiConfig,
constructedTimeNs);
mSnapScrollHelper = new SnapScrollHelper(mManager, mNewTabPageLayout); mSnapScrollHelper = new SnapScrollHelper(mManager, mNewTabPageLayout);
mSnapScrollHelper.setView(mRecyclerView); mSnapScrollHelper.setView(mRecyclerView);
......
...@@ -69632,6 +69632,18 @@ uploading your change for review. ...@@ -69632,6 +69632,18 @@ uploading your change for review.
</summary> </summary>
</histogram> </histogram>
<histogram name="NewTabPage.TimeToFirstDraw" units="ms">
<owner>skym@chromium.org</owner>
<owner>twellington@chromium.org</owner>
<summary>
The time from when a new tab page is created until the first pre-draw call
on the main UI containing the search provider logo (if available), fake
search box, most visited tiles, etc. More specifically, this is the time
between NewTabPage's constructor and the first pre-draw pass on
NewTabPageLayout.
</summary>
</histogram>
<histogram name="NewTabPage.URLState" enum="NewTabURLState"> <histogram name="NewTabPage.URLState" enum="NewTabURLState">
<owner>treib@chromium.org</owner> <owner>treib@chromium.org</owner>
<summary> <summary>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment