blob: ac4a58cd7aa20a998f7937569d56f47cd46b4345 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import <UIKit/UIKit.h>
#import "base/check.h"
#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h"
#import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h"
#import "ios/chrome/browser/ui/ntp/feed_wrapper_view_controller.h"
#import "ios/chrome/common/ui/util/constraints_ui_util.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@implementation FeedWrapperViewController {
__weak id<FeedWrapperViewControllerDelegate> _delegate;
}
- (instancetype)initWithDelegate:(id<FeedWrapperViewControllerDelegate>)delegate
feedViewController:(UIViewController*)feedViewController {
self = [super initWithNibName:nil bundle:nil];
if (self) {
if (feedViewController) {
_feedViewController = feedViewController;
_delegate = delegate;
// Iterates through subviews to find collection view containing feed
// articles.
// TODO(crbug.com/1085419): Once the CollectionView is cleanly exposed,
// remove this loop.
for (UIView* view in _feedViewController.view.subviews) {
if ([view isKindOfClass:[UICollectionView class]]) {
_contentCollectionView = static_cast<UICollectionView*>(view);
}
}
DCHECK(_contentCollectionView);
}
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Configure appropriate collection view based on feed visibility. If
// `feedViewController` exists, then the feed must be enabled and visible.
if (self.feedViewController && self.contentCollectionView) {
[self configureFeedAsWrapper];
[_delegate updateTheme];
} else {
[self configureEmptyCollectionAsWrapper];
}
}
#pragma mark - Public
- (NSUInteger)lastVisibleFeedCardIndex {
DCHECK(self.contentCollectionView);
NSArray<NSIndexPath*>* visibleCardIndices =
[self.contentCollectionView indexPathsForVisibleItems];
NSInteger lastVisibleIndex;
for (NSIndexPath* cardIndex in visibleCardIndices) {
lastVisibleIndex = MAX(lastVisibleIndex, cardIndex.item);
}
return lastVisibleIndex;
}
#pragma mark - Private
// If the feed is visible, we configure the feed's collection view and view
// controller to be used in the NTP.
- (void)configureFeedAsWrapper {
UIView* feedView = self.feedViewController.view;
[self.feedViewController willMoveToParentViewController:self];
[self addChildViewController:self.feedViewController];
[self.view addSubview:feedView];
[self.feedViewController didMoveToParentViewController:self];
feedView.translatesAutoresizingMaskIntoConstraints = NO;
AddSameConstraints(feedView, self.view);
}
// If the feed is not visible, we prepare the empty collection view to be used
// in the NTP.
- (void)configureEmptyCollectionAsWrapper {
UICollectionViewLayout* layout = [[UICollectionViewLayout alloc] init];
UICollectionView* emptyCollectionView =
[[UICollectionView alloc] initWithFrame:CGRectZero
collectionViewLayout:layout];
[emptyCollectionView setShowsVerticalScrollIndicator:NO];
[self.view addSubview:emptyCollectionView];
self.contentCollectionView = emptyCollectionView;
self.contentCollectionView.backgroundColor =
IsMagicStackEnabled() ? [UIColor clearColor]
: ntp_home::NTPBackgroundColor();
self.contentCollectionView.translatesAutoresizingMaskIntoConstraints = NO;
AddSameConstraints(self.contentCollectionView, self.view);
}
@end