Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 84a2fa4b authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add GNSS HAL v3.0 (framework/base)"

parents a5256cac a52510ef
Loading
Loading
Loading
Loading
+13 −11
Original line number Diff line number Diff line
@@ -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);
            }
        }
    }
@@ -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");
@@ -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);
@@ -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());
            }

@@ -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);
@@ -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);
    }

    /**
@@ -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;
+2 −2
Original line number Diff line number Diff line
@@ -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
+3 −3
Original line number Diff line number Diff line
@@ -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);
@@ -212,8 +212,8 @@ class GnssNative {
    }

    @NativeEntryPoint
    private void psdsDownloadRequest() {
        mCallbacks.psdsDownloadRequest();
    private void psdsDownloadRequest(int psdsType) {
        mCallbacks.psdsDownloadRequest(psdsType);
    }

    @NativeEntryPoint
+65 −38
Original line number Diff line number Diff line
@@ -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;
@@ -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");
@@ -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;
@@ -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;
            }

@@ -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();
@@ -158,6 +187,4 @@ public class GpsPsdsDownloader {
        }
        return null;
    }

}
+1 −0
Original line number Diff line number Diff line
@@ -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