package com.eleks.tesla.service;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import com.eleks.tesla.teslalib.utils.SerializationUtil;
import com.eleks.tesla.events.ToHandHoldRequestEvent;
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 java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeUnit;
import de.greenrobot.event.EventBus;
/**
* Created by Ihor.Demedyuk on 04.03.2015.
*/
public class CommunicationService extends Service {
public static final String LOG_TAG = CommunicationService.class.getSimpleName();
private GoogleApiClient mGoogleApiClient;
private String mNodeId;
private static final long CONNECTION_TIME_OUT_MS = 1000;
@Override
public void onCreate() {
super.onCreate();
initGoogleApiClient();
}
@Override
public IBinder onBind(Intent intent) {
EventBus.getDefault().register(this);
return null;
}
@Override
public boolean onUnbind(Intent intent) {
EventBus.getDefault().unregister(this);
return super.onUnbind(intent);
}
private void initGoogleApiClient() {
mGoogleApiClient = getGoogleApiClient(this);
retrieveHandHoldDeviceNode();
}
private GoogleApiClient getGoogleApiClient(Context context) {
return new GoogleApiClient.Builder(context)
.addApi(Wearable.API)
.build();
}
private void retrieveHandHoldDeviceNode() {
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(LOG_TAG, "Node ID of phone: " + mNodeId);
mGoogleApiClient.disconnect();
}
}).start();
}
public void onEventAsync(ToHandHoldRequestEvent event) {
byte[] serializableCommand = null;
if (event.getCommand() != null) {
try {
serializableCommand = SerializationUtil.serialize(event.getCommand());
} catch (IOException e) {
e.printStackTrace();
}
}
connectApiClient();
Wearable.MessageApi.sendMessage(mGoogleApiClient, mNodeId, event.getPath(), serializableCommand).await();
mGoogleApiClient.disconnect();
}
private void connectApiClient() {
if (isClientDisconnected()) {
mGoogleApiClient.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS);
}
}
private boolean isClientDisconnected() {
return mGoogleApiClient != null && !(mGoogleApiClient.isConnected() || mGoogleApiClient.isConnecting());
}
}