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") {
"//ios/chrome/browser/main:public",
"//ios/chrome/browser/ui/coordinators:chrome_coordinators",
"//ios/chrome/browser/ui/tab_strip:tab_strip_ui",
"//ios/chrome/browser/web_state_list",
]
frameworks = [ "UIKit.framework" ]
}
......@@ -23,14 +24,16 @@ source_set("tab_strip_ui") {
sources = [
"tab_strip_cell.h",
"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.mm",
"tab_strip_view_layout.h",
"tab_strip_view_layout.mm",
]
deps = [
"//ios/chrome/browser/browser_state",
"//ios/chrome/browser/main:public",
"//ios/chrome/browser/web_state_list",
"//ios/chrome/common/ui/colors",
]
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;
browser:(Browser*)browser NS_UNAVAILABLE;
// 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.
@property(nonatomic, strong, readonly) UIView<TabStripContaining>* view;
......
......@@ -7,7 +7,9 @@
#include "base/check_op.h"
#import "ios/chrome/browser/browser_state/chrome_browser_state.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/web_state_list/web_state_list.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
......@@ -15,6 +17,15 @@
@protocol TabStripContaining;
@interface TabStripCoordinator ()
// Mediator for updating the TabStrip when the WebStateList changes.
@property(nonatomic, strong) TabStripMediator* mediator;
@property TabStripViewController* tabStripViewController;
@end
@implementation TabStripCoordinator
#pragma mark - ChromeCoordinator
......@@ -25,24 +36,33 @@
}
- (void)start {
if (self.viewController)
if (self.tabStripViewController)
return;
self.viewController = [[TabStripViewController alloc] init];
self.tabStripViewController = [[TabStripViewController alloc] init];
if (@available(iOS 13, *)) {
self.viewController.overrideUserInterfaceStyle =
self.tabStripViewController.overrideUserInterfaceStyle =
self.browser->GetBrowserState()->IsOffTheRecord()
? UIUserInterfaceStyleDark
: UIUserInterfaceStyleUnspecified;
}
self.mediator =
[[TabStripMediator alloc] initWithConsumer:self.tabStripViewController];
self.mediator.webStateList = self.browser->GetWebStateList();
}
- (void)stop {
self.viewController = nil;
self.mediator = nil;
self.tabStripViewController = nil;
}
#pragma mark - Properties
- (UIViewController*)viewController {
return self.tabStripViewController;
}
- (void)setLongPressDelegate:(id<PopupMenuLongPressDelegate>)longPressDelegate {
_longPressDelegate = longPressDelegate;
}
......@@ -54,7 +74,7 @@
#pragma mark - Public
- (void)hideTabStrip:(BOOL)hidden {
self.viewController.view.hidden = hidden;
self.tabStripViewController.view.hidden = hidden;
}
@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 @@
#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
// BrowserViewController. This TabStripViewController is responsible for
// responding to the different updates in the tabstrip view.
@interface TabStripViewController : UICollectionViewController
@interface TabStripViewController
: UICollectionViewController <TabStripConsumer>
- (instancetype)init NS_DESIGNATED_INITIALIZER;
......
......@@ -4,19 +4,27 @@
#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_mediator.h"
#import "ios/chrome/browser/ui/tab_strip/tab_strip_view_layout.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@implementation TabStripViewController
namespace {
static NSString* const kReuseIdentifier = @"TabView";
} // 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 {
TabStripViewLayout* layout = [[TabStripViewLayout alloc] init];
if (self = [super initWithCollectionViewLayout:layout]) {
......@@ -37,6 +45,11 @@ static NSString* const kReuseIdentifier = @"TabView";
return 1;
}
- (NSInteger)collectionView:(UICollectionView*)collectionView
numberOfItemsInSection:(NSInteger)section {
return _tabsCount;
}
- (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView
cellForItemAtIndexPath:(NSIndexPath*)indexPath {
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