package com.example.agathe.tsgtest.sport; import android.content.Intent; import android.content.IntentSender; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; import android.widget.Toast; import com.example.agathe.tsgtest.R; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.Scopes; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.common.api.Scope; import com.google.android.gms.common.api.Status; import com.google.android.gms.fitness.Fitness; import com.google.android.gms.fitness.data.DataPoint; import com.google.android.gms.fitness.data.DataSet; import com.google.android.gms.fitness.data.DataSource; import com.google.android.gms.fitness.data.DataType; import com.google.android.gms.fitness.data.Field; import com.google.android.gms.fitness.data.Value; import com.google.android.gms.fitness.request.DataReadRequest; import com.google.android.gms.fitness.request.DataSourcesRequest; import com.google.android.gms.fitness.request.OnDataPointListener; import com.google.android.gms.fitness.request.SensorRequest; import com.google.android.gms.fitness.result.DataReadResult; import com.google.android.gms.fitness.result.DataSourcesResult; import com.olab.smplibrary.SMPLibrary; import java.util.Calendar; import java.util.Date; import java.util.concurrent.TimeUnit; /** * Created by koudm on 19/12/2016. */ public class FitApiActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, OnDataPointListener { private static final String TAG = "GoogleFit"; private static final int REQUEST_OAUTH = 1; private static final String AUTH_PENDING = "auth_state_pending"; private boolean authInProgress = false; private GoogleApiClient mGoogleApiClient; private TextView mstepCountDelta; private TextView steps; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_activity_fit_api); mstepCountDelta = (TextView) findViewById(R.id.stepCountDelta); Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar_first_sport); steps= (TextView) findViewById(R.id.stepscounts); setSupportActionBar(myToolbar); // Get a support ActionBar corresponding to this toolbar ActionBar ab = getSupportActionBar(); // Enable the Up button ab.setDisplayHomeAsUpEnabled(true); if (savedInstanceState != null) { authInProgress = savedInstanceState.getBoolean(AUTH_PENDING); } // Create a Google Fit Client instance with default user account. mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Fitness.SENSORS_API) // Required for SensorsApi calls .addApi(Fitness.HISTORY_API) .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE)) .addConnectionCallbacks(this) .enableAutoManage(this, 0, this) .build(); // getStepCountDelta(); } @Override public void onConnected(Bundle bundle) { DataSourcesRequest dataSourceRequest = new DataSourcesRequest.Builder() .setDataTypes( DataType.TYPE_STEP_COUNT_DELTA ) .setDataSourceTypes( DataSource.TYPE_DERIVED) .build(); ResultCallback<DataSourcesResult> dataSourcesResultCallback = new ResultCallback<DataSourcesResult>() { @Override public void onResult(DataSourcesResult dataSourcesResult) { for( DataSource dataSource : dataSourcesResult.getDataSources() ) { if( DataType.TYPE_STEP_COUNT_DELTA.equals( dataSource.getDataType() ) ) { registerFitnessDataListener(dataSource, DataType.TYPE_STEP_COUNT_DELTA); } } } }; Fitness.SensorsApi.findDataSources(mGoogleApiClient, dataSourceRequest) .setResultCallback(dataSourcesResultCallback); Calendar cal = Calendar.getInstance(); Date now = new Date(); cal.setTime(now); long endTime = cal.getTimeInMillis(); cal.add(Calendar.WEEK_OF_YEAR, -1); long startTime = cal.getTimeInMillis(); DataReadRequest dataReaRequest = new DataReadRequest.Builder() .read(DataType.TYPE_STEP_COUNT_DELTA) .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS) .build(); Fitness.HistoryApi.readData(mGoogleApiClient, dataReaRequest) .setResultCallback(new ResultCallback<DataReadResult>() { @Override public void onResult(@NonNull DataReadResult dataReadResult) { DataSet dataSet = dataReadResult.getDataSet(DataType.TYPE_STEP_COUNT_DELTA); DataPoint dataPoint = dataSet.createDataPoint(); mstepCountDelta.setText(dataPoint.getValue(Field.FIELD_STEPS).toString()); steps.setText(dataPoint.getValue(Field.FIELD_STEPS).asString()); } } ); } private void registerFitnessDataListener(DataSource dataSource, DataType dataType) { SensorRequest request = new SensorRequest.Builder() .setDataSource( dataSource ) .setDataType( dataType ) .setSamplingRate( 3, TimeUnit.MILLISECONDS ) .build(); Fitness.SensorsApi.add( mGoogleApiClient, request, this ) .setResultCallback(new ResultCallback<Status>() { @Override public void onResult(Status status) { if (status.isSuccess()) { Log.i( TAG, "SensorApi successfully added" ); } } }); } @Override public void onDataPoint(DataPoint dataPoint) { for( final Field field : dataPoint.getDataType().getFields() ) { final Value value = dataPoint.getValue( field ); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "Field: " + field.getName() + " Value: " + value, Toast.LENGTH_SHORT).show(); mstepCountDelta.setText("You did" + value.toString() + "steps !"); } }); } } @Override public void onConnectionSuspended(int cause) { // The connection has been interrupted. Wait until onConnected() is called. } @Override public void onConnectionFailed(ConnectionResult connectionResult) { if( !authInProgress ) { try { authInProgress = true; connectionResult.startResolutionForResult( FitApiActivity.this, REQUEST_OAUTH ); } catch(IntentSender.SendIntentException e ) { } } else { Log.e(TAG, "authInProgress"); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if( requestCode == REQUEST_OAUTH ) { authInProgress = false; if( resultCode == RESULT_OK ) { if( !mGoogleApiClient.isConnecting() && !mGoogleApiClient.isConnected() ) { mGoogleApiClient.connect(); } } else if( resultCode == RESULT_CANCELED ) { Log.e( TAG, "RESULT_CANCELED" ); } } else { Log.e(TAG, "requestCode NOT request_oauth"); } } @Override public void onStart() { super.onStart(); mGoogleApiClient.connect(); } @Override public void onStop() { super.onStop(); Fitness.SensorsApi.remove( mGoogleApiClient, this ) .setResultCallback(new ResultCallback<Status>() { @Override public void onResult(Status status) { if (status.isSuccess()) { mGoogleApiClient.disconnect(); } } }); // mGoogleApiClient.disconnect(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(AUTH_PENDING, authInProgress); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_disconnect: SMPLibrary.Logout(); return true; case R.id.action_about: android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(this); builder.setMessage(R.string.dialog_message).setTitle(R.string.app_name); builder.setPositiveButton(R.string.dialog_ok, null); builder.setIcon(R.mipmap.ic_launcher); android.support.v7.app.AlertDialog dialog = builder.create(); dialog.show(); return true; case R.id.action_main_settings: return true; default: // If we got here, the user's action was not recognized. // Invoke the superclass to handle it. return super.onOptionsItemSelected(item); } } }