• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2010, The Android Open Source Project
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *  * Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  *  * Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #include "config.h"
27 #include "DeviceOrientationClientImpl.h"
28 
29 #include "WebViewCore.h"
30 #include <DeviceOrientationController.h>
31 #include <Frame.h>
32 #include <JNIHelp.h>
33 
34 namespace android {
35 
36 using JSC::Bindings::getJNIEnv;
37 
38 enum javaDeviceOrientationServiceClassMethods {
39     DeviceOrientationServiceMethodStart = 0,
40     DeviceOrientationServiceMethodStop,
41     DeviceOrientationServiceMethodSuspend,
42     DeviceOrientationServiceMethodResume,
43     DeviceOrientationServiceMethodCount
44 };
45 static jmethodID javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodCount];
46 
DeviceOrientationClientImpl(WebViewCore * webViewCore)47 DeviceOrientationClientImpl::DeviceOrientationClientImpl(WebViewCore* webViewCore)
48     : m_webViewCore(webViewCore)
49     , m_javaDeviceOrientationServiceObject(0)
50 {
51     ASSERT(m_webViewCore);
52 }
53 
~DeviceOrientationClientImpl()54 DeviceOrientationClientImpl::~DeviceOrientationClientImpl()
55 {
56     releaseJavaInstance();
57 }
58 
getJavaInstance()59 jobject DeviceOrientationClientImpl::getJavaInstance()
60 {
61     // Lazily get the Java object. We can't do this until the WebViewCore is all
62     // set up.
63     if (m_javaDeviceOrientationServiceObject)
64         return m_javaDeviceOrientationServiceObject;
65 
66     JNIEnv* env = getJNIEnv();
67 
68     ASSERT(m_webViewCore);
69     jobject object = m_webViewCore->getDeviceOrientationService();
70     if (!object)
71         return 0;
72 
73     // Get the Java DeviceOrientationService class.
74     jclass javaDeviceOrientationServiceClass = env->GetObjectClass(object);
75     ASSERT(javaDeviceOrientationServiceClass);
76 
77     // Set up the methods we wish to call on the Java DeviceOrientationService
78     // class.
79     javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodStart] =
80         env->GetMethodID(javaDeviceOrientationServiceClass, "start", "()V");
81     javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodStop] =
82         env->GetMethodID(javaDeviceOrientationServiceClass, "stop", "()V");
83     javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodSuspend] =
84         env->GetMethodID(javaDeviceOrientationServiceClass, "suspend", "()V");
85     javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodResume] =
86         env->GetMethodID(javaDeviceOrientationServiceClass, "resume", "()V");
87     env->DeleteLocalRef(javaDeviceOrientationServiceClass);
88 
89     m_javaDeviceOrientationServiceObject = getJNIEnv()->NewGlobalRef(object);
90     getJNIEnv()->DeleteLocalRef(object);
91 
92     ASSERT(m_javaDeviceOrientationServiceObject);
93     return m_javaDeviceOrientationServiceObject;
94 }
95 
releaseJavaInstance()96 void DeviceOrientationClientImpl::releaseJavaInstance()
97 {
98     if (m_javaDeviceOrientationServiceObject)
99         getJNIEnv()->DeleteGlobalRef(m_javaDeviceOrientationServiceObject);
100 }
101 
startUpdating()102 void DeviceOrientationClientImpl::startUpdating()
103 {
104     jobject javaInstance = getJavaInstance();
105     if (!javaInstance)
106         return;
107     getJNIEnv()->CallVoidMethod(javaInstance, javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodStart]);
108 }
109 
stopUpdating()110 void DeviceOrientationClientImpl::stopUpdating()
111 {
112     jobject javaInstance = getJavaInstance();
113     if (!javaInstance)
114         return;
115     getJNIEnv()->CallVoidMethod(javaInstance, javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodStop]);
116 }
117 
onOrientationChange(PassRefPtr<DeviceOrientation> orientation)118 void DeviceOrientationClientImpl::onOrientationChange(PassRefPtr<DeviceOrientation> orientation)
119 {
120     m_lastOrientation = orientation;
121     m_controller->didChangeDeviceOrientation(m_lastOrientation.get());
122 }
123 
suspend()124 void DeviceOrientationClientImpl::suspend()
125 {
126     jobject javaInstance = getJavaInstance();
127     if (!javaInstance)
128         return;
129     getJNIEnv()->CallVoidMethod(javaInstance, javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodSuspend]);
130 }
131 
resume()132 void DeviceOrientationClientImpl::resume()
133 {
134     jobject javaInstance = getJavaInstance();
135     if (!javaInstance)
136         return;
137     getJNIEnv()->CallVoidMethod(javaInstance, javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodResume]);
138 }
139 
140 } // namespace android
141