GPS: Add callback for creating threads that can call into the Java VM.

To eliminate an unnecessary thread in the framework GPS code, we now
require the GPS HAL to call callbacks from a thread created using the
create_thread_cb.  Such threads are able to call directly into Java,
eliminating a polling thread in the GpsLocationProvider code.

Change-Id: I91eeea73b8908f10f10a93ae71034c63f806e8a1
Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/include/hardware/gps.h b/include/hardware/gps.h
index f2f6dcf..4077632 100644
--- a/include/hardware/gps.h
+++ b/include/hardware/gps.h
@@ -20,6 +20,7 @@
 #include <stdint.h>
 #include <sys/cdefs.h>
 #include <sys/types.h>
+#include <pthread.h>
 
 #include <hardware/hardware.h>
 
@@ -274,29 +275,44 @@
     uint32_t    used_in_fix_mask;
 } GpsSvStatus;
 
-/** Callback with location information. */
+/** Callback with location information.
+ *  Can only be called from a thread created by create_thread_cb.
+ */
 typedef void (* gps_location_callback)(GpsLocation* location);
 
-/** Callback with status information. */
+/** Callback with status information.
+ *  Can only be called from a thread created by create_thread_cb.
+ */
 typedef void (* gps_status_callback)(GpsStatus* status);
 
-/** Callback with SV status information. */
+/** Callback with SV status information.
+ *  Can only be called from a thread created by create_thread_cb.
+ */
 typedef void (* gps_sv_status_callback)(GpsSvStatus* sv_info);
 
-/** Callback for reporting NMEA sentences. */
+/** Callback for reporting NMEA sentences.
+ *  Can only be called from a thread created by create_thread_cb.
+ */
 typedef void (* gps_nmea_callback)(GpsUtcTime timestamp, const char* nmea, int length);
 
 /** Callback to inform framework of the GPS engine's capabilities.
-    capability parameter is a bit field of GPS_CAPABILITY_* flags */
+ *  Capability parameter is a bit field of GPS_CAPABILITY_* flags.
+ */
 typedef void (* gps_set_capabilities)(uint32_t capabilities);
 
 /** Callback utility for acquiring the GPS wakelock.
-    This can be used to prevent the CPU from suspending while handling GPS events. */
+ *  This can be used to prevent the CPU from suspending while handling GPS events.
+ */
 typedef void (* gps_acquire_wakelock)();
 
 /** Callback utility for releasing the GPS wakelock. */
 typedef void (* gps_release_wakelock)();
 
+/** Callback for creating a thread that can call into the Java framework code.
+ *  This must be used to create any threads that report events up to the framework.
+ */
+typedef pthread_t (* gps_create_thread)(const char* name, void (*start)(void *), void* arg);
+
 /** GPS callback structure. */
 typedef struct {
     /** set to sizeof(GpsCallbacks) */
@@ -308,6 +324,7 @@
     gps_set_capabilities set_capabilities_cb;
     gps_acquire_wakelock acquire_wakelock_cb;
     gps_release_wakelock release_wakelock_cb;
+    gps_create_thread create_thread_cb;
 } GpsCallbacks;
 
 
@@ -361,13 +378,15 @@
 } GpsInterface;
 
 /** Callback to request the client to download XTRA data.
-    The client should download XTRA data and inject it by calling
-     inject_xtra_data(). */
+ *  The client should download XTRA data and inject it by calling inject_xtra_data().
+ *  Can only be called from a thread created by create_thread_cb.
+ */
 typedef void (* gps_xtra_download_request)();
 
 /** Callback structure for the XTRA interface. */
 typedef struct {
-        gps_xtra_download_request download_request_cb;
+    gps_xtra_download_request download_request_cb;
+    gps_create_thread create_thread_cb;
 } GpsXtraCallbacks;
 
 /** Extended interface for XTRA support. */
@@ -404,12 +423,15 @@
     AGpsStatusValue status;
 } AGpsStatus;
 
-/** Callback with AGPS status information. */
+/** Callback with AGPS status information.
+ *  Can only be called from a thread created by create_thread_cb.
+ */
 typedef void (* agps_status_callback)(AGpsStatus* status);
 
 /** Callback structure for the AGPS interface. */
 typedef struct {
-        agps_status_callback status_cb;
+    agps_status_callback status_cb;
+    gps_create_thread create_thread_cb;
 } AGpsCallbacks;
 
 
@@ -505,16 +527,19 @@
 
 } GpsNiNotification;
 
-/** Callback with NI notification. */
+/** Callback with NI notification.
+ *  Can only be called from a thread created by create_thread_cb.
+ */
 typedef void (*gps_ni_notify_callback)(GpsNiNotification *notification);
 
 /** GPS NI callback structure. */
 typedef struct
 {
-   /**
-    * Sends the notification request from HAL to GPSLocationProvider.
-    */
-   gps_ni_notify_callback notify_cb;
+    /**
+     * Sends the notification request from HAL to GPSLocationProvider.
+     */
+    gps_ni_notify_callback notify_cb;
+    gps_create_thread create_thread_cb;
 } GpsNiCallbacks;
 
 /**