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

Unified Diff: components/ntp_snippets/remote/scheduling_remote_suggestions_provider.h

Issue 2557363002: [NTP Snippets] Refactor background scheduling for remote suggestions (Closed)
Patch Set: Fixing the last changes :) Created 4 years 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 side-by-side diff with in-line comments
Download patch
Index: components/ntp_snippets/remote/scheduling_remote_suggestions_provider.h
diff --git a/components/ntp_snippets/remote/scheduling_remote_suggestions_provider.h b/components/ntp_snippets/remote/scheduling_remote_suggestions_provider.h
new file mode 100644
index 0000000000000000000000000000000000000000..35e50efc7ea82087816d24ffdadd4d2dad54c3e8
--- /dev/null
+++ b/components/ntp_snippets/remote/scheduling_remote_suggestions_provider.h
@@ -0,0 +1,147 @@
+// 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.
+
+#ifndef COMPONENTS_NTP_SNIPPETS_REMOTE_SCHEDULING_REMOTE_SUGGESTIONS_PROVIDER_H_
+#define COMPONENTS_NTP_SNIPPETS_REMOTE_SCHEDULING_REMOTE_SUGGESTIONS_PROVIDER_H_
+
+#include <memory>
+#include <set>
+#include <string>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/time/time.h"
+#include "components/ntp_snippets/content_suggestions_provider.h"
+#include "components/ntp_snippets/remote/persistent_scheduler.h"
+#include "components/ntp_snippets/remote/remote_suggestions_provider.h"
+#include "components/ntp_snippets/remote/remote_suggestions_scheduler.h"
+
+class PrefRegistrySimple;
+class PrefService;
+
+namespace ntp_snippets {
+
+struct Status;
+class UserClassifier;
+
+// A wrapper around RemoteSuggestionsProvider that introduces periodic fetching.
+//
+// The class initiates fetches on its own in these situations:
+// - initial fetch when the provider is constructed and we have no suggestions;
+// - regular fetches according to its schedule.
+// TODO(jkrcal): After soft fetch on Chrome startup is introduced, remove
+// the initial fetch completely.
+//
+// The class also needs to understand when last fetch trials and successful
+// fetches happen and thus it intercepts following interactive fetch requests:
+// - Fetch() - after "More" button of a remote section is pressed in the UI;
+// TODO(jkrcal): Clarify what Fetch() should do for this provider and maybe stop
+// intercepting it.
+// TODO(jkrcal): Intercept also ReloadSuggestions() call (after the user swipes
+// away everything incl. all empty sections and presses "More"); Not done in the
+// first shot because it implements a public interface function without any
+// callback.
+// This class is final because it does things in its constructor which make it
+// unsafe to derive from it.
+// TODO(jkrcal): Introduce two-phase initialization and make the class not
+// final? (see the same comment for RemoteSuggestionsProvider)
+class SchedulingRemoteSuggestionsProvider final
+ : public RemoteSuggestionsProvider,
+ public RemoteSuggestionsScheduler {
+ public:
+ SchedulingRemoteSuggestionsProvider(
+ Observer* observer,
+ std::unique_ptr<RemoteSuggestionsProvider> provider,
+ PersistentScheduler* persistent_scheduler,
+ const UserClassifier* user_classifier,
+ PrefService* pref_service);
+
+ ~SchedulingRemoteSuggestionsProvider() override;
+
+ static void RegisterProfilePrefs(PrefRegistrySimple* registry);
+
+ // RemoteSuggestionsScheduler implementation.
+ void RescheduleFetching() override;
+ void OnPersistentSchedulerWakeUp() override;
+
+ // RemoteSuggestionsProvider implementation.
+ void SetProviderStatusCallback(
+ std::unique_ptr<ProviderStatusCallback> callback) override;
+ void RefetchInTheBackground(
+ std::unique_ptr<FetchStatusCallback> callback) override;
+ const NTPSnippetsFetcher* snippets_fetcher_for_testing_and_debugging()
+ const override;
+
+ // ContentSuggestionsProvider implementation.
+ CategoryStatus GetCategoryStatus(Category category) override;
+ CategoryInfo GetCategoryInfo(Category category) override;
+ void DismissSuggestion(const ContentSuggestion::ID& suggestion_id) override;
+ void FetchSuggestionImage(const ContentSuggestion::ID& suggestion_id,
+ const ImageFetchedCallback& callback) override;
+ void Fetch(const Category& category,
+ const std::set<std::string>& known_suggestion_ids,
+ const FetchDoneCallback& callback) override;
+ void ReloadSuggestions() override;
+ void ClearHistory(
+ base::Time begin,
+ base::Time end,
+ const base::Callback<bool(const GURL& url)>& filter) override;
+ void ClearCachedSuggestions(Category category) override;
+ void OnSignInStateChanged() override;
+ void GetDismissedSuggestionsForDebugging(
+ Category category,
+ const DismissedSuggestionsCallback& callback) override;
+ void ClearDismissedSuggestionsForDebugging(Category category) override;
+
+ private:
+ // Abstract description of the fetching schedule.
+ struct FetchingSchedule;
+
+ // Callback that is notified whenever the status of |provider_| changes.
+ void OnProviderStatusChanged(
+ RemoteSuggestionsProvider::ProviderStatus status);
+
+ // After the call, updates will be scheduled in the future. Idempotent, can be
+ // run any time later without impacting the current schedule.
+ // If you want to enforce rescheduling, call Unschedule() and then Schedule().
+ void StartScheduling();
+
+ // After the call, no updates will happen before another call to Schedule().
+ // Idempotent, can be run any time later without impacting the current
+ // schedule.
+ void StopScheduling();
+
+ // Callback after Fetch is completed.
+ void FetchFinished(const FetchDoneCallback& callback,
+ Status status_code,
+ std::vector<ContentSuggestion> suggestions);
+
+ FetchingSchedule GetDesiredFetchingSchedule() const;
+ FetchingSchedule GetLastFetchingSchedule() const;
+ void StoreLastFetchingSchedule(const FetchingSchedule& schedule);
+
+ // Common function to call after each fetch.
+ void OnFetchCompleted(Status status);
+
+ // Applies the provided |schedule|.
+ void ApplyFetchingSchedule(const FetchingSchedule& schedule);
+
+ // Interface for doing all the actual work (apart from scheduling).
+ std::unique_ptr<RemoteSuggestionsProvider> provider_;
+
+ // Interface for scheduling hard fetches, OS dependent. Not owned, may be
+ // null.
+ PersistentScheduler* persistent_scheduler_;
+
+ // Used to adapt the schedule based on usage activity of the user. Not owned.
+ const UserClassifier* user_classifier_;
+
+ PrefService* pref_service_;
+
+ DISALLOW_COPY_AND_ASSIGN(SchedulingRemoteSuggestionsProvider);
+};
+
+} // namespace ntp_snippets
+
+#endif // COMPONENTS_NTP_SNIPPETS_REMOTE_SCHEDULING_REMOTE_SUGGESTIONS_PROVIDER_H_

Powered by Google App Engine
This is Rietveld 408576698