[NTP::Push] Periodically check token validity and resubscribe if not.
GCM token may become invalid (it is stored on disk and may be corrupted).
Therefore, this CL adds a periodical check (at least 24 hours, without waking
up) of the current token validity. If it is invalid, then a new token is
retrieved and used to resubscribe to our server.
Bug: 742240
Change-Id: I27d873049c6dbc7ff8c3ad0471cf20ca7f754d53
Reviewed-on: https://chromium-review.googlesource.com/574232
Reviewed-by: Bernhard Bauer <[email protected]>
Reviewed-by: Marc Treib <[email protected]>
Commit-Queue: vitaliii <[email protected]>
Cr-Commit-Position: refs/heads/master@{#491956}
diff --git a/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc b/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc
index 3630a22..866f4b2f 100644
--- a/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc
+++ b/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc
@@ -14,6 +14,8 @@
#include "base/sequenced_task_runner.h"
#include "base/task_scheduler/post_task.h"
#include "base/time/default_clock.h"
+#include "base/timer/timer.h"
+#include "build/build_config.h"
#include "chrome/browser/bookmarks/bookmark_model_factory.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/favicon/large_icon_service_factory.h"
@@ -40,10 +42,6 @@
#include "components/keyed_service/core/service_access_type.h"
#include "components/language/core/browser/url_language_histogram.h"
#include "components/ntp_snippets/bookmarks/bookmark_suggestions_provider.h"
-#include "components/ntp_snippets/breaking_news/breaking_news_gcm_app_handler.h"
-#include "components/ntp_snippets/breaking_news/breaking_news_suggestions_provider.h"
-#include "components/ntp_snippets/breaking_news/subscription_manager.h"
-#include "components/ntp_snippets/breaking_news/subscription_manager_impl.h"
#include "components/ntp_snippets/category_rankers/category_ranker.h"
#include "components/ntp_snippets/content_suggestions_service.h"
#include "components/ntp_snippets/contextual_suggestions_source.h"
@@ -79,6 +77,10 @@
#include "chrome/browser/download/download_core_service_factory.h"
#include "chrome/browser/download/download_history.h"
#include "chrome/browser/ntp_snippets/download_suggestions_provider.h"
+#include "components/ntp_snippets/breaking_news/breaking_news_gcm_app_handler.h"
+#include "components/ntp_snippets/breaking_news/breaking_news_suggestions_provider.h"
+#include "components/ntp_snippets/breaking_news/subscription_manager.h"
+#include "components/ntp_snippets/breaking_news/subscription_manager_impl.h"
#include "components/ntp_snippets/physical_web_pages/physical_web_page_suggestions_provider.h"
#include "components/physical_web/data_source/physical_web_data_source.h"
#endif
@@ -103,16 +105,12 @@
using image_fetcher::ImageFetcherImpl;
using language::UrlLanguageHistogram;
using ntp_snippets::BookmarkSuggestionsProvider;
-using ntp_snippets::BreakingNewsGCMAppHandler;
-using ntp_snippets::BreakingNewsSuggestionsProvider;
using ntp_snippets::CategoryRanker;
using ntp_snippets::ContentSuggestionsService;
using ntp_snippets::ContextualSuggestionsFetcherImpl;
using ntp_snippets::ContextualSuggestionsSource;
using ntp_snippets::ForeignSessionsSuggestionsProvider;
using ntp_snippets::GetFetchEndpoint;
-using ntp_snippets::GetPushUpdatesSubscriptionEndpoint;
-using ntp_snippets::GetPushUpdatesUnsubscriptionEndpoint;
using ntp_snippets::PersistentScheduler;
using ntp_snippets::PrefetchedPagesTracker;
using ntp_snippets::RemoteSuggestionsDatabase;
@@ -120,7 +118,6 @@
using ntp_snippets::RemoteSuggestionsProviderImpl;
using ntp_snippets::RemoteSuggestionsSchedulerImpl;
using ntp_snippets::RemoteSuggestionsStatusService;
-using ntp_snippets::SubscriptionManagerImpl;
using ntp_snippets::TabDelegateSyncAdapter;
using ntp_snippets::UserClassifier;
using suggestions::ImageDecoderImpl;
@@ -128,7 +125,12 @@
#if defined(OS_ANDROID)
using content::DownloadManager;
+using ntp_snippets::BreakingNewsGCMAppHandler;
+using ntp_snippets::BreakingNewsSuggestionsProvider;
+using ntp_snippets::GetPushUpdatesSubscriptionEndpoint;
+using ntp_snippets::GetPushUpdatesUnsubscriptionEndpoint;
using ntp_snippets::PhysicalWebPageSuggestionsProvider;
+using ntp_snippets::SubscriptionManagerImpl;
using physical_web::PhysicalWebDataSource;
#endif // OS_ANDROID
@@ -428,10 +430,20 @@
service->RegisterProvider(std::move(provider));
}
-void SubscribeForGCMPushUpdates(
+#if defined(OS_ANDROID)
+
+bool IsGCMPushUpdatesEnabled() {
+ return base::FeatureList::IsEnabled(ntp_snippets::kBreakingNewsPushFeature);
+}
+
+void SubscribeForGCMPushUpdatesIfEnabled(
PrefService* pref_service,
ContentSuggestionsService* content_suggestions_service,
Profile* profile) {
+ if (!IsGCMPushUpdatesEnabled()) {
+ return;
+ }
+
// TODO(mamir): Either pass all params from outside or pass only profile and
// create them inside the method, but be consistent.
gcm::GCMDriver* gcm_driver =
@@ -469,7 +481,9 @@
auto handler = base::MakeUnique<BreakingNewsGCMAppHandler>(
gcm_driver, instance_id_profile_service->driver(), pref_service,
std::move(subscription_manager),
- base::Bind(&safe_json::SafeJsonParser::Parse));
+ base::Bind(&safe_json::SafeJsonParser::Parse),
+ base::MakeUnique<base::DefaultClock>(),
+ /*token_validation_timer=*/base::MakeUnique<base::OneShotTimer>());
scoped_refptr<base::SequencedTaskRunner> task_runner =
base::CreateSequencedTaskRunnerWithTraits(
@@ -487,6 +501,8 @@
content_suggestions_service->RegisterProvider(std::move(provider));
}
+#endif // OS_ANDROID
+
} // namespace
#endif // CONTENT_SUGGESTIONS_ENABLED
@@ -587,6 +603,7 @@
#if defined(OS_ANDROID)
RegisterDownloadsProviderIfEnabled(service, profile, offline_page_model);
RegisterPhysicalWebPageProviderIfEnabled(service, profile);
+ SubscribeForGCMPushUpdatesIfEnabled(pref_service, service, profile);
#endif // OS_ANDROID
#if BUILDFLAG(ENABLE_OFFLINE_PAGES)
@@ -594,9 +611,6 @@
RegisterPrefetchingObserver(service, profile);
#endif
- if (base::FeatureList::IsEnabled(ntp_snippets::kBreakingNewsPushFeature)) {
- SubscribeForGCMPushUpdates(pref_service, service, profile);
- }
return service;
#else
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 41d9382..aed9e942 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -78,8 +78,6 @@
#include "components/gcm_driver/gcm_channel_status_syncer.h"
#include "components/language/core/browser/url_language_histogram.h"
#include "components/network_time/network_time_tracker.h"
-#include "components/ntp_snippets/breaking_news/breaking_news_gcm_app_handler.h"
-#include "components/ntp_snippets/breaking_news/subscription_manager_impl.h"
#include "components/ntp_snippets/content_suggestions_service.h"
#include "components/ntp_snippets/remote/remote_suggestions_provider_impl.h"
#include "components/ntp_snippets/remote/remote_suggestions_scheduler_impl.h"
@@ -173,6 +171,8 @@
#include "chrome/browser/geolocation/geolocation_permission_context_android.h"
#include "chrome/browser/ntp_snippets/download_suggestions_provider.h"
#include "components/cdm/browser/media_drm_storage_impl.h"
+#include "components/ntp_snippets/breaking_news/breaking_news_gcm_app_handler.h"
+#include "components/ntp_snippets/breaking_news/subscription_manager_impl.h"
#include "components/ntp_snippets/category_rankers/click_based_category_ranker.h"
#include "components/ntp_snippets/offline_pages/recent_tab_suggestions_provider.h"
#include "components/ntp_snippets/physical_web_pages/physical_web_page_suggestions_provider.h"
@@ -473,14 +473,12 @@
MediaStreamDevicesController::RegisterProfilePrefs(registry);
NavigationCorrectionTabObserver::RegisterProfilePrefs(registry);
NotifierStateTracker::RegisterProfilePrefs(registry);
- ntp_snippets::BreakingNewsGCMAppHandler::RegisterProfilePrefs(registry);
ntp_snippets::ContentSuggestionsService::RegisterProfilePrefs(registry);
ntp_snippets::ForeignSessionsSuggestionsProvider::RegisterProfilePrefs(
registry);
ntp_snippets::RemoteSuggestionsProviderImpl::RegisterProfilePrefs(registry);
ntp_snippets::RemoteSuggestionsSchedulerImpl::RegisterProfilePrefs(registry);
ntp_snippets::RequestThrottler::RegisterProfilePrefs(registry);
- ntp_snippets::SubscriptionManagerImpl::RegisterProfilePrefs(registry);
ntp_snippets::UserClassifier::RegisterProfilePrefs(registry);
ntp_tiles::MostVisitedSites::RegisterProfilePrefs(registry);
password_bubble_experiment::RegisterPrefs(registry);
@@ -568,10 +566,12 @@
cdm::MediaDrmStorageImpl::RegisterProfilePrefs(registry);
ContentSuggestionsNotifierService::RegisterProfilePrefs(registry);
DownloadSuggestionsProvider::RegisterProfilePrefs(registry);
+ ntp_snippets::BreakingNewsGCMAppHandler::RegisterProfilePrefs(registry);
ntp_snippets::ClickBasedCategoryRanker::RegisterProfilePrefs(registry);
ntp_snippets::PhysicalWebPageSuggestionsProvider::RegisterProfilePrefs(
registry);
ntp_snippets::RecentTabSuggestionsProvider::RegisterProfilePrefs(registry);
+ ntp_snippets::SubscriptionManagerImpl::RegisterProfilePrefs(registry);
#endif // defined(OS_ANDROID)
#if !defined(OS_ANDROID)