The network location and geocode provider services are now started on demand and their interfaces are now retrieved via bindService(). Remove obsolete LocationManager installLocationProvider() and installGeocodeProvider() methods. Add abstract class android.location.provider.GeocodeProvider to provide a public wrapper to the IGeocodeProvider Binder interface. Replaces the LocationManager.GeocodeProvider interface. Rename LocationProviderImpl to android.location.provider.LocationProvider. Move LocationManager.reportLocation() to android.location.provider.LocationProvider, so all methods related to external location providers are now all in one class. Avoid calling from the Location Manager Service into providers that are disabled so we do not start the network location service unnecessarily. Change-Id: If3ed2d5d62b83ba508006711d575cad09f4a0007 Signed-off-by: Mike Lockwood <lockwood@android.com>
106 lines
3.6 KiB
Java
106 lines
3.6 KiB
Java
/*
|
|
* Copyright (C) 2010 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 com.android.internal.location;
|
|
|
|
import android.content.ComponentName;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.content.ServiceConnection;
|
|
import android.location.Address;
|
|
import android.location.GeocoderParams;
|
|
import android.location.IGeocodeProvider;
|
|
import android.os.IBinder;
|
|
import android.os.RemoteException;
|
|
import android.os.SystemClock;
|
|
import android.util.Log;
|
|
|
|
import java.util.List;
|
|
|
|
/**
|
|
* A class for proxying IGeocodeProvider implementations.
|
|
*
|
|
* {@hide}
|
|
*/
|
|
public class GeocoderProxy {
|
|
|
|
private static final String TAG = "GeocoderProxy";
|
|
|
|
private final Context mContext;
|
|
private final Intent mIntent;
|
|
private final Connection mServiceConnection = new Connection();
|
|
private IGeocodeProvider mProvider;
|
|
|
|
public GeocoderProxy(Context context, String serviceName) {
|
|
mContext = context;
|
|
mIntent = new Intent(serviceName);
|
|
mContext.bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
|
|
}
|
|
|
|
private class Connection implements ServiceConnection {
|
|
public void onServiceConnected(ComponentName className, IBinder service) {
|
|
Log.d(TAG, "onServiceConnected " + className);
|
|
synchronized (this) {
|
|
mProvider = IGeocodeProvider.Stub.asInterface(service);
|
|
}
|
|
}
|
|
|
|
public void onServiceDisconnected(ComponentName className) {
|
|
Log.d(TAG, "onServiceDisconnected " + className);
|
|
synchronized (this) {
|
|
mProvider = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
public String getFromLocation(double latitude, double longitude, int maxResults,
|
|
GeocoderParams params, List<Address> addrs) {
|
|
IGeocodeProvider provider;
|
|
synchronized (mServiceConnection) {
|
|
provider = mProvider;
|
|
}
|
|
if (provider != null) {
|
|
try {
|
|
return provider.getFromLocation(latitude, longitude, maxResults,
|
|
params, addrs);
|
|
} catch (RemoteException e) {
|
|
Log.e(TAG, "getFromLocation failed", e);
|
|
}
|
|
}
|
|
return "Service not Available";
|
|
}
|
|
|
|
public String getFromLocationName(String locationName,
|
|
double lowerLeftLatitude, double lowerLeftLongitude,
|
|
double upperRightLatitude, double upperRightLongitude, int maxResults,
|
|
GeocoderParams params, List<Address> addrs) {
|
|
IGeocodeProvider provider;
|
|
synchronized (mServiceConnection) {
|
|
provider = mProvider;
|
|
}
|
|
if (provider != null) {
|
|
try {
|
|
return provider.getFromLocationName(locationName, lowerLeftLatitude,
|
|
lowerLeftLongitude, upperRightLatitude, upperRightLongitude,
|
|
maxResults, params, addrs);
|
|
} catch (RemoteException e) {
|
|
Log.e(TAG, "getFromLocationName failed", e);
|
|
}
|
|
}
|
|
return "Service not Available";
|
|
}
|
|
}
|