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