// Copyright 2017 The Cobalt 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.

#ifndef COBALT_H5VCC_H5VCC_ACCESSIBILITY_H_
#define COBALT_H5VCC_H5VCC_ACCESSIBILITY_H_

#include "base/message_loop_proxy.h"
#include "cobalt/accessibility/screen_reader.h"
#include "cobalt/accessibility/tts_engine.h"
#include "cobalt/base/event_dispatcher.h"
#include "cobalt/dom/window.h"
#include "cobalt/script/callback_function.h"
#include "cobalt/script/script_value.h"
#include "cobalt/script/wrappable.h"

namespace cobalt {
namespace h5vcc {

class H5vccAccessibility : public script::Wrappable {
 public:
  // Type for JavaScript event callback.
  typedef script::CallbackFunction<void()> H5vccAccessibilityCallback;
  typedef script::ScriptValue<H5vccAccessibilityCallback>
      H5vccAccessibilityCallbackHolder;
  H5vccAccessibility(
      base::EventDispatcher* event_dispatcher,
      const scoped_refptr<dom::Window>& window,
      dom::MutationObserverTaskManager* mutation_observer_task_manager);

  bool high_contrast_text() const;
  void AddHighContrastTextListener(
      const H5vccAccessibilityCallbackHolder& holder);
  void OnApplicationEvent(const base::Event* event);

  bool text_to_speech() const;

  bool built_in_screen_reader() const;
  void set_built_in_screen_reader(bool value);

  DEFINE_WRAPPABLE_TYPE(H5vccAccessibility);

 private:
  typedef H5vccAccessibilityCallbackHolder::Reference
      H5vccAccessibilityCallbackReference;

  void InternalOnApplicationEvent();

  scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;

  base::EventDispatcher* event_dispatcher_;
  scoped_ptr<H5vccAccessibilityCallbackReference> high_contrast_text_listener_;
  scoped_ptr<accessibility::TTSEngine> tts_engine_;
  scoped_ptr<accessibility::ScreenReader> screen_reader_;

  DISALLOW_COPY_AND_ASSIGN(H5vccAccessibility);
};

}  // namespace h5vcc
}  // namespace cobalt

#endif  // COBALT_H5VCC_H5VCC_ACCESSIBILITY_H_
