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 31931a37f992c738ebc5d3c82e424d94591798a4d7destradaa#include <arpa/inet.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h> 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <pthread.h> 3496a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa#include <linux/in.h> 3596a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa#include <linux/in6.h> 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic jobject mCallbacksObj = NULL; 38f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID method_reportLocation; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID method_reportStatus; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID method_reportSvStatus; 42e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic jmethodID method_reportAGpsStatus; 43b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwoodstatic jmethodID method_reportNmea; 4404598b67a58fad93e5060bb77756ba4863013aedMike Lockwoodstatic jmethodID method_setEngineCapabilities; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID method_xtraDownloadRequest; 4622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic jmethodID method_reportNiNotification; 471e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic jmethodID method_requestRefLocation; 481e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic jmethodID method_requestSetID; 499b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwoodstatic jmethodID method_requestUtcTime; 508ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jmethodID method_reportGeofenceTransition; 518ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jmethodID method_reportGeofenceStatus; 528ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jmethodID method_reportGeofenceAddStatus; 538ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jmethodID method_reportGeofenceRemoveStatus; 548ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jmethodID method_reportGeofencePauseStatus; 558ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jmethodID method_reportGeofenceResumeStatus; 56ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaastatic jmethodID method_reportMeasurementData; 574b3e3931270f8e406fc806bc7fa1c2788256687ddestradaastatic jmethodID method_reportNavigationMessages; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const GpsInterface* sGpsInterface = NULL; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const GpsXtraInterface* sGpsXtraInterface = NULL; 61e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic const AGpsInterface* sAGpsInterface = NULL; 6222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic const GpsNiInterface* sGpsNiInterface = NULL; 633c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettingerstatic const GpsDebugInterface* sGpsDebugInterface = NULL; 641e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic const AGpsRilInterface* sAGpsRilInterface = NULL; 658ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic const GpsGeofencingInterface* sGpsGeofencingInterface = NULL; 66ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaastatic const GpsMeasurementInterface* sGpsMeasurementInterface = NULL; 674b3e3931270f8e406fc806bc7fa1c2788256687ddestradaastatic const GpsNavigationMessageInterface* sGpsNavigationMessageInterface = NULL; 6852617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chenstatic const GnssConfigurationInterface* sGnssConfigurationInterface = NULL; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 70f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood// temporary storage for GPS callbacks 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic GpsSvStatus sGpsSvStatus; 72f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic const char* sNmeaString; 73f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic int sNmeaStringLength; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 758f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood#define WAKE_LOCK_NAME "GPS" 768f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 79f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { 80f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (env->ExceptionCheck()) { 813762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("An exception was thrown by callback '%s'.", methodName); 82f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood LOGE_EX(env); 83f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->ExceptionClear(); 84f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood } 85f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood} 86f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void location_callback(GpsLocation* location) 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 89f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 90f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportLocation, location->flags, 91f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood (jdouble)location->latitude, (jdouble)location->longitude, 92f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood (jdouble)location->altitude, 93f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood (jfloat)location->speed, (jfloat)location->bearing, 94f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood (jfloat)location->accuracy, (jlong)location->timestamp); 95f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void status_callback(GpsStatus* status) 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 100f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 101f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportStatus, status->status); 102f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void sv_status_callback(GpsSvStatus* sv_status) 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 107f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 108f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood memcpy(&sGpsSvStatus, sv_status, sizeof(sGpsSvStatus)); 109f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportSvStatus); 110f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 113b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwoodstatic void nmea_callback(GpsUtcTime timestamp, const char* nmea, int length) 114b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood{ 115f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 116f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood // The Java code will call back to read these values 117f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood // We do this to avoid creating unnecessary String objects 118f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood sNmeaString = nmea; 119f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood sNmeaStringLength = length; 120f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportNmea, timestamp); 121f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 122b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood} 123b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 12404598b67a58fad93e5060bb77756ba4863013aedMike Lockwoodstatic void set_capabilities_callback(uint32_t capabilities) 12504598b67a58fad93e5060bb77756ba4863013aedMike Lockwood{ 1268ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGD("set_capabilities_callback: %du\n", capabilities); 127f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 128f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_setEngineCapabilities, capabilities); 129f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 13004598b67a58fad93e5060bb77756ba4863013aedMike Lockwood} 13104598b67a58fad93e5060bb77756ba4863013aedMike Lockwood 1328f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwoodstatic void acquire_wakelock_callback() 1338f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood{ 1348f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_NAME); 1358f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood} 1368f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood 1378f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwoodstatic void release_wakelock_callback() 1388f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood{ 1398f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood release_wake_lock(WAKE_LOCK_NAME); 1408f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood} 1418f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood 1429b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwoodstatic void request_utc_time_callback() 1439b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood{ 1449b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 1459b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_requestUtcTime); 1469b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 1479b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood} 1489b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood 149f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic pthread_t create_thread_callback(const char* name, void (*start)(void *), void* arg) 15058bda987665af759c379cd494ff4873ac61acf29Mike Lockwood{ 151f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood return (pthread_t)AndroidRuntime::createJavaThread(name, start, arg); 15258bda987665af759c379cd494ff4873ac61acf29Mike Lockwood} 15358bda987665af759c379cd494ff4873ac61acf29Mike Lockwood 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGpsCallbacks sGpsCallbacks = { 1558f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood sizeof(GpsCallbacks), 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project location_callback, 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_callback, 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sv_status_callback, 1598f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood nmea_callback, 16004598b67a58fad93e5060bb77756ba4863013aedMike Lockwood set_capabilities_callback, 1618f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood acquire_wakelock_callback, 1628f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood release_wakelock_callback, 163f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood create_thread_callback, 1649b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood request_utc_time_callback, 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 167f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void xtra_download_request_callback() 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 169f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 170f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_xtraDownloadRequest); 171f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 17222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie} 17322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGpsXtraCallbacks sGpsXtraCallbacks = { 175f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood xtra_download_request_callback, 176f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood create_thread_callback, 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17996a14701c0858ffa38b9488fae3b9a37a115cbf9destradaastatic jbyteArray convert_to_ipv4(uint32_t ip, bool net_order) 18096a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa{ 18196a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa if (INADDR_NONE == ip) { 18296a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa return NULL; 18396a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } 18496a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa 18596a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa JNIEnv* env = AndroidRuntime::getJNIEnv(); 18696a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa jbyteArray byteArray = env->NewByteArray(4); 18796a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa if (byteArray == NULL) { 18896a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa ALOGE("Unable to allocate byte array for IPv4 address"); 18996a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa return NULL; 19096a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } 19196a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa 19296a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa jbyte ipv4[4]; 19396a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa if (net_order) { 194931a37f992c738ebc5d3c82e424d94591798a4d7destradaa ALOGV("Converting IPv4 address(net_order) %x", ip); 19596a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa memcpy(ipv4, &ip, sizeof(ipv4)); 19696a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } else { 197931a37f992c738ebc5d3c82e424d94591798a4d7destradaa ALOGV("Converting IPv4 address(host_order) %x", ip); 19896a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa //endianess transparent conversion from int to char[] 19996a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa ipv4[0] = (jbyte) (ip & 0xFF); 20096a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa ipv4[1] = (jbyte)((ip>>8) & 0xFF); 20196a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa ipv4[2] = (jbyte)((ip>>16) & 0xFF); 20296a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa ipv4[3] = (jbyte) (ip>>24); 20396a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } 20496a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa 20596a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa env->SetByteArrayRegion(byteArray, 0, 4, (const jbyte*) ipv4); 20696a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa return byteArray; 20796a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa} 20896a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa 209f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void agps_status_callback(AGpsStatus* agps_status) 210f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood{ 211f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 21296a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa jbyteArray byteArray = NULL; 21396a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa bool isSupported = false; 21496a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa 21596a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa size_t status_size = agps_status->size; 21696a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa if (status_size == sizeof(AGpsStatus_v3)) { 217931a37f992c738ebc5d3c82e424d94591798a4d7destradaa ALOGV("AGpsStatus is V3: %d", status_size); 21896a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa switch (agps_status->addr.ss_family) 21996a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa { 22096a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa case AF_INET: 22196a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa { 22296a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa struct sockaddr_in *in = (struct sockaddr_in*)&(agps_status->addr); 22396a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa uint32_t *pAddr = (uint32_t*)&(in->sin_addr); 22496a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa byteArray = convert_to_ipv4(*pAddr, true /* net_order */); 22596a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa if (byteArray != NULL) { 22696a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa isSupported = true; 22796a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } 228931a37f992c738ebc5d3c82e424d94591798a4d7destradaa IF_ALOGD() { 229931a37f992c738ebc5d3c82e424d94591798a4d7destradaa // log the IP for reference in case there is a bogus value pushed by HAL 230931a37f992c738ebc5d3c82e424d94591798a4d7destradaa char str[INET_ADDRSTRLEN]; 231931a37f992c738ebc5d3c82e424d94591798a4d7destradaa inet_ntop(AF_INET, &(in->sin_addr), str, INET_ADDRSTRLEN); 232931a37f992c738ebc5d3c82e424d94591798a4d7destradaa ALOGD("AGPS IP is v4: %s", str); 233931a37f992c738ebc5d3c82e424d94591798a4d7destradaa } 23496a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } 23596a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa break; 23696a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa case AF_INET6: 23796a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa { 23896a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa struct sockaddr_in6 *in6 = (struct sockaddr_in6*)&(agps_status->addr); 23996a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa byteArray = env->NewByteArray(16); 24096a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa if (byteArray != NULL) { 24196a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa env->SetByteArrayRegion(byteArray, 0, 16, (const jbyte *)&(in6->sin6_addr)); 24296a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa isSupported = true; 24396a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } else { 24496a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa ALOGE("Unable to allocate byte array for IPv6 address."); 24596a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } 246931a37f992c738ebc5d3c82e424d94591798a4d7destradaa IF_ALOGD() { 247931a37f992c738ebc5d3c82e424d94591798a4d7destradaa // log the IP for reference in case there is a bogus value pushed by HAL 248931a37f992c738ebc5d3c82e424d94591798a4d7destradaa char str[INET6_ADDRSTRLEN]; 249931a37f992c738ebc5d3c82e424d94591798a4d7destradaa inet_ntop(AF_INET6, &(in6->sin6_addr), str, INET6_ADDRSTRLEN); 250931a37f992c738ebc5d3c82e424d94591798a4d7destradaa ALOGD("AGPS IP is v6: %s", str); 251931a37f992c738ebc5d3c82e424d94591798a4d7destradaa } 25296a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } 25396a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa break; 25496a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa default: 25596a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa ALOGE("Invalid ss_family found: %d", agps_status->addr.ss_family); 25696a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa break; 25796a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } 25896a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } else if (status_size >= sizeof(AGpsStatus_v2)) { 259931a37f992c738ebc5d3c82e424d94591798a4d7destradaa ALOGV("AGpsStatus is V2+: %d", status_size); 26096a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa // for back-compatibility reasons we check in v2 that the data structure size is greater or 26196a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa // equal to the declared size in gps.h 26296a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa uint32_t ipaddr = agps_status->ipaddr; 263931a37f992c738ebc5d3c82e424d94591798a4d7destradaa ALOGV("AGPS IP is v4: %x", ipaddr); 26496a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa byteArray = convert_to_ipv4(ipaddr, false /* net_order */); 26596a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa if (ipaddr == INADDR_NONE || byteArray != NULL) { 26696a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa isSupported = true; 26796a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } 26896a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } else if (status_size >= sizeof(AGpsStatus_v1)) { 269931a37f992c738ebc5d3c82e424d94591798a4d7destradaa ALOGV("AGpsStatus is V1+: %d", status_size); 27096a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa // because we have to check for >= with regards to v2, we also need to relax the check here 27196a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa // and only make sure that the size is at least what we expect 27296a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa isSupported = true; 27396a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } else { 27496a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa ALOGE("Invalid size of AGpsStatus found: %d.", status_size); 27596a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } 2768efd74dbedb65f69734318d9d6be70767f30b57aStephen Li 27796a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa if (isSupported) { 278931a37f992c738ebc5d3c82e424d94591798a4d7destradaa jsize byteArrayLength = byteArray != NULL ? env->GetArrayLength(byteArray) : 0; 279931a37f992c738ebc5d3c82e424d94591798a4d7destradaa ALOGV("Passing AGPS IP addr: size %d", byteArrayLength); 28096a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa env->CallVoidMethod(mCallbacksObj, method_reportAGpsStatus, agps_status->type, 28196a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa agps_status->status, byteArray); 28296a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa 28396a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa checkAndClearExceptionFromCallback(env, __FUNCTION__); 28496a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } else { 28596a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa ALOGD("Skipping calling method_reportAGpsStatus."); 28696a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } 28796a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa 28896a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa if (byteArray) { 28996a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa env->DeleteLocalRef(byteArray); 29096a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } 291f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood} 292f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 293e3635c9693c4cd9650684f14e19dcabcea0d488aMike LockwoodAGpsCallbacks sAGpsCallbacks = { 294e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood agps_status_callback, 295f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood create_thread_callback, 29658bda987665af759c379cd494ff4873ac61acf29Mike Lockwood}; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 298f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void gps_ni_notify_callback(GpsNiNotification *notification) 299f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood{ 3005baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("gps_ni_notify_callback\n"); 301f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 302f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jstring requestor_id = env->NewStringUTF(notification->requestor_id); 303f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jstring text = env->NewStringUTF(notification->text); 304f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jstring extras = env->NewStringUTF(notification->extras); 305f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 306f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (requestor_id && text && extras) { 307f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportNiNotification, 308f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->notification_id, notification->ni_type, 309f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->notify_flags, notification->timeout, 310f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->default_response, requestor_id, text, 311f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->requestor_id_encoding, 312f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->text_encoding, extras); 313f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood } else { 3143762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("out of memory in gps_ni_notify_callback\n"); 315f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood } 316f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 317f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (requestor_id) 318f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->DeleteLocalRef(requestor_id); 319f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (text) 320f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->DeleteLocalRef(text); 321f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (extras) 322f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->DeleteLocalRef(extras); 323f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 324f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood} 325f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 32622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke XieGpsNiCallbacks sGpsNiCallbacks = { 32722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie gps_ni_notify_callback, 328f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood create_thread_callback, 32922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie}; 33022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 3311e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void agps_request_set_id(uint32_t flags) 3321e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 3331e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja JNIEnv* env = AndroidRuntime::getJNIEnv(); 3341e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja env->CallVoidMethod(mCallbacksObj, method_requestSetID, flags); 3351e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja checkAndClearExceptionFromCallback(env, __FUNCTION__); 3361e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 3371e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 3381e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void agps_request_ref_location(uint32_t flags) 3391e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 3401e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja JNIEnv* env = AndroidRuntime::getJNIEnv(); 3411e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja env->CallVoidMethod(mCallbacksObj, method_requestRefLocation, flags); 3421e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja checkAndClearExceptionFromCallback(env, __FUNCTION__); 3431e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 3441e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 3451e84da822e7aa4d494b31c8759917d2751611f84Miguel TorrojaAGpsRilCallbacks sAGpsRilCallbacks = { 3461e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja agps_request_set_id, 3471e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja agps_request_ref_location, 3481e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja create_thread_callback, 3491e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja}; 3501e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 3518ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic void gps_geofence_transition_callback(int32_t geofence_id, GpsLocation* location, 3528ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh int32_t transition, GpsUtcTime timestamp) 3538ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh{ 3548ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh JNIEnv* env = AndroidRuntime::getJNIEnv(); 3558ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 3568ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh env->CallVoidMethod(mCallbacksObj, method_reportGeofenceTransition, geofence_id, 3578ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh location->flags, (jdouble)location->latitude, (jdouble)location->longitude, 3588ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh (jdouble)location->altitude, 3598ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh (jfloat)location->speed, (jfloat)location->bearing, 3608ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh (jfloat)location->accuracy, (jlong)location->timestamp, 3618ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh transition, timestamp); 3628ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkAndClearExceptionFromCallback(env, __FUNCTION__); 3638ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh}; 3648ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 3658ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic void gps_geofence_status_callback(int32_t status, GpsLocation* location) 3668ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh{ 3678ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh JNIEnv* env = AndroidRuntime::getJNIEnv(); 3688ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jint flags = 0; 3698ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jdouble latitude = 0; 3708ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jdouble longitude = 0; 3718ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jdouble altitude = 0; 3728ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jfloat speed = 0; 3738ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jfloat bearing = 0; 3748ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jfloat accuracy = 0; 3758ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jlong timestamp = 0; 3768ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (location != NULL) { 3778ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh flags = location->flags; 3788ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh latitude = location->latitude; 3798ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh longitude = location->longitude; 3808ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh altitude = location->altitude; 3818ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh speed = location->speed; 3828ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh bearing = location->bearing; 3838ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh accuracy = location->accuracy; 3848ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh timestamp = location->timestamp; 3858ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 3868ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 3878ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh env->CallVoidMethod(mCallbacksObj, method_reportGeofenceStatus, status, 3888ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh flags, latitude, longitude, altitude, speed, bearing, accuracy, timestamp); 3898ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkAndClearExceptionFromCallback(env, __FUNCTION__); 3908ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh}; 3918ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 3928ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic void gps_geofence_add_callback(int32_t geofence_id, int32_t status) 3938ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh{ 3948ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh JNIEnv* env = AndroidRuntime::getJNIEnv(); 3958ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (status != GPS_GEOFENCE_OPERATION_SUCCESS) { 3968ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGE("Error in geofence_add_callback: %d\n", status); 3978ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 3988ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh env->CallVoidMethod(mCallbacksObj, method_reportGeofenceAddStatus, geofence_id, status); 3998ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkAndClearExceptionFromCallback(env, __FUNCTION__); 4008ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh}; 4018ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 4028ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic void gps_geofence_remove_callback(int32_t geofence_id, int32_t status) 4038ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh{ 4048ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh JNIEnv* env = AndroidRuntime::getJNIEnv(); 4058ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (status != GPS_GEOFENCE_OPERATION_SUCCESS) { 4068ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGE("Error in geofence_remove_callback: %d\n", status); 4078ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 4088ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh env->CallVoidMethod(mCallbacksObj, method_reportGeofenceRemoveStatus, geofence_id, status); 4098ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkAndClearExceptionFromCallback(env, __FUNCTION__); 4108ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh}; 4118ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 4128ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic void gps_geofence_resume_callback(int32_t geofence_id, int32_t status) 4138ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh{ 4148ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh JNIEnv* env = AndroidRuntime::getJNIEnv(); 4158ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (status != GPS_GEOFENCE_OPERATION_SUCCESS) { 4168ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGE("Error in geofence_resume_callback: %d\n", status); 4178ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 4188ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh env->CallVoidMethod(mCallbacksObj, method_reportGeofenceResumeStatus, geofence_id, status); 4198ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkAndClearExceptionFromCallback(env, __FUNCTION__); 4208ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh}; 4218ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 4228ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic void gps_geofence_pause_callback(int32_t geofence_id, int32_t status) 4238ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh{ 4248ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh JNIEnv* env = AndroidRuntime::getJNIEnv(); 4258ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (status != GPS_GEOFENCE_OPERATION_SUCCESS) { 4268ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGE("Error in geofence_pause_callback: %d\n", status); 4278ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 4288ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh env->CallVoidMethod(mCallbacksObj, method_reportGeofencePauseStatus, geofence_id, status); 4298ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkAndClearExceptionFromCallback(env, __FUNCTION__); 4308ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh}; 4318ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 4328ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar GaneshGpsGeofenceCallbacks sGpsGeofenceCallbacks = { 4338ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh gps_geofence_transition_callback, 4348ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh gps_geofence_status_callback, 4358ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh gps_geofence_add_callback, 4368ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh gps_geofence_remove_callback, 4378ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh gps_geofence_pause_callback, 4388ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh gps_geofence_resume_callback, 4398ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh create_thread_callback, 4408ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh}; 4418ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 44258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwoodstatic void android_location_GpsLocationProvider_class_init_native(JNIEnv* env, jclass clazz) { 443b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood int err; 444b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood hw_module_t* module; 445bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 446bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportLocation = env->GetMethodID(clazz, "reportLocation", "(IDDDFFFJ)V"); 447bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportStatus = env->GetMethodID(clazz, "reportStatus", "(I)V"); 448bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportSvStatus = env->GetMethodID(clazz, "reportSvStatus", "()V"); 44996a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa method_reportAGpsStatus = env->GetMethodID(clazz, "reportAGpsStatus", "(II[B)V"); 450bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportNmea = env->GetMethodID(clazz, "reportNmea", "(J)V"); 451bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_setEngineCapabilities = env->GetMethodID(clazz, "setEngineCapabilities", "(I)V"); 452bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_xtraDownloadRequest = env->GetMethodID(clazz, "xtraDownloadRequest", "()V"); 45358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood method_reportNiNotification = env->GetMethodID(clazz, "reportNiNotification", 45458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood "(IIIIILjava/lang/String;Ljava/lang/String;IILjava/lang/String;)V"); 455bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_requestRefLocation = env->GetMethodID(clazz,"requestRefLocation","(I)V"); 456bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_requestSetID = env->GetMethodID(clazz,"requestSetID","(I)V"); 4579b9fb5cc08eaa0b66a80eba2f03168531544f65aMike Lockwood method_requestUtcTime = env->GetMethodID(clazz,"requestUtcTime","()V"); 4588ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh method_reportGeofenceTransition = env->GetMethodID(clazz,"reportGeofenceTransition", 4598ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "(IIDDDFFFJIJ)V"); 4608ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh method_reportGeofenceStatus = env->GetMethodID(clazz,"reportGeofenceStatus", 4618ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "(IIDDDFFFJ)V"); 4628ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh method_reportGeofenceAddStatus = env->GetMethodID(clazz,"reportGeofenceAddStatus", 4638ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "(II)V"); 4648ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh method_reportGeofenceRemoveStatus = env->GetMethodID(clazz,"reportGeofenceRemoveStatus", 4658ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "(II)V"); 4668ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh method_reportGeofenceResumeStatus = env->GetMethodID(clazz,"reportGeofenceResumeStatus", 4678ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "(II)V"); 4688ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh method_reportGeofencePauseStatus = env->GetMethodID(clazz,"reportGeofencePauseStatus", 4698ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "(II)V"); 470ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa method_reportMeasurementData = env->GetMethodID( 471ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa clazz, 472ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "reportMeasurementData", 473ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "(Landroid/location/GpsMeasurementsEvent;)V"); 4744b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa method_reportNavigationMessages = env->GetMethodID( 4754b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa clazz, 4764b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa "reportNavigationMessage", 4774b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa "(Landroid/location/GpsNavigationMessageEvent;)V"); 47858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 47958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood err = hw_get_module(GPS_HARDWARE_MODULE_ID, (hw_module_t const**)&module); 48058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (err == 0) { 48158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood hw_device_t* device; 48258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood err = module->methods->open(module, GPS_HARDWARE_MODULE_ID, &device); 48358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (err == 0) { 48458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood gps_device_t* gps_device = (gps_device_t *)device; 48558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsInterface = gps_device->get_gps_interface(gps_device); 48658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood } 48758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood } 48858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) { 48958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsXtraInterface = 49058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood (const GpsXtraInterface*)sGpsInterface->get_extension(GPS_XTRA_INTERFACE); 49158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface = 49258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood (const AGpsInterface*)sGpsInterface->get_extension(AGPS_INTERFACE); 49358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsNiInterface = 49458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood (const GpsNiInterface*)sGpsInterface->get_extension(GPS_NI_INTERFACE); 49558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsDebugInterface = 49658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood (const GpsDebugInterface*)sGpsInterface->get_extension(GPS_DEBUG_INTERFACE); 49758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface = 49858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood (const AGpsRilInterface*)sGpsInterface->get_extension(AGPS_RIL_INTERFACE); 4998ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh sGpsGeofencingInterface = 5008ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh (const GpsGeofencingInterface*)sGpsInterface->get_extension(GPS_GEOFENCING_INTERFACE); 501ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa sGpsMeasurementInterface = 502ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (const GpsMeasurementInterface*)sGpsInterface->get_extension(GPS_MEASUREMENT_INTERFACE); 5034b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa sGpsNavigationMessageInterface = 5044b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa (const GpsNavigationMessageInterface*)sGpsInterface->get_extension( 5054b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa GPS_NAVIGATION_MESSAGE_INTERFACE); 50652617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen sGnssConfigurationInterface = 50752617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen (const GnssConfigurationInterface*)sGpsInterface->get_extension( 50852617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen GNSS_CONFIGURATION_INTERFACE); 50958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood } 510bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood} 511bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_location_GpsLocationProvider_is_supported(JNIEnv* env, jclass clazz) { 5137e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat if (sGpsInterface != NULL) { 5147e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return JNI_TRUE; 5157e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat } else { 5167e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return JNI_FALSE; 5177e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj) 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 52258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood // this must be set before calling into the HAL library 52358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!mCallbacksObj) 52458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood mCallbacksObj = env->NewGlobalRef(obj); 52558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 52658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood // fail if the main interface fails to initialize 52758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sGpsInterface || sGpsInterface->init(&sGpsCallbacks) != 0) 5287e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return JNI_FALSE; 52958bda987665af759c379cd494ff4873ac61acf29Mike Lockwood 5308ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh // if XTRA initialization fails we will disable it by sGpsXtraInterface to NULL, 53158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood // but continue to allow the rest of the GPS interface to work. 53258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsXtraInterface && sGpsXtraInterface->init(&sGpsXtraCallbacks) != 0) 53358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsXtraInterface = NULL; 53458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sAGpsInterface) 53558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface->init(&sAGpsCallbacks); 53658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsNiInterface) 53758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsNiInterface->init(&sGpsNiCallbacks); 53858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sAGpsRilInterface) 53958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->init(&sAGpsRilCallbacks); 5408ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (sGpsGeofencingInterface) 5418ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh sGpsGeofencingInterface->init(&sGpsGeofenceCallbacks); 5423c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger 54387d6cd4537d2e42d54804f003784ea5945231ac1Narayan Kamath return JNI_TRUE; 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_location_GpsLocationProvider_cleanup(JNIEnv* env, jobject obj) 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 54858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 54958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsInterface->cleanup(); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55204598b67a58fad93e5060bb77756ba4863013aedMike Lockwoodstatic jboolean android_location_GpsLocationProvider_set_position_mode(JNIEnv* env, jobject obj, 55304598b67a58fad93e5060bb77756ba4863013aedMike Lockwood jint mode, jint recurrence, jint min_interval, jint preferred_accuracy, jint preferred_time) 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5557e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat if (sGpsInterface) { 5567e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat if (sGpsInterface->set_position_mode(mode, recurrence, min_interval, preferred_accuracy, 5577e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat preferred_time) == 0) { 5587e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return JNI_TRUE; 5597e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat } else { 5607e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return JNI_FALSE; 5617e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat } 5627e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat } 5634270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood else 5647e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return JNI_FALSE; 56504598b67a58fad93e5060bb77756ba4863013aedMike Lockwood} 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 56704598b67a58fad93e5060bb77756ba4863013aedMike Lockwoodstatic jboolean android_location_GpsLocationProvider_start(JNIEnv* env, jobject obj) 56804598b67a58fad93e5060bb77756ba4863013aedMike Lockwood{ 5697e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat if (sGpsInterface) { 5707e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat if (sGpsInterface->start() == 0) { 5717e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return JNI_TRUE; 5727e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat } else { 5737e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return JNI_FALSE; 5747e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat } 5757e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat } 5764270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood else 5777e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return JNI_FALSE; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_location_GpsLocationProvider_stop(JNIEnv* env, jobject obj) 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5827e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat if (sGpsInterface) { 5837e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat if (sGpsInterface->stop() == 0) { 5847e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return JNI_TRUE; 5857e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat } else { 5867e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return JNI_FALSE; 5877e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat } 5887e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat } 5894270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood else 5907e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return JNI_FALSE; 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_location_GpsLocationProvider_delete_aiding_data(JNIEnv* env, jobject obj, jint flags) 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 59558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 59658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsInterface->delete_aiding_data(flags); 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 59922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic jint android_location_GpsLocationProvider_read_sv_status(JNIEnv* env, jobject obj, 60022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie jintArray prnArray, jfloatArray snrArray, jfloatArray elevArray, jfloatArray azumArray, 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jintArray maskArray) 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 603f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood // this should only be called from within a call to reportSvStatus 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* prns = env->GetIntArrayElements(prnArray, 0); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloat* snrs = env->GetFloatArrayElements(snrArray, 0); 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloat* elev = env->GetFloatArrayElements(elevArray, 0); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloat* azim = env->GetFloatArrayElements(azumArray, 0); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* mask = env->GetIntArrayElements(maskArray, 0); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 611f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood int num_svs = sGpsSvStatus.num_svs; 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < num_svs; i++) { 613f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood prns[i] = sGpsSvStatus.sv_list[i].prn; 614f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood snrs[i] = sGpsSvStatus.sv_list[i].snr; 615f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood elev[i] = sGpsSvStatus.sv_list[i].elevation; 616f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood azim[i] = sGpsSvStatus.sv_list[i].azimuth; 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 618f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood mask[0] = sGpsSvStatus.ephemeris_mask; 619f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood mask[1] = sGpsSvStatus.almanac_mask; 620f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood mask[2] = sGpsSvStatus.used_in_fix_mask; 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseIntArrayElements(prnArray, prns, 0); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseFloatArrayElements(snrArray, snrs, 0); 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseFloatArrayElements(elevArray, elev, 0); 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseFloatArrayElements(azumArray, azim, 0); 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseIntArrayElements(maskArray, mask, 0); 6277e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return (jint) num_svs; 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6301e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void android_location_GpsLocationProvider_agps_set_reference_location_cellid(JNIEnv* env, 6311e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja jobject obj, jint type, jint mcc, jint mnc, jint lac, jint cid) 6321e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 6331e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja AGpsRefLocation location; 63458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 63558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsRilInterface) { 6363762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no AGPS RIL interface in agps_set_reference_location_cellid"); 6371e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 638bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood } 639bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 6401e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja switch(type) { 6411e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja case AGPS_REF_LOCATION_TYPE_GSM_CELLID: 6421e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja case AGPS_REF_LOCATION_TYPE_UMTS_CELLID: 6431e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.type = type; 6441e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.u.cellID.mcc = mcc; 6451e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.u.cellID.mnc = mnc; 6461e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.u.cellID.lac = lac; 6471e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.u.cellID.cid = cid; 6481e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja break; 6491e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja default: 6503762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Neither a GSM nor a UMTS cellid (%s:%d).",__FUNCTION__,__LINE__); 6511e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 6521e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja break; 6531e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja } 65458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->set_ref_location(&location, sizeof(location)); 6551e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 6561e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 6571e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void android_location_GpsLocationProvider_agps_send_ni_message(JNIEnv* env, 6581e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja jobject obj, jbyteArray ni_msg, jint size) 6591e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 6601e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja size_t sz; 66158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 66258ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsRilInterface) { 6633762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no AGPS RIL interface in send_ni_message"); 6641e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 665bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood } 6661e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja if (size < 0) 6671e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 6681e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja sz = (size_t)size; 6691e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja jbyte* b = env->GetByteArrayElements(ni_msg, 0); 67058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->ni_message((uint8_t *)b,sz); 6711e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja env->ReleaseByteArrayElements(ni_msg,b,0); 6721e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 6731e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 6741e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void android_location_GpsLocationProvider_agps_set_id(JNIEnv *env, 6751e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja jobject obj, jint type, jstring setid_string) 6761e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 67758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsRilInterface) { 6783762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no AGPS RIL interface in agps_set_id"); 6791e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 680bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood } 6811e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 6821e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja const char *setid = env->GetStringUTFChars(setid_string, NULL); 68358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->set_set_id(type, setid); 6841e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja env->ReleaseStringUTFChars(setid_string, setid); 6851e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 6861e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 687f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic jint android_location_GpsLocationProvider_read_nmea(JNIEnv* env, jobject obj, 688f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jbyteArray nmeaArray, jint buffer_size) 689b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood{ 690f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood // this should only be called from within a call to reportNmea 691f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jbyte* nmea = (jbyte *)env->GetPrimitiveArrayCritical(nmeaArray, 0); 692f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood int length = sNmeaStringLength; 693b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood if (length > buffer_size) 694b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood length = buffer_size; 695f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood memcpy(nmea, sNmeaString, length); 696f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->ReleasePrimitiveArrayCritical(nmeaArray, nmea, JNI_ABORT); 6977e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return (jint) length; 698b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood} 699b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 700f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void android_location_GpsLocationProvider_inject_time(JNIEnv* env, jobject obj, 701f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jlong time, jlong timeReference, jint uncertainty) 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 70358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 70458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsInterface->inject_time(time, timeReference, uncertainty); 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 707d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwoodstatic void android_location_GpsLocationProvider_inject_location(JNIEnv* env, jobject obj, 708d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood jdouble latitude, jdouble longitude, jfloat accuracy) 709d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood{ 71058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sGpsInterface) 71158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsInterface->inject_location(latitude, longitude, accuracy); 712d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood} 713d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_location_GpsLocationProvider_supports_xtra(JNIEnv* env, jobject obj) 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7167e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat if (sGpsXtraInterface != NULL) { 7177e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return JNI_TRUE; 7187e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat } else { 7197e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return JNI_FALSE; 7207e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat } 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 72322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic void android_location_GpsLocationProvider_inject_xtra_data(JNIEnv* env, jobject obj, 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray data, jint length) 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 72658ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sGpsXtraInterface) { 7273762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no XTRA interface in inject_xtra_data"); 72858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood return; 72958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood } 73058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 731f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jbyte* bytes = (jbyte *)env->GetPrimitiveArrayCritical(data, 0); 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sGpsXtraInterface->inject_xtra_data((char *)bytes, length); 733f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->ReleasePrimitiveArrayCritical(data, bytes, JNI_ABORT); 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73696a14701c0858ffa38b9488fae3b9a37a115cbf9destradaastatic void android_location_GpsLocationProvider_agps_data_conn_open( 73796a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa JNIEnv* env, jobject obj, jstring apn, jint apnIpType) 738105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project{ 73958ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsInterface) { 7403762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no AGPS interface in agps_data_conn_open"); 741bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 742105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 743bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (apn == NULL) { 744bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 745bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 746105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 74796a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa 748bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood const char *apnStr = env->GetStringUTFChars(apn, NULL); 74996a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa 75096a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa size_t interface_size = sAGpsInterface->size; 75196a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa if (interface_size == sizeof(AGpsInterface_v2)) { 75296a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa sAGpsInterface->data_conn_open_with_apn_ip_type(apnStr, apnIpType); 75396a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } else if (interface_size == sizeof(AGpsInterface_v1)) { 75496a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa sAGpsInterface->data_conn_open(apnStr); 75596a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } else { 75696a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa ALOGE("Invalid size of AGpsInterface found: %d.", interface_size); 75796a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa } 75896a14701c0858ffa38b9488fae3b9a37a115cbf9destradaa 759bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood env->ReleaseStringUTFChars(apn, apnStr); 760105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project} 761105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 762e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic void android_location_GpsLocationProvider_agps_data_conn_closed(JNIEnv* env, jobject obj) 763105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project{ 76458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsInterface) { 765160c1ca11702137dc8a760c529a25bd6e765fb83Magnus Eriksson ALOGE("no AGPS interface in agps_data_conn_closed"); 766bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 76758bda987665af759c379cd494ff4873ac61acf29Mike Lockwood } 76858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface->data_conn_closed(); 76958bda987665af759c379cd494ff4873ac61acf29Mike Lockwood} 77058bda987665af759c379cd494ff4873ac61acf29Mike Lockwood 771e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic void android_location_GpsLocationProvider_agps_data_conn_failed(JNIEnv* env, jobject obj) 77258bda987665af759c379cd494ff4873ac61acf29Mike Lockwood{ 77358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsInterface) { 774160c1ca11702137dc8a760c529a25bd6e765fb83Magnus Eriksson ALOGE("no AGPS interface in agps_data_conn_failed"); 775bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 77658bda987665af759c379cd494ff4873ac61acf29Mike Lockwood } 77758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface->data_conn_failed(); 77858bda987665af759c379cd494ff4873ac61acf29Mike Lockwood} 77958bda987665af759c379cd494ff4873ac61acf29Mike Lockwood 780e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic void android_location_GpsLocationProvider_set_agps_server(JNIEnv* env, jobject obj, 781a9e546169b3c2c9c5f248d2f3abe3b934f48695dMike Lockwood jint type, jstring hostname, jint port) 78258bda987665af759c379cd494ff4873ac61acf29Mike Lockwood{ 78358ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sAGpsInterface) { 784160c1ca11702137dc8a760c529a25bd6e765fb83Magnus Eriksson ALOGE("no AGPS interface in set_agps_server"); 785bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 786105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 787bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood const char *c_hostname = env->GetStringUTFChars(hostname, NULL); 78858ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsInterface->set_server(type, c_hostname, port); 789bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood env->ReleaseStringUTFChars(hostname, c_hostname); 790105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project} 791105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 79222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic void android_location_GpsLocationProvider_send_ni_response(JNIEnv* env, jobject obj, 79322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie jint notifId, jint response) 79422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie{ 79558ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (!sGpsNiInterface) { 7963762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("no NI interface in send_ni_response"); 797bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 7983c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger } 799bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 80058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sGpsNiInterface->respond(notifId, response); 8013c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger} 8023c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger 8033c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettingerstatic jstring android_location_GpsLocationProvider_get_internal_state(JNIEnv* env, jobject obj) 8043c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger{ 8053c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger jstring result = NULL; 8063c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger if (sGpsDebugInterface) { 8073c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger const size_t maxLength = 2047; 8083c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger char buffer[maxLength+1]; 8093c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger size_t length = sGpsDebugInterface->get_internal_state(buffer, maxLength); 8103c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger if (length > maxLength) length = maxLength; 8113c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger buffer[length] = 0; 8123c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger result = env->NewStringUTF(buffer); 8133c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger } 8143c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger return result; 81522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie} 81622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 81750130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwoodstatic void android_location_GpsLocationProvider_update_network_state(JNIEnv* env, jobject obj, 8187e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat jboolean connected, jint type, jboolean roaming, jboolean available, jstring extraInfo, jstring apn) 81950130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood{ 82058ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood 82158ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood if (sAGpsRilInterface && sAGpsRilInterface->update_network_state) { 82250130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood if (extraInfo) { 82350130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood const char *extraInfoStr = env->GetStringUTFChars(extraInfo, NULL); 82458ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->update_network_state(connected, type, roaming, extraInfoStr); 82550130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood env->ReleaseStringUTFChars(extraInfo, extraInfoStr); 82650130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood } else { 82758ec34cef5a37d51d42cf63308e972d6d8676196Mike Lockwood sAGpsRilInterface->update_network_state(connected, type, roaming, NULL); 82850130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood } 829a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang 830a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang // update_network_availability callback was not included in original AGpsRilInterface 831a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang if (sAGpsRilInterface->size >= sizeof(AGpsRilInterface) 832a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang && sAGpsRilInterface->update_network_availability) { 833a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang const char *c_apn = env->GetStringUTFChars(apn, NULL); 834a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang sAGpsRilInterface->update_network_availability(available, c_apn); 835a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang env->ReleaseStringUTFChars(apn, c_apn); 836a5fe6b2efee02ab11c35e80ec50fec62be227273Kevin Tang } 83750130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood } 83850130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood} 83950130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood 8408ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jboolean android_location_GpsLocationProvider_is_geofence_supported(JNIEnv* env, 8418ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jobject obj) { 8428ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (sGpsGeofencingInterface != NULL) { 8438ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_TRUE; 8448ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 8458ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_FALSE; 8468ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh} 8478ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 8488ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jboolean android_location_GpsLocationProvider_add_geofence(JNIEnv* env, jobject obj, 8498ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jint geofence_id, jdouble latitude, jdouble longitude, jdouble radius, 8508ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jint last_transition, jint monitor_transition, jint notification_responsiveness, 8518ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jint unknown_timer) { 8528ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (sGpsGeofencingInterface != NULL) { 8538ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh sGpsGeofencingInterface->add_geofence_area(geofence_id, latitude, longitude, 8548ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh radius, last_transition, monitor_transition, notification_responsiveness, 8558ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh unknown_timer); 8568ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_TRUE; 8578ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } else { 8588ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGE("Geofence interface not available"); 8598ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 8608ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_FALSE; 8618ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh} 8628ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 8638ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jboolean android_location_GpsLocationProvider_remove_geofence(JNIEnv* env, jobject obj, 8648ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jint geofence_id) { 8658ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (sGpsGeofencingInterface != NULL) { 8668ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh sGpsGeofencingInterface->remove_geofence_area(geofence_id); 8678ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_TRUE; 8688ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } else { 8698ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGE("Geofence interface not available"); 8708ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 8718ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_FALSE; 8728ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh} 8738ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 8748ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jboolean android_location_GpsLocationProvider_pause_geofence(JNIEnv* env, jobject obj, 8758ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jint geofence_id) { 8768ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (sGpsGeofencingInterface != NULL) { 8778ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh sGpsGeofencingInterface->pause_geofence(geofence_id); 8788ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_TRUE; 8798ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } else { 8808ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGE("Geofence interface not available"); 8818ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 8828ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_FALSE; 8838ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh} 8848ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 8858ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshstatic jboolean android_location_GpsLocationProvider_resume_geofence(JNIEnv* env, jobject obj, 8868ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh jint geofence_id, jint monitor_transition) { 8878ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (sGpsGeofencingInterface != NULL) { 8888ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh sGpsGeofencingInterface->resume_geofence(geofence_id, monitor_transition); 8898ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_TRUE; 8908ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } else { 8918ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh ALOGE("Geofence interface not available"); 8928ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 8938ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return JNI_FALSE; 8948ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh} 8958ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 896ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaastatic jobject translate_gps_clock(JNIEnv* env, GpsClock* clock) { 897ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa const char* doubleSignature = "(D)V"; 8982102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa const char* longSignature = "(J)V"; 899ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 900ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jclass gpsClockClass = env->FindClass("android/location/GpsClock"); 901ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID gpsClockCtor = env->GetMethodID(gpsClockClass, "<init>", "()V"); 902ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 903ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jobject gpsClockObject = env->NewObject(gpsClockClass, gpsClockCtor); 904ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa GpsClockFlags flags = clock->flags; 905ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 906ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_CLOCK_HAS_LEAP_SECOND) { 907ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID setterMethod = env->GetMethodID(gpsClockClass, "setLeapSecond", "(S)V"); 90852617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsClockObject, setterMethod, clock->leap_second); 909ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 910ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 9112102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID typeSetterMethod = env->GetMethodID(gpsClockClass, "setType", "(B)V"); 91252617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsClockObject, typeSetterMethod, clock->type); 9132102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa 9142102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID setterMethod = env->GetMethodID(gpsClockClass, "setTimeInNs", longSignature); 91552617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsClockObject, setterMethod, clock->time_ns); 916ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 917ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_CLOCK_HAS_TIME_UNCERTAINTY) { 9182102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID setterMethod = 9192102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa env->GetMethodID(gpsClockClass, "setTimeUncertaintyInNs", doubleSignature); 92052617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsClockObject, setterMethod, clock->time_uncertainty_ns); 921ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 922ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 9232102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa if (flags & GPS_CLOCK_HAS_FULL_BIAS) { 9242102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID setterMethod = env->GetMethodID(gpsClockClass, "setFullBiasInNs", longSignature); 92552617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsClockObject, setterMethod, clock->full_bias_ns); 9262102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa } 9272102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa 928ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_CLOCK_HAS_BIAS) { 929ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID setterMethod = env->GetMethodID(gpsClockClass, "setBiasInNs", doubleSignature); 93052617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsClockObject, setterMethod, clock->bias_ns); 931ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 932ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 933ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_CLOCK_HAS_BIAS_UNCERTAINTY) { 9342102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID setterMethod = 9352102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa env->GetMethodID(gpsClockClass, "setBiasUncertaintyInNs", doubleSignature); 93652617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsClockObject, setterMethod, clock->bias_uncertainty_ns); 937ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 938ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 939ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_CLOCK_HAS_DRIFT) { 9402102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID setterMethod = 9412102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa env->GetMethodID(gpsClockClass, "setDriftInNsPerSec", doubleSignature); 94252617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsClockObject, setterMethod, clock->drift_nsps); 943ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 944ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 945ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_CLOCK_HAS_DRIFT_UNCERTAINTY) { 9462102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID setterMethod = 9472102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa env->GetMethodID(gpsClockClass, "setDriftUncertaintyInNsPerSec", doubleSignature); 94852617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsClockObject, setterMethod, clock->drift_uncertainty_nsps); 949ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 950ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 95152617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->DeleteLocalRef(gpsClockClass); 952ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return gpsClockObject; 953ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa} 954ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 9552102dd725540bcf51bf324a2775fbcffe45dd32fdestradaastatic jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measurement) { 9562102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa const char* byteSignature = "(B)V"; 957ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa const char* shortSignature = "(S)V"; 95852617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen const char* intSignature = "(I)V"; 959ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa const char* longSignature = "(J)V"; 960ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa const char* floatSignature = "(F)V"; 961ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa const char* doubleSignature = "(D)V"; 962ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 963ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jclass gpsMeasurementClass = env->FindClass("android/location/GpsMeasurement"); 964ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID gpsMeasurementCtor = env->GetMethodID(gpsMeasurementClass, "<init>", "()V"); 965ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 966ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jobject gpsMeasurementObject = env->NewObject(gpsMeasurementClass, gpsMeasurementCtor); 967ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa GpsMeasurementFlags flags = measurement->flags; 968ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 9692102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID prnSetterMethod = env->GetMethodID(gpsMeasurementClass, "setPrn", byteSignature); 97052617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsMeasurementObject, prnSetterMethod, measurement->prn); 971ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 9722102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID timeOffsetSetterMethod = 9732102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa env->GetMethodID(gpsMeasurementClass, "setTimeOffsetInNs", doubleSignature); 97452617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod( 975ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementObject, 9762102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa timeOffsetSetterMethod, 9772102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa measurement->time_offset_ns); 9782102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa 9792102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID stateSetterMethod = env->GetMethodID(gpsMeasurementClass, "setState", shortSignature); 98052617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsMeasurementObject, stateSetterMethod, measurement->state); 981ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 982ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID receivedGpsTowSetterMethod = 983ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa env->GetMethodID(gpsMeasurementClass, "setReceivedGpsTowInNs", longSignature); 98452617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod( 985ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementObject, 986ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa receivedGpsTowSetterMethod, 987ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa measurement->received_gps_tow_ns); 988ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 98981cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa jmethodID receivedGpsTowUncertaintySetterMethod = env->GetMethodID( 99081cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa gpsMeasurementClass, 99181cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa "setReceivedGpsTowUncertaintyInNs", 99281cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa longSignature); 99381cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa env->CallVoidMethod( 99481cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa gpsMeasurementObject, 99581cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa receivedGpsTowUncertaintySetterMethod, 99681cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa measurement->received_gps_tow_uncertainty_ns); 99781cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa 9982102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID cn0SetterMethod = 9992102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa env->GetMethodID(gpsMeasurementClass, "setCn0InDbHz", doubleSignature); 100052617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsMeasurementObject, cn0SetterMethod, measurement->c_n0_dbhz); 1001ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1002ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID pseudorangeRateSetterMethod = env->GetMethodID( 1003ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementClass, 1004ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "setPseudorangeRateInMetersPerSec", 1005ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa doubleSignature); 100652617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod( 1007ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementObject, 1008ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa pseudorangeRateSetterMethod, 10092102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa measurement->pseudorange_rate_mps); 1010ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1011ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID pseudorangeRateUncertaintySetterMethod = env->GetMethodID( 1012ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementClass, 1013ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "setPseudorangeRateUncertaintyInMetersPerSec", 1014ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa doubleSignature); 101552617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod( 1016ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementObject, 1017ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa pseudorangeRateUncertaintySetterMethod, 10182102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa measurement->pseudorange_rate_uncertainty_mps); 10192102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa 10202102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID accumulatedDeltaRangeStateSetterMethod = 10212102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa env->GetMethodID(gpsMeasurementClass, "setAccumulatedDeltaRangeState", shortSignature); 102252617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod( 10232102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa gpsMeasurementObject, 10242102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa accumulatedDeltaRangeStateSetterMethod, 10252102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa measurement->accumulated_delta_range_state); 1026ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1027ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID accumulatedDeltaRangeSetterMethod = env->GetMethodID( 1028ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementClass, 1029ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "setAccumulatedDeltaRangeInMeters", 1030ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa doubleSignature); 1031ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa env->CallVoidMethod( 1032ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementObject, 1033ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa accumulatedDeltaRangeSetterMethod, 1034ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa measurement->accumulated_delta_range_m); 1035ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1036ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID accumulatedDeltaRangeUncertaintySetterMethod = env->GetMethodID( 1037ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementClass, 1038ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "setAccumulatedDeltaRangeUncertaintyInMeters", 1039ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa doubleSignature); 1040ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa env->CallVoidMethod( 1041ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementObject, 1042ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa accumulatedDeltaRangeUncertaintySetterMethod, 1043ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa measurement->accumulated_delta_range_uncertainty_m); 1044ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1045ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_PSEUDORANGE) { 10462102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID setterMethod = 10472102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa env->GetMethodID(gpsMeasurementClass, "setPseudorangeInMeters", doubleSignature); 104852617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->pseudorange_m); 1049ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1050ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1051ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_PSEUDORANGE_UNCERTAINTY) { 1052ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID setterMethod = env->GetMethodID( 1053ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementClass, 1054ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "setPseudorangeUncertaintyInMeters", 1055ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa doubleSignature); 105652617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod( 1057ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementObject, 1058ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa setterMethod, 1059ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa measurement->pseudorange_uncertainty_m); 1060ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1061ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1062ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_CODE_PHASE) { 10632102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID setterMethod = 10642102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa env->GetMethodID(gpsMeasurementClass, "setCodePhaseInChips", doubleSignature); 106552617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->code_phase_chips); 1066ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1067ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1068ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_CODE_PHASE_UNCERTAINTY) { 1069ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID setterMethod = env->GetMethodID( 1070ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementClass, 1071ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "setCodePhaseUncertaintyInChips", 1072ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa doubleSignature); 107352617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod( 1074ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementObject, 1075ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa setterMethod, 1076ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa measurement->code_phase_uncertainty_chips); 1077ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1078ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1079ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_CARRIER_FREQUENCY) { 10802102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID setterMethod = 10812102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa env->GetMethodID(gpsMeasurementClass, "setCarrierFrequencyInHz", floatSignature); 108252617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod( 1083ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementObject, 1084ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa setterMethod, 1085ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa measurement->carrier_frequency_hz); 1086ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1087ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1088ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_CARRIER_CYCLES) { 1089ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID setterMethod = 1090ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa env->GetMethodID(gpsMeasurementClass, "setCarrierCycles", longSignature); 109152617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->carrier_cycles); 1092ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1093ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1094ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_CARRIER_PHASE) { 1095ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID setterMethod = 1096ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa env->GetMethodID(gpsMeasurementClass, "setCarrierPhase", doubleSignature); 109752617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->carrier_phase); 1098ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1099ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1100ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_CARRIER_PHASE_UNCERTAINTY) { 1101ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID setterMethod = env->GetMethodID( 1102ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementClass, 1103ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "setCarrierPhaseUncertainty", 1104ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa doubleSignature); 110552617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod( 1106ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementObject, 1107ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa setterMethod, 1108ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa measurement->carrier_phase_uncertainty); 1109ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1110ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1111ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID lossOfLockSetterMethod = 11122102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa env->GetMethodID(gpsMeasurementClass, "setLossOfLock", byteSignature); 111352617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsMeasurementObject, lossOfLockSetterMethod, measurement->loss_of_lock); 1114ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1115ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_BIT_NUMBER) { 11162102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID setterMethod = 111752617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->GetMethodID(gpsMeasurementClass, "setBitNumber", intSignature); 111852617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->bit_number); 1119ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1120ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1121ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_TIME_FROM_LAST_BIT) { 11222102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID setterMethod = 11232102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa env->GetMethodID(gpsMeasurementClass, "setTimeFromLastBitInMs", shortSignature); 112452617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod( 1125ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementObject, 1126ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa setterMethod, 11272102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa measurement->time_from_last_bit_ms); 1128ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1129ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1130ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_DOPPLER_SHIFT) { 11312102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID setterMethod = 11322102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa env->GetMethodID(gpsMeasurementClass, "setDopplerShiftInHz", doubleSignature); 113352617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->doppler_shift_hz); 1134ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1135ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1136ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_DOPPLER_SHIFT_UNCERTAINTY) { 1137ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID setterMethod = env->GetMethodID( 1138ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementClass, 1139ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "setDopplerShiftUncertaintyInHz", 1140ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa doubleSignature); 114152617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod( 1142ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementObject, 1143ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa setterMethod, 1144ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa measurement->doppler_shift_uncertainty_hz); 1145ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1146ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 11472102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID multipathIndicatorSetterMethod = 11482102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa env->GetMethodID(gpsMeasurementClass, "setMultipathIndicator", byteSignature); 114952617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod( 1150ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementObject, 1151ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa multipathIndicatorSetterMethod, 1152ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa measurement->multipath_indicator); 1153ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1154ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_SNR) { 1155ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID setterMethod = 1156ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa env->GetMethodID(gpsMeasurementClass, "setSnrInDb", doubleSignature); 115752617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->snr_db); 1158ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1159ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1160ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_ELEVATION) { 11612102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID setterMethod = 11622102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa env->GetMethodID(gpsMeasurementClass, "setElevationInDeg", doubleSignature); 116352617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->elevation_deg); 1164ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1165ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1166ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_ELEVATION_UNCERTAINTY) { 11672102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jmethodID setterMethod = 11682102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa env->GetMethodID(gpsMeasurementClass, "setElevationUncertaintyInDeg", doubleSignature); 116952617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod( 1170ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementObject, 1171ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa setterMethod, 1172ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa measurement->elevation_uncertainty_deg); 1173ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1174ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1175ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_AZIMUTH) { 1176ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID setterMethod = 1177ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa env->GetMethodID(gpsMeasurementClass, "setAzimuthInDeg", doubleSignature); 117852617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->azimuth_deg); 1179ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1180ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1181ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (flags & GPS_MEASUREMENT_HAS_AZIMUTH_UNCERTAINTY) { 1182ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID setterMethod = env->GetMethodID( 1183ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementClass, 1184ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "setAzimuthUncertaintyInDeg", 1185ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa doubleSignature); 118652617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod( 1187ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementObject, 1188ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa setterMethod, 1189ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa measurement->azimuth_uncertainty_deg); 1190ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1191ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1192ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID usedInFixSetterMethod = env->GetMethodID(gpsMeasurementClass, "setUsedInFix", "(Z)V"); 119352617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->CallVoidMethod( 1194ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementObject, 1195ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa usedInFixSetterMethod, 1196ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (flags & GPS_MEASUREMENT_HAS_USED_IN_FIX) && measurement->used_in_fix); 1197ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1198df1198401101805a335535dd08231cbb0e2af500destradaa env->DeleteLocalRef(gpsMeasurementClass); 1199ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return gpsMeasurementObject; 1200ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa} 1201ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1202ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaastatic jobjectArray translate_gps_measurements(JNIEnv* env, GpsData* data) { 1203ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa size_t measurementCount = data->measurement_count; 1204ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (measurementCount == 0) { 1205ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return NULL; 1206ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1207ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1208ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jclass gpsMeasurementClass = env->FindClass("android/location/GpsMeasurement"); 1209ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jobjectArray gpsMeasurementArray = env->NewObjectArray( 1210ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa measurementCount, 1211ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementClass, 1212ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa NULL /* initialElement */); 1213ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1214ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa GpsMeasurement* gpsMeasurements = data->measurements; 1215ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa for (uint16_t i = 0; i < measurementCount; ++i) { 12162102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa jobject gpsMeasurement = translate_gps_measurement(env, &gpsMeasurements[i]); 1217ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa env->SetObjectArrayElement(gpsMeasurementArray, i, gpsMeasurement); 1218ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa env->DeleteLocalRef(gpsMeasurement); 1219ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1220ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1221ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa env->DeleteLocalRef(gpsMeasurementClass); 1222ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return gpsMeasurementArray; 1223ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa} 1224ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1225ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaastatic void measurement_callback(GpsData* data) { 1226ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa JNIEnv* env = AndroidRuntime::getJNIEnv(); 1227ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (data == NULL) { 1228ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa ALOGE("Invalid data provided to gps_measurement_callback"); 1229ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return; 1230ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1231ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1232ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (data->size == sizeof(GpsData)) { 1233ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jobject gpsClock = translate_gps_clock(env, &data->clock); 1234ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jobjectArray measurementArray = translate_gps_measurements(env, data); 1235ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1236ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jclass gpsMeasurementsEventClass = env->FindClass("android/location/GpsMeasurementsEvent"); 1237ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jmethodID gpsMeasurementsEventCtor = env->GetMethodID( 1238ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementsEventClass, 1239ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "<init>", 1240ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "(Landroid/location/GpsClock;[Landroid/location/GpsMeasurement;)V"); 1241ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1242ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jobject gpsMeasurementsEvent = env->NewObject( 1243ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementsEventClass, 1244ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsMeasurementsEventCtor, 1245ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa gpsClock, 1246ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa measurementArray); 1247ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1248ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa env->CallVoidMethod(mCallbacksObj, method_reportMeasurementData, gpsMeasurementsEvent); 1249ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa checkAndClearExceptionFromCallback(env, __FUNCTION__); 125052617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen 125152617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->DeleteLocalRef(gpsClock); 125252617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->DeleteLocalRef(measurementArray); 125352617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->DeleteLocalRef(gpsMeasurementsEventClass); 125452617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->DeleteLocalRef(gpsMeasurementsEvent); 1255ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } else { 1256ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa ALOGE("Invalid GpsData size found in gps_measurement_callback, size=%d", data->size); 1257ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1258ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa} 1259ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1260ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaGpsMeasurementCallbacks sGpsMeasurementCallbacks = { 1261ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa sizeof(GpsMeasurementCallbacks), 1262ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa measurement_callback, 1263ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa}; 1264ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1265ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaastatic jboolean android_location_GpsLocationProvider_is_measurement_supported( 1266ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa JNIEnv* env, 12674b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jclass clazz) { 1268ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (sGpsMeasurementInterface != NULL) { 1269ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return JNI_TRUE; 1270ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1271ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return JNI_FALSE; 1272ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa} 1273ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1274ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaastatic jboolean android_location_GpsLocationProvider_start_measurement_collection( 1275ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa JNIEnv* env, 1276ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jobject obj) { 1277ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (sGpsMeasurementInterface == NULL) { 1278ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa ALOGE("Measurement interface is not available."); 1279ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return JNI_FALSE; 1280ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1281ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1282ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa int result = sGpsMeasurementInterface->init(&sGpsMeasurementCallbacks); 1283ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (result != GPS_GEOFENCE_OPERATION_SUCCESS) { 1284ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa ALOGE("An error has been found on GpsMeasurementInterface::init, status=%d", result); 1285ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return JNI_FALSE; 1286ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1287ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1288ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return JNI_TRUE; 1289ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa} 1290ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1291ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaastatic jboolean android_location_GpsLocationProvider_stop_measurement_collection( 1292ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa JNIEnv* env, 1293ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa jobject obj) { 1294ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (sGpsMeasurementInterface == NULL) { 1295ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa ALOGE("Measurement interface not available"); 1296ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return JNI_FALSE; 1297ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 1298ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1299ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa sGpsMeasurementInterface->close(); 1300ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return JNI_TRUE; 1301ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa} 1302ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 13034b3e3931270f8e406fc806bc7fa1c2788256687ddestradaastatic jobject translate_gps_navigation_message(JNIEnv* env, GpsNavigationMessage* message) { 13044b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa size_t dataLength = message->data_length; 13054b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa uint8_t* data = message->data; 13064b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa if (dataLength == 0 || data == NULL) { 13074b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa ALOGE("Invalid Navigation Message found: data=%p, length=%d", data, dataLength); 13084b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa return NULL; 13094b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa } 13104b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 13114b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jclass navigationMessageClass = env->FindClass("android/location/GpsNavigationMessage"); 13124b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jmethodID navigationMessageCtor = env->GetMethodID(navigationMessageClass, "<init>", "()V"); 13134b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jobject navigationMessageObject = env->NewObject(navigationMessageClass, navigationMessageCtor); 13144b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 13154b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jmethodID setTypeMethod = env->GetMethodID(navigationMessageClass, "setType", "(B)V"); 13164b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa env->CallVoidMethod(navigationMessageObject, setTypeMethod, message->type); 13174b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 13184b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jmethodID setPrnMethod = env->GetMethodID(navigationMessageClass, "setPrn", "(B)V"); 13194b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa env->CallVoidMethod(navigationMessageObject, setPrnMethod, message->prn); 13204b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 13214b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jmethodID setMessageIdMethod = env->GetMethodID(navigationMessageClass, "setMessageId", "(S)V"); 13224b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa env->CallVoidMethod(navigationMessageObject, setMessageIdMethod, message->message_id); 13234b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 13244b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jmethodID setSubmessageIdMethod = 13254b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa env->GetMethodID(navigationMessageClass, "setSubmessageId", "(S)V"); 13264b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa env->CallVoidMethod(navigationMessageObject, setSubmessageIdMethod, message->submessage_id); 13274b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 13284b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jbyteArray dataArray = env->NewByteArray(dataLength); 13294b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa env->SetByteArrayRegion(dataArray, 0, dataLength, (jbyte*) data); 13304b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jmethodID setDataMethod = env->GetMethodID(navigationMessageClass, "setData", "([B)V"); 13314b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa env->CallVoidMethod(navigationMessageObject, setDataMethod, dataArray); 13324b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 133352617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->DeleteLocalRef(navigationMessageClass); 133452617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->DeleteLocalRef(dataArray); 13354b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa return navigationMessageObject; 13364b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa} 13374b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 13384b3e3931270f8e406fc806bc7fa1c2788256687ddestradaastatic void navigation_message_callback(GpsNavigationMessage* message) { 13394b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa JNIEnv* env = AndroidRuntime::getJNIEnv(); 13404b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa if (message == NULL) { 13414b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa ALOGE("Invalid Navigation Message provided to callback"); 13424b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa return; 13434b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa } 13444b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 13454b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa if (message->size == sizeof(GpsNavigationMessage)) { 13464b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jobject navigationMessage = translate_gps_navigation_message(env, message); 13474b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 13484b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jclass navigationMessageEventClass = 13494b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa env->FindClass("android/location/GpsNavigationMessageEvent"); 13504b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jmethodID navigationMessageEventCtor = env->GetMethodID( 13514b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa navigationMessageEventClass, 13524b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa "<init>", 13534b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa "(Landroid/location/GpsNavigationMessage;)V"); 13544b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jobject navigationMessageEvent = env->NewObject( 13554b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa navigationMessageEventClass, 13564b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa navigationMessageEventCtor, 13574b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa navigationMessage); 13584b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 13594b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa env->CallVoidMethod(mCallbacksObj, method_reportNavigationMessages, navigationMessageEvent); 13604b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa checkAndClearExceptionFromCallback(env, __FUNCTION__); 136152617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen 136252617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->DeleteLocalRef(navigationMessage); 136352617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->DeleteLocalRef(navigationMessageEventClass); 136452617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->DeleteLocalRef(navigationMessageEvent); 13654b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa } else { 13664b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa ALOGE("Invalid GpsNavigationMessage size found: %d", message->size); 13674b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa } 13684b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa} 13694b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 13704b3e3931270f8e406fc806bc7fa1c2788256687ddestradaaGpsNavigationMessageCallbacks sGpsNavigationMessageCallbacks = { 13714b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa sizeof(GpsNavigationMessageCallbacks), 13724b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa navigation_message_callback, 13734b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa}; 13744b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 13754b3e3931270f8e406fc806bc7fa1c2788256687ddestradaastatic jboolean android_location_GpsLocationProvider_is_navigation_message_supported( 13764b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa JNIEnv* env, 13774b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jclass clazz) { 13784b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa if(sGpsNavigationMessageInterface != NULL) { 13794b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa return JNI_TRUE; 13804b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa } 13814b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa return JNI_FALSE; 13824b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa} 13834b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 13844b3e3931270f8e406fc806bc7fa1c2788256687ddestradaastatic jboolean android_location_GpsLocationProvider_start_navigation_message_collection( 13854b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa JNIEnv* env, 13864b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jobject obj) { 13874b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa if (sGpsNavigationMessageInterface == NULL) { 13884b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa ALOGE("Navigation Message interface is not available."); 13894b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa return JNI_FALSE; 13904b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa } 13914b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 13924b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa int result = sGpsNavigationMessageInterface->init(&sGpsNavigationMessageCallbacks); 13934b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa if (result != GPS_NAVIGATION_MESSAGE_OPERATION_SUCCESS) { 13944b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa ALOGE("An error has been found in %s: %d", __FUNCTION__, result); 13954b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa return JNI_FALSE; 13964b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa } 13974b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 13984b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa return JNI_TRUE; 13994b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa} 14004b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 14014b3e3931270f8e406fc806bc7fa1c2788256687ddestradaastatic jboolean android_location_GpsLocationProvider_stop_navigation_message_collection( 14024b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa JNIEnv* env, 14034b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa jobject obj) { 14044b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa if (sGpsNavigationMessageInterface == NULL) { 14054b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa ALOGE("Navigation Message interface is not available."); 14064b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa return JNI_FALSE; 14074b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa } 14084b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 14094b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa sGpsNavigationMessageInterface->close(); 14104b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa return JNI_TRUE; 14114b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa} 14124b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 141352617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chenstatic void android_location_GpsLocationProvider_configuration_update(JNIEnv* env, jobject obj, 141452617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen jstring config_content) 141552617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen{ 141652617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen if (!sGnssConfigurationInterface) { 141752617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen ALOGE("no GPS configuration interface in configuraiton_update"); 141852617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen return; 141952617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen } 142052617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen const char *data = env->GetStringUTFChars(config_content, NULL); 142152617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen ALOGD("GPS configuration:\n %s", data); 142252617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen sGnssConfigurationInterface->configuration_update( 142352617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen data, env->GetStringUTFLength(config_content)); 142452617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen env->ReleaseStringUTFChars(config_content, data); 142552617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen} 142652617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod sMethods[] = { 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"class_init_native", "()V", (void *)android_location_GpsLocationProvider_class_init_native}, 1430e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_is_supported", "()Z", (void*)android_location_GpsLocationProvider_is_supported}, 1431e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_init", "()Z", (void*)android_location_GpsLocationProvider_init}, 1432e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_cleanup", "()V", (void*)android_location_GpsLocationProvider_cleanup}, 1433ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_set_position_mode", 1434ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "(IIIII)Z", 1435ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*)android_location_GpsLocationProvider_set_position_mode}, 143604598b67a58fad93e5060bb77756ba4863013aedMike Lockwood {"native_start", "()Z", (void*)android_location_GpsLocationProvider_start}, 1437e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_stop", "()Z", (void*)android_location_GpsLocationProvider_stop}, 1438ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_delete_aiding_data", 1439ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "(I)V", 1440ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*)android_location_GpsLocationProvider_delete_aiding_data}, 1441ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_read_sv_status", 1442ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "([I[F[F[F[I)I", 1443ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*)android_location_GpsLocationProvider_read_sv_status}, 1444f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood {"native_read_nmea", "([BI)I", (void*)android_location_GpsLocationProvider_read_nmea}, 1445e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_inject_time", "(JJI)V", (void*)android_location_GpsLocationProvider_inject_time}, 1446ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_inject_location", 1447ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "(DDF)V", 1448ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*)android_location_GpsLocationProvider_inject_location}, 1449e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_supports_xtra", "()Z", (void*)android_location_GpsLocationProvider_supports_xtra}, 1450ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_inject_xtra_data", 1451ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "([BI)V", 1452ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*)android_location_GpsLocationProvider_inject_xtra_data}, 1453ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_agps_data_conn_open", 1454ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "(Ljava/lang/String;I)V", 1455ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*)android_location_GpsLocationProvider_agps_data_conn_open}, 1456ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_agps_data_conn_closed", 1457ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "()V", 1458ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*)android_location_GpsLocationProvider_agps_data_conn_closed}, 1459ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_agps_data_conn_failed", 1460ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "()V", 1461ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*)android_location_GpsLocationProvider_agps_data_conn_failed}, 1462ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_agps_set_id", 1463ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "(ILjava/lang/String;)V", 1464ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*)android_location_GpsLocationProvider_agps_set_id}, 1465ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_agps_set_ref_location_cellid", 1466ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "(IIIII)V", 1467ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*)android_location_GpsLocationProvider_agps_set_reference_location_cellid}, 1468ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_set_agps_server", 1469ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "(ILjava/lang/String;I)V", 1470ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*)android_location_GpsLocationProvider_set_agps_server}, 1471ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_send_ni_response", 1472ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "(II)V", 1473ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*)android_location_GpsLocationProvider_send_ni_response}, 1474ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_agps_ni_message", 1475ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "([BI)V", 1476ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void *)android_location_GpsLocationProvider_agps_send_ni_message}, 1477ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_get_internal_state", 1478ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "()Ljava/lang/String;", 1479ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*)android_location_GpsLocationProvider_get_internal_state}, 1480ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_update_network_state", 1481ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "(ZIZZLjava/lang/String;Ljava/lang/String;)V", 1482ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*)android_location_GpsLocationProvider_update_network_state }, 1483ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_is_geofence_supported", 1484ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "()Z", 1485ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*) android_location_GpsLocationProvider_is_geofence_supported}, 1486ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_add_geofence", 1487ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "(IDDDIIII)Z", 1488ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void *)android_location_GpsLocationProvider_add_geofence}, 1489ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_remove_geofence", 1490ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "(I)Z", 1491ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void *)android_location_GpsLocationProvider_remove_geofence}, 14928ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh {"native_pause_geofence", "(I)Z", (void *)android_location_GpsLocationProvider_pause_geofence}, 1493ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_resume_geofence", 1494ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "(II)Z", 1495ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void *)android_location_GpsLocationProvider_resume_geofence}, 1496ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_is_measurement_supported", 1497ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "()Z", 1498ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*) android_location_GpsLocationProvider_is_measurement_supported}, 1499ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_start_measurement_collection", 1500ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "()Z", 1501ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa (void*) android_location_GpsLocationProvider_start_measurement_collection}, 1502ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa {"native_stop_measurement_collection", 1503ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "()Z", 15044b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa (void*) android_location_GpsLocationProvider_stop_measurement_collection}, 15054b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa {"native_is_navigation_message_supported", 15064b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa "()Z", 15074b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa (void*) android_location_GpsLocationProvider_is_navigation_message_supported}, 15084b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa {"native_start_navigation_message_collection", 15094b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa "()Z", 15104b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa (void*) android_location_GpsLocationProvider_start_navigation_message_collection}, 15114b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa {"native_stop_navigation_message_collection", 15124b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa "()Z", 15134b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa (void*) android_location_GpsLocationProvider_stop_navigation_message_collection}, 151452617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen {"native_configuration_update", 151552617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen "(Ljava/lang/String;)V", 151652617bbff8607cdc208ba107ec111bd1471433cbTsuwei Chen (void*)android_location_GpsLocationProvider_configuration_update}, 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 151900b74270c9f136a8727c5f6cda0997a3a905f385Mike Lockwoodint register_android_server_location_GpsLocationProvider(JNIEnv* env) 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1521ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return jniRegisterNativeMethods( 1522ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa env, 1523ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "com/android/server/location/GpsLocationProvider", 1524ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa sMethods, 1525ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa NELEM(sMethods)); 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} /* namespace android */ 1529