package com.eleks.tesla; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.Toast; import com.eleks.tesla.api.Config; import com.eleks.tesla.api.TeslaApi; import com.eleks.tesla.teslalib.ApiPathConstants; import com.eleks.tesla.utils.PreferencesManager; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.wearable.Node; import com.google.android.gms.wearable.NodeApi; import com.google.android.gms.wearable.Wearable; import org.json.JSONObject; import java.util.List; import java.util.concurrent.TimeUnit; public class MainActivity extends ActionBarActivity implements View.OnClickListener { private final String TAG = "MainActivity"; private GoogleApiClient mGoogleApiClient; private String mNodeId; private static final long CONNECTION_TIME_OUT_MS = 1000; private View signInForm; private View signOutForm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initGoogleApiClient(); setContentView(R.layout.activity_main); findViewById(R.id.send_bad_weather_notification).setOnClickListener(this); findViewById(R.id.send_unexpected_charge_stop_notification).setOnClickListener(this); findViewById(R.id.send_car_unlocked_notification).setOnClickListener(this); signInForm = findViewById(R.id.loginForm); signOutForm = findViewById(R.id.signOutForm); if (PreferencesManager.isLoggedIn(this)) { signInForm.setVisibility(View.GONE); signOutForm.setVisibility(View.VISIBLE); } final EditText userName = (EditText) findViewById(R.id.username); final EditText userPass = (EditText) findViewById(R.id.password); findViewById(R.id.signOut).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { PreferencesManager.clear(MainActivity.this); signInForm.setVisibility(View.VISIBLE); signOutForm.setVisibility(View.GONE); } }); findViewById(R.id.signIn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { AsyncTask t = new AsyncTask<Object, Object, Object>() { @Override protected Object doInBackground(Object... voids) { try { TeslaApi api = TeslaApi.getInstance(); Log.d(Config.TAG, "Performing login operation..."); JSONObject loginResult = api.login(userName.getText().toString(), userPass.getText().toString()); String accessToken = loginResult.getString("access_token"); Log.d(Config.TAG, "Access Token: " + accessToken); PreferencesManager.putAccessToken(MainActivity.this, accessToken); } catch (Exception e) { return e; } return new Object(); } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); if (o instanceof Exception) { Toast.makeText(MainActivity.this, ((Exception) o).getMessage(), Toast.LENGTH_SHORT).show(); } else { signInForm.setVisibility(View.GONE); signOutForm.setVisibility(View.VISIBLE); } } }; t.execute(); } }); } @Override public void onClick(View v) { String command = null; switch (v.getId()) { case R.id.send_bad_weather_notification: command = ApiPathConstants.MOBILE_SHOW_NOTIFICATION_BAD_WEATHER; break; case R.id.send_unexpected_charge_stop_notification: command = ApiPathConstants.MOBILE_SHOW_NOTIFICATION_UNEXPECTED_STOP_CHARGING; break; case R.id.send_car_unlocked_notification: command = ApiPathConstants.MOBILE_SHOW_NOTIFICATION_CAR_UNLOCKED; break; } sendMassage(command); } private void sendMassage(final String command) { new Thread(new Runnable() { @Override public void run() { connectApiClient(); Wearable.MessageApi.sendMessage(mGoogleApiClient, mNodeId, command, null).await(); mGoogleApiClient.disconnect(); } }).start(); } private void initGoogleApiClient() { mGoogleApiClient = getGoogleApiClient(this); retrieveWearableDeviceNode(); } private GoogleApiClient getGoogleApiClient(Context context) { return new GoogleApiClient.Builder(context) .addApi(Wearable.API) .build(); } private void retrieveWearableDeviceNode() { new Thread(new Runnable() { @Override public void run() { if (mGoogleApiClient != null && !(mGoogleApiClient.isConnected() || mGoogleApiClient.isConnecting())) mGoogleApiClient.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS); NodeApi.GetConnectedNodesResult result = Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await(); List<Node> nodes = result.getNodes(); if (nodes.size() > 0) mNodeId = nodes.get(0).getId(); Log.v(TAG, "Node ID of watch: " + mNodeId); mGoogleApiClient.disconnect(); } }).start(); } private void connectApiClient() { if (isClientDisconnected()) { mGoogleApiClient.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS); } } private boolean isClientDisconnected() { return mGoogleApiClient != null && !(mGoogleApiClient.isConnected() || mGoogleApiClient.isConnecting()); } }