Commit 8a3fda4f authored by adamta's avatar adamta Committed by Chromium LUCI CQ

[iOS] Overscroll menu for refactored NTP

Uses Discover feed scroll view to add overscroll menu to refactored NTP.

Bug: 1114792
Change-Id: I272d50d6fc80dd50d29a973e6f5682cacc80e886
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2595615Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Reviewed-by: default avatarRobbie Gibson <rkgibson@google.com>
Commit-Queue: Adam Trudeau-Arcaro <adamta@google.com>
Cr-Commit-Position: refs/heads/master@{#839115}
parent 3c54f1c9
......@@ -63,6 +63,7 @@
#import "ios/chrome/browser/ui/content_suggestions/theme_change_delegate.h"
#import "ios/chrome/browser/ui/menu/action_factory.h"
#import "ios/chrome/browser/ui/menu/menu_histograms.h"
#import "ios/chrome/browser/ui/ntp/new_tab_page_feature.h"
#import "ios/chrome/browser/ui/ntp/new_tab_page_header_constants.h"
#import "ios/chrome/browser/ui/ntp/notification_promo_whats_new.h"
#import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h"
......@@ -577,12 +578,15 @@
}
- (void)willUpdateSnapshot {
DCHECK(!IsRefactoredNTP());
[self.suggestionsViewController clearOverscroll];
}
- (void)reload {
if (IsDiscoverFeedEnabled())
if (IsDiscoverFeedEnabled() && !IsRefactoredNTP()) {
DCHECK(!IsRefactoredNTP());
ios::GetChromeBrowserProvider()->GetDiscoverFeedProvider()->RefreshFeed();
}
[self.contentSuggestionsMediator.dataSink reloadAllData];
}
......
......@@ -30,6 +30,7 @@
// content.
return [super collectionViewContentSize];
}
DCHECK(!IsRefactoredNTP());
CGFloat collectionViewHeight = self.collectionView.bounds.size.height;
CGFloat headerHeight = [self firstHeaderHeight];
......
......@@ -25,10 +25,12 @@ source_set("coordinator") {
":ntp_internal",
"//ios/chrome/browser/browser_state",
"//ios/chrome/browser/main:public",
"//ios/chrome/browser/ui/commands",
"//ios/chrome/browser/ui/content_suggestions",
"//ios/chrome/browser/ui/coordinators:chrome_coordinators",
"//ios/chrome/browser/ui/main:scene_state_header",
"//ios/chrome/browser/ui/main:scene_state_observer",
"//ios/chrome/browser/ui/overscroll_actions",
"//ios/chrome/browser/url_loading",
"//ios/chrome/browser/web_state_list",
"//ios/public/provider/chrome/browser",
......
......@@ -9,6 +9,11 @@
#include "base/metrics/user_metrics_action.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#import "ios/chrome/browser/main/browser.h"
#import "ios/chrome/browser/ui/commands/application_commands.h"
#import "ios/chrome/browser/ui/commands/browser_commands.h"
#import "ios/chrome/browser/ui/commands/command_dispatcher.h"
#import "ios/chrome/browser/ui/commands/omnibox_commands.h"
#import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.h"
#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.h"
#import "ios/chrome/browser/ui/main/scene_state.h"
......@@ -18,6 +23,7 @@
#import "ios/chrome/browser/ui/ntp/incognito_view_controller.h"
#import "ios/chrome/browser/ui/ntp/new_tab_page_feature.h"
#import "ios/chrome/browser/ui/ntp/new_tab_page_view_controller.h"
#import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h"
#import "ios/chrome/browser/url_loading/url_loading_browser_agent.h"
#import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
#import "ios/public/provider/chrome/browser/discover_feed/discover_feed_provider.h"
......@@ -30,7 +36,8 @@
#error "This file requires ARC support."
#endif
@interface NewTabPageCoordinator () <SceneStateObserver>
@interface NewTabPageCoordinator () <OverscrollActionsControllerDelegate,
SceneStateObserver>
// Coordinator for the ContentSuggestions.
@property(nonatomic, strong)
......@@ -113,6 +120,7 @@
self.ntpViewController.discoverFeedWrapperViewController =
self.discoverFeedWrapperViewController;
self.ntpViewController.overscrollDelegate = self;
}
base::RecordAction(base::UserMetricsAction("MobileNTPShowMostVisited"));
......@@ -194,7 +202,11 @@
}
- (void)willUpdateSnapshot {
[self.contentSuggestionsCoordinator willUpdateSnapshot];
if (IsRefactoredNTP()) {
[self.ntpViewController willUpdateSnapshot];
} else {
[self.contentSuggestionsCoordinator willUpdateSnapshot];
}
}
- (void)focusFakebox {
......@@ -202,6 +214,9 @@
}
- (void)reload {
if (IsRefactoredNTP()) {
ios::GetChromeBrowserProvider()->GetDiscoverFeedProvider()->RefreshFeed();
}
[self.contentSuggestionsCoordinator reload];
}
......@@ -238,4 +253,69 @@
[self updateVisible];
}
#pragma mark - OverscrollActionsControllerDelegate
- (void)overscrollActionsController:(OverscrollActionsController*)controller
didTriggerAction:(OverscrollAction)action {
// TODO(crbug.com/1045047): Use HandlerForProtocol after commands protocol
// clean up.
id<ApplicationCommands, BrowserCommands, OmniboxCommands, SnackbarCommands>
handler = static_cast<id<ApplicationCommands, BrowserCommands,
OmniboxCommands, SnackbarCommands>>(
self.browser->GetCommandDispatcher());
switch (action) {
case OverscrollAction::NEW_TAB: {
[handler openURLInNewTab:[OpenNewTabCommand command]];
} break;
case OverscrollAction::CLOSE_TAB: {
[handler closeCurrentTab];
base::RecordAction(base::UserMetricsAction("OverscrollActionCloseTab"));
} break;
case OverscrollAction::REFRESH:
[self reload];
break;
case OverscrollAction::NONE:
NOTREACHED();
break;
}
}
- (BOOL)shouldAllowOverscrollActionsForOverscrollActionsController:
(OverscrollActionsController*)controller {
return YES;
}
- (UIView*)toolbarSnapshotViewForOverscrollActionsController:
(OverscrollActionsController*)controller {
return [[self.contentSuggestionsCoordinator.headerController toolBarView]
snapshotViewAfterScreenUpdates:NO];
}
- (UIView*)headerViewForOverscrollActionsController:
(OverscrollActionsController*)controller {
return self.discoverFeedWrapperViewController.view;
}
- (CGFloat)headerInsetForOverscrollActionsController:
(OverscrollActionsController*)controller {
return self.contentSuggestionsCoordinator.viewController.collectionView
.contentSize.height;
}
- (CGFloat)headerHeightForOverscrollActionsController:
(OverscrollActionsController*)controller {
CGFloat height =
[self.contentSuggestionsCoordinator.headerController toolBarView]
.bounds.size.height;
CGFloat topInset =
self.discoverFeedWrapperViewController.view.safeAreaInsets.top;
return height + topInset;
}
- (FullscreenController*)fullscreenControllerForOverscrollActionsController:
(OverscrollActionsController*)controller {
// Fullscreen isn't supported here.
return nullptr;
}
@end
......@@ -9,6 +9,7 @@
@class ContentSuggestionsViewController;
@class DiscoverFeedWrapperViewController;
@protocol OverscrollActionsControllerDelegate;
// View controller containing all the content presented on a standard,
// non-incognito new tab page.
......@@ -18,6 +19,10 @@
@property(nonatomic, strong)
DiscoverFeedWrapperViewController* discoverFeedWrapperViewController;
// Delegate for the overscroll actions.
@property(nonatomic, weak) id<OverscrollActionsControllerDelegate>
overscrollDelegate;
// Initializes view controller with NTP content view controllers.
// |discoverFeedViewController| represents the Discover feed for suggesting
// articles. |contentSuggestionsViewController| represents other content
......@@ -30,6 +35,9 @@
bundle:(NSBundle*)bundle NS_UNAVAILABLE;
- (instancetype)initWithCoder:(NSCoder*)coder NS_UNAVAILABLE;
// Called when a snapshot of the content will be taken.
- (void)willUpdateSnapshot;
@end
#endif // IOS_CHROME_BROWSER_UI_NTP_NEW_TAB_PAGE_VIEW_CONTROLLER_H_
......@@ -8,6 +8,8 @@
#import "base/check.h"
#import "ios/chrome/browser/ui/ntp/discover_feed_wrapper_view_controller.h"
#import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h"
#import "ios/chrome/browser/ui/util/uikit_ui_util.h"
#import "ios/chrome/common/ui/util/constraints_ui_util.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
......@@ -22,6 +24,10 @@
@property(nonatomic, strong)
UICollectionViewController* contentSuggestionsViewController;
// The overscroll actions controller managing accelerators over the toolbar.
@property(nonatomic, strong)
OverscrollActionsController* overscrollActionsController;
@end
@implementation NewTabPageViewController
......@@ -36,6 +42,10 @@
return self;
}
- (void)dealloc {
[self.overscrollActionsController invalidate];
}
- (void)viewDidLoad {
[super viewDidLoad];
......@@ -61,6 +71,26 @@
[self.contentSuggestionsViewController
didMoveToParentViewController:self.discoverFeedWrapperViewController
.discoverFeed];
// Ensures that there is never any nested scrolling, since we are nesting the
// content suggestions collection view in the feed collection view.
self.contentSuggestionsViewController.collectionView.bounces = NO;
self.contentSuggestionsViewController.collectionView.alwaysBounceVertical =
NO;
self.contentSuggestionsViewController.collectionView.scrollEnabled = NO;
// Overscroll action does not work well with content offset, so set this
// to never and internally offset the UI to account for safe area insets.
self.discoverFeedWrapperViewController.feedCollectionView
.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
self.overscrollActionsController = [[OverscrollActionsController alloc]
initWithScrollView:self.discoverFeedWrapperViewController
.feedCollectionView];
[self.overscrollActionsController
setStyle:OverscrollStyle::NTP_NON_INCOGNITO];
self.overscrollActionsController.delegate = self.overscrollDelegate;
[self updateOverscrollActionsState];
}
- (void)viewDidLayoutSubviews {
......@@ -77,25 +107,39 @@
UIEdgeInsetsMake(collectionView.contentSize.height, 0, 0, 0);
}
- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection {
[super traitCollectionDidChange:previousTraitCollection];
[self updateOverscrollActionsState];
}
- (void)willUpdateSnapshot {
[self.overscrollActionsController clear];
}
#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView*)scrollView {
// TODO(crbug.com/1114792): Handle scrolling.
[self.overscrollActionsController scrollViewDidScroll:scrollView];
}
- (void)scrollViewWillBeginDragging:(UIScrollView*)scrollView {
// TODO(crbug.com/1114792): Handle scrolling.
[self.overscrollActionsController scrollViewWillBeginDragging:scrollView];
// TODO(crbug.com/1114792): Add metrics recorder.
}
- (void)scrollViewWillEndDragging:(UIScrollView*)scrollView
withVelocity:(CGPoint)velocity
targetContentOffset:(inout CGPoint*)targetContentOffset {
// TODO(crbug.com/1114792): Handle scrolling.
[self.overscrollActionsController
scrollViewWillEndDragging:scrollView
withVelocity:velocity
targetContentOffset:targetContentOffset];
}
- (void)scrollViewDidEndDragging:(UIScrollView*)scrollView
willDecelerate:(BOOL)decelerate {
// TODO(crbug.com/1114792): Handle scrolling.
[self.overscrollActionsController scrollViewDidEndDragging:scrollView
willDecelerate:decelerate];
}
- (void)scrollViewDidScrollToTop:(UIScrollView*)scrollView {
......@@ -115,7 +159,18 @@
}
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView*)scrollView {
return NO;
return YES;
}
#pragma mark - Private
// Enables or disables overscroll actions.
- (void)updateOverscrollActionsState {
if (IsSplitToolbarMode(self)) {
[self.overscrollActionsController enableOverscrollActions];
} else {
[self.overscrollActionsController disableOverscrollActions];
}
}
@end
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