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