| Index: chrome/android/java/src/org/chromium/chrome/browser/UpgradeActivity.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/UpgradeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/UpgradeActivity.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e203e67c9ed33799caa51c1172f5e495906b6760
|
| --- /dev/null
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/UpgradeActivity.java
|
| @@ -0,0 +1,136 @@
|
| +// Copyright 2016 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;
|
| +
|
| +import android.content.Context;
|
| +import android.content.Intent;
|
| +import android.os.Bundle;
|
| +import android.os.Handler;
|
| +import android.os.Looper;
|
| +import android.support.v7.app.AppCompatActivity;
|
| +
|
| +import org.chromium.base.ApiCompatibilityUtils;
|
| +import org.chromium.base.ApplicationStatus;
|
| +import org.chromium.chrome.R;
|
| +import org.chromium.chrome.browser.tabmodel.DocumentModeAssassin;
|
| +import org.chromium.chrome.browser.tabmodel.DocumentModeAssassin.DocumentModeAssassinObserver;
|
| +import org.chromium.chrome.browser.util.IntentUtils;
|
| +
|
| +/**
|
| + * Activity that interrupts launch and shows that users are being upgraded to a new version of
|
| + * Chrome.
|
| + *
|
| + * TODO(dfalcantara): Do we need to worry about onNewIntent()?
|
| + */
|
| +public class UpgradeActivity extends AppCompatActivity {
|
| + public static final String EXTRA_INTENT_TO_REFIRE =
|
| + "org.chromium.chrome.browser.INTENT_TO_REFIRE";
|
| +
|
| + private static final long MIN_MS_TO_DISPLAY_ACTIVITY = 500;
|
| + private static final long INVALID_TIMESTAMP = -1;
|
| +
|
| + private final Handler mHandler;
|
| + private final DocumentModeAssassinObserver mObserver;
|
| +
|
| + private Intent mIntentToFireAfterUpgrade;
|
| + private long mStartTimestamp = INVALID_TIMESTAMP;
|
| + private boolean mIsDestroyed;
|
| +
|
| + public static void launchInstance(Context context, Intent originalIntent) {
|
| + Intent intent = new Intent();
|
| + intent.setClass(context, UpgradeActivity.class);
|
| + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
| + intent.putExtra(UpgradeActivity.EXTRA_INTENT_TO_REFIRE, originalIntent);
|
| + context.startActivity(intent);
|
| + }
|
| +
|
| + public UpgradeActivity() {
|
| + mHandler = new Handler(Looper.getMainLooper());
|
| +
|
| + mObserver = new DocumentModeAssassinObserver() {
|
| + @Override
|
| + public void onStageChange(int newStage) {
|
| + if (newStage != DocumentModeAssassin.STAGE_DONE) return;
|
| + DocumentModeAssassin.getInstance().removeObserver(this);
|
| +
|
| + // Always post to avoid any issues that could arise from firing the Runnable
|
| + // while other Observers are being alerted.
|
| + long msElapsed = System.currentTimeMillis() - mStartTimestamp;
|
| + long msRemaining = Math.max(0, MIN_MS_TO_DISPLAY_ACTIVITY - msElapsed);
|
| + mHandler.postDelayed(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + continueApplicationLaunch();
|
| + }
|
| + }, msRemaining);
|
| + }
|
| + };
|
| + }
|
| +
|
| + @Override
|
| + protected void onCreate(Bundle savedInstanceState) {
|
| + super.onCreate(savedInstanceState);
|
| + mIntentToFireAfterUpgrade = getIntentToFireAfterUpgrade(getIntent());
|
| + setContentView(R.layout.upgrade_activity);
|
| +
|
| + DocumentModeAssassin assassin = DocumentModeAssassin.getInstance();
|
| + if (!DocumentModeAssassin.isMigrationNecessary()
|
| + || assassin.getStage() == DocumentModeAssassin.STAGE_DONE) {
|
| + // Migration finished in the background.
|
| + continueApplicationLaunch();
|
| + } else {
|
| + // Kick off migration if it hasn't already started.
|
| + assassin.addObserver(mObserver);
|
| + assassin.migrateFromDocumentToTabbedMode();
|
| + }
|
| + }
|
| +
|
| + @Override
|
| + protected void onResume() {
|
| + super.onResume();
|
| +
|
| + // Set the timestamp after the Activity is visible to avoid shortening the timer.
|
| + if (mStartTimestamp == INVALID_TIMESTAMP) mStartTimestamp = System.currentTimeMillis();
|
| + }
|
| +
|
| + @Override
|
| + protected void onDestroy() {
|
| + mIsDestroyed = true;
|
| + super.onDestroy();
|
| + }
|
| +
|
| + private static Intent getIntentToFireAfterUpgrade(Intent activityIntent) {
|
| + Intent intentToFire = null;
|
| +
|
| + // Retrieve the Intent that caused the user to end up on the upgrade pathway.
|
| + if (activityIntent != null) {
|
| + intentToFire = (Intent) IntentUtils.safeGetParcelableExtra(
|
| + activityIntent, EXTRA_INTENT_TO_REFIRE);
|
| + }
|
| +
|
| + // If there's no Intent to refire, send them to the browser.
|
| + if (intentToFire == null) {
|
| + intentToFire = new Intent(Intent.ACTION_MAIN);
|
| + intentToFire.setPackage(ApplicationStatus.getApplicationContext().getPackageName());
|
| + }
|
| +
|
| + // Fire the Intent into a different task so that this one can go away.
|
| + intentToFire.addFlags(
|
| + Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
|
| +
|
| + return intentToFire;
|
| + }
|
| +
|
| + private void continueApplicationLaunch() {
|
| + if (mIsDestroyed) return;
|
| +
|
| + ApiCompatibilityUtils.finishAndRemoveTask(this);
|
| + if (mIntentToFireAfterUpgrade != null && ApplicationStatus.hasVisibleActivities()) {
|
| + startActivity(mIntentToFireAfterUpgrade);
|
| + overridePendingTransition(android.R.anim.fade_in, 0);
|
| + mIntentToFireAfterUpgrade = null;
|
| + }
|
| + }
|
| +}
|
|
|