[iOS] Update Contextual Panel bottom inset based on toolbar height
Before this, the panel did not know the height of the toolbar, so the
bottom of the content got stuck behind the toolbar. This CL fixes that
by alerting the panel content of the bottom toolbar's expanded height.
It does not attempt to on-the-fly change the content inset when the
toolbar's height changes due to fullscreen.
Bug: 343727945
Change-Id: I6ba1696b42193aae1c0079e7c0cdf907a39eb875
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5660865
Reviewed-by: Gauthier Ambard <gambard@chromium.org>
Reviewed-by: Aliona Dangla <alionadangla@chromium.org>
Commit-Queue: Robbie Gibson <rkgibson@google.com>
Code-Coverage: findit-for-me@appspot.gserviceaccount.com <findit-for-me@appspot.gserviceaccount.com>
Reviewed-by: Nicolas MacBeth <nicolasmacbeth@google.com>
Cr-Commit-Position: refs/heads/main@{#1321820}
diff --git a/ios/chrome/browser/contextual_panel/coordinator/BUILD.gn b/ios/chrome/browser/contextual_panel/coordinator/BUILD.gn
index 83322441..71db5f98 100644
--- a/ios/chrome/browser/contextual_panel/coordinator/BUILD.gn
+++ b/ios/chrome/browser/contextual_panel/coordinator/BUILD.gn
@@ -9,6 +9,8 @@
"contextual_sheet_presenter.h",
"panel_content_coordinator.h",
"panel_content_coordinator.mm",
+ "panel_content_mediator.h",
+ "panel_content_mediator.mm",
]
deps = [
":public",
@@ -21,6 +23,8 @@
"//ios/chrome/browser/shared/model/browser",
"//ios/chrome/browser/shared/model/web_state_list",
"//ios/chrome/browser/shared/public/commands",
+ "//ios/chrome/browser/ui/broadcaster",
+ "//ios/chrome/browser/ui/fullscreen",
"//ios/chrome/common/ui/util",
]
frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/contextual_panel/coordinator/DEPS b/ios/chrome/browser/contextual_panel/coordinator/DEPS
index 30c7e5d..5333483 100644
--- a/ios/chrome/browser/contextual_panel/coordinator/DEPS
+++ b/ios/chrome/browser/contextual_panel/coordinator/DEPS
@@ -1,3 +1,5 @@
include_rules = [
- "+ios/chrome/browser/price_insights/coordinator",
+ "+ios/chrome/browser/price_insights/coordinator",
+ "+ios/chrome/browser/ui/broadcaster",
+ "+ios/chrome/browser/ui/fullscreen",
]
diff --git a/ios/chrome/browser/contextual_panel/coordinator/panel_content_coordinator.mm b/ios/chrome/browser/contextual_panel/coordinator/panel_content_coordinator.mm
index 19b04d51..6fcba0ed 100644
--- a/ios/chrome/browser/contextual_panel/coordinator/panel_content_coordinator.mm
+++ b/ios/chrome/browser/contextual_panel/coordinator/panel_content_coordinator.mm
@@ -5,6 +5,7 @@
#import "ios/chrome/browser/contextual_panel/coordinator/panel_content_coordinator.h"
#import "ios/chrome/browser/contextual_panel/coordinator/panel_block_modulator.h"
+#import "ios/chrome/browser/contextual_panel/coordinator/panel_content_mediator.h"
#import "ios/chrome/browser/contextual_panel/model/contextual_panel_item_configuration.h"
#import "ios/chrome/browser/contextual_panel/model/contextual_panel_item_type.h"
#import "ios/chrome/browser/contextual_panel/model/contextual_panel_tab_helper.h"
@@ -15,18 +16,29 @@
#import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h"
#import "ios/chrome/browser/shared/public/commands/command_dispatcher.h"
#import "ios/chrome/browser/shared/public/commands/contextual_sheet_commands.h"
+#import "ios/chrome/browser/ui/fullscreen/fullscreen_controller.h"
#import "ios/chrome/common/ui/util/constraints_ui_util.h"
@implementation PanelContentCoordinator {
// The view controller managed by this coordinator.
PanelContentViewController* _viewController;
+ // The mediator managed by this coordinator.
+ PanelContentMediator* _mediator;
+
// The child modulators owned by this coordinator.
NSMutableArray<PanelBlockModulator*>* _modulators;
}
- (void)start {
_viewController = [[PanelContentViewController alloc] init];
+
+ ChromeBroadcaster* broadcaster =
+ FullscreenController::FromBrowser(self.browser)->broadcaster();
+
+ _mediator = [[PanelContentMediator alloc] initWithBroadcaster:broadcaster];
+ _mediator.consumer = _viewController;
+
_modulators = [[NSMutableArray alloc] init];
web::WebState* activeWebState =
diff --git a/ios/chrome/browser/contextual_panel/coordinator/panel_content_mediator.h b/ios/chrome/browser/contextual_panel/coordinator/panel_content_mediator.h
new file mode 100644
index 0000000..7cc12e0
--- /dev/null
+++ b/ios/chrome/browser/contextual_panel/coordinator/panel_content_mediator.h
@@ -0,0 +1,25 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_CONTEXTUAL_PANEL_COORDINATOR_PANEL_CONTENT_MEDIATOR_H_
+#define IOS_CHROME_BROWSER_CONTEXTUAL_PANEL_COORDINATOR_PANEL_CONTENT_MEDIATOR_H_
+
+#import <Foundation/Foundation.h>
+
+@class ChromeBroadcaster;
+@protocol PanelContentConsumer;
+
+// Mediator for the PanelContent view.
+@interface PanelContentMediator : NSObject
+
+- (instancetype)initWithBroadcaster:(ChromeBroadcaster*)broadcaster
+ NS_DESIGNATED_INITIALIZER;
+- (instancetype)init NS_UNAVAILABLE;
+
+// The consumer this mediator should inform about any updates.
+@property(nonatomic, weak) id<PanelContentConsumer> consumer;
+
+@end
+
+#endif // IOS_CHROME_BROWSER_CONTEXTUAL_PANEL_COORDINATOR_PANEL_CONTENT_MEDIATOR_H_
diff --git a/ios/chrome/browser/contextual_panel/coordinator/panel_content_mediator.mm b/ios/chrome/browser/contextual_panel/coordinator/panel_content_mediator.mm
new file mode 100644
index 0000000..e10364b
--- /dev/null
+++ b/ios/chrome/browser/contextual_panel/coordinator/panel_content_mediator.mm
@@ -0,0 +1,43 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/contextual_panel/coordinator/panel_content_mediator.h"
+
+#import "ios/chrome/browser/contextual_panel/ui/panel_content_consumer.h"
+#import "ios/chrome/browser/ui/broadcaster/chrome_broadcast_observer.h"
+#import "ios/chrome/browser/ui/broadcaster/chrome_broadcaster.h"
+
+@interface PanelContentMediator () <ChromeBroadcastObserver>
+
+@end
+
+@implementation PanelContentMediator {
+ // The broadcaster to use to receive updates on the toolbar's height.
+ __weak ChromeBroadcaster* _broadcaster;
+}
+
+- (instancetype)initWithBroadcaster:(ChromeBroadcaster*)broadcaster {
+ self = [super init];
+ if (self) {
+ _broadcaster = broadcaster;
+ }
+ return self;
+}
+
+- (void)setConsumer:(id<PanelContentConsumer>)consumer {
+ _consumer = consumer;
+
+ // Wait for a consumer so the data can be passed straight along to the
+ // consumer.
+ [_broadcaster addObserver:self
+ forSelector:@selector(broadcastExpandedBottomToolbarHeight:)];
+}
+
+#pragma mark - ChromeBroadcastObserver
+
+- (void)broadcastExpandedBottomToolbarHeight:(CGFloat)height {
+ [self.consumer updateBottomToolbarHeight:height];
+}
+
+@end
diff --git a/ios/chrome/browser/contextual_panel/ui/BUILD.gn b/ios/chrome/browser/contextual_panel/ui/BUILD.gn
index e74bc690..24c76b7 100644
--- a/ios/chrome/browser/contextual_panel/ui/BUILD.gn
+++ b/ios/chrome/browser/contextual_panel/ui/BUILD.gn
@@ -6,6 +6,7 @@
sources = [
"contextual_sheet_view_controller.h",
"contextual_sheet_view_controller.mm",
+ "panel_content_consumer.h",
"panel_content_view_controller.h",
"panel_content_view_controller.mm",
]
diff --git a/ios/chrome/browser/contextual_panel/ui/panel_content_consumer.h b/ios/chrome/browser/contextual_panel/ui/panel_content_consumer.h
new file mode 100644
index 0000000..5ebca03
--- /dev/null
+++ b/ios/chrome/browser/contextual_panel/ui/panel_content_consumer.h
@@ -0,0 +1,16 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_CONTEXTUAL_PANEL_UI_PANEL_CONTENT_CONSUMER_H_
+#define IOS_CHROME_BROWSER_CONTEXTUAL_PANEL_UI_PANEL_CONTENT_CONSUMER_H_
+
+// Consumer protocol for the Panel Content view.
+@protocol PanelContentConsumer <NSObject>
+
+// Alerts the consumer that the bottom toolbar has changed its expanded height.
+- (void)updateBottomToolbarHeight:(CGFloat)height;
+
+@end
+
+#endif // IOS_CHROME_BROWSER_CONTEXTUAL_PANEL_UI_PANEL_CONTENT_CONSUMER_H_
diff --git a/ios/chrome/browser/contextual_panel/ui/panel_content_view_controller.h b/ios/chrome/browser/contextual_panel/ui/panel_content_view_controller.h
index 9073bc8..3cf6d8c 100644
--- a/ios/chrome/browser/contextual_panel/ui/panel_content_view_controller.h
+++ b/ios/chrome/browser/contextual_panel/ui/panel_content_view_controller.h
@@ -7,11 +7,13 @@
#import <UIKit/UIKit.h>
+#import "ios/chrome/browser/contextual_panel/ui/panel_content_consumer.h"
+
@protocol ContextualSheetCommands;
@class PanelBlockData;
// A view controller to display the contents of the Contextual Panel.
-@interface PanelContentViewController : UIViewController
+@interface PanelContentViewController : UIViewController <PanelContentConsumer>
// The handler for ContextualSheetCommands.
@property(nonatomic, weak) id<ContextualSheetCommands>
diff --git a/ios/chrome/browser/contextual_panel/ui/panel_content_view_controller.mm b/ios/chrome/browser/contextual_panel/ui/panel_content_view_controller.mm
index fe63a7c..024cece 100644
--- a/ios/chrome/browser/contextual_panel/ui/panel_content_view_controller.mm
+++ b/ios/chrome/browser/contextual_panel/ui/panel_content_view_controller.mm
@@ -60,6 +60,9 @@
// The blocks currently being displayed.
NSArray<PanelBlockData*>* _panelBlocks;
+
+ // The stored height of the expanded bottom toolbar.
+ CGFloat _bottomToolbarHeight;
}
#pragma mark - UIViewController
@@ -228,7 +231,10 @@
collectionViewLayout:[self createLayout]];
_collectionView.translatesAutoresizingMaskIntoConstraints = NO;
_collectionView.backgroundColor = UIColor.clearColor;
- _collectionView.contentInset = UIEdgeInsetsMake(kHeaderHeight, 0, 0, 0);
+ _collectionView.contentInset =
+ UIEdgeInsetsMake(kHeaderHeight, 0, _bottomToolbarHeight, 0);
+ _collectionView.contentInsetAdjustmentBehavior =
+ UIScrollViewContentInsetAdjustmentNever;
__weak __typeof(self) weakSelf = self;
auto cellProvider =
@@ -290,4 +296,15 @@
AddSameConstraints(_backgroundVisualEffectView.contentView, scrim);
}
+#pragma mark - PanelContentConsumer
+
+- (void)updateBottomToolbarHeight:(CGFloat)height {
+ _bottomToolbarHeight = height;
+ if (_collectionView) {
+ UIEdgeInsets insets = _collectionView.contentInset;
+ insets.bottom = height;
+ _collectionView.contentInset = insets;
+ }
+}
+
@end