| 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_
|
|
|