aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com
diff options
context:
space:
mode:
authorRoy Ben-Shabat <Roy@Twine-s.com>2017-11-16 13:38:56 +0200
committerRoy Ben-Shabat <Roy@Twine-s.com>2017-11-16 13:38:56 +0200
commit914f4db513477d9aff726546bac47545195a3e37 (patch)
treed2ff190fd84b1dfaa03eec76563c431592ece7ff /Software/Android_Studio/Tango.Stubs.UI/src/main/java/com
parent65d01ff549d80fbe13ff5e966df216c9f7c03653 (diff)
downloadTango-914f4db513477d9aff726546bac47545195a3e37.tar.gz
Tango-914f4db513477d9aff726546bac47545195a3e37.zip
Rename "Visual Studio" to "Visual_Studio"
Rename "External Repositories" to "External_Repositories".
Diffstat (limited to 'Software/Android_Studio/Tango.Stubs.UI/src/main/java/com')
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/App.java91
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/Events/LoginEvent.java24
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/Events/StubSelectedEvent.java24
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ApplicationComponent.java33
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ApplicationModule.java30
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/EventBusModule.java24
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/NotificationModule.java27
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ServicesModule.java8
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/TransportModule.java33
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ViewModelsModule.java62
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragment.java46
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragmentContract.java10
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragmentVM.java51
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivity.java80
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivityContract.java18
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivityVM.java37
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragment.java49
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragmentContract.java18
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragmentVM.java23
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivity.java19
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivityContract.java10
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivityVM.java78
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivity.java25
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityContract.java13
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityVM.java60
25 files changed, 893 insertions, 0 deletions
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/App.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/App.java
new file mode 100644
index 000000000..f0c71477f
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/App.java
@@ -0,0 +1,91 @@
+package com.twine.tango.stubs.ui;
+
+import android.app.Application;
+import android.content.Context;
+import android.os.Environment;
+
+import com.elvishew.xlog.LogConfiguration;
+import com.elvishew.xlog.LogLevel;
+import com.elvishew.xlog.XLog;
+import com.elvishew.xlog.formatter.message.object.ObjectFormatter;
+import com.elvishew.xlog.printer.AndroidPrinter;
+import com.elvishew.xlog.printer.Printer;
+import com.elvishew.xlog.printer.file.FilePrinter;
+import com.elvishew.xlog.printer.file.backup.FileSizeBackupStrategy;
+import com.elvishew.xlog.printer.file.naming.DateFileNameGenerator;
+import com.google.protobuf.GeneratedMessageV3;
+import com.twine.tango.core.ContextFactory;
+import com.twine.tango.pmr.MessageFactory;
+import com.twine.tango.stubs.ui.dagger.ApplicationComponent;
+import com.twine.tango.stubs.ui.dagger.ApplicationModule;
+import com.twine.tango.stubs.ui.dagger.DaggerApplicationComponent;
+
+import net.danlew.android.joda.JodaTimeAndroid;
+
+import java.io.File;
+
+/**
+ * Created by Roy on 11/6/2017.
+ */
+
+public class App extends Application {
+ private static Context context;
+
+ private ApplicationComponent appComponent;
+
+ public ApplicationComponent getAppComponent() {
+ return appComponent;
+ }
+
+ protected ApplicationComponent initDagger(App application) {
+ return DaggerApplicationComponent.builder().applicationModule(new ApplicationModule(application)).build();
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+
+ JodaTimeAndroid.init(this);
+
+ appComponent = initDagger(this);
+ context = getApplicationContext();
+
+ ContextFactory.init(context);
+
+ LogConfiguration config = new LogConfiguration.Builder()
+ .logLevel(LogLevel.ALL)
+ .tag("Tango")
+ .t()
+ .st(1)
+// .b()
+ .addObjectFormatter(GeneratedMessageV3.class, msg -> msg.toString()).build();
+
+ File sdcard = context.getFilesDir();
+ File dir = new File(sdcard.getAbsolutePath() + "/logs");
+ boolean b = dir.mkdirs();
+
+ Printer androidPrinter = new AndroidPrinter();
+ Printer filePrinter = new FilePrinter.Builder(dir.getPath())
+ .fileNameGenerator(new DateFileNameGenerator())
+ .backupStrategy(new FileSizeBackupStrategy(1024 * 1024))
+ .build();
+
+ XLog.init(config, androidPrinter, filePrinter);
+ XLog.i("Logger Initialized. logs will be saved to: " + dir.getAbsolutePath());
+
+
+ Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> {
+
+ XLog.e(throwable);
+ System.exit(1);
+ });
+ }
+
+ public static ApplicationComponent getComponent() {
+ return ((App) context).getAppComponent();
+ }
+
+ public static Context getContext() {
+ return context;
+ }
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/Events/LoginEvent.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/Events/LoginEvent.java
new file mode 100644
index 000000000..da5f62124
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/Events/LoginEvent.java
@@ -0,0 +1,24 @@
+package com.twine.tango.stubs.ui.Events;
+
+import com.twine.tango.models.User;
+
+/**
+ * Created by Roy on 11/7/2017.
+ */
+
+public class LoginEvent {
+
+ private User user;
+
+ public LoginEvent(User user) {
+ this.user = user;
+ }
+
+ public User getUser() {
+ return user;
+ }
+
+ public void setUser(User user) {
+ this.user = user;
+ }
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/Events/StubSelectedEvent.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/Events/StubSelectedEvent.java
new file mode 100644
index 000000000..1c2826c25
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/Events/StubSelectedEvent.java
@@ -0,0 +1,24 @@
+package com.twine.tango.stubs.ui.Events;
+
+import com.twine.tango.stubs.AvailableStub;
+
+/**
+ * Created by Roy on 11/7/2017.
+ */
+
+public class StubSelectedEvent {
+
+ private AvailableStub stub;
+
+ public AvailableStub getStub() {
+ return stub;
+ }
+
+ public void setStub(AvailableStub stub) {
+ this.stub = stub;
+ }
+
+ public StubSelectedEvent(AvailableStub stub) {
+ this.stub = stub;
+ }
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ApplicationComponent.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ApplicationComponent.java
new file mode 100644
index 000000000..e9a3d65de
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ApplicationComponent.java
@@ -0,0 +1,33 @@
+package com.twine.tango.stubs.ui.dagger;
+
+import com.twine.tango.stubs.ui.views.login.LoginFragment;
+import com.twine.tango.stubs.ui.views.main.MainActivity;
+import com.twine.tango.stubs.ui.views.main.MainActivityVM;
+import com.twine.tango.stubs.ui.views.selection.SelectionFragment;
+import com.twine.tango.stubs.ui.views.stub.StubActivity;
+import com.twine.tango.stubs.ui.views.stubs.StubsActivity;
+
+import javax.inject.Singleton;
+
+import dagger.Component;
+
+/**
+ * Created by Roy on 11/6/2017.
+ */
+
+@Singleton
+@Component(modules = {ApplicationModule.class, ViewModelsModule.class, EventBusModule.class, NotificationModule.class, TransportModule.class})
+public interface ApplicationComponent {
+
+ void inject(MainActivity view);
+
+ void inject(LoginFragment view);
+
+ void inject(SelectionFragment view);
+
+ void inject(StubsActivity view);
+
+ void inject(StubActivity view);
+
+ MainActivityVM provideMainActivityVM();
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ApplicationModule.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ApplicationModule.java
new file mode 100644
index 000000000..ce664f835
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ApplicationModule.java
@@ -0,0 +1,30 @@
+package com.twine.tango.stubs.ui.dagger;
+
+import android.app.Application;
+import android.content.Context;
+
+import javax.inject.Singleton;
+
+import dagger.Module;
+import dagger.Provides;
+
+/**
+ * Created by Roy on 11/6/2017.
+ */
+
+@Module
+public class ApplicationModule {
+
+ private Application application;
+
+ public ApplicationModule(Application application) {
+ this.application = application;
+ }
+
+ @Provides
+ @Singleton
+ public Context provideContext()
+ {
+ return application;
+ }
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/EventBusModule.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/EventBusModule.java
new file mode 100644
index 000000000..3aeb461f7
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/EventBusModule.java
@@ -0,0 +1,24 @@
+package com.twine.tango.stubs.ui.dagger;
+
+import com.squareup.otto.Bus;
+import com.squareup.otto.ThreadEnforcer;
+
+import javax.inject.Singleton;
+
+import dagger.Module;
+import dagger.Provides;
+
+/**
+ * Created by Roy on 11/6/2017.
+ */
+
+@Module
+public class EventBusModule {
+
+ @Provides
+ @Singleton
+ public Bus provideEventBus()
+ {
+ return new Bus(ThreadEnforcer.MAIN);
+ }
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/NotificationModule.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/NotificationModule.java
new file mode 100644
index 000000000..900080c25
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/NotificationModule.java
@@ -0,0 +1,27 @@
+package com.twine.tango.stubs.ui.dagger;
+
+import android.content.Context;
+
+import com.twine.tango.sharedui.notifications.AndroidNotificationProvider;
+import com.twine.tango.sharedui.notifications.NotificationProvider;
+
+import javax.inject.Singleton;
+
+import dagger.Module;
+import dagger.Provides;
+
+/**
+ * Created by Roy on 11/6/2017.
+ */
+
+@Module
+public class NotificationModule {
+
+ @Provides
+ @Singleton
+ public NotificationProvider provideNotificationProvider(Context context)
+ {
+ return new AndroidNotificationProvider(context);
+ }
+
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ServicesModule.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ServicesModule.java
new file mode 100644
index 000000000..2227cbf1e
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ServicesModule.java
@@ -0,0 +1,8 @@
+package com.twine.tango.stubs.ui.dagger;
+
+/**
+ * Created by Roy on 11/6/2017.
+ */
+
+public class ServicesModule {
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/TransportModule.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/TransportModule.java
new file mode 100644
index 000000000..7c4babd1f
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/TransportModule.java
@@ -0,0 +1,33 @@
+package com.twine.tango.stubs.ui.dagger;
+
+import com.twine.tango.transport.ITransportAdapter;
+import com.twine.tango.transport.ITransporter;
+import com.twine.tango.transport.adapters.TcpTransportAdapter;
+import com.twine.tango.transport.transporters.ProtoTransporter;
+import javax.inject.Singleton;
+import dagger.Module;
+import dagger.Provides;
+
+/**
+ * Created by Roy on 11/14/2017.
+ */
+
+@Module
+public class TransportModule
+{
+
+ @Provides
+ @Singleton
+ public ITransporter provideTransporter(ITransportAdapter adapter)
+ {
+ return new ProtoTransporter(adapter);
+ }
+
+ @Provides
+ @Singleton
+ public ITransportAdapter provideAdapter()
+ {
+ return new TcpTransportAdapter("10.0.2.2", 9999);
+ }
+
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ViewModelsModule.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ViewModelsModule.java
new file mode 100644
index 000000000..55fece908
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ViewModelsModule.java
@@ -0,0 +1,62 @@
+package com.twine.tango.stubs.ui.dagger;
+
+import com.squareup.otto.Bus;
+import com.twine.tango.integration.machine.MachineOperatorInterface;
+import com.twine.tango.sharedui.notifications.NotificationProvider;
+import com.twine.tango.stubs.ui.views.login.LoginFragment;
+import com.twine.tango.stubs.ui.views.login.LoginFragmentVM;
+import com.twine.tango.stubs.ui.views.main.MainActivityVM;
+import com.twine.tango.stubs.ui.views.selection.SelectionFragmentVM;
+import com.twine.tango.stubs.ui.views.stub.StubActivityVM;
+import com.twine.tango.stubs.ui.views.stubs.StubsActivityVM;
+import com.twine.tango.transport.ITransportAdapter;
+import com.twine.tango.transport.ITransporter;
+
+import javax.inject.Singleton;
+
+import dagger.Module;
+import dagger.Provides;
+
+/**
+ * Created by Roy on 11/6/2017.
+ */
+
+@Module
+public class ViewModelsModule
+{
+
+ @Provides
+ @Singleton
+ public MainActivityVM provideMainActivityVM(Bus eventBus, NotificationProvider notificationProvider)
+ {
+ return new MainActivityVM(eventBus, notificationProvider);
+ }
+
+ @Provides
+ @Singleton
+ public LoginFragmentVM provideLoginFragmentVM(Bus eventBus, NotificationProvider notificationProvider)
+ {
+ return new LoginFragmentVM(eventBus, notificationProvider);
+ }
+
+ @Provides
+ @Singleton
+ public SelectionFragmentVM provideSelectionFragmentVM()
+ {
+ return new SelectionFragmentVM();
+ }
+
+ @Provides
+ @Singleton
+ public StubsActivityVM provideStubsActivityVM(Bus eventBus)
+ {
+ return new StubsActivityVM(eventBus);
+ }
+
+ @Provides
+ @Singleton
+ public StubActivityVM provideStubActivityVM(Bus eventBus, NotificationProvider notificationProvider, ITransporter transporter, ITransportAdapter adapter)
+ {
+ return new StubActivityVM(eventBus, notificationProvider, transporter, adapter);
+ }
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragment.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragment.java
new file mode 100644
index 000000000..4a8e32afd
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragment.java
@@ -0,0 +1,46 @@
+package com.twine.tango.stubs.ui.views.login;
+
+import android.support.v4.app.Fragment;
+import android.widget.EditText;
+
+import com.mobsandgeeks.saripaar.annotation.Email;
+import com.mobsandgeeks.saripaar.annotation.Password;
+import com.twine.tango.sharedui.containers.FragmentBase;
+import com.twine.tango.stubs.ui.App;
+import com.twine.tango.stubs.ui.R;
+import com.twine.tango.stubs.ui.databinding.FragmentLoginBinding;
+
+import butterknife.BindView;
+
+/**
+ * A simple {@link Fragment} subclass.
+ */
+public class LoginFragment extends FragmentBase<FragmentLoginBinding, LoginFragmentVM> implements LoginFragmentContract {
+
+ @BindView(R.id.txtEmail)
+ @Email(message = "Please enter a valid email address")
+ EditText txtEmail;
+
+ @BindView(R.id.txtPassword)
+ @Password(message = "Please enter a valid password", scheme = Password.Scheme.NUMERIC, min = 4)
+ EditText txtPassword;
+
+ public LoginFragment() {
+ // Required empty public constructor
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.fragment_login;
+ }
+
+ @Override
+ protected void inject() {
+ App.getComponent().inject(this);
+ }
+
+ @Override
+ public String getTitle() {
+ return "LOGIN";
+ }
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragmentContract.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragmentContract.java
new file mode 100644
index 000000000..d28e67b25
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragmentContract.java
@@ -0,0 +1,10 @@
+package com.twine.tango.stubs.ui.views.login;
+
+import com.twine.tango.sharedui.mvvm.ViewContract;
+
+/**
+ * Created by Roy on 11/6/2017.
+ */
+
+public interface LoginFragmentContract extends ViewContract {
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragmentVM.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragmentVM.java
new file mode 100644
index 000000000..ae454465e
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragmentVM.java
@@ -0,0 +1,51 @@
+package com.twine.tango.stubs.ui.views.login;
+
+import android.util.Log;
+
+import com.squareup.otto.Bus;
+import com.twine.tango.models.User;
+import com.twine.tango.sharedui.mvvm.DependencyProperty;
+import com.twine.tango.sharedui.mvvm.RelayCommand;
+import com.twine.tango.sharedui.mvvm.ViewModelBase;
+import com.twine.tango.sharedui.notifications.NotificationProvider;
+import com.twine.tango.stubs.ui.Events.LoginEvent;
+
+import javax.inject.Inject;
+
+/**
+ * Created by Roy on 11/6/2017.
+ */
+
+public class LoginFragmentVM extends ViewModelBase<LoginFragmentContract> {
+
+ private Bus eventBus;
+ private NotificationProvider notificationProvider;
+
+ public DependencyProperty<String> email;
+ public DependencyProperty<String> password;
+
+ public RelayCommand loginCommand;
+
+ @Inject
+ public LoginFragmentVM(Bus eventBus, NotificationProvider notificationProvider) {
+ this.eventBus = eventBus;
+ this.notificationProvider = notificationProvider;
+
+ email = new DependencyProperty<>("", (dp, value) -> loginCommand.invalidateCommand());
+ password = new DependencyProperty<>("", (dp, value) -> loginCommand.invalidateCommand());
+ loginCommand = new RelayCommand(this::login, () -> !email.get().isEmpty() && !password.get().isEmpty());
+
+ this.eventBus.register(this);
+ }
+
+ private void login() {
+
+ view.validateFields((valid) -> {
+
+ if (valid) {
+ eventBus.post(new LoginEvent(new User(email.get(), password.get())));
+ }
+
+ });
+ }
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivity.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivity.java
new file mode 100644
index 000000000..d31f2b525
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivity.java
@@ -0,0 +1,80 @@
+package com.twine.tango.stubs.ui.views.main;
+
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.support.v7.app.ActionBarDrawerToggle;
+import android.util.Log;
+
+import com.twine.tango.pmr.MessageFactory;
+import com.twine.tango.sharedui.containers.ActivityBase;
+import com.twine.tango.sharedui.containers.FragmentBase;
+import com.twine.tango.stubs.ui.App;
+import com.twine.tango.stubs.ui.R;
+import com.twine.tango.stubs.ui.databinding.ActivityMainBinding;
+import com.twine.tango.stubs.ui.views.login.LoginFragment;
+import com.twine.tango.stubs.ui.views.selection.SelectionFragment;
+import com.twine.tango.stubs.ui.views.stubs.StubsActivity;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+
+import dalvik.system.DexFile;
+
+public class MainActivity extends ActivityBase<ActivityMainBinding, MainActivityVM> implements MainActivityContract {
+
+ ActionBarDrawerToggle mDrawerToggle;
+ private Fragment currentFragment;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ //Load login fragment.
+ navigateTo(Navigation.MAIN);
+
+ setSupportActionBar(findViewById(R.id.toolbar1));
+ //initializeSideMenu();
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.activity_main;
+ }
+
+ @Override
+ protected void inject() {
+ App.getComponent().inject(this);
+ }
+
+ @Override
+ public void navigateTo(Navigation navigation) {
+
+ FragmentManager fragmentManager = getFragmentManager();
+ FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
+ FragmentBase fragment = null;
+
+ switch (navigation)
+ {
+ case LOGIN:
+ fragment = new LoginFragment();
+ break;
+ case MAIN:
+ fragment = new SelectionFragment();
+ break;
+ }
+
+ if (currentFragment != null) fragmentTransaction.remove(currentFragment);
+ currentFragment = fragment;
+ fragmentTransaction.add(R.id.fragment_container, fragment);
+ fragmentTransaction.commit();
+ }
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivityContract.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivityContract.java
new file mode 100644
index 000000000..3f27e29d9
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivityContract.java
@@ -0,0 +1,18 @@
+package com.twine.tango.stubs.ui.views.main;
+
+import com.twine.tango.sharedui.mvvm.ViewContract;
+
+/**
+ * Created by Roy on 11/6/2017.
+ */
+
+public interface MainActivityContract extends ViewContract {
+
+ enum Navigation
+ {
+ LOGIN,
+ MAIN,
+ }
+
+ void navigateTo(Navigation navigation);
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivityVM.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivityVM.java
new file mode 100644
index 000000000..7a6fe2a1f
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivityVM.java
@@ -0,0 +1,37 @@
+package com.twine.tango.stubs.ui.views.main;
+
+import com.squareup.otto.Bus;
+import com.squareup.otto.Subscribe;
+import com.twine.tango.models.User;
+import com.twine.tango.sharedui.mvvm.DependencyProperty;
+import com.twine.tango.sharedui.mvvm.FieldUtils;
+import com.twine.tango.sharedui.mvvm.ReadOnlyField;
+import com.twine.tango.sharedui.mvvm.RelayCommand;
+import com.twine.tango.sharedui.mvvm.ViewModelBase;
+import com.twine.tango.sharedui.notifications.NotificationProvider;
+import com.twine.tango.stubs.ui.Events.LoginEvent;
+
+import javax.inject.Inject;
+
+public class MainActivityVM extends ViewModelBase<MainActivityContract> {
+
+ private Bus eventBus;
+ private User currentUser;
+ private NotificationProvider notificationProvider;
+
+
+ @Inject
+ public MainActivityVM(Bus eventBus, NotificationProvider notificationProvider) {
+ this.eventBus = eventBus;
+ this.notificationProvider = notificationProvider;
+ this.eventBus.register(this);
+ }
+
+ @Subscribe
+ public void loginEventHandler(LoginEvent e)
+ {
+ currentUser = e.getUser();
+ view.navigateTo(MainActivityContract.Navigation.MAIN);
+ notificationProvider.notify(currentUser.getEmail() + " Log In!");
+ }
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragment.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragment.java
new file mode 100644
index 000000000..171aa562d
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragment.java
@@ -0,0 +1,49 @@
+package com.twine.tango.stubs.ui.views.selection;
+
+
+import android.content.Intent;
+import android.support.v4.app.Fragment;
+
+import com.twine.tango.sharedui.containers.FragmentBase;
+import com.twine.tango.stubs.ui.App;
+import com.twine.tango.stubs.ui.R;
+import com.twine.tango.stubs.ui.databinding.FragmentSelectionBinding;
+import com.twine.tango.stubs.ui.views.stubs.StubsActivity;
+
+/**
+ * A simple {@link Fragment} subclass.
+ */
+public class SelectionFragment extends FragmentBase<FragmentSelectionBinding, SelectionFragmentVM> implements SelectionFragmentContract {
+
+
+ public SelectionFragment() {
+ // Required empty public constructor
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.fragment_selection;
+ }
+
+ @Override
+ protected void inject() {
+ App.getComponent().inject(this);
+ }
+
+ @Override
+ public String getTitle() {
+ return "SELECTION";
+ }
+
+ @Override
+ public void navigateTo(Navigation navigation) {
+
+ switch (navigation) {
+ case Stubs:
+ startActivity(new Intent(this.getActivity(), StubsActivity.class));
+ break;
+ case DataBase:
+ break;
+ }
+ }
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragmentContract.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragmentContract.java
new file mode 100644
index 000000000..0a00a9d5b
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragmentContract.java
@@ -0,0 +1,18 @@
+package com.twine.tango.stubs.ui.views.selection;
+
+import com.twine.tango.sharedui.mvvm.ViewContract;
+
+/**
+ * Created by Roy on 11/6/2017.
+ */
+
+public interface SelectionFragmentContract extends ViewContract {
+
+ enum Navigation
+ {
+ Stubs,
+ DataBase,
+ }
+
+ void navigateTo(Navigation navigation);
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragmentVM.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragmentVM.java
new file mode 100644
index 000000000..989ab5083
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragmentVM.java
@@ -0,0 +1,23 @@
+package com.twine.tango.stubs.ui.views.selection;
+
+import com.twine.tango.sharedui.mvvm.RelayCommand;
+import com.twine.tango.sharedui.mvvm.ViewModelBase;
+
+import javax.inject.Inject;
+
+/**
+ * Created by Roy on 11/6/2017.
+ */
+
+public class SelectionFragmentVM extends ViewModelBase<SelectionFragmentContract> {
+
+ public RelayCommand openStubsCommand;
+ public RelayCommand openDataBaseCommand;
+
+ @Inject
+ public SelectionFragmentVM() {
+
+ openStubsCommand = new RelayCommand(() -> view.navigateTo(SelectionFragmentContract.Navigation.Stubs));
+ openDataBaseCommand = new RelayCommand(() -> view.navigateTo(SelectionFragmentContract.Navigation.DataBase));
+ }
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivity.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivity.java
new file mode 100644
index 000000000..3b4e8f1a1
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivity.java
@@ -0,0 +1,19 @@
+package com.twine.tango.stubs.ui.views.stub;
+
+import com.twine.tango.sharedui.containers.ActivityBase;
+import com.twine.tango.stubs.ui.App;
+import com.twine.tango.stubs.ui.R;
+import com.twine.tango.stubs.ui.databinding.ActivityStubBinding;
+
+public class StubActivity extends ActivityBase<ActivityStubBinding,StubActivityVM> {
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.activity_stub;
+ }
+
+ @Override
+ protected void inject() {
+ App.getComponent().inject(this);
+ }
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivityContract.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivityContract.java
new file mode 100644
index 000000000..e2fc7fb94
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivityContract.java
@@ -0,0 +1,10 @@
+package com.twine.tango.stubs.ui.views.stub;
+
+import com.twine.tango.sharedui.mvvm.ViewContract;
+
+/**
+ * Created by Roy on 11/7/2017.
+ */
+
+public interface StubActivityContract extends ViewContract {
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivityVM.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivityVM.java
new file mode 100644
index 000000000..d95420dd5
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivityVM.java
@@ -0,0 +1,78 @@
+package com.twine.tango.stubs.ui.views.stub;
+
+import com.elvishew.xlog.XLog;
+import com.squareup.otto.Bus;
+import com.squareup.otto.Subscribe;
+import com.twine.tango.core.ObjectDisposedException;
+import com.twine.tango.integration.machine.MachineOperatorInterface;
+import com.twine.tango.sharedui.mvvm.RelayCommand;
+import com.twine.tango.stubs.AvailableStub;
+import com.twine.tango.sharedui.mvvm.DependencyProperty;
+import com.twine.tango.sharedui.mvvm.ViewModelBase;
+import com.twine.tango.sharedui.notifications.NotificationProvider;
+import com.twine.tango.stubs.StubBase;
+import com.twine.tango.stubs.ui.Events.StubSelectedEvent;
+import com.twine.tango.transport.ITransportAdapter;
+import com.twine.tango.transport.ITransporter;
+import com.twine.tango.transport.TransportComponentState;
+
+import javax.inject.Inject;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+
+/**
+ * Created by Roy on 11/7/2017.
+ */
+
+public class StubActivityVM extends ViewModelBase<StubActivityContract>
+{
+ private Bus eventBus;
+ private NotificationProvider notificationProvider;
+ private ITransporter transporter;
+ private ITransportAdapter adapter;
+ public DependencyProperty<AvailableStub> stub;
+ public RelayCommand runCommand;
+
+ @Inject
+ public StubActivityVM(Bus eventBus, NotificationProvider notificationProvider, ITransporter transporter, ITransportAdapter adapter)
+ {
+
+ stub = new DependencyProperty<>();
+ this.eventBus = eventBus;
+ this.transporter = transporter;
+ this.adapter = adapter;
+ this.notificationProvider = notificationProvider;
+ this.eventBus.register(this);
+
+ if (transporter.getState() != TransportComponentState.Connected)
+ {
+ try
+ {
+ transporter.connect().subscribe();
+ } catch (ObjectDisposedException e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ runCommand = new RelayCommand(this::runSelectedStub);
+ }
+
+ @Subscribe
+ public void handleStubSelectedEvent(StubSelectedEvent e)
+ {
+ stub.set(e.getStub());
+ }
+
+ private void runSelectedStub()
+ {
+ StubBase stub = this.stub.get().createInstance(transporter);
+ stub.run().observeOn(AndroidSchedulers.mainThread()).subscribe((response) ->
+ {
+ XLog.i(response);
+ }, (ex) ->
+ {
+ XLog.e(ex);
+ });
+ }
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivity.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivity.java
new file mode 100644
index 000000000..eba516754
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivity.java
@@ -0,0 +1,25 @@
+package com.twine.tango.stubs.ui.views.stubs;
+
+import com.twine.tango.sharedui.containers.ActivityBase;
+import com.twine.tango.stubs.ui.App;
+import com.twine.tango.stubs.ui.R;
+import com.twine.tango.stubs.ui.databinding.ActivityStubsBinding;
+import com.twine.tango.stubs.ui.views.stub.StubActivity;
+
+public class StubsActivity extends ActivityBase<ActivityStubsBinding, StubsActivityVM> implements StubsActivityContract {
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.activity_stubs;
+ }
+
+ @Override
+ protected void inject() {
+ App.getComponent().inject(this);
+ }
+
+ @Override
+ public void navigateToStab(Runnable callback) {
+ startActivityNotify(StubActivity.class, callback);
+ }
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityContract.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityContract.java
new file mode 100644
index 000000000..52bfaa36f
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityContract.java
@@ -0,0 +1,13 @@
+package com.twine.tango.stubs.ui.views.stubs;
+
+import com.twine.tango.sharedui.mvvm.ViewContract;
+
+/**
+ * Created by Roy on 11/7/2017.
+ */
+
+public interface StubsActivityContract extends ViewContract {
+
+ void navigateToStab(Runnable callback);
+
+}
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityVM.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityVM.java
new file mode 100644
index 000000000..4afc1ed67
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityVM.java
@@ -0,0 +1,60 @@
+package com.twine.tango.stubs.ui.views.stubs;
+
+import android.databinding.ObservableArrayList;
+import android.databinding.ObservableField;
+import android.databinding.ObservableList;
+import android.util.Log;
+import android.view.View;
+import android.widget.AdapterView;
+
+import com.squareup.otto.Bus;
+import com.twine.tango.sharedui.mvvm.RelayCommand;
+import com.twine.tango.stubs.AvailableStub;
+import com.twine.tango.sharedui.mvvm.FieldUtils;
+import com.twine.tango.sharedui.mvvm.ViewModelBase;
+import com.twine.tango.stubs.StubBase;
+import com.twine.tango.stubs.StubDirection;
+import com.twine.tango.stubs.ui.BR;
+import com.twine.tango.stubs.ui.Events.StubSelectedEvent;
+import com.twine.tango.stubs.ui.R;
+
+import javax.inject.Inject;
+
+import me.tatarka.bindingcollectionadapter2.ItemBinding;
+
+/**
+ * Created by Roy on 11/7/2017.
+ */
+
+public class StubsActivityVM extends ViewModelBase<StubsActivityContract> {
+
+ private Bus eventBus;
+
+ public ObservableList<AvailableStub> stubs;
+ public ItemBinding<String> stubBinding;
+ public ObservableField<AvailableStub> selectedStub;
+ public ObservableField<Integer> selectedStubIndex;
+
+ @Inject
+ public StubsActivityVM(Bus eventBus) {
+
+ this.eventBus = eventBus;
+
+ stubs = new ObservableArrayList<>();
+ stubBinding = ItemBinding.of(BR.stub, R.layout.stubs_listview_item);
+ selectedStub = new ObservableField<>();
+ selectedStubIndex = FieldUtils.toField(FieldUtils.toObservable(selectedStub).map(stub -> stubs.indexOf(stub)));
+
+ stubs.addAll(StubBase.getAllStubs(StubDirection.ToMachine));
+ }
+
+ public void onStubSelected(AdapterView<?> adapterView, View view, int i, long l) {
+ selectedStub.set((AvailableStub) adapterView.getAdapter().getItem(i));
+ Log.i("Results", "Stub clicked: " + selectedStub.get().getName());
+ Log.i("Results","Selected User Index: " + selectedStubIndex.get());
+ this.view.navigateToStab(() ->
+ {
+ eventBus.post(new StubSelectedEvent(selectedStub.get()));
+ });
+ }
+}