// Copyright 2013 The Flutter 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 io.flutter.embedding.engine.plugins.activity;

import android.app.Activity;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import io.flutter.plugin.common.PluginRegistry;

/**
 * Binding that gives {@link ActivityAware} plugins access to an associated {@link
 * android.app.Activity} and the {@link android.app.Activity}'s lifecycle methods.
 *
 * <p>To obtain an instance of an {@code ActivityPluginBinding} in a Flutter plugin, implement the
 * {@link ActivityAware} interface. A binding is provided in {@link
 * ActivityAware#onAttachedToActivity(ActivityPluginBinding)} and {@link
 * ActivityAware#onReattachedToActivityForConfigChanges(ActivityPluginBinding)}.
 */
public interface ActivityPluginBinding {

  /**
   * Returns the {@link android.app.Activity} that is currently attached to the {@link
   * io.flutter.embedding.engine.FlutterEngine} that owns this {@code ActivityPluginBinding}.
   */
  @NonNull
  Activity getActivity();

  /**
   * Returns the {@code Lifecycle} associated with the attached {@code Activity}.
   *
   * <p>Use the flutter_plugin_android_lifecycle plugin to turn the returned {@code Object} into a
   * {@code Lifecycle} object. See
   * (https://github.com/flutter/plugins/tree/master/packages/flutter_plugin_android_lifecycle).
   * Flutter plugins that rely on {@code Lifecycle} are forced to use the
   * flutter_plugin_android_lifecycle plugin so that the version of the Android Lifecycle library is
   * exposed to pub, which allows Flutter to manage different versions library over time.
   */
  @NonNull
  Object getLifecycle();

  /**
   * Adds a listener that is invoked whenever the associated {@link android.app.Activity}'s {@code
   * onRequestPermissionsResult(...)} method is invoked.
   */
  void addRequestPermissionsResultListener(
      @NonNull PluginRegistry.RequestPermissionsResultListener listener);

  /**
   * Removes a listener that was added in {@link
   * #addRequestPermissionsResultListener(PluginRegistry.RequestPermissionsResultListener)}.
   */
  void removeRequestPermissionsResultListener(
      @NonNull PluginRegistry.RequestPermissionsResultListener listener);

  /**
   * Adds a listener that is invoked whenever the associated {@link android.app.Activity}'s {@code
   * onActivityResult(...)} method is invoked.
   */
  void addActivityResultListener(@NonNull PluginRegistry.ActivityResultListener listener);

  /**
   * Removes a listener that was added in {@link
   * #addActivityResultListener(PluginRegistry.ActivityResultListener)}.
   */
  void removeActivityResultListener(@NonNull PluginRegistry.ActivityResultListener listener);

  /**
   * Adds a listener that is invoked whenever the associated {@link android.app.Activity}'s {@code
   * onNewIntent(...)} method is invoked.
   */
  void addOnNewIntentListener(@NonNull PluginRegistry.NewIntentListener listener);

  /**
   * Removes a listener that was added in {@link
   * #addOnNewIntentListener(PluginRegistry.NewIntentListener)}.
   */
  void removeOnNewIntentListener(@NonNull PluginRegistry.NewIntentListener listener);

  /**
   * Adds a listener that is invoked whenever the associated {@link android.app.Activity}'s {@code
   * onUserLeaveHint()} method is invoked.
   */
  void addOnUserLeaveHintListener(@NonNull PluginRegistry.UserLeaveHintListener listener);

  /**
   * Removes a listener that was added in {@link
   * #addOnUserLeaveHintListener(PluginRegistry.UserLeaveHintListener)}.
   */
  void removeOnUserLeaveHintListener(@NonNull PluginRegistry.UserLeaveHintListener listener);

  /**
   * Adds a listener that is invoked when the associated {@code Activity} or {@code Fragment} saves
   * and restores instance state.
   */
  void addOnSaveStateListener(@NonNull OnSaveInstanceStateListener listener);

  /**
   * Removes a listener that was added in {@link
   * #addOnSaveStateListener(OnSaveInstanceStateListener)}.
   */
  void removeOnSaveStateListener(@NonNull OnSaveInstanceStateListener listener);

  interface OnSaveInstanceStateListener {
    /**
     * Invoked when the associated {@code Activity} or {@code Fragment} executes {@link
     * Activity#onSaveInstanceState(Bundle)}.
     */
    void onSaveInstanceState(@NonNull Bundle bundle);

    /**
     * Invoked when the associated {@code Activity} executes {@link
     * android.app.Activity#onCreate(Bundle)} or associated {@code Fragment} executes {@code
     * Fragment#onCreate(Bundle)}.
     */
    void onRestoreInstanceState(@Nullable Bundle bundle);
  }
}
