1628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood/* 2628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * Copyright (C) 2010 The Android Open Source Project 3628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * 4628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 5628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * you may not use this file except in compliance with the License. 6628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * You may obtain a copy of the License at 7628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * 8628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 9628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * 10628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * Unless required by applicable law or agreed to in writing, software 11628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 12628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * See the License for the specific language governing permissions and 14628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * limitations under the License. 15628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood */ 16628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 1700b74270c9f136a8727c5f6cda0997a3a905f385Mike Lockwoodpackage com.android.server.location; 18628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 19628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.content.ComponentName; 20628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.content.Context; 21628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.content.Intent; 22628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.content.ServiceConnection; 23628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.location.Address; 24628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.location.GeocoderParams; 25628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.location.IGeocodeProvider; 26628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.os.IBinder; 27628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.os.RemoteException; 28628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.os.SystemClock; 29628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.util.Log; 30628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 31628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport java.util.List; 32628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 33628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood/** 34628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * A class for proxying IGeocodeProvider implementations. 35628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * 36628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * {@hide} 37628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood */ 38628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodpublic class GeocoderProxy { 39628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 40628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood private static final String TAG = "GeocoderProxy"; 41628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 4200355d5a592533a3ecb0a5a74aef8e69dd16902aNick Pelly public static final String SERVICE_ACTION = 4300355d5a592533a3ecb0a5a74aef8e69dd16902aNick Pelly "com.android.location.service.GeocodeProvider"; 4400355d5a592533a3ecb0a5a74aef8e69dd16902aNick Pelly 45628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood private final Context mContext; 46628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood private final Intent mIntent; 478863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde private final Object mMutex = new Object(); // synchronizes access to mServiceConnection 4800355d5a592533a3ecb0a5a74aef8e69dd16902aNick Pelly private Connection mServiceConnection; // never null after ctor 49628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 5000355d5a592533a3ecb0a5a74aef8e69dd16902aNick Pelly public GeocoderProxy(Context context, String packageName) { 51628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mContext = context; 5200355d5a592533a3ecb0a5a74aef8e69dd16902aNick Pelly mIntent = new Intent(SERVICE_ACTION); 5300355d5a592533a3ecb0a5a74aef8e69dd16902aNick Pelly reconnect(packageName); 54628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 55628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 5600355d5a592533a3ecb0a5a74aef8e69dd16902aNick Pelly /** Bind to service. Will reconnect if already connected */ 5700355d5a592533a3ecb0a5a74aef8e69dd16902aNick Pelly public void reconnect(String packageName) { 588863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde synchronized (mMutex) { 5900355d5a592533a3ecb0a5a74aef8e69dd16902aNick Pelly if (mServiceConnection != null) { 6000355d5a592533a3ecb0a5a74aef8e69dd16902aNick Pelly mContext.unbindService(mServiceConnection); 6100355d5a592533a3ecb0a5a74aef8e69dd16902aNick Pelly } 628863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde mServiceConnection = new Connection(); 6300355d5a592533a3ecb0a5a74aef8e69dd16902aNick Pelly mIntent.setPackage(packageName); 64130b0d2b2629bdd8fc415e0f3da947f965a3f29dDianne Hackborn mContext.bindService(mIntent, mServiceConnection, 65130b0d2b2629bdd8fc415e0f3da947f965a3f29dDianne Hackborn Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND 66130b0d2b2629bdd8fc415e0f3da947f965a3f29dDianne Hackborn | Context.BIND_ALLOW_OOM_MANAGEMENT); 67e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood } 68e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood } 69e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood 70628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood private class Connection implements ServiceConnection { 718863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde 728863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde private IGeocodeProvider mProvider; 738863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde 74628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood public void onServiceConnected(ComponentName className, IBinder service) { 758863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde synchronized (this) { 76628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mProvider = IGeocodeProvider.Stub.asInterface(service); 77628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 78628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 79628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 80628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood public void onServiceDisconnected(ComponentName className) { 818863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde synchronized (this) { 82628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mProvider = null; 83628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 84628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 858863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde 868863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde public IGeocodeProvider getProvider() { 878863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde synchronized (this) { 888863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde return mProvider; 898863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde } 908863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde } 91628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 92628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 93628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood public String getFromLocation(double latitude, double longitude, int maxResults, 94628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood GeocoderParams params, List<Address> addrs) { 95628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood IGeocodeProvider provider; 968863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde synchronized (mMutex) { 978863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde provider = mServiceConnection.getProvider(); 98628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 99628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (provider != null) { 100628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood try { 101628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return provider.getFromLocation(latitude, longitude, maxResults, 102628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood params, addrs); 103628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } catch (RemoteException e) { 104628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood Log.e(TAG, "getFromLocation failed", e); 105628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 106628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 107628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return "Service not Available"; 108628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 109628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 110628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood public String getFromLocationName(String locationName, 111628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood double lowerLeftLatitude, double lowerLeftLongitude, 112628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood double upperRightLatitude, double upperRightLongitude, int maxResults, 113628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood GeocoderParams params, List<Address> addrs) { 114628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood IGeocodeProvider provider; 1158863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde synchronized (mMutex) { 1168863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde provider = mServiceConnection.getProvider(); 117628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 118628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (provider != null) { 119628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood try { 120628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return provider.getFromLocationName(locationName, lowerLeftLatitude, 121628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood lowerLeftLongitude, upperRightLatitude, upperRightLongitude, 122628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood maxResults, params, addrs); 123628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } catch (RemoteException e) { 124628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood Log.e(TAG, "getFromLocationName failed", e); 125628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 126628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 127628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return "Service not Available"; 128628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 129628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood} 130