package com.tutsplus.awarenessapi;
import android.Manifest;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.google.android.gms.awareness.Awareness;
import com.google.android.gms.awareness.fence.AwarenessFence;
import com.google.android.gms.awareness.fence.DetectedActivityFence;
import com.google.android.gms.awareness.fence.FenceState;
import com.google.android.gms.awareness.fence.FenceUpdateRequest;
import com.google.android.gms.awareness.fence.LocationFence;
import com.google.android.gms.awareness.snapshot.BeaconStateResult;
import com.google.android.gms.awareness.snapshot.DetectedActivityResult;
import com.google.android.gms.awareness.snapshot.HeadphoneStateResult;
import com.google.android.gms.awareness.snapshot.LocationResult;
import com.google.android.gms.awareness.snapshot.PlacesResult;
import com.google.android.gms.awareness.snapshot.WeatherResult;
import com.google.android.gms.awareness.state.BeaconState;
import com.google.android.gms.awareness.state.HeadphoneState;
import com.google.android.gms.awareness.state.Weather;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.location.ActivityRecognitionResult;
import com.google.android.gms.location.DetectedActivity;
import com.google.android.gms.location.places.Place;
import com.google.android.gms.location.places.PlaceLikelihood;
import java.util.Arrays;
import java.util.List;
public class MainActivity extends AppCompatActivity implements
GoogleApiClient.OnConnectionFailedListener,
AdapterView.OnItemClickListener{
private static final List BEACON_TYPE_FILTERS = Arrays.asList(
BeaconState.TypeFilter.with(
"tutsplusawarenessnamespace", //Replace this with your own app's Google project name
"nearby") );
private final static String ACTION_FENCE = "action_fence";
private final static int REQUEST_PERMISSION_RESULT_CODE = 42;
private final static String KEY_SITTING_AT_HOME = "sitting_at_home";
private ListView mListView;
private String[] mItems;
private GoogleApiClient mGoogleApiClient;
private FenceBroadcastReceiver mFenceBroadcastReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
checkLocationPermission();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Awareness.API)
.enableAutoManage(this, this)
.build();
mGoogleApiClient.connect();
}
private void initViews() {
mListView = (ListView) findViewById( R.id.list );
mItems = getResources().getStringArray(R.array.items);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mItems );
mListView.setAdapter(adapter);
mListView.setOnItemClickListener(this);
}
private void detectBeacons() {
if( !checkLocationPermission() ) {
return;
}
Awareness.SnapshotApi.getBeaconState(mGoogleApiClient, BEACON_TYPE_FILTERS)
.setResultCallback(new ResultCallback<BeaconStateResult>() {
@Override
public void onResult(@NonNull BeaconStateResult beaconStateResult) {
if (!beaconStateResult.getStatus().isSuccess()) {
Log.e("Test", "Could not get beacon state.");
return;
}
BeaconState beaconState = beaconStateResult.getBeaconState();
if( beaconState == null ) {
Log.e("Tuts+", "beacon state is null");
} else {
for(BeaconState.BeaconInfo info : beaconState.getBeaconInfo()) {
Log.e("Tuts+", new String(info.getContent()));
}
}
}
});
}
private void detectHeadphones() {
Awareness.SnapshotApi.getHeadphoneState(mGoogleApiClient)
.setResultCallback(new ResultCallback<HeadphoneStateResult>() {
@Override
public void onResult(@NonNull HeadphoneStateResult headphoneStateResult) {
HeadphoneState headphoneState = headphoneStateResult.getHeadphoneState();
if (headphoneState.getState() == HeadphoneState.PLUGGED_IN) {
Log.e("Tuts+", "Headphones are plugged in.");
} else {
Log.e("Tuts+", "Headphones are NOT plugged in.");
}
}
});
}
private void detectActivity() {
Awareness.SnapshotApi.getDetectedActivity(mGoogleApiClient)
.setResultCallback(new ResultCallback<DetectedActivityResult>() {
@Override
public void onResult(@NonNull DetectedActivityResult detectedActivityResult) {
ActivityRecognitionResult result = detectedActivityResult.getActivityRecognitionResult();
Log.e("Tuts+", "time: " + result.getTime());
Log.e("Tuts+", "elapsed time: " + result.getElapsedRealtimeMillis());
Log.e("Tuts+", "Most likely activity: " + result.getMostProbableActivity().toString());
for( DetectedActivity activity : result.getProbableActivities() ) {
Log.e("Tuts+", "Activity: " + activity.getType() + " Liklihood: " + activity.getConfidence() );
}
}
});
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {}
private void detectLocation() {
if( !checkLocationPermission() ) {
return;
}
Awareness.SnapshotApi.getLocation(mGoogleApiClient)
.setResultCallback(new ResultCallback<LocationResult>() {
@Override
public void onResult(@NonNull LocationResult locationResult) {
Location location = locationResult.getLocation();
Log.e("Tuts+", "Latitude: " + location.getLatitude() + ", Longitude: " + location.getLongitude());
Log.e("Tuts+", "Provider: " + location.getProvider() + " time: " + location.getTime());
if( location.hasAccuracy() ) {
Log.e("Tuts+", "Accuracy: " + location.getAccuracy());
}
if( location.hasAltitude() ) {
Log.e("Tuts+", "Altitude: " + location.getAltitude());
}
if( location.hasBearing() ) {
Log.e("Tuts+", "Bearing: " + location.getBearing());
}
if( location.hasSpeed() ) {
Log.e("Tuts+", "Speed: " + location.getSpeed());
}
}
});
}
private void detectNearbyPlaces() {
if( !checkLocationPermission() ) {
return;
}
Awareness.SnapshotApi.getPlaces(mGoogleApiClient)
.setResultCallback(new ResultCallback<PlacesResult>() {
@Override
public void onResult(@NonNull PlacesResult placesResult) {
Place place;
for( PlaceLikelihood placeLikelihood : placesResult.getPlaceLikelihoods() ) {
place = placeLikelihood.getPlace();
Log.e("Tuts+", place.getName().toString() + "\n" + place.getAddress().toString() );
Log.e("Tuts+", "Rating: " + place.getRating() );
Log.e("Tuts+", "Likelihood that the user is here: " + placeLikelihood.getLikelihood() * 100 + "%");
}
}
});
}
private void detectWeather() {
if( !checkLocationPermission() ) {
return;
}
Awareness.SnapshotApi.getWeather(mGoogleApiClient)
.setResultCallback(new ResultCallback<WeatherResult>() {
@Override
public void onResult(@NonNull WeatherResult weatherResult) {
Weather weather = weatherResult.getWeather();
Log.e("Tuts+", "Temp: " + weather.getTemperature(Weather.FAHRENHEIT));
Log.e("Tuts+", "Feels like: " + weather.getFeelsLikeTemperature(Weather.FAHRENHEIT));
Log.e("Tuts+", "Dew point: " + weather.getDewPoint(Weather.FAHRENHEIT));
Log.e("Tuts+", "Humidity: " + weather.getHumidity() );
if( weather.getConditions()[0] == Weather.CONDITION_CLOUDY ) {
Log.e("Tuts+", "Looks like there's some clouds out there");
}
}
});
}
private void createFence() {
checkLocationPermission();
AwarenessFence activityFence = DetectedActivityFence.during(DetectedActivityFence.STILL);
AwarenessFence homeFence = LocationFence.in(39.92, -105.7, 100000, 1000 );
AwarenessFence sittingAtHomeFence = AwarenessFence.and(homeFence, activityFence);
Intent intent = new Intent(ACTION_FENCE);
PendingIntent fencePendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
mFenceBroadcastReceiver = new FenceBroadcastReceiver();
registerReceiver(mFenceBroadcastReceiver, new IntentFilter(ACTION_FENCE));
FenceUpdateRequest.Builder builder = new FenceUpdateRequest.Builder();
builder.addFence(KEY_SITTING_AT_HOME, sittingAtHomeFence, fencePendingIntent);
Awareness.FenceApi.updateFences( mGoogleApiClient, builder.build() );
}
private boolean checkLocationPermission() {
if( !hasLocationPermission() ) {
Log.e("Tuts+", "Does not have location permission granted");
requestLocationPermission();
return false;
}
return true;
}
private void requestLocationPermission() {
ActivityCompat.requestPermissions(
MainActivity.this,
new String[]{ Manifest.permission.ACCESS_FINE_LOCATION },
REQUEST_PERMISSION_RESULT_CODE );
}
private boolean hasLocationPermission() {
return ContextCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION )
== PackageManager.PERMISSION_GRANTED;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[],
@NonNull int[] grantResults) {
switch (requestCode) {
case REQUEST_PERMISSION_RESULT_CODE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//granted
} else {
Log.e("Tuts+", "Location permission denied.");
}
}
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if( mItems[position].equalsIgnoreCase( getString(R.string.item_snapshot_headphones ) ) ) {
detectHeadphones();
} else if( mItems[position].equalsIgnoreCase( getString(R.string.item_snapshot_location ) ) ) {
detectLocation();
} else if( mItems[position].equalsIgnoreCase( getString(R.string.item_snapshot_places ) ) ) {
detectNearbyPlaces();
} else if( mItems[position].equalsIgnoreCase( getString(R.string.item_snapshot_weather ) ) ) {
detectWeather();
} else if( mItems[position].equalsIgnoreCase( getString(R.string.item_fence ) ) ) {
createFence();
} else if( mItems[position].equalsIgnoreCase( getString(R.string.item_snapshot_activity))) {
detectActivity();
} else if( mItems[position].equalsIgnoreCase( getString(R.string.item_snapshot_beacons))) {
detectBeacons();
//This method will break if you don't have a beacon registered under your google api console
}
}
@Override
protected void onPause() {
Awareness.FenceApi.updateFences(
mGoogleApiClient,
new FenceUpdateRequest.Builder()
.removeFence(KEY_SITTING_AT_HOME)
.build());
if (mFenceBroadcastReceiver != null) {
unregisterReceiver(mFenceBroadcastReceiver);
}
super.onPause();
}
public class FenceBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(TextUtils.equals(ACTION_FENCE, intent.getAction())) {
FenceState fenceState = FenceState.extract(intent);
if( TextUtils.equals(KEY_SITTING_AT_HOME, fenceState.getFenceKey() ) ) {
if( fenceState.getCurrentState() == FenceState.TRUE ) {
Log.e("Tuts+", "You've been sitting at home for too long");
}
}
}
}
}
}