Commit 33db48a1 authored by Nazerke's avatar Nazerke Committed by Commit Bot

[ios] Create a TabStrip Mediator.

This CL creates a mediator for connecting TabStrip to WebStateList and
as for now the TabStrip shows the number of tabs open.

Bug: 1136834,1128249
Change-Id: I9082b675f88a30002f9113a363b1b1e7c2b62465
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2461010
Commit-Queue: Nazerke Kalidolda <nazerke@google.com>
Reviewed-by: default avatarGauthier Ambard <gambard@chromium.org>
Cr-Commit-Position: refs/heads/master@{#822673}
parent ef3d256e
...@@ -14,6 +14,7 @@ source_set("tab_strip") { ...@@ -14,6 +14,7 @@ source_set("tab_strip") {
"//ios/chrome/browser/main:public", "//ios/chrome/browser/main:public",
"//ios/chrome/browser/ui/coordinators:chrome_coordinators", "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
"//ios/chrome/browser/ui/tab_strip:tab_strip_ui", "//ios/chrome/browser/ui/tab_strip:tab_strip_ui",
"//ios/chrome/browser/web_state_list",
] ]
frameworks = [ "UIKit.framework" ] frameworks = [ "UIKit.framework" ]
} }
...@@ -23,14 +24,16 @@ source_set("tab_strip_ui") { ...@@ -23,14 +24,16 @@ source_set("tab_strip_ui") {
sources = [ sources = [
"tab_strip_cell.h", "tab_strip_cell.h",
"tab_strip_cell.mm", "tab_strip_cell.mm",
"tab_strip_consumer.h",
"tab_strip_mediator.h",
"tab_strip_mediator.mm",
"tab_strip_view_controller.h", "tab_strip_view_controller.h",
"tab_strip_view_controller.mm", "tab_strip_view_controller.mm",
"tab_strip_view_layout.h", "tab_strip_view_layout.h",
"tab_strip_view_layout.mm", "tab_strip_view_layout.mm",
] ]
deps = [ deps = [
"//ios/chrome/browser/browser_state", "//ios/chrome/browser/web_state_list",
"//ios/chrome/browser/main:public",
"//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/colors",
] ]
frameworks = [ "UIKit.framework" ] frameworks = [ "UIKit.framework" ]
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_UI_TAB_STRIP_TAB_STRIP_CONSUMER_H_
#define IOS_CHROME_BROWSER_UI_TAB_STRIP_TAB_STRIP_CONSUMER_H_
#import <Foundation/Foundation.h>
// TabStripConsumer sets the current appearance of the TabStrip.
@protocol TabStripConsumer
// Sets the number to tabs currently opened.
- (void)setTabsCount:(NSUInteger)tabsCount;
@end
#endif // IOS_CHROME_BROWSER_UI_TAB_STRIP_TAB_STRIP_CONSUMER_H_
...@@ -23,7 +23,7 @@ class Browser; ...@@ -23,7 +23,7 @@ class Browser;
browser:(Browser*)browser NS_UNAVAILABLE; browser:(Browser*)browser NS_UNAVAILABLE;
// The TabStrip view controller owned by this coordinator. // The TabStrip view controller owned by this coordinator.
@property(nonatomic, strong) UIViewController* viewController; @property(nonatomic, strong, readonly) UIViewController* viewController;
// The TabStrip view owned by the viewcontroller of this coordinator. // The TabStrip view owned by the viewcontroller of this coordinator.
@property(nonatomic, strong, readonly) UIView<TabStripContaining>* view; @property(nonatomic, strong, readonly) UIView<TabStripContaining>* view;
......
...@@ -7,7 +7,9 @@ ...@@ -7,7 +7,9 @@
#include "base/check_op.h" #include "base/check_op.h"
#import "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/browser_state/chrome_browser_state.h"
#import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/main/browser.h"
#import "ios/chrome/browser/ui/tab_strip/tab_strip_mediator.h"
#import "ios/chrome/browser/ui/tab_strip/tab_strip_view_controller.h" #import "ios/chrome/browser/ui/tab_strip/tab_strip_view_controller.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support." #error "This file requires ARC support."
...@@ -15,6 +17,15 @@ ...@@ -15,6 +17,15 @@
@protocol TabStripContaining; @protocol TabStripContaining;
@interface TabStripCoordinator ()
// Mediator for updating the TabStrip when the WebStateList changes.
@property(nonatomic, strong) TabStripMediator* mediator;
@property TabStripViewController* tabStripViewController;
@end
@implementation TabStripCoordinator @implementation TabStripCoordinator
#pragma mark - ChromeCoordinator #pragma mark - ChromeCoordinator
...@@ -25,24 +36,33 @@ ...@@ -25,24 +36,33 @@
} }
- (void)start { - (void)start {
if (self.viewController) if (self.tabStripViewController)
return; return;
self.viewController = [[TabStripViewController alloc] init]; self.tabStripViewController = [[TabStripViewController alloc] init];
if (@available(iOS 13, *)) { if (@available(iOS 13, *)) {
self.viewController.overrideUserInterfaceStyle = self.tabStripViewController.overrideUserInterfaceStyle =
self.browser->GetBrowserState()->IsOffTheRecord() self.browser->GetBrowserState()->IsOffTheRecord()
? UIUserInterfaceStyleDark ? UIUserInterfaceStyleDark
: UIUserInterfaceStyleUnspecified; : UIUserInterfaceStyleUnspecified;
} }
self.mediator =
[[TabStripMediator alloc] initWithConsumer:self.tabStripViewController];
self.mediator.webStateList = self.browser->GetWebStateList();
} }
- (void)stop { - (void)stop {
self.viewController = nil; self.mediator = nil;
self.tabStripViewController = nil;
} }
#pragma mark - Properties #pragma mark - Properties
- (UIViewController*)viewController {
return self.tabStripViewController;
}
- (void)setLongPressDelegate:(id<PopupMenuLongPressDelegate>)longPressDelegate { - (void)setLongPressDelegate:(id<PopupMenuLongPressDelegate>)longPressDelegate {
_longPressDelegate = longPressDelegate; _longPressDelegate = longPressDelegate;
} }
...@@ -54,7 +74,7 @@ ...@@ -54,7 +74,7 @@
#pragma mark - Public #pragma mark - Public
- (void)hideTabStrip:(BOOL)hidden { - (void)hideTabStrip:(BOOL)hidden {
self.viewController.view.hidden = hidden; self.tabStripViewController.view.hidden = hidden;
} }
@end @end
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_UI_TAB_STRIP_TAB_STRIP_MEDIATOR_H_
#define IOS_CHROME_BROWSER_UI_TAB_STRIP_TAB_STRIP_MEDIATOR_H_
#import <Foundation/Foundation.h>
@protocol TabStripConsumer;
class WebStateList;
// This mediator used to manage model interaction for its consumer.
@interface TabStripMediator : NSObject
// The WebStateList that this mediator listens for any changes on the total
// number of Webstates.
@property(nonatomic, assign) WebStateList* webStateList;
// Designated initializer. Initializer with a TabStripConsumer.
- (instancetype)initWithConsumer:(id<TabStripConsumer>)consumer
NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
@end
#endif // IOS_CHROME_BROWSER_UI_TAB_STRIP_TAB_STRIP_MEDIATOR_H_
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/ui/tab_strip/tab_strip_mediator.h"
#import "ios/chrome/browser/ui/tab_strip/tab_strip_consumer.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@interface TabStripMediator ()
// The consumer for this object.
@property(nonatomic, weak) id<TabStripConsumer> consumer;
@end
@implementation TabStripMediator
- (instancetype)initWithConsumer:(id<TabStripConsumer>)consumer {
if (self = [super init]) {
_consumer = consumer;
}
return self;
}
#pragma mark - Public properties
- (void)setWebStateList:(WebStateList*)webStateList {
_webStateList = webStateList;
if (_webStateList) {
DCHECK_GE(_webStateList->count(), 0);
[_consumer setTabsCount:static_cast<NSUInteger>(_webStateList->count())];
}
}
@end
...@@ -7,10 +7,15 @@ ...@@ -7,10 +7,15 @@
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import "ios/chrome/browser/ui/tab_strip/tab_strip_consumer.h"
@class TabStripMediator;
// ViewController for the TabStrip. This ViewController is contained by // ViewController for the TabStrip. This ViewController is contained by
// BrowserViewController. This TabStripViewController is responsible for // BrowserViewController. This TabStripViewController is responsible for
// responding to the different updates in the tabstrip view. // responding to the different updates in the tabstrip view.
@interface TabStripViewController : UICollectionViewController @interface TabStripViewController
: UICollectionViewController <TabStripConsumer>
- (instancetype)init NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_DESIGNATED_INITIALIZER;
......
...@@ -4,19 +4,27 @@ ...@@ -4,19 +4,27 @@
#import "ios/chrome/browser/ui/tab_strip/tab_strip_view_controller.h" #import "ios/chrome/browser/ui/tab_strip/tab_strip_view_controller.h"
#import "base/allocator/partition_allocator/partition_alloc.h"
#import "ios/chrome/browser/ui/tab_strip/tab_strip_cell.h" #import "ios/chrome/browser/ui/tab_strip/tab_strip_cell.h"
#import "ios/chrome/browser/ui/tab_strip/tab_strip_mediator.h"
#import "ios/chrome/browser/ui/tab_strip/tab_strip_view_layout.h" #import "ios/chrome/browser/ui/tab_strip/tab_strip_view_layout.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
@implementation TabStripViewController
namespace { namespace {
static NSString* const kReuseIdentifier = @"TabView"; static NSString* const kReuseIdentifier = @"TabView";
} // namespace } // namespace
@interface TabStripViewController ()
// Returns the number of tabs, the value is taken from the count() of
// the WebStateList.
@property(nonatomic, assign) NSUInteger tabsCount;
@end
@implementation TabStripViewController
- (instancetype)init { - (instancetype)init {
TabStripViewLayout* layout = [[TabStripViewLayout alloc] init]; TabStripViewLayout* layout = [[TabStripViewLayout alloc] init];
if (self = [super initWithCollectionViewLayout:layout]) { if (self = [super initWithCollectionViewLayout:layout]) {
...@@ -37,6 +45,11 @@ static NSString* const kReuseIdentifier = @"TabView"; ...@@ -37,6 +45,11 @@ static NSString* const kReuseIdentifier = @"TabView";
return 1; return 1;
} }
- (NSInteger)collectionView:(UICollectionView*)collectionView
numberOfItemsInSection:(NSInteger)section {
return _tabsCount;
}
- (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView - (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView
cellForItemAtIndexPath:(NSIndexPath*)indexPath { cellForItemAtIndexPath:(NSIndexPath*)indexPath {
TabStripCell* cell = (TabStripCell*)[collectionView TabStripCell* cell = (TabStripCell*)[collectionView
......
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