Commit 8f7a51a1 authored by tedchoc's avatar tedchoc Committed by Commit bot

Split out foreground session tracking from the application code.

BUG=560466

Review-Url: https://codereview.chromium.org/2348583002
Cr-Commit-Position: refs/heads/master@{#419340}
parent d42e1b0d
...@@ -19,7 +19,8 @@ import org.chromium.chrome.browser.util.IntentUtils; ...@@ -19,7 +19,8 @@ import org.chromium.chrome.browser.util.IntentUtils;
/** /**
* Kills and (optionally) restarts the main Chrome process, then immediately kills itself. * Kills and (optionally) restarts the main Chrome process, then immediately kills itself.
* *
* Starting this Activity should only be done by the {@link ChromeLifetimeController}, and requires * Starting this Activity should only be done by the
* {@link org.chromium.chrome.browser.init.ChromeLifetimeController}, and requires
* passing in the process ID (the Intent should have the value of Process#myPid() as an extra). * passing in the process ID (the Intent should have the value of Process#myPid() as an extra).
* *
* This Activity runs on a separate process from the main Chrome browser and cannot see the main * This Activity runs on a separate process from the main Chrome browser and cannot see the main
...@@ -27,14 +28,14 @@ import org.chromium.chrome.browser.util.IntentUtils; ...@@ -27,14 +28,14 @@ import org.chromium.chrome.browser.util.IntentUtils;
* AlarmManager, which requires a minimum alarm duration of 5 seconds: https://crbug.com/515919. * AlarmManager, which requires a minimum alarm duration of 5 seconds: https://crbug.com/515919.
*/ */
public class BrowserRestartActivity extends Activity { public class BrowserRestartActivity extends Activity {
static final String ACTION_START_WATCHDOG = public static final String ACTION_START_WATCHDOG =
"org.chromium.chrome.browser.BrowserRestartActivity.start_watchdog"; "org.chromium.chrome.browser.BrowserRestartActivity.start_watchdog";
static final String ACTION_KILL_PROCESS = public static final String ACTION_KILL_PROCESS =
"org.chromium.chrome.browser.BrowserRestartActivity.kill_process"; "org.chromium.chrome.browser.BrowserRestartActivity.kill_process";
static final String EXTRA_MAIN_PID = public static final String EXTRA_MAIN_PID =
"org.chromium.chrome.browser.BrowserRestartActivity.main_pid"; "org.chromium.chrome.browser.BrowserRestartActivity.main_pid";
static final String EXTRA_RESTART = public static final String EXTRA_RESTART =
"org.chromium.chrome.browser.BrowserRestartActivity.restart"; "org.chromium.chrome.browser.BrowserRestartActivity.restart";
private static final String TAG = "BrowserRestartActivity"; private static final String TAG = "BrowserRestartActivity";
......
...@@ -580,7 +580,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity ...@@ -580,7 +580,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
public void onStartWithNative() { public void onStartWithNative() {
super.onStartWithNative(); super.onStartWithNative();
UpdateMenuItemHelper.getInstance().onStart(); UpdateMenuItemHelper.getInstance().onStart();
getChromeApplication().onStartWithNative(); ChromeActivitySessionTracker.getInstance().onStartWithNative();
if (GSAState.getInstance(this).isGsaAvailable()) { if (GSAState.getInstance(this).isGsaAvailable()) {
mGSAServiceClient = new GSAServiceClient(this); mGSAServiceClient = new GSAServiceClient(this);
......
// 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.app.Activity;
import android.content.SharedPreferences;
import android.provider.Settings;
import org.chromium.base.ApplicationState;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.ApplicationStatus.ApplicationStateListener;
import org.chromium.base.ContextUtils;
import org.chromium.base.ThreadUtils;
import org.chromium.base.VisibleForTesting;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.chrome.browser.accessibility.FontSizePrefs;
import org.chromium.chrome.browser.browsing_data.BrowsingDataType;
import org.chromium.chrome.browser.browsing_data.TimePeriod;
import org.chromium.chrome.browser.metrics.UmaUtils;
import org.chromium.chrome.browser.metrics.VariationsSession;
import org.chromium.chrome.browser.notifications.NotificationPlatformBridge;
import org.chromium.chrome.browser.partnercustomizations.PartnerBrowserCustomizations;
import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.share.ShareHelper;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.util.FeatureUtilities;
import org.chromium.content.browser.ChildProcessLauncher;
import java.lang.ref.WeakReference;
import java.util.Locale;
/**
* Tracks the foreground session state for the Chrome activities.
*/
public class ChromeActivitySessionTracker {
private static final String PREF_LOCALE = "locale";
private static ChromeActivitySessionTracker sInstance;
private final PowerBroadcastReceiver mPowerBroadcastReceiver = new PowerBroadcastReceiver();
// Used to trigger variation changes (such as seed fetches) upon application foregrounding.
private VariationsSession mVariationsSession;
private ChromeApplication mApplication;
private boolean mIsInitialized;
private boolean mIsStarted;
private boolean mIsFinishedCachingNativeFlags;
/**
* @return The activity session tracker for Chrome.
*/
public static ChromeActivitySessionTracker getInstance() {
ThreadUtils.assertOnUiThread();
if (sInstance == null) sInstance = new ChromeActivitySessionTracker();
return sInstance;
}
/**
* Constructor exposed for extensibility only.
* @see #getInstance()
*/
protected ChromeActivitySessionTracker() {
mApplication = (ChromeApplication) ContextUtils.getApplicationContext();
}
/**
* Handle any initialization that occurs once native has been loaded.
*/
public void initializeWithNative() {
ThreadUtils.assertOnUiThread();
if (mIsInitialized) return;
mIsInitialized = true;
assert !mIsStarted;
ApplicationStatus.registerApplicationStateListener(createApplicationStateListener());
mVariationsSession = mApplication.createVariationsSession();
}
/**
* Each top-level activity (those extending {@link ChromeActivity}) should call this during
* its onStart phase. When called for the first time, this marks the beginning of a foreground
* session and calls onForegroundSessionStart(). Subsequent calls are noops until
* onForegroundSessionEnd() is called, to handle changing top-level Chrome activities in one
* foreground session.
*/
public void onStartWithNative() {
ThreadUtils.assertOnUiThread();
if (mIsStarted) return;
mIsStarted = true;
assert mIsInitialized;
onForegroundSessionStart();
cacheNativeFlags();
}
/**
* Called when a top-level Chrome activity (ChromeTabbedActivity, FullscreenActivity) is
* started in foreground. It will not be called again when other Chrome activities take over
* (see onStart()), that is, when correct activity calls startActivity() for another Chrome
* activity.
*/
private void onForegroundSessionStart() {
UmaUtils.recordForegroundStartTime();
ChildProcessLauncher.onBroughtToForeground();
updatePasswordEchoState();
FontSizePrefs.getInstance(mApplication).onSystemFontScaleChanged();
updateAcceptLanguages();
mVariationsSession.start(mApplication);
mPowerBroadcastReceiver.onForegroundSessionStart();
// Track the ratio of Chrome startups that are caused by notification clicks.
// TODO(johnme): Add other reasons (and switch to recordEnumeratedHistogram).
RecordHistogram.recordBooleanHistogram(
"Startup.BringToForegroundReason",
NotificationPlatformBridge.wasNotificationRecentlyClicked());
}
/**
* Called when last of Chrome activities is stopped, ending the foreground session. This will
* not be called when a Chrome activity is stopped because another Chrome activity takes over.
* This is ensured by ActivityStatus, which switches to track new activity when its started and
* will not report the old one being stopped (see createStateListener() below).
*/
private void onForegroundSessionEnd() {
if (!mIsStarted) return;
ChromeApplication.flushPersistentData();
mIsStarted = false;
mPowerBroadcastReceiver.onForegroundSessionEnd();
ChildProcessLauncher.onSentToBackground();
IntentHandler.clearPendingReferrer();
IntentHandler.clearPendingIncognitoUrl();
int totalTabCount = 0;
for (WeakReference<Activity> reference : ApplicationStatus.getRunningActivities()) {
Activity activity = reference.get();
if (activity instanceof ChromeActivity) {
TabModelSelector tabModelSelector =
((ChromeActivity) activity).getTabModelSelector();
if (tabModelSelector != null) {
totalTabCount += tabModelSelector.getTotalTabCount();
}
}
}
RecordHistogram.recordCountHistogram(
"Tab.TotalTabCount.BeforeLeavingApp", totalTabCount);
}
private void onForegroundActivityDestroyed() {
if (ApplicationStatus.isEveryActivityDestroyed()) {
// These will all be re-initialized when a new Activity starts / upon next use.
PartnerBrowserCustomizations.destroy();
ShareHelper.clearSharedImages();
}
}
private ApplicationStateListener createApplicationStateListener() {
return new ApplicationStateListener() {
@Override
public void onApplicationStateChange(int newState) {
if (newState == ApplicationState.HAS_STOPPED_ACTIVITIES) {
onForegroundSessionEnd();
} else if (newState == ApplicationState.HAS_DESTROYED_ACTIVITIES) {
onForegroundActivityDestroyed();
}
}
};
}
/**
* Update the accept languages after changing Android locale setting. Doing so kills the
* Activities but it doesn't kill the Application, so this should be called in
* {@link #onStart} instead of {@link #initialize}.
*/
private void updateAcceptLanguages() {
PrefServiceBridge instance = PrefServiceBridge.getInstance();
String localeString = Locale.getDefault().toString(); // ex) en_US, de_DE, zh_CN_#Hans
if (hasLocaleChanged(localeString)) {
instance.resetAcceptLanguages(localeString);
// Clear cache so that accept-languages change can be applied immediately.
// TODO(changwan): The underlying BrowsingDataRemover::Remove() is an asynchronous call.
// So cache-clearing may not be effective if URL rendering can happen before
// OnBrowsingDataRemoverDone() is called, in which case we may have to reload as well.
// Check if it can happen.
instance.clearBrowsingData(
null, new int[]{ BrowsingDataType.CACHE }, TimePeriod.ALL_TIME);
}
}
private boolean hasLocaleChanged(String newLocale) {
String previousLocale = ContextUtils.getAppSharedPreferences().getString(
PREF_LOCALE, "");
if (!previousLocale.equals(newLocale)) {
SharedPreferences prefs = ContextUtils.getAppSharedPreferences();
SharedPreferences.Editor editor = prefs.edit();
editor.putString(PREF_LOCALE, newLocale);
editor.apply();
return true;
}
return false;
}
/**
* Honor the Android system setting about showing the last character of a password for a short
* period of time.
*/
private void updatePasswordEchoState() {
boolean systemEnabled = Settings.System.getInt(mApplication.getContentResolver(),
Settings.System.TEXT_SHOW_PASSWORD, 1) == 1;
if (PrefServiceBridge.getInstance().getPasswordEchoEnabled() == systemEnabled) return;
PrefServiceBridge.getInstance().setPasswordEchoEnabled(systemEnabled);
}
/**
* Caches flags that are needed by Activities that launch before the native library is loaded
* and stores them in SharedPreferences. Because this function is called during launch after the
* library has loaded, they won't affect the next launch until Chrome is restarted.
*/
private void cacheNativeFlags() {
if (mIsFinishedCachingNativeFlags) return;
FeatureUtilities.cacheNativeFlags(mApplication);
mIsFinishedCachingNativeFlags = true;
}
/**
* @return The PowerBroadcastReceiver for the browser process.
*/
@VisibleForTesting
public PowerBroadcastReceiver getPowerBroadcastReceiverForTesting() {
return mPowerBroadcastReceiver;
}
}
...@@ -194,7 +194,7 @@ public class DeferredStartupHandler { ...@@ -194,7 +194,7 @@ public class DeferredStartupHandler {
PowerMonitor.create(mAppContext); PowerMonitor.create(mAppContext);
ShareHelper.clearSharedImages(mAppContext); ShareHelper.clearSharedImages();
OfflinePageUtils.clearSharedOfflineFiles(mAppContext); OfflinePageUtils.clearSharedOfflineFiles(mAppContext);
} }
...@@ -231,9 +231,6 @@ public class DeferredStartupHandler { ...@@ -231,9 +231,6 @@ public class DeferredStartupHandler {
}); });
ProcessInitializationHandler.getInstance().initializeDeferredStartupTasks(); ProcessInitializationHandler.getInstance().initializeDeferredStartupTasks();
// TODO(tedchoc): Remove this once all internal clients have moved to using
// ProcessInitializationHandler.
application.initializeSharedClasses();
} }
private void initAsyncDiskTask() { private void initAsyncDiskTask() {
......
...@@ -249,7 +249,7 @@ public class ChromeBrowserInitializer { ...@@ -249,7 +249,7 @@ public class ChromeBrowserInitializer {
initQueue.add(new NativeInitTask() { initQueue.add(new NativeInitTask() {
@Override @Override
public void initFunction() { public void initFunction() {
mApplication.initializeProcess(); ProcessInitializationHandler.getInstance().initializePostNative();
} }
}); });
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
package org.chromium.chrome.browser; package org.chromium.chrome.browser.init;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
...@@ -12,6 +12,10 @@ import android.os.Process; ...@@ -12,6 +12,10 @@ import android.os.Process;
import org.chromium.base.ActivityState; import org.chromium.base.ActivityState;
import org.chromium.base.ApplicationStatus; import org.chromium.base.ApplicationStatus;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.base.ThreadUtils;
import org.chromium.base.annotations.SuppressFBWarnings;
import org.chromium.chrome.browser.ApplicationLifetime;
import org.chromium.chrome.browser.BrowserRestartActivity;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
...@@ -28,13 +32,24 @@ class ChromeLifetimeController implements ApplicationLifetime.Observer, ...@@ -28,13 +32,24 @@ class ChromeLifetimeController implements ApplicationLifetime.Observer,
ApplicationStatus.ActivityStateListener { ApplicationStatus.ActivityStateListener {
private static final String TAG = "LifetimeController"; private static final String TAG = "LifetimeController";
private static ChromeLifetimeController sInstance;
private boolean mRestartChromeOnDestroy; private boolean mRestartChromeOnDestroy;
private int mRemainingActivitiesCount = 0; private int mRemainingActivitiesCount = 0;
public ChromeLifetimeController() { /**
ApplicationLifetime.addObserver(this); * Initialize the ChromeLifetimeController;
*/
@SuppressFBWarnings("LI_LAZY_INIT_UPDATE_STATIC")
public static void initialize() {
ThreadUtils.assertOnUiThread();
if (sInstance != null) return;
sInstance = new ChromeLifetimeController();
ApplicationLifetime.addObserver(sInstance);
} }
private ChromeLifetimeController() {}
@Override @Override
public void onTerminate(boolean restart) { public void onTerminate(boolean restart) {
mRestartChromeOnDestroy = restart; mRestartChromeOnDestroy = restart;
......
...@@ -15,9 +15,11 @@ import org.chromium.base.CommandLine; ...@@ -15,9 +15,11 @@ import org.chromium.base.CommandLine;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.base.ThreadUtils; import org.chromium.base.ThreadUtils;
import org.chromium.chrome.browser.ChromeActivitySessionTracker;
import org.chromium.chrome.browser.ChromeApplication; import org.chromium.chrome.browser.ChromeApplication;
import org.chromium.chrome.browser.DeferredStartupHandler; import org.chromium.chrome.browser.DeferredStartupHandler;
import org.chromium.chrome.browser.DevToolsServer; import org.chromium.chrome.browser.DevToolsServer;
import org.chromium.chrome.browser.banners.AppBannerManager;
import org.chromium.chrome.browser.download.DownloadController; import org.chromium.chrome.browser.download.DownloadController;
import org.chromium.chrome.browser.download.DownloadManagerService; import org.chromium.chrome.browser.download.DownloadManagerService;
import org.chromium.chrome.browser.firstrun.ForcedSigninProcessor; import org.chromium.chrome.browser.firstrun.ForcedSigninProcessor;
...@@ -25,6 +27,8 @@ import org.chromium.chrome.browser.identity.UniqueIdentificationGeneratorFactory ...@@ -25,6 +27,8 @@ import org.chromium.chrome.browser.identity.UniqueIdentificationGeneratorFactory
import org.chromium.chrome.browser.identity.UuidBasedUniqueIdentificationGenerator; import org.chromium.chrome.browser.identity.UuidBasedUniqueIdentificationGenerator;
import org.chromium.chrome.browser.invalidation.UniqueIdInvalidationClientNameGenerator; import org.chromium.chrome.browser.invalidation.UniqueIdInvalidationClientNameGenerator;
import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.rlz.RevenueStats; import org.chromium.chrome.browser.rlz.RevenueStats;
import org.chromium.chrome.browser.services.AccountsChangedReceiver; import org.chromium.chrome.browser.services.AccountsChangedReceiver;
import org.chromium.chrome.browser.services.GoogleServicesManager; import org.chromium.chrome.browser.services.GoogleServicesManager;
...@@ -47,6 +51,7 @@ public class ProcessInitializationHandler { ...@@ -47,6 +51,7 @@ public class ProcessInitializationHandler {
private static ProcessInitializationHandler sInstance; private static ProcessInitializationHandler sInstance;
private boolean mInitializedPreNative; private boolean mInitializedPreNative;
private boolean mInitializedPostNative;
private boolean mInitializedDeferredStartupTasks; private boolean mInitializedDeferredStartupTasks;
private DevToolsServer mDevToolsServer; private DevToolsServer mDevToolsServer;
...@@ -149,6 +154,32 @@ public class ProcessInitializationHandler { ...@@ -149,6 +154,32 @@ public class ProcessInitializationHandler {
application, SESSIONS_UUID_PREF_KEY), false); application, SESSIONS_UUID_PREF_KEY), false);
} }
/**
* Initializes any dependencies that must occur after the native library has been loaded.
*/
public final void initializePostNative() {
ThreadUtils.assertOnUiThread();
if (mInitializedPostNative) return;
mInitializedPostNative = true;
handlePostNativeInitialization();
}
/**
* Performs the post native initialization.
*/
protected void handlePostNativeInitialization() {
final ChromeApplication application =
(ChromeApplication) ContextUtils.getApplicationContext();
DataReductionProxySettings.reconcileDataReductionProxyEnabledState(application);
ChromeActivitySessionTracker.getInstance().initializeWithNative();
ChromeApplication.removeSessionCookies();
AppBannerManager.setAppDetailsDelegate(application.createAppDetailsDelegate());
ChromeLifetimeController.initialize();
PrefServiceBridge.getInstance().migratePreferences(application);
}
/** /**
* Initializes the deferred startup tasks that should only be triggered once per browser process * Initializes the deferred startup tasks that should only be triggered once per browser process
* lifetime. * lifetime.
......
...@@ -198,12 +198,13 @@ public class ShareHelper { ...@@ -198,12 +198,13 @@ public class ShareHelper {
/** /**
* Clears all shared image files. * Clears all shared image files.
*/ */
public static void clearSharedImages(final Context context) { public static void clearSharedImages() {
new AsyncTask<Void, Void, Void>() { new AsyncTask<Void, Void, Void>() {
@Override @Override
protected Void doInBackground(Void... params) { protected Void doInBackground(Void... params) {
try { try {
File imagePath = UiUtils.getDirectoryForImageCapture(context); File imagePath = UiUtils.getDirectoryForImageCapture(
ContextUtils.getApplicationContext());
deleteShareImageFiles(new File(imagePath, SHARE_IMAGES_DIRECTORY_NAME)); deleteShareImageFiles(new File(imagePath, SHARE_IMAGES_DIRECTORY_NAME));
} catch (IOException ie) { } catch (IOException ie) {
// Ignore exception. // Ignore exception.
......
...@@ -15,13 +15,13 @@ chrome_java_sources = [ ...@@ -15,13 +15,13 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java", "java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java",
"java/src/org/chromium/chrome/browser/BrowserRestartActivity.java", "java/src/org/chromium/chrome/browser/BrowserRestartActivity.java",
"java/src/org/chromium/chrome/browser/ChromeActivity.java", "java/src/org/chromium/chrome/browser/ChromeActivity.java",
"java/src/org/chromium/chrome/browser/ChromeActivitySessionTracker.java",
"java/src/org/chromium/chrome/browser/ChromeApplication.java", "java/src/org/chromium/chrome/browser/ChromeApplication.java",
"java/src/org/chromium/chrome/browser/ChromeBackgroundService.java", "java/src/org/chromium/chrome/browser/ChromeBackgroundService.java",
"java/src/org/chromium/chrome/browser/ChromeBackgroundServiceWaiter.java", "java/src/org/chromium/chrome/browser/ChromeBackgroundServiceWaiter.java",
"java/src/org/chromium/chrome/browser/ChromeBackupAgent.java", "java/src/org/chromium/chrome/browser/ChromeBackupAgent.java",
"java/src/org/chromium/chrome/browser/ChromeFeatureList.java", "java/src/org/chromium/chrome/browser/ChromeFeatureList.java",
"java/src/org/chromium/chrome/browser/ChromeHttpAuthHandler.java", "java/src/org/chromium/chrome/browser/ChromeHttpAuthHandler.java",
"java/src/org/chromium/chrome/browser/ChromeLifetimeController.java",
"java/src/org/chromium/chrome/browser/ChromeStrictMode.java", "java/src/org/chromium/chrome/browser/ChromeStrictMode.java",
"java/src/org/chromium/chrome/browser/ChromeSwitches.java", "java/src/org/chromium/chrome/browser/ChromeSwitches.java",
"java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java", "java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java",
...@@ -430,6 +430,7 @@ chrome_java_sources = [ ...@@ -430,6 +430,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/init/BrowserParts.java", "java/src/org/chromium/chrome/browser/init/BrowserParts.java",
"java/src/org/chromium/chrome/browser/init/ChromeActivityNativeDelegate.java", "java/src/org/chromium/chrome/browser/init/ChromeActivityNativeDelegate.java",
"java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java", "java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java",
"java/src/org/chromium/chrome/browser/init/ChromeLifetimeController.java",
"java/src/org/chromium/chrome/browser/init/EmptyBrowserParts.java", "java/src/org/chromium/chrome/browser/init/EmptyBrowserParts.java",
"java/src/org/chromium/chrome/browser/init/InvalidStartupDialog.java", "java/src/org/chromium/chrome/browser/init/InvalidStartupDialog.java",
"java/src/org/chromium/chrome/browser/init/NativeInitializationController.java", "java/src/org/chromium/chrome/browser/init/NativeInitializationController.java",
......
...@@ -8,6 +8,7 @@ import android.content.Context; ...@@ -8,6 +8,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.test.suitebuilder.annotation.MediumTest; import android.test.suitebuilder.annotation.MediumTest;
import org.chromium.base.ThreadUtils;
import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.FlakyTest; import org.chromium.base.test.util.FlakyTest;
import org.chromium.base.test.util.RetryOnFailure; import org.chromium.base.test.util.RetryOnFailure;
...@@ -15,6 +16,8 @@ import org.chromium.chrome.test.ChromeTabbedActivityTestBase; ...@@ -15,6 +16,8 @@ import org.chromium.chrome.test.ChromeTabbedActivityTestBase;
import org.chromium.chrome.test.util.ApplicationTestUtils; import org.chromium.chrome.test.util.ApplicationTestUtils;
import org.chromium.content.browser.test.util.CallbackHelper; import org.chromium.content.browser.test.util.CallbackHelper;
import java.util.concurrent.Callable;
/** /**
* Tests for the PowerBroadcastReceiver. * Tests for the PowerBroadcastReceiver.
*/ */
...@@ -84,8 +87,13 @@ public class PowerBroadcastReceiverTest extends ChromeTabbedActivityTestBase { ...@@ -84,8 +87,13 @@ public class PowerBroadcastReceiverTest extends ChromeTabbedActivityTestBase {
public void setUp() throws Exception { public void setUp() throws Exception {
super.setUp(); super.setUp();
ChromeApplication application = (ChromeApplication) getActivity().getApplication(); mReceiver = ThreadUtils.runOnUiThreadBlocking(new Callable<PowerBroadcastReceiver>() {
mReceiver = application.getPowerBroadcastReceiver(); @Override
public PowerBroadcastReceiver call() throws Exception {
return ChromeActivitySessionTracker.getInstance()
.getPowerBroadcastReceiverForTesting();
}
});
// Set up our mock runnable. // Set up our mock runnable.
mRunnable = new MockServiceRunnable(); mRunnable = new MockServiceRunnable();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment