FlpHardwareProvider.java revision 64be0c617f902398cbbcc2b145c86a8fbfc2feac
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 applicable 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 android.hardware.location.GeofenceHardwareImpl;
201af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.hardware.location.IFusedLocationHardware;
211af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.hardware.location.IFusedLocationHardwareSink;
221af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.location.IFusedGeofenceHardware;
231af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.location.FusedBatchOptions;
241af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.location.Geofence;
251af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.location.Location;
261af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.location.LocationListener;
271af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.location.LocationManager;
281af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
291af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.content.Context;
301af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.os.Bundle;
3164be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaaimport android.os.Looper;
321af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.os.RemoteException;
331af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.os.SystemClock;
341af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.util.Log;
351af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
361af4b0280af406cfc7eb46810f6b76e57b983e11destradaa/**
371af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * This class is an interop layer for JVM types and the JNI code that interacts
381af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * with the FLP HAL implementation.
391af4b0280af406cfc7eb46810f6b76e57b983e11destradaa *
401af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * {@hide}
411af4b0280af406cfc7eb46810f6b76e57b983e11destradaa */
421af4b0280af406cfc7eb46810f6b76e57b983e11destradaapublic class FlpHardwareProvider {
431af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private GeofenceHardwareImpl mGeofenceHardwareSink = null;
441af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private IFusedLocationHardwareSink mLocationSink = null;
451af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
461af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private static FlpHardwareProvider sSingletonInstance = null;
471af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
481af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private final static String TAG = "FlpHardwareProvider";
491af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private final Context mContext;
5064be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa    private final Object mLocationSinkLock = new Object();
511af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
521af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    public static FlpHardwareProvider getInstance(Context context) {
531af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        if (sSingletonInstance == null) {
541af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            sSingletonInstance = new FlpHardwareProvider(context);
551af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
561af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
571af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        return sSingletonInstance;
581af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    }
591af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
601af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private FlpHardwareProvider(Context context) {
611af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        mContext = context;
621af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
631af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        // register for listening for passive provider data
641af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        LocationManager manager = (LocationManager) mContext.getSystemService(
651af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                Context.LOCATION_SERVICE);
661af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        manager.requestLocationUpdates(
671af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                LocationManager.PASSIVE_PROVIDER,
681af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                0 /* minTime */,
691af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                0 /* minDistance */,
701af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                new NetworkLocationListener(),
7164be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa                Looper.myLooper());
721af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    }
731af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
741af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    public static boolean isSupported() {
751af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        return nativeIsSupported();
761af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    }
771af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
781af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    /**
791af4b0280af406cfc7eb46810f6b76e57b983e11destradaa     * Private callback functions used by FLP HAL.
801af4b0280af406cfc7eb46810f6b76e57b983e11destradaa     */
811af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    // FlpCallbacks members
821af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private void onLocationReport(Location[] locations) {
831af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        for (Location location : locations) {
841af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            location.setProvider(LocationManager.FUSED_PROVIDER);
851af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            // set the elapsed time-stamp just as GPS provider does
861af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
871af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
881af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
8964be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa        IFusedLocationHardwareSink sink;
9064be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa        synchronized (mLocationSinkLock) {
9164be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa            sink = mLocationSink;
9264be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa        }
931af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        try {
9464be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa            if (sink != null) {
9564be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa                sink.onLocationAvailable(locations);
961af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            }
971af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        } catch (RemoteException e) {
981af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            Log.e(TAG, "RemoteException calling onLocationAvailable");
991af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
1001af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    }
1011af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
1021af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    // FlpDiagnosticCallbacks members
1031af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private void onDataReport(String data) {
10464be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa        IFusedLocationHardwareSink sink;
10564be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa        synchronized (mLocationSinkLock) {
10664be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa            sink = mLocationSink;
10764be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa        }
1081af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        try {
1091af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            if (mLocationSink != null) {
11064be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa                sink.onDiagnosticDataAvailable(data);
1111af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            }
1121af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        } catch (RemoteException e) {
1131af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            Log.e(TAG, "RemoteException calling onDiagnosticDataAvailable");
1141af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
1151af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    }
1161af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
1171af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    // FlpGeofenceCallbacks members
1181af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private void onGeofenceTransition(
1191af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            int geofenceId,
1201af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            Location location,
1211af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            int transition,
1221af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            long timestamp,
1231af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            int sourcesUsed
1241af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            ) {
1251af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        // TODO: [GeofenceIntegration] change GeofenceHardwareImpl to accept a location object
1261af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    }
1271af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
1281af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private void onGeofenceMonitorStatus(int status, int source, Location location) {
1291af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        // TODO: [GeofenceIntegration]
1301af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    }
1311af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
1321af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private void onGeofenceAdd(int geofenceId, int result) {
1331af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        // TODO: [GeofenceIntegration] map between GPS and FLP results to pass a consistent status
1341af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    }
1351af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
1361af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private void onGeofenceRemove(int geofenceId, int result) {
1371af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        // TODO: [GeofenceIntegration] map between GPS and FLP results to pass a consistent status
1381af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    }
1391af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
1401af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private void onGeofencePause(int geofenceId, int result) {
1411af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        // TODO; [GeofenceIntegration] map between GPS and FLP results
1421af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    }
1431af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
1441af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private void onGeofenceResume(int geofenceId, int result) {
1451af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        // TODO: [GeofenceIntegration] map between GPS and FLP results
1461af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    }
1471af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
1481af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    /**
1491af4b0280af406cfc7eb46810f6b76e57b983e11destradaa     * Private native methods accessing FLP HAL.
1501af4b0280af406cfc7eb46810f6b76e57b983e11destradaa     */
1511af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    static { nativeClassInit(); }
1521af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
1531af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    // Core members
1541af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private static native void nativeClassInit();
1551af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private static native boolean nativeIsSupported();
1561af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
1571af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    // FlpLocationInterface members
1581af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native void nativeInit();
1591af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native int nativeGetBatchSize();
1601af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native void nativeStartBatching(int requestId, FusedBatchOptions options);
1611af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native void nativeUpdateBatchingOptions(int requestId, FusedBatchOptions optionsObject);
1621af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native void nativeStopBatching(int id);
1631af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native void nativeRequestBatchedLocation(int lastNLocations);
1641af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native void nativeInjectLocation(Location location);
1651af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    // TODO [Fix] sort out the lifetime of the instance
1661af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native void nativeCleanup();
1671af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
1681af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    // FlpDiagnosticsInterface members
1691af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native boolean nativeIsDiagnosticSupported();
1701af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native void nativeInjectDiagnosticData(String data);
1711af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
1721af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    // FlpDeviceContextInterface members
1731af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native boolean nativeIsDeviceContextSupported();
1741af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native void nativeInjectDeviceContext(int deviceEnabledContext);
1751af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
1761af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    // FlpGeofencingInterface members
1771af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native boolean nativeIsGeofencingSupported();
1781af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native void nativeAddGeofences(int[] geofenceIdsArray, Geofence[] geofencesArray);
1791af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native void nativePauseGeofence(int geofenceId);
1801af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native void  nativeResumeGeofence(int geofenceId, int monitorTransitions);
1811af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native void nativeModifyGeofenceOption(
1821af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        int geofenceId,
1831af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        int lastTransition,
1841af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        int monitorTransitions,
1851af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        int notificationResponsiveness,
1861af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        int unknownTimer,
1871af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        int sourcesToUse);
1881af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private native void nativeRemoveGeofences(int[] geofenceIdsArray);
1891af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
1901af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    /**
1911af4b0280af406cfc7eb46810f6b76e57b983e11destradaa     * Interface implementations for services built on top of this functionality.
1921af4b0280af406cfc7eb46810f6b76e57b983e11destradaa     */
1931af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    public static final String LOCATION = "Location";
1941af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    public static final String GEOFENCING = "Geofencing";
1951af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
1961af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    public IFusedLocationHardware getLocationHardware() {
1971af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        nativeInit();
1981af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        return mLocationHardware;
1991af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    }
2001af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2011af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    public IFusedGeofenceHardware getGeofenceHardware() {
2021af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        nativeInit();
2031af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        return mGeofenceHardwareService;
2041af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    }
2051af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2061af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private final IFusedLocationHardware mLocationHardware = new IFusedLocationHardware.Stub() {
2071af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
2081af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void registerSink(IFusedLocationHardwareSink eventSink) {
20964be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa            synchronized (mLocationSinkLock) {
21064be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa                // only one sink is allowed at the moment
21164be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa                if (mLocationSink != null) {
21264be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa                    throw new RuntimeException(
21364be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa                            "IFusedLocationHardware does not support multiple sinks");
21464be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa                }
21564be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa
21664be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa                mLocationSink = eventSink;
2171af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            }
2181af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
2191af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2201af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
2211af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void unregisterSink(IFusedLocationHardwareSink eventSink) {
22264be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa            synchronized (mLocationSinkLock) {
22364be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa                // don't throw if the sink is not registered, simply make it a no-op
22464be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa                if (mLocationSink == eventSink) {
22564be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa                    mLocationSink = null;
22664be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa                }
2271af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            }
2281af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
2291af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2301af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
2311af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public int getSupportedBatchSize() {
2321af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            return nativeGetBatchSize();
2331af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
2341af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2351af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
2361af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void startBatching(int requestId, FusedBatchOptions options) {
2371af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            nativeStartBatching(requestId, options);
2381af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
2391af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2401af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
2411af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void stopBatching(int requestId) {
2421af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            nativeStopBatching(requestId);
2431af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
2441af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2451af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
2461af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void updateBatchingOptions(int requestId, FusedBatchOptions options) {
2471af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            nativeUpdateBatchingOptions(requestId, options);
2481af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
2491af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2501af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
2511af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void requestBatchOfLocations(int batchSizeRequested) {
2521af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            nativeRequestBatchedLocation(batchSizeRequested);
2531af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
2541af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2551af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
2561af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public boolean supportsDiagnosticDataInjection() {
2571af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            return nativeIsDiagnosticSupported();
2581af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
2591af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2601af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
2611af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void injectDiagnosticData(String data) {
2621af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            nativeInjectDiagnosticData(data);
2631af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
2641af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2651af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
2661af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public boolean supportsDeviceContextInjection() {
2671af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            return nativeIsDeviceContextSupported();
2681af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
2691af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2701af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
2711af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void injectDeviceContext(int deviceEnabledContext) {
2721af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            nativeInjectDeviceContext(deviceEnabledContext);
2731af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
2741af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    };
2751af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2761af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private final IFusedGeofenceHardware mGeofenceHardwareService =
2771af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            new IFusedGeofenceHardware.Stub() {
2781af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
2791af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public boolean isSupported() {
2801af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            return nativeIsGeofencingSupported();
2811af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
2821af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2831af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
2841af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void addGeofences(int[] geofenceIdsArray, Geofence[] geofencesArray) {
2851af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            nativeAddGeofences(geofenceIdsArray, geofencesArray);
2861af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
2871af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2881af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
2891af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void removeGeofences(int[] geofenceIds) {
2901af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            nativeRemoveGeofences(geofenceIds);
2911af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
2921af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2931af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
2941af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void pauseMonitoringGeofence(int geofenceId) {
2951af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            nativePauseGeofence(geofenceId);
2961af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
2971af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
2981af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
2991af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void resumeMonitoringGeofence(int geofenceId, int monitorTransitions) {
3001af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            nativeResumeGeofence(geofenceId, monitorTransitions);
3011af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
3021af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
3031af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
3041af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void modifyGeofenceOptions(int geofenceId,
3051af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                int lastTransition,
3061af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                int monitorTransitions,
3071af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                int notificationResponsiveness,
3081af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                int unknownTimer
3091af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                ) {
3101af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            // TODO: [GeofenceIntegration] set sourcesToUse to the right value
3111af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            // TODO: expose sourcesToUse externally when needed
3121af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            nativeModifyGeofenceOption(
3131af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                    geofenceId,
3141af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                    lastTransition,
3151af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                    monitorTransitions,
3161af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                    notificationResponsiveness,
3171af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                    unknownTimer,
3181af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                    /* sourcesToUse */ 0xFFFF);
3191af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
3201af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    };
3211af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
3221af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    /**
3231af4b0280af406cfc7eb46810f6b76e57b983e11destradaa     * Internal classes and functions used by the provider.
3241af4b0280af406cfc7eb46810f6b76e57b983e11destradaa     */
3251af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private final class NetworkLocationListener implements LocationListener {
3261af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
3271af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void onLocationChanged(Location location) {
3281af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            if (
3291af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                !LocationManager.NETWORK_PROVIDER.equals(location.getProvider()) ||
3301af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                !location.hasAccuracy()
3311af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                ) {
3321af4b0280af406cfc7eb46810f6b76e57b983e11destradaa                return;
3331af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            }
3341af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
3351af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            nativeInjectLocation(location);
3361af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
3371af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
3381af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
3391af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void onStatusChanged(String provider, int status, Bundle extras) { }
3401af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
3411af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
3421af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void onProviderEnabled(String provider) { }
3431af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
3441af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        @Override
3451af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        public void onProviderDisabled(String provider) { }
3461af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    }
3471af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
3481af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    private GeofenceHardwareImpl getGeofenceHardwareSink() {
3491af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        if (mGeofenceHardwareSink == null) {
3501af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            // TODO: [GeofenceIntegration] we need to register ourselves with GeofenceHardwareImpl
3511af4b0280af406cfc7eb46810f6b76e57b983e11destradaa            mGeofenceHardwareSink = GeofenceHardwareImpl.getInstance(mContext);
3521af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        }
3531af4b0280af406cfc7eb46810f6b76e57b983e11destradaa
3541af4b0280af406cfc7eb46810f6b76e57b983e11destradaa        return mGeofenceHardwareSink;
3551af4b0280af406cfc7eb46810f6b76e57b983e11destradaa    }
3561af4b0280af406cfc7eb46810f6b76e57b983e11destradaa}