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}