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,
SetSyncEnabled(false);
}
bool SyncSetupService::UserActionIsRequiredToHaveSyncWork() {
bool SyncSetupService::UserActionIsRequiredToHaveTabSyncWork() {
if (!IsSyncEnabled() || !IsDataTypePreferred(syncer::PROXY_TABS)) {
return true;
}
......
......@@ -44,7 +44,7 @@ class SyncSetupService : public KeyedService {
kNumberOfSyncableDatatypes
};
SyncSetupService(syncer::SyncService* sync_service);
explicit SyncSetupService(syncer::SyncService* sync_service);
~SyncSetupService() override;
// Returns the |syncer::ModelType| associated to the given
......@@ -72,8 +72,8 @@ class SyncSetupService : public KeyedService {
void SetDataTypeEnabled(syncer::ModelType datatype, bool enabled);
// Returns whether the user needs to enter a passphrase or enable sync to make
// sync work.
bool UserActionIsRequiredToHaveSyncWork();
// tab sync work.
bool UserActionIsRequiredToHaveTabSyncWork();
// Returns whether all datatypes are being synced.
virtual bool IsSyncingAllDataTypes() const;
......
......@@ -18,7 +18,6 @@ source_set("recent_tabs") {
":recent_tabs_ui",
"resources:show_history",
"//base",
"//components/browser_sync",
"//components/sessions",
"//components/sync",
"//ios/chrome/app/strings",
......@@ -58,7 +57,6 @@ source_set("recent_tabs_ui") {
]
deps = [
"//base",
"//components/browser_sync",
"//components/sessions",
"//components/strings",
"//components/sync",
......@@ -97,7 +95,7 @@ source_set("unit_tests") {
":recent_tabs_ui",
"//base",
"//components/browser_sync",
"//components/browser_sync:test_support",
"//components/sync:test_support_model",
"//components/sync_sessions",
"//ios/chrome/browser/browser_state:test_support",
"//ios/chrome/browser/signin",
......
......@@ -139,7 +139,7 @@ const CGFloat kFaviconMinWidthHeight = 16;
DCHECK([self isSignedIn]);
SyncSetupService* service =
SyncSetupServiceFactory::GetForBrowserState(_browserState);
return !service->UserActionIsRequiredToHaveSyncWork();
return !service->UserActionIsRequiredToHaveTabSyncWork();
}
// Returns whether this profile has any foreign sessions to sync.
......@@ -148,25 +148,29 @@ const CGFloat kFaviconMinWidthHeight = 16;
return SessionsSyncUserState::USER_SIGNED_OUT;
if (![self isSyncTabsEnabled])
return SessionsSyncUserState::USER_SIGNED_IN_SYNC_OFF;
if ([self hasForeignSessions])
return SessionsSyncUserState::USER_SIGNED_IN_SYNC_ON_WITH_SESSIONS;
if (![self isSyncCompleted])
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;
}
- (BOOL)isSyncCompleted {
sync_sessions::SessionSyncService* service =
SessionSyncServiceFactory::GetForBrowserState(_browserState);
DCHECK(service);
return service->GetOpenTabsUIDelegate() != nullptr;
}
- (BOOL)hasForeignSessions {
sync_sessions::SessionSyncService* service =
SessionSyncServiceFactory::GetForBrowserState(_browserState);
DCHECK(service);
sync_sessions::OpenTabsUIDelegate* openTabs =
service->GetOpenTabsUIDelegate();
DCHECK(openTabs);
std::vector<const sync_sessions::SyncedSession*> sessions;
return openTabs ? openTabs->GetAllForeignSessions(&sessions) : NO;
}
- (BOOL)isSyncCompleted {
return _syncedSessionsObserver->IsFirstSyncCycleCompleted();
return openTabs->GetAllForeignSessions(&sessions);
}
#pragma mark - RecentTabsTableViewControllerDelegate
......
......@@ -11,8 +11,6 @@
#include "base/callback_list.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"
namespace ios {
......@@ -23,7 +21,7 @@ namespace identity {
class IdentityManager;
}
@protocol SyncedSessionsObserver<SyncObserverModelBridge>
@protocol SyncedSessionsObserver
// Reloads the session data.
- (void)reloadSessions;
@end
......@@ -33,21 +31,15 @@ namespace synced_sessions {
// Bridge class that will notify the panel when the remote sessions content
// change.
class SyncedSessionsObserverBridge
: public SyncObserverBridge,
public identity::IdentityManager::Observer {
: public identity::IdentityManager::Observer {
public:
SyncedSessionsObserverBridge(id<SyncedSessionsObserver> owner,
ios::ChromeBrowserState* browserState);
~SyncedSessionsObserverBridge() override;
// SyncObserverBridge implementation.
void OnSyncConfigurationCompleted(syncer::SyncService* sync) override;
// identity::IdentityManager::Observer implementation.
void OnPrimaryAccountCleared(
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.
bool IsSignedIn();
......@@ -56,7 +48,6 @@ class SyncedSessionsObserverBridge
__weak id<SyncedSessionsObserver> owner_ = nil;
identity::IdentityManager* identity_manager_ = nullptr;
ios::ChromeBrowserState* browser_state_;
ScopedObserver<identity::IdentityManager, identity::IdentityManager::Observer>
identity_manager_observer_;
std::unique_ptr<base::CallbackList<void()>::Subscription>
......@@ -67,4 +58,4 @@ class SyncedSessionsObserverBridge
} // 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 @@
#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 "ios/chrome/browser/browser_state/chrome_browser_state.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/sync_setup_service.h"
#include "ios/chrome/browser/sync/sync_setup_service_factory.h"
#include "services/identity/public/cpp/identity_manager.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
......@@ -25,13 +21,9 @@ namespace synced_sessions {
SyncedSessionsObserverBridge::SyncedSessionsObserverBridge(
id<SyncedSessionsObserver> owner,
ios::ChromeBrowserState* browserState)
: SyncObserverBridge(
owner,
ProfileSyncServiceFactory::GetForBrowserState(browserState)),
owner_(owner),
: owner_(owner),
identity_manager_(
IdentityManagerFactory::GetForBrowserState(browserState)),
browser_state_(browserState),
identity_manager_observer_(this) {
identity_manager_observer_.Add(identity_manager_);
......@@ -46,24 +38,6 @@ 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
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