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.Context;
20628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.location.Address;
21628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.location.GeocoderParams;
22628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.location.IGeocodeProvider;
235cd731a2333479d85b1bdf6dbf8a185df2877146Victoria Leaseimport android.os.Handler;
24628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.os.RemoteException;
25628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.util.Log;
26628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
276fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport com.android.server.ServiceWatcher;
28628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport java.util.List;
29628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
30628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood/**
316fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly * Proxy for IGeocodeProvider implementations.
32628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood */
33628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodpublic class GeocoderProxy {
34628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    private static final String TAG = "GeocoderProxy";
35628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
366fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private static final String SERVICE_ACTION = "com.android.location.service.GeocodeProvider";
3700355d5a592533a3ecb0a5a74aef8e69dd16902aNick Pelly
38628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    private final Context mContext;
396fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private final ServiceWatcher mServiceWatcher;
406fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
416fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public static GeocoderProxy createAndBind(Context context,
42c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun            int overlaySwitchResId, int defaultServicePackageNameResId,
43c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun            int initialPackageNamesResId, Handler handler) {
44c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun        GeocoderProxy proxy = new GeocoderProxy(context, overlaySwitchResId,
45c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun            defaultServicePackageNameResId, initialPackageNamesResId, handler);
466fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (proxy.bind()) {
476fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return proxy;
486fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } else {
496fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return null;
50e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood        }
51e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood    }
52e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood
53c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun    private GeocoderProxy(Context context,
54c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun            int overlaySwitchResId, int defaultServicePackageNameResId,
55c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun            int initialPackageNamesResId, Handler handler) {
566fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        mContext = context;
578863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde
58c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun        mServiceWatcher = new ServiceWatcher(mContext, TAG, SERVICE_ACTION, overlaySwitchResId,
59c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun            defaultServicePackageNameResId, initialPackageNamesResId, null, handler);
606fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    }
618863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde
626fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private boolean bind () {
636fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        return mServiceWatcher.start();
646fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    }
65628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
666fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private IGeocodeProvider getService() {
676fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        return IGeocodeProvider.Stub.asInterface(mServiceWatcher.getBinder());
686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    }
698863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde
706fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public String getConnectedPackageName() {
716fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        return mServiceWatcher.getBestPackageName();
72628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    }
73628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
74628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    public String getFromLocation(double latitude, double longitude, int maxResults,
75628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            GeocoderParams params, List<Address> addrs) {
766fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        IGeocodeProvider provider = getService();
77628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (provider != null) {
78628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            try {
796fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                return provider.getFromLocation(latitude, longitude, maxResults, params, addrs);
80628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            } catch (RemoteException e) {
816fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                Log.w(TAG, e);
82628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
83628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
84628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        return "Service not Available";
85628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    }
86628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
87628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    public String getFromLocationName(String locationName,
88628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            double lowerLeftLatitude, double lowerLeftLongitude,
89628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            double upperRightLatitude, double upperRightLongitude, int maxResults,
90628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            GeocoderParams params, List<Address> addrs) {
916fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        IGeocodeProvider provider = getService();
92628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (provider != null) {
93628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            try {
94628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                return provider.getFromLocationName(locationName, lowerLeftLatitude,
95628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                        lowerLeftLongitude, upperRightLatitude, upperRightLongitude,
96628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                        maxResults, params, addrs);
97628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            } catch (RemoteException e) {
986fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                Log.w(TAG, e);
99628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
100628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
101628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        return "Service not Available";
102628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    }
1036fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
104628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood}
105