/* * Copyright 2015 Thomas Hoffmann * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.j4velin.wifiAutoOff; import android.Manifest; import android.app.PendingIntent; import android.app.Service; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.os.IBinder; import android.support.v4.content.PermissionChecker; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.location.Geofence; import com.google.android.gms.location.GeofencingRequest; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationServices; import java.util.List; public class GeofenceUpdateService extends Service implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private final static int LOCATION_RANGE_METER = 200; private GoogleApiClient mLocationClient; @Override public IBinder onBind(final Intent intent) { return null; } @Override public int onStartCommand(final Intent intent, int flags, int startId) { if (mLocationClient == null) { mLocationClient = new GoogleApiClient.Builder(this).addApi(LocationServices.API) .addConnectionCallbacks(this).addOnConnectionFailedListener(this).build(); mLocationClient.connect(); } return START_NOT_STICKY; } @Override public void onConnected(final Bundle bundle) { if (mLocationClient == null) return; // should not happen? if (BuildConfig.DEBUG) Logger.log("removing all fences"); PendingIntent pi = PendingIntent .getService(this, 0, new Intent(this, GeoFenceService.class), PendingIntent.FLAG_UPDATE_CURRENT); LocationServices.GeofencingApi.removeGeofences(mLocationClient, pi); LocationServices.FusedLocationApi.removeLocationUpdates(mLocationClient, pi); Database database = Database.getInstance(this); List<Location> locations = database.getLocations(); database.close(); SharedPreferences prefs = getSharedPreferences("locationPrefs", MODE_PRIVATE); if (BuildConfig.DEBUG) Logger.log("re-adding all " + locations.size() + " fences"); if (!locations.isEmpty()) { GeofencingRequest.Builder builder = new GeofencingRequest.Builder(); builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER); for (Location l : locations) { try { builder.addGeofence(new Geofence.Builder() .setCircularRegion(l.coords.latitude, l.coords.longitude, LOCATION_RANGE_METER) .setRequestId(l.coords.latitude + "@" + l.coords.longitude) .setExpirationDuration(Geofence.NEVER_EXPIRE) .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER).build()); } catch (Exception e) { if (BuildConfig.DEBUG) Logger.log(e); } } try { if (PermissionChecker .checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PermissionChecker.PERMISSION_GRANTED && PermissionChecker .checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PermissionChecker.PERMISSION_GRANTED) { LocationServices.GeofencingApi .addGeofences(mLocationClient, builder.build(), pi); if (prefs.getBoolean("active", false)) { LocationRequest mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(prefs.getInt("interval", 15) * 60000); mLocationRequest.setFastestInterval(5000); mLocationRequest.setSmallestDisplacement(50f); mLocationRequest .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); LocationServices.FusedLocationApi .requestLocationUpdates(mLocationClient, mLocationRequest, pi); } } else { if (BuildConfig.DEBUG) Logger.log("no location permission"); } } catch (Exception iae) { if (BuildConfig.DEBUG) Logger.log(iae); } } disconnect(); } @Override public void onConnectionSuspended(int i) { disconnect(); } private void disconnect() { if (BuildConfig.DEBUG) Logger.log("GeofenceUpdateService disconnect"); if (mLocationClient != null) mLocationClient.disconnect(); mLocationClient = null; stopSelf(); } @Override public void onConnectionFailed(final ConnectionResult connectionResult) { disconnect(); } }