aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Android_Studio/Tango.Integration/src
diff options
context:
space:
mode:
authorRoy <roy.mail.net@gmail.com>2017-12-24 02:26:55 +0200
committerRoy <roy.mail.net@gmail.com>2017-12-24 02:26:55 +0200
commitceac40d058a8554638aa3fa39d4697f3fbfe62f8 (patch)
treef865540d3c3c56ccbcc9ef0d57999e8c9456f8f3 /Software/Android_Studio/Tango.Integration/src
parent6091da506db1083f6ca707c24e509ca3470f6a73 (diff)
downloadTango-ceac40d058a8554638aa3fa39d4697f3fbfe62f8.tar.gz
Tango-ceac40d058a8554638aa3fa39d4697f3fbfe62f8.zip
Implemented android external bridge service.
Implemented external bridge authentication. Implemented machine connection view in machine studio. Modified Transport layer on android to Tango result.
Diffstat (limited to 'Software/Android_Studio/Tango.Integration/src')
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/IMachineOperator.java9
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java9
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/IMachineIdentityProvider.java (renamed from Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/IMachineIdentityProvider.java)0
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/MachineIdentityProvider.java (renamed from Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/MachineIdentityProvider.java)0
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java137
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/IExternalBridgeService.java53
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ISynchronizationService.java19
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/SynchronizationService.java90
8 files changed, 317 insertions, 0 deletions
diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/IMachineOperator.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/IMachineOperator.java
new file mode 100644
index 000000000..7d69ce8ad
--- /dev/null
+++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/IMachineOperator.java
@@ -0,0 +1,9 @@
+package com.twine.tango.integration.operators;
+
+/**
+ * Created by Roy on 12/23/2017.
+ */
+
+public interface IMachineOperator
+{
+}
diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java
new file mode 100644
index 000000000..0eb73cab3
--- /dev/null
+++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java
@@ -0,0 +1,9 @@
+package com.twine.tango.integration.operators;
+
+/**
+ * Created by Roy on 12/23/2017.
+ */
+
+public class MachineOperator
+{
+}
diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/IMachineIdentityProvider.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/IMachineIdentityProvider.java
index 3e35be9d0..3e35be9d0 100644
--- a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/IMachineIdentityProvider.java
+++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/IMachineIdentityProvider.java
diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/MachineIdentityProvider.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/MachineIdentityProvider.java
index 29cb0c30c..29cb0c30c 100644
--- a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/MachineIdentityProvider.java
+++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/MachineIdentityProvider.java
diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java
new file mode 100644
index 000000000..f1702ee9e
--- /dev/null
+++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java
@@ -0,0 +1,137 @@
+package com.twine.tango.integration.services;
+
+import android.os.SystemClock;
+
+import com.elvishew.xlog.XLog;
+import com.twine.tango.core.IEventHandler;
+import com.twine.tango.pmr.MessageFactory;
+import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer;
+import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType;
+import com.twine.tango.transport.adapters.TcpTransportAdapter;
+import com.twine.tango.transport.transporters.ProtoTransporter;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.ArrayList;
+import java.util.List;
+
+import static br.com.zbra.androidlinq.Linq.stream;
+
+/**
+ * Created by Roy on 12/22/2017.
+ */
+
+public class TangoBridgeService extends ProtoTransporter implements ITangoBridgeService
+{
+ private ServerSocket listener;
+ private boolean isStarted;
+ private List<HandlerAndType> handlers;
+
+ public TangoBridgeService()
+ {
+ handlers = new ArrayList<>();
+ }
+
+ @Override
+ public boolean isStarted()
+ {
+ return isStarted;
+ }
+
+ @Override
+ public void start() throws IOException
+ {
+ listener = new ServerSocket(1984);
+ Thread listenerThread = new Thread(this::listenerThreadMethod);
+ listenerThread.start();
+ }
+
+ @Override
+ public void stop()
+ {
+ isStarted = false;
+ try
+ {
+ listener.close();
+ } catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public <T> void registerMessageHandler(IEventHandler<MessageReceivedArgs<T>> handler, MessageType messageType)
+ {
+ handlers.add(new HandlerAndType(handler, messageType));
+ }
+
+ @Override
+ public <T> void unRegisterMessageHandler(IEventHandler<MessageReceivedArgs<T>> handler)
+ {
+ HandlerAndType h = stream(handlers).singleOrNull(x -> x.handler == handler);
+ if (h != null)
+ {
+ handlers.remove(h);
+ }
+ }
+
+ private void listenerThreadMethod()
+ {
+ while (isStarted)
+ {
+ try
+ {
+ Socket newSocket = listener.accept();
+
+ if (newSocket != null)
+ {
+ getAdapters().clear();
+ getAdapters().add(new TcpTransportAdapter(newSocket));
+ connect();
+ }
+
+ } catch (IOException e)
+ {
+
+ }
+
+ SystemClock.sleep(100);
+ }
+ }
+
+ @Override
+ protected void onRequestReceived(MessageContainer request)
+ {
+ super.onRequestReceived(request);
+
+ try
+ {
+ Object message = MessageFactory.parseMessageFromContainerAgnostic(request);
+
+ List<HandlerAndType> receivers = stream(handlers).where((x) -> x.messageType == request.getType()).toList();
+
+ for (HandlerAndType receiver : receivers)
+ {
+ //noinspection unchecked
+ receiver.handler.invoke(this, message);
+ }
+
+ } catch (Exception e)
+ {
+ XLog.e(e);
+ }
+ }
+
+ private class HandlerAndType
+ {
+ IEventHandler handler;
+ MessageType messageType;
+
+ public HandlerAndType(IEventHandler handler, MessageType messageType)
+ {
+ this.handler = handler;
+ this.messageType = messageType;
+ }
+ }
+}
diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/IExternalBridgeService.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/IExternalBridgeService.java
new file mode 100644
index 000000000..32abe3365
--- /dev/null
+++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/IExternalBridgeService.java
@@ -0,0 +1,53 @@
+package com.twine.tango.integration.services;
+
+import com.twine.tango.core.IEventHandler;
+import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer;
+import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType;
+import com.twine.tango.transport.ITransporter;
+
+import java.io.IOException;
+
+/**
+ * Created by Roy on 12/22/2017.
+ */
+
+public interface ITangoBridgeService extends ITransporter
+{
+ boolean isStarted();
+ void start() throws IOException;
+ void stop();
+ <T> void registerMessageHandler(IEventHandler<MessageReceivedArgs<T>> handler, MessageType messageType);
+ <T> void unRegisterMessageHandler(IEventHandler<MessageReceivedArgs<T>> handler);
+
+ public class MessageReceivedArgs<T>
+ {
+ private MessageContainer container;
+ private T message;
+
+ public MessageReceivedArgs(MessageContainer container, T message)
+ {
+ this.container = container;
+ this.message = message;
+ }
+
+ public MessageContainer getContainer()
+ {
+ return container;
+ }
+
+ public void setContainer(MessageContainer container)
+ {
+ this.container = container;
+ }
+
+ public T getMessage()
+ {
+ return message;
+ }
+
+ public void setMessage(T message)
+ {
+ this.message = message;
+ }
+ }
+}
diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ISynchronizationService.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ISynchronizationService.java
new file mode 100644
index 000000000..631522fd0
--- /dev/null
+++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ISynchronizationService.java
@@ -0,0 +1,19 @@
+package com.twine.tango.integration.services;
+
+import java.io.IOException;
+
+import io.reactivex.Completable;
+
+
+/**
+ * Represents the Tango application local to remote synchronization engine.
+ */
+public interface ISynchronizationService
+{
+ /**
+ * Synchronizes the local database with the remote database through the remote machine service.
+ *
+ * @return the completable.
+ */
+ Completable synchronizeDB();
+}
diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/SynchronizationService.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/SynchronizationService.java
new file mode 100644
index 000000000..ed15c9b7b
--- /dev/null
+++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/SynchronizationService.java
@@ -0,0 +1,90 @@
+package com.twine.tango.integration.services;
+
+import com.elvishew.xlog.XLog;
+import com.google.protobuf.ByteString;
+import com.snatik.storage.Storage;
+import com.twine.tango.core.ContextHelper;
+import com.twine.tango.dal.TangoDB;
+import com.twine.tango.integration.providers.IMachineIdentityProvider;
+import com.twine.tango.integration.services.IExternalBridgeService.MessageReceivedArgs;
+import com.twine.tango.pmr.MessageFactory;
+import com.twine.tango.pmr.TangoMessage;
+import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType;
+import com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest;
+import com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse;
+import com.twine.tango.pmr.synchronization.SynchronizeDBRequestOuterClass.SynchronizeDBRequest;
+import com.twine.tango.web.WebApiFactory;
+import com.twine.tango.web.ISynchronizationAPI;
+
+import javax.inject.Inject;
+
+import io.reactivex.Completable;
+
+
+/**
+ * Represents the Tango application local to remote synchronization engine.
+ */
+public class SynchronizationService implements ISynchronizationService
+{
+ private IMachineIdentityProvider machineIdentityProvider;
+ private IExternalBridgeService bridgeService;
+
+
+ /**
+ * Instantiates a new Tango synchronizer.
+ *
+ * @param machineIdentityProvider the machine identity provider
+ */
+ @Inject
+ public SynchronizationService(IMachineIdentityProvider machineIdentityProvider, IExternalBridgeService bridgeService)
+ {
+ this.machineIdentityProvider = machineIdentityProvider;
+ this.bridgeService = bridgeService;
+ this.bridgeService.registerMessageHandler(this::handleCalculateRequest, MessageType.CalculateRequest);
+ }
+
+ private void handleCalculateRequest(Object o, MessageReceivedArgs<CalculateRequest> e)
+ {
+ CalculateResponse response = CalculateResponse.newBuilder().setSum(e.getMessage().getA() + e.getMessage().getB()).build();
+ TangoMessage<CalculateResponse> tangoMessage = MessageFactory.createTangoMessage(CalculateResponse.class, response, e.getContainer().getToken());
+ bridgeService.sendResponse(tangoMessage);
+ }
+
+ @Override
+ public Completable synchronizeDB()
+ {
+ return Completable.create((emitter) ->
+ {
+
+ //Backup DataBase.
+ TangoDB.backup();
+
+ Storage storage = new Storage(ContextHelper.getApplicationContext());
+
+ //Read current DB file bytes.
+ byte[] data = storage.readFile(TangoDB.getDataBasePath());
+
+ //Create synchronization web api.
+ ISynchronizationAPI synchAPI = WebApiFactory.getSynchronizationAPI();
+
+ //Create synchronization response.
+ SynchronizeDBRequest request = SynchronizeDBRequest.newBuilder()
+ .setSerialNumber(machineIdentityProvider.getSerialNumber())
+ .setLocalDB(ByteString.copyFrom(data))
+ .build();
+
+ synchAPI.synchronize(request).singleOrError().subscribe((response) ->
+ {
+
+ TangoDB.replace(response.getRemoteDB().toByteArray());
+ emitter.onComplete();
+
+ }, (ex) ->
+ {
+ XLog.e(ex);
+ emitter.onError(ex);
+ });
+
+ });
+ }
+}