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 @@ ...@@ -63,6 +63,7 @@
#import "ios/chrome/browser/ui/content_suggestions/theme_change_delegate.h" #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/action_factory.h"
#import "ios/chrome/browser/ui/menu/menu_histograms.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/new_tab_page_header_constants.h"
#import "ios/chrome/browser/ui/ntp/notification_promo_whats_new.h" #import "ios/chrome/browser/ui/ntp/notification_promo_whats_new.h"
#import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h" #import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h"
...@@ -577,12 +578,15 @@ ...@@ -577,12 +578,15 @@
} }
- (void)willUpdateSnapshot { - (void)willUpdateSnapshot {
DCHECK(!IsRefactoredNTP());
[self.suggestionsViewController clearOverscroll]; [self.suggestionsViewController clearOverscroll];
} }
- (void)reload { - (void)reload {
if (IsDiscoverFeedEnabled()) if (IsDiscoverFeedEnabled() && !IsRefactoredNTP()) {
DCHECK(!IsRefactoredNTP());
ios::GetChromeBrowserProvider()->GetDiscoverFeedProvider()->RefreshFeed(); ios::GetChromeBrowserProvider()->GetDiscoverFeedProvider()->RefreshFeed();
}
[self.contentSuggestionsMediator.dataSink reloadAllData]; [self.contentSuggestionsMediator.dataSink reloadAllData];
} }
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
// content. // content.
return [super collectionViewContentSize]; return [super collectionViewContentSize];
} }
DCHECK(!IsRefactoredNTP());
CGFloat collectionViewHeight = self.collectionView.bounds.size.height; CGFloat collectionViewHeight = self.collectionView.bounds.size.height;
CGFloat headerHeight = [self firstHeaderHeight]; CGFloat headerHeight = [self firstHeaderHeight];
......
...@@ -25,10 +25,12 @@ source_set("coordinator") { ...@@ -25,10 +25,12 @@ source_set("coordinator") {
":ntp_internal", ":ntp_internal",
"//ios/chrome/browser/browser_state", "//ios/chrome/browser/browser_state",
"//ios/chrome/browser/main:public", "//ios/chrome/browser/main:public",
"//ios/chrome/browser/ui/commands",
"//ios/chrome/browser/ui/content_suggestions", "//ios/chrome/browser/ui/content_suggestions",
"//ios/chrome/browser/ui/coordinators:chrome_coordinators", "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
"//ios/chrome/browser/ui/main:scene_state_header", "//ios/chrome/browser/ui/main:scene_state_header",
"//ios/chrome/browser/ui/main:scene_state_observer", "//ios/chrome/browser/ui/main:scene_state_observer",
"//ios/chrome/browser/ui/overscroll_actions",
"//ios/chrome/browser/url_loading", "//ios/chrome/browser/url_loading",
"//ios/chrome/browser/web_state_list", "//ios/chrome/browser/web_state_list",
"//ios/public/provider/chrome/browser", "//ios/public/provider/chrome/browser",
......
...@@ -9,6 +9,11 @@ ...@@ -9,6 +9,11 @@
#include "base/metrics/user_metrics_action.h" #include "base/metrics/user_metrics_action.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "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/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_coordinator.h"
#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.h"
#import "ios/chrome/browser/ui/main/scene_state.h" #import "ios/chrome/browser/ui/main/scene_state.h"
...@@ -18,6 +23,7 @@ ...@@ -18,6 +23,7 @@
#import "ios/chrome/browser/ui/ntp/incognito_view_controller.h" #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_feature.h"
#import "ios/chrome/browser/ui/ntp/new_tab_page_view_controller.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/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/chrome_browser_provider.h"
#import "ios/public/provider/chrome/browser/discover_feed/discover_feed_provider.h" #import "ios/public/provider/chrome/browser/discover_feed/discover_feed_provider.h"
...@@ -30,7 +36,8 @@ ...@@ -30,7 +36,8 @@
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
@interface NewTabPageCoordinator () <SceneStateObserver> @interface NewTabPageCoordinator () <OverscrollActionsControllerDelegate,
SceneStateObserver>
// Coordinator for the ContentSuggestions. // Coordinator for the ContentSuggestions.
@property(nonatomic, strong) @property(nonatomic, strong)
...@@ -113,6 +120,7 @@ ...@@ -113,6 +120,7 @@
self.ntpViewController.discoverFeedWrapperViewController = self.ntpViewController.discoverFeedWrapperViewController =
self.discoverFeedWrapperViewController; self.discoverFeedWrapperViewController;
self.ntpViewController.overscrollDelegate = self;
} }
base::RecordAction(base::UserMetricsAction("MobileNTPShowMostVisited")); base::RecordAction(base::UserMetricsAction("MobileNTPShowMostVisited"));
...@@ -194,7 +202,11 @@ ...@@ -194,7 +202,11 @@
} }
- (void)willUpdateSnapshot { - (void)willUpdateSnapshot {
[self.contentSuggestionsCoordinator willUpdateSnapshot]; if (IsRefactoredNTP()) {
[self.ntpViewController willUpdateSnapshot];
} else {
[self.contentSuggestionsCoordinator willUpdateSnapshot];
}
} }
- (void)focusFakebox { - (void)focusFakebox {
...@@ -202,6 +214,9 @@ ...@@ -202,6 +214,9 @@
} }
- (void)reload { - (void)reload {
if (IsRefactoredNTP()) {
ios::GetChromeBrowserProvider()->GetDiscoverFeedProvider()->RefreshFeed();
}
[self.contentSuggestionsCoordinator reload]; [self.contentSuggestionsCoordinator reload];
} }
...@@ -238,4 +253,69 @@ ...@@ -238,4 +253,69 @@
[self updateVisible]; [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 @end
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
@class ContentSuggestionsViewController; @class ContentSuggestionsViewController;
@class DiscoverFeedWrapperViewController; @class DiscoverFeedWrapperViewController;
@protocol OverscrollActionsControllerDelegate;
// View controller containing all the content presented on a standard, // View controller containing all the content presented on a standard,
// non-incognito new tab page. // non-incognito new tab page.
...@@ -18,6 +19,10 @@ ...@@ -18,6 +19,10 @@
@property(nonatomic, strong) @property(nonatomic, strong)
DiscoverFeedWrapperViewController* discoverFeedWrapperViewController; DiscoverFeedWrapperViewController* discoverFeedWrapperViewController;
// Delegate for the overscroll actions.
@property(nonatomic, weak) id<OverscrollActionsControllerDelegate>
overscrollDelegate;
// Initializes view controller with NTP content view controllers. // Initializes view controller with NTP content view controllers.
// |discoverFeedViewController| represents the Discover feed for suggesting // |discoverFeedViewController| represents the Discover feed for suggesting
// articles. |contentSuggestionsViewController| represents other content // articles. |contentSuggestionsViewController| represents other content
...@@ -30,6 +35,9 @@ ...@@ -30,6 +35,9 @@
bundle:(NSBundle*)bundle NS_UNAVAILABLE; bundle:(NSBundle*)bundle NS_UNAVAILABLE;
- (instancetype)initWithCoder:(NSCoder*)coder NS_UNAVAILABLE; - (instancetype)initWithCoder:(NSCoder*)coder NS_UNAVAILABLE;
// Called when a snapshot of the content will be taken.
- (void)willUpdateSnapshot;
@end @end
#endif // IOS_CHROME_BROWSER_UI_NTP_NEW_TAB_PAGE_VIEW_CONTROLLER_H_ #endif // IOS_CHROME_BROWSER_UI_NTP_NEW_TAB_PAGE_VIEW_CONTROLLER_H_
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
#import "base/check.h" #import "base/check.h"
#import "ios/chrome/browser/ui/ntp/discover_feed_wrapper_view_controller.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" #import "ios/chrome/common/ui/util/constraints_ui_util.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
...@@ -22,6 +24,10 @@ ...@@ -22,6 +24,10 @@
@property(nonatomic, strong) @property(nonatomic, strong)
UICollectionViewController* contentSuggestionsViewController; UICollectionViewController* contentSuggestionsViewController;
// The overscroll actions controller managing accelerators over the toolbar.
@property(nonatomic, strong)
OverscrollActionsController* overscrollActionsController;
@end @end
@implementation NewTabPageViewController @implementation NewTabPageViewController
...@@ -36,6 +42,10 @@ ...@@ -36,6 +42,10 @@
return self; return self;
} }
- (void)dealloc {
[self.overscrollActionsController invalidate];
}
- (void)viewDidLoad { - (void)viewDidLoad {
[super viewDidLoad]; [super viewDidLoad];
...@@ -61,6 +71,26 @@ ...@@ -61,6 +71,26 @@
[self.contentSuggestionsViewController [self.contentSuggestionsViewController
didMoveToParentViewController:self.discoverFeedWrapperViewController didMoveToParentViewController:self.discoverFeedWrapperViewController
.discoverFeed]; .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 { - (void)viewDidLayoutSubviews {
...@@ -77,25 +107,39 @@ ...@@ -77,25 +107,39 @@
UIEdgeInsetsMake(collectionView.contentSize.height, 0, 0, 0); UIEdgeInsetsMake(collectionView.contentSize.height, 0, 0, 0);
} }
- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection {
[super traitCollectionDidChange:previousTraitCollection];
[self updateOverscrollActionsState];
}
- (void)willUpdateSnapshot {
[self.overscrollActionsController clear];
}
#pragma mark - UIScrollViewDelegate #pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView*)scrollView { - (void)scrollViewDidScroll:(UIScrollView*)scrollView {
// TODO(crbug.com/1114792): Handle scrolling. [self.overscrollActionsController scrollViewDidScroll:scrollView];
} }
- (void)scrollViewWillBeginDragging:(UIScrollView*)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 - (void)scrollViewWillEndDragging:(UIScrollView*)scrollView
withVelocity:(CGPoint)velocity withVelocity:(CGPoint)velocity
targetContentOffset:(inout CGPoint*)targetContentOffset { targetContentOffset:(inout CGPoint*)targetContentOffset {
// TODO(crbug.com/1114792): Handle scrolling. [self.overscrollActionsController
scrollViewWillEndDragging:scrollView
withVelocity:velocity
targetContentOffset:targetContentOffset];
} }
- (void)scrollViewDidEndDragging:(UIScrollView*)scrollView - (void)scrollViewDidEndDragging:(UIScrollView*)scrollView
willDecelerate:(BOOL)decelerate { willDecelerate:(BOOL)decelerate {
// TODO(crbug.com/1114792): Handle scrolling. [self.overscrollActionsController scrollViewDidEndDragging:scrollView
willDecelerate:decelerate];
} }
- (void)scrollViewDidScrollToTop:(UIScrollView*)scrollView { - (void)scrollViewDidScrollToTop:(UIScrollView*)scrollView {
...@@ -115,7 +159,18 @@ ...@@ -115,7 +159,18 @@
} }
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView*)scrollView { - (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 @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