// 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 "content/browser/android/vibration_message_filter.h"

#include <algorithm>

#include "base/safe_numerics.h"
#include "content/common/view_messages.h"
#include "jni/VibrationMessageFilter_jni.h"
#include "third_party/WebKit/public/platform/WebVibration.h"

using base::android::AttachCurrentThread;

namespace content {

// Minimum duration of a vibration is 1 millisecond.
const int64 kMinimumVibrationDurationMs = 1;

VibrationMessageFilter::VibrationMessageFilter() {
}

VibrationMessageFilter::~VibrationMessageFilter() {
}

// static
bool VibrationMessageFilter::Register(JNIEnv* env) {
  return RegisterNativesImpl(env);
}

bool VibrationMessageFilter::OnMessageReceived(
    const IPC::Message& message,
    bool* message_was_ok) {
  bool handled = true;
  IPC_BEGIN_MESSAGE_MAP_EX(VibrationMessageFilter,
                           message,
                           *message_was_ok)
    IPC_MESSAGE_HANDLER(ViewHostMsg_Vibrate, OnVibrate)
    IPC_MESSAGE_HANDLER(ViewHostMsg_CancelVibration, OnCancelVibration)
    IPC_MESSAGE_UNHANDLED(handled = false)
  IPC_END_MESSAGE_MAP_EX()
  return handled;
}

void VibrationMessageFilter::OnVibrate(int64 milliseconds) {
  // Though the Blink implementation already sanitizes vibration times, don't
  // trust any values passed from the renderer.
  milliseconds = std::max(kMinimumVibrationDurationMs,
      std::min(milliseconds,
          base::checked_numeric_cast<int64>(WebKit::kVibrationDurationMax)));

  if (j_vibration_message_filter_.is_null()) {
    j_vibration_message_filter_.Reset(
        Java_VibrationMessageFilter_create(
            AttachCurrentThread(),
            base::android::GetApplicationContext()));
  }
  Java_VibrationMessageFilter_vibrate(AttachCurrentThread(),
                                      j_vibration_message_filter_.obj(),
                                      milliseconds);
}

void VibrationMessageFilter::OnCancelVibration() {
  // If somehow a cancel message is received before this object was
  // instantiated, it means there is no current vibration anyway. Just return.
  if (j_vibration_message_filter_.is_null())
    return;
  Java_VibrationMessageFilter_cancelVibration(AttachCurrentThread(),
      j_vibration_message_filter_.obj());
}

}  // namespace content
