|  | /* | 
|  | * Copyright (C) 2007 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; | 
|  |  | 
|  |  | 
|  | import com.android.internal.location.ProviderProperties; | 
|  |  | 
|  | /** | 
|  | * An abstract superclass for location providers.  A location provider | 
|  | * provides periodic reports on the geographical location of the | 
|  | * device. | 
|  | * | 
|  | * <p> Each provider has a set of criteria under which it may be used; | 
|  | * for example, some providers require GPS hardware and visibility to | 
|  | * a number of satellites; others require the use of the cellular | 
|  | * radio, or access to a specific carrier's network, or to the | 
|  | * internet.  They may also have different battery consumption | 
|  | * characteristics or monetary costs to the user.  The {@link | 
|  | * Criteria} class allows providers to be selected based on | 
|  | * user-specified criteria. | 
|  | */ | 
|  | public class LocationProvider { | 
|  |  | 
|  | /** | 
|  | * @deprecated Location provider statuses are no longer supported. | 
|  | */ | 
|  | @Deprecated | 
|  | public static final int OUT_OF_SERVICE = 0; | 
|  |  | 
|  | /** | 
|  | * @deprecated Location provider statuses are no longer supported. | 
|  | */ | 
|  | @Deprecated | 
|  | public static final int TEMPORARILY_UNAVAILABLE = 1; | 
|  |  | 
|  | /** | 
|  | * @deprecated Location provider statuses are no longer supported. | 
|  | */ | 
|  | @Deprecated | 
|  | public static final int AVAILABLE = 2; | 
|  |  | 
|  | private final String mName; | 
|  | private final ProviderProperties mProperties; | 
|  |  | 
|  | LocationProvider(String name, ProviderProperties properties) { | 
|  | mName = name; | 
|  | mProperties = properties; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns the name of this provider. | 
|  | */ | 
|  | public String getName() { | 
|  | return mName; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns true if this provider meets the given criteria, | 
|  | * false otherwise. | 
|  | */ | 
|  | public boolean meetsCriteria(Criteria criteria) { | 
|  | return propertiesMeetCriteria(mName, mProperties, criteria); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @hide | 
|  | */ | 
|  | public static boolean propertiesMeetCriteria(String name, ProviderProperties properties, | 
|  | Criteria criteria) { | 
|  | if (LocationManager.PASSIVE_PROVIDER.equals(name)) { | 
|  | // passive provider never matches | 
|  | return false; | 
|  | } | 
|  | if (properties == null) { | 
|  | // unfortunately this can happen for provider in remote services | 
|  | // that have not finished binding yet | 
|  | return false; | 
|  | } | 
|  |  | 
|  | if (criteria.getAccuracy() != Criteria.NO_REQUIREMENT && | 
|  | criteria.getAccuracy() < properties.mAccuracy) { | 
|  | return false; | 
|  | } | 
|  | if (criteria.getPowerRequirement() != Criteria.NO_REQUIREMENT && | 
|  | criteria.getPowerRequirement() < properties.mPowerRequirement) { | 
|  | return false; | 
|  | } | 
|  | if (criteria.isAltitudeRequired() && !properties.mSupportsAltitude) { | 
|  | return false; | 
|  | } | 
|  | if (criteria.isSpeedRequired() && !properties.mSupportsSpeed) { | 
|  | return false; | 
|  | } | 
|  | if (criteria.isBearingRequired() && !properties.mSupportsBearing) { | 
|  | return false; | 
|  | } | 
|  | if (!criteria.isCostAllowed() && properties.mHasMonetaryCost) { | 
|  | return false; | 
|  | } | 
|  | return true; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns true if the provider requires access to a | 
|  | * data network (e.g., the Internet), false otherwise. | 
|  | */ | 
|  | public boolean requiresNetwork() { | 
|  | return mProperties.mRequiresNetwork; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns true if the provider requires access to a | 
|  | * satellite-based positioning system (e.g., GPS), false | 
|  | * otherwise. | 
|  | */ | 
|  | public boolean requiresSatellite() { | 
|  | return mProperties.mRequiresSatellite; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns true if the provider requires access to an appropriate | 
|  | * cellular network (e.g., to make use of cell tower IDs), false | 
|  | * otherwise. | 
|  | */ | 
|  | public boolean requiresCell() { | 
|  | return mProperties.mRequiresCell; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns true if the use of this provider may result in a | 
|  | * monetary charge to the user, false if use is free.  It is up to | 
|  | * each provider to give accurate information. | 
|  | */ | 
|  | public boolean hasMonetaryCost() { | 
|  | return mProperties.mHasMonetaryCost; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns true if the provider is able to provide altitude | 
|  | * information, false otherwise.  A provider that reports altitude | 
|  | * under most circumstances but may occassionally not report it | 
|  | * should return true. | 
|  | */ | 
|  | public boolean supportsAltitude() { | 
|  | return mProperties.mSupportsAltitude; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns true if the provider is able to provide speed | 
|  | * information, false otherwise.  A provider that reports speed | 
|  | * under most circumstances but may occassionally not report it | 
|  | * should return true. | 
|  | */ | 
|  | public boolean supportsSpeed() { | 
|  | return mProperties.mSupportsSpeed; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns true if the provider is able to provide bearing | 
|  | * information, false otherwise.  A provider that reports bearing | 
|  | * under most circumstances but may occassionally not report it | 
|  | * should return true. | 
|  | */ | 
|  | public boolean supportsBearing() { | 
|  | return mProperties.mSupportsBearing; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns the power requirement for this provider. | 
|  | * | 
|  | * @return the power requirement for this provider, as one of the | 
|  | * constants Criteria.POWER_REQUIREMENT_*. | 
|  | */ | 
|  | public int getPowerRequirement() { | 
|  | return mProperties.mPowerRequirement; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns a constant describing horizontal accuracy of this provider. | 
|  | * If the provider returns finer grain or exact location, | 
|  | * {@link Criteria#ACCURACY_FINE} is returned, otherwise if the | 
|  | * location is only approximate then {@link Criteria#ACCURACY_COARSE} | 
|  | * is returned. | 
|  | */ | 
|  | public int getAccuracy() { | 
|  | return mProperties.mAccuracy; | 
|  | } | 
|  | } |