| Index: chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
|
| index 229deff15cfccb787b2b3cec375b489803071936..b052938307e50d7adf4f85b135f131c5cf7cd8a3 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
|
| @@ -20,8 +20,6 @@ import android.graphics.drawable.Drawable;
|
| import android.net.Uri;
|
| import android.os.Build;
|
| import android.os.Bundle;
|
| -import android.os.Looper;
|
| -import android.os.MessageQueue;
|
| import android.os.SystemClock;
|
| import android.support.v7.app.AlertDialog;
|
| import android.util.DisplayMetrics;
|
| @@ -162,9 +160,6 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
|
| */
|
| static final int NO_CONTROL_CONTAINER = -1;
|
|
|
| - /** Delay in ms after first page load finishes before we initiate deferred startup actions. */
|
| - private static final int DEFERRED_STARTUP_DELAY_MS = 1000;
|
| -
|
| private static final int RECORD_MULTI_WINDOW_SCREEN_WIDTH_DELAY_MS = 5000;
|
|
|
| /**
|
| @@ -187,8 +182,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
|
|
|
| protected IntentHandler mIntentHandler;
|
|
|
| - /** Whether onDeferredStartup() has been run. */
|
| - private boolean mDeferredStartupNotified;
|
| + private boolean mDeferredStartupPosted;
|
|
|
| // The class cannot implement TouchExplorationStateChangeListener,
|
| // because it is only available for Build.VERSION_CODES.KITKAT and later.
|
| @@ -221,7 +215,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
|
|
|
| // A set of views obscuring all tabs. When this set is nonempty,
|
| // all tab content will be hidden from the accessibility tree.
|
| - private List<View> mViewsObscuringAllTabs = new ArrayList<View>();
|
| + private List<View> mViewsObscuringAllTabs = new ArrayList<>();
|
|
|
| private static AppMenuHandlerFactory sAppMenuHandlerFactory = new AppMenuHandlerFactory() {
|
| @Override
|
| @@ -694,38 +688,57 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
|
| return false;
|
| }
|
|
|
| + /**
|
| + * Overriding methods should queue tasks on the DeferredStartupHandler before or after calling
|
| + * super depending on whether the tasks should run before or after these ones.
|
| + */
|
| @Override
|
| protected void onDeferredStartup() {
|
| super.onDeferredStartup();
|
| - DeferredStartupHandler.getInstance().onDeferredStartupForApp();
|
| - onDeferredStartupForActivity();
|
| + initDeferredStartupForActivity();
|
| + DeferredStartupHandler.getInstance().initDeferredStartupForApp();
|
| + DeferredStartupHandler.getInstance().queueDeferredTasksOnIdleHandler();
|
| }
|
|
|
| /**
|
| * All deferred startup tasks that require the activity rather than the app should go here.
|
| */
|
| - private void onDeferredStartupForActivity() {
|
| - BeamController.registerForBeam(this, new BeamProvider() {
|
| + private void initDeferredStartupForActivity() {
|
| + DeferredStartupHandler.getInstance().addDeferredTask(new Runnable() {
|
| @Override
|
| - public String getTabUrlForBeam() {
|
| - if (isOverlayVisible()) return null;
|
| - if (getActivityTab() == null) return null;
|
| - return getActivityTab().getUrl();
|
| + public void run() {
|
| + if (isActivityDestroyed()) return;
|
| + BeamController.registerForBeam(ChromeActivity.this, new BeamProvider() {
|
| + @Override
|
| + public String getTabUrlForBeam() {
|
| + if (isOverlayVisible()) return null;
|
| + if (getActivityTab() == null) return null;
|
| + return getActivityTab().getUrl();
|
| + }
|
| + });
|
| +
|
| + UpdateMenuItemHelper.getInstance().checkForUpdateOnBackgroundThread(
|
| + ChromeActivity.this);
|
| }
|
| });
|
|
|
| - UpdateMenuItemHelper.getInstance().checkForUpdateOnBackgroundThread(this);
|
| -
|
| - if (mToolbarManager != null) {
|
| - String simpleName = getClass().getSimpleName();
|
| - RecordHistogram.recordTimesHistogram("MobileStartup.ToolbarInflationTime." + simpleName,
|
| - mInflateInitialLayoutDurationMs, TimeUnit.MILLISECONDS);
|
| - mToolbarManager.onDeferredStartup(getOnCreateTimestampMs(), simpleName);
|
| - }
|
| + DeferredStartupHandler.getInstance().addDeferredTask(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + if (isActivityDestroyed()) return;
|
| + if (mToolbarManager != null) {
|
| + String simpleName = getClass().getSimpleName();
|
| + RecordHistogram.recordTimesHistogram(
|
| + "MobileStartup.ToolbarInflationTime." + simpleName,
|
| + mInflateInitialLayoutDurationMs, TimeUnit.MILLISECONDS);
|
| + mToolbarManager.onDeferredStartup(getOnCreateTimestampMs(), simpleName);
|
| + }
|
|
|
| - if (MultiWindowUtils.getInstance().isInMultiWindowMode(this)) {
|
| - onDeferredStartupForMultiWindowMode();
|
| - }
|
| + if (MultiWindowUtils.getInstance().isInMultiWindowMode(ChromeActivity.this)) {
|
| + onDeferredStartupForMultiWindowMode();
|
| + }
|
| + }
|
| + });
|
| }
|
|
|
| /**
|
| @@ -1655,29 +1668,13 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
|
| }
|
|
|
| protected final void postDeferredStartupIfNeeded() {
|
| - if (!mDeferredStartupNotified) {
|
| + if (!mDeferredStartupPosted) {
|
| + mDeferredStartupPosted = true;
|
| RecordHistogram.recordLongTimesHistogram(
|
| - "UMA.Debug.EnableCrashUpload.PostDeferredStartUptime",
|
| - SystemClock.uptimeMillis() - UmaUtils.getMainEntryPointTime(),
|
| + "UMA.Debug.EnableCrashUpload.PostDeferredStartUptime2",
|
| + SystemClock.uptimeMillis() - UmaUtils.getForegroundStartTime(),
|
| TimeUnit.MILLISECONDS);
|
| -
|
| - // We want to perform deferred startup tasks a short time after the first page
|
| - // load completes, but only when the main thread Looper has become idle.
|
| - mHandler.postDelayed(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - if (!mDeferredStartupNotified && !isActivityDestroyed()) {
|
| - mDeferredStartupNotified = true;
|
| - Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
|
| - @Override
|
| - public boolean queueIdle() {
|
| - onDeferredStartup();
|
| - return false; // Remove this idle handler.
|
| - }
|
| - });
|
| - }
|
| - }
|
| - }, DEFERRED_STARTUP_DELAY_MS);
|
| + onDeferredStartup();
|
| }
|
| }
|
|
|
|
|