aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Android_Studio/Tango.Integration
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Android_Studio/Tango.Integration')
-rw-r--r--Software/Android_Studio/Tango.Integration/build.gradle4
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/AndroidManifest.xml1
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/IMachineOperator.java5
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java13
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/IMachineIdentityProvider.java2
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/MachineIdentityProvider.java2
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java173
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/IExternalBridgeService.java2
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/SynchronizationService.java3
9 files changed, 182 insertions, 23 deletions
diff --git a/Software/Android_Studio/Tango.Integration/build.gradle b/Software/Android_Studio/Tango.Integration/build.gradle
index dc482d641..255fce0f6 100644
--- a/Software/Android_Studio/Tango.Integration/build.gradle
+++ b/Software/Android_Studio/Tango.Integration/build.gradle
@@ -43,4 +43,8 @@ dependencies {
compile globalDependencies.dagger
compile globalDependencies.daggerAndroid
implementation project(':Tango.PMR')
+ implementation project(':Tango.Transport')
+ implementation project(':Tango.Core')
+ implementation project(':Tango.DAL')
+ implementation project(':Tango.Web')
}
diff --git a/Software/Android_Studio/Tango.Integration/src/main/AndroidManifest.xml b/Software/Android_Studio/Tango.Integration/src/main/AndroidManifest.xml
index b57dcb665..81958ad3d 100644
--- a/Software/Android_Studio/Tango.Integration/src/main/AndroidManifest.xml
+++ b/Software/Android_Studio/Tango.Integration/src/main/AndroidManifest.xml
@@ -2,5 +2,6 @@
package="com.twine.tango.integration">
<uses-permission android:name="android.permission.INTERNET"/>
+ <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
</manifest>
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
index 7d69ce8ad..9963f295b 100644
--- 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
@@ -1,9 +1,12 @@
package com.twine.tango.integration.operators;
+import com.twine.tango.transport.ITransporter;
+
/**
* Created by Roy on 12/23/2017.
*/
-public interface IMachineOperator
+public interface IMachineOperator extends ITransporter
{
+
}
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
index 0eb73cab3..f23c8c705 100644
--- 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
@@ -1,9 +1,20 @@
package com.twine.tango.integration.operators;
+import com.twine.tango.transport.ITransportAdapter;
+import com.twine.tango.transport.transporters.ProtoTransporter;
+
/**
* Created by Roy on 12/23/2017.
*/
-public class MachineOperator
+public class MachineOperator extends ProtoTransporter implements IMachineOperator
{
+ public MachineOperator()
+ {
+ }
+
+ public MachineOperator(ITransportAdapter adapter)
+ {
+ super(adapter);
+ }
}
diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/IMachineIdentityProvider.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/IMachineIdentityProvider.java
index 3e35be9d0..547a17e50 100644
--- a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/IMachineIdentityProvider.java
+++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/IMachineIdentityProvider.java
@@ -1,4 +1,4 @@
-package com.twine.tango.integration;
+package com.twine.tango.integration.providers;
/**
diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/MachineIdentityProvider.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/MachineIdentityProvider.java
index 29cb0c30c..b4f2d3c4d 100644
--- a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/MachineIdentityProvider.java
+++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/MachineIdentityProvider.java
@@ -1,4 +1,4 @@
-package com.twine.tango.integration;
+package com.twine.tango.integration.providers;
/**
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
index f1702ee9e..709d5a271 100644
--- 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
@@ -1,35 +1,60 @@
package com.twine.tango.integration.services;
+import android.content.Context;
+import android.net.DhcpInfo;
+import android.net.wifi.WifiManager;
+import android.os.StrictMode;
import android.os.SystemClock;
+import android.provider.SyncStateContract.Constants;
+import android.util.Log;
import com.elvishew.xlog.XLog;
+import com.google.protobuf.GeneratedMessageV3;
+import com.twine.tango.core.ContextHelper;
import com.twine.tango.core.IEventHandler;
+import com.twine.tango.integration.operators.IMachineOperator;
+import com.twine.tango.integration.providers.IMachineIdentityProvider;
import com.twine.tango.pmr.MessageFactory;
+import com.twine.tango.pmr.TangoMessage;
import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer;
import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType;
+import com.twine.tango.pmr.integration.ExternalBridgeUdpDiscoveryPacketOuterClass.ExternalBridgeUdpDiscoveryPacket;
+import com.twine.tango.pmr.integration.ExternalClientLoginRequestOuterClass.ExternalClientLoginRequest;
+import com.twine.tango.pmr.integration.ExternalClientLoginResponseOuterClass.ExternalClientLoginResponse;
+import com.twine.tango.transport.ITransportAdapter;
import com.twine.tango.transport.adapters.TcpTransportAdapter;
import com.twine.tango.transport.transporters.ProtoTransporter;
import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
+import javax.inject.Inject;
+
import static br.com.zbra.androidlinq.Linq.stream;
/**
* Created by Roy on 12/22/2017.
*/
-public class TangoBridgeService extends ProtoTransporter implements ITangoBridgeService
+public class ExternalBridgeService extends ProtoTransporter implements IExternalBridgeService
{
private ServerSocket listener;
private boolean isStarted;
private List<HandlerAndType> handlers;
+ private IMachineIdentityProvider identityProvider;
+ private IMachineOperator machineOperator;
- public TangoBridgeService()
+ @Inject
+ public ExternalBridgeService(IMachineIdentityProvider identityProvider, IMachineOperator machineOperator)
{
+ this.identityProvider = identityProvider;
+ this.machineOperator = machineOperator;
handlers = new ArrayList<>();
}
@@ -43,8 +68,63 @@ public class TangoBridgeService extends ProtoTransporter implements ITangoBridge
public void start() throws IOException
{
listener = new ServerSocket(1984);
+ isStarted = true;
Thread listenerThread = new Thread(this::listenerThreadMethod);
+ Thread discoveryThread = new Thread(this::discoveryThreadMethod);
listenerThread.start();
+ discoveryThread.start();
+ }
+
+ private void discoveryThreadMethod()
+ {
+ // Hack Prevent crash (sending should be done using an async task)
+ StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
+ StrictMode.setThreadPolicy(policy);
+
+ byte[] packet = ExternalBridgeUdpDiscoveryPacket.newBuilder().setSerialNumber(identityProvider.getSerialNumber()).build().toByteArray();
+
+ while (isStarted)
+ {
+ try
+ {
+ DatagramSocket socket = new DatagramSocket();
+ socket.setBroadcast(true);
+
+ //First try to send to emulator host...
+ DatagramPacket sendPacket = new DatagramPacket(packet, packet.length, InetAddress.getByName("10.0.2.2"), 8888);
+ socket.send(sendPacket);
+
+ //This will not work on the emulator as far as I know.
+ //TODO: This needs to be tested on a real device!
+ sendPacket = new DatagramPacket(packet, packet.length, InetAddress.getByName("255.255.255.255"), 8888);
+ socket.send(sendPacket);
+
+ } catch (IOException e)
+ {
+ XLog.e(e);
+ }
+
+ SystemClock.sleep(5000);
+ }
+ }
+
+ private InetAddress getBroadcastAddress() throws IOException
+ {
+ WifiManager wifi = (WifiManager) ContextHelper.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
+ assert wifi != null;
+ DhcpInfo dhcp = wifi.getDhcpInfo();
+
+ if (dhcp != null)
+ {
+ int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
+ byte[] quads = new byte[4];
+ for (int k = 0; k < 4; k++)
+ quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
+ return InetAddress.getByAddress(quads);
+ } else
+ {
+ return null;
+ }
}
@Override
@@ -86,37 +166,98 @@ public class TangoBridgeService extends ProtoTransporter implements ITangoBridge
if (newSocket != null)
{
+ for (ITransportAdapter adapter : getAdapters())
+ {
+ adapter.disconnect().blockingAwait();
+ }
getAdapters().clear();
- getAdapters().add(new TcpTransportAdapter(newSocket));
- connect();
+ TcpTransportAdapter adapter = new TcpTransportAdapter(newSocket);
+ adapter.setAuthenticated(false);
+ getAdapters().add(adapter);
+ connect().blockingAwait();
}
} catch (IOException e)
{
-
+ XLog.e(e);
}
SystemClock.sleep(100);
}
+
+ disconnect().blockingAwait();
}
@Override
- protected void onRequestReceived(MessageContainer request)
+ protected void onRequestReceived(MessageContainer container)
{
- super.onRequestReceived(request);
-
+ super.onRequestReceived(container);
+
try
{
- Object message = MessageFactory.parseMessageFromContainerAgnostic(request);
-
- List<HandlerAndType> receivers = stream(handlers).where((x) -> x.messageType == request.getType()).toList();
-
- for (HandlerAndType receiver : receivers)
+ if (container.getType() == MessageType.ExternalClientLoginRequest)
{
- //noinspection unchecked
- receiver.handler.invoke(this, message);
+ ExternalClientLoginRequest request = MessageFactory.parseMessageFromContainer(container);
+ if (request.getKey().equals("1234"))
+ {
+ getAdapters().get(0).setAuthenticated(true);
+ sendResponse(MessageFactory.createTangoMessage(
+ ExternalClientLoginResponse.class,
+ ExternalClientLoginResponse.newBuilder().setAuthenticated(true).build(),
+ container.getToken()));
+ } else
+ {
+ getAdapters().get(0).setAuthenticated(false);
+ sendResponse(MessageFactory.createTangoMessage(
+ ExternalClientLoginResponse.class,
+ ExternalClientLoginResponse.newBuilder().setAuthenticated(false).build(),
+ container.getToken()));
+ }
+
+ return;
}
-
+
+ if (getAdapters().get(0).isAuthenticated())
+ {
+ GeneratedMessageV3 message = MessageFactory.parseMessageFromContainerAgnostic(container);
+
+ List<HandlerAndType> receivers = stream(handlers).where((x) -> x.messageType == container.getType()).toList();
+
+ if (receivers.size() > 0)
+ {
+ for (HandlerAndType receiver : receivers)
+ {
+ //noinspection unchecked
+ receiver.handler.invoke(this, new MessageReceivedArgs(container, message));
+ }
+ } else
+ {
+ //Route to machine...
+ if (container.getContinuous())
+ {
+ machineOperator.sendContinuousRequest(MessageFactory.createTangoMessage(container, message)).subscribe((response) ->
+ {
+ sendResponse((TangoMessage<? extends GeneratedMessageV3>) response);
+ }, (ex) ->
+ {
+
+ });
+ } else
+ {
+ machineOperator.sendRequest(MessageFactory.createTangoMessage(container, message)).subscribe((response) ->
+ {
+ sendResponse((TangoMessage<? extends GeneratedMessageV3>) response);
+ }, (ex) ->
+ {
+
+ });
+ }
+ }
+ } else
+ {
+ XLog.w("Message received from an unauthorized adapter!");
+ }
+
} catch (Exception e)
{
XLog.e(e);
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
index 32abe3365..5a2aed9aa 100644
--- 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
@@ -11,7 +11,7 @@ import java.io.IOException;
* Created by Roy on 12/22/2017.
*/
-public interface ITangoBridgeService extends ITransporter
+public interface IExternalBridgeService extends ITransporter
{
boolean isStarted();
void start() throws IOException;
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
index ed15c9b7b..0f3d98982 100644
--- 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
@@ -29,7 +29,6 @@ public class SynchronizationService implements ISynchronizationService
private IMachineIdentityProvider machineIdentityProvider;
private IExternalBridgeService bridgeService;
-
/**
* Instantiates a new Tango synchronizer.
*
@@ -40,7 +39,7 @@ public class SynchronizationService implements ISynchronizationService
{
this.machineIdentityProvider = machineIdentityProvider;
this.bridgeService = bridgeService;
- this.bridgeService.registerMessageHandler(this::handleCalculateRequest, MessageType.CalculateRequest);
+ //this.bridgeService.registerMessageHandler(this::handleCalculateRequest, MessageType.CalculateRequest);
}
private void handleCalculateRequest(Object o, MessageReceivedArgs<CalculateRequest> e)