1ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa/* 2ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Copyright (C) 2014 The Android Open Source Project 3ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * 4ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Licensed under the Apache License, Version 2.0 (the "License"); 5ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * you may not use this file except in compliance with the License. 6ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * You may obtain a copy of the License at 7ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * 8ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * http://www.apache.org/licenses/LICENSE-2.0 9ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * 10ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Unless required by applicable law or agreed to in writing, software 11ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * distributed under the License is distributed on an "AS IS" BASIS, 12ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * See the License for the specific language governing permissions and 14ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * limitations under the License 15ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 16ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 17ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaapackage android.location; 18ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 19ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaimport android.annotation.NonNull; 20a62050d42c7d76d57ae555ffcb6d8efc5cf79de1destradaaimport android.annotation.SystemApi; 21ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaimport android.os.Parcel; 22ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaimport android.os.Parcelable; 23ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 24ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaimport java.security.InvalidParameterException; 25ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaimport java.util.Arrays; 26ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaimport java.util.Collection; 27ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaimport java.util.Collections; 28ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 29ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa/** 30ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * A class implementing a container for data associated with a measurement event. 31ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Events are delivered to registered instances of {@link Listener}. 32ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * 33ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * @hide 34ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 35a62050d42c7d76d57ae555ffcb6d8efc5cf79de1destradaa@SystemApi 36ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaapublic class GpsMeasurementsEvent implements Parcelable { 376568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa 386568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa /** 396568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa * The system does not support tracking of GPS Measurements. This status will not change in the 406568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa * future. 416568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa */ 426568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa public static final int STATUS_NOT_SUPPORTED = 0; 436568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa 446568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa /** 456568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa * GPS Measurements are successfully being tracked, it will receive updates once they are 466568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa * available. 476568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa */ 486568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa public static final int STATUS_READY = 1; 496568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa 506568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa /** 516568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa * GPS provider or Location is disabled, updates will not be received until they are enabled. 526568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa */ 536568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa public static final int STATUS_GPS_LOCATION_DISABLED = 2; 546568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa 55ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa private final GpsClock mClock; 56ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa private final Collection<GpsMeasurement> mReadOnlyMeasurements; 57ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 58ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 59ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Used for receiving GPS satellite measurements from the GPS engine. 60ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Each measurement contains raw and computed data identifying a satellite. 61ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * You can implement this interface and call {@link LocationManager#addGpsMeasurementListener}. 62ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * 63ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * @hide 64ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 65a62050d42c7d76d57ae555ffcb6d8efc5cf79de1destradaa @SystemApi 66ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa public interface Listener { 676568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa 686568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa /** 696568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa * Returns the latest collected GPS Measurements. 706568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa */ 71ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa void onGpsMeasurementsReceived(GpsMeasurementsEvent eventArgs); 726568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa 736568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa /** 746568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa * Returns the latest status of the GPS Measurements sub-system. 756568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa */ 766568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa void onStatusChanged(int status); 77ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 78ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 79ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa public GpsMeasurementsEvent(GpsClock clock, GpsMeasurement[] measurements) { 80ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (clock == null) { 81ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa throw new InvalidParameterException("Parameter 'clock' must not be null."); 82ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 83ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa if (measurements == null || measurements.length == 0) { 84ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa throw new InvalidParameterException( 85ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa "Parameter 'measurements' must not be null or empty."); 86ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 87ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 88ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa mClock = clock; 89ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa Collection<GpsMeasurement> measurementCollection = Arrays.asList(measurements); 90ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa mReadOnlyMeasurements = Collections.unmodifiableCollection(measurementCollection); 91ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 92ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 93ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa @NonNull 94ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa public GpsClock getClock() { 95ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return mClock; 96ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 97ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 98ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 99ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Gets a read-only collection of measurements associated with the current event. 100ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 101ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa @NonNull 102ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa public Collection<GpsMeasurement> getMeasurements() { 103ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return mReadOnlyMeasurements; 104ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 105ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 106ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa public static final Creator<GpsMeasurementsEvent> CREATOR = 107ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa new Creator<GpsMeasurementsEvent>() { 108ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa @Override 109ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa public GpsMeasurementsEvent createFromParcel(Parcel in) { 110ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa ClassLoader classLoader = getClass().getClassLoader(); 111ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 112ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa GpsClock clock = in.readParcelable(classLoader); 113ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 114ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa int measurementsLength = in.readInt(); 115ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa GpsMeasurement[] measurementsArray = new GpsMeasurement[measurementsLength]; 116ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa in.readTypedArray(measurementsArray, GpsMeasurement.CREATOR); 117ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 118ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return new GpsMeasurementsEvent(clock, measurementsArray); 119ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 120ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 121ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa @Override 122ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa public GpsMeasurementsEvent[] newArray(int size) { 123ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return new GpsMeasurementsEvent[size]; 124ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 125ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa }; 126ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 127ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa @Override 128ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa public int describeContents() { 129ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return 0; 130ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 131ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 132ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa @Override 133ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa public void writeToParcel(Parcel parcel, int flags) { 134ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa parcel.writeParcelable(mClock, flags); 135ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 1366568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa int measurementsCount = mReadOnlyMeasurements.size(); 1376568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa GpsMeasurement[] measurementsArray = 1386568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa mReadOnlyMeasurements.toArray(new GpsMeasurement[measurementsCount]); 139ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa parcel.writeInt(measurementsArray.length); 140ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa parcel.writeTypedArray(measurementsArray, flags); 141ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 142ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 143ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa @Override 144ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa public String toString() { 145ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa StringBuilder builder = new StringBuilder("[ GpsMeasurementsEvent:\n\n"); 146ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 147ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa builder.append(mClock.toString()); 148ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa builder.append("\n"); 149ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 150ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa for (GpsMeasurement measurement : mReadOnlyMeasurements) { 151ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa builder.append(measurement.toString()); 152ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa builder.append("\n"); 153ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 154ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 155ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa builder.append("]"); 156ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 157ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return builder.toString(); 158ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 159ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa} 160