// Copyright 2015-present the Material Components for iOS authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#import <UIKit/UIKit.h>

// TODO(b/151929968): Delete import of delegate headers when client code has been migrated to no
// longer import delegates as transitive dependencies.
#import "MDCStatusBarShifterDelegate.h"

@protocol MDCStatusBarShifterDelegate;

API_DEPRECATED_BEGIN("Use a branded UINavigationController instead.", ios(12, API_TO_BE_DEPRECATED))

/**
 The status bar shifter is responsible for the management of the status bar's offset as a header
 view is shifting off-screen.

 This class is not intended to be subclassed.
 */
@interface MDCStatusBarShifter : NSObject

#pragma mark Shifting the status bar

/**
 Provides the status bar shifter with the current desired y offset of the status bar.

 A value of 0 means the status bar is unshifted. Values > 0 shift the status bar by that amount
 off-screen. Negative values are treated as zero.
 */
- (void)setOffset:(CGFloat)offset;

#pragma mark Configuring behavior

/**
 Whether or not the status bar shifter is enabled.

 If the status bar shifter is disabled midway through shifting the status bar then the shifter
 will move the status bar to a reasonable location.
 */
@property(nonatomic, getter=isEnabled) BOOL enabled;

/**
 A Boolean value indicating whether this class should use snapshotting when rendering the status
 bar shift.

 Defaults to YES.
 */
@property(nonatomic, getter=isSnapshottingEnabled) BOOL snapshottingEnabled;

#pragma mark Responding to state changes

@property(nonatomic, weak) id<MDCStatusBarShifterDelegate> delegate;

#pragma mark Introspection

/**
 A Boolean value indicating whether the receiver is able to shift the status bar.

 There are certain scenarios where the status bar shifter won't try to adjust the frame of the
 status bar. For example, if the status bar is showing the tap-to-return-to-call effect. In these
 cases this method returns NO.
 */
- (BOOL)canUpdateStatusBarFrame;

#pragma mark UIViewController events

/**
 A Boolean value indicating whether the true status bar should be hidden.

 The implementor of MDCStatusBarShifterDelegate should use this to inform UIKit of the expected
 status bar visibility via UIViewController::prefersStatusBarHidden.
 */
- (BOOL)prefersStatusBarHidden;

/** Must be called when the owning UIViewController's interface orientation is about to change. */
- (void)interfaceOrientationWillChange;

/** Must be called when the owning UIViewController's interface orientation has changed. */
- (void)interfaceOrientationDidChange;

/** Must be called when the owning UIViewController's view moves to a window. */
- (void)didMoveToWindow;

@end

API_DEPRECATED_END
