// Copyright 2019 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.

package androidx.test.espresso.flutter.action;

import androidx.test.espresso.flutter.api.WidgetAction;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.annotation.Nonnull;

/** A collection of actions that can be performed on {@code FlutterView}s or Flutter widgets. */
public final class FlutterActions {

  private static final ExecutorService taskExecutor = Executors.newCachedThreadPool();

  // Do not initialize.
  private FlutterActions() {}

  /**
   * Returns a click action that can be performed on a Flutter widget.
   *
   * <p>The current implementation simply clicks at the center of the widget (with no visibility
   * checks yet). Internally, it calculates the coordinates to click on screen based on the position
   * of the matched Flutter widget and also its outer Flutter view, and injects gesture events to
   * the Android system to mimic a human's click.
   *
   * <p>Try {@link #syntheticClick()} only when this action cannot handle your case properly, e.g.
   * Flutter's internal state (only accessible within Flutter) affects how the action should
   * performed.
   */
  public static WidgetAction click() {
    return new ClickAction(taskExecutor);
  }

  /**
   * Returns a synthetic click action that can be performed on a Flutter widget.
   *
   * <p>Note, this is not a real click gesture event issued from Android system. Espresso delegates
   * to Flutter engine to perform the action.
   *
   * <p>Always prefer {@link #click()} as it exercises the entire Flutter stack and your Flutter app
   * by directly injecting key events to the Android system. Uses this {@link #syntheticClick()}
   * only when there are special cases that {@link #click()} cannot handle properly.
   */
  public static WidgetAction syntheticClick() {
    return new SyntheticClickAction();
  }

  /**
   * Returns an action that focuses on the widget (by clicking on it) and types the provided string
   * into the widget. Appending a \n to the end of the string translates to a ENTER key event. Note:
   * this method performs a tap on the widget before typing to force the widget into focus, if the
   * widget already contains text this tap may place the cursor at an arbitrary position within the
   * text.
   *
   * <p>The Flutter widget must support input methods.
   *
   * @param stringToBeTyped the text String that shall be input to the matched widget. Cannot be
   *     {@code null}.
   */
  public static WidgetAction typeText(@Nonnull String stringToBeTyped) {
    return new FlutterTypeTextAction(stringToBeTyped, taskExecutor);
  }

  /**
   * Returns an action that scrolls to the widget.
   *
   * <p>The widget must be a descendant of a scrollable widget like SingleChildScrollView.
   */
  public static WidgetAction scrollTo() {
    return new FlutterScrollToAction();
  }
}
