Index: ios/chrome/browser/ui/contextual_search/contextual_search_mask_view.mm |
diff --git a/ios/chrome/browser/ui/contextual_search/contextual_search_mask_view.mm b/ios/chrome/browser/ui/contextual_search/contextual_search_mask_view.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..23592c66040ece9ca3adaefc0a1c2698825cf01b |
--- /dev/null |
+++ b/ios/chrome/browser/ui/contextual_search/contextual_search_mask_view.mm |
@@ -0,0 +1,78 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ios/chrome/browser/ui/contextual_search/contextual_search_mask_view.h" |
+ |
+#include "base/logging.h" |
+#import "ios/chrome/browser/ui/contextual_search/contextual_search_panel_view.h" |
+#import "ios/chrome/browser/ui/uikit_ui_util.h" |
+ |
+// Linearly map |delta| in the range [0, 1] to a value in [min, max]. |
+#define LERP(min, max, delta) (min * (1 - delta) + max * delta) |
+ |
+namespace { |
+const CGFloat kPhoneMaskLimit = 1.0; |
+const CGFloat kPadMaskLimit = 0.8; |
+} |
+ |
+@implementation ContextualSearchMaskView { |
+ CGFloat _maskLimit; |
+} |
+ |
+- (instancetype)init { |
+ if ((self = [super initWithFrame:CGRectZero])) { |
+ self.userInteractionEnabled = NO; |
+ self.translatesAutoresizingMaskIntoConstraints = NO; |
+ self.accessibilityIdentifier = @"contextualSearchMask"; |
+ self.alpha = 0.0; |
+ self.backgroundColor = [UIColor blackColor]; |
+ _maskLimit = IsIPadIdiom() ? kPadMaskLimit : kPhoneMaskLimit; |
+ } |
+ return self; |
+} |
+ |
+- (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE { |
+ NOTREACHED(); |
+ return nil; |
+} |
+ |
+- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE { |
+ NOTREACHED(); |
+ return nil; |
+} |
+ |
+#pragma mark - UIView methods. |
+ |
+- (void)updateConstraints { |
+ DCHECK(self.superview); |
+ NSArray* constraints = @[ @"V:|[mask]|", @"H:|[mask]|" ]; |
+ ApplyVisualConstraints(constraints, @{ @"mask" : self }, self.superview); |
+ [super updateConstraints]; |
+} |
+ |
+#pragma mark - ContextualSearchPanelMotionObserver methods |
+ |
+- (void)panel:(ContextualSearchPanelView*)panel |
+ didMoveWithMotion:(ContextualSearch::PanelMotion)motion { |
+ CGFloat ratio; |
+ if (motion.state < ContextualSearch::PEEKING) { |
+ ratio = 0; |
+ } else if (motion.state == ContextualSearch::COVERING) { |
+ ratio = 1; |
+ } else { |
+ ratio = [panel.configuration gradationToState:ContextualSearch::COVERING |
+ fromState:ContextualSearch::PEEKING |
+ atPosition:motion.position]; |
+ } |
+ |
+ ratio = LERP(0, _maskLimit, ratio); |
+ |
+ self.alpha = ratio * ratio; |
+} |
+ |
+- (void)panelWillPromote:(ContextualSearchPanelView*)panel { |
+ [panel removeMotionObserver:self]; |
+} |
+ |
+@end |