Commit cb5e4457 authored by fhorschig's avatar fhorschig Committed by Commit bot

Trigger the Snippets Scheduler when Resuming Activities

Inform the scheduler on resuming activites, so fetching of new
snippets consider this event.

(There is a related CL that triggers a similar event for new tabs:
https://codereview.chromium.org/2592053004/)

BUG=676308

Review-Url: https://codereview.chromium.org/2599743002
Cr-Commit-Position: refs/heads/master@{#441768}
parent 61a02a63
...@@ -80,6 +80,8 @@ import org.chromium.chrome.browser.metrics.UmaUtils; ...@@ -80,6 +80,8 @@ import org.chromium.chrome.browser.metrics.UmaUtils;
import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
import org.chromium.chrome.browser.ntp.NativePageAssassin; import org.chromium.chrome.browser.ntp.NativePageAssassin;
import org.chromium.chrome.browser.ntp.NewTabPageUma; import org.chromium.chrome.browser.ntp.NewTabPageUma;
import org.chromium.chrome.browser.ntp.snippets.SnippetsBridge;
import org.chromium.chrome.browser.ntp.snippets.SnippetsConfig;
import org.chromium.chrome.browser.omaha.OmahaClient; import org.chromium.chrome.browser.omaha.OmahaClient;
import org.chromium.chrome.browser.omnibox.AutocompleteController; import org.chromium.chrome.browser.omnibox.AutocompleteController;
import org.chromium.chrome.browser.partnercustomizations.HomepageManager; import org.chromium.chrome.browser.partnercustomizations.HomepageManager;
...@@ -431,6 +433,14 @@ public class ChromeTabbedActivity extends ChromeActivity implements OverviewMode ...@@ -431,6 +433,14 @@ public class ChromeTabbedActivity extends ChromeActivity implements OverviewMode
mLocaleManager.setSnackbarManager(getSnackbarManager()); mLocaleManager.setSnackbarManager(getSnackbarManager());
mLocaleManager.startObservingPhoneChanges(); mLocaleManager.startObservingPhoneChanges();
if (SnippetsConfig.isEnabled()) {
if (isWarmOnResume()) {
SnippetsBridge.notifySchedulerAboutWarmResume();
} else {
SnippetsBridge.notifySchedulerAboutColdStart();
}
}
} }
@Override @Override
......
...@@ -63,6 +63,11 @@ public abstract class AsyncInitializationActivity extends AppCompatActivity impl ...@@ -63,6 +63,11 @@ public abstract class AsyncInitializationActivity extends AppCompatActivity impl
private long mLastUserInteractionTime; private long mLastUserInteractionTime;
private boolean mIsTablet; private boolean mIsTablet;
private boolean mHadWarmStart; private boolean mHadWarmStart;
private boolean mIsWarmOnResume;
// Stores whether the activity was not resumed yet. Always false after the
// first |onResume| call.
private boolean mFirstResumePending = true;
public AsyncInitializationActivity() { public AsyncInitializationActivity() {
mHandler = new Handler(); mHandler = new Handler();
...@@ -294,6 +299,8 @@ public abstract class AsyncInitializationActivity extends AppCompatActivity impl ...@@ -294,6 +299,8 @@ public abstract class AsyncInitializationActivity extends AppCompatActivity impl
super.onResume(); super.onResume();
mNativeInitializationController.onResume(); mNativeInitializationController.onResume();
if (mLaunchBehindWorkaround != null) mLaunchBehindWorkaround.onResume(); if (mLaunchBehindWorkaround != null) mLaunchBehindWorkaround.onResume();
mIsWarmOnResume = !mFirstResumePending || hadWarmStart();
mFirstResumePending = false;
} }
@Override @Override
...@@ -408,6 +415,18 @@ public abstract class AsyncInitializationActivity extends AppCompatActivity impl ...@@ -408,6 +415,18 @@ public abstract class AsyncInitializationActivity extends AppCompatActivity impl
return mHadWarmStart; return mHadWarmStart;
} }
/**
* This returns true if the activity was started warm (native library loaded and initialized) or
* if a cold starts have been completed by the time onResume is/will be called.
* This is useful to distinguish between the case where an already running instance of Chrome is
* being brought back to the foreground from the case where Chrome is started, in order to avoid
* contention on browser startup
* @return Whether the activity is warm in onResume.
*/
public boolean isWarmOnResume() {
return mIsWarmOnResume;
}
@Override @Override
public void onUserInteraction() { public void onUserInteraction() {
mLastUserInteractionTime = SystemClock.elapsedRealtime(); mLastUserInteractionTime = SystemClock.elapsedRealtime();
......
...@@ -179,6 +179,16 @@ public class SnippetsBridge implements SuggestionsSource { ...@@ -179,6 +179,16 @@ public class SnippetsBridge implements SuggestionsSource {
nativeOnNTPInitialized(mNativeSnippetsBridge); nativeOnNTPInitialized(mNativeSnippetsBridge);
} }
public static void notifySchedulerAboutWarmResume() {
SnippetsBridge snippetsBridge = new SnippetsBridge(Profile.getLastUsedProfile());
snippetsBridge.onActivityWarmResumed();
}
public static void notifySchedulerAboutColdStart() {
SnippetsBridge snippetsBridge = new SnippetsBridge(Profile.getLastUsedProfile());
snippetsBridge.onColdStart();
}
public static void onSuggestionTargetVisited(int category, long visitTimeMs) { public static void onSuggestionTargetVisited(int category, long visitTimeMs) {
nativeOnSuggestionTargetVisited(category, visitTimeMs); nativeOnSuggestionTargetVisited(category, visitTimeMs);
} }
...@@ -202,6 +212,16 @@ public class SnippetsBridge implements SuggestionsSource { ...@@ -202,6 +212,16 @@ public class SnippetsBridge implements SuggestionsSource {
nativeFetch(mNativeSnippetsBridge, category, displayedSuggestionIds); nativeFetch(mNativeSnippetsBridge, category, displayedSuggestionIds);
} }
private void onActivityWarmResumed() {
assert mNativeSnippetsBridge != 0;
nativeOnActivityWarmResumed(mNativeSnippetsBridge);
}
private void onColdStart() {
assert mNativeSnippetsBridge != 0;
nativeOnColdStart(mNativeSnippetsBridge);
}
@CalledByNative @CalledByNative
private static List<SnippetArticle> createSuggestionList() { private static List<SnippetArticle> createSuggestionList() {
return new ArrayList<>(); return new ArrayList<>();
...@@ -302,6 +322,8 @@ public class SnippetsBridge implements SuggestionsSource { ...@@ -302,6 +322,8 @@ public class SnippetsBridge implements SuggestionsSource {
long nativeNTPSnippetsBridge, int category, int position); long nativeNTPSnippetsBridge, int category, int position);
private native void nativeOnMoreButtonClicked( private native void nativeOnMoreButtonClicked(
long nativeNTPSnippetsBridge, int category, int position); long nativeNTPSnippetsBridge, int category, int position);
private native void nativeOnActivityWarmResumed(long nativeNTPSnippetsBridge);
private native void nativeOnColdStart(long nativeNTPSnippetsBridge);
private static native void nativeOnSuggestionTargetVisited(int category, long visitTimeMs); private static native void nativeOnSuggestionTargetVisited(int category, long visitTimeMs);
private static native void nativeOnNTPInitialized(long nativeNTPSnippetsBridge); private static native void nativeOnNTPInitialized(long nativeNTPSnippetsBridge);
} }
...@@ -408,6 +408,30 @@ void NTPSnippetsBridge::OnNTPInitialized( ...@@ -408,6 +408,30 @@ void NTPSnippetsBridge::OnNTPInitialized(
scheduler->OnNTPOpened(); scheduler->OnNTPOpened();
} }
void NTPSnippetsBridge::OnColdStart(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
ntp_snippets::RemoteSuggestionsScheduler* scheduler =
GetRemoteSuggestionsScheduler();
// TODO(fhorschig): Remove guard when https://crbug.com/678556 is resolved.
if (!scheduler) {
return;
}
scheduler->OnBrowserColdStart();
}
void NTPSnippetsBridge::OnActivityWarmResumed(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
ntp_snippets::RemoteSuggestionsScheduler* scheduler =
GetRemoteSuggestionsScheduler();
// TODO(fhorschig): Remove guard when https://crbug.com/678556 is resolved.
if (!scheduler) {
return;
}
scheduler->OnBrowserForegrounded();
}
NTPSnippetsBridge::~NTPSnippetsBridge() {} NTPSnippetsBridge::~NTPSnippetsBridge() {}
void NTPSnippetsBridge::OnNewSuggestions(Category category) { void NTPSnippetsBridge::OnNewSuggestions(Category category) {
......
...@@ -130,6 +130,10 @@ class NTPSnippetsBridge ...@@ -130,6 +130,10 @@ class NTPSnippetsBridge
void OnNTPInitialized(JNIEnv* env, void OnNTPInitialized(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj); const base::android::JavaParamRef<jobject>& obj);
void OnColdStart(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
void OnActivityWarmResumed(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
static bool Register(JNIEnv* env); static bool Register(JNIEnv* env);
......
...@@ -13,7 +13,16 @@ namespace ntp_snippets { ...@@ -13,7 +13,16 @@ namespace ntp_snippets {
class RemoteSuggestionsScheduler { class RemoteSuggestionsScheduler {
public: public:
// External triggers to consider fetching content suggestions. // External triggers to consider fetching content suggestions.
virtual void OnBrowserStartup() = 0;
// Called whenever chrome is started warm or the user switches to Chrome.
virtual void OnBrowserForegrounded() = 0;
// Called whenever chrome is cold started.
// To keep start ups fast, defer any work possible.
virtual void OnBrowserColdStart() = 0;
// Called whenever a new NTP is opened. This may be called on cold starts.
// So to keep start ups fast, defer heavy work for cold starts.
virtual void OnNTPOpened() = 0; virtual void OnNTPOpened() = 0;
// Fetch content suggestions. // Fetch content suggestions.
......
...@@ -180,7 +180,15 @@ void SchedulingRemoteSuggestionsProvider::OnPersistentSchedulerWakeUp() { ...@@ -180,7 +180,15 @@ void SchedulingRemoteSuggestionsProvider::OnPersistentSchedulerWakeUp() {
RefetchInTheBackground(/*callback=*/nullptr); RefetchInTheBackground(/*callback=*/nullptr);
} }
void SchedulingRemoteSuggestionsProvider::OnBrowserStartup() { void SchedulingRemoteSuggestionsProvider::OnBrowserForegrounded() {
// TODO(jkrcal): Consider that this is called whenever we open or return to an
// Activity. Therefore, keep work light for fast start up calls.
// TODO(jkrcal): Implement.
}
void SchedulingRemoteSuggestionsProvider::OnBrowserColdStart() {
// TODO(fhorschig|jkrcal): Consider that work here must be kept light for fast
// cold start ups.
// TODO(jkrcal): Implement. // TODO(jkrcal): Implement.
} }
......
...@@ -70,7 +70,8 @@ class SchedulingRemoteSuggestionsProvider final ...@@ -70,7 +70,8 @@ class SchedulingRemoteSuggestionsProvider final
// RemoteSuggestionsScheduler implementation. // RemoteSuggestionsScheduler implementation.
void RescheduleFetching() override; void RescheduleFetching() override;
void OnPersistentSchedulerWakeUp() override; void OnPersistentSchedulerWakeUp() override;
void OnBrowserStartup() override; void OnBrowserForegrounded() override;
void OnBrowserColdStart() override;
void OnNTPOpened() override; void OnNTPOpened() override;
// RemoteSuggestionsProvider implementation. // RemoteSuggestionsProvider implementation.
......
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