Loading services/core/java/com/android/server/location/GnssLocationProvider.java +62 −61 Original line number Diff line number Diff line Loading @@ -180,9 +180,10 @@ public class GnssLocationProvider extends AbstractLocationProvider implements private static final int SET_REQUEST = 3; private static final int INJECT_NTP_TIME = 5; private static final int DOWNLOAD_XTRA_DATA = 6; // PSDS stands for Predicted Satellite Data Service private static final int DOWNLOAD_PSDS_DATA = 6; private static final int UPDATE_LOCATION = 7; // Handle external location from network listener private static final int DOWNLOAD_XTRA_DATA_FINISHED = 11; private static final int DOWNLOAD_PSDS_DATA_FINISHED = 11; private static final int SUBSCRIPTION_OR_CARRIER_CONFIG_CHANGED = 12; private static final int INITIALIZE_HANDLER = 13; private static final int REQUEST_LOCATION = 16; Loading Loading @@ -295,19 +296,19 @@ public class GnssLocationProvider extends AbstractLocationProvider implements // Typical hot TTTF is ~5 seconds, so 10 seconds seems sane. private static final int GPS_POLLING_THRESHOLD_INTERVAL = 10 * 1000; // how long to wait if we have a network error in NTP or XTRA downloading // how long to wait if we have a network error in NTP or PSDS downloading // the initial value of the exponential backoff // current setting - 5 minutes private static final long RETRY_INTERVAL = 5 * 60 * 1000; // how long to wait if we have a network error in NTP or XTRA downloading // how long to wait if we have a network error in NTP or PSDS downloading // the max value of the exponential backoff // current setting - 4 hours private static final long MAX_RETRY_INTERVAL = 4 * 60 * 60 * 1000; // Timeout when holding wakelocks for downloading XTRA data. private static final long DOWNLOAD_XTRA_DATA_TIMEOUT_MS = 60 * 1000; // Timeout when holding wakelocks for downloading PSDS data. private static final long DOWNLOAD_PSDS_DATA_TIMEOUT_MS = 60 * 1000; private final ExponentialBackOff mXtraBackOff = new ExponentialBackOff(RETRY_INTERVAL, private final ExponentialBackOff mPsdsBackOff = new ExponentialBackOff(RETRY_INTERVAL, MAX_RETRY_INTERVAL); // true if we are enabled, protected by this Loading @@ -315,14 +316,14 @@ public class GnssLocationProvider extends AbstractLocationProvider implements private boolean mShutdown; // states for injecting ntp and downloading xtra data // states for injecting ntp and downloading psds data private static final int STATE_PENDING_NETWORK = 0; private static final int STATE_DOWNLOADING = 1; private static final int STATE_IDLE = 2; // flags to trigger NTP or XTRA data download when network becomes available // initialized to true so we do NTP and XTRA when the network comes up after booting private int mDownloadXtraDataPending = STATE_PENDING_NETWORK; // flags to trigger NTP or PSDS data download when network becomes available // initialized to true so we do NTP and PSDS when the network comes up after booting private int mDownloadPsdsDataPending = STATE_PENDING_NETWORK; // true if GPS is navigating private boolean mNavigating; Loading @@ -346,8 +347,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements // capabilities reported through the top level IGnssCallback.hal private volatile int mTopHalCapabilities; // true if XTRA is supported private boolean mSupportsXtra; // true if PSDS is supported private boolean mSupportsPsds; // for calculating time to first fix private long mFixRequestTime = 0; Loading Loading @@ -404,8 +405,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements // Wakelocks private final static String WAKELOCK_KEY = "GnssLocationProvider"; private final PowerManager.WakeLock mWakeLock; private static final String DOWNLOAD_EXTRA_WAKELOCK_KEY = "GnssLocationProviderXtraDownload"; private final PowerManager.WakeLock mDownloadXtraWakeLock; private static final String DOWNLOAD_EXTRA_WAKELOCK_KEY = "GnssLocationProviderPsdsDownload"; private final PowerManager.WakeLock mDownloadPsdsWakeLock; // Alarms private final static String ALARM_WAKEUP = "com.android.internal.location.ALARM_WAKEUP"; Loading Loading @@ -592,10 +593,10 @@ public class GnssLocationProvider extends AbstractLocationProvider implements mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY); mWakeLock.setReferenceCounted(true); // Create a separate wake lock for xtra downloader as it may be released due to timeout. mDownloadXtraWakeLock = mPowerManager.newWakeLock( // Create a separate wake lock for psds downloader as it may be released due to timeout. mDownloadPsdsWakeLock = mPowerManager.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, DOWNLOAD_EXTRA_WAKELOCK_KEY); mDownloadXtraWakeLock.setReferenceCounted(true); mDownloadPsdsWakeLock.setReferenceCounted(true); mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); mWakeupIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ALARM_WAKEUP), 0); Loading Loading @@ -701,10 +702,10 @@ public class GnssLocationProvider extends AbstractLocationProvider implements */ private void onNetworkAvailable() { mNtpTimeHelper.onNetworkAvailable(); if (mDownloadXtraDataPending == STATE_PENDING_NETWORK) { if (mSupportsXtra) { if (mDownloadPsdsDataPending == STATE_PENDING_NETWORK) { if (mSupportsPsds) { // Download only if supported, (prevents an unnecessary on-boot download) xtraDownloadRequest(); psdsDownloadRequest(); } } } Loading Loading @@ -811,61 +812,61 @@ public class GnssLocationProvider extends AbstractLocationProvider implements return false; } private void handleDownloadXtraData() { if (!mSupportsXtra) { // native code reports xtra not supported, don't try Log.d(TAG, "handleDownloadXtraData() called when Xtra not supported"); private void handleDownloadPsdsData() { if (!mSupportsPsds) { // native code reports psds not supported, don't try Log.d(TAG, "handleDownloadPsdsData() called when PSDS not supported"); return; } if (mDownloadXtraDataPending == STATE_DOWNLOADING) { if (mDownloadPsdsDataPending == STATE_DOWNLOADING) { // already downloading data return; } if (!mNetworkConnectivityHandler.isDataNetworkConnected()) { // try again when network is up mDownloadXtraDataPending = STATE_PENDING_NETWORK; mDownloadPsdsDataPending = STATE_PENDING_NETWORK; return; } mDownloadXtraDataPending = STATE_DOWNLOADING; mDownloadPsdsDataPending = STATE_DOWNLOADING; // hold wake lock while task runs mDownloadXtraWakeLock.acquire(DOWNLOAD_XTRA_DATA_TIMEOUT_MS); Log.i(TAG, "WakeLock acquired by handleDownloadXtraData()"); mDownloadPsdsWakeLock.acquire(DOWNLOAD_PSDS_DATA_TIMEOUT_MS); Log.i(TAG, "WakeLock acquired by handleDownloadPsdsData()"); AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> { GpsXtraDownloader xtraDownloader = new GpsXtraDownloader( GpsPsdsDownloader psdsDownloader = new GpsPsdsDownloader( mGnssConfiguration.getProperties()); byte[] data = xtraDownloader.downloadXtraData(); byte[] data = psdsDownloader.downloadPsdsData(); if (data != null) { if (DEBUG) Log.d(TAG, "calling native_inject_xtra_data"); native_inject_xtra_data(data, data.length); mXtraBackOff.reset(); if (DEBUG) Log.d(TAG, "calling native_inject_psds_data"); native_inject_psds_data(data, data.length); mPsdsBackOff.reset(); } sendMessage(DOWNLOAD_XTRA_DATA_FINISHED, 0, null); sendMessage(DOWNLOAD_PSDS_DATA_FINISHED, 0, null); if (data == null) { // try again later // since this is delayed and not urgent we do not hold a wake lock here mHandler.sendEmptyMessageDelayed(DOWNLOAD_XTRA_DATA, mXtraBackOff.nextBackoffMillis()); mHandler.sendEmptyMessageDelayed(DOWNLOAD_PSDS_DATA, mPsdsBackOff.nextBackoffMillis()); } // Release wake lock held by task, synchronize on mLock in case multiple // download tasks overrun. synchronized (mLock) { if (mDownloadXtraWakeLock.isHeld()) { if (mDownloadPsdsWakeLock.isHeld()) { // This wakelock may have time-out, if a timeout was specified. // Catch (and ignore) any timeout exceptions. try { mDownloadXtraWakeLock.release(); if (DEBUG) Log.d(TAG, "WakeLock released by handleDownloadXtraData()"); mDownloadPsdsWakeLock.release(); if (DEBUG) Log.d(TAG, "WakeLock released by handleDownloadPsdsData()"); } catch (Exception e) { Log.i(TAG, "Wakelock timeout & release race exception in " + "handleDownloadXtraData()", e); + "handleDownloadPsdsData()", e); } } else { Log.e(TAG, "WakeLock expired before release in " + "handleDownloadXtraData()"); + "handleDownloadPsdsData()"); } } }); Loading Loading @@ -920,7 +921,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements if (inited) { mEnabled = true; mSupportsXtra = native_supports_xtra(); mSupportsPsds = native_supports_psds(); // TODO: remove the following native calls if we can make sure they are redundant. if (mSuplServerHost != null) { Loading Loading @@ -1162,9 +1163,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements deleteAidingData(extras); } else if ("force_time_injection".equals(command)) { requestUtcTime(); } else if ("force_xtra_injection".equals(command)) { if (mSupportsXtra) { xtraDownloadRequest(); } else if ("force_psds_injection".equals(command)) { if (mSupportsPsds) { psdsDownloadRequest(); } } else { Log.w(TAG, "sendExtraCommand: unknown command " + command); Loading Loading @@ -1677,9 +1678,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } @NativeEntryPoint private void xtraDownloadRequest() { if (DEBUG) Log.d(TAG, "xtraDownloadRequest"); sendMessage(DOWNLOAD_XTRA_DATA, 0, null); private void psdsDownloadRequest() { if (DEBUG) Log.d(TAG, "psdsDownloadRequest"); sendMessage(DOWNLOAD_PSDS_DATA, 0, null); } /** Loading Loading @@ -2012,11 +2013,11 @@ public class GnssLocationProvider extends AbstractLocationProvider implements case REQUEST_LOCATION: handleRequestLocation(msg.arg1 == 1, (boolean) msg.obj); break; case DOWNLOAD_XTRA_DATA: handleDownloadXtraData(); case DOWNLOAD_PSDS_DATA: handleDownloadPsdsData(); break; case DOWNLOAD_XTRA_DATA_FINISHED: mDownloadXtraDataPending = STATE_IDLE; case DOWNLOAD_PSDS_DATA_FINISHED: mDownloadPsdsDataPending = STATE_IDLE; break; case UPDATE_LOCATION: handleUpdateLocation((Location) msg.obj); Loading Loading @@ -2166,10 +2167,10 @@ public class GnssLocationProvider extends AbstractLocationProvider implements return "INJECT_NTP_TIME"; case REQUEST_LOCATION: return "REQUEST_LOCATION"; case DOWNLOAD_XTRA_DATA: return "DOWNLOAD_XTRA_DATA"; case DOWNLOAD_XTRA_DATA_FINISHED: return "DOWNLOAD_XTRA_DATA_FINISHED"; case DOWNLOAD_PSDS_DATA: return "DOWNLOAD_PSDS_DATA"; case DOWNLOAD_PSDS_DATA_FINISHED: return "DOWNLOAD_PSDS_DATA_FINISHED"; case UPDATE_LOCATION: return "UPDATE_LOCATION"; case SUBSCRIPTION_OR_CARRIER_CONFIG_CHANGED: Loading Loading @@ -2266,12 +2267,12 @@ public class GnssLocationProvider extends AbstractLocationProvider implements private native void native_inject_location(double latitude, double longitude, float accuracy); // XTRA Support // PSDS Support private native void native_inject_time(long time, long timeReference, int uncertainty); private native boolean native_supports_xtra(); private native boolean native_supports_psds(); private native void native_inject_xtra_data(byte[] data, int length); private native void native_inject_psds_data(byte[] data, int length); // DEBUG Support private native String native_get_internal_state(); Loading services/core/java/com/android/server/location/GpsXtraDownloader.java→services/core/java/com/android/server/location/GpsPsdsDownloader.java +20 −20 Original line number Diff line number Diff line Loading @@ -32,26 +32,26 @@ import java.util.Random; import java.util.concurrent.TimeUnit; /** * A class for downloading GPS XTRA data. * A class for downloading GPS PSDS data. * * {@hide} */ public class GpsXtraDownloader { public class GpsPsdsDownloader { private static final String TAG = "GpsXtraDownloader"; private static final String TAG = "GpsPsdsDownloader"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private static final long MAXIMUM_CONTENT_LENGTH_BYTES = 1000000; // 1MB. private static final String DEFAULT_USER_AGENT = "Android"; private static final int CONNECTION_TIMEOUT_MS = (int) TimeUnit.SECONDS.toMillis(30); private static final int READ_TIMEOUT_MS = (int) TimeUnit.SECONDS.toMillis(60); private final String[] mXtraServers; private final String[] mPsdsServers; // to load balance our server requests private int mNextServerIndex; private final String mUserAgent; GpsXtraDownloader(Properties properties) { // read XTRA servers from the Properties object GpsPsdsDownloader(Properties properties) { // read PSDS servers from the Properties object int count = 0; String server1 = properties.getProperty("XTRA_SERVER_1"); String server2 = properties.getProperty("XTRA_SERVER_2"); Loading @@ -69,14 +69,14 @@ public class GpsXtraDownloader { } if (count == 0) { Log.e(TAG, "No XTRA servers were specified in the GPS configuration"); mXtraServers = null; Log.e(TAG, "No PSDS servers were specified in the GPS configuration"); mPsdsServers = null; } else { mXtraServers = new String[count]; mPsdsServers = new String[count]; count = 0; if (server1 != null) mXtraServers[count++] = server1; if (server2 != null) mXtraServers[count++] = server2; if (server3 != null) mXtraServers[count++] = server3; if (server1 != null) mPsdsServers[count++] = server1; if (server2 != null) mPsdsServers[count++] = server2; if (server3 != null) mPsdsServers[count++] = server3; // randomize first server Random random = new Random(); Loading @@ -84,11 +84,11 @@ public class GpsXtraDownloader { } } byte[] downloadXtraData() { byte[] downloadPsdsData() { byte[] result = null; int startIndex = mNextServerIndex; if (mXtraServers == null) { if (mPsdsServers == null) { return null; } Loading @@ -97,14 +97,14 @@ public class GpsXtraDownloader { final int oldTag = TrafficStats.getAndSetThreadStatsTag( TrafficStatsConstants.TAG_SYSTEM_GPS); try { result = doDownload(mXtraServers[mNextServerIndex]); result = doDownload(mPsdsServers[mNextServerIndex]); } finally { TrafficStats.setThreadStatsTag(oldTag); } // increment mNextServerIndex and wrap around if necessary mNextServerIndex++; if (mNextServerIndex == mXtraServers.length) { if (mNextServerIndex == mPsdsServers.length) { mNextServerIndex = 0; } // break if we have tried all the servers Loading @@ -115,7 +115,7 @@ public class GpsXtraDownloader { } protected byte[] doDownload(String url) { if (DEBUG) Log.d(TAG, "Downloading XTRA data from " + url); if (DEBUG) Log.d(TAG, "Downloading PSDS data from " + url); HttpURLConnection connection = null; try { Loading @@ -132,7 +132,7 @@ public class GpsXtraDownloader { connection.connect(); int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK) { if (DEBUG) Log.d(TAG, "HTTP error downloading gps XTRA: " + statusCode); if (DEBUG) Log.d(TAG, "HTTP error downloading gps PSDS: " + statusCode); return null; } Loading @@ -143,14 +143,14 @@ public class GpsXtraDownloader { while ((count = in.read(buffer)) != -1) { bytes.write(buffer, 0, count); if (bytes.size() > MAXIMUM_CONTENT_LENGTH_BYTES) { if (DEBUG) Log.d(TAG, "XTRA file too large"); if (DEBUG) Log.d(TAG, "PSDS file too large"); return null; } } return bytes.toByteArray(); } } catch (IOException ioe) { if (DEBUG) Log.d(TAG, "Error downloading gps XTRA: ", ioe); if (DEBUG) Log.d(TAG, "Error downloading gps PSDS: ", ioe); } finally { if (connection != null) { connection.disconnect(); Loading services/core/jni/com_android_server_location_GnssLocationProvider.cpp +9 −9 Original line number Diff line number Diff line Loading @@ -62,7 +62,7 @@ static jmethodID method_reportNmea; static jmethodID method_setTopHalCapabilities; static jmethodID method_setGnssYearOfHardware; static jmethodID method_setGnssHardwareModelName; static jmethodID method_xtraDownloadRequest; static jmethodID method_psdsDownloadRequest; static jmethodID method_reportNiNotification; static jmethodID method_requestLocation; static jmethodID method_requestRefLocation; Loading Loading @@ -802,7 +802,7 @@ class GnssXtraCallback : public IGnssXtraCallback { */ Return<void> GnssXtraCallback::downloadRequestCb() { JNIEnv* env = getJniEnv(); env->CallVoidMethod(mCallbacksObj, method_xtraDownloadRequest); env->CallVoidMethod(mCallbacksObj, method_psdsDownloadRequest); checkAndClearExceptionFromCallback(env, __FUNCTION__); return Void(); } Loading Loading @@ -1525,7 +1525,7 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass method_setGnssYearOfHardware = env->GetMethodID(clazz, "setGnssYearOfHardware", "(I)V"); method_setGnssHardwareModelName = env->GetMethodID(clazz, "setGnssHardwareModelName", "(Ljava/lang/String;)V"); method_xtraDownloadRequest = env->GetMethodID(clazz, "xtraDownloadRequest", "()V"); method_psdsDownloadRequest = env->GetMethodID(clazz, "psdsDownloadRequest", "()V"); method_reportNiNotification = env->GetMethodID(clazz, "reportNiNotification", "(IIIIILjava/lang/String;Ljava/lang/String;II)V"); method_requestLocation = env->GetMethodID(clazz, "requestLocation", "(ZZ)V"); Loading Loading @@ -2190,12 +2190,12 @@ static void android_location_GnssLocationProvider_inject_location(JNIEnv* /* env } } static jboolean android_location_GnssLocationProvider_supports_xtra( static jboolean android_location_GnssLocationProvider_supports_psds( JNIEnv* /* env */, jobject /* obj */) { return (gnssXtraIface != nullptr) ? JNI_TRUE : JNI_FALSE; } static void android_location_GnssLocationProvider_inject_xtra_data(JNIEnv* env, jobject /* obj */, static void android_location_GnssLocationProvider_inject_psds_data(JNIEnv* env, jobject /* obj */, jbyteArray data, jint length) { if (gnssXtraIface == nullptr) { ALOGE("XTRA Interface not supported"); Loading Loading @@ -3047,10 +3047,10 @@ static const JNINativeMethod sMethods[] = { android_location_GnssLocationProvider_inject_best_location)}, {"native_inject_location", "(DDF)V", reinterpret_cast<void *>( android_location_GnssLocationProvider_inject_location)}, {"native_supports_xtra", "()Z", reinterpret_cast<void *>( android_location_GnssLocationProvider_supports_xtra)}, {"native_inject_xtra_data", "([BI)V", reinterpret_cast<void *>( android_location_GnssLocationProvider_inject_xtra_data)}, {"native_supports_psds", "()Z", reinterpret_cast<void *>( android_location_GnssLocationProvider_supports_psds)}, {"native_inject_psds_data", "([BI)V", reinterpret_cast<void *>( android_location_GnssLocationProvider_inject_psds_data)}, {"native_agps_set_id", "(ILjava/lang/String;)V", reinterpret_cast<void *>( android_location_GnssLocationProvider_agps_set_id)}, {"native_agps_set_ref_location_cellid", "(IIIII)V", reinterpret_cast<void *>( Loading Loading
services/core/java/com/android/server/location/GnssLocationProvider.java +62 −61 Original line number Diff line number Diff line Loading @@ -180,9 +180,10 @@ public class GnssLocationProvider extends AbstractLocationProvider implements private static final int SET_REQUEST = 3; private static final int INJECT_NTP_TIME = 5; private static final int DOWNLOAD_XTRA_DATA = 6; // PSDS stands for Predicted Satellite Data Service private static final int DOWNLOAD_PSDS_DATA = 6; private static final int UPDATE_LOCATION = 7; // Handle external location from network listener private static final int DOWNLOAD_XTRA_DATA_FINISHED = 11; private static final int DOWNLOAD_PSDS_DATA_FINISHED = 11; private static final int SUBSCRIPTION_OR_CARRIER_CONFIG_CHANGED = 12; private static final int INITIALIZE_HANDLER = 13; private static final int REQUEST_LOCATION = 16; Loading Loading @@ -295,19 +296,19 @@ public class GnssLocationProvider extends AbstractLocationProvider implements // Typical hot TTTF is ~5 seconds, so 10 seconds seems sane. private static final int GPS_POLLING_THRESHOLD_INTERVAL = 10 * 1000; // how long to wait if we have a network error in NTP or XTRA downloading // how long to wait if we have a network error in NTP or PSDS downloading // the initial value of the exponential backoff // current setting - 5 minutes private static final long RETRY_INTERVAL = 5 * 60 * 1000; // how long to wait if we have a network error in NTP or XTRA downloading // how long to wait if we have a network error in NTP or PSDS downloading // the max value of the exponential backoff // current setting - 4 hours private static final long MAX_RETRY_INTERVAL = 4 * 60 * 60 * 1000; // Timeout when holding wakelocks for downloading XTRA data. private static final long DOWNLOAD_XTRA_DATA_TIMEOUT_MS = 60 * 1000; // Timeout when holding wakelocks for downloading PSDS data. private static final long DOWNLOAD_PSDS_DATA_TIMEOUT_MS = 60 * 1000; private final ExponentialBackOff mXtraBackOff = new ExponentialBackOff(RETRY_INTERVAL, private final ExponentialBackOff mPsdsBackOff = new ExponentialBackOff(RETRY_INTERVAL, MAX_RETRY_INTERVAL); // true if we are enabled, protected by this Loading @@ -315,14 +316,14 @@ public class GnssLocationProvider extends AbstractLocationProvider implements private boolean mShutdown; // states for injecting ntp and downloading xtra data // states for injecting ntp and downloading psds data private static final int STATE_PENDING_NETWORK = 0; private static final int STATE_DOWNLOADING = 1; private static final int STATE_IDLE = 2; // flags to trigger NTP or XTRA data download when network becomes available // initialized to true so we do NTP and XTRA when the network comes up after booting private int mDownloadXtraDataPending = STATE_PENDING_NETWORK; // flags to trigger NTP or PSDS data download when network becomes available // initialized to true so we do NTP and PSDS when the network comes up after booting private int mDownloadPsdsDataPending = STATE_PENDING_NETWORK; // true if GPS is navigating private boolean mNavigating; Loading @@ -346,8 +347,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements // capabilities reported through the top level IGnssCallback.hal private volatile int mTopHalCapabilities; // true if XTRA is supported private boolean mSupportsXtra; // true if PSDS is supported private boolean mSupportsPsds; // for calculating time to first fix private long mFixRequestTime = 0; Loading Loading @@ -404,8 +405,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements // Wakelocks private final static String WAKELOCK_KEY = "GnssLocationProvider"; private final PowerManager.WakeLock mWakeLock; private static final String DOWNLOAD_EXTRA_WAKELOCK_KEY = "GnssLocationProviderXtraDownload"; private final PowerManager.WakeLock mDownloadXtraWakeLock; private static final String DOWNLOAD_EXTRA_WAKELOCK_KEY = "GnssLocationProviderPsdsDownload"; private final PowerManager.WakeLock mDownloadPsdsWakeLock; // Alarms private final static String ALARM_WAKEUP = "com.android.internal.location.ALARM_WAKEUP"; Loading Loading @@ -592,10 +593,10 @@ public class GnssLocationProvider extends AbstractLocationProvider implements mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY); mWakeLock.setReferenceCounted(true); // Create a separate wake lock for xtra downloader as it may be released due to timeout. mDownloadXtraWakeLock = mPowerManager.newWakeLock( // Create a separate wake lock for psds downloader as it may be released due to timeout. mDownloadPsdsWakeLock = mPowerManager.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, DOWNLOAD_EXTRA_WAKELOCK_KEY); mDownloadXtraWakeLock.setReferenceCounted(true); mDownloadPsdsWakeLock.setReferenceCounted(true); mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); mWakeupIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ALARM_WAKEUP), 0); Loading Loading @@ -701,10 +702,10 @@ public class GnssLocationProvider extends AbstractLocationProvider implements */ private void onNetworkAvailable() { mNtpTimeHelper.onNetworkAvailable(); if (mDownloadXtraDataPending == STATE_PENDING_NETWORK) { if (mSupportsXtra) { if (mDownloadPsdsDataPending == STATE_PENDING_NETWORK) { if (mSupportsPsds) { // Download only if supported, (prevents an unnecessary on-boot download) xtraDownloadRequest(); psdsDownloadRequest(); } } } Loading Loading @@ -811,61 +812,61 @@ public class GnssLocationProvider extends AbstractLocationProvider implements return false; } private void handleDownloadXtraData() { if (!mSupportsXtra) { // native code reports xtra not supported, don't try Log.d(TAG, "handleDownloadXtraData() called when Xtra not supported"); private void handleDownloadPsdsData() { if (!mSupportsPsds) { // native code reports psds not supported, don't try Log.d(TAG, "handleDownloadPsdsData() called when PSDS not supported"); return; } if (mDownloadXtraDataPending == STATE_DOWNLOADING) { if (mDownloadPsdsDataPending == STATE_DOWNLOADING) { // already downloading data return; } if (!mNetworkConnectivityHandler.isDataNetworkConnected()) { // try again when network is up mDownloadXtraDataPending = STATE_PENDING_NETWORK; mDownloadPsdsDataPending = STATE_PENDING_NETWORK; return; } mDownloadXtraDataPending = STATE_DOWNLOADING; mDownloadPsdsDataPending = STATE_DOWNLOADING; // hold wake lock while task runs mDownloadXtraWakeLock.acquire(DOWNLOAD_XTRA_DATA_TIMEOUT_MS); Log.i(TAG, "WakeLock acquired by handleDownloadXtraData()"); mDownloadPsdsWakeLock.acquire(DOWNLOAD_PSDS_DATA_TIMEOUT_MS); Log.i(TAG, "WakeLock acquired by handleDownloadPsdsData()"); AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> { GpsXtraDownloader xtraDownloader = new GpsXtraDownloader( GpsPsdsDownloader psdsDownloader = new GpsPsdsDownloader( mGnssConfiguration.getProperties()); byte[] data = xtraDownloader.downloadXtraData(); byte[] data = psdsDownloader.downloadPsdsData(); if (data != null) { if (DEBUG) Log.d(TAG, "calling native_inject_xtra_data"); native_inject_xtra_data(data, data.length); mXtraBackOff.reset(); if (DEBUG) Log.d(TAG, "calling native_inject_psds_data"); native_inject_psds_data(data, data.length); mPsdsBackOff.reset(); } sendMessage(DOWNLOAD_XTRA_DATA_FINISHED, 0, null); sendMessage(DOWNLOAD_PSDS_DATA_FINISHED, 0, null); if (data == null) { // try again later // since this is delayed and not urgent we do not hold a wake lock here mHandler.sendEmptyMessageDelayed(DOWNLOAD_XTRA_DATA, mXtraBackOff.nextBackoffMillis()); mHandler.sendEmptyMessageDelayed(DOWNLOAD_PSDS_DATA, mPsdsBackOff.nextBackoffMillis()); } // Release wake lock held by task, synchronize on mLock in case multiple // download tasks overrun. synchronized (mLock) { if (mDownloadXtraWakeLock.isHeld()) { if (mDownloadPsdsWakeLock.isHeld()) { // This wakelock may have time-out, if a timeout was specified. // Catch (and ignore) any timeout exceptions. try { mDownloadXtraWakeLock.release(); if (DEBUG) Log.d(TAG, "WakeLock released by handleDownloadXtraData()"); mDownloadPsdsWakeLock.release(); if (DEBUG) Log.d(TAG, "WakeLock released by handleDownloadPsdsData()"); } catch (Exception e) { Log.i(TAG, "Wakelock timeout & release race exception in " + "handleDownloadXtraData()", e); + "handleDownloadPsdsData()", e); } } else { Log.e(TAG, "WakeLock expired before release in " + "handleDownloadXtraData()"); + "handleDownloadPsdsData()"); } } }); Loading Loading @@ -920,7 +921,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements if (inited) { mEnabled = true; mSupportsXtra = native_supports_xtra(); mSupportsPsds = native_supports_psds(); // TODO: remove the following native calls if we can make sure they are redundant. if (mSuplServerHost != null) { Loading Loading @@ -1162,9 +1163,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements deleteAidingData(extras); } else if ("force_time_injection".equals(command)) { requestUtcTime(); } else if ("force_xtra_injection".equals(command)) { if (mSupportsXtra) { xtraDownloadRequest(); } else if ("force_psds_injection".equals(command)) { if (mSupportsPsds) { psdsDownloadRequest(); } } else { Log.w(TAG, "sendExtraCommand: unknown command " + command); Loading Loading @@ -1677,9 +1678,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } @NativeEntryPoint private void xtraDownloadRequest() { if (DEBUG) Log.d(TAG, "xtraDownloadRequest"); sendMessage(DOWNLOAD_XTRA_DATA, 0, null); private void psdsDownloadRequest() { if (DEBUG) Log.d(TAG, "psdsDownloadRequest"); sendMessage(DOWNLOAD_PSDS_DATA, 0, null); } /** Loading Loading @@ -2012,11 +2013,11 @@ public class GnssLocationProvider extends AbstractLocationProvider implements case REQUEST_LOCATION: handleRequestLocation(msg.arg1 == 1, (boolean) msg.obj); break; case DOWNLOAD_XTRA_DATA: handleDownloadXtraData(); case DOWNLOAD_PSDS_DATA: handleDownloadPsdsData(); break; case DOWNLOAD_XTRA_DATA_FINISHED: mDownloadXtraDataPending = STATE_IDLE; case DOWNLOAD_PSDS_DATA_FINISHED: mDownloadPsdsDataPending = STATE_IDLE; break; case UPDATE_LOCATION: handleUpdateLocation((Location) msg.obj); Loading Loading @@ -2166,10 +2167,10 @@ public class GnssLocationProvider extends AbstractLocationProvider implements return "INJECT_NTP_TIME"; case REQUEST_LOCATION: return "REQUEST_LOCATION"; case DOWNLOAD_XTRA_DATA: return "DOWNLOAD_XTRA_DATA"; case DOWNLOAD_XTRA_DATA_FINISHED: return "DOWNLOAD_XTRA_DATA_FINISHED"; case DOWNLOAD_PSDS_DATA: return "DOWNLOAD_PSDS_DATA"; case DOWNLOAD_PSDS_DATA_FINISHED: return "DOWNLOAD_PSDS_DATA_FINISHED"; case UPDATE_LOCATION: return "UPDATE_LOCATION"; case SUBSCRIPTION_OR_CARRIER_CONFIG_CHANGED: Loading Loading @@ -2266,12 +2267,12 @@ public class GnssLocationProvider extends AbstractLocationProvider implements private native void native_inject_location(double latitude, double longitude, float accuracy); // XTRA Support // PSDS Support private native void native_inject_time(long time, long timeReference, int uncertainty); private native boolean native_supports_xtra(); private native boolean native_supports_psds(); private native void native_inject_xtra_data(byte[] data, int length); private native void native_inject_psds_data(byte[] data, int length); // DEBUG Support private native String native_get_internal_state(); Loading
services/core/java/com/android/server/location/GpsXtraDownloader.java→services/core/java/com/android/server/location/GpsPsdsDownloader.java +20 −20 Original line number Diff line number Diff line Loading @@ -32,26 +32,26 @@ import java.util.Random; import java.util.concurrent.TimeUnit; /** * A class for downloading GPS XTRA data. * A class for downloading GPS PSDS data. * * {@hide} */ public class GpsXtraDownloader { public class GpsPsdsDownloader { private static final String TAG = "GpsXtraDownloader"; private static final String TAG = "GpsPsdsDownloader"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private static final long MAXIMUM_CONTENT_LENGTH_BYTES = 1000000; // 1MB. private static final String DEFAULT_USER_AGENT = "Android"; private static final int CONNECTION_TIMEOUT_MS = (int) TimeUnit.SECONDS.toMillis(30); private static final int READ_TIMEOUT_MS = (int) TimeUnit.SECONDS.toMillis(60); private final String[] mXtraServers; private final String[] mPsdsServers; // to load balance our server requests private int mNextServerIndex; private final String mUserAgent; GpsXtraDownloader(Properties properties) { // read XTRA servers from the Properties object GpsPsdsDownloader(Properties properties) { // read PSDS servers from the Properties object int count = 0; String server1 = properties.getProperty("XTRA_SERVER_1"); String server2 = properties.getProperty("XTRA_SERVER_2"); Loading @@ -69,14 +69,14 @@ public class GpsXtraDownloader { } if (count == 0) { Log.e(TAG, "No XTRA servers were specified in the GPS configuration"); mXtraServers = null; Log.e(TAG, "No PSDS servers were specified in the GPS configuration"); mPsdsServers = null; } else { mXtraServers = new String[count]; mPsdsServers = new String[count]; count = 0; if (server1 != null) mXtraServers[count++] = server1; if (server2 != null) mXtraServers[count++] = server2; if (server3 != null) mXtraServers[count++] = server3; if (server1 != null) mPsdsServers[count++] = server1; if (server2 != null) mPsdsServers[count++] = server2; if (server3 != null) mPsdsServers[count++] = server3; // randomize first server Random random = new Random(); Loading @@ -84,11 +84,11 @@ public class GpsXtraDownloader { } } byte[] downloadXtraData() { byte[] downloadPsdsData() { byte[] result = null; int startIndex = mNextServerIndex; if (mXtraServers == null) { if (mPsdsServers == null) { return null; } Loading @@ -97,14 +97,14 @@ public class GpsXtraDownloader { final int oldTag = TrafficStats.getAndSetThreadStatsTag( TrafficStatsConstants.TAG_SYSTEM_GPS); try { result = doDownload(mXtraServers[mNextServerIndex]); result = doDownload(mPsdsServers[mNextServerIndex]); } finally { TrafficStats.setThreadStatsTag(oldTag); } // increment mNextServerIndex and wrap around if necessary mNextServerIndex++; if (mNextServerIndex == mXtraServers.length) { if (mNextServerIndex == mPsdsServers.length) { mNextServerIndex = 0; } // break if we have tried all the servers Loading @@ -115,7 +115,7 @@ public class GpsXtraDownloader { } protected byte[] doDownload(String url) { if (DEBUG) Log.d(TAG, "Downloading XTRA data from " + url); if (DEBUG) Log.d(TAG, "Downloading PSDS data from " + url); HttpURLConnection connection = null; try { Loading @@ -132,7 +132,7 @@ public class GpsXtraDownloader { connection.connect(); int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK) { if (DEBUG) Log.d(TAG, "HTTP error downloading gps XTRA: " + statusCode); if (DEBUG) Log.d(TAG, "HTTP error downloading gps PSDS: " + statusCode); return null; } Loading @@ -143,14 +143,14 @@ public class GpsXtraDownloader { while ((count = in.read(buffer)) != -1) { bytes.write(buffer, 0, count); if (bytes.size() > MAXIMUM_CONTENT_LENGTH_BYTES) { if (DEBUG) Log.d(TAG, "XTRA file too large"); if (DEBUG) Log.d(TAG, "PSDS file too large"); return null; } } return bytes.toByteArray(); } } catch (IOException ioe) { if (DEBUG) Log.d(TAG, "Error downloading gps XTRA: ", ioe); if (DEBUG) Log.d(TAG, "Error downloading gps PSDS: ", ioe); } finally { if (connection != null) { connection.disconnect(); Loading
services/core/jni/com_android_server_location_GnssLocationProvider.cpp +9 −9 Original line number Diff line number Diff line Loading @@ -62,7 +62,7 @@ static jmethodID method_reportNmea; static jmethodID method_setTopHalCapabilities; static jmethodID method_setGnssYearOfHardware; static jmethodID method_setGnssHardwareModelName; static jmethodID method_xtraDownloadRequest; static jmethodID method_psdsDownloadRequest; static jmethodID method_reportNiNotification; static jmethodID method_requestLocation; static jmethodID method_requestRefLocation; Loading Loading @@ -802,7 +802,7 @@ class GnssXtraCallback : public IGnssXtraCallback { */ Return<void> GnssXtraCallback::downloadRequestCb() { JNIEnv* env = getJniEnv(); env->CallVoidMethod(mCallbacksObj, method_xtraDownloadRequest); env->CallVoidMethod(mCallbacksObj, method_psdsDownloadRequest); checkAndClearExceptionFromCallback(env, __FUNCTION__); return Void(); } Loading Loading @@ -1525,7 +1525,7 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass method_setGnssYearOfHardware = env->GetMethodID(clazz, "setGnssYearOfHardware", "(I)V"); method_setGnssHardwareModelName = env->GetMethodID(clazz, "setGnssHardwareModelName", "(Ljava/lang/String;)V"); method_xtraDownloadRequest = env->GetMethodID(clazz, "xtraDownloadRequest", "()V"); method_psdsDownloadRequest = env->GetMethodID(clazz, "psdsDownloadRequest", "()V"); method_reportNiNotification = env->GetMethodID(clazz, "reportNiNotification", "(IIIIILjava/lang/String;Ljava/lang/String;II)V"); method_requestLocation = env->GetMethodID(clazz, "requestLocation", "(ZZ)V"); Loading Loading @@ -2190,12 +2190,12 @@ static void android_location_GnssLocationProvider_inject_location(JNIEnv* /* env } } static jboolean android_location_GnssLocationProvider_supports_xtra( static jboolean android_location_GnssLocationProvider_supports_psds( JNIEnv* /* env */, jobject /* obj */) { return (gnssXtraIface != nullptr) ? JNI_TRUE : JNI_FALSE; } static void android_location_GnssLocationProvider_inject_xtra_data(JNIEnv* env, jobject /* obj */, static void android_location_GnssLocationProvider_inject_psds_data(JNIEnv* env, jobject /* obj */, jbyteArray data, jint length) { if (gnssXtraIface == nullptr) { ALOGE("XTRA Interface not supported"); Loading Loading @@ -3047,10 +3047,10 @@ static const JNINativeMethod sMethods[] = { android_location_GnssLocationProvider_inject_best_location)}, {"native_inject_location", "(DDF)V", reinterpret_cast<void *>( android_location_GnssLocationProvider_inject_location)}, {"native_supports_xtra", "()Z", reinterpret_cast<void *>( android_location_GnssLocationProvider_supports_xtra)}, {"native_inject_xtra_data", "([BI)V", reinterpret_cast<void *>( android_location_GnssLocationProvider_inject_xtra_data)}, {"native_supports_psds", "()Z", reinterpret_cast<void *>( android_location_GnssLocationProvider_supports_psds)}, {"native_inject_psds_data", "([BI)V", reinterpret_cast<void *>( android_location_GnssLocationProvider_inject_psds_data)}, {"native_agps_set_id", "(ILjava/lang/String;)V", reinterpret_cast<void *>( android_location_GnssLocationProvider_agps_set_id)}, {"native_agps_set_ref_location_cellid", "(IIIII)V", reinterpret_cast<void *>( Loading