1ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu/* 2ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * Copyright (C) 2010 The Android Open Source Project 3ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * 4ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * Licensed under the Apache License, Version 2.0 (the "License"); 5ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * you may not use this file except in compliance with the License. 6ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * You may obtain a copy of the License at 7ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * 8ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * http://www.apache.org/licenses/LICENSE-2.0 9ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * 10ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * Unless required by applicable law or agreed to in writing, software 11ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * distributed under the License is distributed on an "AS IS" BASIS, 12ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * See the License for the specific language governing permissions and 14ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * limitations under the License. 15ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu */ 16ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 17ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tupackage com.android.location.provider; 18ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 19ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tuimport java.io.FileDescriptor; 20ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tuimport java.io.FileOutputStream; 21ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tuimport java.io.PrintWriter; 22ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 23ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tuimport android.content.Context; 24ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tuimport android.location.ILocationManager; 25ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tuimport android.location.Location; 26ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tuimport android.location.LocationManager; 27ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tuimport android.os.Bundle; 28ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tuimport android.os.IBinder; 29ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tuimport android.os.RemoteException; 30ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tuimport android.os.ServiceManager; 31ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tuimport android.os.WorkSource; 32ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tuimport android.util.Log; 33ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 34ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tuimport com.android.internal.location.ILocationProvider; 35ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tuimport com.android.internal.location.ProviderProperties; 36ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tuimport com.android.internal.location.ProviderRequest; 378c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackbornimport com.android.internal.util.FastPrintWriter; 38ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 39ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu/** 40ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * Base class for location providers implemented as unbundled services. 41ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * 42ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * <p>The network location provider must export a service with action 43ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * "com.android.location.service.v2.NetworkLocationProvider" 44ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * and a valid minor version in a meta-data field on the service, and 45ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * then return the result of {@link #getBinder()} on service binding. 46ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * 47ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * <p>The fused location provider must export a service with action 48ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * "com.android.location.service.FusedLocationProvider" 49ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * and a valid minor version in a meta-data field on the service, and 50ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * then return the result of {@link #getBinder()} on service binding. 51ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * 52ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * <p>IMPORTANT: This class is effectively a public API for unbundled 53ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * applications, and must remain API stable. See README.txt in the root 54ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * of this package for more information. 55ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu */ 56ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tupublic abstract class LocationProviderBase { 57ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu private final String TAG; 58ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 59ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu protected final ILocationManager mLocationManager; 60ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu private final ProviderProperties mProperties; 61ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu private final IBinder mBinder; 62ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 63ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu /** 64ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * Bundle key for a version of the location containing no GPS data. 65ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * Allows location providers to flag locations as being safe to 66ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * feed to LocationFudger. 67ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu */ 68ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public static final String EXTRA_NO_GPS_LOCATION = Location.EXTRA_NO_GPS_LOCATION; 69ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 70ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu /** 71ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * Name of the Fused location provider. 72ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * 73ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * <p>This provider combines inputs for all possible location sources 74ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * to provide the best possible Location fix. 75ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu */ 76ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public static final String FUSED_PROVIDER = LocationManager.FUSED_PROVIDER; 77ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 78ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu private final class Service extends ILocationProvider.Stub { 79ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu @Override 80ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public void enable() { 81ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu onEnable(); 82ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } 83ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu @Override 84ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public void disable() { 85ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu onDisable(); 86ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } 87ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu @Override 88ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public void setRequest(ProviderRequest request, WorkSource ws) { 89ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu onSetRequest(new ProviderRequestUnbundled(request), ws); 90ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } 91ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu @Override 92ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public ProviderProperties getProperties() { 93ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu return mProperties; 94ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } 95ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu @Override 96ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public int getStatus(Bundle extras) { 97ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu return onGetStatus(extras); 98ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } 99ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu @Override 100ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public long getStatusUpdateTime() { 101ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu return onGetStatusUpdateTime(); 102ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } 103ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu @Override 104ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public boolean sendExtraCommand(String command, Bundle extras) { 105ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu return onSendExtraCommand(command, extras); 106ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } 107ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu @Override 108ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public void dump(FileDescriptor fd, String[] args) { 1098c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn PrintWriter pw = new FastPrintWriter(new FileOutputStream(fd)); 110ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu onDump(fd, pw, args); 111ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu pw.flush(); 112ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } 113ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } 114ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 115ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public LocationProviderBase(String tag, ProviderPropertiesUnbundled properties) { 116ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu TAG = tag; 117ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu IBinder b = ServiceManager.getService(Context.LOCATION_SERVICE); 118ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu mLocationManager = ILocationManager.Stub.asInterface(b); 119ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu mProperties = properties.getProviderProperties(); 120ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu mBinder = new Service(); 121ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } 122ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 123ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public IBinder getBinder() { 124ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu return mBinder; 125ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } 126ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 127ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu /** 128ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * Used by the location provider to report new locations. 129ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * 130ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * @param location new Location to report 131ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * 132ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * Requires the android.permission.INSTALL_LOCATION_PROVIDER permission. 133ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu */ 134ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public final void reportLocation(Location location) { 135ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu try { 136ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu mLocationManager.reportLocation(location, false); 137ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } catch (RemoteException e) { 138ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu Log.e(TAG, "RemoteException", e); 139ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } catch (Exception e) { 140ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu // never crash provider, might be running in a system process 141ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu Log.e(TAG, "Exception", e); 142ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } 143ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } 144ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 145ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu /** 146ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * Enable the location provider. 147ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * <p>The provider may initialize resources, but does 148ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * not yet need to report locations. 149ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu */ 150ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public abstract void onEnable(); 151ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 152ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu /** 153ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * Disable the location provider. 154ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * <p>The provider must release resources, and stop 155ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * performing work. It may no longer report locations. 156ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu */ 157ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public abstract void onDisable(); 158ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 159ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu /** 160ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * Set the {@link ProviderRequest} requirements for this provider. 161ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * <p>Each call to this method overrides all previous requests. 162ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * <p>This method might trigger the provider to start returning 163ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * locations, or to stop returning locations, depending on the 164ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * parameters in the request. 165ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu */ 166ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public abstract void onSetRequest(ProviderRequestUnbundled request, WorkSource source); 167ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 168ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu /** 169ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * Dump debug information. 170ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu */ 171ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public void onDump(FileDescriptor fd, PrintWriter pw, String[] args) { 172ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } 173ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 174ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu /** 175ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * Returns a information on the status of this provider. 176ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * <p>{@link android.location.LocationProvider#OUT_OF_SERVICE} is returned if the provider is 177ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * out of service, and this is not expected to change in the near 178ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * future; {@link android.location.LocationProvider#TEMPORARILY_UNAVAILABLE} is returned if 179ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * the provider is temporarily unavailable but is expected to be 180ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * available shortly; and {@link android.location.LocationProvider#AVAILABLE} is returned 181ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * if the provider is currently available. 182ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * 183ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * <p>If extras is non-null, additional status information may be 184ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * added to it in the form of provider-specific key/value pairs. 185ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu */ 186ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public abstract int onGetStatus(Bundle extras); 187ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 188ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu /** 189ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * Returns the time at which the status was last updated. It is the 190ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * responsibility of the provider to appropriately set this value using 191ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * {@link android.os.SystemClock#elapsedRealtime SystemClock.elapsedRealtime()}. 192ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * there is a status update that it wishes to broadcast to all its 193ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * listeners. The provider should be careful not to broadcast 194ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * the same status again. 195ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * 196ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * @return time of last status update in millis since last reboot 197ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu */ 198ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public abstract long onGetStatusUpdateTime(); 199ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu 200ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu /** 201ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * Implements addditional location provider specific additional commands. 202ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * 203ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * @param command name of the command to send to the provider. 204ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * @param extras optional arguments for the command (or null). 205ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * The provider may optionally fill the extras Bundle with results from the command. 206ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * 207ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu * @return true if the command succeeds. 208ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu */ 209ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu public boolean onSendExtraCommand(String command, Bundle extras) { 210ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu // default implementation 211ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu return false; 212ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu } 213ccb4c318aa5150ba49b7e7878d20b4787d6bf723Laurent Tu} 214