Add basic change for v1453

Change-Id: I9497a61bbc3717f66413794a4e7dee0347c0bc33
diff --git a/mbtk/test/others/touch_ev_demo.c b/mbtk/test/others/touch_ev_demo.c
new file mode 100755
index 0000000..133384b
--- /dev/null
+++ b/mbtk/test/others/touch_ev_demo.c
@@ -0,0 +1,376 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/select.h>
+#include <sys/time.h>
+#include <errno.h>
+#include <linux/input.h>
+#include <unistd.h>
+#include <linux/fb.h>
+#include <sys/mman.h>
+#include <time.h>
+#include <pthread.h>
+#include <sys/poll.h>
+#include <dirent.h>
+#include <stdbool.h>
+
+// #include "mbtk_log.h"
+
+#ifndef TRUE
+#define TRUE   1   /* Boolean true value. */
+#endif
+
+#ifndef true
+#define true   1   /* Boolean true value. */
+#endif
+
+#ifndef FALSE
+#define FALSE  0   /* Boolean false value. */
+#endif
+
+#ifndef false
+#define false  0   /* Boolean false value. */
+#endif
+
+
+#ifndef NULL
+#define NULL  0
+#endif
+
+
+#ifndef null
+#define null  0
+#endif
+
+#define LOGI printf
+#define LOGE printf
+
+/**
+ * Compiler-digit : 16
+ * char : 1     (%c)
+ * char* : 2
+ * short int : 2
+ * int : 2      (%d)
+ * unsigned int : 2  (%u)
+ * float : 4    (%f)
+ * double : 8   (%f)
+ * long : 4
+ * unsigned long : 4
+ * long long : 8
+ * unsigned long long : 8
+ *
+ *
+ * Compiler-digit : 32
+ * char : 1
+ * char* : 4
+ * short int : 2
+ * int : 4
+ * unsigned int : 4
+ * float : 4
+ * double : 8
+ * long : 4
+ * unsigned long : 4
+ * long long : 8
+ * unsigned long long : 8
+ *
+ *
+ * Compiler-digit : 64
+ * char : 1
+ * char* : 8
+ * short int : 2
+ * int : 4
+ * unsigned int : 4
+ * float : 4
+ * double : 8
+ * long : 8
+ * unsigned long : 8
+ * long long : 8
+ * unsigned long long : 8
+ */
+typedef unsigned char boolean; /* Boolean value type. */
+// typedef unsigned char bool; /* Boolean value type. */
+typedef unsigned long long uint64; /* Unsigned 64 bit value */
+typedef unsigned long long uint64_t; /* Unsigned 64 bit value */
+typedef unsigned int uint32; /* Unsigned 32 bit value */
+typedef unsigned int uint32_t; /* Unsigned 32 bit value */
+typedef unsigned short uint16; /* Unsigned 16 bit value */
+typedef unsigned short uint16_t;
+typedef unsigned char uint8; /* Unsigned 8  bit value */
+typedef unsigned char uint8_t;
+typedef signed long long int64; /* Signed 64 bit value */
+typedef signed long long sint64; /* Signed 64 bit value */
+typedef signed int int32; /* Signed 32 bit value */
+typedef signed int sint32; /* Signed 32 bit value */
+typedef signed short int16; /* Signed 16 bit value */
+typedef signed short sint16; /* Signed 16 bit value */
+typedef signed char int8; /* Signed 8  bit value */
+typedef signed char sint8; /* Signed 8  bit value */
+typedef unsigned char byte; /* byte type */
+
+//#include "mbtk_type.h"
+//#include "mbtk_log.h"
+
+typedef int (*ev_callback)(int fd, uint32_t epevents, void *data);
+
+typedef enum {
+    ACTION_DOWN,
+    ACTION_MOVE,
+    ACTION_UP,
+    ACTION_CANCEL
+} touch_event_action_enum;
+
+typedef struct {
+    touch_event_action_enum action;
+    int x;
+    int y;
+} touch_event;
+
+static int move_x;
+static touch_event event_pre;
+static bool action_down_get = false;
+static bool action_touched = false;
+
+#define MAX_DEVICES 16
+#define MAX_MISC_FDS 16
+
+#define BITS_PER_LONG (sizeof(unsigned long) * 8)
+#define BITS_TO_LONGS(x) (((x) + BITS_PER_LONG - 1) / BITS_PER_LONG)
+
+#define test_bit(bit, array) \
+    ((array)[(bit)/BITS_PER_LONG] & (1 << ((bit) % BITS_PER_LONG)))
+
+struct fd_info {
+    ev_callback cb;
+    void *data;
+};
+
+static struct pollfd ev_fds[MAX_DEVICES + MAX_MISC_FDS];
+static struct fd_info ev_fdinfo[MAX_DEVICES + MAX_MISC_FDS];
+
+static unsigned ev_count = 0;
+static unsigned ev_dev_count = 0;
+static unsigned ev_misc_count = 0;
+
+int ev_get_input(int fd, short revents, struct input_event *ev);
+bool event_process(struct input_event ev);
+
+int ev_cb(int fd, uint32_t epevents, void *data)
+{
+    struct input_event ev;
+
+    int retval = ev_get_input(fd, epevents, &ev);
+    if(retval < 0) return -1;
+
+    if(!event_process(ev)) return 0;
+
+    return 0;
+}
+
+int ev_init(void *data)
+{
+    DIR *dir;
+    struct dirent *de;
+    int fd;
+
+    dir = opendir("/dev/input");
+    if(dir != 0) {
+        while((de = readdir(dir))) {
+            unsigned long ev_bits[BITS_TO_LONGS(EV_MAX)];
+
+//            fprintf(stderr,"/dev/input/%s\n", de->d_name);
+            if(strncmp(de->d_name,"event",5)) continue;
+            fd = openat(dirfd(dir), de->d_name, O_RDONLY);
+            if(fd < 0) continue;
+
+            /* read the evbits of the input device */
+            if (ioctl(fd, EVIOCGBIT(0, sizeof(ev_bits)), ev_bits) < 0) {
+                close(fd);
+                continue;
+            }
+
+            /* TODO: add ability to specify event masks. For now, just assume
+             * that only EV_KEY and EV_REL event types are ever needed. */
+            if (!test_bit(EV_KEY, ev_bits) && !test_bit(EV_REL, ev_bits)) {
+                close(fd);
+                continue;
+            }
+
+            ev_fds[ev_count].fd = fd;
+            ev_fds[ev_count].events = POLLIN;
+            ev_fdinfo[ev_count].cb = ev_cb;
+            ev_fdinfo[ev_count].data = data;
+            ev_count++;
+            ev_dev_count++;
+            if(ev_dev_count == MAX_DEVICES) break;
+        }
+    }
+
+    return 0;
+}
+
+void ev_exit(void)
+{
+    while (ev_count > 0) {
+        close(ev_fds[--ev_count].fd);
+    }
+    ev_misc_count = 0;
+    ev_dev_count = 0;
+}
+
+int ev_wait(int timeout)
+{
+    int r;
+
+    r = poll(ev_fds, ev_count, timeout);
+    if (r <= 0)
+        return -1;
+    return 0;
+}
+
+void ev_dispatch(void)
+{
+    unsigned n;
+//    int ret;
+
+    for (n = 0; n < ev_count; n++) {
+        ev_callback cb = ev_fdinfo[n].cb;
+        if (cb && (ev_fds[n].revents & ev_fds[n].events))
+            cb(ev_fds[n].fd, ev_fds[n].revents, ev_fdinfo[n].data);
+    }
+}
+
+int ev_get_input(int fd, short revents, struct input_event *ev)
+{
+    int r;
+
+    if (revents & POLLIN) {
+        r = read(fd, ev, sizeof(*ev));
+        if (r == sizeof(*ev))
+            return 0;
+    }
+    return -1;
+}
+
+bool event_process(struct input_event ev)
+{
+    LOGI("Event:%d,%d,%d\n", ev.type, ev.code, ev.value);
+
+//    if(ev.type != EV_KEY){
+//        return false;
+//    }
+
+    bool is_touch = true;
+    // Touch Down/Up
+    if(ev.type == EV_KEY && ev.code == BTN_TOUCH) {
+        if(!!ev.value) { // Down
+            action_down_get = true;
+            action_touched = true;
+        }
+        else // UP
+        {
+            action_down_get = false;
+            action_touched = false;
+        }
+    } else if(ev.type == EV_ABS) { // Touch move
+        if(!action_touched) // No down
+            return false;
+    } else if(ev.type != EV_KEY) {
+        return false;
+    } else {
+        is_touch = false;
+    }
+
+    if (!is_touch && ev.value < 2){ // 2 is long press events
+        int down = !!ev.value;
+        if (down){
+            LOGI("LongPress : DOWN.");
+            //if(!l->onKeyDown(ev.type, ev.code)) return false;
+        }else{
+            //if(!l->onKeyUp(ev.type, ev.code)) return false;
+            LOGI("LongPress : UP.");
+        }
+    } else if (is_touch) {
+        touch_event m_event;
+        if(ev.type == EV_ABS) { // Move
+            if(ev.code == KEY_SLASH) { // X
+                move_x = ev.value;
+            } else if(ev.code == KEY_RIGHTSHIFT) { // Y
+                if(action_down_get)
+                {
+                    m_event.action = ACTION_DOWN;
+                    action_down_get = false;
+                } else {
+                    m_event.action = ACTION_MOVE;
+                }
+                m_event.x = move_x;
+                m_event.y = ev.value;
+
+                if(event_pre.x != m_event.x
+                    || event_pre.y != m_event.y)
+                {
+                    event_pre.x = m_event.x;
+                    event_pre.y = m_event.y;
+                #ifdef MBTK_TP_RESIZE_SUPPORT
+                    point_resize(getScreenWidth(),
+                        getScreenHeight(),
+                        mStatusBar->isVisibility() ? mStatusBar->getHeight() : 0,
+                        &m_event);
+                #endif
+                    LOGI("Window onTouchEvent action:%d (%d,%d) -> (%d,%d)",
+                        m_event.action, event_pre.x, event_pre.y, m_event.x, m_event.y);
+
+                }
+            } else {
+                // Do nothing
+            }
+        } else if(!action_down_get){ // UP
+            m_event.action = ACTION_UP;
+            m_event.x = event_pre.x;
+            m_event.y = event_pre.y;
+
+        #ifdef MBTK_TP_RESIZE_SUPPORT
+            point_resize(getScreenWidth(),
+                getScreenHeight(),
+                mStatusBar->isVisibility() ? mStatusBar->getHeight() : 0,
+                &m_event);
+        #endif
+
+            LOGI("Window onTouchEvent action:%d (%d,%d) -> (%d,%d)",
+                m_event.action, event_pre.x, event_pre.y, m_event.x, m_event.y);
+
+        } else {
+            // Do nothing
+        }
+    } else {
+        // Do nothing
+    }
+
+    //invalidate();
+
+    return true;
+}
+
+int main(int argc, char *argv[])
+{
+    // mbtk_log_init(NULL, "MBTK_EVENT");
+
+    if(ev_init(NULL)) {
+        LOGE("ev_init() fail.");
+        return -1;
+    }
+
+    LOGI("event getting...");
+    while(1) {
+        if(!ev_wait(-1))
+            ev_dispatch();
+    }
+
+    LOGI("exit!!!");
+    return 0;
+}