package com.segment.analytics;
import static android.os.Process.THREAD_PRIORITY_BACKGROUND;
import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.wearable.MessageApi;
import com.google.android.gms.wearable.Node;
import com.google.android.gms.wearable.NodeApi;
import com.google.android.gms.wearable.Wearable;
import com.segment.analytics.internal.Utils;
import java.util.Collection;
import java.util.HashSet;
class WearDispatcher {
private static final String DISPATCHER_THREAD_NAME = Utils.THREAD_PREFIX + "Wear-Dispatcher";
final Handler handler;
final HandlerThread dispatcherThread;
final GoogleApiClient googleApiClient;
final Cartographer cartographer;
WearDispatcher(Context context) {
googleApiClient = new GoogleApiClient.Builder(context).addApi(Wearable.API).build();
cartographer = Cartographer.INSTANCE;
dispatcherThread = new HandlerThread(DISPATCHER_THREAD_NAME, THREAD_PRIORITY_BACKGROUND);
dispatcherThread.start();
handler = new DispatcherHandler(dispatcherThread.getLooper(), this);
}
void dispatchPayload(WearPayload payload) {
handler.sendMessage(handler.obtainMessage(DispatcherHandler.REQUEST_DISPATCH, payload));
}
void performDispatch(WearPayload payload) {
googleApiClient.blockingConnect();
for (String node : getNodes(googleApiClient)) {
MessageApi.SendMessageResult result =
Wearable.MessageApi.sendMessage(
googleApiClient,
node,
WearAnalytics.ANALYTICS_PATH,
cartographer.toJson(payload).getBytes())
.await();
if (!result.getStatus().isSuccess()) {
// todo: log error
}
}
}
private Collection<String> getNodes(GoogleApiClient googleApiClient) {
HashSet<String> results = new HashSet<>();
NodeApi.GetConnectedNodesResult nodes =
Wearable.NodeApi.getConnectedNodes(googleApiClient).await();
for (Node node : nodes.getNodes()) {
results.add(node.getId());
}
return results;
}
private static class DispatcherHandler extends Handler {
static final int REQUEST_DISPATCH = 0;
private final WearDispatcher wearDispatcher;
public DispatcherHandler(Looper looper, WearDispatcher wearDispatcher) {
super(looper);
this.wearDispatcher = wearDispatcher;
}
@Override
public void handleMessage(final Message msg) {
switch (msg.what) {
case REQUEST_DISPATCH:
WearPayload payload = (WearPayload) msg.obj;
wearDispatcher.performDispatch(payload);
break;
default:
Analytics.HANDLER.post(
new Runnable() {
@Override
public void run() {
throw new AssertionError("Unhandled dispatcher message." + msg.what);
}
});
}
}
}
}