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

#include "ash/shell/keyboard_controller_proxy_stub.h"

#include "ash/shell.h"
#include "ash/shell_delegate.h"
#include "ui/aura/window.h"
#include "ui/base/ime/mock_input_method.h"

using namespace content;

namespace ash {

KeyboardControllerProxyStub::KeyboardControllerProxyStub() {
}

KeyboardControllerProxyStub::~KeyboardControllerProxyStub() {
}

bool KeyboardControllerProxyStub::HasKeyboardWindow() const {
  return keyboard_;
}

aura::Window* KeyboardControllerProxyStub::GetKeyboardWindow() {
  if (!keyboard_) {
    keyboard_.reset(new aura::Window(&delegate_));
    keyboard_->Init(aura::WINDOW_LAYER_NOT_DRAWN);
  }
  return keyboard_.get();
}

BrowserContext* KeyboardControllerProxyStub::GetBrowserContext() {
  // TODO(oshima): investigate which profile to use.
  return Shell::GetInstance()->delegate()->GetActiveBrowserContext();
}

ui::InputMethod* KeyboardControllerProxyStub::GetInputMethod() {
  if (!input_method_)
    input_method_.reset(new ui::MockInputMethod(NULL));
  return input_method_.get();
}

void KeyboardControllerProxyStub::RequestAudioInput(
    WebContents* web_contents,
    const MediaStreamRequest& request,
    const MediaResponseCallback& callback) {
}

void KeyboardControllerProxyStub::LoadSystemKeyboard() {
}

void KeyboardControllerProxyStub::ReloadKeyboardIfNeeded() {
}

}  // namespace ash
