Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(123)

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java

Issue 2658213003: Revert "Revert of Destroy incognito profile from close all incognito notification. (patchset #1 id:… (Closed)
Patch Set: Fix compilation from signature change on branch Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationService.java » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationService.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698