FusedProxy.java revision 1af4b0280af406cfc7eb46810f6b76e57b983e11
11af4b0280af406cfc7eb46810f6b76e57b983e11destradaa/* 21af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * Copyright (C) 2013 The Android Open Source Project 31af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * 41af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * Licensed under the Apache License, Version 2.0 (The "License"); 51af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * you may not use this file except in compliance with the License. 61af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * You may obtain a copy of the License at 71af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * 81af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * http://www.apache.org/licenses/LICENSE-2.0 91af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * 101af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * Unless required by law or agreed to in writing, software 111af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * distributed under the License is distributed on an "AS IS" BASIS, 121af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * See the License for the specific language governing permissions and 141af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * limitations under the License. 151af4b0280af406cfc7eb46810f6b76e57b983e11destradaa */ 161af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 171af4b0280af406cfc7eb46810f6b76e57b983e11destradaapackage com.android.server.location; 181af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 191af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport com.android.server.ServiceWatcher; 201af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 211af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.Manifest; 221af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.content.Context; 231af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.hardware.location.IFusedLocationHardware; 241af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.location.IFusedProvider; 251af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.os.Handler; 261af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.os.RemoteException; 271af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.util.Log; 281af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 291af4b0280af406cfc7eb46810f6b76e57b983e11destradaa/** 301af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * Proxy that helps bind GCore FusedProvider implementations to the Fused Hardware instances. 311af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * 321af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @hide 331af4b0280af406cfc7eb46810f6b76e57b983e11destradaa */ 341af4b0280af406cfc7eb46810f6b76e57b983e11destradaapublic final class FusedProxy { 351af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private final String TAG = "FusedProxy"; 361af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 371af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private ServiceWatcher mServiceWatcher; 381af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 391af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private FusedLocationHardwareSecure mLocationHardware; 401af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 411af4b0280af406cfc7eb46810f6b76e57b983e11destradaa /** 421af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * Constructor of the class. 431af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * This is private as the class follows a factory pattern for construction. 441af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * 451af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @param context The context needed for construction. 461af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @param handler The handler needed for construction. 471af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @param locationHardware The instance of the Fused location hardware assigned to the proxy. 481af4b0280af406cfc7eb46810f6b76e57b983e11destradaa */ 491af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private FusedProxy(Context context, Handler handler, IFusedLocationHardware locationHardware) { 501af4b0280af406cfc7eb46810f6b76e57b983e11destradaa mLocationHardware = new FusedLocationHardwareSecure( 511af4b0280af406cfc7eb46810f6b76e57b983e11destradaa locationHardware, 521af4b0280af406cfc7eb46810f6b76e57b983e11destradaa context, 531af4b0280af406cfc7eb46810f6b76e57b983e11destradaa Manifest.permission.LOCATION_HARDWARE); 541af4b0280af406cfc7eb46810f6b76e57b983e11destradaa Runnable newServiceWork = new Runnable() { 551af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 561af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void run() { 571af4b0280af406cfc7eb46810f6b76e57b983e11destradaa bindProvider(mLocationHardware); 581af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 591af4b0280af406cfc7eb46810f6b76e57b983e11destradaa }; 601af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 611af4b0280af406cfc7eb46810f6b76e57b983e11destradaa // prepare the connection to the provider 621af4b0280af406cfc7eb46810f6b76e57b983e11destradaa mServiceWatcher = new ServiceWatcher( 631af4b0280af406cfc7eb46810f6b76e57b983e11destradaa context, 641af4b0280af406cfc7eb46810f6b76e57b983e11destradaa TAG, 651af4b0280af406cfc7eb46810f6b76e57b983e11destradaa "com.android.location.service.FusedProvider", 661af4b0280af406cfc7eb46810f6b76e57b983e11destradaa com.android.internal.R.bool.config_enableFusedLocationOverlay, 671af4b0280af406cfc7eb46810f6b76e57b983e11destradaa com.android.internal.R.string.config_fusedLocationProviderPackageName, 681af4b0280af406cfc7eb46810f6b76e57b983e11destradaa com.android.internal.R.array.config_locationProviderPackageNames, 691af4b0280af406cfc7eb46810f6b76e57b983e11destradaa newServiceWork, 701af4b0280af406cfc7eb46810f6b76e57b983e11destradaa handler); 711af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 721af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 731af4b0280af406cfc7eb46810f6b76e57b983e11destradaa /** 741af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * Creates an instance of the proxy and binds it to the appropriate FusedProvider. 751af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * 761af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @param context The context needed for construction. 771af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @param handler The handler needed for construction. 781af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @param locationHardware The instance of the Fused location hardware assigned to the proxy. 791af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * 801af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @return An instance of the proxy if it could be bound, null otherwise. 811af4b0280af406cfc7eb46810f6b76e57b983e11destradaa */ 821af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public static FusedProxy createAndBind( 831af4b0280af406cfc7eb46810f6b76e57b983e11destradaa Context context, 841af4b0280af406cfc7eb46810f6b76e57b983e11destradaa Handler handler, 851af4b0280af406cfc7eb46810f6b76e57b983e11destradaa IFusedLocationHardware locationHardware 861af4b0280af406cfc7eb46810f6b76e57b983e11destradaa ) { 871af4b0280af406cfc7eb46810f6b76e57b983e11destradaa FusedProxy fusedProxy = new FusedProxy(context, handler, locationHardware); 881af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 891af4b0280af406cfc7eb46810f6b76e57b983e11destradaa // try to bind the Fused provider 901af4b0280af406cfc7eb46810f6b76e57b983e11destradaa if (!fusedProxy.mServiceWatcher.start()) { 911af4b0280af406cfc7eb46810f6b76e57b983e11destradaa return null; 921af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 931af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 941af4b0280af406cfc7eb46810f6b76e57b983e11destradaa return fusedProxy; 951af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 961af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 971af4b0280af406cfc7eb46810f6b76e57b983e11destradaa /** 981af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * Helper function to bind the FusedLocationHardware to the appropriate FusedProvider instance. 991af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * 1001af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @param locationHardware The FusedLocationHardware instance to use for the binding operation. 1011af4b0280af406cfc7eb46810f6b76e57b983e11destradaa */ 1021af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private void bindProvider(IFusedLocationHardware locationHardware) { 1031af4b0280af406cfc7eb46810f6b76e57b983e11destradaa IFusedProvider provider = IFusedProvider.Stub.asInterface(mServiceWatcher.getBinder()); 1041af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 1051af4b0280af406cfc7eb46810f6b76e57b983e11destradaa if (provider == null) { 1061af4b0280af406cfc7eb46810f6b76e57b983e11destradaa Log.e(TAG, "No instance of FusedProvider found on FusedLocationHardware connected."); 1071af4b0280af406cfc7eb46810f6b76e57b983e11destradaa return; 1081af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 1091af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 1101af4b0280af406cfc7eb46810f6b76e57b983e11destradaa try { 1111af4b0280af406cfc7eb46810f6b76e57b983e11destradaa provider.onFusedLocationHardwareChange(locationHardware); 1121af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } catch (RemoteException e) { 1131af4b0280af406cfc7eb46810f6b76e57b983e11destradaa Log.e(TAG, e.toString()); 1141af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 1151af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 1161af4b0280af406cfc7eb46810f6b76e57b983e11destradaa} 117