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

Commit 1f401d75 authored by Yu-Han Yang's avatar Yu-Han Yang
Browse files

Support concurrent PSDS downloads

Currently if mDownloadPsdsDataPending is STATE_DOWNLOADING, a concurrent
PSDS download request will be rejected. This change will allow multiple
downloads to run concurrently.

Bug: 166660953
Test: on cuttlefish
Change-Id: I4275457bc2fc4c2b8b19d326a955b0d9f8998771
parent 9ed149dd
Loading
Loading
Loading
Loading
+36 −40
Original line number Original line Diff line number Diff line
@@ -85,7 +85,9 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.List;
import java.util.Set;


/**
/**
 * A GNSS implementation of LocationProvider used by LocationManager.
 * A GNSS implementation of LocationProvider used by LocationManager.
@@ -181,7 +183,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
    private static final int INJECT_NTP_TIME = 5;
    private static final int INJECT_NTP_TIME = 5;
    // PSDS stands for Predicted Satellite Data Service
    // PSDS stands for Predicted Satellite Data Service
    private static final int DOWNLOAD_PSDS_DATA = 6;
    private static final int DOWNLOAD_PSDS_DATA = 6;
    private static final int DOWNLOAD_PSDS_DATA_FINISHED = 11;
    private static final int INITIALIZE_HANDLER = 13;
    private static final int INITIALIZE_HANDLER = 13;
    private static final int REQUEST_LOCATION = 16;
    private static final int REQUEST_LOCATION = 16;
    private static final int REPORT_LOCATION = 17; // HAL reports location
    private static final int REPORT_LOCATION = 17; // HAL reports location
@@ -288,6 +289,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
    private static final long DOWNLOAD_PSDS_DATA_TIMEOUT_MS = 60 * 1000;
    private static final long DOWNLOAD_PSDS_DATA_TIMEOUT_MS = 60 * 1000;
    private static final long WAKELOCK_TIMEOUT_MILLIS = 30 * 1000;
    private static final long WAKELOCK_TIMEOUT_MILLIS = 30 * 1000;


    @GuardedBy("mLock")
    private final ExponentialBackOff mPsdsBackOff = new ExponentialBackOff(RETRY_INTERVAL,
    private final ExponentialBackOff mPsdsBackOff = new ExponentialBackOff(RETRY_INTERVAL,
            MAX_RETRY_INTERVAL);
            MAX_RETRY_INTERVAL);


@@ -297,14 +299,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements


    private boolean mShutdown;
    private boolean mShutdown;


    // states for injecting ntp and downloading psds data
    @GuardedBy("mLock")
    private static final int STATE_PENDING_NETWORK = 0;
    private Set<Integer> mPendingDownloadPsdsTypes = new HashSet<>();
    private static final int STATE_DOWNLOADING = 1;
    private static final int STATE_IDLE = 2;

    // 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
    // true if GPS is navigating
    private boolean mNavigating;
    private boolean mNavigating;
@@ -610,6 +606,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
        mNIHandler = new GpsNetInitiatedHandler(context,
        mNIHandler = new GpsNetInitiatedHandler(context,
                mNetInitiatedListener,
                mNetInitiatedListener,
                mSuplEsEnabled);
                mSuplEsEnabled);
        // Trigger PSDS data download when the network comes up after booting.
        mPendingDownloadPsdsTypes.add(GnssPsdsDownloader.LONG_TERM_PSDS_SERVER_INDEX);
        mNetworkConnectivityHandler = new GnssNetworkConnectivityHandler(context,
        mNetworkConnectivityHandler = new GnssNetworkConnectivityHandler(context,
                GnssLocationProvider.this::onNetworkAvailable, mLooper, mNIHandler);
                GnssLocationProvider.this::onNetworkAvailable, mLooper, mNIHandler);


@@ -670,10 +668,13 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
     */
     */
    private void onNetworkAvailable() {
    private void onNetworkAvailable() {
        mNtpTimeHelper.onNetworkAvailable();
        mNtpTimeHelper.onNetworkAvailable();
        if (mDownloadPsdsDataPending == STATE_PENDING_NETWORK) {
            if (mSupportsPsds) {
        // Download only if supported, (prevents an unnecessary on-boot download)
        // Download only if supported, (prevents an unnecessary on-boot download)
                psdsDownloadRequest(/* psdsType= */ GnssPsdsDownloader.LONG_TERM_PSDS_SERVER_INDEX);
        if (mSupportsPsds) {
            synchronized (mLock) {
                for (int psdsType : mPendingDownloadPsdsTypes) {
                    downloadPsdsData(psdsType);
                }
                mPendingDownloadPsdsTypes.clear();
            }
            }
        }
        }
    }
    }
@@ -799,17 +800,13 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
            Log.d(TAG, "handleDownloadPsdsData() called when PSDS not supported");
            Log.d(TAG, "handleDownloadPsdsData() called when PSDS not supported");
            return;
            return;
        }
        }
        if (mDownloadPsdsDataPending == STATE_DOWNLOADING) {
            // already downloading data
            return;
        }
        if (!mNetworkConnectivityHandler.isDataNetworkConnected()) {
        if (!mNetworkConnectivityHandler.isDataNetworkConnected()) {
            // try again when network is up
            // try again when network is up
            mDownloadPsdsDataPending = STATE_PENDING_NETWORK;
            synchronized (mLock) {
                mPendingDownloadPsdsTypes.add(psdsType);
            }
            return;
            return;
        }
        }
        mDownloadPsdsDataPending = STATE_DOWNLOADING;

        synchronized (mLock) {
        synchronized (mLock) {
            // hold wake lock while task runs
            // hold wake lock while task runs
            mDownloadPsdsWakeLock.acquire(DOWNLOAD_PSDS_DATA_TIMEOUT_MS);
            mDownloadPsdsWakeLock.acquire(DOWNLOAD_PSDS_DATA_TIMEOUT_MS);
@@ -820,20 +817,24 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
                    mGnssConfiguration.getProperties());
                    mGnssConfiguration.getProperties());
            byte[] data = psdsDownloader.downloadPsdsData(psdsType);
            byte[] data = psdsDownloader.downloadPsdsData(psdsType);
            if (data != null) {
            if (data != null) {
                mHandler.post(() -> {
                    if (DEBUG) Log.d(TAG, "calling native_inject_psds_data");
                    if (DEBUG) Log.d(TAG, "calling native_inject_psds_data");
                    native_inject_psds_data(data, data.length, psdsType);
                    native_inject_psds_data(data, data.length, psdsType);
                    synchronized (mLock) {
                        mPsdsBackOff.reset();
                        mPsdsBackOff.reset();
                    }
                    }

                });
            sendMessage(DOWNLOAD_PSDS_DATA_FINISHED, 0, null);
            } else {

                // Try download PSDS data again later according to backoff time.
            if (data == null) {
                // Since this is delayed and not urgent, we do not hold a wake lock here.
                // try again later
                // The arg2 below should not be 1 otherwise the wakelock will be under-locked.
                // since this is delayed and not urgent we do not hold a wake lock here
                long backoffMillis;
                // the arg2 below should not be 1 otherwise the wakelock will be under-locked.
                synchronized (mLock) {
                    backoffMillis = mPsdsBackOff.nextBackoffMillis();
                }
                mHandler.sendMessageDelayed(
                mHandler.sendMessageDelayed(
                        mHandler.obtainMessage(DOWNLOAD_PSDS_DATA, psdsType, 0, null),
                        mHandler.obtainMessage(DOWNLOAD_PSDS_DATA, psdsType, 0, null),
                        mPsdsBackOff.nextBackoffMillis());
                        backoffMillis);
            }
            }


            // Release wake lock held by task, synchronize on mLock in case multiple
            // Release wake lock held by task, synchronize on mLock in case multiple
@@ -1128,7 +1129,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
                requestUtcTime();
                requestUtcTime();
            } else if ("force_psds_injection".equals(command)) {
            } else if ("force_psds_injection".equals(command)) {
                if (mSupportsPsds) {
                if (mSupportsPsds) {
                    psdsDownloadRequest(/* psdsType= */
                    downloadPsdsData(/* psdsType= */
                            GnssPsdsDownloader.LONG_TERM_PSDS_SERVER_INDEX);
                            GnssPsdsDownloader.LONG_TERM_PSDS_SERVER_INDEX);
                }
                }
            } else {
            } else {
@@ -1581,8 +1582,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
        reportLocation(locations);
        reportLocation(locations);
    }
    }


    void psdsDownloadRequest(int psdsType) {
    void downloadPsdsData(int psdsType) {
        if (DEBUG) Log.d(TAG, "psdsDownloadRequest. psdsType: " + psdsType);
        if (DEBUG) Log.d(TAG, "downloadPsdsData. psdsType: " + psdsType);
        sendMessage(DOWNLOAD_PSDS_DATA, psdsType, null);
        sendMessage(DOWNLOAD_PSDS_DATA, psdsType, null);
    }
    }


@@ -1896,9 +1897,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
                case DOWNLOAD_PSDS_DATA:
                case DOWNLOAD_PSDS_DATA:
                    handleDownloadPsdsData(msg.arg1);
                    handleDownloadPsdsData(msg.arg1);
                    break;
                    break;
                case DOWNLOAD_PSDS_DATA_FINISHED:
                    mDownloadPsdsDataPending = STATE_IDLE;
                    break;
                case INITIALIZE_HANDLER:
                case INITIALIZE_HANDLER:
                    handleInitialize();
                    handleInitialize();
                    break;
                    break;
@@ -2007,8 +2005,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
                return "REQUEST_LOCATION";
                return "REQUEST_LOCATION";
            case DOWNLOAD_PSDS_DATA:
            case DOWNLOAD_PSDS_DATA:
                return "DOWNLOAD_PSDS_DATA";
                return "DOWNLOAD_PSDS_DATA";
            case DOWNLOAD_PSDS_DATA_FINISHED:
                return "DOWNLOAD_PSDS_DATA_FINISHED";
            case INITIALIZE_HANDLER:
            case INITIALIZE_HANDLER:
                return "INITIALIZE_HANDLER";
                return "INITIALIZE_HANDLER";
            case REPORT_LOCATION:
            case REPORT_LOCATION:
+1 −1
Original line number Original line Diff line number Diff line
@@ -519,7 +519,7 @@ public class GnssManagerService implements GnssNative.Callbacks {


    @Override
    @Override
    public void psdsDownloadRequest(int psdsType) {
    public void psdsDownloadRequest(int psdsType) {
        mGnssLocationProvider.psdsDownloadRequest(psdsType);
        mGnssLocationProvider.downloadPsdsData(psdsType);
    }
    }


    @Override
    @Override