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

Commit 99a2a725 authored by Soonil Nagarkar's avatar Soonil Nagarkar
Browse files

Make GnssStatus a Parcelable

This saves 24 bytes per serialization and makes code simpler. Also
includes some cleanup in GnssMetrics.

Bug: 152442920
Test: presubmits
Change-Id: I1eb1dfb68190c68e896e87c5bea1f2ec44065e80
parent 4361a858
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -23728,7 +23728,8 @@ package android.location {
    field public static final int STATUS_READY = 1; // 0x1
  }
  public final class GnssStatus {
  public final class GnssStatus implements android.os.Parcelable {
    method public int describeContents();
    method @FloatRange(from=0, to=360) public float getAzimuthDegrees(@IntRange(from=0) int);
    method @FloatRange(from=0, to=63) public float getBasebandCn0DbHz(@IntRange(from=0) int);
    method @FloatRange(from=0) public float getCarrierFrequencyHz(@IntRange(from=0) int);
@@ -23742,6 +23743,7 @@ package android.location {
    method public boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
    method public boolean hasEphemerisData(@IntRange(from=0) int);
    method public boolean usedInFix(@IntRange(from=0) int);
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
    field public static final int CONSTELLATION_GALILEO = 6; // 0x6
    field public static final int CONSTELLATION_GLONASS = 3; // 0x3
@@ -23750,6 +23752,7 @@ package android.location {
    field public static final int CONSTELLATION_QZSS = 4; // 0x4
    field public static final int CONSTELLATION_SBAS = 2; // 0x2
    field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
    field @NonNull public static final android.os.Parcelable.Creator<android.location.GnssStatus> CREATOR;
  }
  public static final class GnssStatus.Builder {
+19 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.location;

parcelable GnssStatus;
+80 −2
Original line number Diff line number Diff line
@@ -20,6 +20,10 @@ import android.annotation.FloatRange;
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.os.Parcel;
import android.os.Parcelable;

import com.android.internal.util.Preconditions;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -34,7 +38,7 @@ import java.util.Objects;
 * @see LocationManager#registerGnssStatusCallback
 * @see GnssStatus.Callback
 */
public final class GnssStatus {
public final class GnssStatus implements Parcelable {

    // These must match the definitions in GNSS HAL.
    //
@@ -128,6 +132,13 @@ public final class GnssStatus {
    public static GnssStatus wrap(int svCount, int[] svidWithFlags, float[] cn0DbHzs,
            float[] elevations, float[] azimuths, float[] carrierFrequencies,
            float[] basebandCn0DbHzs) {
        Preconditions.checkState(svCount >= 0);
        Preconditions.checkState(svidWithFlags.length >= svCount);
        Preconditions.checkState(elevations.length >= svCount);
        Preconditions.checkState(azimuths.length >= svCount);
        Preconditions.checkState(carrierFrequencies.length >= svCount);
        Preconditions.checkState(basebandCn0DbHzs.length >= svCount);

        return new GnssStatus(svCount, svidWithFlags, cn0DbHzs, elevations, azimuths,
                carrierFrequencies, basebandCn0DbHzs);
    }
@@ -368,6 +379,73 @@ public final class GnssStatus {
        return result;
    }

    public static final @NonNull Creator<GnssStatus> CREATOR = new Creator<GnssStatus>() {
        @Override
        public GnssStatus createFromParcel(Parcel in) {
            int svCount = in.readInt();
            int[] svidWithFlags = new int[svCount];
            float[] cn0DbHzs = new float[svCount];
            float[] elevations = new float[svCount];
            float[] azimuths = new float[svCount];
            float[] carrierFrequencies = new float[svCount];
            float[] basebandCn0DbHzs = new float[svCount];
            for (int i = 0; i < svCount; i++) {
                svidWithFlags[i] = in.readInt();
            }
            for (int i = 0; i < svCount; i++) {
                cn0DbHzs[i] = in.readFloat();
            }
            for (int i = 0; i < svCount; i++) {
                elevations[i] = in.readFloat();
            }
            for (int i = 0; i < svCount; i++) {
                azimuths[i] = in.readFloat();
            }
            for (int i = 0; i < svCount; i++) {
                carrierFrequencies[i] = in.readFloat();
            }
            for (int i = 0; i < svCount; i++) {
                basebandCn0DbHzs[i] = in.readFloat();
            }

            return new GnssStatus(svCount, svidWithFlags, cn0DbHzs, elevations, azimuths,
                    carrierFrequencies, basebandCn0DbHzs);
        }

        @Override
        public GnssStatus[] newArray(int size) {
            return new GnssStatus[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(@NonNull Parcel parcel, int flags) {
        parcel.writeInt(mSvCount);
        for (int i = 0; i < mSvCount; i++) {
            parcel.writeInt(mSvidWithFlags[i]);
        }
        for (int i = 0; i < mSvCount; i++) {
            parcel.writeFloat(mCn0DbHzs[i]);
        }
        for (int i = 0; i < mSvCount; i++) {
            parcel.writeFloat(mElevations[i]);
        }
        for (int i = 0; i < mSvCount; i++) {
            parcel.writeFloat(mAzimuths[i]);
        }
        for (int i = 0; i < mSvCount; i++) {
            parcel.writeFloat(mCarrierFrequencies[i]);
        }
        for (int i = 0; i < mSvCount; i++) {
            parcel.writeFloat(mBasebandCn0DbHzs[i]);
        }
    }

    /**
     * Builder class to help create new GnssStatus instances.
     */
@@ -451,7 +529,7 @@ public final class GnssStatus {
                basebandCn0DbHzs[i] = mSatellites.get(i).mBasebandCn0DbHz;
            }

            return wrap(svCount, svidWithFlags, cn0DbHzs, elevations, azimuths,
            return new GnssStatus(svCount, svidWithFlags, cn0DbHzs, elevations, azimuths,
                    carrierFrequencies, basebandCn0DbHzs);
        }
    }
+2 −4
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@

package android.location;

import android.location.Location;
import android.location.GnssStatus;

/**
 * {@hide}
@@ -26,8 +26,6 @@ oneway interface IGnssStatusListener
    void onGnssStarted();
    void onGnssStopped();
    void onFirstFix(int ttff);
    void onSvStatusChanged(int svCount, in int[] svidWithFlags, in float[] cn0s,
            in float[] elevations, in float[] azimuths,
            in float[] carrierFreqs, in float[] basebandCn0s);
    void onSvStatusChanged(in GnssStatus gnssStatus);
    void onNmeaReceived(long timestamp, String nmea);
}
+3 −7
Original line number Diff line number Diff line
@@ -2925,13 +2925,9 @@ public class LocationManager {
            }

            @Override
            public void onSvStatusChanged(int svCount, int[] svidWithFlags, float[] cn0s,
                    float[] elevations, float[] azimuths, float[] carrierFreqs,
                    float[] basebandCn0s) {
                GnssStatus localStatus = GnssStatus.wrap(svCount, svidWithFlags, cn0s,
                        elevations, azimuths, carrierFreqs, basebandCn0s);
                mGnssStatus = localStatus;
                deliverToListeners(callback -> callback.onSatelliteStatusChanged(localStatus));
            public void onSvStatusChanged(GnssStatus gnssStatus) {
                mGnssStatus = gnssStatus;
                deliverToListeners(callback -> callback.onSatelliteStatusChanged(gnssStatus));
            }

            @Override
Loading