/*
 * This file provided by Facebook is for non-commercial testing and evaluation
 * purposes only.  Facebook reserves all rights not expressly granted.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

package com.facebook.samples.zoomable;

import android.graphics.Matrix;
import android.graphics.RectF;
import android.view.MotionEvent;

/**
 * Interface for implementing a controller that works with {@link ZoomableDraweeView}
 * to control the zoom.
 */
public interface ZoomableController {

  /**
   * Listener interface.
   */
  interface Listener {

    /**
     * Notifies the view that the transform changed.
     *
     * @param transform the new matrix
     */
    void onTransformChanged(Matrix transform);
  }

  /**
   * Enables the controller. The controller is enabled when the image has been loaded.
   *
   * @param enabled whether to enable the controller
   */
  void setEnabled(boolean enabled);

  /**
   * Gets whether the controller is enabled. This should return the last value passed to
   * {@link #setEnabled}.
   *
   * @return whether the controller is enabled.
   */
  boolean isEnabled();

  /**
   * Sets the listener for the controller to call back when the matrix changes.
   *
   * @param listener the listener
   */
  void setListener(Listener listener);

  /**
   * Gets the current scale factor. A convenience method for calculating the scale from the
   * transform.
   *
   * @return the current scale factor
   */
  float getScaleFactor();

  /**
   * Returns true if the zoomable transform is identity matrix, and the controller is idle.
   */
  boolean isIdentity();

  /**
   * Returns true if the transform was corrected during the last update.
   *
   * This mainly happens when a gesture would cause the image to get out of limits and the
   * transform gets corrected in order to prevent that.
   */
  boolean wasTransformCorrected();

  /**
   * See {@link android.support.v4.view.ScrollingView}.
   */
  int computeHorizontalScrollRange();
  int computeHorizontalScrollOffset();
  int computeHorizontalScrollExtent();
  int computeVerticalScrollRange();
  int computeVerticalScrollOffset();
  int computeVerticalScrollExtent();

  /**
   * Gets the current transform.
   *
   * @return the transform
   */
  Matrix getTransform();

  /**
   * Sets the bounds of the image post transform prior to application of the zoomable
   * transformation.
   *
   * @param imageBounds the bounds of the image
   */
  void setImageBounds(RectF imageBounds);

  /**
   * Sets the bounds of the view.
   *
   * @param viewBounds the bounds of the view
   */
  void setViewBounds(RectF viewBounds);

  /**
   * Allows the controller to handle a touch event.
   *
   * @param event the touch event
   * @return whether the controller handled the event
   */
  boolean onTouchEvent(MotionEvent event);
}
