Home | History | Annotate | Download | only in android
      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 "SkString.h"
     16 
     17 #include "../Application.h"
     18 #include "../Window.h"
     19 
     20 namespace sk_app {
     21 
     22 enum MessageType {
     23     kUndefined,
     24     kSurfaceCreated,
     25     kSurfaceChanged,
     26     kSurfaceDestroyed,
     27     kDestroyApp,
     28     kContentInvalidated,
     29     kKeyPressed,
     30     kTouched,
     31     kUIStateChanged,
     32 };
     33 
     34 struct 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 
     48 struct 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 
     62 private:
     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