/* * Copyright 2010, The Android Open Source Project * * 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. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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. */ #include "config.h" #include "DeviceOrientationClientImpl.h" #include "WebViewCore.h" #include #include #include namespace android { using JSC::Bindings::getJNIEnv; enum javaDeviceOrientationServiceClassMethods { DeviceOrientationServiceMethodStart = 0, DeviceOrientationServiceMethodStop, DeviceOrientationServiceMethodSuspend, DeviceOrientationServiceMethodResume, DeviceOrientationServiceMethodCount }; static jmethodID javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodCount]; DeviceOrientationClientImpl::DeviceOrientationClientImpl(WebViewCore* webViewCore) : m_webViewCore(webViewCore) , m_javaDeviceOrientationServiceObject(0) { ASSERT(m_webViewCore); } DeviceOrientationClientImpl::~DeviceOrientationClientImpl() { releaseJavaInstance(); } jobject DeviceOrientationClientImpl::getJavaInstance() { // Lazily get the Java object. We can't do this until the WebViewCore is all // set up. if (m_javaDeviceOrientationServiceObject) return m_javaDeviceOrientationServiceObject; JNIEnv* env = getJNIEnv(); ASSERT(m_webViewCore); jobject object = m_webViewCore->getDeviceOrientationService(); if (!object) return 0; // Get the Java DeviceOrientationService class. jclass javaDeviceOrientationServiceClass = env->GetObjectClass(object); ASSERT(javaDeviceOrientationServiceClass); // Set up the methods we wish to call on the Java DeviceOrientationService // class. javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodStart] = env->GetMethodID(javaDeviceOrientationServiceClass, "start", "()V"); javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodStop] = env->GetMethodID(javaDeviceOrientationServiceClass, "stop", "()V"); javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodSuspend] = env->GetMethodID(javaDeviceOrientationServiceClass, "suspend", "()V"); javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodResume] = env->GetMethodID(javaDeviceOrientationServiceClass, "resume", "()V"); env->DeleteLocalRef(javaDeviceOrientationServiceClass); m_javaDeviceOrientationServiceObject = getJNIEnv()->NewGlobalRef(object); getJNIEnv()->DeleteLocalRef(object); ASSERT(m_javaDeviceOrientationServiceObject); return m_javaDeviceOrientationServiceObject; } void DeviceOrientationClientImpl::releaseJavaInstance() { if (m_javaDeviceOrientationServiceObject) getJNIEnv()->DeleteGlobalRef(m_javaDeviceOrientationServiceObject); } void DeviceOrientationClientImpl::startUpdating() { jobject javaInstance = getJavaInstance(); if (!javaInstance) return; getJNIEnv()->CallVoidMethod(javaInstance, javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodStart]); } void DeviceOrientationClientImpl::stopUpdating() { jobject javaInstance = getJavaInstance(); if (!javaInstance) return; getJNIEnv()->CallVoidMethod(javaInstance, javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodStop]); } void DeviceOrientationClientImpl::onOrientationChange(PassRefPtr orientation) { m_lastOrientation = orientation; m_controller->didChangeDeviceOrientation(m_lastOrientation.get()); } void DeviceOrientationClientImpl::suspend() { jobject javaInstance = getJavaInstance(); if (!javaInstance) return; getJNIEnv()->CallVoidMethod(javaInstance, javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodSuspend]); } void DeviceOrientationClientImpl::resume() { jobject javaInstance = getJavaInstance(); if (!javaInstance) return; getJNIEnv()->CallVoidMethod(javaInstance, javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodResume]); } } // namespace android