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