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

Commit 79b56f76 authored by Anil Admal's avatar Anil Admal Committed by Android (Google) Code Review
Browse files

Merge "rename vendor proprietary name XTRA to PSDS" into qt-dev

parents e9e58774 8c6ac67a
Loading
Loading
Loading
Loading
+62 −61
Original line number Diff line number Diff line
@@ -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;
@@ -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
@@ -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;
@@ -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;
@@ -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";
@@ -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);
@@ -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();
            }
        }
    }
@@ -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()");
                }
            }
        });
@@ -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) {
@@ -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);
@@ -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);
    }

    /**
@@ -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);
@@ -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:
@@ -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();
+20 −20
Original line number Diff line number Diff line
@@ -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");
@@ -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();
@@ -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;
        }

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

@@ -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();
+9 −9
Original line number Diff line number Diff line
@@ -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;
@@ -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();
}
@@ -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");
@@ -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");
@@ -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 *>(