| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.chrome.browser; | 5 package org.chromium.chrome.browser; |
| 6 | 6 |
| 7 import android.annotation.SuppressLint; | 7 import android.annotation.SuppressLint; |
| 8 import android.annotation.TargetApi; | 8 import android.annotation.TargetApi; |
| 9 import android.app.Activity; | 9 import android.app.Activity; |
| 10 import android.app.ActivityManager; | 10 import android.app.ActivityManager; |
| 11 import android.app.ActivityManager.AppTask; | 11 import android.app.ActivityManager.AppTask; |
| 12 import android.app.ActivityManager.RecentTaskInfo; | 12 import android.app.ActivityManager.RecentTaskInfo; |
| 13 import android.content.Context; | 13 import android.content.Context; |
| 14 import android.content.Intent; | 14 import android.content.Intent; |
| 15 import android.content.pm.PackageManager; |
| 15 import android.graphics.Color; | 16 import android.graphics.Color; |
| 16 import android.os.Build; | 17 import android.os.Build; |
| 17 import android.os.Bundle; | 18 import android.os.Bundle; |
| 18 import android.os.SystemClock; | 19 import android.os.SystemClock; |
| 19 import android.support.annotation.IntDef; | 20 import android.support.annotation.IntDef; |
| 20 import android.support.annotation.Nullable; | 21 import android.support.annotation.Nullable; |
| 21 import android.text.TextUtils; | 22 import android.text.TextUtils; |
| 22 import android.util.Pair; | 23 import android.util.Pair; |
| 23 import android.view.KeyEvent; | 24 import android.view.KeyEvent; |
| 24 import android.view.KeyboardShortcutGroup; | 25 import android.view.KeyboardShortcutGroup; |
| 25 import android.view.Menu; | 26 import android.view.Menu; |
| 26 import android.view.View; | 27 import android.view.View; |
| 27 import android.view.View.OnClickListener; | 28 import android.view.View.OnClickListener; |
| 28 import android.view.ViewGroup; | 29 import android.view.ViewGroup; |
| 29 import android.view.Window; | 30 import android.view.Window; |
| 30 import android.view.WindowManager; | 31 import android.view.WindowManager; |
| 31 import android.widget.FrameLayout; | 32 import android.widget.FrameLayout; |
| 32 | 33 |
| 33 import org.chromium.base.ActivityState; | 34 import org.chromium.base.ActivityState; |
| 34 import org.chromium.base.ApiCompatibilityUtils; | 35 import org.chromium.base.ApiCompatibilityUtils; |
| 35 import org.chromium.base.ApplicationStatus; | 36 import org.chromium.base.ApplicationStatus; |
| 36 import org.chromium.base.BuildInfo; | 37 import org.chromium.base.BuildInfo; |
| 37 import org.chromium.base.CommandLine; | 38 import org.chromium.base.CommandLine; |
| 39 import org.chromium.base.ContextUtils; |
| 38 import org.chromium.base.Log; | 40 import org.chromium.base.Log; |
| 39 import org.chromium.base.MemoryPressureListener; | 41 import org.chromium.base.MemoryPressureListener; |
| 40 import org.chromium.base.TraceEvent; | 42 import org.chromium.base.TraceEvent; |
| 41 import org.chromium.base.VisibleForTesting; | 43 import org.chromium.base.VisibleForTesting; |
| 42 import org.chromium.base.library_loader.LibraryLoader; | 44 import org.chromium.base.library_loader.LibraryLoader; |
| 43 import org.chromium.base.metrics.RecordHistogram; | 45 import org.chromium.base.metrics.RecordHistogram; |
| 44 import org.chromium.base.metrics.RecordUserAction; | 46 import org.chromium.base.metrics.RecordUserAction; |
| 45 import org.chromium.chrome.R; | 47 import org.chromium.chrome.R; |
| 46 import org.chromium.chrome.browser.IntentHandler.IntentHandlerDelegate; | 48 import org.chromium.chrome.browser.IntentHandler.IntentHandlerDelegate; |
| 47 import org.chromium.chrome.browser.IntentHandler.TabOpenType; | 49 import org.chromium.chrome.browser.IntentHandler.TabOpenType; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 import org.chromium.chrome.browser.ntp.NewTabPageUma; | 85 import org.chromium.chrome.browser.ntp.NewTabPageUma; |
| 84 import org.chromium.chrome.browser.ntp.snippets.SnippetsBridge; | 86 import org.chromium.chrome.browser.ntp.snippets.SnippetsBridge; |
| 85 import org.chromium.chrome.browser.ntp.snippets.SnippetsConfig; | 87 import org.chromium.chrome.browser.ntp.snippets.SnippetsConfig; |
| 86 import org.chromium.chrome.browser.omaha.OmahaClient; | 88 import org.chromium.chrome.browser.omaha.OmahaClient; |
| 87 import org.chromium.chrome.browser.omnibox.AutocompleteController; | 89 import org.chromium.chrome.browser.omnibox.AutocompleteController; |
| 88 import org.chromium.chrome.browser.partnercustomizations.HomepageManager; | 90 import org.chromium.chrome.browser.partnercustomizations.HomepageManager; |
| 89 import org.chromium.chrome.browser.partnercustomizations.PartnerBrowserCustomiza
tions; | 91 import org.chromium.chrome.browser.partnercustomizations.PartnerBrowserCustomiza
tions; |
| 90 import org.chromium.chrome.browser.preferences.ChromePreferenceManager; | 92 import org.chromium.chrome.browser.preferences.ChromePreferenceManager; |
| 91 import org.chromium.chrome.browser.preferences.PrefServiceBridge; | 93 import org.chromium.chrome.browser.preferences.PrefServiceBridge; |
| 92 import org.chromium.chrome.browser.preferences.datareduction.DataReductionPromoS
creen; | 94 import org.chromium.chrome.browser.preferences.datareduction.DataReductionPromoS
creen; |
| 95 import org.chromium.chrome.browser.profiles.Profile; |
| 93 import org.chromium.chrome.browser.signin.SigninPromoUtil; | 96 import org.chromium.chrome.browser.signin.SigninPromoUtil; |
| 94 import org.chromium.chrome.browser.snackbar.undo.UndoBarController; | 97 import org.chromium.chrome.browser.snackbar.undo.UndoBarController; |
| 95 import org.chromium.chrome.browser.suggestions.ContentSuggestionsActivity; | 98 import org.chromium.chrome.browser.suggestions.ContentSuggestionsActivity; |
| 96 import org.chromium.chrome.browser.tab.BrowserControlsVisibilityDelegate; | 99 import org.chromium.chrome.browser.tab.BrowserControlsVisibilityDelegate; |
| 97 import org.chromium.chrome.browser.tab.Tab; | 100 import org.chromium.chrome.browser.tab.Tab; |
| 98 import org.chromium.chrome.browser.tab.TabDelegateFactory; | 101 import org.chromium.chrome.browser.tab.TabDelegateFactory; |
| 99 import org.chromium.chrome.browser.tab.TabStateBrowserControlsVisibilityDelegate
; | 102 import org.chromium.chrome.browser.tab.TabStateBrowserControlsVisibilityDelegate
; |
| 100 import org.chromium.chrome.browser.tabmodel.ChromeTabCreator; | 103 import org.chromium.chrome.browser.tabmodel.ChromeTabCreator; |
| 101 import org.chromium.chrome.browser.tabmodel.TabModel; | 104 import org.chromium.chrome.browser.tabmodel.TabModel; |
| 102 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; | 105 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 121 import org.chromium.content_public.common.Referrer; | 124 import org.chromium.content_public.common.Referrer; |
| 122 import org.chromium.ui.base.DeviceFormFactor; | 125 import org.chromium.ui.base.DeviceFormFactor; |
| 123 import org.chromium.ui.base.PageTransition; | 126 import org.chromium.ui.base.PageTransition; |
| 124 import org.chromium.ui.base.WindowAndroid; | 127 import org.chromium.ui.base.WindowAndroid; |
| 125 import org.chromium.ui.widget.Toast; | 128 import org.chromium.ui.widget.Toast; |
| 126 | 129 |
| 127 import java.lang.annotation.Retention; | 130 import java.lang.annotation.Retention; |
| 128 import java.lang.annotation.RetentionPolicy; | 131 import java.lang.annotation.RetentionPolicy; |
| 129 import java.lang.ref.WeakReference; | 132 import java.lang.ref.WeakReference; |
| 130 import java.lang.reflect.Method; | 133 import java.lang.reflect.Method; |
| 134 import java.util.HashSet; |
| 131 import java.util.List; | 135 import java.util.List; |
| 136 import java.util.Set; |
| 132 | 137 |
| 133 /** | 138 /** |
| 134 * This is the main activity for ChromeMobile when not running in document mode.
All the tabs | 139 * This is the main activity for ChromeMobile when not running in document mode.
All the tabs |
| 135 * are accessible via a chrome specific tab switching UI. | 140 * are accessible via a chrome specific tab switching UI. |
| 136 */ | 141 */ |
| 137 public class ChromeTabbedActivity extends ChromeActivity implements OverviewMode
Observer { | 142 public class ChromeTabbedActivity extends ChromeActivity implements OverviewMode
Observer { |
| 138 | 143 |
| 139 private static final int FIRST_RUN_EXPERIENCE_RESULT = 101; | 144 private static final int FIRST_RUN_EXPERIENCE_RESULT = 101; |
| 140 | 145 |
| 141 @Retention(RetentionPolicy.SOURCE) | 146 @Retention(RetentionPolicy.SOURCE) |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 407 // LocaleManager can only function after the native library is loade
d. | 412 // LocaleManager can only function after the native library is loade
d. |
| 408 mLocaleManager = LocaleManager.getInstance(); | 413 mLocaleManager = LocaleManager.getInstance(); |
| 409 mLocaleManager.showSearchEnginePromoIfNeeded(this); | 414 mLocaleManager.showSearchEnginePromoIfNeeded(this); |
| 410 | 415 |
| 411 super.finishNativeInitialization(); | 416 super.finishNativeInitialization(); |
| 412 } finally { | 417 } finally { |
| 413 TraceEvent.end("ChromeTabbedActivity.finishNativeInitialization"); | 418 TraceEvent.end("ChromeTabbedActivity.finishNativeInitialization"); |
| 414 } | 419 } |
| 415 } | 420 } |
| 416 | 421 |
| 422 /** |
| 423 * Determine whether the incognito profile needs to be destroyed as part of
startup. This is |
| 424 * only needed on L+ when it is possible to swipe away tasks from Android re
cents without |
| 425 * killing the process. When this occurs, the normal incognito profile shut
down does not |
| 426 * happen, which can leave behind incognito cookies from an existing session
. |
| 427 */ |
| 428 @SuppressLint("NewApi") |
| 429 private boolean shouldDestroyIncognitoProfile() { |
| 430 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return false; |
| 431 |
| 432 Context context = ContextUtils.getApplicationContext(); |
| 433 ActivityManager manager = |
| 434 (ActivityManager) context.getSystemService(Context.ACTIVITY_SERV
ICE); |
| 435 PackageManager pm = context.getPackageManager(); |
| 436 |
| 437 Set<Integer> tabbedModeTaskIds = new HashSet<>(); |
| 438 for (AppTask task : manager.getAppTasks()) { |
| 439 RecentTaskInfo info = DocumentUtils.getTaskInfoFromTask(task); |
| 440 if (info == null) continue; |
| 441 String className = DocumentUtils.getTaskClassName(task, pm); |
| 442 |
| 443 if (TextUtils.equals(className, ChromeTabbedActivity.class.getName()
)) { |
| 444 tabbedModeTaskIds.add(info.id); |
| 445 } |
| 446 } |
| 447 |
| 448 if (tabbedModeTaskIds.size() == 0) { |
| 449 return Profile.getLastUsedProfile().hasOffTheRecordProfile(); |
| 450 } |
| 451 |
| 452 List<WeakReference<Activity>> activities = ApplicationStatus.getRunningA
ctivities(); |
| 453 for (int i = 0; i < activities.size(); i++) { |
| 454 Activity activity = activities.get(i).get(); |
| 455 if (activity == null) continue; |
| 456 tabbedModeTaskIds.remove(activity.getTaskId()); |
| 457 } |
| 458 |
| 459 // If all tabbed mode tasks listed in Android recents are alive, check t
o see if |
| 460 // any have incognito tabs exist. If all are alive and no tabs exist, w
e should ensure that |
| 461 // we delete the incognito profile if one is around still. |
| 462 if (tabbedModeTaskIds.size() == 0) { |
| 463 return TabWindowManager.getInstance().getIncognitoTabCount() == 0 |
| 464 && Profile.getLastUsedProfile().hasOffTheRecordProfile(); |
| 465 } |
| 466 |
| 467 // In this case, we have tabbed mode activities listed in recents that d
o not have an |
| 468 // active running activity associated with them. We can not accurately
get an incognito |
| 469 // tab count as we do not know if any incognito tabs are associated with
the yet unrestored |
| 470 // tabbed mode. Thus we do not proactivitely destroy the incognito prof
ile. |
| 471 return false; |
| 472 } |
| 473 |
| 417 @Override | 474 @Override |
| 418 public void onResumeWithNative() { | 475 public void onResumeWithNative() { |
| 419 super.onResumeWithNative(); | 476 super.onResumeWithNative(); |
| 420 | 477 |
| 421 CookiesFetcher.restoreCookies(this); | 478 if (shouldDestroyIncognitoProfile()) { |
| 479 Profile.getLastUsedProfile().getOffTheRecordProfile().destroyWhenApp
ropriate(); |
| 480 } else { |
| 481 CookiesFetcher.restoreCookies(this); |
| 482 } |
| 422 StartupMetrics.getInstance().recordHistogram(false); | 483 StartupMetrics.getInstance().recordHistogram(false); |
| 423 | 484 |
| 424 if (FeatureUtilities.isTabModelMergingEnabled()) { | 485 if (FeatureUtilities.isTabModelMergingEnabled()) { |
| 425 boolean inMultiWindowMode = MultiWindowUtils.getInstance().isInMulti
WindowMode(this); | 486 boolean inMultiWindowMode = MultiWindowUtils.getInstance().isInMulti
WindowMode(this); |
| 426 // Merge tabs if the activity is not in multi-window mode and mMerge
TabsOnResume is true | 487 // Merge tabs if the activity is not in multi-window mode and mMerge
TabsOnResume is true |
| 427 // or unset because the activity is just starting or was destroyed. | 488 // or unset because the activity is just starting or was destroyed. |
| 428 if (!inMultiWindowMode && (mMergeTabsOnResume == null || mMergeTabsO
nResume)) { | 489 if (!inMultiWindowMode && (mMergeTabsOnResume == null || mMergeTabsO
nResume)) { |
| 429 maybeMergeTabs(); | 490 maybeMergeTabs(); |
| 430 } | 491 } |
| 431 mMergeTabsOnResume = false; | 492 mMergeTabsOnResume = false; |
| (...skipping 1326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1758 | 1819 |
| 1759 ActivityManager manager = (ActivityManager) getSystemService(Context.ACT
IVITY_SERVICE); | 1820 ActivityManager manager = (ActivityManager) getSystemService(Context.ACT
IVITY_SERVICE); |
| 1760 for (AppTask task : manager.getAppTasks()) { | 1821 for (AppTask task : manager.getAppTasks()) { |
| 1761 RecentTaskInfo info = DocumentUtils.getTaskInfoFromTask(task); | 1822 RecentTaskInfo info = DocumentUtils.getTaskInfoFromTask(task); |
| 1762 if (info == null) continue; | 1823 if (info == null) continue; |
| 1763 if (info.id == sMergedInstanceTaskId) return true; | 1824 if (info.id == sMergedInstanceTaskId) return true; |
| 1764 } | 1825 } |
| 1765 return false; | 1826 return false; |
| 1766 } | 1827 } |
| 1767 } | 1828 } |
| OLD | NEW |