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