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