1 /* 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 17 package android.location; 18 19 20 import com.android.internal.location.ProviderProperties; 21 22 /** 23 * An abstract superclass for location providers. A location provider 24 * provides periodic reports on the geographical location of the 25 * device. 26 * 27 * <p> Each provider has a set of criteria under which it may be used; 28 * for example, some providers require GPS hardware and visibility to 29 * a number of satellites; others require the use of the cellular 30 * radio, or access to a specific carrier's network, or to the 31 * internet. They may also have different battery consumption 32 * characteristics or monetary costs to the user. The {@link 33 * Criteria} class allows providers to be selected based on 34 * user-specified criteria. 35 */ 36 public class LocationProvider { 37 public static final int OUT_OF_SERVICE = 0; 38 public static final int TEMPORARILY_UNAVAILABLE = 1; 39 public static final int AVAILABLE = 2; 40 41 /** 42 * A regular expression matching characters that may not appear 43 * in the name of a LocationProvider 44 * @hide 45 */ 46 public static final String BAD_CHARS_REGEX = "[^a-zA-Z0-9]"; 47 48 private final String mName; 49 private final ProviderProperties mProperties; 50 51 /** 52 * Constructs a LocationProvider with the given name. Provider names must 53 * consist only of the characters [a-zA-Z0-9]. 54 * 55 * @throws IllegalArgumentException if name contains an illegal character 56 * 57 * @hide 58 */ 59 public LocationProvider(String name, ProviderProperties properties) { 60 if (name.matches(BAD_CHARS_REGEX)) { 61 throw new IllegalArgumentException("provider name contains illegal character: " + name); 62 } 63 mName = name; 64 mProperties = properties; 65 } 66 67 /** 68 * Returns the name of this provider. 69 */ 70 public String getName() { 71 return mName; 72 } 73 74 /** 75 * Returns true if this provider meets the given criteria, 76 * false otherwise. 77 */ 78 public boolean meetsCriteria(Criteria criteria) { 79 return propertiesMeetCriteria(mName, mProperties, criteria); 80 } 81 82 /** 83 * @hide 84 */ 85 public static boolean propertiesMeetCriteria(String name, ProviderProperties properties, 86 Criteria criteria) { 87 if (LocationManager.PASSIVE_PROVIDER.equals(name)) { 88 // passive provider never matches 89 return false; 90 } 91 if (properties == null) { 92 // unfortunately this can happen for provider in remote services 93 // that have not finished binding yet 94 return false; 95 } 96 97 if (criteria.getAccuracy() != Criteria.NO_REQUIREMENT && 98 criteria.getAccuracy() < properties.mAccuracy) { 99 return false; 100 } 101 if (criteria.getPowerRequirement() != Criteria.NO_REQUIREMENT && 102 criteria.getPowerRequirement() < properties.mPowerRequirement) { 103 return false; 104 } 105 if (criteria.isAltitudeRequired() && !properties.mSupportsAltitude) { 106 return false; 107 } 108 if (criteria.isSpeedRequired() && !properties.mSupportsSpeed) { 109 return false; 110 } 111 if (criteria.isBearingRequired() && !properties.mSupportsBearing) { 112 return false; 113 } 114 if (!criteria.isCostAllowed() && properties.mHasMonetaryCost) { 115 return false; 116 } 117 return true; 118 } 119 120 /** 121 * Returns true if the provider requires access to a 122 * data network (e.g., the Internet), false otherwise. 123 */ 124 public boolean requiresNetwork() { 125 return mProperties.mRequiresNetwork; 126 } 127 128 /** 129 * Returns true if the provider requires access to a 130 * satellite-based positioning system (e.g., GPS), false 131 * otherwise. 132 */ 133 public boolean requiresSatellite() { 134 return mProperties.mRequiresSatellite; 135 } 136 137 /** 138 * Returns true if the provider requires access to an appropriate 139 * cellular network (e.g., to make use of cell tower IDs), false 140 * otherwise. 141 */ 142 public boolean requiresCell() { 143 return mProperties.mRequiresCell; 144 } 145 146 /** 147 * Returns true if the use of this provider may result in a 148 * monetary charge to the user, false if use is free. It is up to 149 * each provider to give accurate information. 150 */ 151 public boolean hasMonetaryCost() { 152 return mProperties.mHasMonetaryCost; 153 } 154 155 /** 156 * Returns true if the provider is able to provide altitude 157 * information, false otherwise. A provider that reports altitude 158 * under most circumstances but may occassionally not report it 159 * should return true. 160 */ 161 public boolean supportsAltitude() { 162 return mProperties.mSupportsAltitude; 163 } 164 165 /** 166 * Returns true if the provider is able to provide speed 167 * information, false otherwise. A provider that reports speed 168 * under most circumstances but may occassionally not report it 169 * should return true. 170 */ 171 public boolean supportsSpeed() { 172 return mProperties.mSupportsSpeed; 173 } 174 175 /** 176 * Returns true if the provider is able to provide bearing 177 * information, false otherwise. A provider that reports bearing 178 * under most circumstances but may occassionally not report it 179 * should return true. 180 */ 181 public boolean supportsBearing() { 182 return mProperties.mSupportsBearing; 183 } 184 185 /** 186 * Returns the power requirement for this provider. 187 * 188 * @return the power requirement for this provider, as one of the 189 * constants Criteria.POWER_REQUIREMENT_*. 190 */ 191 public int getPowerRequirement() { 192 return mProperties.mPowerRequirement; 193 } 194 195 /** 196 * Returns a constant describing horizontal accuracy of this provider. 197 * If the provider returns finer grain or exact location, 198 * {@link Criteria#ACCURACY_FINE} is returned, otherwise if the 199 * location is only approximate then {@link Criteria#ACCURACY_COARSE} 200 * is returned. 201 */ 202 public int getAccuracy() { 203 return mProperties.mAccuracy; 204 } 205 } 206