diff options
| author | Roy <roy.mail.net@gmail.com> | 2017-12-24 02:26:55 +0200 |
|---|---|---|
| committer | Roy <roy.mail.net@gmail.com> | 2017-12-24 02:26:55 +0200 |
| commit | ceac40d058a8554638aa3fa39d4697f3fbfe62f8 (patch) | |
| tree | f865540d3c3c56ccbcc9ef0d57999e8c9456f8f3 /Software/Android_Studio/Tango.Integration/src | |
| parent | 6091da506db1083f6ca707c24e509ca3470f6a73 (diff) | |
| download | Tango-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')
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); + }); + + }); + } +} |
