radunitescu's Objective-C Readability code for review
Change-Id: I9d787331ddfa93137eec1dec7f3fecaef5456f28
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6309086
Reviewed-by: Éric Noyau <noyau@chromium.org>
Commit-Queue: Radu Nitescu <radunitescu@google.com>
Cr-Commit-Position: refs/heads/main@{#1428860}
diff --git a/ios/chrome/browser/lens_overlay/model/lens_overlay_detents_manager.h b/ios/chrome/browser/lens_overlay/model/lens_overlay_detents_manager.h
index 92ff339..6bbeb954 100644
--- a/ios/chrome/browser/lens_overlay/model/lens_overlay_detents_manager.h
+++ b/ios/chrome/browser/lens_overlay/model/lens_overlay_detents_manager.h
@@ -9,10 +9,22 @@
#import "ios/chrome/browser/lens_overlay/model/lens_overlay_sheet_detent_state.h"
-@protocol LensOverlayDetentsChangeObserver;
+@protocol LensOverlayDetentsManagerDelegate;
// Manages the detents for a given bottom sheet, adapting to different detent
// sizes.
+//
+// The sheet detent state defines the set of detents the sheet can settle
+// into once the user completes a manual drag gesture and releases it.
+// The current presentation strategy dictates the possible height variations
+// between the available detents of each state.
+//
+// While the semantic meaning of each state is consistent, the way each state
+// presentation is dictated by the current presentation strategy. The employed
+// strategy dictates variation in height of detents.
+//
+// The number of detents can be subject to change and its consistency is not
+// guaranteed between presentation strategies.
@interface LensOverlayDetentsManager : NSObject
// The estimated detent medium detent height, with respect to the current
@@ -20,12 +32,15 @@
@property(nonatomic, readonly) CGFloat estimatedMediumDetentHeight;
// The object notified of bottom sheet detent changes.
-@property(nonatomic, weak) id<LensOverlayDetentsChangeObserver> observer;
+@property(nonatomic, weak) id<LensOverlayDetentsManagerDelegate> delegate;
// Current sheet dimension.
@property(nonatomic, readonly) SheetDimensionState sheetDimension;
-// The strategy to use when presenting in unrestricted mode.
+// The strategy to use when presenting.
+//
+// Changing the presentation strategy adjusts the detents for unrestricted
+// movement.
@property(nonatomic, assign)
SheetDetentPresentationStategy presentationStrategy;
@@ -55,15 +70,17 @@
@end
-// Observes changes in the detents and dimension states.
-@protocol LensOverlayDetentsChangeObserver <NSObject>
+// Reacts to changes in detents and dimension states.
+@protocol LensOverlayDetentsManagerDelegate <NSObject>
-// Called when the dimension state changes. Does not report the initial value,
-// only publishes changes recorded after the subscription.
-- (void)onBottomSheetDimensionStateChanged:(SheetDimensionState)state;
+// Called when the dimension state changes.
+- (void)lensOverlayDetentsManagerDidChangeDimensionState:
+ (LensOverlayDetentsManager*)detentsManager;
-// Called before dismissing the bottom sheet.
-- (BOOL)bottomSheetShouldDismissFromState:(SheetDimensionState)state;
+// Asks the delegate for permission to dismiss the presentation.
+- (BOOL)lensOverlayDetentsManagerShouldDismissBottomSheet:
+ (LensOverlayDetentsManager*)detentsManager;
+
@end
#endif // IOS_CHROME_BROWSER_LENS_OVERLAY_MODEL_LENS_OVERLAY_DETENTS_MANAGER_H_
diff --git a/ios/chrome/browser/lens_overlay/model/lens_overlay_detents_manager.mm b/ios/chrome/browser/lens_overlay/model/lens_overlay_detents_manager.mm
index c387696c..f415f77 100644
--- a/ios/chrome/browser/lens_overlay/model/lens_overlay_detents_manager.mm
+++ b/ios/chrome/browser/lens_overlay/model/lens_overlay_detents_manager.mm
@@ -6,32 +6,59 @@
namespace {
-NSString* const kCustomConsentSheetDetentIdentifier =
- @"kCustomConsentSheetDetentIdentifier";
+NSString* const kConsentSheetDetentIdentifier =
+ @"kConsentSheetDetentIdentifier";
+// The identifier for the medium detent when presenting in the translate filter
+// strategy.
NSString* const kTranslateModeMediumDetentIdentifier =
@"kTranslateModeMediumDetentIdentifier";
-NSString* const kCustomPeakSheetDetentIdentifier =
- @"kCustomPeakSheetDetentIdentifier";
+// The identifier for the peak detent.
+NSString* const kPeakSheetDetentIdentifier = @"kPeakSheetDetentIdentifier";
// The detent height in points for the 'peak' state of the bottom sheet.
-const CGFloat kPeakDetentHeight = 100;
+const CGFloat kPeakDetentHeight = 100.0;
// The percentage of the screen that will be covered by the bottom sheet in
// translate mode.
const CGFloat kTranslateSheetHeightRatio = 0.33;
+
} // namespace
-@interface LensOverlayDetentsManager (Private) <
- UISheetPresentationControllerDelegate>
+@interface LensOverlayDetentsManager () <UISheetPresentationControllerDelegate>
-@property(nonatomic, readonly) UISheetPresentationControllerDetent* largeDetent;
-@property(nonatomic, readonly)
- UISheetPresentationControllerDetent* mediumDetent;
-@property(nonatomic, readonly)
- UISheetPresentationControllerDetent* consentDetent;
-@property(nonatomic, readonly) UISheetPresentationControllerDetent* peakDetent;
+// Whether the bottom sheet being managed is in the medium detent dimension.
+- (BOOL)isInMediumDetent;
+
+// Whether the bottom sheet being managed is in the large detent dimension.
+- (BOOL)isInLargeDetent;
+
+// The height of The base window of the presentation
+- (CGFloat)windowHeight;
+
+// Changes the current set of available detents for a given a desired sheet
+// state. Also notifies the delegate of any change in detents.
+- (void)setDetentsForState:(SheetDetentState)state;
+
+// Informs the delegate when a change in the sheet dimension occurs.
+- (void)reportDimensionChangeIfNeeded;
+
+// A detent for the sheet that’s approximately the full height of the screen
+// (excluding the top safe area which is not covered).
+- (UISheetPresentationControllerDetent*)largeDetent;
+
+// A detent for the sheet that’s approximately half the height of the screen
+// when presenting for the selection filter and on third of the screen for
+// the translation filter.
+- (UISheetPresentationControllerDetent*)mediumDetent;
+
+// The detent in which to present the consent dialog.
+- (UISheetPresentationControllerDetent*)consentDetent;
+
+// The detent of the peak state that covers a small portion of the screen,
+// allowing most of the content behind the sheet to be visible.
+- (UISheetPresentationControllerDetent*)peakDetent;
@end
@@ -70,57 +97,56 @@
return self;
}
-#pragma mark - Public
+#pragma mark - Public properties
- (CGFloat)estimatedMediumDetentHeight {
switch (_presentationStrategy) {
case SheetDetentPresentationStategySelection:
- return self.windowHeight / 2;
+ return [self windowHeight] / 2;
case SheetDetentPresentationStategyTranslate:
- return self.windowHeight * kTranslateSheetHeightRatio;
+ return [self windowHeight] * kTranslateSheetHeightRatio;
default:
return 0;
}
}
- (SheetDimensionState)sheetDimension {
- NSString* identifier = _sheet.selectedDetentIdentifier;
- BOOL isInMediumDetent = self.isInMediumDetent;
- BOOL isInLargestDetent = self.isInLargeDetent;
- BOOL isPeaking =
- [identifier isEqualToString:kCustomPeakSheetDetentIdentifier];
- BOOL isConsent =
- [identifier isEqualToString:kCustomConsentSheetDetentIdentifier];
- if (isInLargestDetent) {
+ if ([self isInLargeDetent]) {
return SheetDimensionStateLarge;
- } else if (isInMediumDetent) {
- return SheetDimensionStateMedium;
- } else if (isPeaking) {
- return SheetDimensionStatePeaking;
- } else if (isConsent) {
- return SheetDimensionStateConsent;
- } else {
- return SheetDimensionStateHidden;
}
-}
+ if ([self isInMediumDetent]) {
+ return SheetDimensionStateMedium;
+ }
-- (void)adjustDetentsForState:(SheetDetentState)state {
- __weak __typeof(self) weakSelf = self;
- [_sheet animateChanges:^{
- [weakSelf setDetentsForState:state];
- }];
+ NSString* identifier = _sheet.selectedDetentIdentifier;
+ if ([identifier isEqualToString:kPeakSheetDetentIdentifier]) {
+ return SheetDimensionStatePeaking;
+ }
+
+ if ([identifier isEqualToString:kConsentSheetDetentIdentifier]) {
+ return SheetDimensionStateConsent;
+ }
+
+ return SheetDimensionStateHidden;
}
- (void)setPresentationStrategy:
(SheetDetentPresentationStategy)presentationStrategy {
_presentationStrategy = presentationStrategy;
- BOOL unrestrictedMovement = self.isInMediumDetent || self.isInLargeDetent;
- if (unrestrictedMovement) {
+ if ([self isInMediumDetent] || [self isInLargeDetent]) {
// Refresh the detents presentation for the unrestricted state.
[self adjustDetentsForState:SheetDetentStateUnrestrictedMovement];
}
}
+#pragma mark - Public methods
+
+- (void)adjustDetentsForState:(SheetDetentState)state {
+ [_sheet animateChanges:^{
+ [self setDetentsForState:state];
+ }];
+}
+
- (void)requestMaximizeBottomSheet {
[_sheet animateChanges:^{
_sheet.selectedDetentIdentifier =
@@ -146,16 +172,16 @@
- (BOOL)presentationControllerShouldDismiss:
(UIPresentationController*)presentationController {
- if (!_observer) {
+ if (!_delegate) {
return YES;
}
- return [_observer bottomSheetShouldDismissFromState:self.sheetDimension];
+ return [_delegate lensOverlayDetentsManagerShouldDismissBottomSheet:self];
}
- (void)presentationControllerDidDismiss:
(UIPresentationController*)presentationController {
_sheet.selectedDetentIdentifier = nil;
- [_observer onBottomSheetDimensionStateChanged:SheetDimensionStateHidden];
+ [_delegate lensOverlayDetentsManagerDidChangeDimensionState:self];
}
#pragma mark - Private
@@ -180,19 +206,19 @@
- (void)setDetentsForState:(SheetDetentState)state {
switch (state) {
case SheetDetentStateUnrestrictedMovement:
- _sheet.detents = @[ self.mediumDetent, self.largeDetent ];
- _sheet.largestUndimmedDetentIdentifier = self.largeDetent.identifier;
- _sheet.selectedDetentIdentifier = self.mediumDetent.identifier;
+ _sheet.detents = @[ [self mediumDetent], [self largeDetent] ];
+ _sheet.largestUndimmedDetentIdentifier = [self largeDetent].identifier;
+ _sheet.selectedDetentIdentifier = [self mediumDetent].identifier;
break;
case SheetDetentStatePeakEnabled:
- _sheet.detents = @[ self.peakDetent ];
- _sheet.largestUndimmedDetentIdentifier = self.peakDetent.identifier;
- _sheet.selectedDetentIdentifier = self.peakDetent.identifier;
+ _sheet.detents = @[ [self peakDetent] ];
+ _sheet.largestUndimmedDetentIdentifier = kPeakSheetDetentIdentifier;
+ _sheet.selectedDetentIdentifier = kPeakSheetDetentIdentifier;
break;
case SheetDetentStateConsentDialog:
- _sheet.detents = @[ self.consentDetent ];
- _sheet.largestUndimmedDetentIdentifier = self.consentDetent.identifier;
- _sheet.selectedDetentIdentifier = self.consentDetent.identifier;
+ _sheet.detents = @[ [self consentDetent] ];
+ _sheet.largestUndimmedDetentIdentifier = kConsentSheetDetentIdentifier;
+ _sheet.selectedDetentIdentifier = kConsentSheetDetentIdentifier;
break;
}
@@ -201,7 +227,7 @@
- (void)reportDimensionChangeIfNeeded {
if (self.sheetDimension != _latestReportedDimension) {
- [_observer onBottomSheetDimensionStateChanged:self.sheetDimension];
+ [_delegate lensOverlayDetentsManagerDidChangeDimensionState:self];
_latestReportedDimension = self.sheetDimension;
}
}
@@ -215,7 +241,7 @@
return [UISheetPresentationControllerDetent mediumDetent];
}
- CGFloat resolvedHeight = self.windowHeight * kTranslateSheetHeightRatio;
+ CGFloat resolvedHeight = [self windowHeight] * kTranslateSheetHeightRatio;
auto heightResolver = ^CGFloat(
id<UISheetPresentationControllerDetentResolutionContext> context) {
return resolvedHeight;
@@ -233,7 +259,7 @@
return presentedViewController.preferredContentSize.height;
};
return [UISheetPresentationControllerDetent
- customDetentWithIdentifier:kCustomConsentSheetDetentIdentifier
+ customDetentWithIdentifier:kConsentSheetDetentIdentifier
resolver:consentHeightResolver];
}
@@ -243,7 +269,7 @@
return kPeakDetentHeight;
};
return [UISheetPresentationControllerDetent
- customDetentWithIdentifier:kCustomPeakSheetDetentIdentifier
+ customDetentWithIdentifier:kPeakSheetDetentIdentifier
resolver:peakHeightResolver];
}
diff --git a/ios/chrome/browser/lens_overlay/model/lens_overlay_detents_manager_unittest.mm b/ios/chrome/browser/lens_overlay/model/lens_overlay_detents_manager_unittest.mm
index 55c5285..896cbe0 100644
--- a/ios/chrome/browser/lens_overlay/model/lens_overlay_detents_manager_unittest.mm
+++ b/ios/chrome/browser/lens_overlay/model/lens_overlay_detents_manager_unittest.mm
@@ -14,21 +14,25 @@
using base::test::ios::kWaitForUIElementTimeout;
using base::test::ios::WaitUntilConditionOrTimeout;
-// Fake observer that exposes the latest reported value by the detents manager.
-@interface FakeDetentsObserver : NSObject <LensOverlayDetentsChangeObserver>
+// Fake delegate that exposes the latest reported value by the detents manager.
+@interface FakeDetentsManagerDelegate
+ : NSObject <LensOverlayDetentsManagerDelegate>
// The latest reported dimension state.
@property(nonatomic, readonly) SheetDimensionState latestReportedDimensionState;
@end
-@implementation FakeDetentsObserver
-- (BOOL)bottomSheetShouldDismissFromState:(SheetDimensionState)state {
+@implementation FakeDetentsManagerDelegate
+
+- (BOOL)lensOverlayDetentsManagerShouldDismissBottomSheet:
+ (LensOverlayDetentsManager*)detentsManager {
return YES;
}
-- (void)onBottomSheetDimensionStateChanged:(SheetDimensionState)state {
- _latestReportedDimensionState = state;
+- (void)lensOverlayDetentsManagerDidChangeDimensionState:
+ (LensOverlayDetentsManager*)detentsManager {
+ _latestReportedDimensionState = detentsManager.sheetDimension;
}
@end
@@ -51,15 +55,9 @@
window:scoped_key_window_.Get()];
}
- ~LensOverlayDetentsManagerTest() override {
- detents_manager_ = nil;
- presented_view_controller_ = nil;
- presenting_view_controller_ = nil;
- }
-
LensOverlayDetentsManager* detents_manager_;
- UIViewController* presented_view_controller_;
- UIViewController* presenting_view_controller_;
+ __strong UIViewController* presented_view_controller_;
+ __strong UIViewController* presenting_view_controller_;
ScopedKeyWindow scoped_key_window_;
// Presents and blocks until the view controller is presented.
@@ -128,7 +126,7 @@
[detents_manager_ adjustDetentsForState:SheetDetentStateUnrestrictedMovement];
WaitForPresentation();
- // Then the default presentation dimension immediatelly after presenting
+ // Then the default presentation dimension immediately after presenting
// should be medium.
EXPECT_EQ(detents_manager_.sheetDimension, SheetDimensionStateMedium);
@@ -183,11 +181,12 @@
}
// Tests the ability of adjusting the detent after the initial presentation.
-TEST_F(LensOverlayDetentsManagerTest, TestAdjustingDetentsNotifiesObserver) {
- // Given a detents observer.
- FakeDetentsObserver* fakeObserver = [[FakeDetentsObserver alloc] init];
- detents_manager_.observer = fakeObserver;
- EXPECT_EQ(fakeObserver.latestReportedDimensionState,
+TEST_F(LensOverlayDetentsManagerTest, TestAdjustingDetentsNotifiesDelegate) {
+ // Given a detents delegate.
+ FakeDetentsManagerDelegate* fakeDelegate =
+ [[FakeDetentsManagerDelegate alloc] init];
+ detents_manager_.delegate = fakeDelegate;
+ EXPECT_EQ(fakeDelegate.latestReportedDimensionState,
SheetDimensionStateHidden);
// When presenting in the unrestricted movement state.
@@ -195,10 +194,10 @@
WaitForPresentation();
// Then the changes in the dimension state should be propagated to the detents
- // observer.
- EXPECT_EQ(fakeObserver.latestReportedDimensionState,
+ // delegate.
+ EXPECT_EQ(fakeDelegate.latestReportedDimensionState,
SheetDimensionStateMedium);
[detents_manager_ adjustDetentsForState:SheetDetentStatePeakEnabled];
- EXPECT_EQ(fakeObserver.latestReportedDimensionState,
+ EXPECT_EQ(fakeDelegate.latestReportedDimensionState,
SheetDimensionStatePeaking);
}
diff --git a/ios/chrome/browser/lens_overlay/ui/lens_overlay_consent_presenter.mm b/ios/chrome/browser/lens_overlay/ui/lens_overlay_consent_presenter.mm
index 0a574a4..e6463ab 100644
--- a/ios/chrome/browser/lens_overlay/ui/lens_overlay_consent_presenter.mm
+++ b/ios/chrome/browser/lens_overlay/ui/lens_overlay_consent_presenter.mm
@@ -9,7 +9,7 @@
#import "ios/chrome/browser/lens_overlay/model/lens_overlay_sheet_detent_state.h"
#import "ios/chrome/browser/lens_overlay/ui/lens_overlay_consent_view_controller.h"
-@interface LensOverlayConsentPresenter () <LensOverlayDetentsChangeObserver>
+@interface LensOverlayConsentPresenter () <LensOverlayDetentsManagerDelegate>
@end
@implementation LensOverlayConsentPresenter {
@@ -47,7 +47,7 @@
_detentsManager =
[[LensOverlayDetentsManager alloc] initWithBottomSheet:sheet
window:window];
- _detentsManager.observer = self;
+ _detentsManager.delegate = self;
[_detentsManager adjustDetentsForState:SheetDetentStateConsentDialog];
[_presentingViewController
presentViewController:_presentedConsentViewController
@@ -69,16 +69,18 @@
completion:completion];
}
-#pragma mark - LensOverlayDetentsChangeObserver
+#pragma mark - LensOverlayDetentsManagerDelegate
-- (void)onBottomSheetDimensionStateChanged:(SheetDimensionState)state {
- if (state == SheetDimensionStateHidden) {
+- (void)lensOverlayDetentsManagerDidChangeDimensionState:
+ (LensOverlayDetentsManager*)detentsManager {
+ if (detentsManager.sheetDimension == SheetDimensionStateHidden) {
[self.delegate requestDismissalOfConsentDialog:self];
}
}
-- (BOOL)bottomSheetShouldDismissFromState:(SheetDimensionState)state {
- DCHECK(state == SheetDimensionStateConsent);
+- (BOOL)lensOverlayDetentsManagerShouldDismissBottomSheet:
+ (LensOverlayDetentsManager*)detentsManager {
+ DCHECK(detentsManager.sheetDimension == SheetDimensionStateConsent);
return YES;
}
diff --git a/ios/chrome/browser/lens_overlay/ui/lens_overlay_results_page_presenter.mm b/ios/chrome/browser/lens_overlay/ui/lens_overlay_results_page_presenter.mm
index f85efa4..06f793b 100644
--- a/ios/chrome/browser/lens_overlay/ui/lens_overlay_results_page_presenter.mm
+++ b/ios/chrome/browser/lens_overlay/ui/lens_overlay_results_page_presenter.mm
@@ -31,8 +31,9 @@
} // namespace
-@interface LensOverlayResultsPagePresenter () <LensOverlayPanTrackerDelegate,
- LensOverlayDetentsChangeObserver>
+@interface LensOverlayResultsPagePresenter () <
+ LensOverlayPanTrackerDelegate,
+ LensOverlayDetentsManagerDelegate>
@end
@implementation LensOverlayResultsPagePresenter {
@@ -160,7 +161,7 @@
initWithBottomSheet:sheet
window:self.presentationWindow
presentationStrategy:strategy];
- _detentsManager.observer = self;
+ _detentsManager.delegate = self;
[_detentsManager adjustDetentsForState:SheetDetentStateUnrestrictedMovement];
if (maximizeSheet) {
@@ -389,14 +390,17 @@
}
}
-#pragma mark - LensOverlayDetentsChangeObserver
+#pragma mark - LensOverlayDetentsManagerDelegate
-- (void)onBottomSheetDimensionStateChanged:(SheetDimensionState)state {
- [self.delegate onResultsPageDimensionStateChanged:state];
+- (void)lensOverlayDetentsManagerDidChangeDimensionState:
+ (LensOverlayDetentsManager*)detentsManager {
+ [self.delegate
+ onResultsPageDimensionStateChanged:detentsManager.sheetDimension];
}
-- (BOOL)bottomSheetShouldDismissFromState:(SheetDimensionState)state {
- switch (state) {
+- (BOOL)lensOverlayDetentsManagerShouldDismissBottomSheet:
+ (LensOverlayDetentsManager*)detentsManager {
+ switch (self.sheetDimension) {
case SheetDimensionStateConsent:
case SheetDimensionStateHidden:
return YES;