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