OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_controller.h" | 5 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_controller.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #import "base/mac/foundation_util.h" | 8 #import "base/mac/foundation_util.h" |
9 #import "base/mac/scoped_nsobject.h" | |
10 #include "base/strings/sys_string_conversions.h" | 9 #include "base/strings/sys_string_conversions.h" |
11 #import "ios/chrome/browser/tabs/tab.h" | 10 #import "ios/chrome/browser/tabs/tab.h" |
12 #include "ios/chrome/browser/ui/ntp/recent_tabs/synced_sessions.h" | 11 #include "ios/chrome/browser/ui/ntp/recent_tabs/synced_sessions.h" |
13 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_cache.h" | 12 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_cache.h" |
14 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_cell.h" | 13 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_cell.h" |
15 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_overlay_view.h" | 14 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_overlay_view.h" |
16 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_view.h" | 15 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_view.h" |
17 #include "ios/chrome/browser/ui/tab_switcher/tab_switcher_session_changes.h" | 16 #include "ios/chrome/browser/ui/tab_switcher/tab_switcher_session_changes.h" |
18 | 17 |
| 18 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 19 #error "This file requires ARC support." |
| 20 #endif |
| 21 |
19 namespace { | 22 namespace { |
20 | 23 |
21 void FillVectorWithHashesUsingDistantSession( | 24 void FillVectorWithHashesUsingDistantSession( |
22 synced_sessions::DistantSession const& session, | 25 synced_sessions::DistantSession const& session, |
23 std::vector<size_t>* hashes) { | 26 std::vector<size_t>* hashes) { |
24 DCHECK(hashes); | 27 DCHECK(hashes); |
25 DCHECK(hashes->empty()); | 28 DCHECK(hashes->empty()); |
26 for (size_t i = 0; i < session.tabs.size(); ++i) { | 29 for (size_t i = 0; i < session.tabs.size(); ++i) { |
27 hashes->push_back(session.tabs[i]->hashOfUserVisibleProperties()); | 30 hashes->push_back(session.tabs[i]->hashOfUserVisibleProperties()); |
28 } | 31 } |
29 } | 32 } |
30 | 33 |
31 } // namespace | 34 } // namespace |
32 | 35 |
33 @interface TabSwitcherPanelController ()<UICollectionViewDataSource, | 36 @interface TabSwitcherPanelController ()<UICollectionViewDataSource, |
34 UICollectionViewDelegate, | 37 UICollectionViewDelegate, |
35 SessionCellDelegate> { | 38 SessionCellDelegate> { |
36 ios::ChromeBrowserState* _browserState; // Weak. | 39 ios::ChromeBrowserState* _browserState; // Weak. |
37 base::scoped_nsobject<TabSwitcherPanelView> _panelView; | 40 TabSwitcherPanelView* _panelView; |
38 base::scoped_nsobject<TabSwitcherModel> _model; | 41 TabSwitcherModel* _model; |
39 std::string _sessionTag; | 42 std::string _sessionTag; |
40 TabSwitcherSessionType _sessionType; | 43 TabSwitcherSessionType _sessionType; |
41 base::scoped_nsobject<TabSwitcherCache> _cache; | 44 TabSwitcherCache* _cache; |
42 base::scoped_nsobject<TabSwitcherPanelOverlayView> _overlayView; | 45 TabSwitcherPanelOverlayView* _overlayView; |
43 std::unique_ptr<const synced_sessions::DistantSession> _distantSession; | 46 std::unique_ptr<const synced_sessions::DistantSession> _distantSession; |
44 std::unique_ptr<const TabModelSnapshot> _localSession; | 47 std::unique_ptr<const TabModelSnapshot> _localSession; |
45 } | 48 } |
46 | 49 |
47 // Changes the visibility of the zero tab state overlay view. | 50 // Changes the visibility of the zero tab state overlay view. |
48 - (void)setZeroTabStateOverlayVisible:(BOOL)show; | 51 - (void)setZeroTabStateOverlayVisible:(BOOL)show; |
49 | 52 |
50 @end | 53 @end |
51 | 54 |
52 @implementation TabSwitcherPanelController | 55 @implementation TabSwitcherPanelController |
53 | 56 |
54 @synthesize delegate = _delegate; | 57 @synthesize delegate = _delegate; |
55 @synthesize sessionType = _sessionType; | 58 @synthesize sessionType = _sessionType; |
56 | 59 |
57 - (instancetype)initWithModel:(TabSwitcherModel*)model | 60 - (instancetype)initWithModel:(TabSwitcherModel*)model |
58 forDistantSessionWithTag:(std::string const&)sessionTag | 61 forDistantSessionWithTag:(std::string const&)sessionTag |
59 browserState:(ios::ChromeBrowserState*)browserState { | 62 browserState:(ios::ChromeBrowserState*)browserState { |
60 self = [super init]; | 63 self = [super init]; |
61 if (self) { | 64 if (self) { |
62 DCHECK(model); | 65 DCHECK(model); |
63 _sessionType = TabSwitcherSessionType::DISTANT_SESSION; | 66 _sessionType = TabSwitcherSessionType::DISTANT_SESSION; |
64 _model.reset([model retain]); | 67 _model = model; |
65 _distantSession = [model distantSessionForTag:sessionTag]; | 68 _distantSession = [model distantSessionForTag:sessionTag]; |
66 _sessionTag = sessionTag; | 69 _sessionTag = sessionTag; |
67 _browserState = browserState; | 70 _browserState = browserState; |
68 [self loadView]; | 71 [self loadView]; |
69 } | 72 } |
70 return self; | 73 return self; |
71 } | 74 } |
72 | 75 |
73 - (instancetype)initWithModel:(TabSwitcherModel*)model | 76 - (instancetype)initWithModel:(TabSwitcherModel*)model |
74 forLocalSessionOfType:(TabSwitcherSessionType)sessionType | 77 forLocalSessionOfType:(TabSwitcherSessionType)sessionType |
75 withCache:(TabSwitcherCache*)cache | 78 withCache:(TabSwitcherCache*)cache |
76 browserState:(ios::ChromeBrowserState*)browserState { | 79 browserState:(ios::ChromeBrowserState*)browserState { |
77 self = [super init]; | 80 self = [super init]; |
78 if (self) { | 81 if (self) { |
79 DCHECK(model); | 82 DCHECK(model); |
80 _sessionType = sessionType; | 83 _sessionType = sessionType; |
81 _model.reset([model retain]); | 84 _model = model; |
82 _localSession = [model tabModelSnapshotForLocalSession:sessionType]; | 85 _localSession = [model tabModelSnapshotForLocalSession:sessionType]; |
83 _cache.reset([cache retain]); | 86 _cache = cache; |
84 _browserState = browserState; | 87 _browserState = browserState; |
85 [self loadView]; | 88 [self loadView]; |
86 } | 89 } |
87 return self; | 90 return self; |
88 } | 91 } |
89 | 92 |
90 - (TabSwitcherPanelView*)view { | 93 - (TabSwitcherPanelView*)view { |
91 return _panelView; | 94 return _panelView; |
92 } | 95 } |
93 | 96 |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 return _overlayView && [_overlayView alpha] != 0.0; | 307 return _overlayView && [_overlayView alpha] != 0.0; |
305 } | 308 } |
306 | 309 |
307 - (void)setZeroTabStateOverlayVisible:(BOOL)show { | 310 - (void)setZeroTabStateOverlayVisible:(BOOL)show { |
308 if (show == [self isOverlayVisible]) | 311 if (show == [self isOverlayVisible]) |
309 return; | 312 return; |
310 | 313 |
311 DCHECK(TabSwitcherSessionTypeIsLocalSession(_sessionType)); | 314 DCHECK(TabSwitcherSessionTypeIsLocalSession(_sessionType)); |
312 | 315 |
313 if (!_overlayView) { | 316 if (!_overlayView) { |
314 _overlayView.reset([[TabSwitcherPanelOverlayView alloc] | 317 _overlayView = |
315 initWithFrame:[_panelView bounds] | 318 [[TabSwitcherPanelOverlayView alloc] initWithFrame:[_panelView bounds] |
316 browserState:_browserState]); | 319 browserState:_browserState]; |
317 [_overlayView | 320 [_overlayView |
318 setOverlayType: | 321 setOverlayType: |
319 (_sessionType == TabSwitcherSessionType::OFF_THE_RECORD_SESSION) | 322 (_sessionType == TabSwitcherSessionType::OFF_THE_RECORD_SESSION) |
320 ? TabSwitcherPanelOverlayType:: | 323 ? TabSwitcherPanelOverlayType:: |
321 OVERLAY_PANEL_USER_NO_INCOGNITO_TABS | 324 OVERLAY_PANEL_USER_NO_INCOGNITO_TABS |
322 : TabSwitcherPanelOverlayType::OVERLAY_PANEL_USER_NO_OPEN_TABS]; | 325 : TabSwitcherPanelOverlayType::OVERLAY_PANEL_USER_NO_OPEN_TABS]; |
323 | 326 |
324 [_overlayView setAlpha:0]; | 327 [_overlayView setAlpha:0]; |
325 [_overlayView setAutoresizingMask:UIViewAutoresizingFlexibleHeight | | 328 [_overlayView setAutoresizingMask:UIViewAutoresizingFlexibleHeight | |
326 UIViewAutoresizingFlexibleWidth]; | 329 UIViewAutoresizingFlexibleWidth]; |
327 [_panelView addSubview:_overlayView]; | 330 [_panelView addSubview:_overlayView]; |
328 [_overlayView setNeedsLayout]; | 331 [_overlayView setNeedsLayout]; |
329 } | 332 } |
330 | 333 |
331 [UIView | 334 [UIView |
332 animateWithDuration:0.25 | 335 animateWithDuration:0.25 |
333 animations:^{ | 336 animations:^{ |
334 [_overlayView setAlpha:show ? 1.0 : 0.0]; | 337 [_overlayView setAlpha:show ? 1.0 : 0.0]; |
335 [self.delegate | 338 [self.delegate |
336 tabSwitcherPanelControllerDidUpdateOverlayViewVisibility: | 339 tabSwitcherPanelControllerDidUpdateOverlayViewVisibility: |
337 self]; | 340 self]; |
338 }]; | 341 }]; |
339 } | 342 } |
340 | 343 |
341 - (void)loadView { | 344 - (void)loadView { |
342 _panelView.reset( | 345 _panelView = [[TabSwitcherPanelView alloc] initWithSessionType:_sessionType]; |
343 [[TabSwitcherPanelView alloc] initWithSessionType:_sessionType]); | 346 _panelView.collectionView.dataSource = self; |
344 _panelView.get().collectionView.dataSource = self; | 347 _panelView.collectionView.delegate = self; |
345 _panelView.get().collectionView.delegate = self; | |
346 } | 348 } |
347 | 349 |
348 - (synced_sessions::DistantSession const*)distantSession { | 350 - (synced_sessions::DistantSession const*)distantSession { |
349 return _distantSession.get(); | 351 return _distantSession.get(); |
350 } | 352 } |
351 | 353 |
352 @end | 354 @end |
OLD | NEW |