Add:Core:More android work
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Wed, 12 Aug 2009 23:10:50 +0000 (23:10 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Wed, 12 Aug 2009 23:10:50 +0000 (23:10 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk/navit@2460 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/android.c
navit/android/AndroidManifest.xml
navit/android/src/org/navitproject/navit/Navit.java
navit/android/src/org/navitproject/navit/NavitGraphics.java
navit/android/src/org/navitproject/navit/NavitIdle.java [new file with mode: 0644]
navit/graphics/android/graphics_android.c
navit/vehicle/android/vehicle_android.c

index 315824b..bb1929b 100644 (file)
@@ -49,6 +49,7 @@ Java_org_navitproject_navit_Navit_NavitMain( JNIEnv* env, jobject thiz, jobject
        __android_log_print(ANDROID_LOG_ERROR,"test","called");
        jnienv=env;
        android_activity=activity;
+       (*jnienv)->NewGlobalRef(jnienv, activity);
        dbg(0,"enter env=%p thiz=%p activity=%p\n",env,thiz,activity);
        main(1, strings);
 }
@@ -91,3 +92,11 @@ Java_org_navitproject_navit_NavitVehicle_VehicleCallback( JNIEnv * env, jobject
 {
        callback_call_1((struct callback *)id, (void *)location);
 } 
+
+JNIEXPORT void JNICALL
+Java_org_navitproject_navit_NavitIdle_IdleCallback( JNIEnv* env, jobject thiz, int id)
+{
+       dbg(1,"enter %p %p\n",thiz, (void *)id);
+       callback_call_0((struct callback *)id);
+}
+
index 7a1ea94..9341686 100644 (file)
@@ -5,6 +5,7 @@
       android:versionName="1.0">
     <uses-sdk android:minSdkVersion="3" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+    <uses-permission android:name="android.permission.WAKE_LOCK" />
     <application android:label="@string/app_name">
         <activity android:name="Navit"
                   android:label="@string/app_name"
index f54f262..24a1ed6 100644 (file)
@@ -21,21 +21,37 @@ import android.os.Bundle;
 import android.os.Debug;
 import android.os.Message;
 import android.os.Handler;
+import android.os.PowerManager;
 import android.content.Context;
 import android.util.Log;
 
 
 public class Navit extends Activity
 {
+    public Handler handler;
+    private PowerManager.WakeLock wl;
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
+       PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);  
+       wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE, "NavitDoNotDimScreen"); 
+       handler =new Handler() {
+               public void handleMessage(Message m) {
+                       Log.e("Navit","Handler received message");
+               }
+       };
        // Debug.startMethodTracing("calc");
         NavitMain(this);
     }
 
+    public void disableSuspend()
+    {
+       wl.acquire();
+       wl.release();
+    }
+
     /* A native method that is implemented by the
      * 'hello-jni' native library, which is packaged
      * with this application.
index d4af24e..239b736 100644 (file)
@@ -24,8 +24,10 @@ import android.view.*;
 import android.util.Log;
 
 public class NavitGraphics extends View {
-       public NavitGraphics(Activity activity) {
+       private NavitGraphics parent_graphics;
+       public NavitGraphics(Activity activity, NavitGraphics parent) {
                super(activity);
+               parent_graphics=parent;
        }
        public native void SizeChangedCallback(int id, int x, int y);
        public native void ButtonCallback(int id, int pressed, int button, int x, int y);
diff --git a/navit/android/src/org/navitproject/navit/NavitIdle.java b/navit/android/src/org/navitproject/navit/NavitIdle.java
new file mode 100644 (file)
index 0000000..872ca08
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.navitproject.navit;
+
+import android.app.Activity;
+import android.widget.TextView;
+import android.os.Bundle;
+import android.os.Debug;
+import android.os.Message;
+import android.os.MessageQueue;
+import android.os.Handler;
+import android.os.Looper;
+import android.content.Context;
+import android.util.Log;
+
+
+public class NavitIdle {
+       public native void IdleCallback(int id);
+       private final class Idler implements MessageQueue.IdleHandler {
+               int idle_callbackid;
+               public Idler(int callbackid) {
+                       idle_callbackid=callbackid;
+               }
+               public final boolean queueIdle() {
+                       IdleCallback(idle_callbackid);
+                       return true;
+               }
+       }
+       private Idler idler;
+       NavitIdle(int callbackid) 
+       {
+               idler=new Idler(callbackid);
+               Looper.myQueue().addIdleHandler(idler);
+       }
+       public void remove()
+       {
+               Looper.myQueue().removeIdleHandler(idler);
+       }
+}
+
index de3764a..66d98ac 100644 (file)
@@ -20,6 +20,7 @@
 #include <glib.h>
 #include <unistd.h>
 #include "config.h"
+#include "window.h"
 #include "point.h"
 #include "graphics.h"
 #include "color.h"
@@ -54,6 +55,7 @@ struct graphics_priv {
        jmethodID Resources_getIdentifier;
 
        struct callback_list *cbl;
+       struct window win;
 };
 
 struct graphics_font_priv {
@@ -195,7 +197,7 @@ image_new(struct graphics_priv *gra, struct graphics_image_methods *meth, char *
        jstring string;
        int id;
 
-       dbg(0,"enter %s\n",path);
+       dbg(1,"enter %s\n",path);
        *meth=image_methods;
        if (!strncmp(path,"res/drawable/",13)) {
                jstring a=(*jnienv)->NewStringUTF(jnienv, "drawable");
@@ -204,11 +206,11 @@ image_new(struct graphics_priv *gra, struct graphics_image_methods *meth, char *
                char *pos=strrchr(path_noext, '.');
                if (pos) 
                        *pos='\0';
-               dbg(0,"path_noext=%s\n",path_noext);
+               dbg(1,"path_noext=%s\n",path_noext);
                string = (*jnienv)->NewStringUTF(jnienv, path_noext);
                g_free(path_noext);
                id=(*jnienv)->CallIntMethod(jnienv, gra->Resources, gra->Resources_getIdentifier, string, a, b);
-               dbg(0,"id=%d\n",id);
+               dbg(1,"id=%d\n",id);
                if (id)
                        ret->Bitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeResource, gra->Resources, id);
                (*jnienv)->DeleteLocalRef(jnienv, b);
@@ -217,12 +219,12 @@ image_new(struct graphics_priv *gra, struct graphics_image_methods *meth, char *
                string = (*jnienv)->NewStringUTF(jnienv, path);
                ret->Bitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeFile, string);
        }
-       dbg(0,"result=%p\n",ret->Bitmap);
+       dbg(1,"result=%p\n",ret->Bitmap);
        if (ret->Bitmap) {
                (*jnienv)->NewGlobalRef(jnienv, ret->Bitmap);
                *w=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getWidth);
                *h=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getHeight);
-               dbg(0,"w=%d h=%d for %s\n",*w,*h,path);
+               dbg(1,"w=%d h=%d for %s\n",*w,*h,path);
                *w=64;
                *h=64;
                hot->x=*w/2;
@@ -332,7 +334,9 @@ static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graph
 static void *
 get_data(struct graphics_priv *this, char *type)
 {
-       return &dummy;
+       if (strcmp(type,"window"))
+               return NULL;
+       return &this->win;
 }
 
 static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv)
@@ -498,13 +502,13 @@ graphics_android_init(struct graphics_priv *ret)
        if (!find_class_global("org/navitproject/navit/NavitGraphics", &ret->NavitGraphicsClass))
                return 0;
        dbg(0,"at 3\n");
-       cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "<init>", "(Landroid/app/Activity;)V");
+       cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "<init>", "(Landroid/app/Activity;Lorg/navitproject/navit/NavitGraphics;)V");
        if (cid == NULL) {
                dbg(0,"no method found\n");
                return 0; /* exception thrown */
        }
        dbg(0,"at 4 android_activity=%p\n",android_activity);
-       ret->NavitGraphics=(*jnienv)->NewObject(jnienv, ret->NavitGraphicsClass, cid, android_activity);
+       ret->NavitGraphics=(*jnienv)->NewObject(jnienv, ret->NavitGraphicsClass, cid, android_activity, NULL);
        dbg(0,"result=%p\n",ret->NavitGraphics);
        if (ret->NavitGraphics)
                (*jnienv)->NewGlobalRef(jnienv, ret->NavitGraphics);
@@ -551,6 +555,23 @@ graphics_android_init(struct graphics_priv *ret)
        return 1;
 }
 
+static int
+graphics_android_fullscreen(struct window *win, int on)
+{
+       return 1;
+}
+
+static jclass NavitClass;
+static jmethodID Navit_disableSuspend;
+
+static void
+graphics_android_disable_suspend(struct window *win)
+{
+       dbg(1,"enter\n");
+       (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_disableSuspend);
+}
+
+
 
 static struct graphics_priv *
 graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl)
@@ -559,6 +580,9 @@ graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct at
 
        ret->cbl=cbl;
        *meth=graphics_methods;
+       ret->win.priv=ret;
+       ret->win.fullscreen=graphics_android_fullscreen;
+       ret->win.disable_suspend=graphics_android_disable_suspend;
        if (graphics_android_init(ret)) {
                return ret;
        } else {
@@ -592,10 +616,15 @@ event_android_remove_watch(struct event_watch *ev)
         dbg(0,"enter\n");
 }
 
+
 static jclass NavitTimeoutClass;
 static jmethodID NavitTimeout_init;
 static jmethodID NavitTimeout_remove;
 
+static jclass NavitIdleClass;
+static jmethodID NavitIdle_init;
+static jmethodID NavitIdle_remove;
+
 static struct event_timeout *
 event_android_add_timeout(int timeout, int multi, struct callback *cb)
 {
@@ -622,14 +651,24 @@ event_android_remove_timeout(struct event_timeout *to)
 static struct event_idle *
 event_android_add_idle(int priority, struct callback *cb)
 {
-        dbg(0,"enter\n");
-        return NULL;
+       jobject ret;
+        dbg(1,"enter\n");
+       ret=(*jnienv)->NewObject(jnienv, NavitIdleClass, NavitIdle_init, (int)cb);
+       dbg(1,"result for %p=%p\n",cb,ret);
+       if (ret)
+               (*jnienv)->NewGlobalRef(jnienv, ret);
+       return (struct event_idle *)ret;
 }
 
 static void
 event_android_remove_idle(struct event_idle *ev)
 {
-        dbg(0,"enter\n");
+       dbg(1,"enter %p\n",ev);
+       if (ev) {
+               jobject obj=(jobject )ev;
+               (*jnienv)->CallVoidMethod(jnienv, obj, NavitIdle_remove);
+               (*jnienv)->DeleteGlobalRef(jnienv, obj);
+       }
 }
 
 static void
@@ -662,6 +701,19 @@ event_android_new(struct event_methods *meth)
        NavitTimeout_remove = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "remove", "()V");
        if (NavitTimeout_remove == NULL) 
                return NULL;
+       if (!find_class_global("org/navitproject/navit/NavitIdle", &NavitIdleClass))
+               return NULL;
+       NavitIdle_init = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "<init>", "(I)V");
+       if (NavitIdle_init == NULL) 
+               return NULL;
+       NavitIdle_remove = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "remove", "()V");
+       if (NavitIdle_remove == NULL) 
+               return NULL;
+       if (!find_class_global("org/navitproject/navit/Navit", &NavitClass))
+               return NULL;
+       Navit_disableSuspend = (*jnienv)->GetMethodID(jnienv, NavitClass, "disableSuspend", "()V");
+       if (Navit_disableSuspend == NULL) 
+               return NULL;
        dbg(0,"ok\n");
         *meth=event_android_methods;
         return NULL;
index 78f2f3d..291d9a0 100644 (file)
@@ -81,7 +81,7 @@ vehicle_android_position_attr_get(struct vehicle_priv *priv,
                               enum attr_type type, struct attr *attr)
 {
        struct attr * active=NULL;
-       dbg(0,"enter %s\n",attr_to_name(type));
+       dbg(1,"enter %s\n",attr_to_name(type));
        switch (type) {
 #if 0
        case attr_position_fix_type:
@@ -116,7 +116,7 @@ vehicle_android_position_attr_get(struct vehicle_priv *priv,
        default:
                return 0;
        }
-       dbg(0,"ok\n");
+       dbg(1,"ok\n");
        attr->type = type;
        return 1;
 }
@@ -131,7 +131,7 @@ vehicle_android_callback(struct vehicle_priv *v, jobject location)
 {
        time_t tnow;
        struct tm *tm;
-       dbg(0,"enter\n");
+       dbg(1,"enter\n");
 
        v->geo.lat = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getLatitude);
        v->geo.lng = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getLongitude);
@@ -141,7 +141,7 @@ vehicle_android_callback(struct vehicle_priv *v, jobject location)
        tnow=(*jnienv)->CallLongMethod(jnienv, location, v->Location_getTime)/1000;
        tm = gmtime(&tnow);
        strftime(v->fixiso8601, sizeof(v->fixiso8601), "%Y-%m-%dT%TZ", tm);
-       dbg(0,"time %s\n",v->fixiso8601);
+       dbg(1,"lat %f lon %f time %s\n",v->geo.lat,v->geo.lng,v->fixiso8601);
        v->have_coords=1;
        callback_list_call_0(v->cbl);
 }