package com.eleks.tesla.activity; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.eleks.tesla.R; import com.eleks.tesla.api.Config; import com.eleks.tesla.api.TeslaApi; import com.eleks.tesla.api.auth.AuthCredentials; 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.JSONArray; import org.json.JSONObject; import java.util.List; import java.util.concurrent.TimeUnit; import butterknife.ButterKnife; import butterknife.InjectView; public class LoginActivity extends BaseActivity { private GoogleApiClient mGoogleApiClient; private String mNodeId; @InjectView(R.id.signIn) Button signInBtn; @InjectView(R.id.signOut) Button signOutBtn; @InjectView(R.id.username) TextView tvUserName; @InjectView(R.id.password) TextView tvPassword; @InjectView(R.id.signInForm) View signInForm; @InjectView(R.id.progressContainer) View progressContainer; @InjectView(R.id.signOutForm) View signOutForm; private class LoginTask extends AsyncTask<String, Object, Object> { @Override protected Object doInBackground(String... creds) { try { TeslaApi api = TeslaApi.getInstance(); Log.d(Config.TAG, "Performing login operation..."); JSONObject loginResult = api.login(creds[0], creds[1]); String accessToken = loginResult.getString("access_token"); Log.d(Config.TAG, "Access Token: " + accessToken); PreferencesManager.putAccessToken(LoginActivity.this, accessToken); AuthCredentials credentials = new AuthCredentials("tesla@example.com", accessToken); try { JSONObject carsResult = api.getVehicles(credentials); JSONArray vehicles = (JSONArray) carsResult.get("response"); JSONObject firstVehicle = (JSONObject) vehicles.get(0); long carId = firstVehicle.getLong("id"); PreferencesManager.putCarId(LoginActivity.this, carId); } catch (Exception e) { } } catch (Exception e) { return e; } return new Object(); } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); if (o instanceof Exception) { Toast.makeText(LoginActivity.this, ((Exception) o).getMessage(), Toast.LENGTH_SHORT).show(); showLoginForm(); } else { showSignOutForm(); } } } private class TestAsync extends AsyncTask<Object, Object, Object> { @Override protected Object doInBackground(Object... voids) { try { TeslaApi api = TeslaApi.getInstance(); //Log.d(Config.TAG, "Performing login operation..."); String accessToken = PreferencesManager.getAccessToken(LoginActivity.this); AuthCredentials credentials = new AuthCredentials("tesla@example.com", accessToken); try { JSONObject locationResult = api.getDriveState(PreferencesManager.getCarId(LoginActivity.this), credentials); Log.d(Config.TAG, "Performing login operation..."); JSONObject response = locationResult.getJSONObject("response"); // we can save car location double lat = response.getDouble("latitude"); double lon = response.getDouble("longitude"); //Log.d(Config.TAG, "Lat: "); //PreferencesManager.putCarId(LoginActivity.this, carId); } catch (Exception e) { } //long vId = 6560460414667285209L; //api.flashLights(vId, credentials); //login(tvUserName.getText().toString(), tvPassword.getText().toString()); //String accessToken = loginResult.getString("access_token"); //Log.d(Config.TAG, "Access Token: " + accessToken); //PreferencesManager.putAccessToken(LoginActivity.this, accessToken); //sendMassage(ApiPathConstants.MOBILE_SHOW_NOTIFICATION_BAD_WEATHER); } catch (Exception e) { return e; } return new Object(); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initGoogleApiClient(); setContentView(R.layout.activity_login); ButterKnife.inject(this); signInBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final String userNameValue = tvUserName.getText().toString().trim(); final String passwordValue = tvPassword.getText().toString().trim(); if (TextUtils.isEmpty(userNameValue) || TextUtils.isEmpty(passwordValue)) { Toast.makeText(LoginActivity.this, "Empty values are not allowed", Toast.LENGTH_SHORT).show(); return; } PreferencesManager.putUserName(LoginActivity.this, userNameValue); new LoginTask().execute(userNameValue, passwordValue); } }); signOutBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { PreferencesManager.clear(LoginActivity.this); showLoginForm(); //new TestAsync().execute(); } }); showLoginForm(); if (PreferencesManager.isLoggedIn(this)) { showSignOutForm(); } } 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(1000, 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(); } // TODO not used now private void showProgres() { signInForm.setVisibility(View.INVISIBLE); progressContainer.setVisibility(View.VISIBLE); signOutForm.setVisibility(View.INVISIBLE); } private void showLoginForm() { signInForm.setVisibility(View.VISIBLE); progressContainer.setVisibility(View.INVISIBLE); signOutForm.setVisibility(View.INVISIBLE); } private void showSignOutForm() { signInForm.setVisibility(View.INVISIBLE); progressContainer.setVisibility(View.INVISIBLE); signOutForm.setVisibility(View.VISIBLE); } 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 connectApiClient() { if (isClientDisconnected()) { mGoogleApiClient.blockingConnect(1000, TimeUnit.MILLISECONDS); } } private boolean isClientDisconnected() { return mGoogleApiClient != null && !(mGoogleApiClient.isConnected() || mGoogleApiClient.isConnecting()); } }