| 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_controller.h" | 5 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_controller.h" |
| 6 | 6 |
| 7 #include "base/ios/block_types.h" | 7 #include "base/ios/block_types.h" |
| 8 #include "base/ios/weak_nsobject.h" | |
| 9 #include "base/mac/scoped_nsobject.h" | |
| 10 #include "base/metrics/user_metrics.h" | 8 #include "base/metrics/user_metrics.h" |
| 11 #include "base/metrics/user_metrics_action.h" | 9 #include "base/metrics/user_metrics_action.h" |
| 12 #include "base/strings/sys_string_conversions.h" | 10 #include "base/strings/sys_string_conversions.h" |
| 13 #include "components/browser_sync/profile_sync_service.h" | 11 #include "components/browser_sync/profile_sync_service.h" |
| 14 #include "components/sessions/core/tab_restore_service_helper.h" | 12 #include "components/sessions/core/tab_restore_service_helper.h" |
| 15 #include "components/sync/driver/sync_service.h" | 13 #include "components/sync/driver/sync_service.h" |
| 16 #include "components/sync_sessions/open_tabs_ui_delegate.h" | 14 #include "components/sync_sessions/open_tabs_ui_delegate.h" |
| 17 #import "ios/chrome/browser/browser_state/chrome_browser_state.h" | 15 #import "ios/chrome/browser/browser_state/chrome_browser_state.h" |
| 18 #include "ios/chrome/browser/chrome_url_constants.h" | 16 #include "ios/chrome/browser/chrome_url_constants.h" |
| 19 #import "ios/chrome/browser/metrics/tab_usage_recorder.h" | 17 #import "ios/chrome/browser/metrics/tab_usage_recorder.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 46 #include "ios/chrome/browser/ui/ui_util.h" | 44 #include "ios/chrome/browser/ui/ui_util.h" |
| 47 #import "ios/chrome/browser/ui/uikit_ui_util.h" | 45 #import "ios/chrome/browser/ui/uikit_ui_util.h" |
| 48 #include "ios/chrome/grit/ios_strings.h" | 46 #include "ios/chrome/grit/ios_strings.h" |
| 49 #include "ios/chrome/grit/ios_theme_resources.h" | 47 #include "ios/chrome/grit/ios_theme_resources.h" |
| 50 #import "ios/third_party/material_components_ios/src/components/Palettes/src/Mat
erialPalettes.h" | 48 #import "ios/third_party/material_components_ios/src/components/Palettes/src/Mat
erialPalettes.h" |
| 51 #import "ios/web/public/navigation_manager.h" | 49 #import "ios/web/public/navigation_manager.h" |
| 52 #include "ios/web/public/referrer.h" | 50 #include "ios/web/public/referrer.h" |
| 53 #include "ui/base/l10n/l10n_util.h" | 51 #include "ui/base/l10n/l10n_util.h" |
| 54 #include "ui/base/l10n/l10n_util_mac.h" | 52 #include "ui/base/l10n/l10n_util_mac.h" |
| 55 | 53 |
| 54 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 55 #error "This file requires ARC support." |
| 56 #endif |
| 57 |
| 56 namespace { | 58 namespace { |
| 57 | 59 |
| 58 // Offsets for computing the panels' indexes in the TabSwitcherView. | 60 // Offsets for computing the panels' indexes in the TabSwitcherView. |
| 59 const int kSignInPromoPanelIndex = 2; | 61 const int kSignInPromoPanelIndex = 2; |
| 60 const int kHeaderDistantSessionIndexOffset = 2; | 62 const int kHeaderDistantSessionIndexOffset = 2; |
| 61 const int kLocalTabsOffTheRecordPanelIndex = 0; | 63 const int kLocalTabsOffTheRecordPanelIndex = 0; |
| 62 const int kLocalTabsOnTheRecordPanelIndex = 1; | 64 const int kLocalTabsOnTheRecordPanelIndex = 1; |
| 63 // The duration of the tab switcher toggle animation. | 65 // The duration of the tab switcher toggle animation. |
| 64 const CGFloat kTransitionAnimationDuration = 0.25; | 66 const CGFloat kTransitionAnimationDuration = 0.25; |
| 65 // The height of the browser view controller header. | 67 // The height of the browser view controller header. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 84 TabSwitcherHeaderViewDataSource, | 86 TabSwitcherHeaderViewDataSource, |
| 85 TabSwitcherPanelControllerDelegate> { | 87 TabSwitcherPanelControllerDelegate> { |
| 86 // weak. | 88 // weak. |
| 87 ios::ChromeBrowserState* _browserState; | 89 ios::ChromeBrowserState* _browserState; |
| 88 // weak. | 90 // weak. |
| 89 id<TabSwitcherDelegate> _delegate; | 91 id<TabSwitcherDelegate> _delegate; |
| 90 // The model selected when the tab switcher was toggled. | 92 // The model selected when the tab switcher was toggled. |
| 91 // weak. | 93 // weak. |
| 92 TabModel* _onLoadActiveModel; | 94 TabModel* _onLoadActiveModel; |
| 93 // The view this controller manages. | 95 // The view this controller manages. |
| 94 base::scoped_nsobject<TabSwitcherView> _tabSwitcherView; | 96 TabSwitcherView* _tabSwitcherView; |
| 95 // The list of panels controllers for distant sessions. | 97 // The list of panels controllers for distant sessions. |
| 96 base::scoped_nsobject<NSMutableArray> _controllersOfDistantSessions; | 98 NSMutableArray* _controllersOfDistantSessions; |
| 97 // The panel controllers for the local sessions. | 99 // The panel controllers for the local sessions. |
| 98 base::scoped_nsobject<TabSwitcherPanelController> _onTheRecordSession; | 100 TabSwitcherPanelController* _onTheRecordSession; |
| 99 base::scoped_nsobject<TabSwitcherPanelController> _offTheRecordSession; | 101 TabSwitcherPanelController* _offTheRecordSession; |
| 100 // The model storing the state of what is shown by the tab switcher. | 102 // The model storing the state of what is shown by the tab switcher. |
| 101 base::scoped_nsobject<TabSwitcherModel> _tabSwitcherModel; | 103 TabSwitcherModel* _tabSwitcherModel; |
| 102 // Stores the current sign-in panel type. | 104 // Stores the current sign-in panel type. |
| 103 TabSwitcherSignInPanelsType _signInPanelType; | 105 TabSwitcherSignInPanelsType _signInPanelType; |
| 104 // Cache for the panel's cells. | 106 // Cache for the panel's cells. |
| 105 base::scoped_nsobject<TabSwitcherCache> _cache; | 107 TabSwitcherCache* _cache; |
| 106 // Stores the background color of the window when the tab switcher was | 108 // Stores the background color of the window when the tab switcher was |
| 107 // presented. | 109 // presented. |
| 108 base::scoped_nsobject<UIColor> _initialWindowBackgroundColor; | 110 UIColor* _initialWindowBackgroundColor; |
| 109 // Indicate whether a previous promo panel header cell should be removed or | 111 // Indicate whether a previous promo panel header cell should be removed or |
| 110 // added. | 112 // added. |
| 111 BOOL _shouldRemovePromoPanelHeaderCell; | 113 BOOL _shouldRemovePromoPanelHeaderCell; |
| 112 BOOL _shouldAddPromoPanelHeaderCell; | 114 BOOL _shouldAddPromoPanelHeaderCell; |
| 113 } | 115 } |
| 114 | 116 |
| 115 // Updates the window background color to the tab switcher's background color. | 117 // Updates the window background color to the tab switcher's background color. |
| 116 // The original background color can be restored by calling | 118 // The original background color can be restored by calling |
| 117 // -restoreWindowBackgroundColor. | 119 // -restoreWindowBackgroundColor. |
| 118 - (void)updateWindowBackgroundColor; | 120 - (void)updateWindowBackgroundColor; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 mainTabModel:(TabModel*)mainTabModel | 188 mainTabModel:(TabModel*)mainTabModel |
| 187 otrTabModel:(TabModel*)otrTabModel | 189 otrTabModel:(TabModel*)otrTabModel |
| 188 activeTabModel:(TabModel*)activeTabModel { | 190 activeTabModel:(TabModel*)activeTabModel { |
| 189 DCHECK(mainTabModel); | 191 DCHECK(mainTabModel); |
| 190 DCHECK(otrTabModel); | 192 DCHECK(otrTabModel); |
| 191 DCHECK(activeTabModel == otrTabModel || activeTabModel == mainTabModel); | 193 DCHECK(activeTabModel == otrTabModel || activeTabModel == mainTabModel); |
| 192 self = [super initWithNibName:nil bundle:nil]; | 194 self = [super initWithNibName:nil bundle:nil]; |
| 193 if (self) { | 195 if (self) { |
| 194 _browserState = browserState; | 196 _browserState = browserState; |
| 195 _onLoadActiveModel = activeTabModel; | 197 _onLoadActiveModel = activeTabModel; |
| 196 _cache.reset([[TabSwitcherCache alloc] init]); | 198 _cache = [[TabSwitcherCache alloc] init]; |
| 197 [_cache setMainTabModel:mainTabModel otrTabModel:otrTabModel]; | 199 [_cache setMainTabModel:mainTabModel otrTabModel:otrTabModel]; |
| 198 _tabSwitcherModel.reset([[TabSwitcherModel alloc] | 200 _tabSwitcherModel = |
| 199 initWithBrowserState:browserState | 201 [[TabSwitcherModel alloc] initWithBrowserState:browserState |
| 200 delegate:self | 202 delegate:self |
| 201 mainTabModel:mainTabModel | 203 mainTabModel:mainTabModel |
| 202 otrTabModel:otrTabModel | 204 otrTabModel:otrTabModel |
| 203 withCache:_cache]); | 205 withCache:_cache]; |
| 204 _controllersOfDistantSessions.reset([[NSMutableArray alloc] init]); | 206 _controllersOfDistantSessions = [[NSMutableArray alloc] init]; |
| 205 [self loadTabSwitcherView]; | 207 [self loadTabSwitcherView]; |
| 206 _onTheRecordSession.reset([[TabSwitcherPanelController alloc] | 208 _onTheRecordSession = [[TabSwitcherPanelController alloc] |
| 207 initWithModel:_tabSwitcherModel | 209 initWithModel:_tabSwitcherModel |
| 208 forLocalSessionOfType:TabSwitcherSessionType::REGULAR_SESSION | 210 forLocalSessionOfType:TabSwitcherSessionType::REGULAR_SESSION |
| 209 withCache:_cache | 211 withCache:_cache |
| 210 browserState:_browserState]); | 212 browserState:_browserState]; |
| 211 [_onTheRecordSession setDelegate:self]; | 213 [_onTheRecordSession setDelegate:self]; |
| 212 _offTheRecordSession.reset([[TabSwitcherPanelController alloc] | 214 _offTheRecordSession = [[TabSwitcherPanelController alloc] |
| 213 initWithModel:_tabSwitcherModel | 215 initWithModel:_tabSwitcherModel |
| 214 forLocalSessionOfType:TabSwitcherSessionType::OFF_THE_RECORD_SESSION | 216 forLocalSessionOfType:TabSwitcherSessionType::OFF_THE_RECORD_SESSION |
| 215 withCache:_cache | 217 withCache:_cache |
| 216 browserState:_browserState]); | 218 browserState:_browserState]; |
| 217 [_offTheRecordSession setDelegate:self]; | 219 [_offTheRecordSession setDelegate:self]; |
| 218 [_tabSwitcherView addPanelView:[_offTheRecordSession view] | 220 [_tabSwitcherView addPanelView:[_offTheRecordSession view] |
| 219 atIndex:kLocalTabsOffTheRecordPanelIndex]; | 221 atIndex:kLocalTabsOffTheRecordPanelIndex]; |
| 220 [_tabSwitcherView addPanelView:[_onTheRecordSession view] | 222 [_tabSwitcherView addPanelView:[_onTheRecordSession view] |
| 221 atIndex:kLocalTabsOnTheRecordPanelIndex]; | 223 atIndex:kLocalTabsOnTheRecordPanelIndex]; |
| 222 [self addPromoPanelForSignInPanelType:[_tabSwitcherModel signInPanelType]]; | 224 [self addPromoPanelForSignInPanelType:[_tabSwitcherModel signInPanelType]]; |
| 223 [[_tabSwitcherView headerView] reloadData]; | 225 [[_tabSwitcherView headerView] reloadData]; |
| 224 [_tabSwitcherModel syncedSessionsChanged]; | 226 [_tabSwitcherModel syncedSessionsChanged]; |
| 225 [self selectPanelForTabModel:_onLoadActiveModel]; | 227 [self selectPanelForTabModel:_onLoadActiveModel]; |
| 226 } | 228 } |
| 227 return self; | 229 return self; |
| 228 } | 230 } |
| 229 | 231 |
| 230 #pragma mark - UIViewController | 232 #pragma mark - UIViewController |
| 231 | 233 |
| 232 - (BOOL)prefersStatusBarHidden { | 234 - (BOOL)prefersStatusBarHidden { |
| 233 return NO; | 235 return NO; |
| 234 } | 236 } |
| 235 | 237 |
| 236 - (UIStatusBarStyle)preferredStatusBarStyle { | 238 - (UIStatusBarStyle)preferredStatusBarStyle { |
| 237 return UIStatusBarStyleLightContent; | 239 return UIStatusBarStyleLightContent; |
| 238 } | 240 } |
| 239 | 241 |
| 240 - (CGRect)tabSwitcherInitialFrame { | 242 - (CGRect)tabSwitcherInitialFrame { |
| 241 return [[UIScreen mainScreen] bounds]; | 243 return [[UIScreen mainScreen] bounds]; |
| 242 } | 244 } |
| 243 | 245 |
| 244 - (void)loadTabSwitcherView { | 246 - (void)loadTabSwitcherView { |
| 245 DCHECK(![_tabSwitcherView superview]); | 247 DCHECK(![_tabSwitcherView superview]); |
| 246 _tabSwitcherView.reset( | 248 _tabSwitcherView = |
| 247 [[TabSwitcherView alloc] initWithFrame:[self tabSwitcherInitialFrame]]); | 249 [[TabSwitcherView alloc] initWithFrame:[self tabSwitcherInitialFrame]]; |
| 248 [_tabSwitcherView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | | 250 [_tabSwitcherView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | |
| 249 UIViewAutoresizingFlexibleHeight]; | 251 UIViewAutoresizingFlexibleHeight]; |
| 250 [_tabSwitcherView setDelegate:self]; | 252 [_tabSwitcherView setDelegate:self]; |
| 251 [[_tabSwitcherView headerView] setDelegate:self]; | 253 [[_tabSwitcherView headerView] setDelegate:self]; |
| 252 [[_tabSwitcherView headerView] setDataSource:self]; | 254 [[_tabSwitcherView headerView] setDataSource:self]; |
| 253 } | 255 } |
| 254 | 256 |
| 255 - (void)viewDidLoad { | 257 - (void)viewDidLoad { |
| 256 [super viewDidLoad]; | 258 [super viewDidLoad]; |
| 257 [self.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth | | 259 [self.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth | |
| 258 UIViewAutoresizingFlexibleHeight]; | 260 UIViewAutoresizingFlexibleHeight]; |
| 259 [_tabSwitcherView setFrame:self.view.bounds]; | 261 [_tabSwitcherView setFrame:self.view.bounds]; |
| 260 [self.view addSubview:_tabSwitcherView]; | 262 [self.view addSubview:_tabSwitcherView]; |
| 261 } | 263 } |
| 262 | 264 |
| 263 #pragma mark - UIResponder | 265 #pragma mark - UIResponder |
| 264 | 266 |
| 265 - (NSArray*)keyCommands { | 267 - (NSArray*)keyCommands { |
| 266 base::WeakNSObject<TabSwitcherController> weakSelf(self); | 268 __weak TabSwitcherController* weakSelf = self; |
| 267 return @[ | 269 return @[ |
| 268 [UIKeyCommand | 270 [UIKeyCommand |
| 269 cr_keyCommandWithInput:@"t" | 271 cr_keyCommandWithInput:@"t" |
| 270 modifierFlags:UIKeyModifierCommand | 272 modifierFlags:UIKeyModifierCommand |
| 271 title:l10n_util::GetNSStringWithFixup( | 273 title:l10n_util::GetNSStringWithFixup( |
| 272 IDS_IOS_TOOLS_MENU_NEW_TAB) | 274 IDS_IOS_TOOLS_MENU_NEW_TAB) |
| 273 action:^{ | 275 action:^{ |
| 274 base::scoped_nsobject<TabSwitcherController> | 276 TabSwitcherController* strongSelf = weakSelf; |
| 275 strongSelf([weakSelf retain]); | |
| 276 if (!strongSelf) | 277 if (!strongSelf) |
| 277 return; | 278 return; |
| 278 if ([strongSelf currentPanelIndex] == | 279 if ([strongSelf currentPanelIndex] == |
| 279 kLocalTabsOffTheRecordPanelIndex) { | 280 kLocalTabsOffTheRecordPanelIndex) { |
| 280 [strongSelf openNewTabInPanelAtIndex: | 281 [strongSelf openNewTabInPanelAtIndex: |
| 281 kLocalTabsOffTheRecordPanelIndex]; | 282 kLocalTabsOffTheRecordPanelIndex]; |
| 282 } else { | 283 } else { |
| 283 [strongSelf openNewTabInPanelAtIndex: | 284 [strongSelf openNewTabInPanelAtIndex: |
| 284 kLocalTabsOnTheRecordPanelIndex]; | 285 kLocalTabsOnTheRecordPanelIndex]; |
| 285 } | 286 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 299 title:l10n_util::GetNSStringWithFixup( | 300 title:l10n_util::GetNSStringWithFixup( |
| 300 IDS_IOS_KEYBOARD_REOPEN_CLOSED_TAB) | 301 IDS_IOS_KEYBOARD_REOPEN_CLOSED_TAB) |
| 301 action:^{ | 302 action:^{ |
| 302 [weakSelf reopenClosedTab]; | 303 [weakSelf reopenClosedTab]; |
| 303 }], | 304 }], |
| 304 [UIKeyCommand | 305 [UIKeyCommand |
| 305 cr_keyCommandWithInput:@"n" | 306 cr_keyCommandWithInput:@"n" |
| 306 modifierFlags:UIKeyModifierCommand | 307 modifierFlags:UIKeyModifierCommand |
| 307 title:nil | 308 title:nil |
| 308 action:^{ | 309 action:^{ |
| 309 base::scoped_nsobject<TabSwitcherController> | 310 TabSwitcherController* strongSelf = weakSelf; |
| 310 strongSelf([weakSelf retain]); | |
| 311 if (!strongSelf) | 311 if (!strongSelf) |
| 312 return; | 312 return; |
| 313 if ([strongSelf currentPanelIndex] == | 313 if ([strongSelf currentPanelIndex] == |
| 314 kLocalTabsOffTheRecordPanelIndex) { | 314 kLocalTabsOffTheRecordPanelIndex) { |
| 315 [strongSelf openNewTabInPanelAtIndex: | 315 [strongSelf openNewTabInPanelAtIndex: |
| 316 kLocalTabsOffTheRecordPanelIndex]; | 316 kLocalTabsOffTheRecordPanelIndex]; |
| 317 } else { | 317 } else { |
| 318 [strongSelf openNewTabInPanelAtIndex: | 318 [strongSelf openNewTabInPanelAtIndex: |
| 319 kLocalTabsOnTheRecordPanelIndex]; | 319 kLocalTabsOnTheRecordPanelIndex]; |
| 320 } | 320 } |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 default: | 403 default: |
| 404 [super chromeExecuteCommand:sender]; | 404 [super chromeExecuteCommand:sender]; |
| 405 break; | 405 break; |
| 406 } | 406 } |
| 407 } | 407 } |
| 408 | 408 |
| 409 #pragma mark - Private | 409 #pragma mark - Private |
| 410 | 410 |
| 411 - (void)updateWindowBackgroundColor { | 411 - (void)updateWindowBackgroundColor { |
| 412 DCHECK(!_initialWindowBackgroundColor); | 412 DCHECK(!_initialWindowBackgroundColor); |
| 413 _initialWindowBackgroundColor.reset( | 413 _initialWindowBackgroundColor = self.view.window.backgroundColor; |
| 414 [self.view.window.backgroundColor retain]); | |
| 415 self.view.window.backgroundColor = [[MDCPalette greyPalette] tint900]; | 414 self.view.window.backgroundColor = [[MDCPalette greyPalette] tint900]; |
| 416 } | 415 } |
| 417 | 416 |
| 418 - (void)restoreWindowBackgroundColor { | 417 - (void)restoreWindowBackgroundColor { |
| 419 self.view.window.backgroundColor = _initialWindowBackgroundColor; | 418 self.view.window.backgroundColor = _initialWindowBackgroundColor; |
| 420 _initialWindowBackgroundColor.reset(); | 419 _initialWindowBackgroundColor = nil; |
| 421 } | 420 } |
| 422 | 421 |
| 423 - (UIView*)snapshotViewForView:(UIView*)inputView | 422 - (UIView*)snapshotViewForView:(UIView*)inputView |
| 424 withModel:(TabModel*)tabModel | 423 withModel:(TabModel*)tabModel |
| 425 option:(SnapshotViewOption)option { | 424 option:(SnapshotViewOption)option { |
| 426 if (inputView) { | 425 if (inputView) { |
| 427 if (option == SnapshotViewOption::SNAPSHOT_VIEW) { | 426 if (option == SnapshotViewOption::SNAPSHOT_VIEW) { |
| 428 UIView* view = [inputView snapshotViewAfterScreenUpdates:NO]; | 427 UIView* view = [inputView snapshotViewAfterScreenUpdates:NO]; |
| 429 if (view) | 428 if (view) |
| 430 return view; | 429 return view; |
| 431 } | 430 } |
| 432 // If the view has just been created, it has not been rendered by Core | 431 // If the view has just been created, it has not been rendered by Core |
| 433 // Animation and the snapshot view can't be generated. In that case we | 432 // Animation and the snapshot view can't be generated. In that case we |
| 434 // trigger a client side rendering of the view and use the rendered image | 433 // trigger a client side rendering of the view and use the rendered image |
| 435 // as the backing store of a view layer. | 434 // as the backing store of a view layer. |
| 436 UIGraphicsBeginImageContextWithOptions(inputView.bounds.size, | 435 UIGraphicsBeginImageContextWithOptions(inputView.bounds.size, |
| 437 inputView.opaque, 0); | 436 inputView.opaque, 0); |
| 438 [inputView.layer renderInContext:UIGraphicsGetCurrentContext()]; | 437 [inputView.layer renderInContext:UIGraphicsGetCurrentContext()]; |
| 439 UIImage* screenshot = UIGraphicsGetImageFromCurrentImageContext(); | 438 UIImage* screenshot = UIGraphicsGetImageFromCurrentImageContext(); |
| 440 UIGraphicsEndImageContext(); | 439 UIGraphicsEndImageContext(); |
| 441 UIView* view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; | 440 UIView* view = [[UIView alloc] initWithFrame:CGRectZero]; |
| 442 [view layer].contents = static_cast<id>(screenshot.CGImage); | 441 [view layer].contents = static_cast<id>(screenshot.CGImage); |
| 443 return view; | 442 return view; |
| 444 } else { | 443 } else { |
| 445 // When the input view is nil, we can't generate a snapshot so a placeholder | 444 // When the input view is nil, we can't generate a snapshot so a placeholder |
| 446 // is returned. | 445 // is returned. |
| 447 UIColor* backgroundColor = [tabModel isOffTheRecord] | 446 UIColor* backgroundColor = [tabModel isOffTheRecord] |
| 448 ? [[MDCPalette greyPalette] tint700] | 447 ? [[MDCPalette greyPalette] tint700] |
| 449 : [[MDCPalette greyPalette] tint100]; | 448 : [[MDCPalette greyPalette] tint100]; |
| 450 UIView* placeholdView = | 449 UIView* placeholdView = [[UIView alloc] initWithFrame:CGRectZero]; |
| 451 [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; | |
| 452 placeholdView.backgroundColor = backgroundColor; | 450 placeholdView.backgroundColor = backgroundColor; |
| 453 return placeholdView; | 451 return placeholdView; |
| 454 } | 452 } |
| 455 } | 453 } |
| 456 | 454 |
| 457 - (TabSwitcherTransitionContextContent*)transitionContextContentForTabModel: | 455 - (TabSwitcherTransitionContextContent*)transitionContextContentForTabModel: |
| 458 (TabModel*)tabModel { | 456 (TabModel*)tabModel { |
| 459 if ([tabModel isOffTheRecord]) | 457 if ([tabModel isOffTheRecord]) |
| 460 return self.transitionContext.incognitoContent; | 458 return self.transitionContext.incognitoContent; |
| 461 else | 459 else |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 | 548 |
| 551 // Compute initial and final toolbar screenshot frames. | 549 // Compute initial and final toolbar screenshot frames. |
| 552 const CGRect initialToolbarFrame = toolbarController.view.frame; | 550 const CGRect initialToolbarFrame = toolbarController.view.frame; |
| 553 CGRect initialToolbarScreenshotFrame = CGRectMake( | 551 CGRect initialToolbarScreenshotFrame = CGRectMake( |
| 554 0, 0, initialToolbarFrame.size.width, initialToolbarFrame.size.height); | 552 0, 0, initialToolbarFrame.size.width, initialToolbarFrame.size.height); |
| 555 | 553 |
| 556 const CGFloat cellTopBarHeight = tabSwitcherLocalSessionCellTopBarHeight(); | 554 const CGFloat cellTopBarHeight = tabSwitcherLocalSessionCellTopBarHeight(); |
| 557 CGRect finalToolbarScreenshotFrame = | 555 CGRect finalToolbarScreenshotFrame = |
| 558 CGRectMake(0, 0, selectedCellFrame.size.width, cellTopBarHeight); | 556 CGRectMake(0, 0, selectedCellFrame.size.width, cellTopBarHeight); |
| 559 | 557 |
| 560 base::scoped_nsobject<UIImageView> tabScreenshotImageView( | 558 UIImageView* tabScreenshotImageView = |
| 561 [[UIImageView alloc] initWithFrame:CGRectZero]); | 559 [[UIImageView alloc] initWithFrame:CGRectZero]; |
| 562 | 560 |
| 563 base::WeakNSObject<UIImageView> weakTabScreenshotImageView( | 561 __weak UIImageView* weakTabScreenshotImageView = tabScreenshotImageView; |
| 564 tabScreenshotImageView.get()); | |
| 565 | 562 |
| 566 if ([self initialTabModelAndTabIDMatchesTabModel:tabModel | 563 if ([self initialTabModelAndTabIDMatchesTabModel:tabModel |
| 567 tabID:selectedTab.tabId]) { | 564 tabID:selectedTab.tabId]) { |
| 568 tabScreenshotImageView.get().image = | 565 tabScreenshotImageView.image = self.transitionContext.tabSnapshotImage; |
| 569 self.transitionContext.tabSnapshotImage; | |
| 570 } else { | 566 } else { |
| 571 // If transitioning to a different tab than the one animated in | 567 // If transitioning to a different tab than the one animated in |
| 572 // from, a new snapshot should be generated instead of using the transition | 568 // from, a new snapshot should be generated instead of using the transition |
| 573 // context | 569 // context |
| 574 tabScreenshotImageView.get().image = | 570 tabScreenshotImageView.image = |
| 575 [self updateScreenshotForCellIfNeeded:selectedCell tabModel:tabModel]; | 571 [self updateScreenshotForCellIfNeeded:selectedCell tabModel:tabModel]; |
| 576 [selectedTab retrieveSnapshot:^(UIImage* snapshot) { | 572 [selectedTab retrieveSnapshot:^(UIImage* snapshot) { |
| 577 [weakTabScreenshotImageView setImage:snapshot]; | 573 [weakTabScreenshotImageView setImage:snapshot]; |
| 578 }]; | 574 }]; |
| 579 } | 575 } |
| 580 | 576 |
| 581 const CGSize tabScreenshotImageSize = tabScreenshotImageView.get().image.size; | 577 const CGSize tabScreenshotImageSize = tabScreenshotImageView.image.size; |
| 582 | 578 |
| 583 CGRect initialTabScreenshotFrame = CGRectZero; | 579 CGRect initialTabScreenshotFrame = CGRectZero; |
| 584 const CGSize toolbarSize = toolbarController.view.bounds.size; | 580 const CGSize toolbarSize = toolbarController.view.bounds.size; |
| 585 CGSize initialTabTargetSize = | 581 CGSize initialTabTargetSize = |
| 586 CGSizeMake(initialTabFrame.size.width, | 582 CGSizeMake(initialTabFrame.size.width, |
| 587 initialTabFrame.size.height - toolbarSize.height); | 583 initialTabFrame.size.height - toolbarSize.height); |
| 588 CGSize revisedTargetSize = CGSizeZero; | 584 CGSize revisedTargetSize = CGSizeZero; |
| 589 CalculateProjection(tabScreenshotImageSize, initialTabTargetSize, | 585 CalculateProjection(tabScreenshotImageSize, initialTabTargetSize, |
| 590 ProjectionMode::kAspectFill, revisedTargetSize, | 586 ProjectionMode::kAspectFill, revisedTargetSize, |
| 591 initialTabScreenshotFrame); | 587 initialTabScreenshotFrame); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 629 std::swap(initialToolbarScreenshotFrame, finalToolbarScreenshotFrame); | 625 std::swap(initialToolbarScreenshotFrame, finalToolbarScreenshotFrame); |
| 630 } else { | 626 } else { |
| 631 [tabStripPlaceholderView foldWithCompletion:^{ | 627 [tabStripPlaceholderView foldWithCompletion:^{ |
| 632 [tabStripPlaceholderView removeFromSuperview]; | 628 [tabStripPlaceholderView removeFromSuperview]; |
| 633 }]; | 629 }]; |
| 634 } | 630 } |
| 635 | 631 |
| 636 tabStripPlaceholderView.frame = tabStripInitialFrame; | 632 tabStripPlaceholderView.frame = tabStripInitialFrame; |
| 637 | 633 |
| 638 // Create and setup placeholder view and subviews. | 634 // Create and setup placeholder view and subviews. |
| 639 base::scoped_nsobject<UIView> placeholderView( | 635 UIView* placeholderView = [[UIView alloc] initWithFrame:initialTabFrame]; |
| 640 [[UIView alloc] initWithFrame:initialTabFrame]); | |
| 641 [placeholderView setClipsToBounds:YES]; | 636 [placeholderView setClipsToBounds:YES]; |
| 642 [placeholderView setUserInteractionEnabled:NO]; | 637 [placeholderView setUserInteractionEnabled:NO]; |
| 643 | 638 |
| 644 tabScreenshotImageView.get().frame = initialTabScreenshotFrame; | 639 tabScreenshotImageView.frame = initialTabScreenshotFrame; |
| 645 tabScreenshotImageView.get().contentMode = UIViewContentModeScaleToFill; | 640 tabScreenshotImageView.contentMode = UIViewContentModeScaleToFill; |
| 646 tabScreenshotImageView.get().autoresizingMask = UIViewAutoresizingNone; | 641 tabScreenshotImageView.autoresizingMask = UIViewAutoresizingNone; |
| 647 [placeholderView addSubview:tabScreenshotImageView]; | 642 [placeholderView addSubview:tabScreenshotImageView]; |
| 648 | 643 |
| 649 // Try using a snapshot view for dismissal animation because it's faster and | 644 // Try using a snapshot view for dismissal animation because it's faster and |
| 650 // the collection view has already been rendered. Use a client rendering | 645 // the collection view has already been rendered. Use a client rendering |
| 651 // otherwise. | 646 // otherwise. |
| 652 SnapshotViewOption snapshotOption = SnapshotViewOption::SNAPSHOT_VIEW; | 647 SnapshotViewOption snapshotOption = SnapshotViewOption::SNAPSHOT_VIEW; |
| 653 if (transitionType == TransitionType::TRANSITION_PRESENT) | 648 if (transitionType == TransitionType::TRANSITION_PRESENT) |
| 654 snapshotOption = SnapshotViewOption::CLIENT_RENDERING; | 649 snapshotOption = SnapshotViewOption::CLIENT_RENDERING; |
| 655 | 650 |
| 656 UIView* finalToolbarScreenshotImageView = | 651 UIView* finalToolbarScreenshotImageView = |
| 657 [self snapshotViewForView:selectedCell.topBar | 652 [self snapshotViewForView:selectedCell.topBar |
| 658 withModel:tabModel | 653 withModel:tabModel |
| 659 option:snapshotOption]; | 654 option:snapshotOption]; |
| 660 finalToolbarScreenshotImageView.autoresizingMask = UIViewAutoresizingNone; | 655 finalToolbarScreenshotImageView.autoresizingMask = UIViewAutoresizingNone; |
| 661 finalToolbarScreenshotImageView.frame = initialToolbarScreenshotFrame; | 656 finalToolbarScreenshotImageView.frame = initialToolbarScreenshotFrame; |
| 662 [placeholderView addSubview:finalToolbarScreenshotImageView]; | 657 [placeholderView addSubview:finalToolbarScreenshotImageView]; |
| 663 | 658 |
| 664 UIView* toolbarScreenshotImageView = | 659 UIView* toolbarScreenshotImageView = |
| 665 transitionContextContent.toolbarSnapshotView; | 660 transitionContextContent.toolbarSnapshotView; |
| 666 toolbarScreenshotImageView.autoresizingMask = UIViewAutoresizingNone; | 661 toolbarScreenshotImageView.autoresizingMask = UIViewAutoresizingNone; |
| 667 toolbarScreenshotImageView.frame = initialToolbarScreenshotFrame; | 662 toolbarScreenshotImageView.frame = initialToolbarScreenshotFrame; |
| 668 [placeholderView addSubview:toolbarScreenshotImageView]; | 663 [placeholderView addSubview:toolbarScreenshotImageView]; |
| 669 | 664 |
| 670 base::scoped_nsobject<UIImageView> toolbarShadowImageView( | 665 UIImageView* toolbarShadowImageView = |
| 671 [[UIImageView alloc] initWithFrame:shadowInitialFrame]); | 666 [[UIImageView alloc] initWithFrame:shadowInitialFrame]; |
| 672 [toolbarShadowImageView setAutoresizingMask:UIViewAutoresizingNone]; | 667 [toolbarShadowImageView setAutoresizingMask:UIViewAutoresizingNone]; |
| 673 [toolbarShadowImageView setImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW)]; | 668 [toolbarShadowImageView setImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW)]; |
| 674 [placeholderView addSubview:toolbarShadowImageView]; | 669 [placeholderView addSubview:toolbarShadowImageView]; |
| 675 | 670 |
| 676 [self.view addSubview:placeholderView]; | 671 [self.view addSubview:placeholderView]; |
| 677 | 672 |
| 678 [selectedCell setHidden:YES]; | 673 [selectedCell setHidden:YES]; |
| 679 toolbarScreenshotImageView.alpha = | 674 toolbarScreenshotImageView.alpha = |
| 680 (transitionType == TransitionType::TRANSITION_DISMISS) ? 0 : 1.0; | 675 (transitionType == TransitionType::TRANSITION_DISMISS) ? 0 : 1.0; |
| 681 | 676 |
| 682 base::WeakNSObject<TabSwitcherController> weakSelf(self); | 677 __weak TabSwitcherController* weakSelf = self; |
| 683 void (^completionBlock)(BOOL) = ^(BOOL finished) { | 678 void (^completionBlock)(BOOL) = ^(BOOL finished) { |
| 684 base::scoped_nsobject<TabSwitcherController> strongSelf([weakSelf retain]); | 679 TabSwitcherController* strongSelf = weakSelf; |
| 685 | 680 |
| 686 [tabStripPlaceholderView removeFromSuperview]; | 681 [tabStripPlaceholderView removeFromSuperview]; |
| 687 [toolbarScreenshotImageView removeFromSuperview]; | 682 [toolbarScreenshotImageView removeFromSuperview]; |
| 688 [selectedCell setHidden:NO]; | 683 [selectedCell setHidden:NO]; |
| 689 [placeholderView removeFromSuperview]; | 684 [placeholderView removeFromSuperview]; |
| 690 | 685 |
| 691 if (transitionType == TransitionType::TRANSITION_DISMISS) { | 686 if (transitionType == TransitionType::TRANSITION_DISMISS) { |
| 692 [strongSelf restoreWindowBackgroundColor]; | 687 [strongSelf restoreWindowBackgroundColor]; |
| 693 if (finished) { | 688 if (finished) { |
| 694 [strongSelf setTransitionContext:nil]; | 689 [strongSelf setTransitionContext:nil]; |
| 695 } | 690 } |
| 696 } | 691 } |
| 697 [[[strongSelf delegate] tabSwitcherTransitionToolbarOwner] | 692 [[[strongSelf delegate] tabSwitcherTransitionToolbarOwner] |
| 698 reparentToolbarController]; | 693 reparentToolbarController]; |
| 699 [[strongSelf view] setUserInteractionEnabled:YES]; | 694 [[strongSelf view] setUserInteractionEnabled:YES]; |
| 700 completion(); | 695 completion(); |
| 701 }; | 696 }; |
| 702 | 697 |
| 703 ProceduralBlock animationBlock = ^{ | 698 ProceduralBlock animationBlock = ^{ |
| 704 toolbarScreenshotImageView.alpha = | 699 toolbarScreenshotImageView.alpha = |
| 705 transitionType == TransitionType::TRANSITION_DISMISS ? 1.0 : 0; | 700 transitionType == TransitionType::TRANSITION_DISMISS ? 1.0 : 0; |
| 706 tabStripPlaceholderView.frame = tabStripFinalFrame; | 701 tabStripPlaceholderView.frame = tabStripFinalFrame; |
| 707 toolbarShadowImageView.get().frame = shadowFinalFrame; | 702 toolbarShadowImageView.frame = shadowFinalFrame; |
| 708 placeholderView.get().frame = finalTabFrame; | 703 placeholderView.frame = finalTabFrame; |
| 709 toolbarScreenshotImageView.frame = finalToolbarScreenshotFrame; | 704 toolbarScreenshotImageView.frame = finalToolbarScreenshotFrame; |
| 710 finalToolbarScreenshotImageView.frame = finalToolbarScreenshotFrame; | 705 finalToolbarScreenshotImageView.frame = finalToolbarScreenshotFrame; |
| 711 tabScreenshotImageView.get().frame = finalTabScreenshotFrame; | 706 tabScreenshotImageView.frame = finalTabScreenshotFrame; |
| 712 }; | 707 }; |
| 713 | 708 |
| 714 [UIView animateWithDuration:animated ? kTransitionAnimationDuration : 0 | 709 [UIView animateWithDuration:animated ? kTransitionAnimationDuration : 0 |
| 715 delay:0 | 710 delay:0 |
| 716 options:UIViewAnimationCurveEaseInOut | 711 options:UIViewAnimationCurveEaseInOut |
| 717 animations:animationBlock | 712 animations:animationBlock |
| 718 completion:completionBlock]; | 713 completion:completionBlock]; |
| 719 } | 714 } |
| 720 | 715 |
| 721 - (BOOL)initialTabModelAndTabIDMatchesTabModel:(nonnull TabModel*)tabModel | 716 - (BOOL)initialTabModelAndTabIDMatchesTabModel:(nonnull TabModel*)tabModel |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 785 (selectedTabModel == [_tabSwitcherModel otrTabModel]) | 780 (selectedTabModel == [_tabSwitcherModel otrTabModel]) |
| 786 ? kLocalTabsOffTheRecordPanelIndex | 781 ? kLocalTabsOffTheRecordPanelIndex |
| 787 : kLocalTabsOnTheRecordPanelIndex; | 782 : kLocalTabsOnTheRecordPanelIndex; |
| 788 [_tabSwitcherView selectPanelAtIndex:selectedPanel]; | 783 [_tabSwitcherView selectPanelAtIndex:selectedPanel]; |
| 789 } | 784 } |
| 790 | 785 |
| 791 - (TabSwitcherPanelController*)panelControllerForTabModel:(TabModel*)tabModel { | 786 - (TabSwitcherPanelController*)panelControllerForTabModel:(TabModel*)tabModel { |
| 792 DCHECK(tabModel == [_tabSwitcherModel mainTabModel] || | 787 DCHECK(tabModel == [_tabSwitcherModel mainTabModel] || |
| 793 tabModel == [_tabSwitcherModel otrTabModel]); | 788 tabModel == [_tabSwitcherModel otrTabModel]); |
| 794 if (tabModel == [_tabSwitcherModel mainTabModel]) | 789 if (tabModel == [_tabSwitcherModel mainTabModel]) |
| 795 return _onTheRecordSession.get(); | 790 return _onTheRecordSession; |
| 796 if (tabModel == [_tabSwitcherModel otrTabModel]) | 791 if (tabModel == [_tabSwitcherModel otrTabModel]) |
| 797 return _offTheRecordSession.get(); | 792 return _offTheRecordSession; |
| 798 return nil; | 793 return nil; |
| 799 } | 794 } |
| 800 | 795 |
| 801 - (void)tabSwitcherDismissWithModel:(TabModel*)model { | 796 - (void)tabSwitcherDismissWithModel:(TabModel*)model { |
| 802 [self tabSwitcherDismissWithModel:model animated:YES]; | 797 [self tabSwitcherDismissWithModel:model animated:YES]; |
| 803 } | 798 } |
| 804 | 799 |
| 805 - (void)tabSwitcherDismissWithModel:(TabModel*)model animated:(BOOL)animated { | 800 - (void)tabSwitcherDismissWithModel:(TabModel*)model animated:(BOOL)animated { |
| 806 [self tabSwitcherDismissWithModel:model | 801 [self tabSwitcherDismissWithModel:model |
| 807 animated:animated | 802 animated:animated |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 945 // with the indexes in |_controllersOfDistantSessions|. | 940 // with the indexes in |_controllersOfDistantSessions|. |
| 946 for (NSNumber* objCIndex in [removedIndexes reverseObjectEnumerator]) { | 941 for (NSNumber* objCIndex in [removedIndexes reverseObjectEnumerator]) { |
| 947 int index = [objCIndex intValue]; | 942 int index = [objCIndex intValue]; |
| 948 [_tabSwitcherView removePanelViewAtIndex:index + offset]; | 943 [_tabSwitcherView removePanelViewAtIndex:index + offset]; |
| 949 [_controllersOfDistantSessions removeObjectAtIndex:index]; | 944 [_controllersOfDistantSessions removeObjectAtIndex:index]; |
| 950 } | 945 } |
| 951 | 946 |
| 952 for (NSNumber* objCIndex in insertedIndexes) { | 947 for (NSNumber* objCIndex in insertedIndexes) { |
| 953 int index = [objCIndex intValue]; | 948 int index = [objCIndex intValue]; |
| 954 std::string tag = [_tabSwitcherModel tagOfDistantSessionAtIndex:index]; | 949 std::string tag = [_tabSwitcherModel tagOfDistantSessionAtIndex:index]; |
| 955 base::scoped_nsobject<TabSwitcherPanelController> panelController( | 950 TabSwitcherPanelController* panelController = |
| 956 [[TabSwitcherPanelController alloc] initWithModel:_tabSwitcherModel | 951 [[TabSwitcherPanelController alloc] initWithModel:_tabSwitcherModel |
| 957 forDistantSessionWithTag:tag | 952 forDistantSessionWithTag:tag |
| 958 browserState:_browserState]); | 953 browserState:_browserState]; |
| 959 [panelController setDelegate:self]; | 954 [panelController setDelegate:self]; |
| 960 [_tabSwitcherView addPanelView:[panelController view] | 955 [_tabSwitcherView addPanelView:[panelController view] |
| 961 atIndex:index + offset]; | 956 atIndex:index + offset]; |
| 962 [_controllersOfDistantSessions insertObject:panelController.get() | 957 [_controllersOfDistantSessions insertObject:panelController atIndex:index]; |
| 963 atIndex:index]; | |
| 964 } | 958 } |
| 965 | 959 |
| 966 // Update the header view. | 960 // Update the header view. |
| 967 // The header view's content is created using the panel's content. | 961 // The header view's content is created using the panel's content. |
| 968 [[_tabSwitcherView headerView] reloadData]; | 962 [[_tabSwitcherView headerView] reloadData]; |
| 969 } | 963 } |
| 970 | 964 |
| 971 - (void)distantSessionMayNeedUpdate:(std::string const&)tag { | 965 - (void)distantSessionMayNeedUpdate:(std::string const&)tag { |
| 972 for (TabSwitcherPanelController* panel in _controllersOfDistantSessions | 966 for (TabSwitcherPanelController* panel in _controllersOfDistantSessions) { |
| 973 .get()) { | |
| 974 DCHECK([panel isKindOfClass:[TabSwitcherPanelController class]]); | 967 DCHECK([panel isKindOfClass:[TabSwitcherPanelController class]]); |
| 975 if ([panel sessionTag] == tag) { | 968 if ([panel sessionTag] == tag) { |
| 976 [panel updateCollectionViewIfNeeded]; | 969 [panel updateCollectionViewIfNeeded]; |
| 977 return; | 970 return; |
| 978 } | 971 } |
| 979 } | 972 } |
| 980 } | 973 } |
| 981 | 974 |
| 982 - (void)localSessionMayNeedUpdate:(TabSwitcherSessionType)type { | 975 - (void)localSessionMayNeedUpdate:(TabSwitcherSessionType)type { |
| 983 if (type == TabSwitcherSessionType::REGULAR_SESSION) { | 976 if (type == TabSwitcherSessionType::REGULAR_SESSION) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1002 } else { | 995 } else { |
| 1003 _shouldAddPromoPanelHeaderCell = YES; | 996 _shouldAddPromoPanelHeaderCell = YES; |
| 1004 } | 997 } |
| 1005 [self addPromoPanelForSignInPanelType:newPanelType]; | 998 [self addPromoPanelForSignInPanelType:newPanelType]; |
| 1006 } | 999 } |
| 1007 | 1000 |
| 1008 - (void)addPromoPanelForSignInPanelType:(TabSwitcherSignInPanelsType)panelType { | 1001 - (void)addPromoPanelForSignInPanelType:(TabSwitcherSignInPanelsType)panelType { |
| 1009 _signInPanelType = panelType; | 1002 _signInPanelType = panelType; |
| 1010 if (panelType != TabSwitcherSignInPanelsType::NO_PANEL) { | 1003 if (panelType != TabSwitcherSignInPanelsType::NO_PANEL) { |
| 1011 TabSwitcherPanelOverlayView* panelView = | 1004 TabSwitcherPanelOverlayView* panelView = |
| 1012 [[[TabSwitcherPanelOverlayView alloc] initWithFrame:CGRectZero | 1005 [[TabSwitcherPanelOverlayView alloc] initWithFrame:CGRectZero |
| 1013 browserState:_browserState] | 1006 browserState:_browserState]; |
| 1014 autorelease]; | |
| 1015 [panelView setOverlayType:PanelOverlayTypeFromSignInPanelsType(panelType)]; | 1007 [panelView setOverlayType:PanelOverlayTypeFromSignInPanelsType(panelType)]; |
| 1016 [_tabSwitcherView addPanelView:panelView atIndex:kSignInPromoPanelIndex]; | 1008 [_tabSwitcherView addPanelView:panelView atIndex:kSignInPromoPanelIndex]; |
| 1017 } | 1009 } |
| 1018 } | 1010 } |
| 1019 | 1011 |
| 1020 - (CGSize)sizeForItemAtIndex:(NSUInteger)index | 1012 - (CGSize)sizeForItemAtIndex:(NSUInteger)index |
| 1021 inSession:(TabSwitcherSessionType)session { | 1013 inSession:(TabSwitcherSessionType)session { |
| 1022 switch (session) { | 1014 switch (session) { |
| 1023 case TabSwitcherSessionType::OFF_THE_RECORD_SESSION: | 1015 case TabSwitcherSessionType::OFF_THE_RECORD_SESSION: |
| 1024 return [[_offTheRecordSession view] cellSize]; | 1016 return [[_offTheRecordSession view] cellSize]; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1071 if (![_tabSwitcherModel distantSessionCount]) { | 1063 if (![_tabSwitcherModel distantSessionCount]) { |
| 1072 // Display promo panel cell if there is no distant sessions. | 1064 // Display promo panel cell if there is no distant sessions. |
| 1073 return [TabSwitcherSessionCellData otherDevicesSessionCellData]; | 1065 return [TabSwitcherSessionCellData otherDevicesSessionCellData]; |
| 1074 } else { | 1066 } else { |
| 1075 index -= kHeaderDistantSessionIndexOffset; | 1067 index -= kHeaderDistantSessionIndexOffset; |
| 1076 | 1068 |
| 1077 sync_sessions::SyncedSession::DeviceType deviceType = | 1069 sync_sessions::SyncedSession::DeviceType deviceType = |
| 1078 sync_sessions::SyncedSession::TYPE_UNSET; | 1070 sync_sessions::SyncedSession::TYPE_UNSET; |
| 1079 NSString* cellTitle = nil; | 1071 NSString* cellTitle = nil; |
| 1080 | 1072 |
| 1081 if (index < _controllersOfDistantSessions.get().count) { | 1073 if (index < _controllersOfDistantSessions.count) { |
| 1082 TabSwitcherPanelController* panel = | 1074 TabSwitcherPanelController* panel = |
| 1083 [_controllersOfDistantSessions objectAtIndex:index]; | 1075 [_controllersOfDistantSessions objectAtIndex:index]; |
| 1084 const synced_sessions::DistantSession* distantSession = | 1076 const synced_sessions::DistantSession* distantSession = |
| 1085 [panel distantSession]; | 1077 [panel distantSession]; |
| 1086 deviceType = distantSession->device_type; | 1078 deviceType = distantSession->device_type; |
| 1087 cellTitle = base::SysUTF8ToNSString(distantSession->name); | 1079 cellTitle = base::SysUTF8ToNSString(distantSession->name); |
| 1088 } | 1080 } |
| 1089 TabSwitcherSessionCellType cellType; | 1081 TabSwitcherSessionCellType cellType; |
| 1090 switch (deviceType) { | 1082 switch (deviceType) { |
| 1091 case sync_sessions::SyncedSession::TYPE_PHONE: | 1083 case sync_sessions::SyncedSession::TYPE_PHONE: |
| 1092 cellType = kPhoneRemoteSessionCell; | 1084 cellType = kPhoneRemoteSessionCell; |
| 1093 break; | 1085 break; |
| 1094 case sync_sessions::SyncedSession::TYPE_TABLET: | 1086 case sync_sessions::SyncedSession::TYPE_TABLET: |
| 1095 cellType = kTabletRemoteSessionCell; | 1087 cellType = kTabletRemoteSessionCell; |
| 1096 break; | 1088 break; |
| 1097 default: | 1089 default: |
| 1098 cellType = kLaptopRemoteSessionCell; | 1090 cellType = kLaptopRemoteSessionCell; |
| 1099 break; | 1091 break; |
| 1100 } | 1092 } |
| 1101 TabSwitcherSessionCellData* sessionData = | 1093 TabSwitcherSessionCellData* sessionData = |
| 1102 [[[TabSwitcherSessionCellData alloc] initWithSessionCellType:cellType] | 1094 [[TabSwitcherSessionCellData alloc] initWithSessionCellType:cellType]; |
| 1103 autorelease]; | |
| 1104 sessionData.title = cellTitle; | 1095 sessionData.title = cellTitle; |
| 1105 return sessionData; | 1096 return sessionData; |
| 1106 } | 1097 } |
| 1107 } | 1098 } |
| 1108 } | 1099 } |
| 1109 | 1100 |
| 1110 - (NSInteger)tabSwitcherHeaderViewSelectedPanelIndex { | 1101 - (NSInteger)tabSwitcherHeaderViewSelectedPanelIndex { |
| 1111 return [_tabSwitcherView currentPanelIndex]; | 1102 return [_tabSwitcherView currentPanelIndex]; |
| 1112 } | 1103 } |
| 1113 | 1104 |
| 1114 #pragma mark - TabSwitcherViewDelegate | 1105 #pragma mark - TabSwitcherViewDelegate |
| 1115 | 1106 |
| 1116 - (void)openNewTabInPanelAtIndex:(NSInteger)panelIndex { | 1107 - (void)openNewTabInPanelAtIndex:(NSInteger)panelIndex { |
| 1117 CHECK(panelIndex >= 0); | 1108 CHECK(panelIndex >= 0); |
| 1118 DCHECK([self isPanelIndexForLocalSession:panelIndex]); | 1109 DCHECK([self isPanelIndexForLocalSession:panelIndex]); |
| 1119 const NSInteger tag = (panelIndex == kLocalTabsOnTheRecordPanelIndex) | 1110 const NSInteger tag = (panelIndex == kLocalTabsOnTheRecordPanelIndex) |
| 1120 ? IDC_NEW_TAB | 1111 ? IDC_NEW_TAB |
| 1121 : IDC_NEW_INCOGNITO_TAB; | 1112 : IDC_NEW_INCOGNITO_TAB; |
| 1122 if (tag == IDC_NEW_INCOGNITO_TAB) { | 1113 if (tag == IDC_NEW_INCOGNITO_TAB) { |
| 1123 base::RecordAction( | 1114 base::RecordAction( |
| 1124 base::UserMetricsAction("MobileTabSwitcherCreateIncognitoTab")); | 1115 base::UserMetricsAction("MobileTabSwitcherCreateIncognitoTab")); |
| 1125 } else { | 1116 } else { |
| 1126 base::RecordAction( | 1117 base::RecordAction( |
| 1127 base::UserMetricsAction("MobileTabSwitcherCreateNonIncognitoTab")); | 1118 base::UserMetricsAction("MobileTabSwitcherCreateNonIncognitoTab")); |
| 1128 } | 1119 } |
| 1129 // Create and execute command to create the tab. | 1120 // Create and execute command to create the tab. |
| 1130 base::scoped_nsobject<GenericChromeCommand> command( | 1121 GenericChromeCommand* command = |
| 1131 [[GenericChromeCommand alloc] initWithTag:tag]); | 1122 [[GenericChromeCommand alloc] initWithTag:tag]; |
| 1132 [self chromeExecuteCommand:command]; | 1123 [self chromeExecuteCommand:command]; |
| 1133 } | 1124 } |
| 1134 | 1125 |
| 1135 - (ios_internal::NewTabButtonStyle)buttonStyleForPanelAtIndex: | 1126 - (ios_internal::NewTabButtonStyle)buttonStyleForPanelAtIndex: |
| 1136 (NSInteger)panelIndex { | 1127 (NSInteger)panelIndex { |
| 1137 CHECK(panelIndex >= 0); | 1128 CHECK(panelIndex >= 0); |
| 1138 switch (panelIndex) { | 1129 switch (panelIndex) { |
| 1139 case kLocalTabsOnTheRecordPanelIndex: | 1130 case kLocalTabsOnTheRecordPanelIndex: |
| 1140 if ([_onTheRecordSession shouldShowNewTabButton]) { | 1131 if ([_onTheRecordSession shouldShowNewTabButton]) { |
| 1141 return ios_internal::NewTabButtonStyle::BLUE; | 1132 return ios_internal::NewTabButtonStyle::BLUE; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1221 base::UserMetricsAction("MobileTabSwitcherCloseNonIncognitoTab")); | 1212 base::UserMetricsAction("MobileTabSwitcherCloseNonIncognitoTab")); |
| 1222 } | 1213 } |
| 1223 } | 1214 } |
| 1224 | 1215 |
| 1225 - (void)tabSwitcherPanelControllerDidUpdateOverlayViewVisibility: | 1216 - (void)tabSwitcherPanelControllerDidUpdateOverlayViewVisibility: |
| 1226 (TabSwitcherPanelController*)tabSwitcherPanelController { | 1217 (TabSwitcherPanelController*)tabSwitcherPanelController { |
| 1227 [_tabSwitcherView updateOverlayButtonState]; | 1218 [_tabSwitcherView updateOverlayButtonState]; |
| 1228 } | 1219 } |
| 1229 | 1220 |
| 1230 @end | 1221 @end |
| OLD | NEW |