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"; 3664be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa private final ServiceWatcher mServiceWatcher; 3764be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa private final FusedLocationHardwareSecure mLocationHardware; 381af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 391af4b0280af406cfc7eb46810f6b76e57b983e11destradaa /** 401af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * Constructor of the class. 411af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * This is private as the class follows a factory pattern for construction. 421af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * 431af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @param context The context needed for construction. 441af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @param handler The handler needed for construction. 451af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @param locationHardware The instance of the Fused location hardware assigned to the proxy. 461af4b0280af406cfc7eb46810f6b76e57b983e11destradaa */ 4764be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa private FusedProxy( 4864be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa Context context, 4964be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa Handler handler, 5064be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa IFusedLocationHardware locationHardware, 5164be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa int overlaySwitchResId, 5264be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa int defaultServicePackageNameResId, 5364be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa int initialPackageNameResId) { 541af4b0280af406cfc7eb46810f6b76e57b983e11destradaa mLocationHardware = new FusedLocationHardwareSecure( 551af4b0280af406cfc7eb46810f6b76e57b983e11destradaa locationHardware, 561af4b0280af406cfc7eb46810f6b76e57b983e11destradaa context, 571af4b0280af406cfc7eb46810f6b76e57b983e11destradaa Manifest.permission.LOCATION_HARDWARE); 581af4b0280af406cfc7eb46810f6b76e57b983e11destradaa Runnable newServiceWork = new Runnable() { 591af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 601af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void run() { 611af4b0280af406cfc7eb46810f6b76e57b983e11destradaa bindProvider(mLocationHardware); 621af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 631af4b0280af406cfc7eb46810f6b76e57b983e11destradaa }; 641af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 651af4b0280af406cfc7eb46810f6b76e57b983e11destradaa // prepare the connection to the provider 661af4b0280af406cfc7eb46810f6b76e57b983e11destradaa mServiceWatcher = new ServiceWatcher( 671af4b0280af406cfc7eb46810f6b76e57b983e11destradaa context, 681af4b0280af406cfc7eb46810f6b76e57b983e11destradaa TAG, 691af4b0280af406cfc7eb46810f6b76e57b983e11destradaa "com.android.location.service.FusedProvider", 7064be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa overlaySwitchResId, 7164be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa defaultServicePackageNameResId, 7264be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa initialPackageNameResId, 731af4b0280af406cfc7eb46810f6b76e57b983e11destradaa newServiceWork, 741af4b0280af406cfc7eb46810f6b76e57b983e11destradaa handler); 751af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 761af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 771af4b0280af406cfc7eb46810f6b76e57b983e11destradaa /** 781af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * Creates an instance of the proxy and binds it to the appropriate FusedProvider. 791af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * 801af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @param context The context needed for construction. 811af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @param handler The handler needed for construction. 821af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @param locationHardware The instance of the Fused location hardware assigned to the proxy. 831af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * 841af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @return An instance of the proxy if it could be bound, null otherwise. 851af4b0280af406cfc7eb46810f6b76e57b983e11destradaa */ 861af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public static FusedProxy createAndBind( 871af4b0280af406cfc7eb46810f6b76e57b983e11destradaa Context context, 881af4b0280af406cfc7eb46810f6b76e57b983e11destradaa Handler handler, 8964be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa IFusedLocationHardware locationHardware, 9064be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa int overlaySwitchResId, 9164be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa int defaultServicePackageNameResId, 9264be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa int initialPackageNameResId) { 9364be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa FusedProxy fusedProxy = new FusedProxy( 9464be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa context, 9564be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa handler, 9664be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa locationHardware, 9764be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa overlaySwitchResId, 9864be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa defaultServicePackageNameResId, 9964be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa initialPackageNameResId); 1001af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 1011af4b0280af406cfc7eb46810f6b76e57b983e11destradaa // try to bind the Fused provider 1021af4b0280af406cfc7eb46810f6b76e57b983e11destradaa if (!fusedProxy.mServiceWatcher.start()) { 1031af4b0280af406cfc7eb46810f6b76e57b983e11destradaa return null; 1041af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 1051af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 1061af4b0280af406cfc7eb46810f6b76e57b983e11destradaa return fusedProxy; 1071af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 1081af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 1091af4b0280af406cfc7eb46810f6b76e57b983e11destradaa /** 1101af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * Helper function to bind the FusedLocationHardware to the appropriate FusedProvider instance. 1111af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * 1121af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * @param locationHardware The FusedLocationHardware instance to use for the binding operation. 1131af4b0280af406cfc7eb46810f6b76e57b983e11destradaa */ 1141af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private void bindProvider(IFusedLocationHardware locationHardware) { 1151af4b0280af406cfc7eb46810f6b76e57b983e11destradaa IFusedProvider provider = IFusedProvider.Stub.asInterface(mServiceWatcher.getBinder()); 1161af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 1171af4b0280af406cfc7eb46810f6b76e57b983e11destradaa if (provider == null) { 1181af4b0280af406cfc7eb46810f6b76e57b983e11destradaa Log.e(TAG, "No instance of FusedProvider found on FusedLocationHardware connected."); 1191af4b0280af406cfc7eb46810f6b76e57b983e11destradaa return; 1201af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 1211af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 1221af4b0280af406cfc7eb46810f6b76e57b983e11destradaa try { 1231af4b0280af406cfc7eb46810f6b76e57b983e11destradaa provider.onFusedLocationHardwareChange(locationHardware); 1241af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } catch (RemoteException e) { 1251af4b0280af406cfc7eb46810f6b76e57b983e11destradaa Log.e(TAG, e.toString()); 1261af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 1271af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 1281af4b0280af406cfc7eb46810f6b76e57b983e11destradaa} 129