1/*
2* Copyright 2016 Google Inc.
3*
4* Use of this source code is governed by a BSD-style license that can be
5* found in the LICENSE file.
6*/
7
8#ifndef surface_glue_android_DEFINED
9#define surface_glue_android_DEFINED
10
11#include <pthread.h>
12
13#include <android/native_window_jni.h>
14
15#include "include/core/SkString.h"
16
17#include "tools/sk_app/Application.h"
18#include "tools/sk_app/Window.h"
19
20namespace sk_app {
21
22enum MessageType {
23    kUndefined,
24    kSurfaceCreated,
25    kSurfaceChanged,
26    kSurfaceDestroyed,
27    kDestroyApp,
28    kContentInvalidated,
29    kKeyPressed,
30    kTouched,
31    kUIStateChanged,
32};
33
34struct Message {
35    MessageType fType = kUndefined;
36    ANativeWindow* fNativeWindow = nullptr;
37    int fKeycode = 0;
38    int fTouchOwner, fTouchState;
39    float fTouchX, fTouchY;
40
41    SkString* stateName;
42    SkString* stateValue;
43
44    Message() {}
45    Message(MessageType t) : fType(t) {}
46};
47
48struct SkiaAndroidApp {
49    Application* fApp;
50    Window* fWindow;
51    jobject fAndroidApp;
52
53    SkiaAndroidApp(JNIEnv* env, jobject androidApp);
54
55    void postMessage(const Message& message) const;
56    void readMessage(Message* message) const;
57
58    // These must be called in SkiaAndroidApp's own pthread because the JNIEnv is thread sensitive
59    void setTitle(const char* title) const;
60    void setUIState(const char* state) const;
61
62private:
63    pthread_t fThread;
64    ANativeWindow* fNativeWindow;
65    int fPipes[2];  // 0 is the read message pipe, 1 is the write message pipe
66    JavaVM* fJavaVM;
67    JNIEnv* fPThreadEnv;
68    jmethodID fSetTitleMethodID, fSetStateMethodID;
69
70    // This must be called in SkiaAndroidApp's own pthread because the JNIEnv is thread sensitive
71    ~SkiaAndroidApp();
72
73    static int message_callback(int fd, int events, void* data);
74    static void* pthread_main(void*);
75};
76
77}  // namespace sk_app
78
79#endif
80