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 19b902698632be50231d1597a38200a44026c1c94fdestradaaimport android.content.Context; 200682809ad08db284d7110aab44108d5e9c310e6bdestradaaimport android.hardware.location.GeofenceHardware; 211af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.hardware.location.GeofenceHardwareImpl; 220682809ad08db284d7110aab44108d5e9c310e6bdestradaaimport android.hardware.location.GeofenceHardwareRequestParcelable; 231af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.hardware.location.IFusedLocationHardware; 241af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.hardware.location.IFusedLocationHardwareSink; 251af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.location.FusedBatchOptions; 26b902698632be50231d1597a38200a44026c1c94fdestradaaimport android.location.IFusedGeofenceHardware; 271af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.location.Location; 281af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.location.LocationListener; 291af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.location.LocationManager; 309e9ce925418a0075234b3cc34261c6be32095412David Christieimport android.location.LocationRequest; 311af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.os.Bundle; 3264be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaaimport android.os.Looper; 331af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.os.RemoteException; 341af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.os.SystemClock; 351af4b0280af406cfc7eb46810f6b76e57b983e11destradaaimport android.util.Log; 361af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 371af4b0280af406cfc7eb46810f6b76e57b983e11destradaa/** 381af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * This class is an interop layer for JVM types and the JNI code that interacts 391af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * with the FLP HAL implementation. 401af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * 411af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * {@hide} 421af4b0280af406cfc7eb46810f6b76e57b983e11destradaa */ 431af4b0280af406cfc7eb46810f6b76e57b983e11destradaapublic class FlpHardwareProvider { 44cfc9b6d6ab3c622ea4f9d06c28d6e0d2055d98e1David Christie private static final int FIRST_VERSION_WITH_FLUSH_LOCATIONS = 2; 451af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private GeofenceHardwareImpl mGeofenceHardwareSink = null; 461af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private IFusedLocationHardwareSink mLocationSink = null; 47ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie // Capabilities provided by FlpCallbacks 48ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie private boolean mHaveBatchingCapabilities; 49ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie private int mBatchingCapabilities; 5038feb6f1ece3b5213a42341c6dd91fd3e12b0760David Christie private int mVersion = 1; 511af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 521af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private static FlpHardwareProvider sSingletonInstance = null; 531af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 541af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private final static String TAG = "FlpHardwareProvider"; 551af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private final Context mContext; 5664be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa private final Object mLocationSinkLock = new Object(); 571af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 580682809ad08db284d7110aab44108d5e9c310e6bdestradaa // FlpHal result codes, they must be equal to the ones in fused_location.h 590682809ad08db284d7110aab44108d5e9c310e6bdestradaa private static final int FLP_RESULT_SUCCESS = 0; 600682809ad08db284d7110aab44108d5e9c310e6bdestradaa private static final int FLP_RESULT_ERROR = -1; 610682809ad08db284d7110aab44108d5e9c310e6bdestradaa private static final int FLP_RESULT_INSUFFICIENT_MEMORY = -2; 620682809ad08db284d7110aab44108d5e9c310e6bdestradaa private static final int FLP_RESULT_TOO_MANY_GEOFENCES = -3; 630682809ad08db284d7110aab44108d5e9c310e6bdestradaa private static final int FLP_RESULT_ID_EXISTS = -4; 640682809ad08db284d7110aab44108d5e9c310e6bdestradaa private static final int FLP_RESULT_ID_UNKNOWN = -5; 650682809ad08db284d7110aab44108d5e9c310e6bdestradaa private static final int FLP_RESULT_INVALID_GEOFENCE_TRANSITION = -6; 660682809ad08db284d7110aab44108d5e9c310e6bdestradaa 67cc972725af35284c0b571aaa0dc6873e69b15119destradaa // FlpHal monitor status codes, they must be equal to the ones in fused_location.h 68cc972725af35284c0b571aaa0dc6873e69b15119destradaa private static final int FLP_GEOFENCE_MONITOR_STATUS_UNAVAILABLE = 1<<0; 69cc972725af35284c0b571aaa0dc6873e69b15119destradaa private static final int FLP_GEOFENCE_MONITOR_STATUS_AVAILABLE = 1<<1; 70cc972725af35284c0b571aaa0dc6873e69b15119destradaa 711af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public static FlpHardwareProvider getInstance(Context context) { 721af4b0280af406cfc7eb46810f6b76e57b983e11destradaa if (sSingletonInstance == null) { 731af4b0280af406cfc7eb46810f6b76e57b983e11destradaa sSingletonInstance = new FlpHardwareProvider(context); 74a4dfc2c56b0efd0094d8cf9156c7b24fb4e67d25Zhentao Sun sSingletonInstance.nativeInit(); 751af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 761af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 771af4b0280af406cfc7eb46810f6b76e57b983e11destradaa return sSingletonInstance; 781af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 791af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 801af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private FlpHardwareProvider(Context context) { 811af4b0280af406cfc7eb46810f6b76e57b983e11destradaa mContext = context; 821af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 831af4b0280af406cfc7eb46810f6b76e57b983e11destradaa // register for listening for passive provider data 841af4b0280af406cfc7eb46810f6b76e57b983e11destradaa LocationManager manager = (LocationManager) mContext.getSystemService( 851af4b0280af406cfc7eb46810f6b76e57b983e11destradaa Context.LOCATION_SERVICE); 869e9ce925418a0075234b3cc34261c6be32095412David Christie final long minTime = 0; 879e9ce925418a0075234b3cc34261c6be32095412David Christie final float minDistance = 0; 889e9ce925418a0075234b3cc34261c6be32095412David Christie final boolean oneShot = false; 899e9ce925418a0075234b3cc34261c6be32095412David Christie LocationRequest request = LocationRequest.createFromDeprecatedProvider( 901af4b0280af406cfc7eb46810f6b76e57b983e11destradaa LocationManager.PASSIVE_PROVIDER, 919e9ce925418a0075234b3cc34261c6be32095412David Christie minTime, 929e9ce925418a0075234b3cc34261c6be32095412David Christie minDistance, 939e9ce925418a0075234b3cc34261c6be32095412David Christie oneShot); 949e9ce925418a0075234b3cc34261c6be32095412David Christie // Don't keep track of this request since it's done on behalf of other clients 959e9ce925418a0075234b3cc34261c6be32095412David Christie // (which are kept track of separately). 969e9ce925418a0075234b3cc34261c6be32095412David Christie request.setHideFromAppOps(true); 979e9ce925418a0075234b3cc34261c6be32095412David Christie manager.requestLocationUpdates( 989e9ce925418a0075234b3cc34261c6be32095412David Christie request, 991af4b0280af406cfc7eb46810f6b76e57b983e11destradaa new NetworkLocationListener(), 10064be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa Looper.myLooper()); 1011af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 1021af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 1035ce66d8dcc786b3d6a0fdfb42074e6c9741590efdestradaa public static boolean isSupported() { 1041af4b0280af406cfc7eb46810f6b76e57b983e11destradaa return nativeIsSupported(); 1051af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 1061af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 1071af4b0280af406cfc7eb46810f6b76e57b983e11destradaa /** 1081af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * Private callback functions used by FLP HAL. 1091af4b0280af406cfc7eb46810f6b76e57b983e11destradaa */ 1101af4b0280af406cfc7eb46810f6b76e57b983e11destradaa // FlpCallbacks members 1111af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private void onLocationReport(Location[] locations) { 1121af4b0280af406cfc7eb46810f6b76e57b983e11destradaa for (Location location : locations) { 1131af4b0280af406cfc7eb46810f6b76e57b983e11destradaa location.setProvider(LocationManager.FUSED_PROVIDER); 1141af4b0280af406cfc7eb46810f6b76e57b983e11destradaa // set the elapsed time-stamp just as GPS provider does 1151af4b0280af406cfc7eb46810f6b76e57b983e11destradaa location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); 1161af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 1171af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 11864be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa IFusedLocationHardwareSink sink; 11964be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa synchronized (mLocationSinkLock) { 12064be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa sink = mLocationSink; 12164be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa } 1221af4b0280af406cfc7eb46810f6b76e57b983e11destradaa try { 12364be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa if (sink != null) { 12464be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa sink.onLocationAvailable(locations); 1251af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 1261af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } catch (RemoteException e) { 1271af4b0280af406cfc7eb46810f6b76e57b983e11destradaa Log.e(TAG, "RemoteException calling onLocationAvailable"); 1281af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 1291af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 1301af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 131ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie private void onBatchingCapabilities(int capabilities) { 132ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie synchronized (mLocationSinkLock) { 133ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie mHaveBatchingCapabilities = true; 134ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie mBatchingCapabilities = capabilities; 135ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie } 136ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie 137ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie maybeSendCapabilities(); 138a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie 139a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie if (mGeofenceHardwareSink != null) { 140a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie mGeofenceHardwareSink.setVersion(getVersion()); 141a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie } 142ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie } 143ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie 14415003f19e5e5a443222569401f167a3ac0e1de3aDavid Christie private void onBatchingStatus(int status) { 14515003f19e5e5a443222569401f167a3ac0e1de3aDavid Christie IFusedLocationHardwareSink sink; 14615003f19e5e5a443222569401f167a3ac0e1de3aDavid Christie synchronized (mLocationSinkLock) { 14715003f19e5e5a443222569401f167a3ac0e1de3aDavid Christie sink = mLocationSink; 14815003f19e5e5a443222569401f167a3ac0e1de3aDavid Christie } 14915003f19e5e5a443222569401f167a3ac0e1de3aDavid Christie try { 15015003f19e5e5a443222569401f167a3ac0e1de3aDavid Christie if (sink != null) { 15115003f19e5e5a443222569401f167a3ac0e1de3aDavid Christie sink.onStatusChanged(status); 15215003f19e5e5a443222569401f167a3ac0e1de3aDavid Christie } 15315003f19e5e5a443222569401f167a3ac0e1de3aDavid Christie } catch (RemoteException e) { 15415003f19e5e5a443222569401f167a3ac0e1de3aDavid Christie Log.e(TAG, "RemoteException calling onBatchingStatus"); 15515003f19e5e5a443222569401f167a3ac0e1de3aDavid Christie } 15615003f19e5e5a443222569401f167a3ac0e1de3aDavid Christie } 15715003f19e5e5a443222569401f167a3ac0e1de3aDavid Christie 158a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie // Returns the current version of the FLP HAL. This depends both on the version of the 159a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie // structure returned by the hardware layer, and whether or not we've received the 160a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie // capabilities callback on initialization. Assume original version until we get 161a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie // the new initialization callback. 162a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie private int getVersion() { 163a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie synchronized (mLocationSinkLock) { 164a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie if (mHaveBatchingCapabilities) { 165a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie return mVersion; 166a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie } 167a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie } 168a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie return 1; 169a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie } 170a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie 171cfc9b6d6ab3c622ea4f9d06c28d6e0d2055d98e1David Christie private void setVersion(int version) { 172cfc9b6d6ab3c622ea4f9d06c28d6e0d2055d98e1David Christie mVersion = version; 17338feb6f1ece3b5213a42341c6dd91fd3e12b0760David Christie if (mGeofenceHardwareSink != null) { 174a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie mGeofenceHardwareSink.setVersion(getVersion()); 17538feb6f1ece3b5213a42341c6dd91fd3e12b0760David Christie } 176cfc9b6d6ab3c622ea4f9d06c28d6e0d2055d98e1David Christie } 177cfc9b6d6ab3c622ea4f9d06c28d6e0d2055d98e1David Christie 178ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie private void maybeSendCapabilities() { 179ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie IFusedLocationHardwareSink sink; 180ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie boolean haveBatchingCapabilities; 181ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie int batchingCapabilities; 182ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie synchronized (mLocationSinkLock) { 183ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie sink = mLocationSink; 184ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie haveBatchingCapabilities = mHaveBatchingCapabilities; 185ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie batchingCapabilities = mBatchingCapabilities; 186ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie } 187ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie try { 188ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie if (sink != null && haveBatchingCapabilities) { 189ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie sink.onCapabilities(batchingCapabilities); 190ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie } 191ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie } catch (RemoteException e) { 192ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie Log.e(TAG, "RemoteException calling onLocationAvailable"); 193ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie } 194ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie } 195ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie 1961af4b0280af406cfc7eb46810f6b76e57b983e11destradaa // FlpDiagnosticCallbacks members 1971af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private void onDataReport(String data) { 19864be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa IFusedLocationHardwareSink sink; 19964be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa synchronized (mLocationSinkLock) { 20064be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa sink = mLocationSink; 20164be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa } 2021af4b0280af406cfc7eb46810f6b76e57b983e11destradaa try { 2031af4b0280af406cfc7eb46810f6b76e57b983e11destradaa if (mLocationSink != null) { 20464be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa sink.onDiagnosticDataAvailable(data); 2051af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 2061af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } catch (RemoteException e) { 2071af4b0280af406cfc7eb46810f6b76e57b983e11destradaa Log.e(TAG, "RemoteException calling onDiagnosticDataAvailable"); 2081af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 2091af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 2101af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 2111af4b0280af406cfc7eb46810f6b76e57b983e11destradaa // FlpGeofenceCallbacks members 2121af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private void onGeofenceTransition( 2131af4b0280af406cfc7eb46810f6b76e57b983e11destradaa int geofenceId, 2141af4b0280af406cfc7eb46810f6b76e57b983e11destradaa Location location, 2151af4b0280af406cfc7eb46810f6b76e57b983e11destradaa int transition, 2161af4b0280af406cfc7eb46810f6b76e57b983e11destradaa long timestamp, 2170682809ad08db284d7110aab44108d5e9c310e6bdestradaa int sourcesUsed) { 218cc972725af35284c0b571aaa0dc6873e69b15119destradaa // the transition Id does not require translation because the values in fused_location.h 219cc972725af35284c0b571aaa0dc6873e69b15119destradaa // and GeofenceHardware are in sync 2200682809ad08db284d7110aab44108d5e9c310e6bdestradaa getGeofenceHardwareSink().reportGeofenceTransition( 2210682809ad08db284d7110aab44108d5e9c310e6bdestradaa geofenceId, 2220682809ad08db284d7110aab44108d5e9c310e6bdestradaa updateLocationInformation(location), 2230682809ad08db284d7110aab44108d5e9c310e6bdestradaa transition, 2240682809ad08db284d7110aab44108d5e9c310e6bdestradaa timestamp, 2250682809ad08db284d7110aab44108d5e9c310e6bdestradaa GeofenceHardware.MONITORING_TYPE_FUSED_HARDWARE, 2260682809ad08db284d7110aab44108d5e9c310e6bdestradaa sourcesUsed); 2271af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 2281af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 2291af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private void onGeofenceMonitorStatus(int status, int source, Location location) { 230839904eed81bf9cd87c27de49903dddb64ae3937destradaa // allow the location to be optional in this event 231839904eed81bf9cd87c27de49903dddb64ae3937destradaa Location updatedLocation = null; 232839904eed81bf9cd87c27de49903dddb64ae3937destradaa if(location != null) { 233839904eed81bf9cd87c27de49903dddb64ae3937destradaa updatedLocation = updateLocationInformation(location); 234839904eed81bf9cd87c27de49903dddb64ae3937destradaa } 235839904eed81bf9cd87c27de49903dddb64ae3937destradaa 236cc972725af35284c0b571aaa0dc6873e69b15119destradaa int monitorStatus; 237cc972725af35284c0b571aaa0dc6873e69b15119destradaa switch (status) { 238cc972725af35284c0b571aaa0dc6873e69b15119destradaa case FLP_GEOFENCE_MONITOR_STATUS_UNAVAILABLE: 239cc972725af35284c0b571aaa0dc6873e69b15119destradaa monitorStatus = GeofenceHardware.MONITOR_CURRENTLY_UNAVAILABLE; 240cc972725af35284c0b571aaa0dc6873e69b15119destradaa break; 241cc972725af35284c0b571aaa0dc6873e69b15119destradaa case FLP_GEOFENCE_MONITOR_STATUS_AVAILABLE: 242cc972725af35284c0b571aaa0dc6873e69b15119destradaa monitorStatus = GeofenceHardware.MONITOR_CURRENTLY_AVAILABLE; 243cc972725af35284c0b571aaa0dc6873e69b15119destradaa break; 244cc972725af35284c0b571aaa0dc6873e69b15119destradaa default: 245cc972725af35284c0b571aaa0dc6873e69b15119destradaa Log.e(TAG, "Invalid FlpHal Geofence monitor status: " + status); 246cc972725af35284c0b571aaa0dc6873e69b15119destradaa monitorStatus = GeofenceHardware.MONITOR_CURRENTLY_UNAVAILABLE; 247cc972725af35284c0b571aaa0dc6873e69b15119destradaa break; 248cc972725af35284c0b571aaa0dc6873e69b15119destradaa } 249cc972725af35284c0b571aaa0dc6873e69b15119destradaa 2500682809ad08db284d7110aab44108d5e9c310e6bdestradaa getGeofenceHardwareSink().reportGeofenceMonitorStatus( 2510682809ad08db284d7110aab44108d5e9c310e6bdestradaa GeofenceHardware.MONITORING_TYPE_FUSED_HARDWARE, 252cc972725af35284c0b571aaa0dc6873e69b15119destradaa monitorStatus, 253839904eed81bf9cd87c27de49903dddb64ae3937destradaa updatedLocation, 2540682809ad08db284d7110aab44108d5e9c310e6bdestradaa source); 2551af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 2561af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 2571af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private void onGeofenceAdd(int geofenceId, int result) { 2580682809ad08db284d7110aab44108d5e9c310e6bdestradaa getGeofenceHardwareSink().reportGeofenceAddStatus( 2590682809ad08db284d7110aab44108d5e9c310e6bdestradaa geofenceId, 2600682809ad08db284d7110aab44108d5e9c310e6bdestradaa translateToGeofenceHardwareStatus(result)); 2611af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 2621af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 2631af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private void onGeofenceRemove(int geofenceId, int result) { 2640682809ad08db284d7110aab44108d5e9c310e6bdestradaa getGeofenceHardwareSink().reportGeofenceRemoveStatus( 2650682809ad08db284d7110aab44108d5e9c310e6bdestradaa geofenceId, 2660682809ad08db284d7110aab44108d5e9c310e6bdestradaa translateToGeofenceHardwareStatus(result)); 2671af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 2681af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 2691af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private void onGeofencePause(int geofenceId, int result) { 2700682809ad08db284d7110aab44108d5e9c310e6bdestradaa getGeofenceHardwareSink().reportGeofencePauseStatus( 2710682809ad08db284d7110aab44108d5e9c310e6bdestradaa geofenceId, 2720682809ad08db284d7110aab44108d5e9c310e6bdestradaa translateToGeofenceHardwareStatus(result)); 2731af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 2741af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 2751af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private void onGeofenceResume(int geofenceId, int result) { 2760682809ad08db284d7110aab44108d5e9c310e6bdestradaa getGeofenceHardwareSink().reportGeofenceResumeStatus( 2770682809ad08db284d7110aab44108d5e9c310e6bdestradaa geofenceId, 2780682809ad08db284d7110aab44108d5e9c310e6bdestradaa translateToGeofenceHardwareStatus(result)); 2791af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 2801af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 281ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie private void onGeofencingCapabilities(int capabilities) { 282ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie getGeofenceHardwareSink().onCapabilities(capabilities); 283ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie } 284ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie 2851af4b0280af406cfc7eb46810f6b76e57b983e11destradaa /** 2861af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * Private native methods accessing FLP HAL. 2871af4b0280af406cfc7eb46810f6b76e57b983e11destradaa */ 2881af4b0280af406cfc7eb46810f6b76e57b983e11destradaa static { nativeClassInit(); } 2891af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 2901af4b0280af406cfc7eb46810f6b76e57b983e11destradaa // Core members 2911af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private static native void nativeClassInit(); 2921af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private static native boolean nativeIsSupported(); 2931af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 2941af4b0280af406cfc7eb46810f6b76e57b983e11destradaa // FlpLocationInterface members 295a4dfc2c56b0efd0094d8cf9156c7b24fb4e67d25Zhentao Sun private native void nativeInit(); 2961af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private native int nativeGetBatchSize(); 2971af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private native void nativeStartBatching(int requestId, FusedBatchOptions options); 2981af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private native void nativeUpdateBatchingOptions(int requestId, FusedBatchOptions optionsObject); 2991af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private native void nativeStopBatching(int id); 3001af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private native void nativeRequestBatchedLocation(int lastNLocations); 301fff30439cafb737eb54de807caab4fb61432f2ccDavid Christie private native void nativeFlushBatchedLocations(); 3021af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private native void nativeInjectLocation(Location location); 3031af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private native void nativeCleanup(); 3041af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 3051af4b0280af406cfc7eb46810f6b76e57b983e11destradaa // FlpDiagnosticsInterface members 3061af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private native boolean nativeIsDiagnosticSupported(); 3071af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private native void nativeInjectDiagnosticData(String data); 3081af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 3091af4b0280af406cfc7eb46810f6b76e57b983e11destradaa // FlpDeviceContextInterface members 3101af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private native boolean nativeIsDeviceContextSupported(); 3111af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private native void nativeInjectDeviceContext(int deviceEnabledContext); 3121af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 3131af4b0280af406cfc7eb46810f6b76e57b983e11destradaa // FlpGeofencingInterface members 3141af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private native boolean nativeIsGeofencingSupported(); 3150682809ad08db284d7110aab44108d5e9c310e6bdestradaa private native void nativeAddGeofences( 3160682809ad08db284d7110aab44108d5e9c310e6bdestradaa GeofenceHardwareRequestParcelable[] geofenceRequestsArray); 3171af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private native void nativePauseGeofence(int geofenceId); 3181af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private native void nativeResumeGeofence(int geofenceId, int monitorTransitions); 3191af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private native void nativeModifyGeofenceOption( 3201af4b0280af406cfc7eb46810f6b76e57b983e11destradaa int geofenceId, 3211af4b0280af406cfc7eb46810f6b76e57b983e11destradaa int lastTransition, 3221af4b0280af406cfc7eb46810f6b76e57b983e11destradaa int monitorTransitions, 3231af4b0280af406cfc7eb46810f6b76e57b983e11destradaa int notificationResponsiveness, 3241af4b0280af406cfc7eb46810f6b76e57b983e11destradaa int unknownTimer, 3251af4b0280af406cfc7eb46810f6b76e57b983e11destradaa int sourcesToUse); 3261af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private native void nativeRemoveGeofences(int[] geofenceIdsArray); 3271af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 3281af4b0280af406cfc7eb46810f6b76e57b983e11destradaa /** 3291af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * Interface implementations for services built on top of this functionality. 3301af4b0280af406cfc7eb46810f6b76e57b983e11destradaa */ 3311af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public static final String LOCATION = "Location"; 3321af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public static final String GEOFENCING = "Geofencing"; 3331af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 3341af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public IFusedLocationHardware getLocationHardware() { 3351af4b0280af406cfc7eb46810f6b76e57b983e11destradaa return mLocationHardware; 3361af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 3371af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 3381af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public IFusedGeofenceHardware getGeofenceHardware() { 3391af4b0280af406cfc7eb46810f6b76e57b983e11destradaa return mGeofenceHardwareService; 3401af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 3411af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 342b902698632be50231d1597a38200a44026c1c94fdestradaa public void cleanup() { 343b902698632be50231d1597a38200a44026c1c94fdestradaa Log.i(TAG, "Calling nativeCleanup()"); 344b902698632be50231d1597a38200a44026c1c94fdestradaa nativeCleanup(); 345b902698632be50231d1597a38200a44026c1c94fdestradaa } 346b902698632be50231d1597a38200a44026c1c94fdestradaa 3471af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private final IFusedLocationHardware mLocationHardware = new IFusedLocationHardware.Stub() { 3481af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 3491af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void registerSink(IFusedLocationHardwareSink eventSink) { 35064be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa synchronized (mLocationSinkLock) { 35164be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa // only one sink is allowed at the moment 35264be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa if (mLocationSink != null) { 353daf35c31363fd9cf43aa9e556d1257bd3c3b7a22David Christie Log.e(TAG, "Replacing an existing IFusedLocationHardware sink"); 35464be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa } 35564be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa 35664be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa mLocationSink = eventSink; 3571af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 358ffca45a2cdd778e6edd5c3959bf53c6192b7e035David Christie maybeSendCapabilities(); 3591af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 3601af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 3611af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 3621af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void unregisterSink(IFusedLocationHardwareSink eventSink) { 36364be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa synchronized (mLocationSinkLock) { 36464be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa // don't throw if the sink is not registered, simply make it a no-op 36564be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa if (mLocationSink == eventSink) { 36664be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa mLocationSink = null; 36764be0c617f902398cbbcc2b145c86a8fbfc2feacdestradaa } 3681af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 3691af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 3701af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 3711af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 3721af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public int getSupportedBatchSize() { 3731af4b0280af406cfc7eb46810f6b76e57b983e11destradaa return nativeGetBatchSize(); 3741af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 3751af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 3761af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 3771af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void startBatching(int requestId, FusedBatchOptions options) { 3781af4b0280af406cfc7eb46810f6b76e57b983e11destradaa nativeStartBatching(requestId, options); 3791af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 3801af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 3811af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 3821af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void stopBatching(int requestId) { 3831af4b0280af406cfc7eb46810f6b76e57b983e11destradaa nativeStopBatching(requestId); 3841af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 3851af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 3861af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 3871af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void updateBatchingOptions(int requestId, FusedBatchOptions options) { 3881af4b0280af406cfc7eb46810f6b76e57b983e11destradaa nativeUpdateBatchingOptions(requestId, options); 3891af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 3901af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 3911af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 3921af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void requestBatchOfLocations(int batchSizeRequested) { 3931af4b0280af406cfc7eb46810f6b76e57b983e11destradaa nativeRequestBatchedLocation(batchSizeRequested); 3941af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 3951af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 3961af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 397fff30439cafb737eb54de807caab4fb61432f2ccDavid Christie public void flushBatchedLocations() { 398a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie if (getVersion() >= FIRST_VERSION_WITH_FLUSH_LOCATIONS) { 399cfc9b6d6ab3c622ea4f9d06c28d6e0d2055d98e1David Christie nativeFlushBatchedLocations(); 400cfc9b6d6ab3c622ea4f9d06c28d6e0d2055d98e1David Christie } else { 401cfc9b6d6ab3c622ea4f9d06c28d6e0d2055d98e1David Christie Log.wtf(TAG, 402cfc9b6d6ab3c622ea4f9d06c28d6e0d2055d98e1David Christie "Tried to call flushBatchedLocations on an unsupported implementation"); 403cfc9b6d6ab3c622ea4f9d06c28d6e0d2055d98e1David Christie } 404fff30439cafb737eb54de807caab4fb61432f2ccDavid Christie } 405fff30439cafb737eb54de807caab4fb61432f2ccDavid Christie 406fff30439cafb737eb54de807caab4fb61432f2ccDavid Christie @Override 4071af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public boolean supportsDiagnosticDataInjection() { 4081af4b0280af406cfc7eb46810f6b76e57b983e11destradaa return nativeIsDiagnosticSupported(); 4091af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 4101af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 4111af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 4121af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void injectDiagnosticData(String data) { 4131af4b0280af406cfc7eb46810f6b76e57b983e11destradaa nativeInjectDiagnosticData(data); 4141af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 4151af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 4161af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 4171af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public boolean supportsDeviceContextInjection() { 4181af4b0280af406cfc7eb46810f6b76e57b983e11destradaa return nativeIsDeviceContextSupported(); 4191af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 4201af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 4211af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 4221af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void injectDeviceContext(int deviceEnabledContext) { 4231af4b0280af406cfc7eb46810f6b76e57b983e11destradaa nativeInjectDeviceContext(deviceEnabledContext); 4241af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 425cfc9b6d6ab3c622ea4f9d06c28d6e0d2055d98e1David Christie 426cfc9b6d6ab3c622ea4f9d06c28d6e0d2055d98e1David Christie @Override 427cfc9b6d6ab3c622ea4f9d06c28d6e0d2055d98e1David Christie public int getVersion() { 428a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie return FlpHardwareProvider.this.getVersion(); 429cfc9b6d6ab3c622ea4f9d06c28d6e0d2055d98e1David Christie } 4301af4b0280af406cfc7eb46810f6b76e57b983e11destradaa }; 4311af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 4321af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private final IFusedGeofenceHardware mGeofenceHardwareService = 4331af4b0280af406cfc7eb46810f6b76e57b983e11destradaa new IFusedGeofenceHardware.Stub() { 4341af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 4351af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public boolean isSupported() { 4361af4b0280af406cfc7eb46810f6b76e57b983e11destradaa return nativeIsGeofencingSupported(); 4371af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 4381af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 4391af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 4400682809ad08db284d7110aab44108d5e9c310e6bdestradaa public void addGeofences(GeofenceHardwareRequestParcelable[] geofenceRequestsArray) { 4410682809ad08db284d7110aab44108d5e9c310e6bdestradaa nativeAddGeofences(geofenceRequestsArray); 4421af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 4431af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 4441af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 4451af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void removeGeofences(int[] geofenceIds) { 4461af4b0280af406cfc7eb46810f6b76e57b983e11destradaa nativeRemoveGeofences(geofenceIds); 4471af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 4481af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 4491af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 4501af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void pauseMonitoringGeofence(int geofenceId) { 4511af4b0280af406cfc7eb46810f6b76e57b983e11destradaa nativePauseGeofence(geofenceId); 4521af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 4531af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 4541af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 4551af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void resumeMonitoringGeofence(int geofenceId, int monitorTransitions) { 4561af4b0280af406cfc7eb46810f6b76e57b983e11destradaa nativeResumeGeofence(geofenceId, monitorTransitions); 4571af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 4581af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 4591af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 4601af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void modifyGeofenceOptions(int geofenceId, 4611af4b0280af406cfc7eb46810f6b76e57b983e11destradaa int lastTransition, 4621af4b0280af406cfc7eb46810f6b76e57b983e11destradaa int monitorTransitions, 4631af4b0280af406cfc7eb46810f6b76e57b983e11destradaa int notificationResponsiveness, 4640682809ad08db284d7110aab44108d5e9c310e6bdestradaa int unknownTimer, 4650682809ad08db284d7110aab44108d5e9c310e6bdestradaa int sourcesToUse) { 4661af4b0280af406cfc7eb46810f6b76e57b983e11destradaa nativeModifyGeofenceOption( 4671af4b0280af406cfc7eb46810f6b76e57b983e11destradaa geofenceId, 4681af4b0280af406cfc7eb46810f6b76e57b983e11destradaa lastTransition, 4691af4b0280af406cfc7eb46810f6b76e57b983e11destradaa monitorTransitions, 4701af4b0280af406cfc7eb46810f6b76e57b983e11destradaa notificationResponsiveness, 4711af4b0280af406cfc7eb46810f6b76e57b983e11destradaa unknownTimer, 4720682809ad08db284d7110aab44108d5e9c310e6bdestradaa sourcesToUse); 4731af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 4741af4b0280af406cfc7eb46810f6b76e57b983e11destradaa }; 4751af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 4761af4b0280af406cfc7eb46810f6b76e57b983e11destradaa /** 4771af4b0280af406cfc7eb46810f6b76e57b983e11destradaa * Internal classes and functions used by the provider. 4781af4b0280af406cfc7eb46810f6b76e57b983e11destradaa */ 4791af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private final class NetworkLocationListener implements LocationListener { 4801af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 4811af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void onLocationChanged(Location location) { 4821af4b0280af406cfc7eb46810f6b76e57b983e11destradaa if ( 4831af4b0280af406cfc7eb46810f6b76e57b983e11destradaa !LocationManager.NETWORK_PROVIDER.equals(location.getProvider()) || 4841af4b0280af406cfc7eb46810f6b76e57b983e11destradaa !location.hasAccuracy() 4851af4b0280af406cfc7eb46810f6b76e57b983e11destradaa ) { 4861af4b0280af406cfc7eb46810f6b76e57b983e11destradaa return; 4871af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 4881af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 4891af4b0280af406cfc7eb46810f6b76e57b983e11destradaa nativeInjectLocation(location); 4901af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 4911af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 4921af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 4931af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void onStatusChanged(String provider, int status, Bundle extras) { } 4941af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 4951af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 4961af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void onProviderEnabled(String provider) { } 4971af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 4981af4b0280af406cfc7eb46810f6b76e57b983e11destradaa @Override 4991af4b0280af406cfc7eb46810f6b76e57b983e11destradaa public void onProviderDisabled(String provider) { } 5001af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 5011af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 5021af4b0280af406cfc7eb46810f6b76e57b983e11destradaa private GeofenceHardwareImpl getGeofenceHardwareSink() { 5031af4b0280af406cfc7eb46810f6b76e57b983e11destradaa if (mGeofenceHardwareSink == null) { 5041af4b0280af406cfc7eb46810f6b76e57b983e11destradaa mGeofenceHardwareSink = GeofenceHardwareImpl.getInstance(mContext); 505a1a8e7f356582b12f91cf7608f6cf82a829a4564David Christie mGeofenceHardwareSink.setVersion(getVersion()); 5061af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 5071af4b0280af406cfc7eb46810f6b76e57b983e11destradaa 5081af4b0280af406cfc7eb46810f6b76e57b983e11destradaa return mGeofenceHardwareSink; 5091af4b0280af406cfc7eb46810f6b76e57b983e11destradaa } 5100682809ad08db284d7110aab44108d5e9c310e6bdestradaa 5110682809ad08db284d7110aab44108d5e9c310e6bdestradaa private static int translateToGeofenceHardwareStatus(int flpHalResult) { 5120682809ad08db284d7110aab44108d5e9c310e6bdestradaa switch(flpHalResult) { 5130682809ad08db284d7110aab44108d5e9c310e6bdestradaa case FLP_RESULT_SUCCESS: 5140682809ad08db284d7110aab44108d5e9c310e6bdestradaa return GeofenceHardware.GEOFENCE_SUCCESS; 5150682809ad08db284d7110aab44108d5e9c310e6bdestradaa case FLP_RESULT_ERROR: 5160682809ad08db284d7110aab44108d5e9c310e6bdestradaa return GeofenceHardware.GEOFENCE_FAILURE; 51717ff2b2b3a28da2f34e82ce1a623865fc249e87cdestradaa case FLP_RESULT_INSUFFICIENT_MEMORY: 51817ff2b2b3a28da2f34e82ce1a623865fc249e87cdestradaa return GeofenceHardware.GEOFENCE_ERROR_INSUFFICIENT_MEMORY; 5190682809ad08db284d7110aab44108d5e9c310e6bdestradaa case FLP_RESULT_TOO_MANY_GEOFENCES: 5200682809ad08db284d7110aab44108d5e9c310e6bdestradaa return GeofenceHardware.GEOFENCE_ERROR_TOO_MANY_GEOFENCES; 5210682809ad08db284d7110aab44108d5e9c310e6bdestradaa case FLP_RESULT_ID_EXISTS: 5220682809ad08db284d7110aab44108d5e9c310e6bdestradaa return GeofenceHardware.GEOFENCE_ERROR_ID_EXISTS; 5230682809ad08db284d7110aab44108d5e9c310e6bdestradaa case FLP_RESULT_ID_UNKNOWN: 5240682809ad08db284d7110aab44108d5e9c310e6bdestradaa return GeofenceHardware.GEOFENCE_ERROR_ID_UNKNOWN; 5250682809ad08db284d7110aab44108d5e9c310e6bdestradaa case FLP_RESULT_INVALID_GEOFENCE_TRANSITION: 5260682809ad08db284d7110aab44108d5e9c310e6bdestradaa return GeofenceHardware.GEOFENCE_ERROR_INVALID_TRANSITION; 5270682809ad08db284d7110aab44108d5e9c310e6bdestradaa default: 5280682809ad08db284d7110aab44108d5e9c310e6bdestradaa Log.e(TAG, String.format("Invalid FlpHal result code: %d", flpHalResult)); 5290682809ad08db284d7110aab44108d5e9c310e6bdestradaa return GeofenceHardware.GEOFENCE_FAILURE; 5300682809ad08db284d7110aab44108d5e9c310e6bdestradaa } 5310682809ad08db284d7110aab44108d5e9c310e6bdestradaa } 5320682809ad08db284d7110aab44108d5e9c310e6bdestradaa 5330682809ad08db284d7110aab44108d5e9c310e6bdestradaa private Location updateLocationInformation(Location location) { 5340682809ad08db284d7110aab44108d5e9c310e6bdestradaa location.setProvider(LocationManager.FUSED_PROVIDER); 5350682809ad08db284d7110aab44108d5e9c310e6bdestradaa // set the elapsed time-stamp just as GPS provider does 5360682809ad08db284d7110aab44108d5e9c310e6bdestradaa location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); 5370682809ad08db284d7110aab44108d5e9c310e6bdestradaa return location; 5380682809ad08db284d7110aab44108d5e9c310e6bdestradaa } 5390682809ad08db284d7110aab44108d5e9c310e6bdestradaa} 540