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        }
89da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh        public boolean addCircularFence(int id, int monitoringType, double lat, double longitude,
90da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh                double radius, int lastTransition, int monitorTransitions, int
91da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh                notificationResponsiveness, int unknownTimer, IGeofenceHardwareCallback callback) {
928ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh            mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE,
938ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh                    "Location Hardware permission not granted to access hardware geofence");
948ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh            checkPermission(Binder.getCallingPid(), Binder.getCallingUid(), monitoringType);
95da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh            return mGeofenceHardwareImpl.addCircularFence(id, monitoringType, lat, longitude,
96da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh                    radius, lastTransition, monitorTransitions, notificationResponsiveness,
97da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh                    unknownTimer, callback);
988ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh        }
998ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh
1008ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh        public boolean removeGeofence(int id, int monitoringType) {
1018ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh            mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE,
1028ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh                    "Location Hardware permission not granted to access hardware geofence");
1038ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh
1048ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh            checkPermission(Binder.getCallingPid(), Binder.getCallingUid(), monitoringType);
1058ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh            return mGeofenceHardwareImpl.removeGeofence(id, monitoringType);
1068ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh        }
1078ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh
1088ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh        public boolean pauseGeofence(int id, int monitoringType) {
1098ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh            mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE,
1108ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh                    "Location Hardware permission not granted to access hardware geofence");
1118ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh
1128ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh            checkPermission(Binder.getCallingPid(), Binder.getCallingUid(), monitoringType);
1138ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh            return mGeofenceHardwareImpl.pauseGeofence(id, monitoringType);
1148ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh        }
1158ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh
116da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh        public boolean resumeGeofence(int id, int monitoringType, int monitorTransitions) {
1178ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh            mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE,
1188ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh                    "Location Hardware permission not granted to access hardware geofence");
1198ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh
1208ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh            checkPermission(Binder.getCallingPid(), Binder.getCallingUid(), monitoringType);
121da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh            return mGeofenceHardwareImpl.resumeGeofence(id, monitoringType, monitorTransitions);
1228ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh        }
1238ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh
1248ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh        public boolean registerForMonitorStateChangeCallback(int monitoringType,
125da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh                IGeofenceHardwareMonitorCallback callback) {
1268ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh            mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE,
1278ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh                    "Location Hardware permission not granted to access hardware geofence");
1288ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh
1298ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh            checkPermission(Binder.getCallingPid(), Binder.getCallingUid(), monitoringType);
1308ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh            return mGeofenceHardwareImpl.registerForMonitorStateChangeCallback(monitoringType,
1318ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh                    callback);
1328ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh        }
1338ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh
1348ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh        public boolean unregisterForMonitorStateChangeCallback(int monitoringType,
135da6508954a492f3dd4397e70e4fa08ee54bd2741Jaikumar Ganesh                IGeofenceHardwareMonitorCallback callback) {
1368ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh            mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE,
1378ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh                    "Location Hardware permission not granted to access hardware geofence");
1388ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh
1398ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh            checkPermission(Binder.getCallingPid(), Binder.getCallingUid(), monitoringType);
1408ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh            return mGeofenceHardwareImpl.unregisterForMonitorStateChangeCallback(monitoringType,
1418ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh                    callback);
1428ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh        }
1438ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh    };
1448ce470dd4ba0608abb6b5eae117cefca927af96bJaikumar Ganesh}
145