diff options
author | leon.han <leon.han@intel.com> | 2015-08-14 00:54:55 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-14 07:55:30 +0000 |
commit | 25ac4910eef26d71cc94ee554626f6cad3f43e33 (patch) | |
tree | 6a5155e942568f442ce63213e057261d2d81676f /device | |
parent | 0df0152e2ede337b88809463ec44a61364b0c9e9 (diff) | |
download | chromium_src-25ac4910eef26d71cc94ee554626f6cad3f43e33.zip chromium_src-25ac4910eef26d71cc94ee554626f6cad3f43e33.tar.gz chromium_src-25ac4910eef26d71cc94ee554626f6cad3f43e33.tar.bz2 |
Vibration API: convert implementation to java mojo-service.
Implement mojo interface VibrationManager on Android
using Java directly instead of using C++ plus JNI.
BUG=439434
TEST=manually test vibration OK
Review URL: https://codereview.chromium.org/1274033002
Cr-Commit-Position: refs/heads/master@{#343352}
Diffstat (limited to 'device')
-rw-r--r-- | device/vibration/BUILD.gn | 25 | ||||
-rw-r--r-- | device/vibration/DEPS | 3 | ||||
-rw-r--r-- | device/vibration/android/BUILD.gn | 18 | ||||
-rw-r--r-- | device/vibration/android/java/src/org/chromium/device/vibration/VibrationManagerImpl.java | 64 | ||||
-rw-r--r-- | device/vibration/android/java/src/org/chromium/device/vibration/VibrationProvider.java | 54 | ||||
-rw-r--r-- | device/vibration/android/vibration_jni_registrar.cc | 27 | ||||
-rw-r--r-- | device/vibration/android/vibration_jni_registrar.h | 20 | ||||
-rw-r--r-- | device/vibration/vibration.gyp | 20 | ||||
-rw-r--r-- | device/vibration/vibration_manager_impl_android.cc | 57 | ||||
-rw-r--r-- | device/vibration/vibration_manager_impl_android.h | 38 |
10 files changed, 87 insertions, 239 deletions
diff --git a/device/vibration/BUILD.gn b/device/vibration/BUILD.gn index b315e57..ed046c2 100644 --- a/device/vibration/BUILD.gn +++ b/device/vibration/BUILD.gn @@ -5,17 +5,13 @@ import("//build/config/features.gni") import("//third_party/mojo/src/mojo/public/tools/bindings/mojom.gni") -if (is_android) { - import("//build/config/android/config.gni") - import("//build/config/android/rules.gni") # For generate_jni(). -} - component("vibration") { output_name = "device_vibration" sources = [ "vibration_export.h", "vibration_manager_impl.h", + "vibration_manager_impl_default.cc", ] defines = [ "DEVICE_VIBRATION_IMPLEMENTATION" ] @@ -30,15 +26,7 @@ component("vibration") { ] if (is_android) { - sources += [ - "android/vibration_jni_registrar.cc", - "android/vibration_jni_registrar.h", - "vibration_manager_impl_android.cc", - "vibration_manager_impl_android.h", - ] - deps += [ ":vibration_jni_headers" ] - } else { - sources += [ "vibration_manager_impl_default.cc" ] + sources -= [ "vibration_manager_impl_default.cc" ] } } @@ -47,12 +35,3 @@ mojom("mojo_bindings") { "vibration_manager.mojom", ] } - -if (is_android) { - generate_jni("vibration_jni_headers") { - sources = [ - "android/java/src/org/chromium/device/vibration/VibrationProvider.java", - ] - jni_package = "vibration" - } -} diff --git a/device/vibration/DEPS b/device/vibration/DEPS deleted file mode 100644 index 1129c7b..0000000 --- a/device/vibration/DEPS +++ /dev/null @@ -1,3 +0,0 @@ -include_rules = [ - "+jni", -]
\ No newline at end of file diff --git a/device/vibration/android/BUILD.gn b/device/vibration/android/BUILD.gn new file mode 100644 index 0000000..f7640af --- /dev/null +++ b/device/vibration/android/BUILD.gn @@ -0,0 +1,18 @@ +# Copyright 2014 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. + +import("//build/config/android/config.gni") +import("//build/config/android/rules.gni") + +android_library("vibration_manager_android") { + java_files = + [ "java/src/org/chromium/device/vibration/VibrationManagerImpl.java" ] + + deps = [ + "//base:base_java", + "//device/vibration:mojo_bindings_java", + "//third_party/mojo/src/mojo/public/java:bindings", + "//third_party/mojo/src/mojo/public/java:system", + ] +} diff --git a/device/vibration/android/java/src/org/chromium/device/vibration/VibrationManagerImpl.java b/device/vibration/android/java/src/org/chromium/device/vibration/VibrationManagerImpl.java new file mode 100644 index 0000000..dd8d275 --- /dev/null +++ b/device/vibration/android/java/src/org/chromium/device/vibration/VibrationManagerImpl.java @@ -0,0 +1,64 @@ +// Copyright 2015 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. + +package org.chromium.device.vibration; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.media.AudioManager; +import android.os.Vibrator; +import android.util.Log; + +import org.chromium.mojo.system.MojoException; +import org.chromium.mojom.device.VibrationManager; + +/** + * Android implementation of the vibration manager service defined in + * device/vibration/vibration_manager.mojom. + */ +public class VibrationManagerImpl implements VibrationManager { + private static final String TAG = "VibrationManagerImpl"; + + private static final long MINIMUM_VIBRATION_DURATION_MS = 1; // 1 millisecond + private static final long MAXIMUM_VIBRATION_DURATION_MS = 10000; // 10 seconds + + private final AudioManager mAudioManager; + private final Vibrator mVibrator; + private final boolean mHasVibratePermission; + + public VibrationManagerImpl(Context context) { + mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); + mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); + mHasVibratePermission = + context.checkCallingOrSelfPermission(android.Manifest.permission.VIBRATE) + == PackageManager.PERMISSION_GRANTED; + if (!mHasVibratePermission) { + Log.w(TAG, "Failed to use vibrate API, requires VIBRATE permission."); + } + } + + @Override + public void close() {} + + @Override + public void onConnectionError(MojoException e) {} + + @Override + public void vibrate(long milliseconds) { + // Though the Blink implementation already sanitizes vibration times, don't + // trust any values passed from the client. + long sanitizedMilliseconds = Math.max(MINIMUM_VIBRATION_DURATION_MS, + Math.min(milliseconds, MAXIMUM_VIBRATION_DURATION_MS)); + + if (mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_SILENT + && mHasVibratePermission) { + mVibrator.vibrate(sanitizedMilliseconds); + } + } + + @Override + public void cancel() { + if (mHasVibratePermission) mVibrator.cancel(); + } +} diff --git a/device/vibration/android/java/src/org/chromium/device/vibration/VibrationProvider.java b/device/vibration/android/java/src/org/chromium/device/vibration/VibrationProvider.java deleted file mode 100644 index 0f12d7c..0000000 --- a/device/vibration/android/java/src/org/chromium/device/vibration/VibrationProvider.java +++ /dev/null @@ -1,54 +0,0 @@ -// 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. - -package org.chromium.device.vibration; - -import android.content.Context; -import android.content.pm.PackageManager; -import android.media.AudioManager; -import android.os.Vibrator; -import android.util.Log; - -import org.chromium.base.annotations.CalledByNative; -import org.chromium.base.annotations.JNINamespace; - -/** - * This is the implementation of the C++ counterpart VibrationProvider. - */ -@JNINamespace("device") -class VibrationProvider { - private static final String TAG = "VibrationProvider"; - - private final AudioManager mAudioManager; - private final Vibrator mVibrator; - private final boolean mHasVibratePermission; - - @CalledByNative - private static VibrationProvider create(Context context) { - return new VibrationProvider(context); - } - - @CalledByNative - private void vibrate(long milliseconds) { - if (mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_SILENT - && mHasVibratePermission) { - mVibrator.vibrate(milliseconds); - } - } - - @CalledByNative - private void cancelVibration() { - if (mHasVibratePermission) mVibrator.cancel(); - } - - private VibrationProvider(Context context) { - mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); - mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); - mHasVibratePermission = context.checkCallingOrSelfPermission( - android.Manifest.permission.VIBRATE) == PackageManager.PERMISSION_GRANTED; - if (!mHasVibratePermission) { - Log.w(TAG, "Failed to use vibrate API, requires VIBRATE permission."); - } - } -} diff --git a/device/vibration/android/vibration_jni_registrar.cc b/device/vibration/android/vibration_jni_registrar.cc deleted file mode 100644 index 39003bf..0000000 --- a/device/vibration/android/vibration_jni_registrar.cc +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2014 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 "device/vibration/android/vibration_jni_registrar.h" - -#include "base/android/jni_android.h" -#include "base/android/jni_registrar.h" -#include "device/vibration/vibration_manager_impl_android.h" - -namespace device { -namespace android { -namespace { - -const base::android::RegistrationMethod kRegisteredMethods[] = { - { "VibrationProvider", device::VibrationManagerImplAndroid::Register }, -}; - -} // namespace - -bool RegisterVibrationJni(JNIEnv* env) { - return RegisterNativeMethods( - env, kRegisteredMethods, arraysize(kRegisteredMethods)); -} - -} // namespace android -} // namespace device diff --git a/device/vibration/android/vibration_jni_registrar.h b/device/vibration/android/vibration_jni_registrar.h deleted file mode 100644 index f4f08d2..0000000 --- a/device/vibration/android/vibration_jni_registrar.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2014 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. - -#ifndef DEVICE_VIBRATION_ANDROID_VIBRATION_JNI_REGISTRAR_H_ -#define DEVICE_VIBRATION_ANDROID_VIBRATION_JNI_REGISTRAR_H_ - -#include <jni.h> - -#include "device/vibration/vibration_export.h" - -namespace device { -namespace android { - -DEVICE_VIBRATION_EXPORT bool RegisterVibrationJni(JNIEnv* env); - -} // namespace android -} // namespace device - -#endif // DEVICE_VIBRATION_ANDROID_VIBRATION_JNI_REGISTRAR_H_ diff --git a/device/vibration/vibration.gyp b/device/vibration/vibration.gyp index be4068c..99d75ba 100644 --- a/device/vibration/vibration.gyp +++ b/device/vibration/vibration.gyp @@ -8,7 +8,7 @@ }, 'targets': [ { - # GN version: //device/vibration:vibration_mojo + # GN version: //device/vibration:mojo_bindings 'target_name': 'device_vibration_mojo_bindings', 'type': 'static_library', 'includes': [ @@ -34,18 +34,13 @@ 'DEVICE_VIBRATION_IMPLEMENTATION', ], 'sources': [ - 'android/vibration_jni_registrar.cc', - 'android/vibration_jni_registrar.h', 'vibration_manager_impl.h', - 'vibration_manager_impl_android.cc', - 'vibration_manager_impl_android.h', 'vibration_manager_impl_default.cc', ], 'conditions': [ ['OS == "android"', { 'dependencies': [ 'device_vibration_java', - 'device_vibration_jni_headers', ], 'sources!': [ 'vibration_manager_impl_default.cc', @@ -58,21 +53,12 @@ ['OS == "android"', { 'targets': [ { - 'target_name': 'device_vibration_jni_headers', - 'type': 'none', - 'sources': [ - 'android/java/src/org/chromium/device/vibration/VibrationProvider.java', - ], - 'variables': { - 'jni_gen_package': 'device_vibration', - }, - 'includes': [ '../../build/jni_generator.gypi' ], - }, - { 'target_name': 'device_vibration_java', 'type': 'none', 'dependencies': [ '../../base/base.gyp:base', + '../../third_party/mojo/mojo_public.gyp:mojo_bindings_java', + 'device_vibration_mojo_bindings', ], 'variables': { 'java_in_dir': '../../device/vibration/android/java', diff --git a/device/vibration/vibration_manager_impl_android.cc b/device/vibration/vibration_manager_impl_android.cc deleted file mode 100644 index 6171feb..0000000 --- a/device/vibration/vibration_manager_impl_android.cc +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2014 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 "device/vibration/vibration_manager_impl_android.h" - -#include "device/vibration/vibration_manager_impl.h" -#include "jni/VibrationProvider_jni.h" - -using base::android::AttachCurrentThread; - -namespace device { - -namespace { -const int64 kMinimumVibrationDurationMs = 1; // 1 millisecond -const int64 kMaximumVibrationDurationMs = 10000; // 10 seconds -} - -VibrationManagerImplAndroid::VibrationManagerImplAndroid( - mojo::InterfaceRequest<VibrationManager> request) - : binding_(this, request.Pass()) { - j_vibration_provider_.Reset( - Java_VibrationProvider_create(AttachCurrentThread(), - base::android::GetApplicationContext())); -} - -VibrationManagerImplAndroid::~VibrationManagerImplAndroid() { -} - -// static -bool VibrationManagerImplAndroid::Register(JNIEnv* env) { - return RegisterNativesImpl(env); -} - -void VibrationManagerImplAndroid::Vibrate(int64 milliseconds) { - // Though the Blink implementation already sanitizes vibration times, don't - // trust any values passed from the client. - int64 sanitized_milliseconds = std::max(kMinimumVibrationDurationMs, - std::min(milliseconds, kMaximumVibrationDurationMs)); - - Java_VibrationProvider_vibrate(AttachCurrentThread(), - j_vibration_provider_.obj(), - sanitized_milliseconds); -} - -void VibrationManagerImplAndroid::Cancel() { - Java_VibrationProvider_cancelVibration(AttachCurrentThread(), - j_vibration_provider_.obj()); -} - -// static -void VibrationManagerImpl::Create( - mojo::InterfaceRequest<VibrationManager> request) { - new VibrationManagerImplAndroid(request.Pass()); -} - -} // namespace device diff --git a/device/vibration/vibration_manager_impl_android.h b/device/vibration/vibration_manager_impl_android.h deleted file mode 100644 index 413311c..0000000 --- a/device/vibration/vibration_manager_impl_android.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2014 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. - -#ifndef DEVICE_VIBRATION_VIBRATION_MANAGER_IMPL_ANDROID_H_ -#define DEVICE_VIBRATION_VIBRATION_MANAGER_IMPL_ANDROID_H_ - -#include "base/android/jni_android.h" -#include "device/vibration/vibration_manager.mojom.h" -#include "third_party/mojo/src/mojo/public/cpp/bindings/strong_binding.h" - -namespace device { - -// TODO(timvolodine): consider implementing the VibrationManager mojo service -// directly in java, crbug.com/439434. -class VibrationManagerImplAndroid : public VibrationManager { - public: - static bool Register(JNIEnv* env); - - void Vibrate(int64 milliseconds) override; - void Cancel() override; - - private: - friend class VibrationManagerImpl; - - explicit VibrationManagerImplAndroid( - mojo::InterfaceRequest<VibrationManager> request); - ~VibrationManagerImplAndroid() override; - - // The binding between this object and the other end of the pipe. - mojo::StrongBinding<VibrationManager> binding_; - - base::android::ScopedJavaGlobalRef<jobject> j_vibration_provider_; -}; - -} // namespace device - -#endif // DEVICE_VIBRATION_VIBRATION_MANAGER_IMPL_ANDROID_H_ |