blob: 26f73f7848799cae67c28190e50fb4517ddb0c81 [file] [log] [blame]
Alan Viverette3da604b2020-06-10 18:34:39 +00001/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.location;
18
19import android.annotation.IntDef;
20import android.annotation.NonNull;
21import android.os.Parcel;
22import android.os.Parcelable;
23
24import com.android.internal.util.Preconditions;
25
26import java.lang.annotation.Retention;
27import java.lang.annotation.RetentionPolicy;
28
29/**
30 * A class indicating the application criteria for selecting a
31 * location provider. Providers may be ordered according to accuracy,
32 * power usage, ability to report altitude, speed, bearing, and monetary
33 * cost.
34 */
35public class Criteria implements Parcelable {
36
37 /** @hide */
38 @Retention(RetentionPolicy.SOURCE)
39 @IntDef({NO_REQUIREMENT, POWER_LOW, POWER_MEDIUM, POWER_HIGH})
40 public @interface PowerRequirement {
41 }
42
43 /** @hide */
44 @Retention(RetentionPolicy.SOURCE)
45 @IntDef({NO_REQUIREMENT, ACCURACY_LOW, ACCURACY_MEDIUM, ACCURACY_HIGH})
46 public @interface AccuracyRequirement {
47 }
48
49 /** @hide */
50 @Retention(RetentionPolicy.SOURCE)
51 @IntDef({NO_REQUIREMENT, ACCURACY_FINE, ACCURACY_COARSE})
52 public @interface LocationAccuracyRequirement {
53 }
54
55 /**
56 * A constant indicating that the application does not choose to
57 * place requirement on a particular feature.
58 */
59 public static final int NO_REQUIREMENT = 0;
60
61 /**
62 * A constant indicating a low power requirement.
63 */
64 public static final int POWER_LOW = 1;
65
66 /**
67 * A constant indicating a medium power requirement.
68 */
69 public static final int POWER_MEDIUM = 2;
70
71 /**
72 * A constant indicating a high power requirement.
73 */
74 public static final int POWER_HIGH = 3;
75
76 /**
77 * A constant indicating a finer location accuracy requirement
78 */
79 public static final int ACCURACY_FINE = 1;
80
81 /**
82 * A constant indicating an approximate accuracy requirement
83 */
84 public static final int ACCURACY_COARSE = 2;
85
86 /**
87 * A constant indicating a low location accuracy requirement
88 * - may be used for horizontal, altitude, speed or bearing accuracy.
89 * For horizontal and vertical position this corresponds roughly to
90 * an accuracy of greater than 500 meters.
91 */
92 public static final int ACCURACY_LOW = 1;
93
94 /**
95 * A constant indicating a medium accuracy requirement
96 * - currently used only for horizontal accuracy.
97 * For horizontal position this corresponds roughly to to an accuracy
98 * of between 100 and 500 meters.
99 */
100 public static final int ACCURACY_MEDIUM = 2;
101
102 /**
103 * a constant indicating a high accuracy requirement
104 * - may be used for horizontal, altitude, speed or bearing accuracy.
105 * For horizontal and vertical position this corresponds roughly to
106 * an accuracy of less than 100 meters.
107 */
108 public static final int ACCURACY_HIGH = 3;
109
110 private int mHorizontalAccuracy = NO_REQUIREMENT;
111 private int mVerticalAccuracy = NO_REQUIREMENT;
112 private int mSpeedAccuracy = NO_REQUIREMENT;
113 private int mBearingAccuracy = NO_REQUIREMENT;
114 private int mPowerRequirement = NO_REQUIREMENT;
115 private boolean mAltitudeRequired = false;
116 private boolean mBearingRequired = false;
117 private boolean mSpeedRequired = false;
118 private boolean mCostAllowed = false;
119
120 /**
121 * Constructs a new Criteria object. The new object will have no
122 * requirements on accuracy, power, or response time; will not
123 * require altitude, speed, or bearing; and will not allow monetary
124 * cost.
125 */
126 public Criteria() {
127 }
128
129 /**
130 * Constructs a new Criteria object that is a copy of the given criteria.
131 */
132 public Criteria(Criteria criteria) {
133 mHorizontalAccuracy = criteria.mHorizontalAccuracy;
134 mVerticalAccuracy = criteria.mVerticalAccuracy;
135 mSpeedAccuracy = criteria.mSpeedAccuracy;
136 mBearingAccuracy = criteria.mBearingAccuracy;
137 mPowerRequirement = criteria.mPowerRequirement;
138 mAltitudeRequired = criteria.mAltitudeRequired;
139 mBearingRequired = criteria.mBearingRequired;
140 mSpeedRequired = criteria.mSpeedRequired;
141 mCostAllowed = criteria.mCostAllowed;
142 }
143
144 /**
145 * Indicates the desired horizontal accuracy (latitude and longitude). Accuracy may be
146 * {@link #ACCURACY_LOW}, {@link #ACCURACY_MEDIUM}, {@link #ACCURACY_HIGH} or
147 * {@link #NO_REQUIREMENT}. More accurate location may consume more power and may take longer.
148 *
149 * @throws IllegalArgumentException if accuracy is not one of the supported constants
150 */
151 public void setHorizontalAccuracy(@AccuracyRequirement int accuracy) {
152 mHorizontalAccuracy = Preconditions.checkArgumentInRange(accuracy, NO_REQUIREMENT,
153 ACCURACY_HIGH, "accuracy");
154 }
155
156 /**
157 * Returns a constant indicating the desired horizontal accuracy (latitude and longitude).
158 *
159 * @see #setHorizontalAccuracy(int)
160 */
161 @AccuracyRequirement
162 public int getHorizontalAccuracy() {
163 return mHorizontalAccuracy;
164 }
165
166 /**
167 * Indicates the desired vertical accuracy (altitude). Accuracy may be {@link #ACCURACY_LOW},
168 * {@link #ACCURACY_MEDIUM}, {@link #ACCURACY_HIGH} or {@link #NO_REQUIREMENT}. More accurate
169 * location may consume more power and may take longer.
170 *
171 * @throws IllegalArgumentException if accuracy is not one of the supported constants
172 */
173 public void setVerticalAccuracy(@AccuracyRequirement int accuracy) {
174 mVerticalAccuracy = Preconditions.checkArgumentInRange(accuracy, NO_REQUIREMENT,
175 ACCURACY_HIGH, "accuracy");
176 }
177
178 /**
179 * Returns a constant indicating the desired vertical accuracy (altitude).
180 *
181 * @see #setVerticalAccuracy(int)
182 */
183 @AccuracyRequirement
184 public int getVerticalAccuracy() {
185 return mVerticalAccuracy;
186 }
187
188 /**
189 * Indicates the desired speed accuracy. Accuracy may be {@link #ACCURACY_LOW},
190 * {@link #ACCURACY_MEDIUM}, {@link #ACCURACY_HIGH}, or {@link #NO_REQUIREMENT}. More accurate
191 * location may consume more power and may take longer.
192 *
193 * @throws IllegalArgumentException if accuracy is not one of the supported constants
194 */
195 public void setSpeedAccuracy(@AccuracyRequirement int accuracy) {
196 mSpeedAccuracy = Preconditions.checkArgumentInRange(accuracy, NO_REQUIREMENT, ACCURACY_HIGH,
197 "accuracy");
198 }
199
200 /**
201 * Returns a constant indicating the desired speed accuracy.
202 *
203 * @see #setSpeedAccuracy(int)
204 */
205 @AccuracyRequirement
206 public int getSpeedAccuracy() {
207 return mSpeedAccuracy;
208 }
209
210 /**
211 * Indicates the desired bearing accuracy. Accuracy may be {@link #ACCURACY_LOW},
212 * {@link #ACCURACY_MEDIUM}, {@link #ACCURACY_HIGH}, or {@link #NO_REQUIREMENT}. More accurate
213 * location may consume more power and may take longer.
214 *
215 * @throws IllegalArgumentException if accuracy is not one of the supported constants
216 */
217 public void setBearingAccuracy(@AccuracyRequirement int accuracy) {
218 mBearingAccuracy = Preconditions.checkArgumentInRange(accuracy, NO_REQUIREMENT,
219 ACCURACY_HIGH, "accuracy");
220 }
221
222 /**
223 * Returns a constant indicating the desired bearing accuracy.
224 *
225 * @see #setBearingAccuracy(int)
226 */
227 @AccuracyRequirement
228 public int getBearingAccuracy() {
229 return mBearingAccuracy;
230 }
231
232 /**
233 * Indicates the desired accuracy for latitude and longitude. Accuracy may be
234 * {@link #ACCURACY_FINE} or {@link #ACCURACY_COARSE}. More accurate location may consume more
235 * power and may take longer.
236 *
237 * @throws IllegalArgumentException if accuracy is not one of the supported constants
238 */
239 public void setAccuracy(@LocationAccuracyRequirement int accuracy) {
240 Preconditions.checkArgumentInRange(accuracy, NO_REQUIREMENT, ACCURACY_COARSE, "accuracy");
241 switch (accuracy) {
242 case NO_REQUIREMENT:
243 setHorizontalAccuracy(NO_REQUIREMENT);
244 break;
245 case ACCURACY_FINE:
246 setHorizontalAccuracy(ACCURACY_HIGH);
247 break;
248 case ACCURACY_COARSE:
249 setHorizontalAccuracy(ACCURACY_LOW);
250 break;
251 }
252 }
253
254 /**
255 * Returns a constant indicating desired accuracy of location.
256 *
257 * @see #setAccuracy(int)
258 */
259 @LocationAccuracyRequirement
260 public int getAccuracy() {
261 if (mHorizontalAccuracy >= ACCURACY_HIGH) {
262 return ACCURACY_FINE;
263 } else {
264 return ACCURACY_COARSE;
265 }
266 }
267
268 /**
269 * Indicates the desired maximum power requirement. The power requirement parameter may be
270 * {@link #NO_REQUIREMENT}, {@link #POWER_LOW}, {@link #POWER_MEDIUM}, or {@link #POWER_HIGH}.
271 */
272 public void setPowerRequirement(@PowerRequirement int powerRequirement) {
273 mPowerRequirement = Preconditions.checkArgumentInRange(powerRequirement, NO_REQUIREMENT,
274 POWER_HIGH, "powerRequirement");
275 }
276
277 /**
278 * Returns a constant indicating the desired maximum power requirement.
279 *
280 * @see #setPowerRequirement(int)
281 */
282 @PowerRequirement
283 public int getPowerRequirement() {
284 return mPowerRequirement;
285 }
286
287 /**
288 * Indicates whether the provider is allowed to incur monetary cost.
289 */
290 public void setCostAllowed(boolean costAllowed) {
291 mCostAllowed = costAllowed;
292 }
293
294 /**
295 * Returns whether the provider is allowed to incur monetary cost.
296 */
297 public boolean isCostAllowed() {
298 return mCostAllowed;
299 }
300
301 /**
302 * Indicates whether the provider must provide altitude information. Not all fixes are
303 * guaranteed to contain such information.
304 */
305 public void setAltitudeRequired(boolean altitudeRequired) {
306 mAltitudeRequired = altitudeRequired;
307 }
308
309 /**
310 * Returns whether the provider must provide altitude information.
311 *
312 * @see #setAltitudeRequired(boolean)
313 */
314 public boolean isAltitudeRequired() {
315 return mAltitudeRequired;
316 }
317
318 /**
319 * Indicates whether the provider must provide speed information. Not all fixes are guaranteed
320 * to contain such information.
321 */
322 public void setSpeedRequired(boolean speedRequired) {
323 mSpeedRequired = speedRequired;
324 }
325
326 /**
327 * Returns whether the provider must provide speed information.
328 *
329 * @see #setSpeedRequired(boolean)
330 */
331 public boolean isSpeedRequired() {
332 return mSpeedRequired;
333 }
334
335 /**
336 * Indicates whether the provider must provide bearing information. Not all fixes are guaranteed
337 * to contain such information.
338 */
339 public void setBearingRequired(boolean bearingRequired) {
340 mBearingRequired = bearingRequired;
341 }
342
343 /**
344 * Returns whether the provider must provide bearing information.
345 *
346 * @see #setBearingRequired(boolean)
347 */
348 public boolean isBearingRequired() {
349 return mBearingRequired;
350 }
351
352 @NonNull
353 public static final Parcelable.Creator<Criteria> CREATOR =
354 new Parcelable.Creator<Criteria>() {
355 @Override
356 public Criteria createFromParcel(Parcel in) {
357 Criteria c = new Criteria();
358 c.mHorizontalAccuracy = in.readInt();
359 c.mVerticalAccuracy = in.readInt();
360 c.mSpeedAccuracy = in.readInt();
361 c.mBearingAccuracy = in.readInt();
362 c.mPowerRequirement = in.readInt();
363 c.mAltitudeRequired = in.readInt() != 0;
364 c.mBearingRequired = in.readInt() != 0;
365 c.mSpeedRequired = in.readInt() != 0;
366 c.mCostAllowed = in.readInt() != 0;
367 return c;
368 }
369
370 @Override
371 public Criteria[] newArray(int size) {
372 return new Criteria[size];
373 }
374 };
375
376 @Override
377 public int describeContents() {
378 return 0;
379 }
380
381 @Override
382 public void writeToParcel(Parcel parcel, int flags) {
383 parcel.writeInt(mHorizontalAccuracy);
384 parcel.writeInt(mVerticalAccuracy);
385 parcel.writeInt(mSpeedAccuracy);
386 parcel.writeInt(mBearingAccuracy);
387 parcel.writeInt(mPowerRequirement);
388 parcel.writeInt(mAltitudeRequired ? 1 : 0);
389 parcel.writeInt(mBearingRequired ? 1 : 0);
390 parcel.writeInt(mSpeedRequired ? 1 : 0);
391 parcel.writeInt(mCostAllowed ? 1 : 0);
392 }
393
394 @Override
395 public String toString() {
396 StringBuilder s = new StringBuilder();
397 s.append("Criteria[");
398 s.append("power=").append(requirementToString(mPowerRequirement)).append(", ");
399 s.append("accuracy=").append(requirementToString(mHorizontalAccuracy));
400 if (mVerticalAccuracy != NO_REQUIREMENT) {
401 s.append(", verticalAccuracy=").append(requirementToString(mVerticalAccuracy));
402 }
403 if (mSpeedAccuracy != NO_REQUIREMENT) {
404 s.append(", speedAccuracy=").append(requirementToString(mSpeedAccuracy));
405 }
406 if (mBearingAccuracy != NO_REQUIREMENT) {
407 s.append(", bearingAccuracy=").append(requirementToString(mBearingAccuracy));
408 }
409 if (mAltitudeRequired || mBearingRequired || mSpeedRequired) {
410 s.append(", required=[");
411 if (mAltitudeRequired) {
412 s.append("altitude, ");
413 }
414 if (mBearingRequired) {
415 s.append("bearing, ");
416 }
417 if (mSpeedRequired) {
418 s.append("speed, ");
419 }
420 s.setLength(s.length() - 2);
421 s.append("]");
422 }
423 if (mCostAllowed) {
424 s.append(", costAllowed");
425 }
426 s.append(']');
427 return s.toString();
428 }
429
430 private static String requirementToString(int power) {
431 switch (power) {
432 case NO_REQUIREMENT:
433 return "None";
434 //case ACCURACY_LOW:
435 case POWER_LOW:
436 return "Low";
437 //case ACCURACY_MEDIUM:
438 case POWER_MEDIUM:
439 return "Medium";
440 //case ACCURACY_HIGH:
441 case POWER_HIGH:
442 return "High";
443 default:
444 return "???";
445 }
446 }
447}