Commit 0b651390 authored by sczs's avatar sczs Committed by Commit Bot

[ios] Creates DiscoverFeedService

- Creates DiscoverFeedService, a BrowserState KeyedService
- Creates DiscoverFeedServiceFactory to create and own
DiscoverFeedServices
- Initializes DiscoverFeedService in main controller.
- Updates DiscoverFeedProvider interface with methods to start the Feed
and update when the Identity changes.

Bug: 1085419
Change-Id: Ie39653f6263915f9ef69b68d5c1e2182d15c7ab1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2344503Reviewed-by: default avatarRohit Rao <rohitrao@chromium.org>
Commit-Queue: Sergio Collazos <sczs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#798272}
parent eebd159a
...@@ -96,6 +96,7 @@ source_set("browser_state_impl") { ...@@ -96,6 +96,7 @@ source_set("browser_state_impl") {
"//ios/chrome/browser/crash_report/breadcrumbs", "//ios/chrome/browser/crash_report/breadcrumbs",
"//ios/chrome/browser/credential_provider", "//ios/chrome/browser/credential_provider",
"//ios/chrome/browser/device_sharing", "//ios/chrome/browser/device_sharing",
"//ios/chrome/browser/discover_feed",
"//ios/chrome/browser/dom_distiller", "//ios/chrome/browser/dom_distiller",
"//ios/chrome/browser/download", "//ios/chrome/browser/download",
"//ios/chrome/browser/favicon", "//ios/chrome/browser/favicon",
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_persistent_storage_keyed_service_factory.h" #include "ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_persistent_storage_keyed_service_factory.h"
#include "ios/chrome/browser/credential_provider/credential_provider_service_factory.h" #include "ios/chrome/browser/credential_provider/credential_provider_service_factory.h"
#import "ios/chrome/browser/device_sharing/device_sharing_manager_factory.h" #import "ios/chrome/browser/device_sharing/device_sharing_manager_factory.h"
#include "ios/chrome/browser/discover_feed/discover_feed_service_factory.h"
#include "ios/chrome/browser/dom_distiller/dom_distiller_service_factory.h" #include "ios/chrome/browser/dom_distiller/dom_distiller_service_factory.h"
#include "ios/chrome/browser/download/browser_download_service_factory.h" #include "ios/chrome/browser/download/browser_download_service_factory.h"
#include "ios/chrome/browser/favicon/favicon_service_factory.h" #include "ios/chrome/browser/favicon/favicon_service_factory.h"
...@@ -108,6 +109,7 @@ void EnsureBrowserStateKeyedServiceFactoriesBuilt() { ...@@ -108,6 +109,7 @@ void EnsureBrowserStateKeyedServiceFactoriesBuilt() {
ConsentAuditorFactory::GetInstance(); ConsentAuditorFactory::GetInstance();
CredentialProviderServiceFactory::GetInstance(); CredentialProviderServiceFactory::GetInstance();
DeviceSharingManagerFactory::GetInstance(); DeviceSharingManagerFactory::GetInstance();
DiscoverFeedServiceFactory::GetInstance();
GoogleLogoServiceFactory::GetInstance(); GoogleLogoServiceFactory::GetInstance();
IdentityManagerFactory::GetInstance(); IdentityManagerFactory::GetInstance();
IOSCookieBlockerFactory::GetInstance(); IOSCookieBlockerFactory::GetInstance();
......
# Copyright 2020 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.
source_set("discover_feed") {
configs += [ "//build/config/compiler:enable_arc" ]
sources = [
"discover_feed_service.h",
"discover_feed_service.mm",
"discover_feed_service_factory.h",
"discover_feed_service_factory.mm",
]
deps = [
"//base",
"//components/autofill/core/common",
"//components/keyed_service/core",
"//components/keyed_service/ios",
"//components/signin/public/identity_manager",
"//ios/chrome/browser/browser_state",
"//ios/chrome/browser/signin",
"//ios/public/provider/chrome/browser",
"//ios/public/provider/chrome/browser/discover_feed",
]
}
sczs@chromium.org
gogerald@chromium.org
# TEAM: ios-directory-owners@chromium.org
# OS: iOS
// Copyright 2020 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 IOS_CHROME_BROWSER_DISCOVER_FEED_DISCOVER_FEED_SERVICE_H_
#define IOS_CHROME_BROWSER_DISCOVER_FEED_DISCOVER_FEED_SERVICE_H_
#include "components/keyed_service/core/keyed_service.h"
#include "components/signin/public/identity_manager/identity_manager.h"
class AuthenticationService;
class DiscoverFeedProvider;
// A browser-context keyed service that is used to keep the Discover Feed data
// up to date.
class DiscoverFeedService : public KeyedService,
public signin::IdentityManager::Observer {
public:
// Initializes the service.
DiscoverFeedService(signin::IdentityManager* identity_manager,
AuthenticationService* authentication_service,
DiscoverFeedProvider* feed_provider);
~DiscoverFeedService() override;
// KeyedService:
void Shutdown() override;
private:
// IdentityManager::Observer.
void OnPrimaryAccountSet(
const CoreAccountInfo& primary_account_info) override;
void OnPrimaryAccountCleared(
const CoreAccountInfo& previous_primary_account_info) override;
// Identity manager to observe.
signin::IdentityManager* identity_manager_;
// The AuthenticationService sent to DiscoverFeedProvider;
AuthenticationService* authentication_service_ = nullptr;
// Discover Feed provider to notify of changes.
DiscoverFeedProvider* discover_feed_provider_;
DISALLOW_COPY_AND_ASSIGN(DiscoverFeedService);
};
#endif // IOS_CHROME_BROWSER_DISCOVER_FEED_DISCOVER_FEED_SERVICE_H_
// Copyright 2020 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.
#include "ios/chrome/browser/discover_feed/discover_feed_service.h"
#import "ios/public/provider/chrome/browser/discover_feed/discover_feed_provider.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
DiscoverFeedService::DiscoverFeedService(
signin::IdentityManager* identity_manager,
AuthenticationService* authentication_service,
DiscoverFeedProvider* feed_provider)
: identity_manager_(identity_manager),
authentication_service_(authentication_service),
discover_feed_provider_(feed_provider) {
if (identity_manager_) {
identity_manager_->AddObserver(this);
}
discover_feed_provider_->StartFeed(authentication_service_);
}
DiscoverFeedService::~DiscoverFeedService() {}
void DiscoverFeedService::Shutdown() {
if (identity_manager_) {
identity_manager_->RemoveObserver(this);
}
}
void DiscoverFeedService::OnPrimaryAccountSet(
const CoreAccountInfo& primary_account_info) {
discover_feed_provider_->UpdateFeedForAccountChange();
}
void DiscoverFeedService::OnPrimaryAccountCleared(
const CoreAccountInfo& previous_primary_account_info) {
discover_feed_provider_->UpdateFeedForAccountChange();
}
// Copyright 2020 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 IOS_CHROME_BROWSER_DISCOVER_FEED_DISCOVER_FEED_SERVICE_FACTORY_H_
#define IOS_CHROME_BROWSER_DISCOVER_FEED_DISCOVER_FEED_SERVICE_FACTORY_H_
#include "base/no_destructor.h"
#include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
class ChromeBrowserState;
class DiscoverFeedService;
// Singleton that owns all DiscoverFeedServices and associates them with
// ChromeBrowserState.
class DiscoverFeedServiceFactory : public BrowserStateKeyedServiceFactory {
public:
static DiscoverFeedService* GetForBrowserState(
ChromeBrowserState* browser_state);
static DiscoverFeedServiceFactory* GetInstance();
private:
friend class base::NoDestructor<DiscoverFeedServiceFactory>;
DiscoverFeedServiceFactory();
~DiscoverFeedServiceFactory() override;
// BrowserStateKeyedServiceFactory implementation.
std::unique_ptr<KeyedService> BuildServiceInstanceFor(
web::BrowserState* context) const override;
DISALLOW_COPY_AND_ASSIGN(DiscoverFeedServiceFactory);
};
#endif // IOS_CHROME_BROWSER_DISCOVER_FEED_DISCOVER_FEED_SERVICE_FACTORY_H_
// Copyright 2020 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.
#include "ios/chrome/browser/discover_feed/discover_feed_service_factory.h"
#include "components/keyed_service/ios/browser_state_dependency_manager.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/discover_feed/discover_feed_service.h"
#import "ios/chrome/browser/signin/authentication_service_factory.h"
#include "ios/chrome/browser/signin/identity_manager_factory.h"
#import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
#import "ios/public/provider/chrome/browser/discover_feed/discover_feed_provider.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
// static
DiscoverFeedService* DiscoverFeedServiceFactory::GetForBrowserState(
ChromeBrowserState* browser_state) {
return static_cast<DiscoverFeedService*>(
GetInstance()->GetServiceForBrowserState(browser_state, true));
}
// static
DiscoverFeedServiceFactory* DiscoverFeedServiceFactory::GetInstance() {
static base::NoDestructor<DiscoverFeedServiceFactory> instance;
return instance.get();
}
DiscoverFeedServiceFactory::DiscoverFeedServiceFactory()
: BrowserStateKeyedServiceFactory(
"DiscoverFeedService",
BrowserStateDependencyManager::GetInstance()) {
DependsOn(AuthenticationServiceFactory::GetInstance());
DependsOn(IdentityManagerFactory::GetInstance());
}
DiscoverFeedServiceFactory::~DiscoverFeedServiceFactory() = default;
std::unique_ptr<KeyedService>
DiscoverFeedServiceFactory::BuildServiceInstanceFor(
web::BrowserState* context) const {
ChromeBrowserState* browser_state =
ChromeBrowserState::FromBrowserState(context);
signin::IdentityManager* identity_manager =
IdentityManagerFactory::GetForBrowserState(browser_state);
AuthenticationService* authentication_service =
AuthenticationServiceFactory::GetForBrowserState(browser_state);
return std::make_unique<DiscoverFeedService>(
identity_manager, authentication_service,
ios::GetChromeBrowserProvider()->GetDiscoverFeedProvider());
}
...@@ -48,6 +48,7 @@ source_set("content_suggestions") { ...@@ -48,6 +48,7 @@ source_set("content_suggestions") {
"//ios/chrome/app/strings", "//ios/chrome/app/strings",
"//ios/chrome/browser", "//ios/chrome/browser",
"//ios/chrome/browser/browser_state", "//ios/chrome/browser/browser_state",
"//ios/chrome/browser/discover_feed",
"//ios/chrome/browser/drag_and_drop", "//ios/chrome/browser/drag_and_drop",
"//ios/chrome/browser/favicon", "//ios/chrome/browser/favicon",
"//ios/chrome/browser/main:public", "//ios/chrome/browser/main:public",
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "components/ntp_tiles/most_visited_sites.h" #include "components/ntp_tiles/most_visited_sites.h"
#include "components/prefs/pref_service.h" #include "components/prefs/pref_service.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/discover_feed/discover_feed_service_factory.h"
#include "ios/chrome/browser/drag_and_drop/drag_and_drop_flag.h" #include "ios/chrome/browser/drag_and_drop/drag_and_drop_flag.h"
#import "ios/chrome/browser/drag_and_drop/url_drag_drop_handler.h" #import "ios/chrome/browser/drag_and_drop/url_drag_drop_handler.h"
#include "ios/chrome/browser/favicon/ios_chrome_large_icon_cache_factory.h" #include "ios/chrome/browser/favicon/ios_chrome_large_icon_cache_factory.h"
...@@ -197,6 +198,11 @@ ...@@ -197,6 +198,11 @@
ReadingListModelFactory::GetForBrowserState( ReadingListModelFactory::GetForBrowserState(
self.browser->GetBrowserState()); self.browser->GetBrowserState());
if (IsDiscoverFeedEnabled()) {
// Creating the DiscoverFeedService will start the DiscoverFeed.
DiscoverFeedServiceFactory::GetForBrowserState(
self.browser->GetBrowserState());
}
self.discoverFeedViewController = [self discoverFeed]; self.discoverFeedViewController = [self discoverFeed];
self.contentSuggestionsMediator = [[ContentSuggestionsMediator alloc] self.contentSuggestionsMediator = [[ContentSuggestionsMediator alloc]
......
...@@ -7,9 +7,8 @@ ...@@ -7,9 +7,8 @@
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#include "base/ios/block_types.h"
@protocol ApplicationCommands; @protocol ApplicationCommands;
class AuthenticationService;
class Browser; class Browser;
// DiscoverFeedProvider allows embedders to provide functionality for a Discover // DiscoverFeedProvider allows embedders to provide functionality for a Discover
...@@ -35,6 +34,8 @@ class DiscoverFeedProvider { ...@@ -35,6 +34,8 @@ class DiscoverFeedProvider {
DiscoverFeedProvider(const DiscoverFeedProvider&) = delete; DiscoverFeedProvider(const DiscoverFeedProvider&) = delete;
DiscoverFeedProvider& operator=(const DiscoverFeedProvider&) = delete; DiscoverFeedProvider& operator=(const DiscoverFeedProvider&) = delete;
// Starts the Feed using |auth_service| to check if user is Signed In/Out.
virtual void StartFeed(AuthenticationService* auth_service);
// Returns true if the Discover Feed is enabled. // Returns true if the Discover Feed is enabled.
virtual bool IsDiscoverFeedEnabled(); virtual bool IsDiscoverFeedEnabled();
// Returns the Discover Feed ViewController. // Returns the Discover Feed ViewController.
...@@ -45,9 +46,8 @@ class DiscoverFeedProvider { ...@@ -45,9 +46,8 @@ class DiscoverFeedProvider {
// Refreshes the Discover Feed. Once the Feed model is refreshed it will // Refreshes the Discover Feed. Once the Feed model is refreshed it will
// update all ViewControllers returned by NewFeedViewController. // update all ViewControllers returned by NewFeedViewController.
virtual void RefreshFeed(); virtual void RefreshFeed();
// DEPRECATED. Delete once https://crrev.com/i/3205705 lands, along // Updates the Feed for an account change e.g. Signing In/Out.
// base/ios/block_types.h virtual void UpdateFeedForAccountChange();
virtual void RefreshFeedWithCompletion(ProceduralBlock completion);
// Methods to register or remove observers. // Methods to register or remove observers.
virtual void AddObserver(Observer* observer); virtual void AddObserver(Observer* observer);
virtual void RemoveObserver(Observer* observer); virtual void RemoveObserver(Observer* observer);
......
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
void DiscoverFeedProvider::StartFeed(AuthenticationService* auth_service) {}
bool DiscoverFeedProvider::IsDiscoverFeedEnabled() { bool DiscoverFeedProvider::IsDiscoverFeedEnabled() {
return false; return false;
} }
...@@ -20,8 +22,8 @@ UIViewController* DiscoverFeedProvider::NewFeedViewController( ...@@ -20,8 +22,8 @@ UIViewController* DiscoverFeedProvider::NewFeedViewController(
void DiscoverFeedProvider::UpdateTheme() {} void DiscoverFeedProvider::UpdateTheme() {}
void DiscoverFeedProvider::RefreshFeed() {} void DiscoverFeedProvider::RefreshFeed() {}
void DiscoverFeedProvider::RefreshFeedWithCompletion(
ProceduralBlock completion) {} void DiscoverFeedProvider::UpdateFeedForAccountChange() {}
void DiscoverFeedProvider::AddObserver(Observer* observer) {} void DiscoverFeedProvider::AddObserver(Observer* observer) {}
void DiscoverFeedProvider::RemoveObserver(Observer* observer) {} void DiscoverFeedProvider::RemoveObserver(Observer* observer) {}
......
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