Chromium Code Reviews| 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 8d95ad3e75f9c5cde4349f2a6334b641040fcf05..5ed1c34f31aba2faac8582c86827b847b67dcebc 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; |
| @@ -159,9 +157,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; |
| /** |
| @@ -184,8 +179,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. |
| @@ -688,38 +682,58 @@ public abstract class ChromeActivity extends AsyncInitializationActivity |
| return false; |
| } |
| + /** |
| + * Overriding methods should call super.onDeferredStartup() last, after queuing their tasks in |
|
Yaron
2016/07/06 15:46:58
this is debatable, right? it depends on whether th
Peter Wen
2016/07/06 16:05:46
That's true, since the idle handler should not pre
|
| + * the DeferredStartupHandler. |
| + */ |
| @Override |
| protected void onDeferredStartup() { |
| + DeferredStartupHandler.getInstance().initDeferredStartupForApp(); |
| + initDeferredStartupForActivity(); |
| + DeferredStartupHandler.getInstance().runDeferredTasks(); |
| super.onDeferredStartup(); |
| - DeferredStartupHandler.getInstance().onDeferredStartupForApp(); |
| - onDeferredStartupForActivity(); |
| } |
| /** |
| * 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() { |
| + final ChromeActivity activity = this; |
| + |
| + 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 (activity.isActivityDestroyed()) return; |
| + BeamController.registerForBeam(activity, new BeamProvider() { |
| + @Override |
| + public String getTabUrlForBeam() { |
| + if (isOverlayVisible()) return null; |
| + if (getActivityTab() == null) return null; |
| + return getActivityTab().getUrl(); |
| + } |
| + }); |
| + |
| + UpdateMenuItemHelper.getInstance().checkForUpdateOnBackgroundThread(activity); |
| } |
| }); |
| - 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 (activity.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(activity)) { |
| + onDeferredStartupForMultiWindowMode(); |
| + } |
| + } |
| + }); |
| } |
| /** |
| @@ -1634,29 +1648,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(); |
| } |
| } |