// Copyright 2020-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>

API_DEPRECATED_BEGIN(
    "🕘 Schedule time to migrate. "
    "Use default system highlight behavior instead: go/material-ios-touch-response. "
    "This is go/material-ios-migrations#not-scriptable 🕘",
    ios(12, 12))

@class MDCRippleTouchController;
@class MDCRippleView;

/**
 Delegate methods for MDCRippleTouchController.
 */
NS_SWIFT_UI_ACTOR
@protocol MDCRippleTouchControllerDelegate <NSObject>
@optional

/**
 Controls whether the ripple touch controller should process touches.

 The touch controller will query this method to determine if it should start or continue to
 process touches controlling the ripple. Returning NO at the start of a gesture will prevent any
 ripple from being displayed, and returning NO in the middle of a gesture will cancel that gesture
 and evaporate the ripple.

 If not implemented then YES is assumed.

 @param rippleTouchController The ripple touch controller.
 @param location The touch location relative to the rippleTouchController view.
 @return YES if the controller should process touches at @c location.

 @see cancelRippleTouchProcessing
 */
- (BOOL)rippleTouchController:(nonnull MDCRippleTouchController *)rippleTouchController
    shouldProcessRippleTouchesAtTouchLocation:(CGPoint)location;

/**
 Notifies the receiver that the ripple touch controller did process an ripple view at the
 touch location.

 @param rippleTouchController The ripple touch controller.
 @param rippleView The ripple view.
 @param location The touch location relative to the rippleTouchController superView.
 */
- (void)rippleTouchController:(nonnull MDCRippleTouchController *)rippleTouchController
         didProcessRippleView:(nonnull MDCRippleView *)rippleView
              atTouchLocation:(CGPoint)location;

/**
 Provides an opportunity to add the rippleView anywhere in the given view's hierarchy.

 If this method is not implemented, the ripple view is added as a subview of the given view provided
 in the controller's `addRippleToView:` method or convenience initializer `initWithView:`.
 Delegates can choose to insert the ripple view anywhere in the view hierarchy.

 @param rippleTouchController The ripple touch controller.
 @param rippleView The ripple view.
 @param view The requested superview of the ripple view.
 */
- (void)rippleTouchController:(nonnull MDCRippleTouchController *)rippleTouchController
             insertRippleView:(nonnull MDCRippleView *)rippleView
                     intoView:(nonnull UIView *)view;

/**
 Returns the ripple view to use for a touch located at location in rippleTouchController.view.

 If the delegate implements this method, the controller will not create a ripple view of its own and
 rippleTouchController:insertRippleView:intoView: will not be called. This method allows the
 delegate to control the creation and reuse of ripple views.

 @param rippleTouchController The ripple touch controller.
 @param location The touch location in the coordinates of @c rippleTouchController.view.
 @return A ripple view to use at the touch location.
 */
- (nullable MDCRippleView *)rippleTouchController:
                                (nonnull MDCRippleTouchController *)rippleTouchController
                        rippleViewAtTouchLocation:(CGPoint)location;

@end

API_DEPRECATED_END
