Merge: SharedPreferences: Nit API wrapping android SharedPreferences class
[nit.git] / lib / mnit_android / android_app.nit
index c7d4792..3819c25 100644 (file)
@@ -49,31 +49,13 @@ in "C" `{
        extern int32_t mnit_height;
        extern float mnit_zoom;
 
-       int mnit_orientation_changed;
+       //int mnit_orientation_changed;
        float mnit_zoom;
-       int mnit_animating = 0;
-
-       /* This is confusing; the type come from android_native_app_glue.h
-          and so identifies the java part of the app */
-       struct android_app *mnit_java_app;
-
-       /* This is the pure Nit App */
-       App nit_app;
-
-       /* The main of the Nit application, compiled somewhere else */
-       extern int main(int, char**);
-
-       /* Wraps App_full_frame() and check for orientation. */
-       void mnit_frame();
-
-       void mnit_term_display()
-       {
-               // At this point we have nothing to do
-       }
 
        /* Handle inputs from the Android platform and sort them before
           sending them in the Nit App */
        static int32_t mnit_handle_input(struct android_app* app, AInputEvent* event) {
+               App nit_app = app->userData;
                LOGI("handle input %i", (int)pthread_self());
                if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_KEY) {
                        LOGI("key");
@@ -83,164 +65,15 @@ in "C" `{
                        LOGI("motion");
                        return App_extern_input_motion(nit_app, event);
                }
-               
-               return 0;
-       }
-
-       static void mnit_handle_cmd(struct android_app* app, int32_t cmd) {
-
-               mnit_java_app = app;
-                       AConfiguration_setOrientation(mnit_java_app->config, ACONFIGURATION_ORIENTATION_LAND);
-                               LOGI("cmd %i", (int)pthread_self());
-               
-               switch (cmd) {
-                       case APP_CMD_SAVE_STATE:
-                               LOGI ("save state");
-                               mnit_java_app->savedStateSize = 1;
-                               mnit_java_app->savedState = malloc(1);
-                               App_save(nit_app);
-                               break;
-                               
-                       case APP_CMD_INIT_WINDOW:
-                               LOGI ("init window");
-                               if (mnit_java_app->window != NULL) {
-                                       LOGI("init window in");
-                                       App_init_window(nit_app);
-                                       mnit_frame();
-                                       mnit_animating = 1;
-                               }
-                               break;
-                               
-                       case APP_CMD_TERM_WINDOW:
-                               LOGI ("term window");
-                               mnit_term_display();
-                               App_term_window(nit_app);
-                               break;
-                               
-                       case APP_CMD_GAINED_FOCUS:
-                               LOGI ("gain foc");
-                               mnit_animating = 1;
-                               App_gained_focus(nit_app);
-                               LOGI ("gain foc 1");
-                               break;
-                               
-                       case APP_CMD_LOST_FOCUS:
-                               LOGI ("lost foc");
-                               mnit_animating = 0;
-                               App_lost_focus(nit_app);
-                               mnit_frame();
-                               break;
-                               
-                       case APP_CMD_PAUSE:
-                               LOGI ("app pause");
-                               App_pause(nit_app);
-                               break;
-                               
-                               /*
-                       case APP_CMD_STOP:
-                               LOGI ("app stop");
-                               App_stop(nit_app);
-                               break;
-                               
-                       case APP_CMD_DESTROY:
-                               LOGI ("app destrop");
-                               App_destroy(nit_app);
-                               break;
-                               
-                       case APP_CMD_START:
-                               LOGI ("app start");
-                               App_start(nit_app);
-                               break;
-                               */
-
-                       case APP_CMD_RESUME:
-                               LOGI ("app resume");
-                               App_resume(nit_app);
-                               break;
-                               
-                       case APP_CMD_LOW_MEMORY:
-                               LOGI ("app low mem");
-                               break;
-                               
-                       case APP_CMD_CONFIG_CHANGED:
-                               LOGI ("app cmd conf ch");
-                               break;
-                               
-                       case APP_CMD_INPUT_CHANGED:
-                               LOGI ("app cmd in ch");
-                               break;
-                               
-                       case APP_CMD_WINDOW_RESIZED:
-                               mnit_orientation_changed = 1;
-                               LOGI ("app win res");
-                               break;
-                               
-                       case APP_CMD_WINDOW_REDRAW_NEEDED:
-                               LOGI ("app win redraw needed");
-                               break;
-                               
-                       case APP_CMD_CONTENT_RECT_CHANGED:
-                               LOGI ("app content rect ch");
-                               break;
-               }
-       }
-
-       void android_main(struct android_app* app)
-       {
-               mnit_java_app = app;
-
-               app_dummy();
-               
-               main(0, NULL);
-       }
-
-       void mnit_frame()
-       {
-               if (mnit_display == EGL_NO_DISPLAY) {
-                       LOGI("no frame");
-                       return;
-               }
-
-               if (mnit_orientation_changed)
-               {
-                       mnit_orientation_changed = 0;
-
-                       if (mnit_surface != EGL_NO_SURFACE) {
-                               eglDestroySurface(mnit_display,  mnit_surface);
-                       }
-                       EGLSurface surface = eglCreateWindowSurface(mnit_display, mnit_config, mnit_java_app->window, NULL);
-
-                       if (eglMakeCurrent(mnit_display, surface, surface, mnit_context) == EGL_FALSE) {
-                               LOGW("Unable to eglMakeCurrent");
-                       }
-
-                       eglQuerySurface(mnit_display, surface, EGL_WIDTH, &mnit_width);
-                       eglQuerySurface(mnit_display, surface, EGL_HEIGHT, &mnit_height);
-
-                       mnit_surface = surface;
-
-                       glViewport(0, 0, mnit_width, mnit_height);
-                       glMatrixMode(GL_PROJECTION);
-                       glLoadIdentity();
-                       glOrthof(0.0f, mnit_width, mnit_height, 0.0f, 0.0f, 1.0f);
-                       glMatrixMode(GL_MODELVIEW);
-               }
-
-               LOGI("frame");
-
-               glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
-               glClear(GL_COLOR_BUFFER_BIT); // | GL_DEPTH_BUFFER_BIT);
 
-               App_full_frame(nit_app);
-
-               LOGI("frame b");
+               return 0;
        }
 `}
 
 
-extern InnerAndroidMotionEvent in "C" `{AInputEvent *`}
+extern class InnerAndroidMotionEvent in "C" `{AInputEvent *`}
        super Pointer
-       private fun pointers_count: Int is extern `{ 
+       private fun pointers_count: Int is extern `{
        return AMotionEvent_getPointerCount(recv);
        `}
        private fun just_went_down: Bool is extern `{
@@ -271,16 +104,16 @@ extern class AMotionEventAction `{ int32_t `}
 end
 
 interface AndroidInputEvent
-       super InputEvent 
+       super InputEvent
 end
 
 class AndroidMotionEvent
        super AndroidInputEvent
        super MotionEvent
-       
+
        private init(ie: InnerAndroidMotionEvent) do inner_event = ie
        private var inner_event: InnerAndroidMotionEvent
-       
+
        private var pointers_cache: nullable Array[AndroidPointerEvent] = null
        fun pointers: Array[AndroidPointerEvent]
        do
@@ -318,17 +151,17 @@ class AndroidPointerEvent
 
        protected var motion_event: AndroidMotionEvent
        protected var pointer_id: Int
-       
+
        redef fun x: Float do return extern_x(motion_event.inner_event, pointer_id)
        private fun extern_x(motion_event: InnerAndroidMotionEvent, pointer_id: Int): Float is extern `{
                return ((int) AMotionEvent_getX(motion_event, pointer_id) * mnit_zoom);
        `}
-       
+
        redef fun y: Float do return extern_y(motion_event.inner_event, pointer_id)
        private fun extern_y(motion_event: InnerAndroidMotionEvent, pointer_id: Int): Float is extern `{
-               return ((int) AMotionEvent_getY(motion_event, pointer_id) * mnit_zoom) + 32;
+               return ((int) AMotionEvent_getY(motion_event, pointer_id) * mnit_zoom);
        `}
-       
+
        fun pressure: Float do return extern_pressure(motion_event.inner_event, pointer_id)
        private fun extern_pressure(motion_event: InnerAndroidMotionEvent, pointer_id: Int): Float is extern `{
                return AMotionEvent_getPressure(motion_event, pointer_id);
@@ -343,7 +176,7 @@ class AndroidPointerEvent
        redef fun depressed do return not pressed
 end
 
-extern AndroidKeyEvent in "C" `{AInputEvent *`}
+extern class AndroidKeyEvent in "C" `{AInputEvent *`}
        super KeyEvent
        super AndroidInputEvent
 
@@ -356,7 +189,7 @@ extern AndroidKeyEvent in "C" `{AInputEvent *`}
        fun key_code: Int is extern `{
                return AKeyEvent_getKeyCode(recv);
        `}
-       
+
        fun key_char: Char is extern `{
                int code = AKeyEvent_getKeyCode(recv);
                if (code >= AKEYCODE_0 && code <= AKEYCODE_9)
@@ -366,37 +199,30 @@ extern AndroidKeyEvent in "C" `{AInputEvent *`}
                return 0;
        `}
 
-       fun is_back_key: Bool do return key_code == 2
+       fun is_back_key: Bool do return key_code == 4
        fun is_menu_key: Bool do return key_code == 82
        fun is_search_key: Bool do return key_code == 84
 end
 
-redef class Object
-       # Uses Android logs for every print
-       redef fun print(text: Object) is extern import Object.to_s, String.to_cstring `{
-               __android_log_print(ANDROID_LOG_INFO, "mnit print", "%s", String_to_cstring(Object_to_s(text)));
-       `}
-end
-
 redef class App
        redef type IE: AndroidInputEvent
        redef type D: Opengles1Display
 
-       redef fun log_warning(msg) is extern import String.to_cstring `{
-               LOGW("%s", String_to_cstring(msg));
-       `}
-       redef fun log_info(msg) is extern import String.to_cstring `{
-               LOGI("%s", String_to_cstring(msg));
-       `}
-
        redef fun init_window
        do
-               super
-
+               set_as_input_handler native_app_glue
                display = new Opengles1Display
+
+               super
        end
-       
-       # these two are used as a callback from native to type incoming events
+
+       private fun set_as_input_handler(app_glue: NativeAppGlue) import extern_input_key, extern_input_motion `{
+               app_glue->onInputEvent = mnit_handle_input;
+       `}
+
+       redef fun full_frame do if not paused then super
+
+       # these are used as a callback from native to type incoming events
        private fun extern_input_key(event: AndroidKeyEvent): Bool
        do
                return input(event)
@@ -414,49 +240,6 @@ redef class App
 
                return handled
        end
-       
-       redef fun main_loop is extern import full_frame, generate_input `{
-               LOGI("nitni loop");
-               
-               nit_app = recv;
-
-               mnit_java_app->userData = &nit_app;
-               mnit_java_app->onAppCmd = mnit_handle_cmd;
-               mnit_java_app->onInputEvent = mnit_handle_input;
-               
-               while (1) {
-                       App_generate_input(recv);
-
-                       if (mnit_java_app->destroyRequested != 0) return;
-                       
-                       if (mnit_animating == 1) {
-                               mnit_frame();
-                               LOGI("frame at loop end 1");
-                       }
-               }
-               
-          /* App_exit(); // this is unreachable anyway*/
-       `}
 
-       redef fun generate_input import save, pause, resume, gained_focus, lost_focus, init_window, term_window, extern_input_key, extern_input_motion `{
-               int ident;
-               int events;
-               static int block = 0;
-               struct android_poll_source* source;
-
-               while ((ident=ALooper_pollAll(0, NULL, &events,
-                               (void**)&source)) >= 0) { /* first 0 is for non-blocking */ 
-
-                       // Process this event.
-                       if (source != NULL)
-                               source->process(mnit_java_app, source);
-
-                       // Check if we are exiting.
-                       if (mnit_java_app->destroyRequested != 0) {
-                               mnit_term_display();
-                               return;
-                       }
-               }
-       `}
+       redef fun generate_input do poll_looper 0
 end
-