Commit cbf0f912 authored by Mikel Astiz's avatar Mikel Astiz Committed by Commit Bot

Simplify ios session sync logic

SessionSyncService's API is sufficient to achieve the desired
behavior, i.e. distinguish the exact state for tab sync: off,
initial download in progress and done. It also issues a
notification every time that state changes, so there's no need to
monitor updates from ProfileSyncService directly.

Bug: 895455
Change-Id: Icf66328fdde97f833e178f0571dedb248c91beca
Reviewed-on: https://chromium-review.googlesource.com/c/1344029Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Commit-Queue: Mikel Astiz <mastiz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#612077}
parent 742582a3
...@@ -73,7 +73,7 @@ void SyncSetupService::SetDataTypeEnabled(syncer::ModelType datatype, ...@@ -73,7 +73,7 @@ void SyncSetupService::SetDataTypeEnabled(syncer::ModelType datatype,
SetSyncEnabled(false); SetSyncEnabled(false);
} }
bool SyncSetupService::UserActionIsRequiredToHaveSyncWork() { bool SyncSetupService::UserActionIsRequiredToHaveTabSyncWork() {
if (!IsSyncEnabled() || !IsDataTypePreferred(syncer::PROXY_TABS)) { if (!IsSyncEnabled() || !IsDataTypePreferred(syncer::PROXY_TABS)) {
return true; return true;
} }
......
...@@ -44,7 +44,7 @@ class SyncSetupService : public KeyedService { ...@@ -44,7 +44,7 @@ class SyncSetupService : public KeyedService {
kNumberOfSyncableDatatypes kNumberOfSyncableDatatypes
}; };
SyncSetupService(syncer::SyncService* sync_service); explicit SyncSetupService(syncer::SyncService* sync_service);
~SyncSetupService() override; ~SyncSetupService() override;
// Returns the |syncer::ModelType| associated to the given // Returns the |syncer::ModelType| associated to the given
...@@ -72,8 +72,8 @@ class SyncSetupService : public KeyedService { ...@@ -72,8 +72,8 @@ class SyncSetupService : public KeyedService {
void SetDataTypeEnabled(syncer::ModelType datatype, bool enabled); void SetDataTypeEnabled(syncer::ModelType datatype, bool enabled);
// Returns whether the user needs to enter a passphrase or enable sync to make // Returns whether the user needs to enter a passphrase or enable sync to make
// sync work. // tab sync work.
bool UserActionIsRequiredToHaveSyncWork(); bool UserActionIsRequiredToHaveTabSyncWork();
// Returns whether all datatypes are being synced. // Returns whether all datatypes are being synced.
virtual bool IsSyncingAllDataTypes() const; virtual bool IsSyncingAllDataTypes() const;
......
...@@ -18,7 +18,6 @@ source_set("recent_tabs") { ...@@ -18,7 +18,6 @@ source_set("recent_tabs") {
":recent_tabs_ui", ":recent_tabs_ui",
"resources:show_history", "resources:show_history",
"//base", "//base",
"//components/browser_sync",
"//components/sessions", "//components/sessions",
"//components/sync", "//components/sync",
"//ios/chrome/app/strings", "//ios/chrome/app/strings",
...@@ -58,7 +57,6 @@ source_set("recent_tabs_ui") { ...@@ -58,7 +57,6 @@ source_set("recent_tabs_ui") {
] ]
deps = [ deps = [
"//base", "//base",
"//components/browser_sync",
"//components/sessions", "//components/sessions",
"//components/strings", "//components/strings",
"//components/sync", "//components/sync",
...@@ -97,7 +95,7 @@ source_set("unit_tests") { ...@@ -97,7 +95,7 @@ source_set("unit_tests") {
":recent_tabs_ui", ":recent_tabs_ui",
"//base", "//base",
"//components/browser_sync", "//components/browser_sync",
"//components/browser_sync:test_support", "//components/sync:test_support_model",
"//components/sync_sessions", "//components/sync_sessions",
"//ios/chrome/browser/browser_state:test_support", "//ios/chrome/browser/browser_state:test_support",
"//ios/chrome/browser/signin", "//ios/chrome/browser/signin",
......
...@@ -139,7 +139,7 @@ const CGFloat kFaviconMinWidthHeight = 16; ...@@ -139,7 +139,7 @@ const CGFloat kFaviconMinWidthHeight = 16;
DCHECK([self isSignedIn]); DCHECK([self isSignedIn]);
SyncSetupService* service = SyncSetupService* service =
SyncSetupServiceFactory::GetForBrowserState(_browserState); SyncSetupServiceFactory::GetForBrowserState(_browserState);
return !service->UserActionIsRequiredToHaveSyncWork(); return !service->UserActionIsRequiredToHaveTabSyncWork();
} }
// Returns whether this profile has any foreign sessions to sync. // Returns whether this profile has any foreign sessions to sync.
...@@ -148,25 +148,29 @@ const CGFloat kFaviconMinWidthHeight = 16; ...@@ -148,25 +148,29 @@ const CGFloat kFaviconMinWidthHeight = 16;
return SessionsSyncUserState::USER_SIGNED_OUT; return SessionsSyncUserState::USER_SIGNED_OUT;
if (![self isSyncTabsEnabled]) if (![self isSyncTabsEnabled])
return SessionsSyncUserState::USER_SIGNED_IN_SYNC_OFF; return SessionsSyncUserState::USER_SIGNED_IN_SYNC_OFF;
if ([self hasForeignSessions])
return SessionsSyncUserState::USER_SIGNED_IN_SYNC_ON_WITH_SESSIONS;
if (![self isSyncCompleted]) if (![self isSyncCompleted])
return SessionsSyncUserState::USER_SIGNED_IN_SYNC_IN_PROGRESS; return SessionsSyncUserState::USER_SIGNED_IN_SYNC_IN_PROGRESS;
if ([self hasForeignSessions])
return SessionsSyncUserState::USER_SIGNED_IN_SYNC_ON_WITH_SESSIONS;
return SessionsSyncUserState::USER_SIGNED_IN_SYNC_ON_NO_SESSIONS; return SessionsSyncUserState::USER_SIGNED_IN_SYNC_ON_NO_SESSIONS;
} }
- (BOOL)isSyncCompleted {
sync_sessions::SessionSyncService* service =
SessionSyncServiceFactory::GetForBrowserState(_browserState);
DCHECK(service);
return service->GetOpenTabsUIDelegate() != nullptr;
}
- (BOOL)hasForeignSessions { - (BOOL)hasForeignSessions {
sync_sessions::SessionSyncService* service = sync_sessions::SessionSyncService* service =
SessionSyncServiceFactory::GetForBrowserState(_browserState); SessionSyncServiceFactory::GetForBrowserState(_browserState);
DCHECK(service); DCHECK(service);
sync_sessions::OpenTabsUIDelegate* openTabs = sync_sessions::OpenTabsUIDelegate* openTabs =
service->GetOpenTabsUIDelegate(); service->GetOpenTabsUIDelegate();
DCHECK(openTabs);
std::vector<const sync_sessions::SyncedSession*> sessions; std::vector<const sync_sessions::SyncedSession*> sessions;
return openTabs ? openTabs->GetAllForeignSessions(&sessions) : NO; return openTabs->GetAllForeignSessions(&sessions);
}
- (BOOL)isSyncCompleted {
return _syncedSessionsObserver->IsFirstSyncCycleCompleted();
} }
#pragma mark - RecentTabsTableViewControllerDelegate #pragma mark - RecentTabsTableViewControllerDelegate
......
...@@ -11,8 +11,6 @@ ...@@ -11,8 +11,6 @@
#include "base/callback_list.h" #include "base/callback_list.h"
#include "base/macros.h" #include "base/macros.h"
#include "components/sync/driver/sync_service_observer.h"
#import "ios/chrome/browser/sync/sync_observer_bridge.h"
#include "services/identity/public/cpp/identity_manager.h" #include "services/identity/public/cpp/identity_manager.h"
namespace ios { namespace ios {
...@@ -23,7 +21,7 @@ namespace identity { ...@@ -23,7 +21,7 @@ namespace identity {
class IdentityManager; class IdentityManager;
} }
@protocol SyncedSessionsObserver<SyncObserverModelBridge> @protocol SyncedSessionsObserver
// Reloads the session data. // Reloads the session data.
- (void)reloadSessions; - (void)reloadSessions;
@end @end
...@@ -33,21 +31,15 @@ namespace synced_sessions { ...@@ -33,21 +31,15 @@ namespace synced_sessions {
// Bridge class that will notify the panel when the remote sessions content // Bridge class that will notify the panel when the remote sessions content
// change. // change.
class SyncedSessionsObserverBridge class SyncedSessionsObserverBridge
: public SyncObserverBridge, : public identity::IdentityManager::Observer {
public identity::IdentityManager::Observer {
public: public:
SyncedSessionsObserverBridge(id<SyncedSessionsObserver> owner, SyncedSessionsObserverBridge(id<SyncedSessionsObserver> owner,
ios::ChromeBrowserState* browserState); ios::ChromeBrowserState* browserState);
~SyncedSessionsObserverBridge() override; ~SyncedSessionsObserverBridge() override;
// SyncObserverBridge implementation.
void OnSyncConfigurationCompleted(syncer::SyncService* sync) override;
// identity::IdentityManager::Observer implementation. // identity::IdentityManager::Observer implementation.
void OnPrimaryAccountCleared( void OnPrimaryAccountCleared(
const AccountInfo& previous_primary_account_info) override; const AccountInfo& previous_primary_account_info) override;
// Returns true if the first sync cycle that contains session information is
// completed. Returns false otherwise.
bool IsFirstSyncCycleCompleted();
// Returns true if user is signed in. // Returns true if user is signed in.
bool IsSignedIn(); bool IsSignedIn();
...@@ -56,7 +48,6 @@ class SyncedSessionsObserverBridge ...@@ -56,7 +48,6 @@ class SyncedSessionsObserverBridge
__weak id<SyncedSessionsObserver> owner_ = nil; __weak id<SyncedSessionsObserver> owner_ = nil;
identity::IdentityManager* identity_manager_ = nullptr; identity::IdentityManager* identity_manager_ = nullptr;
ios::ChromeBrowserState* browser_state_;
ScopedObserver<identity::IdentityManager, identity::IdentityManager::Observer> ScopedObserver<identity::IdentityManager, identity::IdentityManager::Observer>
identity_manager_observer_; identity_manager_observer_;
std::unique_ptr<base::CallbackList<void()>::Subscription> std::unique_ptr<base::CallbackList<void()>::Subscription>
...@@ -67,4 +58,4 @@ class SyncedSessionsObserverBridge ...@@ -67,4 +58,4 @@ class SyncedSessionsObserverBridge
} // namespace synced_sessions } // namespace synced_sessions
#endif // IOS_CHROME_BROWSER_SYNC_SYNCED_SESSIONS_BRIDGE_H_ #endif // IOS_CHROME_BROWSER_UI_RECENT_TABS_SYNCED_SESSIONS_BRIDGE_H_
...@@ -4,14 +4,10 @@ ...@@ -4,14 +4,10 @@
#import "ios/chrome/browser/ui/recent_tabs/synced_sessions_bridge.h" #import "ios/chrome/browser/ui/recent_tabs/synced_sessions_bridge.h"
#include "components/browser_sync/profile_sync_service.h"
#include "components/sync_sessions/session_sync_service.h" #include "components/sync_sessions/session_sync_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/signin/identity_manager_factory.h" #include "ios/chrome/browser/signin/identity_manager_factory.h"
#include "ios/chrome/browser/sync/profile_sync_service_factory.h"
#include "ios/chrome/browser/sync/session_sync_service_factory.h" #include "ios/chrome/browser/sync/session_sync_service_factory.h"
#include "ios/chrome/browser/sync/sync_setup_service.h"
#include "ios/chrome/browser/sync/sync_setup_service_factory.h"
#include "services/identity/public/cpp/identity_manager.h" #include "services/identity/public/cpp/identity_manager.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
...@@ -25,13 +21,9 @@ namespace synced_sessions { ...@@ -25,13 +21,9 @@ namespace synced_sessions {
SyncedSessionsObserverBridge::SyncedSessionsObserverBridge( SyncedSessionsObserverBridge::SyncedSessionsObserverBridge(
id<SyncedSessionsObserver> owner, id<SyncedSessionsObserver> owner,
ios::ChromeBrowserState* browserState) ios::ChromeBrowserState* browserState)
: SyncObserverBridge( : owner_(owner),
owner,
ProfileSyncServiceFactory::GetForBrowserState(browserState)),
owner_(owner),
identity_manager_( identity_manager_(
IdentityManagerFactory::GetForBrowserState(browserState)), IdentityManagerFactory::GetForBrowserState(browserState)),
browser_state_(browserState),
identity_manager_observer_(this) { identity_manager_observer_(this) {
identity_manager_observer_.Add(identity_manager_); identity_manager_observer_.Add(identity_manager_);
...@@ -46,24 +38,6 @@ SyncedSessionsObserverBridge::SyncedSessionsObserverBridge( ...@@ -46,24 +38,6 @@ SyncedSessionsObserverBridge::SyncedSessionsObserverBridge(
SyncedSessionsObserverBridge::~SyncedSessionsObserverBridge() {} SyncedSessionsObserverBridge::~SyncedSessionsObserverBridge() {}
#pragma mark - SyncObserverBridge
void SyncedSessionsObserverBridge::OnSyncConfigurationCompleted(
syncer::SyncService* sync) {
// TODO(crbug.com/895455): This notification seems redundant because
// OnForeignSessionChanged() should be called when the initial sync is
// completed.
[owner_ reloadSessions];
}
bool SyncedSessionsObserverBridge::IsFirstSyncCycleCompleted() {
// TODO(crbug.com/895455): This could probably be implemented via
// SessionSyncService directly and possibly remove all dependencies to
// SyncService/SyncSetupService.
return SyncSetupServiceFactory::GetForBrowserState(browser_state_)
->IsDataTypeActive(syncer::SESSIONS);
}
#pragma mark - identity::IdentityManager::Observer #pragma mark - identity::IdentityManager::Observer
void SyncedSessionsObserverBridge::OnPrimaryAccountCleared( void SyncedSessionsObserverBridge::OnPrimaryAccountCleared(
......
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