18ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh/* 28ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh * Copyright (C) 2013 The Android Open Source Project 38ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh * 48ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh * Licensed under the Apache License, Version 2.0 (the "License"); 58ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh * you may not use this file except in compliance with the License. 68ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh * You may obtain a copy of the License at 78ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh * 88ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh * http://www.apache.org/licenses/LICENSE-2.0 98ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh * 108ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh * Unless required by applicable law or agreed to in writing, software 118ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh * distributed under the License is distributed on an "AS IS" BASIS, 128ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh * See the License for the specific language governing permissions and 148ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh * limitations under the License. 158ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh */ 168ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 178ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshpackage android.hardware.location; 188ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 198ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshimport android.Manifest; 208ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshimport android.app.Service; 218ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshimport android.content.Context; 228ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshimport android.content.Intent; 230682809ad08db284d7110aab44108d5e9c310e6bdestradaaimport android.location.IFusedGeofenceHardware; 248ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshimport android.location.IGpsGeofenceHardware; 258ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshimport android.os.Binder; 268ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshimport android.os.IBinder; 278ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 288ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh/** 298ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh * Service that handles hardware geofencing. 308ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh * 318ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh * @hide 328ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh */ 338ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganeshpublic class GeofenceHardwareService extends Service { 348ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh private GeofenceHardwareImpl mGeofenceHardwareImpl; 358ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh private Context mContext; 368ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 378ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh @Override 388ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh public void onCreate() { 398ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh mContext = this; 408ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh mGeofenceHardwareImpl = GeofenceHardwareImpl.getInstance(mContext); 418ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 428ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 438ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh @Override 448ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh public IBinder onBind(Intent intent) { 458ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return mBinder; 468ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 478ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 488ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh @Override 498ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh public boolean onUnbind(Intent intent) { 508ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return false; 518ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 528ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 538ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh @Override 548ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh public void onDestroy() { 558ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh mGeofenceHardwareImpl = null; 568ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 578ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 588ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 598ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh private void checkPermission(int pid, int uid, int monitoringType) { 608ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh if (mGeofenceHardwareImpl.getAllowedResolutionLevel(pid, uid) < 618ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh mGeofenceHardwareImpl.getMonitoringResolutionLevel(monitoringType)) { 628ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh throw new SecurityException("Insufficient permissions to access hardware geofence for" 638ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh + " type: " + monitoringType); 648ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 658ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 668ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 678ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh private IBinder mBinder = new IGeofenceHardware.Stub() { 688ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh public void setGpsGeofenceHardware(IGpsGeofenceHardware service) { 698ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh mGeofenceHardwareImpl.setGpsHardwareGeofence(service); 708ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 718ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 720682809ad08db284d7110aab44108d5e9c310e6bdestradaa public void setFusedGeofenceHardware(IFusedGeofenceHardware service) { 730682809ad08db284d7110aab44108d5e9c310e6bdestradaa mGeofenceHardwareImpl.setFusedGeofenceHardware(service); 740682809ad08db284d7110aab44108d5e9c310e6bdestradaa } 750682809ad08db284d7110aab44108d5e9c310e6bdestradaa 76da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh public int[] getMonitoringTypes() { 778ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE, 788ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "Location Hardware permission not granted to access hardware geofence"); 798ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 80da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh return mGeofenceHardwareImpl.getMonitoringTypes(); 818ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 828ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 83da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh public int getStatusOfMonitoringType(int monitoringType) { 84da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE, 85da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh "Location Hardware permission not granted to access hardware geofence"); 86da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh 87da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh return mGeofenceHardwareImpl.getStatusOfMonitoringType(monitoringType); 88da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh } 89f9a274c9b8578dda6afeda422bff18b1577028b9destradaa public boolean addCircularFence( 90f9a274c9b8578dda6afeda422bff18b1577028b9destradaa int monitoringType, 91f9a274c9b8578dda6afeda422bff18b1577028b9destradaa GeofenceHardwareRequestParcelable request, 92f9a274c9b8578dda6afeda422bff18b1577028b9destradaa IGeofenceHardwareCallback callback) { 938ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE, 948ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "Location Hardware permission not granted to access hardware geofence"); 958ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkPermission(Binder.getCallingPid(), Binder.getCallingUid(), monitoringType); 96f9a274c9b8578dda6afeda422bff18b1577028b9destradaa return mGeofenceHardwareImpl.addCircularFence(monitoringType, request, callback); 978ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 988ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 998ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh public boolean removeGeofence(int id, int monitoringType) { 1008ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE, 1018ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "Location Hardware permission not granted to access hardware geofence"); 1028ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 1038ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkPermission(Binder.getCallingPid(), Binder.getCallingUid(), monitoringType); 1048ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return mGeofenceHardwareImpl.removeGeofence(id, monitoringType); 1058ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 1068ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 1078ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh public boolean pauseGeofence(int id, int monitoringType) { 1088ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE, 1098ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "Location Hardware permission not granted to access hardware geofence"); 1108ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 1118ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkPermission(Binder.getCallingPid(), Binder.getCallingUid(), monitoringType); 1128ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return mGeofenceHardwareImpl.pauseGeofence(id, monitoringType); 1138ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 1148ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 115da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh public boolean resumeGeofence(int id, int monitoringType, int monitorTransitions) { 1168ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE, 1178ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "Location Hardware permission not granted to access hardware geofence"); 1188ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 1198ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkPermission(Binder.getCallingPid(), Binder.getCallingUid(), monitoringType); 120da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh return mGeofenceHardwareImpl.resumeGeofence(id, monitoringType, monitorTransitions); 1218ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 1228ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 1238ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh public boolean registerForMonitorStateChangeCallback(int monitoringType, 124da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh IGeofenceHardwareMonitorCallback callback) { 1258ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE, 1268ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "Location Hardware permission not granted to access hardware geofence"); 1278ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 1288ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkPermission(Binder.getCallingPid(), Binder.getCallingUid(), monitoringType); 1298ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return mGeofenceHardwareImpl.registerForMonitorStateChangeCallback(monitoringType, 1308ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh callback); 1318ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 1328ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 1338ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh public boolean unregisterForMonitorStateChangeCallback(int monitoringType, 134da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh IGeofenceHardwareMonitorCallback callback) { 1358ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE, 1368ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh "Location Hardware permission not granted to access hardware geofence"); 1378ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh 1388ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh checkPermission(Binder.getCallingPid(), Binder.getCallingUid(), monitoringType); 1398ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh return mGeofenceHardwareImpl.unregisterForMonitorStateChangeCallback(monitoringType, 1408ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh callback); 1418ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh } 1428ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh }; 1438ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh} 144