// Copyright 2010-2014, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

package org.mozc.android.inputmethod.japanese;

import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
import com.google.common.base.Optional;

import java.util.List;

/**
 * Callback object for view evnets.
 *
 */
public interface ViewEventListener {
  /**
   * Called when KeyEvent is fired (by soft keyboard)
   *
   * @param mozcKeyEvent the key event to be processed by mozc server.
   * @param keyEvent the original key event
   * @param keyboardSpecification the keyboard specification used to input the key.
   * @param touchEventList {@code TouchEvent} instances related to this key event for logging
   *        usage stats.
   */
  public void onKeyEvent(ProtoCommands.KeyEvent mozcKeyEvent, KeyEventInterface keyEvent,
                         KeyboardSpecification keyboardSpecification,
                         List<? extends TouchEvent> touchEventList);

  /**
   * Called when Undo is fired (by soft keyboard).
   * @param touchEventList {@code TouchEvent} instances related to this undo for logging
   *        usage stats.
   */
  public void onUndo(List<? extends TouchEvent> touchEventList);

  /**
   * Called when a conversion candidate is selected.
   *
   * @param candidateId the id which Candidate and CandidateWord has.
   * @param rowIndex index of row in which the candidate is. If absent no stats are sent.
   */
  public void onConversionCandidateSelected(int candidateId, Optional<Integer> rowIndex);

  /**
   * Called when a candidate on symbol input view is selected.
   */
  public void onSymbolCandidateSelected(SymbolMajorCategory majorCategory, String candidate,
                                        boolean updateHistory);

  /**
   * Called when a feedback event happens.
   * @param event the event which makes feedback.
   */
  public void onFireFeedbackEvent(FeedbackEvent event);

  /**
   * Called when the preedit should be submitted.
   */
  public void onSubmitPreedit();

  /**
   * Called when expanding suggestion is needed.
   */
  public void onExpandSuggestion();

  /**
   * Called when the menu dialog is shown.
   *
   * @param touchEventList {@code TouchEvent} instances which is related to this event
   *        for logging usage stats.
   */
  // TODO(matsuzakit): Rename. onFlushTouchEventStats ?
  public void onShowMenuDialog(List<? extends TouchEvent> touchEventList);

  /**
   * Called when the symbol input view is shown.
   *
   * @param touchEventList {@code TouchEvent} instances which is related to this event
   *        for logging usage stats.
   */
  public void onShowSymbolInputView(List<? extends TouchEvent> touchEventList);

  /**
   * Called when the symbol input view is closed.
   */
  public void onCloseSymbolInputView();

  /**
   * Called when the hardware_composition_button is clicked.
   * @param mode new mode
   */
  public void onHardwareKeyboardCompositionModeChange(CompositionSwitchMode mode);

  /**
   * Called when the key for editor action is pressed.
   */
  public void onActionKey();
}
