Loading services/core/java/com/android/server/location/gnss/GnssLocationProvider.java +13 −11 Original line number Diff line number Diff line Loading @@ -688,7 +688,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements if (mDownloadPsdsDataPending == STATE_PENDING_NETWORK) { if (mSupportsPsds) { // Download only if supported, (prevents an unnecessary on-boot download) psdsDownloadRequest(); psdsDownloadRequest(/* psdsType= */ GnssPsdsDownloader.LONG_TERM_PSDS_SERVER_INDEX); } } } Loading Loading @@ -808,7 +808,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements return false; } private void handleDownloadPsdsData() { private void handleDownloadPsdsData(int psdsType) { if (!mSupportsPsds) { // native code reports psds not supported, don't try Log.d(TAG, "handleDownloadPsdsData() called when PSDS not supported"); Loading @@ -831,9 +831,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } Log.i(TAG, "WakeLock acquired by handleDownloadPsdsData()"); AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> { GpsPsdsDownloader psdsDownloader = new GpsPsdsDownloader( GnssPsdsDownloader psdsDownloader = new GnssPsdsDownloader( mGnssConfiguration.getProperties()); byte[] data = psdsDownloader.downloadPsdsData(); byte[] data = psdsDownloader.downloadPsdsData(psdsType); if (data != null) { if (DEBUG) Log.d(TAG, "calling native_inject_psds_data"); native_inject_psds_data(data, data.length); Loading @@ -844,8 +844,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements if (data == null) { // try again later // since this is delayed and not urgent we do not hold a wake lock here mHandler.sendEmptyMessageDelayed(DOWNLOAD_PSDS_DATA, // since this is delayed and not urgent we do not hold a wake lock her mHandler.sendMessageDelayed( mHandler.obtainMessage(DOWNLOAD_PSDS_DATA, psdsType, 1, null), mPsdsBackOff.nextBackoffMillis()); } Loading Loading @@ -1141,7 +1142,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements requestUtcTime(); } else if ("force_psds_injection".equals(command)) { if (mSupportsPsds) { psdsDownloadRequest(); psdsDownloadRequest(/* psdsType= */ GnssPsdsDownloader.LONG_TERM_PSDS_SERVER_INDEX); } } else { Log.w(TAG, "sendExtraCommand: unknown command " + command); Loading Loading @@ -1593,9 +1595,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements reportLocation(locations); } void psdsDownloadRequest() { if (DEBUG) Log.d(TAG, "psdsDownloadRequest"); sendMessage(DOWNLOAD_PSDS_DATA, 0, null); void psdsDownloadRequest(int psdsType) { if (DEBUG) Log.d(TAG, "psdsDownloadRequest. psdsType: " + psdsType); sendMessage(DOWNLOAD_PSDS_DATA, psdsType, null); } /** Loading Loading @@ -1906,7 +1908,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements handleRequestLocation(msg.arg1 == 1, (boolean) msg.obj); break; case DOWNLOAD_PSDS_DATA: handleDownloadPsdsData(); handleDownloadPsdsData(msg.arg1); break; case DOWNLOAD_PSDS_DATA_FINISHED: mDownloadPsdsDataPending = STATE_IDLE; Loading services/core/java/com/android/server/location/gnss/GnssManagerService.java +2 −2 Original line number Diff line number Diff line Loading @@ -524,8 +524,8 @@ public class GnssManagerService implements GnssNative.Callbacks { } @Override public void psdsDownloadRequest() { mGnssLocationProvider.psdsDownloadRequest(); public void psdsDownloadRequest(int psdsType) { mGnssLocationProvider.psdsDownloadRequest(psdsType); } @Override Loading services/core/java/com/android/server/location/gnss/GnssNative.java +3 −3 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ class GnssNative { void setGnssHardwareModelName(String modelName); void reportGnssServiceRestarted(); void reportLocationBatch(Location[] locationArray); void psdsDownloadRequest(); void psdsDownloadRequest(int psdsType); void reportGeofenceTransition(int geofenceId, Location location, int transition, long transitionTimestamp); void reportGeofenceStatus(int status, Location location); Loading Loading @@ -212,8 +212,8 @@ class GnssNative { } @NativeEntryPoint private void psdsDownloadRequest() { mCallbacks.psdsDownloadRequest(); private void psdsDownloadRequest(int psdsType) { mCallbacks.psdsDownloadRequest(psdsType); } @NativeEntryPoint Loading services/core/java/com/android/server/location/gnss/GpsPsdsDownloader.java→services/core/java/com/android/server/location/gnss/GnssPsdsDownloader.java +65 −38 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.location.gnss; import android.annotation.Nullable; import android.net.TrafficStats; import android.text.TextUtils; import android.util.Log; Loading @@ -32,33 +33,39 @@ import java.util.Random; import java.util.concurrent.TimeUnit; /** * A class for downloading GPS PSDS data. * A class for downloading GNSS PSDS data. * * {@hide} */ public class GpsPsdsDownloader { class GnssPsdsDownloader { private static final String TAG = "GpsPsdsDownloader"; private static final String TAG = "GnssPsdsDownloader"; 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); static final int LONG_TERM_PSDS_SERVER_INDEX = 1; private static final int NORMAL_PSDS_SERVER_INDEX = 2; private static final int REALTIME_PSDS_SERVER_INDEX = 3; private static final int MAX_PSDS_TYPE_INDEX = 3; private final String[] mLongTermPsdsServers; private final String[] mPsdsServers; // to load balance our server requests private int mNextServerIndex; private final String mUserAgent; GpsPsdsDownloader(Properties properties) { GnssPsdsDownloader(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"); String server3 = properties.getProperty("XTRA_SERVER_3"); if (server1 != null) count++; if (server2 != null) count++; if (server3 != null) count++; String longTermPsdsServer1 = properties.getProperty("XTRA_SERVER_1"); String longTermPsdsServer2 = properties.getProperty("XTRA_SERVER_2"); String longTermPsdsServer3 = properties.getProperty("XTRA_SERVER_3"); if (longTermPsdsServer1 != null) count++; if (longTermPsdsServer2 != null) count++; if (longTermPsdsServer3 != null) count++; // Set User Agent from properties, if possible. String agent = properties.getProperty("XTRA_USER_AGENT"); Loading @@ -69,52 +76,74 @@ public class GpsPsdsDownloader { } if (count == 0) { Log.e(TAG, "No PSDS servers were specified in the GPS configuration"); mPsdsServers = null; Log.e(TAG, "No Long-Term PSDS servers were specified in the GnssConfiguration"); mLongTermPsdsServers = null; } else { mPsdsServers = new String[count]; mLongTermPsdsServers = new String[count]; count = 0; if (server1 != null) mPsdsServers[count++] = server1; if (server2 != null) mPsdsServers[count++] = server2; if (server3 != null) mPsdsServers[count++] = server3; if (longTermPsdsServer1 != null) mLongTermPsdsServers[count++] = longTermPsdsServer1; if (longTermPsdsServer2 != null) mLongTermPsdsServers[count++] = longTermPsdsServer2; if (longTermPsdsServer3 != null) mLongTermPsdsServers[count++] = longTermPsdsServer3; // randomize first server Random random = new Random(); mNextServerIndex = random.nextInt(count); } String normalPsdsServer = properties.getProperty("NORMAL_PSDS_SERVER"); String realtimePsdsServer = properties.getProperty("REALTIME_PSDS_SERVER"); mPsdsServers = new String[MAX_PSDS_TYPE_INDEX + 1]; mPsdsServers[NORMAL_PSDS_SERVER_INDEX] = normalPsdsServer; mPsdsServers[REALTIME_PSDS_SERVER_INDEX] = realtimePsdsServer; } byte[] downloadPsdsData() { @Nullable byte[] downloadPsdsData(int psdsType) { byte[] result = null; int startIndex = mNextServerIndex; if (mPsdsServers == null) { if (psdsType == LONG_TERM_PSDS_SERVER_INDEX && mLongTermPsdsServers == null) { return null; } else if (psdsType > LONG_TERM_PSDS_SERVER_INDEX && psdsType <= MAX_PSDS_TYPE_INDEX && mPsdsServers[psdsType] == null) { return null; } if (psdsType == LONG_TERM_PSDS_SERVER_INDEX) { // load balance our requests among the available servers while (result == null) { final int oldTag = TrafficStats.getAndSetThreadStatsTag( TrafficStatsConstants.TAG_SYSTEM_GPS); try { result = doDownload(mPsdsServers[mNextServerIndex]); } finally { TrafficStats.setThreadStatsTag(oldTag); } result = doDownloadWithTrafficAccounted(mLongTermPsdsServers[mNextServerIndex]); // increment mNextServerIndex and wrap around if necessary mNextServerIndex++; if (mNextServerIndex == mPsdsServers.length) { if (mNextServerIndex == mLongTermPsdsServers.length) { mNextServerIndex = 0; } // break if we have tried all the servers if (mNextServerIndex == startIndex) break; } } else if (psdsType > LONG_TERM_PSDS_SERVER_INDEX && psdsType <= MAX_PSDS_TYPE_INDEX) { result = doDownloadWithTrafficAccounted(mPsdsServers[psdsType]); } return result; } protected byte[] doDownload(String url) { @Nullable private byte[] doDownloadWithTrafficAccounted(String url) { byte[] result; final int oldTag = TrafficStats.getAndSetThreadStatsTag( TrafficStatsConstants.TAG_SYSTEM_GPS); try { result = doDownload(url); } finally { TrafficStats.setThreadStatsTag(oldTag); } return result; } @Nullable private byte[] doDownload(String url) { if (DEBUG) Log.d(TAG, "Downloading PSDS data from " + url); HttpURLConnection connection = null; Loading @@ -132,7 +161,7 @@ public class GpsPsdsDownloader { connection.connect(); int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK) { if (DEBUG) Log.d(TAG, "HTTP error downloading gps PSDS: " + statusCode); if (DEBUG) Log.d(TAG, "HTTP error downloading gnss PSDS: " + statusCode); return null; } Loading @@ -150,7 +179,7 @@ public class GpsPsdsDownloader { return bytes.toByteArray(); } } catch (IOException ioe) { if (DEBUG) Log.d(TAG, "Error downloading gps PSDS: ", ioe); if (DEBUG) Log.d(TAG, "Error downloading gnss PSDS: ", ioe); } finally { if (connection != null) { connection.disconnect(); Loading @@ -158,6 +187,4 @@ public class GpsPsdsDownloader { } return null; } } services/core/jni/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -145,6 +145,7 @@ cc_defaults { "android.hardware.gnss@1.1", "android.hardware.gnss@2.0", "android.hardware.gnss@2.1", "android.hardware.gnss@3.0", "android.hardware.gnss.measurement_corrections@1.0", "android.hardware.gnss.visibility_control@1.0", "android.hardware.graphics.bufferqueue@1.0", Loading Loading
services/core/java/com/android/server/location/gnss/GnssLocationProvider.java +13 −11 Original line number Diff line number Diff line Loading @@ -688,7 +688,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements if (mDownloadPsdsDataPending == STATE_PENDING_NETWORK) { if (mSupportsPsds) { // Download only if supported, (prevents an unnecessary on-boot download) psdsDownloadRequest(); psdsDownloadRequest(/* psdsType= */ GnssPsdsDownloader.LONG_TERM_PSDS_SERVER_INDEX); } } } Loading Loading @@ -808,7 +808,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements return false; } private void handleDownloadPsdsData() { private void handleDownloadPsdsData(int psdsType) { if (!mSupportsPsds) { // native code reports psds not supported, don't try Log.d(TAG, "handleDownloadPsdsData() called when PSDS not supported"); Loading @@ -831,9 +831,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } Log.i(TAG, "WakeLock acquired by handleDownloadPsdsData()"); AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> { GpsPsdsDownloader psdsDownloader = new GpsPsdsDownloader( GnssPsdsDownloader psdsDownloader = new GnssPsdsDownloader( mGnssConfiguration.getProperties()); byte[] data = psdsDownloader.downloadPsdsData(); byte[] data = psdsDownloader.downloadPsdsData(psdsType); if (data != null) { if (DEBUG) Log.d(TAG, "calling native_inject_psds_data"); native_inject_psds_data(data, data.length); Loading @@ -844,8 +844,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements if (data == null) { // try again later // since this is delayed and not urgent we do not hold a wake lock here mHandler.sendEmptyMessageDelayed(DOWNLOAD_PSDS_DATA, // since this is delayed and not urgent we do not hold a wake lock her mHandler.sendMessageDelayed( mHandler.obtainMessage(DOWNLOAD_PSDS_DATA, psdsType, 1, null), mPsdsBackOff.nextBackoffMillis()); } Loading Loading @@ -1141,7 +1142,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements requestUtcTime(); } else if ("force_psds_injection".equals(command)) { if (mSupportsPsds) { psdsDownloadRequest(); psdsDownloadRequest(/* psdsType= */ GnssPsdsDownloader.LONG_TERM_PSDS_SERVER_INDEX); } } else { Log.w(TAG, "sendExtraCommand: unknown command " + command); Loading Loading @@ -1593,9 +1595,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements reportLocation(locations); } void psdsDownloadRequest() { if (DEBUG) Log.d(TAG, "psdsDownloadRequest"); sendMessage(DOWNLOAD_PSDS_DATA, 0, null); void psdsDownloadRequest(int psdsType) { if (DEBUG) Log.d(TAG, "psdsDownloadRequest. psdsType: " + psdsType); sendMessage(DOWNLOAD_PSDS_DATA, psdsType, null); } /** Loading Loading @@ -1906,7 +1908,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements handleRequestLocation(msg.arg1 == 1, (boolean) msg.obj); break; case DOWNLOAD_PSDS_DATA: handleDownloadPsdsData(); handleDownloadPsdsData(msg.arg1); break; case DOWNLOAD_PSDS_DATA_FINISHED: mDownloadPsdsDataPending = STATE_IDLE; Loading
services/core/java/com/android/server/location/gnss/GnssManagerService.java +2 −2 Original line number Diff line number Diff line Loading @@ -524,8 +524,8 @@ public class GnssManagerService implements GnssNative.Callbacks { } @Override public void psdsDownloadRequest() { mGnssLocationProvider.psdsDownloadRequest(); public void psdsDownloadRequest(int psdsType) { mGnssLocationProvider.psdsDownloadRequest(psdsType); } @Override Loading
services/core/java/com/android/server/location/gnss/GnssNative.java +3 −3 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ class GnssNative { void setGnssHardwareModelName(String modelName); void reportGnssServiceRestarted(); void reportLocationBatch(Location[] locationArray); void psdsDownloadRequest(); void psdsDownloadRequest(int psdsType); void reportGeofenceTransition(int geofenceId, Location location, int transition, long transitionTimestamp); void reportGeofenceStatus(int status, Location location); Loading Loading @@ -212,8 +212,8 @@ class GnssNative { } @NativeEntryPoint private void psdsDownloadRequest() { mCallbacks.psdsDownloadRequest(); private void psdsDownloadRequest(int psdsType) { mCallbacks.psdsDownloadRequest(psdsType); } @NativeEntryPoint Loading
services/core/java/com/android/server/location/gnss/GpsPsdsDownloader.java→services/core/java/com/android/server/location/gnss/GnssPsdsDownloader.java +65 −38 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.location.gnss; import android.annotation.Nullable; import android.net.TrafficStats; import android.text.TextUtils; import android.util.Log; Loading @@ -32,33 +33,39 @@ import java.util.Random; import java.util.concurrent.TimeUnit; /** * A class for downloading GPS PSDS data. * A class for downloading GNSS PSDS data. * * {@hide} */ public class GpsPsdsDownloader { class GnssPsdsDownloader { private static final String TAG = "GpsPsdsDownloader"; private static final String TAG = "GnssPsdsDownloader"; 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); static final int LONG_TERM_PSDS_SERVER_INDEX = 1; private static final int NORMAL_PSDS_SERVER_INDEX = 2; private static final int REALTIME_PSDS_SERVER_INDEX = 3; private static final int MAX_PSDS_TYPE_INDEX = 3; private final String[] mLongTermPsdsServers; private final String[] mPsdsServers; // to load balance our server requests private int mNextServerIndex; private final String mUserAgent; GpsPsdsDownloader(Properties properties) { GnssPsdsDownloader(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"); String server3 = properties.getProperty("XTRA_SERVER_3"); if (server1 != null) count++; if (server2 != null) count++; if (server3 != null) count++; String longTermPsdsServer1 = properties.getProperty("XTRA_SERVER_1"); String longTermPsdsServer2 = properties.getProperty("XTRA_SERVER_2"); String longTermPsdsServer3 = properties.getProperty("XTRA_SERVER_3"); if (longTermPsdsServer1 != null) count++; if (longTermPsdsServer2 != null) count++; if (longTermPsdsServer3 != null) count++; // Set User Agent from properties, if possible. String agent = properties.getProperty("XTRA_USER_AGENT"); Loading @@ -69,52 +76,74 @@ public class GpsPsdsDownloader { } if (count == 0) { Log.e(TAG, "No PSDS servers were specified in the GPS configuration"); mPsdsServers = null; Log.e(TAG, "No Long-Term PSDS servers were specified in the GnssConfiguration"); mLongTermPsdsServers = null; } else { mPsdsServers = new String[count]; mLongTermPsdsServers = new String[count]; count = 0; if (server1 != null) mPsdsServers[count++] = server1; if (server2 != null) mPsdsServers[count++] = server2; if (server3 != null) mPsdsServers[count++] = server3; if (longTermPsdsServer1 != null) mLongTermPsdsServers[count++] = longTermPsdsServer1; if (longTermPsdsServer2 != null) mLongTermPsdsServers[count++] = longTermPsdsServer2; if (longTermPsdsServer3 != null) mLongTermPsdsServers[count++] = longTermPsdsServer3; // randomize first server Random random = new Random(); mNextServerIndex = random.nextInt(count); } String normalPsdsServer = properties.getProperty("NORMAL_PSDS_SERVER"); String realtimePsdsServer = properties.getProperty("REALTIME_PSDS_SERVER"); mPsdsServers = new String[MAX_PSDS_TYPE_INDEX + 1]; mPsdsServers[NORMAL_PSDS_SERVER_INDEX] = normalPsdsServer; mPsdsServers[REALTIME_PSDS_SERVER_INDEX] = realtimePsdsServer; } byte[] downloadPsdsData() { @Nullable byte[] downloadPsdsData(int psdsType) { byte[] result = null; int startIndex = mNextServerIndex; if (mPsdsServers == null) { if (psdsType == LONG_TERM_PSDS_SERVER_INDEX && mLongTermPsdsServers == null) { return null; } else if (psdsType > LONG_TERM_PSDS_SERVER_INDEX && psdsType <= MAX_PSDS_TYPE_INDEX && mPsdsServers[psdsType] == null) { return null; } if (psdsType == LONG_TERM_PSDS_SERVER_INDEX) { // load balance our requests among the available servers while (result == null) { final int oldTag = TrafficStats.getAndSetThreadStatsTag( TrafficStatsConstants.TAG_SYSTEM_GPS); try { result = doDownload(mPsdsServers[mNextServerIndex]); } finally { TrafficStats.setThreadStatsTag(oldTag); } result = doDownloadWithTrafficAccounted(mLongTermPsdsServers[mNextServerIndex]); // increment mNextServerIndex and wrap around if necessary mNextServerIndex++; if (mNextServerIndex == mPsdsServers.length) { if (mNextServerIndex == mLongTermPsdsServers.length) { mNextServerIndex = 0; } // break if we have tried all the servers if (mNextServerIndex == startIndex) break; } } else if (psdsType > LONG_TERM_PSDS_SERVER_INDEX && psdsType <= MAX_PSDS_TYPE_INDEX) { result = doDownloadWithTrafficAccounted(mPsdsServers[psdsType]); } return result; } protected byte[] doDownload(String url) { @Nullable private byte[] doDownloadWithTrafficAccounted(String url) { byte[] result; final int oldTag = TrafficStats.getAndSetThreadStatsTag( TrafficStatsConstants.TAG_SYSTEM_GPS); try { result = doDownload(url); } finally { TrafficStats.setThreadStatsTag(oldTag); } return result; } @Nullable private byte[] doDownload(String url) { if (DEBUG) Log.d(TAG, "Downloading PSDS data from " + url); HttpURLConnection connection = null; Loading @@ -132,7 +161,7 @@ public class GpsPsdsDownloader { connection.connect(); int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK) { if (DEBUG) Log.d(TAG, "HTTP error downloading gps PSDS: " + statusCode); if (DEBUG) Log.d(TAG, "HTTP error downloading gnss PSDS: " + statusCode); return null; } Loading @@ -150,7 +179,7 @@ public class GpsPsdsDownloader { return bytes.toByteArray(); } } catch (IOException ioe) { if (DEBUG) Log.d(TAG, "Error downloading gps PSDS: ", ioe); if (DEBUG) Log.d(TAG, "Error downloading gnss PSDS: ", ioe); } finally { if (connection != null) { connection.disconnect(); Loading @@ -158,6 +187,4 @@ public class GpsPsdsDownloader { } return null; } }
services/core/jni/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -145,6 +145,7 @@ cc_defaults { "android.hardware.gnss@1.1", "android.hardware.gnss@2.0", "android.hardware.gnss@2.1", "android.hardware.gnss@3.0", "android.hardware.gnss.measurement_corrections@1.0", "android.hardware.gnss.visibility_control@1.0", "android.hardware.graphics.bufferqueue@1.0", Loading