1e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood/*
2e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * Copyright (C) 2009 The Android Open Source Project
3e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood *
4e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
5e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * you may not use this file except in compliance with the License.
6e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * You may obtain a copy of the License at
7e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood *
8e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
9e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood *
10e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * Unless required by applicable law or agreed to in writing, software
11e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
12e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * See the License for the specific language governing permissions and
14e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * limitations under the License.
15e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood */
16e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
1700b74270c9f136a8727c5f6cda0997a3a905f385Mike Lockwoodpackage com.android.server.location;
18e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
196fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport java.io.FileDescriptor;
206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport java.io.PrintWriter;
216fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
22628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.content.Context;
236fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport android.location.LocationProvider;
24e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodimport android.os.Bundle;
25628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.os.Handler;
26e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodimport android.os.RemoteException;
277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
28e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodimport android.util.Log;
29e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
306fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport com.android.internal.location.ProviderProperties;
316fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport com.android.internal.location.ILocationProvider;
326fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport com.android.internal.location.ProviderRequest;
336fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport com.android.server.LocationManagerService;
346fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport com.android.server.ServiceWatcher;
3500b74270c9f136a8727c5f6cda0997a3a905f385Mike Lockwood
36e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood/**
376fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly * Proxy for ILocationProvider implementations.
38e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood */
39d03ff94fe58045b5bd1dd783fb98026778a4265dMike Lockwoodpublic class LocationProviderProxy implements LocationProviderInterface {
40e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    private static final String TAG = "LocationProviderProxy";
416fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private static final boolean D = LocationManagerService.D;
4200355d5a592533a3ecb0a5a74aef8e69dd16902aNick Pelly
43628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    private final Context mContext;
4415e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood    private final String mName;
456fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private final ServiceWatcher mServiceWatcher;
466fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
476fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private Object mLock = new Object();
48628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
496fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    // cached values set by the location manager, synchronized on mLock
506fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private ProviderProperties mProperties;
512cd543aad5cc38fb3e7158f1cc5080c7e9ff5d24Mike Lockwood    private boolean mEnabled = false;
526fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private ProviderRequest mRequest = null;
536fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private WorkSource mWorksource = new WorkSource();
546fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
55c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun    public static LocationProviderProxy createAndBind(
56c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun            Context context, String name, String action,
57c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun            int overlaySwitchResId, int defaultServicePackageNameResId,
58c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun            int initialPackageNamesResId, Handler handler) {
596fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        LocationProviderProxy proxy = new LocationProviderProxy(context, name, action,
60c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun                overlaySwitchResId, defaultServicePackageNameResId, initialPackageNamesResId,
61c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun                handler);
626fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (proxy.bind()) {
636fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return proxy;
646fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } else {
656fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return null;
666fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        }
676fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    }
686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
696fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private LocationProviderProxy(Context context, String name, String action,
70c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun            int overlaySwitchResId, int defaultServicePackageNameResId,
71c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun            int initialPackageNamesResId, Handler handler) {
72628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        mContext = context;
73628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        mName = name;
74c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun        mServiceWatcher = new ServiceWatcher(mContext, TAG + "-" + name, action, overlaySwitchResId,
75c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun                defaultServicePackageNameResId, initialPackageNamesResId,
7603cdd3d275499df3ef1059905899dcc5aaf2ab01Victoria Lease                mNewServiceWork, handler);
77628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    }
78628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
796fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private boolean bind () {
806fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        return mServiceWatcher.start();
81e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood    }
82e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood
836fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private ILocationProvider getService() {
846fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        return ILocationProvider.Stub.asInterface(mServiceWatcher.getBinder());
856fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    }
868863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde
876fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public String getConnectedPackageName() {
886fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        return mServiceWatcher.getBestPackageName();
896fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    }
90628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
916fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    /**
926fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly     * Work to apply current state to a newly connected provider.
936fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly     * Remember we can switch the service that implements a providers
946fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly     * at run-time, so need to apply current state.
956fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly     */
966fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private Runnable mNewServiceWork = new Runnable() {
976fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        @Override
986fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        public void run() {
996fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            if (D) Log.d(TAG, "applying state to connected service");
1006fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
1016fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            boolean enabled;
1026fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            ProviderProperties properties = null;
1036fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            ProviderRequest request;
1046fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            WorkSource source;
1056fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            ILocationProvider service;
1066fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            synchronized (mLock) {
1076fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                enabled = mEnabled;
1086fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                request = mRequest;
1096fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                source = mWorksource;
1106fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                service = getService();
111628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
112fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu
1136fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            if (service == null) return;
1148863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde
1156fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            try {
1166fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                // load properties from provider
1176fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                properties = service.getProperties();
1186fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                if (properties == null) {
1196fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                    Log.e(TAG, mServiceWatcher.getBestPackageName() +
1206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                            " has invalid locatino provider properties");
121628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                }
122628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
1236fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                // apply current state to new service
1246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                if (enabled) {
1256fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                    service.enable();
1266fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                    if (request != null) {
1276fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                        service.setRequest(request, source);
1288863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde                    }
129628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                }
1306fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            } catch (RemoteException e) {
1316fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                Log.w(TAG, e);
1326fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            } catch (Exception e) {
1336fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                // never let remote service crash system server
1346fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                Log.e(TAG, "Exception from " + mServiceWatcher.getBestPackageName(), e);
1356fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            }
136628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
1376fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            synchronized (mLock) {
1386fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                mProperties = properties;
139628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
140628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
141628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    };
142628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
1436fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
14415e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood    public String getName() {
14515e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood        return mName;
14615e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood    }
14715e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood
1486fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
1496fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public ProviderProperties getProperties() {
1506fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        synchronized (mLock) {
1516fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return mProperties;
152e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
153e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
154e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
1556fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
156e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public void enable() {
1576fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        synchronized (mLock) {
1588863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde            mEnabled = true;
159e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
1606fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        ILocationProvider service = getService();
1616fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (service == null) return;
162e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
1636fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        try {
1646fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            service.enable();
1656fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (RemoteException e) {
1666fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.w(TAG, e);
1676fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (Exception e) {
1686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            // never let remote service crash system server
1696fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.e(TAG, "Exception from " + mServiceWatcher.getBestPackageName(), e);
170e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
171e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
172e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
1736fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
1746fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public void disable() {
1756fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        synchronized (mLock) {
1766fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            mEnabled = false;
1778863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde        }
1786fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        ILocationProvider service = getService();
1796fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (service == null) return;
180e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
1816fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        try {
1826fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            service.disable();
1836fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (RemoteException e) {
1846fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.w(TAG, e);
1856fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (Exception e) {
1866fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            // never let remote service crash system server
1876fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.e(TAG, "Exception from " + mServiceWatcher.getBestPackageName(), e);
188e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
189e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
190e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
1916fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
1926fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public boolean isEnabled() {
1936fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        synchronized (mLock) {
1946fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return mEnabled;
1953c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger        }
1963c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger    }
1973c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger
1986fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
1996fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public void setRequest(ProviderRequest request, WorkSource source) {
2006fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        synchronized (mLock) {
2016fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            mRequest = request;
2026fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            mWorksource = source;
2038863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde        }
2046fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        ILocationProvider service = getService();
2056fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (service == null) return;
20615e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood
2076fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        try {
2086fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            service.setRequest(request, source);
2096fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (RemoteException e) {
2106fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.w(TAG, e);
2116fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (Exception e) {
2126fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            // never let remote service crash system server
2136fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.e(TAG, "Exception from " + mServiceWatcher.getBestPackageName(), e);
214e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
215e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
216e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
2176fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
2186fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
2196fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        pw.append("REMOTE SERVICE");
2206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        pw.append(" name=").append(mName);
2216fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        pw.append(" pkg=").append(mServiceWatcher.getBestPackageName());
2226fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        pw.append(" version=").append("" + mServiceWatcher.getBestVersion());
2236fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        pw.append('\n');
2246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
2256fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        ILocationProvider service = getService();
2266fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (service == null) {
2276fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            pw.println("service down (null)");
2286fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return;
2296fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        }
2306fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        pw.flush();
2316fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
2326fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        try {
2336fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            service.asBinder().dump(fd, args);
2346fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (RemoteException e) {
2356fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            pw.println("service down (RemoteException)");
2366fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.w(TAG, e);
2376fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (Exception e) {
2386fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            pw.println("service down (Exception)");
2396fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            // never let remote service crash system server
2406fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.e(TAG, "Exception from " + mServiceWatcher.getBestPackageName(), e);
2418863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde        }
24215e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood    }
24315e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood
2446fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
2456fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public int getStatus(Bundle extras) {
2466fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        ILocationProvider service = getService();
2476fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (service == null) return LocationProvider.TEMPORARILY_UNAVAILABLE;
2486fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
2496fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        try {
2506fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return service.getStatus(extras);
2516fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (RemoteException e) {
2526fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.w(TAG, e);
2536fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (Exception e) {
2546fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            // never let remote service crash system server
2556fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.e(TAG, "Exception from " + mServiceWatcher.getBestPackageName(), e);
2566fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        }
2576fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        return LocationProvider.TEMPORARILY_UNAVAILABLE;
258e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
259e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
2606fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
2616fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public long getStatusUpdateTime() {
2626fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        ILocationProvider service = getService();
2636fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (service == null) return 0;
264e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
2656fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        try {
2666fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return service.getStatusUpdateTime();
2676fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (RemoteException e) {
2686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.w(TAG, e);
2696fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (Exception e) {
2706fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            // never let remote service crash system server
2716fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.e(TAG, "Exception from " + mServiceWatcher.getBestPackageName(), e);
272fd6e5f0dda50e113db4ccc55338b6c4f09da37a4Mike Lockwood        }
2736fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        return 0;
274fd6e5f0dda50e113db4ccc55338b6c4f09da37a4Mike Lockwood    }
275fd6e5f0dda50e113db4ccc55338b6c4f09da37a4Mike Lockwood
2766fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
277e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public boolean sendExtraCommand(String command, Bundle extras) {
2786fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        ILocationProvider service = getService();
2796fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (service == null) return false;
280e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
2816fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        try {
2826fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return service.sendExtraCommand(command, extras);
2836fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (RemoteException e) {
2846fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.w(TAG, e);
2856fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (Exception e) {
2866fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            // never let remote service crash system server
2876fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.e(TAG, "Exception from " + mServiceWatcher.getBestPackageName(), e);
288e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
2896fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        return false;
2903681f2614fa8c10560c790f6b4287f65d6fd2663Mike Lockwood    }
2916fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly }
292