19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "GpsLocationProvider" 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19b8d9033d9928209e68518c4b12fea74187ddb382Mike Lockwood#define LOG_NDEBUG 0 2022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 23b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood#include "hardware/hardware.h" 24b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood#include "hardware/gps.h" 258f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood#include "hardware_legacy/power.h" 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/Log.h" 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/misc.h" 28f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood#include "android_runtime/AndroidRuntime.h" 2987eac99a21772ae56018cb81db6966557b459554Ruben Brunk#include "android_runtime/Log.h" 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <pthread.h> 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic jobject mCallbacksObj = NULL; 35f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID method_reportLocation; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID method_reportStatus; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID method_reportSvStatus; 39e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic jmethodID method_reportAGpsStatus; 40b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwoodstatic jmethodID method_reportNmea; 4104598b67a58fad93e5060bb77756ba4863013aedMike Lockwoodstatic jmethodID method_setEngineCapabilities; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID method_xtraDownloadRequest; 4322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic jmethodID method_reportNiNotification; 441e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic jmethodID method_requestRefLocation; 451e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic jmethodID method_requestSetID; 469b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwoodstatic jmethodID method_requestUtcTime; 478ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jmethodID method_reportGeofenceTransition; 488ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jmethodID method_reportGeofenceStatus; 498ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jmethodID method_reportGeofenceAddStatus; 508ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jmethodID method_reportGeofenceRemoveStatus; 518ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jmethodID method_reportGeofencePauseStatus; 528ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jmethodID method_reportGeofenceResumeStatus; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const GpsInterface* sGpsInterface = NULL; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const GpsXtraInterface* sGpsXtraInterface = NULL; 56e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic const AGpsInterface* sAGpsInterface = NULL; 5722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic const GpsNiInterface* sGpsNiInterface = NULL; 583c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettingerstatic const GpsDebugInterface* sGpsDebugInterface = NULL; 591e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic const AGpsRilInterface* sAGpsRilInterface = NULL; 608ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic const GpsGeofencingInterface* sGpsGeofencingInterface = NULL; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood// temporary storage for GPS callbacks 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic GpsSvStatus sGpsSvStatus; 64f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic const char* sNmeaString; 65f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic int sNmeaStringLength; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 678f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood#define WAKE_LOCK_NAME "GPS" 688f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 71f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { 72f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (env->ExceptionCheck()) { 733762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("An exception was thrown by callback '%s'.", methodName); 74f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood LOGE_EX(env); 75f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->ExceptionClear(); 76f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood } 77f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood} 78f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void location_callback(GpsLocation* location) 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 81f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 82f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportLocation, location->flags, 83f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood (jdouble)location->latitude, (jdouble)location->longitude, 84f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood (jdouble)location->altitude, 85f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood (jfloat)location->speed, (jfloat)location->bearing, 86f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood (jfloat)location->accuracy, (jlong)location->timestamp); 87f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void status_callback(GpsStatus* status) 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 92f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 93f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportStatus, status->status); 94f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void sv_status_callback(GpsSvStatus* sv_status) 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 99f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 100f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood memcpy(&sGpsSvStatus, sv_status, sizeof(sGpsSvStatus)); 101f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportSvStatus); 102f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 105b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwoodstatic void nmea_callback(GpsUtcTime timestamp, const char* nmea, int length) 106b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood{ 107f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 108f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood // The Java code will call back to read these values 109f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood // We do this to avoid creating unnecessary String objects 110f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood sNmeaString = nmea; 111f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood sNmeaStringLength = length; 112f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportNmea, timestamp); 113f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 114b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood} 115b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 11604598b67a58fad93e5060bb77756ba4863013aedMike Lockwoodstatic void set_capabilities_callback(uint32_t capabilities) 11704598b67a58fad93e5060bb77756ba4863013aedMike Lockwood{ 1188ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGD("set_capabilities_callback: %du\n", capabilities); 119f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 120f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_setEngineCapabilities, capabilities); 121f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 12204598b67a58fad93e5060bb77756ba4863013aedMike Lockwood} 12304598b67a58fad93e5060bb77756ba4863013aedMike Lockwood 1248f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwoodstatic void acquire_wakelock_callback() 1258f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood{ 1268f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_NAME); 1278f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood} 1288f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood 1298f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwoodstatic void release_wakelock_callback() 1308f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood{ 1318f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood release_wake_lock(WAKE_LOCK_NAME); 1328f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood} 1338f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood 1349b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwoodstatic void request_utc_time_callback() 1359b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood{ 1369b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 1379b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_requestUtcTime); 1389b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 1399b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood} 1409b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood 141f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic pthread_t create_thread_callback(const char* name, void (*start)(void *), void* arg) 14258bda987665af759c379cd494ff4873ac61acf29Mike Lockwood{ 143f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood return (pthread_t)AndroidRuntime::createJavaThread(name, start, arg); 14458bda987665af759c379cd494ff4873ac61acf29Mike Lockwood} 14558bda987665af759c379cd494ff4873ac61acf29Mike Lockwood 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGpsCallbacks sGpsCallbacks = { 1478f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood sizeof(GpsCallbacks), 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project location_callback, 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_callback, 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sv_status_callback, 1518f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood nmea_callback, 15204598b67a58fad93e5060bb77756ba4863013aedMike Lockwood set_capabilities_callback, 1538f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood acquire_wakelock_callback, 1548f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood release_wakelock_callback, 155f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood create_thread_callback, 1569b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood request_utc_time_callback, 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 159f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void xtra_download_request_callback() 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 161f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 162f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_xtraDownloadRequest); 163f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 16422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie} 16522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGpsXtraCallbacks sGpsXtraCallbacks = { 167f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood xtra_download_request_callback, 168f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood create_thread_callback, 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 171f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void agps_status_callback(AGpsStatus* agps_status) 172f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood{ 173f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 1748efd74dbedb65f69734318d9d6be70767f30b57aStephen Li 1758efd74dbedb65f69734318d9d6be70767f30b57aStephen Li uint32_t ipaddr; 1768efd74dbedb65f69734318d9d6be70767f30b57aStephen Li // ipaddr field was not included in original AGpsStatus 1778efd74dbedb65f69734318d9d6be70767f30b57aStephen Li if (agps_status->size >= sizeof(AGpsStatus)) 1788efd74dbedb65f69734318d9d6be70767f30b57aStephen Li ipaddr = agps_status->ipaddr; 1798efd74dbedb65f69734318d9d6be70767f30b57aStephen Li else 1808efd74dbedb65f69734318d9d6be70767f30b57aStephen Li ipaddr = 0xFFFFFFFF; 181f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportAGpsStatus, 1828efd74dbedb65f69734318d9d6be70767f30b57aStephen Li agps_status->type, agps_status->status, ipaddr); 183f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 184f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood} 185f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 186e3635c9693c4cd9650684f14e19dcabcea0d488aMike LockwoodAGpsCallbacks sAGpsCallbacks = { 187e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood agps_status_callback, 188f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood create_thread_callback, 18958bda987665af759c379cd494ff4873ac61acf29Mike Lockwood}; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 191f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void gps_ni_notify_callback(GpsNiNotification *notification) 192f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood{ 1935baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("gps_ni_notify_callback\n"); 194f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 195f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jstring requestor_id = env->NewStringUTF(notification->requestor_id); 196f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jstring text = env->NewStringUTF(notification->text); 197f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jstring extras = env->NewStringUTF(notification->extras); 198f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 199f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (requestor_id && text && extras) { 200f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportNiNotification, 201f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->notification_id, notification->ni_type, 202f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->notify_flags, notification->timeout, 203f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->default_response, requestor_id, text, 204f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->requestor_id_encoding, 205f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->text_encoding, extras); 206f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood } else { 2073762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("out of memory in gps_ni_notify_callback\n"); 208f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood } 209f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 210f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (requestor_id) 211f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->DeleteLocalRef(requestor_id); 212f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (text) 213f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->DeleteLocalRef(text); 214f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (extras) 215f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->DeleteLocalRef(extras); 216f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 217f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood} 218f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 21922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke XieGpsNiCallbacks sGpsNiCallbacks = { 22022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie gps_ni_notify_callback, 221f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood create_thread_callback, 22222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie}; 22322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 2241e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void agps_request_set_id(uint32_t flags) 2251e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 2261e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja JNIEnv* env = AndroidRuntime::getJNIEnv(); 2271e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja env->CallVoidMethod(mCallbacksObj, method_requestSetID, flags); 2281e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja checkAndClearExceptionFromCallback(env, __FUNCTION__); 2291e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 2301e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 2311e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void agps_request_ref_location(uint32_t flags) 2321e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 2331e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja JNIEnv* env = AndroidRuntime::getJNIEnv(); 2341e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja env->CallVoidMethod(mCallbacksObj, method_requestRefLocation, flags); 2351e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja checkAndClearExceptionFromCallback(env, __FUNCTION__); 2361e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 2371e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 2381e84da822e7aa4d494b31c8759917d2751611f84Miguel TorrojaAGpsRilCallbacks sAGpsRilCallbacks = { 2391e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja agps_request_set_id, 2401e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja agps_request_ref_location, 2411e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja create_thread_callback, 2421e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja}; 2431e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 2448ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic void gps_geofence_transition_callback(int32_t geofence_id, GpsLocation* location, 2458ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh int32_t transition, GpsUtcTime timestamp) 2468ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh{ 2478ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh JNIEnv* env = AndroidRuntime::getJNIEnv(); 2488ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 2498ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh env->CallVoidMethod(mCallbacksObj, method_reportGeofenceTransition, geofence_id, 2508ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh location->flags, (jdouble)location->latitude, (jdouble)location->longitude, 2518ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh (jdouble)location->altitude, 2528ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh (jfloat)location->speed, (jfloat)location->bearing, 2538ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh (jfloat)location->accuracy, (jlong)location->timestamp, 2548ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh transition, timestamp); 2558ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkAndClearExceptionFromCallback(env, __FUNCTION__); 2568ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh}; 2578ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 2588ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic void gps_geofence_status_callback(int32_t status, GpsLocation* location) 2598ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh{ 2608ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh JNIEnv* env = AndroidRuntime::getJNIEnv(); 2618ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jint flags = 0; 2628ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jdouble latitude = 0; 2638ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jdouble longitude = 0; 2648ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jdouble altitude = 0; 2658ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jfloat speed = 0; 2668ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jfloat bearing = 0; 2678ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jfloat accuracy = 0; 2688ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jlong timestamp = 0; 2698ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (location != NULL) { 2708ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh flags = location->flags; 2718ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh latitude = location->latitude; 2728ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh longitude = location->longitude; 2738ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh altitude = location->altitude; 2748ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh speed = location->speed; 2758ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh bearing = location->bearing; 2768ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh accuracy = location->accuracy; 2778ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh timestamp = location->timestamp; 2788ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 2798ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 2808ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh env->CallVoidMethod(mCallbacksObj, method_reportGeofenceStatus, status, 2818ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh flags, latitude, longitude, altitude, speed, bearing, accuracy, timestamp); 2828ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkAndClearExceptionFromCallback(env, __FUNCTION__); 2838ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh}; 2848ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 2858ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic void gps_geofence_add_callback(int32_t geofence_id, int32_t status) 2868ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh{ 2878ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh JNIEnv* env = AndroidRuntime::getJNIEnv(); 2888ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (status != GPS_GEOFENCE_OPERATION_SUCCESS) { 2898ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGE("Error in geofence_add_callback: %d\n", status); 2908ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 2918ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh env->CallVoidMethod(mCallbacksObj, method_reportGeofenceAddStatus, geofence_id, status); 2928ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkAndClearExceptionFromCallback(env, __FUNCTION__); 2938ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh}; 2948ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 2958ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic void gps_geofence_remove_callback(int32_t geofence_id, int32_t status) 2968ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh{ 2978ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh JNIEnv* env = AndroidRuntime::getJNIEnv(); 2988ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (status != GPS_GEOFENCE_OPERATION_SUCCESS) { 2998ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGE("Error in geofence_remove_callback: %d\n", status); 3008ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 3018ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh env->CallVoidMethod(mCallbacksObj, method_reportGeofenceRemoveStatus, geofence_id, status); 3028ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkAndClearExceptionFromCallback(env, __FUNCTION__); 3038ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh}; 3048ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 3058ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic void gps_geofence_resume_callback(int32_t geofence_id, int32_t status) 3068ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh{ 3078ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh JNIEnv* env = AndroidRuntime::getJNIEnv(); 3088ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (status != GPS_GEOFENCE_OPERATION_SUCCESS) { 3098ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGE("Error in geofence_resume_callback: %d\n", status); 3108ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 3118ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh env->CallVoidMethod(mCallbacksObj, method_reportGeofenceResumeStatus, geofence_id, status); 3128ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkAndClearExceptionFromCallback(env, __FUNCTION__); 3138ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh}; 3148ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 3158ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic void gps_geofence_pause_callback(int32_t geofence_id, int32_t status) 3168ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh{ 3178ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh JNIEnv* env = AndroidRuntime::getJNIEnv(); 3188ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (status != GPS_GEOFENCE_OPERATION_SUCCESS) { 3198ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGE("Error in geofence_pause_callback: %d\n", status); 3208ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 3218ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh env->CallVoidMethod(mCallbacksObj, method_reportGeofencePauseStatus, geofence_id, status); 3228ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkAndClearExceptionFromCallback(env, __FUNCTION__); 3238ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh}; 3248ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 3258ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar GaneshGpsGeofenceCallbacks sGpsGeofenceCallbacks = { 3268ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh gps_geofence_transition_callback, 3278ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh gps_geofence_status_callback, 3288ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh gps_geofence_add_callback, 3298ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh gps_geofence_remove_callback, 3308ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh gps_geofence_pause_callback, 3318ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh gps_geofence_resume_callback, 3328ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh create_thread_callback, 3338ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh}; 3348ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 33558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwoodstatic void android_location_GpsLocationProvider_class_init_native(JNIEnv* env, jclass clazz) { 336b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood int err; 337b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood hw_module_t* module; 338bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 339bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportLocation = env->GetMethodID(clazz, "reportLocation", "(IDDDFFFJ)V"); 340bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportStatus = env->GetMethodID(clazz, "reportStatus", "(I)V"); 341bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportSvStatus = env->GetMethodID(clazz, "reportSvStatus", "()V"); 3428efd74dbedb65f69734318d9d6be70767f30b57aStephen Li method_reportAGpsStatus = env->GetMethodID(clazz, "reportAGpsStatus", "(III)V"); 343bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportNmea = env->GetMethodID(clazz, "reportNmea", "(J)V"); 344bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_setEngineCapabilities = env->GetMethodID(clazz, "setEngineCapabilities", "(I)V"); 345bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_xtraDownloadRequest = env->GetMethodID(clazz, "xtraDownloadRequest", "()V"); 34658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood method_reportNiNotification = env->GetMethodID(clazz, "reportNiNotification", 34758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood "(IIIIILjava/lang/String;Ljava/lang/String;IILjava/lang/String;)V"); 348bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_requestRefLocation = env->GetMethodID(clazz,"requestRefLocation","(I)V"); 349bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_requestSetID = env->GetMethodID(clazz,"requestSetID","(I)V"); 3509b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood method_requestUtcTime = env->GetMethodID(clazz,"requestUtcTime","()V"); 3518ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh method_reportGeofenceTransition = env->GetMethodID(clazz,"reportGeofenceTransition", 3528ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "(IIDDDFFFJIJ)V"); 3538ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh method_reportGeofenceStatus = env->GetMethodID(clazz,"reportGeofenceStatus", 3548ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "(IIDDDFFFJ)V"); 3558ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh method_reportGeofenceAddStatus = env->GetMethodID(clazz,"reportGeofenceAddStatus", 3568ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "(II)V"); 3578ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh method_reportGeofenceRemoveStatus = env->GetMethodID(clazz,"reportGeofenceRemoveStatus", 3588ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "(II)V"); 3598ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh method_reportGeofenceResumeStatus = env->GetMethodID(clazz,"reportGeofenceResumeStatus", 3608ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "(II)V"); 3618ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh method_reportGeofencePauseStatus = env->GetMethodID(clazz,"reportGeofencePauseStatus", 3628ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "(II)V"); 36358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 36458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood err = hw_get_module(GPS_HARDWARE_MODULE_ID, (hw_module_t const**)&module); 36558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (err == 0) { 36658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood hw_device_t* device; 36758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood err = module->methods->open(module, GPS_HARDWARE_MODULE_ID, &device); 36858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (err == 0) { 36958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood gps_device_t* gps_device = (gps_device_t *)device; 37058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsInterface = gps_device->get_gps_interface(gps_device); 37158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood } 37258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood } 37358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) { 37458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsXtraInterface = 37558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood (const GpsXtraInterface*)sGpsInterface->get_extension(GPS_XTRA_INTERFACE); 37658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface = 37758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood (const AGpsInterface*)sGpsInterface->get_extension(AGPS_INTERFACE); 37858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsNiInterface = 37958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood (const GpsNiInterface*)sGpsInterface->get_extension(GPS_NI_INTERFACE); 38058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsDebugInterface = 38158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood (const GpsDebugInterface*)sGpsInterface->get_extension(GPS_DEBUG_INTERFACE); 38258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface = 38358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood (const AGpsRilInterface*)sGpsInterface->get_extension(AGPS_RIL_INTERFACE); 3848ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh sGpsGeofencingInterface = 3858ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh (const GpsGeofencingInterface*)sGpsInterface->get_extension(GPS_GEOFENCING_INTERFACE); 38658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood } 387bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood} 388bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_location_GpsLocationProvider_is_supported(JNIEnv* env, jclass clazz) { 39058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood return (sGpsInterface != NULL); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj) 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 39558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood // this must be set before calling into the HAL library 39658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!mCallbacksObj) 39758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood mCallbacksObj = env->NewGlobalRef(obj); 39858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 39958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood // fail if the main interface fails to initialize 40058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sGpsInterface || sGpsInterface->init(&sGpsCallbacks) != 0) 40158bda987665af759c379cd494ff4873ac61acf29Mike Lockwood return false; 40258bda987665af759c379cd494ff4873ac61acf29Mike Lockwood 4038ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh // if XTRA initialization fails we will disable it by sGpsXtraInterface to NULL, 40458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood // but continue to allow the rest of the GPS interface to work. 40558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsXtraInterface && sGpsXtraInterface->init(&sGpsXtraCallbacks) != 0) 40658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsXtraInterface = NULL; 40758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sAGpsInterface) 40858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface->init(&sAGpsCallbacks); 40958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsNiInterface) 41058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsNiInterface->init(&sGpsNiCallbacks); 41158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sAGpsRilInterface) 41258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->init(&sAGpsRilCallbacks); 4138ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (sGpsGeofencingInterface) 4148ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh sGpsGeofencingInterface->init(&sGpsGeofenceCallbacks); 4153c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger 416c21a08f747f6fd1d7b8c98176ff70abc57cf58a0Mike Lockwood return true; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_location_GpsLocationProvider_cleanup(JNIEnv* env, jobject obj) 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 42158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 42258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsInterface->cleanup(); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42504598b67a58fad93e5060bb77756ba4863013aedMike Lockwoodstatic jboolean android_location_GpsLocationProvider_set_position_mode(JNIEnv* env, jobject obj, 42604598b67a58fad93e5060bb77756ba4863013aedMike Lockwood jint mode, jint recurrence, jint min_interval, jint preferred_accuracy, jint preferred_time) 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 42858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 42958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood return (sGpsInterface->set_position_mode(mode, recurrence, min_interval, preferred_accuracy, 4304270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood preferred_time) == 0); 4314270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood else 4324270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood return false; 43304598b67a58fad93e5060bb77756ba4863013aedMike Lockwood} 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43504598b67a58fad93e5060bb77756ba4863013aedMike Lockwoodstatic jboolean android_location_GpsLocationProvider_start(JNIEnv* env, jobject obj) 43604598b67a58fad93e5060bb77756ba4863013aedMike Lockwood{ 43758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 43858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood return (sGpsInterface->start() == 0); 4394270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood else 4404270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood return false; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_location_GpsLocationProvider_stop(JNIEnv* env, jobject obj) 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 44558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 44658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood return (sGpsInterface->stop() == 0); 4474270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood else 4484270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood return false; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_location_GpsLocationProvider_delete_aiding_data(JNIEnv* env, jobject obj, jint flags) 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 45358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 45458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsInterface->delete_aiding_data(flags); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic jint android_location_GpsLocationProvider_read_sv_status(JNIEnv* env, jobject obj, 45822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie jintArray prnArray, jfloatArray snrArray, jfloatArray elevArray, jfloatArray azumArray, 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jintArray maskArray) 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 461f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood // this should only be called from within a call to reportSvStatus 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* prns = env->GetIntArrayElements(prnArray, 0); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloat* snrs = env->GetFloatArrayElements(snrArray, 0); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloat* elev = env->GetFloatArrayElements(elevArray, 0); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloat* azim = env->GetFloatArrayElements(azumArray, 0); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* mask = env->GetIntArrayElements(maskArray, 0); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood int num_svs = sGpsSvStatus.num_svs; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < num_svs; i++) { 471f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood prns[i] = sGpsSvStatus.sv_list[i].prn; 472f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood snrs[i] = sGpsSvStatus.sv_list[i].snr; 473f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood elev[i] = sGpsSvStatus.sv_list[i].elevation; 474f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood azim[i] = sGpsSvStatus.sv_list[i].azimuth; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 476f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood mask[0] = sGpsSvStatus.ephemeris_mask; 477f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood mask[1] = sGpsSvStatus.almanac_mask; 478f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood mask[2] = sGpsSvStatus.used_in_fix_mask; 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseIntArrayElements(prnArray, prns, 0); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseFloatArrayElements(snrArray, snrs, 0); 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseFloatArrayElements(elevArray, elev, 0); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseFloatArrayElements(azumArray, azim, 0); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseIntArrayElements(maskArray, mask, 0); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return num_svs; 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4881e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void android_location_GpsLocationProvider_agps_set_reference_location_cellid(JNIEnv* env, 4891e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja jobject obj, jint type, jint mcc, jint mnc, jint lac, jint cid) 4901e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 4911e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja AGpsRefLocation location; 49258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 49358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsRilInterface) { 4943762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no AGPS RIL interface in agps_set_reference_location_cellid"); 4951e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 496bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood } 497bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 4981e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja switch(type) { 4991e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja case AGPS_REF_LOCATION_TYPE_GSM_CELLID: 5001e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja case AGPS_REF_LOCATION_TYPE_UMTS_CELLID: 5011e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.type = type; 5021e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.u.cellID.mcc = mcc; 5031e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.u.cellID.mnc = mnc; 5041e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.u.cellID.lac = lac; 5051e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.u.cellID.cid = cid; 5061e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja break; 5071e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja default: 5083762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Neither a GSM nor a UMTS cellid (%s:%d).",__FUNCTION__,__LINE__); 5091e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 5101e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja break; 5111e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja } 51258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->set_ref_location(&location, sizeof(location)); 5131e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 5141e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 5151e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void android_location_GpsLocationProvider_agps_send_ni_message(JNIEnv* env, 5161e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja jobject obj, jbyteArray ni_msg, jint size) 5171e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 5181e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja size_t sz; 51958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 52058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsRilInterface) { 5213762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no AGPS RIL interface in send_ni_message"); 5221e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 523bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood } 5241e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja if (size < 0) 5251e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 5261e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja sz = (size_t)size; 5271e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja jbyte* b = env->GetByteArrayElements(ni_msg, 0); 52858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->ni_message((uint8_t *)b,sz); 5291e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja env->ReleaseByteArrayElements(ni_msg,b,0); 5301e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 5311e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 5321e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void android_location_GpsLocationProvider_agps_set_id(JNIEnv *env, 5331e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja jobject obj, jint type, jstring setid_string) 5341e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 53558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsRilInterface) { 5363762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no AGPS RIL interface in agps_set_id"); 5371e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 538bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood } 5391e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 5401e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja const char *setid = env->GetStringUTFChars(setid_string, NULL); 54158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->set_set_id(type, setid); 5421e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja env->ReleaseStringUTFChars(setid_string, setid); 5431e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 5441e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 545f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic jint android_location_GpsLocationProvider_read_nmea(JNIEnv* env, jobject obj, 546f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jbyteArray nmeaArray, jint buffer_size) 547b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood{ 548f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood // this should only be called from within a call to reportNmea 549f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jbyte* nmea = (jbyte *)env->GetPrimitiveArrayCritical(nmeaArray, 0); 550f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood int length = sNmeaStringLength; 551b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood if (length > buffer_size) 552b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood length = buffer_size; 553f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood memcpy(nmea, sNmeaString, length); 554f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->ReleasePrimitiveArrayCritical(nmeaArray, nmea, JNI_ABORT); 555b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood return length; 556b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood} 557b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 558f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void android_location_GpsLocationProvider_inject_time(JNIEnv* env, jobject obj, 559f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jlong time, jlong timeReference, jint uncertainty) 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 56158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 56258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsInterface->inject_time(time, timeReference, uncertainty); 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 565d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwoodstatic void android_location_GpsLocationProvider_inject_location(JNIEnv* env, jobject obj, 566d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood jdouble latitude, jdouble longitude, jfloat accuracy) 567d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood{ 56858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 56958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsInterface->inject_location(latitude, longitude, accuracy); 570d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood} 571d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_location_GpsLocationProvider_supports_xtra(JNIEnv* env, jobject obj) 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (sGpsXtraInterface != NULL); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic void android_location_GpsLocationProvider_inject_xtra_data(JNIEnv* env, jobject obj, 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray data, jint length) 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 58058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sGpsXtraInterface) { 5813762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no XTRA interface in inject_xtra_data"); 58258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood return; 58358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood } 58458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 585f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jbyte* bytes = (jbyte *)env->GetPrimitiveArrayCritical(data, 0); 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sGpsXtraInterface->inject_xtra_data((char *)bytes, length); 587f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->ReleasePrimitiveArrayCritical(data, bytes, JNI_ABORT); 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 590e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic void android_location_GpsLocationProvider_agps_data_conn_open(JNIEnv* env, jobject obj, jstring apn) 591105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project{ 59258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsInterface) { 5933762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no AGPS interface in agps_data_conn_open"); 594bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 595105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 596bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (apn == NULL) { 597bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 598bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 599105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 600bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood const char *apnStr = env->GetStringUTFChars(apn, NULL); 60158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface->data_conn_open(apnStr); 602bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood env->ReleaseStringUTFChars(apn, apnStr); 603105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project} 604105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 605e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic void android_location_GpsLocationProvider_agps_data_conn_closed(JNIEnv* env, jobject obj) 606105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project{ 60758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsInterface) { 608160c1ca11702137dc8a760c529a25bd6e765fb83Magnus Eriksson ALOGE("no AGPS interface in agps_data_conn_closed"); 609bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 61058bda987665af759c379cd494ff4873ac61acf29Mike Lockwood } 61158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface->data_conn_closed(); 61258bda987665af759c379cd494ff4873ac61acf29Mike Lockwood} 61358bda987665af759c379cd494ff4873ac61acf29Mike Lockwood 614e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic void android_location_GpsLocationProvider_agps_data_conn_failed(JNIEnv* env, jobject obj) 61558bda987665af759c379cd494ff4873ac61acf29Mike Lockwood{ 61658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsInterface) { 617160c1ca11702137dc8a760c529a25bd6e765fb83Magnus Eriksson ALOGE("no AGPS interface in agps_data_conn_failed"); 618bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 61958bda987665af759c379cd494ff4873ac61acf29Mike Lockwood } 62058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface->data_conn_failed(); 62158bda987665af759c379cd494ff4873ac61acf29Mike Lockwood} 62258bda987665af759c379cd494ff4873ac61acf29Mike Lockwood 623e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic void android_location_GpsLocationProvider_set_agps_server(JNIEnv* env, jobject obj, 624a9e546169b3c2c9c5f248d2f3abe3b934f48695dMike Lockwood jint type, jstring hostname, jint port) 62558bda987665af759c379cd494ff4873ac61acf29Mike Lockwood{ 62658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsInterface) { 627160c1ca11702137dc8a760c529a25bd6e765fb83Magnus Eriksson ALOGE("no AGPS interface in set_agps_server"); 628bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 629105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 630bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood const char *c_hostname = env->GetStringUTFChars(hostname, NULL); 63158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface->set_server(type, c_hostname, port); 632bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood env->ReleaseStringUTFChars(hostname, c_hostname); 633105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project} 634105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 63522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic void android_location_GpsLocationProvider_send_ni_response(JNIEnv* env, jobject obj, 63622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie jint notifId, jint response) 63722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie{ 63858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sGpsNiInterface) { 6393762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no NI interface in send_ni_response"); 640bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 6413c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger } 642bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 64358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsNiInterface->respond(notifId, response); 6443c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger} 6453c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger 6463c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettingerstatic jstring android_location_GpsLocationProvider_get_internal_state(JNIEnv* env, jobject obj) 6473c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger{ 6483c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger jstring result = NULL; 6493c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger if (sGpsDebugInterface) { 6503c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger const size_t maxLength = 2047; 6513c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger char buffer[maxLength+1]; 6523c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger size_t length = sGpsDebugInterface->get_internal_state(buffer, maxLength); 6533c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger if (length > maxLength) length = maxLength; 6543c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger buffer[length] = 0; 6553c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger result = env->NewStringUTF(buffer); 6563c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger } 6573c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger return result; 65822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie} 65922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 66050130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwoodstatic void android_location_GpsLocationProvider_update_network_state(JNIEnv* env, jobject obj, 661a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang jboolean connected, int type, jboolean roaming, jboolean available, jstring extraInfo, jstring apn) 66250130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood{ 66358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 66458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sAGpsRilInterface && sAGpsRilInterface->update_network_state) { 66550130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood if (extraInfo) { 66650130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood const char *extraInfoStr = env->GetStringUTFChars(extraInfo, NULL); 66758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->update_network_state(connected, type, roaming, extraInfoStr); 66850130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood env->ReleaseStringUTFChars(extraInfo, extraInfoStr); 66950130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood } else { 67058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->update_network_state(connected, type, roaming, NULL); 67150130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood } 672a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang 673a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang // update_network_availability callback was not included in original AGpsRilInterface 674a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang if (sAGpsRilInterface->size >= sizeof(AGpsRilInterface) 675a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang && sAGpsRilInterface->update_network_availability) { 676a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang const char *c_apn = env->GetStringUTFChars(apn, NULL); 677a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang sAGpsRilInterface->update_network_availability(available, c_apn); 678a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang env->ReleaseStringUTFChars(apn, c_apn); 679a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang } 68050130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood } 68150130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood} 68250130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood 6838ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jboolean android_location_GpsLocationProvider_is_geofence_supported(JNIEnv* env, 6848ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jobject obj) { 6858ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (sGpsGeofencingInterface != NULL) { 6868ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_TRUE; 6878ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 6888ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_FALSE; 6898ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh} 6908ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 6918ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jboolean android_location_GpsLocationProvider_add_geofence(JNIEnv* env, jobject obj, 6928ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jint geofence_id, jdouble latitude, jdouble longitude, jdouble radius, 6938ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jint last_transition, jint monitor_transition, jint notification_responsiveness, 6948ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jint unknown_timer) { 6958ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (sGpsGeofencingInterface != NULL) { 6968ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh sGpsGeofencingInterface->add_geofence_area(geofence_id, latitude, longitude, 6978ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh radius, last_transition, monitor_transition, notification_responsiveness, 6988ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh unknown_timer); 6998ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_TRUE; 7008ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } else { 7018ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGE("Geofence interface not available"); 7028ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 7038ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_FALSE; 7048ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh} 7058ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 7068ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jboolean android_location_GpsLocationProvider_remove_geofence(JNIEnv* env, jobject obj, 7078ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jint geofence_id) { 7088ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (sGpsGeofencingInterface != NULL) { 7098ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh sGpsGeofencingInterface->remove_geofence_area(geofence_id); 7108ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_TRUE; 7118ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } else { 7128ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGE("Geofence interface not available"); 7138ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 7148ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_FALSE; 7158ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh} 7168ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 7178ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jboolean android_location_GpsLocationProvider_pause_geofence(JNIEnv* env, jobject obj, 7188ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jint geofence_id) { 7198ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (sGpsGeofencingInterface != NULL) { 7208ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh sGpsGeofencingInterface->pause_geofence(geofence_id); 7218ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_TRUE; 7228ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } else { 7238ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGE("Geofence interface not available"); 7248ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 7258ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_FALSE; 7268ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh} 7278ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 7288ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jboolean android_location_GpsLocationProvider_resume_geofence(JNIEnv* env, jobject obj, 7298ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jint geofence_id, jint monitor_transition) { 7308ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (sGpsGeofencingInterface != NULL) { 7318ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh sGpsGeofencingInterface->resume_geofence(geofence_id, monitor_transition); 7328ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_TRUE; 7338ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } else { 7348ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGE("Geofence interface not available"); 7358ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 7368ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_FALSE; 7378ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh} 7388ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod sMethods[] = { 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"class_init_native", "()V", (void *)android_location_GpsLocationProvider_class_init_native}, 742e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_is_supported", "()Z", (void*)android_location_GpsLocationProvider_is_supported}, 743e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_init", "()Z", (void*)android_location_GpsLocationProvider_init}, 744e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_cleanup", "()V", (void*)android_location_GpsLocationProvider_cleanup}, 74504598b67a58fad93e5060bb77756ba4863013aedMike Lockwood {"native_set_position_mode", "(IIIII)Z", (void*)android_location_GpsLocationProvider_set_position_mode}, 74604598b67a58fad93e5060bb77756ba4863013aedMike Lockwood {"native_start", "()Z", (void*)android_location_GpsLocationProvider_start}, 747e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_stop", "()Z", (void*)android_location_GpsLocationProvider_stop}, 748e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_delete_aiding_data", "(I)V", (void*)android_location_GpsLocationProvider_delete_aiding_data}, 749e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_read_sv_status", "([I[F[F[F[I)I", (void*)android_location_GpsLocationProvider_read_sv_status}, 750f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood {"native_read_nmea", "([BI)I", (void*)android_location_GpsLocationProvider_read_nmea}, 751e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_inject_time", "(JJI)V", (void*)android_location_GpsLocationProvider_inject_time}, 752d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood {"native_inject_location", "(DDF)V", (void*)android_location_GpsLocationProvider_inject_location}, 753e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_supports_xtra", "()Z", (void*)android_location_GpsLocationProvider_supports_xtra}, 754e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_inject_xtra_data", "([BI)V", (void*)android_location_GpsLocationProvider_inject_xtra_data}, 755e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_agps_data_conn_open", "(Ljava/lang/String;)V", (void*)android_location_GpsLocationProvider_agps_data_conn_open}, 756e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_agps_data_conn_closed", "()V", (void*)android_location_GpsLocationProvider_agps_data_conn_closed}, 757e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_agps_data_conn_failed", "()V", (void*)android_location_GpsLocationProvider_agps_data_conn_failed}, 7581e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja {"native_agps_set_id","(ILjava/lang/String;)V",(void*)android_location_GpsLocationProvider_agps_set_id}, 7591e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja {"native_agps_set_ref_location_cellid","(IIIII)V",(void*)android_location_GpsLocationProvider_agps_set_reference_location_cellid}, 760a9e546169b3c2c9c5f248d2f3abe3b934f48695dMike Lockwood {"native_set_agps_server", "(ILjava/lang/String;I)V", (void*)android_location_GpsLocationProvider_set_agps_server}, 76122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie {"native_send_ni_response", "(II)V", (void*)android_location_GpsLocationProvider_send_ni_response}, 7621e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja {"native_agps_ni_message", "([BI)V", (void *)android_location_GpsLocationProvider_agps_send_ni_message}, 7633c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger {"native_get_internal_state", "()Ljava/lang/String;", (void*)android_location_GpsLocationProvider_get_internal_state}, 764a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang {"native_update_network_state", "(ZIZZLjava/lang/String;Ljava/lang/String;)V", (void*)android_location_GpsLocationProvider_update_network_state }, 7658ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh {"native_is_geofence_supported", "()Z", (void*) android_location_GpsLocationProvider_is_geofence_supported}, 7668ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh {"native_add_geofence", "(IDDDIIII)Z", (void *)android_location_GpsLocationProvider_add_geofence}, 7678ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh {"native_remove_geofence", "(I)Z", (void *)android_location_GpsLocationProvider_remove_geofence}, 7688ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh {"native_pause_geofence", "(I)Z", (void *)android_location_GpsLocationProvider_pause_geofence}, 7698ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh {"native_resume_geofence", "(II)Z", (void *)android_location_GpsLocationProvider_resume_geofence} 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 77200b74270c9f136a8727c5f6cda0997a3a905f385Mike Lockwoodint register_android_server_location_GpsLocationProvider(JNIEnv* env) 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 77400b74270c9f136a8727c5f6cda0997a3a905f385Mike Lockwood return jniRegisterNativeMethods(env, "com/android/server/location/GpsLocationProvider", sMethods, NELEM(sMethods)); 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} /* namespace android */ 778