package com.ptrprograms.geofencing.Activity; import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; import android.location.Location; import android.os.Bundle; import android.widget.CompoundButton; import android.widget.ToggleButton; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesClient; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.location.Geofence; import com.google.android.gms.location.LocationClient; import com.google.android.gms.location.LocationStatusCodes; import com.ptrprograms.geofencing.R; import com.ptrprograms.geofencing.Service.GeofencingService; import java.util.ArrayList; public class MainActivity extends Activity implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, LocationClient.OnAddGeofencesResultListener, LocationClient.OnRemoveGeofencesResultListener { private final static String FENCE_ID = "com.ptrprograms.geofence"; private final int RADIUS = 100; private ToggleButton mToggleButton; private Geofence mGeofence; private LocationClient mLocationClient; private Intent mIntent; private PendingIntent mPendingIntent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); verifyPlayServices(); mLocationClient = new LocationClient( this, this, this ); mIntent = new Intent( this, GeofencingService.class ); mPendingIntent = PendingIntent.getService( this, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT ); mToggleButton = (ToggleButton) findViewById( R.id.geofencing_button ); mToggleButton.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged( CompoundButton compoundButton, boolean b ) { if( b ) { startGeofence(); } else { stopGeofence(); } } }); } private void verifyPlayServices() { switch ( GooglePlayServicesUtil.isGooglePlayServicesAvailable( this ) ) { case ConnectionResult.SUCCESS: { break; } case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: { finish(); } default: { finish(); } } } private void startGeofence() { Location location = mLocationClient.getLastLocation(); Geofence.Builder builder = new Geofence.Builder(); mGeofence = builder.setRequestId( FENCE_ID ) .setCircularRegion( location.getLatitude(), location.getLongitude(), RADIUS ) .setTransitionTypes( Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT ) .setExpirationDuration( Geofence.NEVER_EXPIRE ) .build(); ArrayList<Geofence> geofences = new ArrayList<Geofence>(); geofences.add( mGeofence ); mLocationClient.addGeofences( geofences, mPendingIntent, this ); } private void stopGeofence() { mLocationClient.removeGeofences( mPendingIntent, this ); } @Override protected void onResume() { super.onResume(); if ( !mLocationClient.isConnected() && !mLocationClient.isConnecting() ) { mLocationClient.connect(); } } @Override protected void onPause() { super.onPause(); mLocationClient.disconnect(); } @Override public void onConnected(Bundle bundle) { } @Override public void onDisconnected() { } @Override public void onAddGeofencesResult(int status, String[] geofenceIds ) { if( status == LocationStatusCodes.SUCCESS ) { Intent intent = new Intent( mIntent ); startService( intent ); } } @Override public void onConnectionFailed(ConnectionResult connectionResult) { } @Override public void onRemoveGeofencesByRequestIdsResult(int status, String[] strings) { if( status == LocationStatusCodes.SUCCESS ) { stopService( mIntent ); } } @Override public void onRemoveGeofencesByPendingIntentResult(int status, PendingIntent pendingIntent) { if( status == LocationStatusCodes.SUCCESS ) { stopService( mIntent ); } } }