Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: tools/viewer/sk_app/android/surface_glue_android.cpp

Issue 2004633002: Add drawer with state information (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Format_old Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "surface_glue_android.h" 8 #include "surface_glue_android.h"
9 9
10 #include <jni.h> 10 #include <jni.h>
11 #include <pthread.h> 11 #include <pthread.h>
12 #include <stdio.h> 12 #include <stdio.h>
13 #include <unistd.h> 13 #include <unistd.h>
14 #include <unordered_map> 14 #include <unordered_map>
15 15
16 #include <android/input.h> 16 #include <android/input.h>
17 #include <android/keycodes.h> 17 #include <android/keycodes.h>
18 #include <android/looper.h> 18 #include <android/looper.h>
19 #include <android/native_window_jni.h> 19 #include <android/native_window_jni.h>
20 20
21 #include "../Application.h" 21 #include "../Application.h"
22 #include "SkTypes.h" 22 #include "SkTypes.h"
23 #include "SkUtils.h" 23 #include "SkUtils.h"
24 #include "SkString.h"
24 #include "Window_android.h" 25 #include "Window_android.h"
25 26
26 namespace sk_app { 27 namespace sk_app {
27 28
28 static const int LOOPER_ID_MESSAGEPIPE = 1; 29 static const int LOOPER_ID_MESSAGEPIPE = 1;
29 30
30 static const std::unordered_map<int, Window::Key> ANDROID_TO_WINDOW_KEYMAP({ 31 static const std::unordered_map<int, Window::Key> ANDROID_TO_WINDOW_KEYMAP({
31 {AKEYCODE_SOFT_LEFT, Window::Key::kLeft}, 32 {AKEYCODE_SOFT_LEFT, Window::Key::kLeft},
32 {AKEYCODE_SOFT_RIGHT, Window::Key::kRight} 33 {AKEYCODE_SOFT_RIGHT, Window::Key::kRight}
33 }); 34 });
34 35
35 static const std::unordered_map<int, Window::InputState> ANDROID_TO_WINDOW_STATE MAP({ 36 static const std::unordered_map<int, Window::InputState> ANDROID_TO_WINDOW_STATE MAP({
36 {AMOTION_EVENT_ACTION_DOWN, Window::kDown_InputState}, 37 {AMOTION_EVENT_ACTION_DOWN, Window::kDown_InputState},
37 {AMOTION_EVENT_ACTION_POINTER_DOWN, Window::kDown_InputState}, 38 {AMOTION_EVENT_ACTION_POINTER_DOWN, Window::kDown_InputState},
38 {AMOTION_EVENT_ACTION_UP, Window::kUp_InputState}, 39 {AMOTION_EVENT_ACTION_UP, Window::kUp_InputState},
39 {AMOTION_EVENT_ACTION_POINTER_UP, Window::kUp_InputState}, 40 {AMOTION_EVENT_ACTION_POINTER_UP, Window::kUp_InputState},
40 {AMOTION_EVENT_ACTION_MOVE, Window::kMove_InputState}, 41 {AMOTION_EVENT_ACTION_MOVE, Window::kMove_InputState},
41 {AMOTION_EVENT_ACTION_CANCEL, Window::kUp_InputState}, 42 {AMOTION_EVENT_ACTION_CANCEL, Window::kUp_InputState},
42 }); 43 });
43 44
44 SkiaAndroidApp::SkiaAndroidApp(JNIEnv* env, jobject androidApp) { 45 SkiaAndroidApp::SkiaAndroidApp(JNIEnv* env, jobject androidApp) {
45 env->GetJavaVM(&fJavaVM); 46 env->GetJavaVM(&fJavaVM);
46 fAndroidApp = env->NewGlobalRef(androidApp); 47 fAndroidApp = env->NewGlobalRef(androidApp);
47 jclass cls = env->GetObjectClass(fAndroidApp); 48 jclass cls = env->GetObjectClass(fAndroidApp);
48 fSetTitleMethodID = env->GetMethodID(cls, "setTitle", "(Ljava/lang/String;)V "); 49 fSetTitleMethodID = env->GetMethodID(cls, "setTitle", "(Ljava/lang/String;)V ");
50 fUpdateStateMethodID = env->GetMethodID(cls, "updateState", "(Ljava/lang/Str ing;)V");
49 fNativeWindow = nullptr; 51 fNativeWindow = nullptr;
50 pthread_create(&fThread, nullptr, pthread_main, this); 52 pthread_create(&fThread, nullptr, pthread_main, this);
51 } 53 }
52 54
53 SkiaAndroidApp::~SkiaAndroidApp() { 55 SkiaAndroidApp::~SkiaAndroidApp() {
54 fPThreadEnv->DeleteGlobalRef(fAndroidApp); 56 fPThreadEnv->DeleteGlobalRef(fAndroidApp);
55 if (fWindow) { 57 if (fWindow) {
56 fWindow->detach(); 58 fWindow->detach();
57 } 59 }
58 if (fNativeWindow) { 60 if (fNativeWindow) {
59 ANativeWindow_release(fNativeWindow); 61 ANativeWindow_release(fNativeWindow);
60 fNativeWindow = nullptr; 62 fNativeWindow = nullptr;
61 } 63 }
62 if (fApp) { 64 if (fApp) {
63 delete fApp; 65 delete fApp;
64 } 66 }
65 } 67 }
66 68
67 void SkiaAndroidApp::setTitle(const char* title) const { 69 void SkiaAndroidApp::setTitle(const char* title) const {
68 jstring titleString = fPThreadEnv->NewStringUTF(title); 70 jstring titleString = fPThreadEnv->NewStringUTF(title);
69 fPThreadEnv->CallVoidMethod(fAndroidApp, fSetTitleMethodID, titleString); 71 fPThreadEnv->CallVoidMethod(fAndroidApp, fSetTitleMethodID, titleString);
70 fPThreadEnv->DeleteLocalRef(titleString); 72 fPThreadEnv->DeleteLocalRef(titleString);
71 } 73 }
72 74
75 void SkiaAndroidApp::updateState(const char* stateJsonStr) const {
76 jstring jstr = fPThreadEnv->NewStringUTF(stateJsonStr);
77 fPThreadEnv->CallVoidMethod(fAndroidApp, fUpdateStateMethodID, jstr);
78 fPThreadEnv->DeleteLocalRef(jstr);
79 }
80
73 void SkiaAndroidApp::postMessage(const Message& message) const { 81 void SkiaAndroidApp::postMessage(const Message& message) const {
74 SkDEBUGCODE(auto writeSize =) write(fPipes[1], &message, sizeof(message)); 82 SkDEBUGCODE(auto writeSize =) write(fPipes[1], &message, sizeof(message));
75 SkASSERT(writeSize == sizeof(message)); 83 SkASSERT(writeSize == sizeof(message));
76 } 84 }
77 85
78 void SkiaAndroidApp::readMessage(Message* message) const { 86 void SkiaAndroidApp::readMessage(Message* message) const {
79 SkDEBUGCODE(auto readSize =) read(fPipes[0], message, sizeof(Message)); 87 SkDEBUGCODE(auto readSize =) read(fPipes[0], message, sizeof(Message));
80 SkASSERT(readSize == sizeof(Message)); 88 SkASSERT(readSize == sizeof(Message));
81 } 89 }
82 90
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 skiaAndroidApp->fWindow->onKey(it->second, Window::kUp_InputState, 0 ); 140 skiaAndroidApp->fWindow->onKey(it->second, Window::kUp_InputState, 0 );
133 break; 141 break;
134 } 142 }
135 case kTouched: { 143 case kTouched: {
136 auto it = ANDROID_TO_WINDOW_STATEMAP.find(message.fTouchState); 144 auto it = ANDROID_TO_WINDOW_STATEMAP.find(message.fTouchState);
137 SkASSERT(it != ANDROID_TO_WINDOW_STATEMAP.end()); 145 SkASSERT(it != ANDROID_TO_WINDOW_STATEMAP.end());
138 skiaAndroidApp->fWindow->onTouch(message.fTouchOwner, it->second, me ssage.fTouchX, 146 skiaAndroidApp->fWindow->onTouch(message.fTouchOwner, it->second, me ssage.fTouchX,
139 message.fTouchY); 147 message.fTouchY);
140 break; 148 break;
141 } 149 }
150 case kSetState: {
151 skiaAndroidApp->fWindow->onSet(*message.stateName, *message.stateVal ue);
152 delete message.stateName;
153 delete message.stateValue;
154 break;
155 }
142 default: { 156 default: {
143 // do nothing 157 // do nothing
144 } 158 }
145 } 159 }
146 160
147 return 1; // continue receiving callbacks 161 return 1; // continue receiving callbacks
148 } 162 }
149 163
150 void* SkiaAndroidApp::pthread_main(void* arg) { 164 void* SkiaAndroidApp::pthread_main(void* arg) {
151 SkDebugf("pthread_main begins"); 165 SkDebugf("pthread_main begins");
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 JNIEnv* env, jobject activity, jlong handle, jint owner, jfloat x, jfloat y, jint state) { 236 JNIEnv* env, jobject activity, jlong handle, jint owner, jfloat x, jfloat y, jint state) {
223 auto skiaAndroidApp = (SkiaAndroidApp*)handle; 237 auto skiaAndroidApp = (SkiaAndroidApp*)handle;
224 Message message(kTouched); 238 Message message(kTouched);
225 message.fTouchOwner = owner; 239 message.fTouchOwner = owner;
226 message.fTouchState = state; 240 message.fTouchState = state;
227 message.fTouchX = x; 241 message.fTouchX = x;
228 message.fTouchY = y; 242 message.fTouchY = y;
229 skiaAndroidApp->postMessage(message); 243 skiaAndroidApp->postMessage(message);
230 } 244 }
231 245
246 extern "C" JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerActivity_setState(
247 JNIEnv* env, jobject activity, jlong handle, jstring stateName, jstring stat eValue) {
248 auto skiaAndroidApp = (SkiaAndroidApp*)handle;
249 Message message(kSetState);
250 const char* nameChars = env->GetStringUTFChars(stateName, nullptr);
251 const char* valueChars = env->GetStringUTFChars(stateValue, nullptr);
252 message.stateName = new SkString(nameChars);
djsollen 2016/05/24 17:32:40 stateName.reset(nameChars);
liyuqian 2016/05/24 20:18:05 We'll preserve the pointers because of the message
253 message.stateValue = new SkString(valueChars);
254 skiaAndroidApp->postMessage(message);
255 env->ReleaseStringUTFChars(stateName, nameChars);
256 env->ReleaseStringUTFChars(stateValue, valueChars);
257 }
258
232 } // namespace sk_app 259 } // namespace sk_app
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698