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