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;
20850c83e6da3b34a4eab804133420247fc9dbb8a1Jeff Sharkeyimport java.io.IOException;
216fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport java.io.PrintWriter;
226fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
23628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.content.Context;
246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport android.location.LocationProvider;
25e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodimport android.os.Bundle;
26628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.os.Handler;
27e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodimport android.os.RemoteException;
287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
29e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodimport android.util.Log;
30e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
316fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport com.android.internal.location.ProviderProperties;
326fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport com.android.internal.location.ILocationProvider;
336fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport com.android.internal.location.ProviderRequest;
34850c83e6da3b34a4eab804133420247fc9dbb8a1Jeff Sharkeyimport com.android.internal.os.TransferPipe;
356fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport com.android.server.LocationManagerService;
366fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport com.android.server.ServiceWatcher;
3700b74270c9f136a8727c5f6cda0997a3a905f385Mike Lockwood
38e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood/**
396fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly * Proxy for ILocationProvider implementations.
40e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood */
41d03ff94fe58045b5bd1dd783fb98026778a4265dMike Lockwoodpublic class LocationProviderProxy implements LocationProviderInterface {
42e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    private static final String TAG = "LocationProviderProxy";
436fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private static final boolean D = LocationManagerService.D;
4400355d5a592533a3ecb0a5a74aef8e69dd16902aNick Pelly
45628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    private final Context mContext;
4615e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood    private final String mName;
476fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private final ServiceWatcher mServiceWatcher;
486fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
496fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private Object mLock = new Object();
50628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
516fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    // cached values set by the location manager, synchronized on mLock
526fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private ProviderProperties mProperties;
532cd543aad5cc38fb3e7158f1cc5080c7e9ff5d24Mike Lockwood    private boolean mEnabled = false;
546fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private ProviderRequest mRequest = null;
556fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private WorkSource mWorksource = new WorkSource();
566fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
57c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun    public static LocationProviderProxy createAndBind(
58c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun            Context context, String name, String action,
59c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun            int overlaySwitchResId, int defaultServicePackageNameResId,
60c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun            int initialPackageNamesResId, Handler handler) {
616fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        LocationProviderProxy proxy = new LocationProviderProxy(context, name, action,
62c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun                overlaySwitchResId, defaultServicePackageNameResId, initialPackageNamesResId,
63c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun                handler);
646fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (proxy.bind()) {
656fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return proxy;
666fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } else {
676fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return null;
686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        }
696fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    }
706fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
716fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private LocationProviderProxy(Context context, String name, String action,
72c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun            int overlaySwitchResId, int defaultServicePackageNameResId,
73c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun            int initialPackageNamesResId, Handler handler) {
74628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        mContext = context;
75628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        mName = name;
76c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun        mServiceWatcher = new ServiceWatcher(mContext, TAG + "-" + name, action, overlaySwitchResId,
77c5fc9988f11acc58229fb6ae80d346277318ada4Zhentao Sun                defaultServicePackageNameResId, initialPackageNamesResId,
7803cdd3d275499df3ef1059905899dcc5aaf2ab01Victoria Lease                mNewServiceWork, handler);
79628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    }
80628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
816fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private boolean bind () {
826fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        return mServiceWatcher.start();
83e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood    }
84e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood
856fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private ILocationProvider getService() {
866fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        return ILocationProvider.Stub.asInterface(mServiceWatcher.getBinder());
876fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    }
888863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde
896fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public String getConnectedPackageName() {
906fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        return mServiceWatcher.getBestPackageName();
916fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    }
92628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
936fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    /**
946fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly     * Work to apply current state to a newly connected provider.
956fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly     * Remember we can switch the service that implements a providers
966fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly     * at run-time, so need to apply current state.
976fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly     */
986fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    private Runnable mNewServiceWork = new Runnable() {
996fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        @Override
1006fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        public void run() {
1016fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            if (D) Log.d(TAG, "applying state to connected service");
1026fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
1036fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            boolean enabled;
1046fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            ProviderProperties properties = null;
1056fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            ProviderRequest request;
1066fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            WorkSource source;
1076fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            ILocationProvider service;
1086fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            synchronized (mLock) {
1096fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                enabled = mEnabled;
1106fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                request = mRequest;
1116fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                source = mWorksource;
1126fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                service = getService();
113628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
114fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu
1156fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            if (service == null) return;
1168863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde
1176fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            try {
1186fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                // load properties from provider
1196fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                properties = service.getProperties();
1206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                if (properties == null) {
1216fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                    Log.e(TAG, mServiceWatcher.getBestPackageName() +
1226fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                            " has invalid locatino provider properties");
123628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                }
124628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
1256fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                // apply current state to new service
1266fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                if (enabled) {
1276fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                    service.enable();
1286fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                    if (request != null) {
1296fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                        service.setRequest(request, source);
1308863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde                    }
131628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                }
1326fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            } catch (RemoteException e) {
1336fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                Log.w(TAG, e);
1346fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            } catch (Exception e) {
1356fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                // never let remote service crash system server
1366fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                Log.e(TAG, "Exception from " + mServiceWatcher.getBestPackageName(), e);
1376fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            }
138628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
1396fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            synchronized (mLock) {
1406fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly                mProperties = properties;
141628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
142628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
143628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    };
144628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
1456fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
14615e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood    public String getName() {
14715e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood        return mName;
14815e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood    }
14915e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood
1506fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
1516fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public ProviderProperties getProperties() {
1526fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        synchronized (mLock) {
1536fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return mProperties;
154e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
155e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
156e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
1576fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
158e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public void enable() {
1596fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        synchronized (mLock) {
1608863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde            mEnabled = true;
161e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
1626fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        ILocationProvider service = getService();
1636fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (service == null) return;
164e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
1656fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        try {
1666fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            service.enable();
1676fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (RemoteException e) {
1686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.w(TAG, e);
1696fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (Exception e) {
1706fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            // never let remote service crash system server
1716fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.e(TAG, "Exception from " + mServiceWatcher.getBestPackageName(), e);
172e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
173e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
174e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
1756fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
1766fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public void disable() {
1776fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        synchronized (mLock) {
1786fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            mEnabled = false;
1798863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde        }
1806fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        ILocationProvider service = getService();
1816fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (service == null) return;
182e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
1836fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        try {
1846fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            service.disable();
1856fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (RemoteException e) {
1866fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.w(TAG, e);
1876fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (Exception e) {
1886fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            // never let remote service crash system server
1896fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.e(TAG, "Exception from " + mServiceWatcher.getBestPackageName(), e);
190e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
191e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
192e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
1936fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
1946fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public boolean isEnabled() {
1956fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        synchronized (mLock) {
1966fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return mEnabled;
1973c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger        }
1983c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger    }
1993c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger
2006fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
2016fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public void setRequest(ProviderRequest request, WorkSource source) {
2026fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        synchronized (mLock) {
2036fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            mRequest = request;
2046fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            mWorksource = source;
2058863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde        }
2066fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        ILocationProvider service = getService();
2076fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (service == null) return;
20815e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood
2096fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        try {
2106fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            service.setRequest(request, source);
2116fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (RemoteException e) {
2126fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.w(TAG, e);
2136fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (Exception e) {
2146fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            // never let remote service crash system server
2156fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.e(TAG, "Exception from " + mServiceWatcher.getBestPackageName(), e);
216e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
217e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
218e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
2196fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
2206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
2216fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        pw.append("REMOTE SERVICE");
2226fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        pw.append(" name=").append(mName);
2236fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        pw.append(" pkg=").append(mServiceWatcher.getBestPackageName());
2246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        pw.append(" version=").append("" + mServiceWatcher.getBestVersion());
2256fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        pw.append('\n');
2266fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
2276fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        ILocationProvider service = getService();
2286fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (service == null) {
2296fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            pw.println("service down (null)");
2306fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return;
2316fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        }
2326fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        pw.flush();
2336fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
2346fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        try {
235850c83e6da3b34a4eab804133420247fc9dbb8a1Jeff Sharkey            TransferPipe.dumpAsync(service.asBinder(), fd, args);
236850c83e6da3b34a4eab804133420247fc9dbb8a1Jeff Sharkey        } catch (IOException | RemoteException e) {
237850c83e6da3b34a4eab804133420247fc9dbb8a1Jeff Sharkey            pw.println("Failed to dump location provider: " + e);
2388863c43d9efda108c880814b0a18688b75d70153Mark Vandevoorde        }
23915e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood    }
24015e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood
2416fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
2426fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public int getStatus(Bundle extras) {
2436fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        ILocationProvider service = getService();
2446fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (service == null) return LocationProvider.TEMPORARILY_UNAVAILABLE;
2456fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly
2466fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        try {
2476fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return service.getStatus(extras);
2486fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (RemoteException e) {
2496fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.w(TAG, e);
2506fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (Exception e) {
2516fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            // never let remote service crash system server
2526fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.e(TAG, "Exception from " + mServiceWatcher.getBestPackageName(), e);
2536fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        }
2546fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        return LocationProvider.TEMPORARILY_UNAVAILABLE;
255e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
256e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
2576fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
2586fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    public long getStatusUpdateTime() {
2596fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        ILocationProvider service = getService();
2606fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (service == null) return 0;
261e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
2626fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        try {
2636fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return service.getStatusUpdateTime();
2646fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (RemoteException e) {
2656fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.w(TAG, e);
2666fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (Exception e) {
2676fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            // never let remote service crash system server
2686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.e(TAG, "Exception from " + mServiceWatcher.getBestPackageName(), e);
269fd6e5f0dda50e113db4ccc55338b6c4f09da37a4Mike Lockwood        }
2706fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        return 0;
271fd6e5f0dda50e113db4ccc55338b6c4f09da37a4Mike Lockwood    }
272fd6e5f0dda50e113db4ccc55338b6c4f09da37a4Mike Lockwood
2736fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly    @Override
274e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public boolean sendExtraCommand(String command, Bundle extras) {
2756fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        ILocationProvider service = getService();
2766fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        if (service == null) return false;
277e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
2786fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        try {
2796fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            return service.sendExtraCommand(command, extras);
2806fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (RemoteException e) {
2816fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.w(TAG, e);
2826fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        } catch (Exception e) {
2836fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            // never let remote service crash system server
2846fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly            Log.e(TAG, "Exception from " + mServiceWatcher.getBestPackageName(), e);
285e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
2866fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly        return false;
2873681f2614fa8c10560c790f6b4287f65d6fd2663Mike Lockwood    }
2886fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly }
289