Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_panel_controller.mm

Issue 2589803002: Upstream Chrome on iOS source code [6/11]. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_panel_controller.h"
6
7 #include <memory>
8
9 #include "base/mac/scoped_nsobject.h"
10 #include "components/browser_sync/profile_sync_service.h"
11 #include "components/sessions/core/tab_restore_service.h"
12 #include "components/signin/core/browser/signin_manager.h"
13 #include "components/sync_sessions/open_tabs_ui_delegate.h"
14 #include "components/sync_sessions/synced_session.h"
15 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
16 #include "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h"
17 #include "ios/chrome/browser/signin/signin_manager_factory.h"
18 #include "ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h"
19 #include "ios/chrome/browser/sync/sync_setup_service.h"
20 #include "ios/chrome/browser/sync/sync_setup_service_factory.h"
21 #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_bridges.h"
22 #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_view_controller .h"
23 #import "ios/chrome/browser/ui/ntp/recent_tabs/synced_sessions_bridge.h"
24
25 @interface RecentTabsPanelController ()<SyncedSessionsObserver,
26 RecentTabsTableViewControllerDelegate> {
27 std::unique_ptr<synced_sessions::SyncedSessionsObserverBridge>
28 _syncedSessionsObserver;
29 std::unique_ptr<recent_tabs::ClosedTabsObserverBridge> _closedTabsObserver;
30 SessionsSyncUserState _userState;
31 base::scoped_nsobject<RecentTabsTableViewController> _tableViewController;
32 ios::ChromeBrowserState* _browserState; // Weak.
33 }
34
35 // Return the user's current sign-in and chrome-sync state.
36 - (SessionsSyncUserState)userSignedInState;
37 // Utility functions for -userSignedInState so these can be mocked out
38 // easily for unit tests.
39 - (BOOL)isSignedIn;
40 - (BOOL)isSyncTabsEnabled;
41 - (BOOL)hasForeignSessions;
42 - (BOOL)isSyncCompleted;
43 // Reload the panel.
44 - (void)refreshSessionsView;
45 // Force a contact to the sync server to reload remote sessions.
46 - (void)reloadSessionsData;
47
48 @end
49
50 // The controller for RecentTabs panel that is added to the NewTabPage
51 // Instantiate a UITableView and a UITableViewController, and notifies the
52 // UITableViewController of any signed in state change.
53 @implementation RecentTabsPanelController
54
55 // Property declared in NewTabPagePanelProtocol.
56 @synthesize delegate = _delegate;
57
58 - (instancetype)init {
59 NOTREACHED();
60 return nil;
61 }
62
63 - (instancetype)initWithNibNamed:(NSString*)nibName {
64 NOTREACHED();
65 return nil;
66 }
67
68 - (instancetype)initWithLoader:(id<UrlLoader>)loader
69 browserState:(ios::ChromeBrowserState*)browserState {
70 return [self initWithController:[[[RecentTabsTableViewController alloc]
71 initWithBrowserState:browserState
72 loader:loader] autorelease]
73 browserState:browserState];
74 }
75
76 - (instancetype)initWithController:(RecentTabsTableViewController*)controller
77 browserState:(ios::ChromeBrowserState*)browserState {
78 self = [super init];
79 if (self) {
80 DCHECK(controller);
81 DCHECK(browserState);
82 _browserState = browserState;
83 _tableViewController.reset([controller retain]);
84 [_tableViewController setDelegate:self];
85 [self initObservers];
86 [self reloadSessions];
87 }
88 return self;
89 }
90
91 - (void)dealloc {
92 [_tableViewController setDelegate:nil];
93 [self deallocObservers];
94 [super dealloc];
95 }
96
97 - (void)initObservers {
98 if (!_syncedSessionsObserver) {
99 _syncedSessionsObserver.reset(
100 new synced_sessions::SyncedSessionsObserverBridge(self, _browserState));
101 }
102 if (!_closedTabsObserver) {
103 _closedTabsObserver.reset(new recent_tabs::ClosedTabsObserverBridge(self));
104 sessions::TabRestoreService* restoreService =
105 IOSChromeTabRestoreServiceFactory::GetForBrowserState(_browserState);
106 if (restoreService)
107 restoreService->AddObserver(_closedTabsObserver.get());
108 [_tableViewController setTabRestoreService:restoreService];
109 }
110 }
111
112 - (void)deallocObservers {
113 _syncedSessionsObserver.reset();
114
115 if (_closedTabsObserver) {
116 sessions::TabRestoreService* restoreService =
117 IOSChromeTabRestoreServiceFactory::GetForBrowserState(_browserState);
118 if (restoreService) {
119 restoreService->RemoveObserver(_closedTabsObserver.get());
120 }
121 _closedTabsObserver.reset();
122 }
123 }
124
125 #pragma mark - Exposed to the SyncedSessionsObserver
126
127 - (void)reloadSessions {
128 [self reloadSessionsData];
129 [self refreshSessionsView];
130 }
131
132 - (void)onSyncStateChanged {
133 [self refreshSessionsView];
134 }
135
136 #pragma mark - Exposed to the ClosedTabsObserverBridge
137
138 - (void)reloadClosedTabsList {
139 sessions::TabRestoreService* restoreService =
140 IOSChromeTabRestoreServiceFactory::GetForBrowserState(_browserState);
141 restoreService->LoadTabsFromLastSession();
142 [_tableViewController refreshRecentlyClosedTabs];
143 }
144
145 - (void)tabRestoreServiceDestroyed {
146 [_tableViewController setTabRestoreService:nullptr];
147 }
148
149 #pragma mark - NewTabPagePanelProtocol
150
151 - (void)dismissModals {
152 [_tableViewController dismissModals];
153 }
154
155 - (void)dismissKeyboard {
156 }
157
158 - (void)reload {
159 [self reloadSessions];
160 }
161
162 - (void)wasShown {
163 [[_tableViewController tableView] reloadData];
164 [self initObservers];
165 }
166
167 - (void)wasHidden {
168 [self deallocObservers];
169 }
170
171 - (void)setScrollsToTop:(BOOL)enabled {
172 [_tableViewController setScrollsToTop:enabled];
173 }
174
175 - (CGFloat)alphaForBottomShadow {
176 UITableView* tableView = [_tableViewController tableView];
177 CGFloat contentHeight = tableView.contentSize.height;
178 CGFloat scrollViewHeight = tableView.frame.size.height;
179 CGFloat offsetY = tableView.contentOffset.y;
180
181 CGFloat pixelsBelowFrame = contentHeight - offsetY - scrollViewHeight;
182 CGFloat alpha = pixelsBelowFrame / kNewTabPageDistanceToFadeShadow;
183 alpha = MIN(MAX(alpha, 0), 1);
184 return alpha;
185 }
186
187 - (UIView*)view {
188 return [_tableViewController view];
189 }
190
191 #pragma mark
192 #pragma mark - Private
193
194 - (BOOL)isSignedIn {
195 SigninManager* signin_manager =
196 ios::SigninManagerFactory::GetForBrowserState(_browserState);
197 return signin_manager->IsAuthenticated();
198 }
199
200 - (BOOL)isSyncTabsEnabled {
201 DCHECK([self isSignedIn]);
202 SyncSetupService* service =
203 SyncSetupServiceFactory::GetForBrowserState(_browserState);
204 return !service->UserActionIsRequiredToHaveSyncWork();
205 }
206
207 // Returns whether this profile has any foreign sessions to sync.
208 - (SessionsSyncUserState)userSignedInState {
209 if (![self isSignedIn])
210 return SessionsSyncUserState::USER_SIGNED_OUT;
211 if (![self isSyncTabsEnabled])
212 return SessionsSyncUserState::USER_SIGNED_IN_SYNC_OFF;
213 if ([self hasForeignSessions])
214 return SessionsSyncUserState::USER_SIGNED_IN_SYNC_ON_WITH_SESSIONS;
215 if (![self isSyncCompleted])
216 return SessionsSyncUserState::USER_SIGNED_IN_SYNC_IN_PROGRESS;
217 return SessionsSyncUserState::USER_SIGNED_IN_SYNC_ON_NO_SESSIONS;
218 }
219
220 - (BOOL)hasForeignSessions {
221 browser_sync::ProfileSyncService* service =
222 IOSChromeProfileSyncServiceFactory::GetForBrowserState(_browserState);
223 DCHECK(service);
224 sync_sessions::OpenTabsUIDelegate* openTabs =
225 service->GetOpenTabsUIDelegate();
226 std::vector<const sync_sessions::SyncedSession*> sessions;
227 return openTabs ? openTabs->GetAllForeignSessions(&sessions) : NO;
228 }
229
230 - (BOOL)isSyncCompleted {
231 return _syncedSessionsObserver->IsFirstSyncCycleCompleted();
232 }
233
234 - (void)reloadSessionsData {
235 DVLOG(1) << "Triggering sync refresh for sessions datatype.";
236 const syncer::ModelTypeSet types(syncer::SESSIONS);
237 // Requests a sync refresh of the sessions for the current profile.
238 IOSChromeProfileSyncServiceFactory::GetForBrowserState(_browserState)
239 ->TriggerRefresh(types);
240 }
241
242 - (void)refreshSessionsView {
243 [_tableViewController refreshUserState:[self userSignedInState]];
244 }
245
246 #pragma mark - RecentTabsTableViewControllerDelegate
247
248 - (void)recentTabsTableViewContentMoved:(UITableView*)tableView {
249 [self.delegate updateNtpBarShadowForPanelController:self];
250 }
251
252 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698