Merge "GPS: Add callback for creating threads that can call into the Java VM." into gingerbread
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;
 
 /**