aboutsummaryrefslogtreecommitdiffstats
path: root/Software
diff options
context:
space:
mode:
authorRoy Ben Shabat <roy@twine-s.com>2017-11-07 19:37:57 +0200
committerRoy Ben-Shabat <Roy@Twine-s.com>2017-11-07 19:37:57 +0200
commitd615c26b41af480dae0bf478133c9333c319a6ce (patch)
treea78d0dcc986d2420c59d114f969271f0bb95b482 /Software
parentd36b6e931d1b55ca9a33cb8f138d284eb9c6d517 (diff)
downloadTango-d615c26b41af480dae0bf478133c9333c319a6ce.tar.gz
Tango-d615c26b41af480dae0bf478133c9333c319a6ce.zip
Implemented basic stubs UI design architecture.
Diffstat (limited to 'Software')
-rw-r--r--Software/Android-Studio/Tango.Models/.gitignore1
-rw-r--r--Software/Android-Studio/Tango.Models/build.gradle41
-rw-r--r--Software/Android-Studio/Tango.Models/proguard-rules.pro25
-rw-r--r--Software/Android-Studio/Tango.Models/src/androidTest/java/com/twine/tango/models/ExampleInstrumentedTest.java26
-rw-r--r--Software/Android-Studio/Tango.Models/src/main/AndroidManifest.xml2
-rw-r--r--Software/Android-Studio/Tango.Models/src/main/java/com/twine/tango/models/User.java39
-rw-r--r--Software/Android-Studio/Tango.Models/src/main/java/com/twine/tango/models/stubs/Stub.java35
-rw-r--r--Software/Android-Studio/Tango.Models/src/main/res/values/strings.xml3
-rw-r--r--Software/Android-Studio/Tango.Models/src/test/java/com/twine/tango/models/ExampleUnitTest.java17
-rw-r--r--Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/binding_adapters/BindingAdapters.java34
-rw-r--r--Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/ActivityBase.java21
-rw-r--r--Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/ActivityCallbackEngine.java55
-rw-r--r--Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/FragmentBase.java10
-rw-r--r--Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/FragmentBaseV4.java107
-rw-r--r--Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/paging/PagerAdapter.java8
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/build.gradle2
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/AndroidManifest.xml2
-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.java6
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ViewModelsModule.java18
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragment.java16
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragmentVM.java38
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivity.java61
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivityContract.java7
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivityVM.java28
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragment.java19
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragmentContract.java7
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragmentVM.java13
-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.java40
-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.java14
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityVM.java63
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/database.pngbin0 -> 2304 bytes
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/ic_database.xml17
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/ic_play.xml9
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/ic_stop.xml4
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/ic_stubs.xml6
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/list_view_selectable.xml4
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/stubs.pngbin0 -> 2543 bytes
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/user.pngbin0 -> 9817 bytes
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/activity_main.xml19
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/activity_stub.xml145
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/activity_stubs.xml31
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/fragment_login.xml47
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/fragment_selection.xml47
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/stubs_listview_item.xml30
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/res/values/colors.xml2
-rw-r--r--Software/Android-Studio/Tango.Stubs.UI/src/main/res/values/strings.xml2
-rw-r--r--Software/Android-Studio/settings.gradle2
52 files changed, 1151 insertions, 74 deletions
diff --git a/Software/Android-Studio/Tango.Models/.gitignore b/Software/Android-Studio/Tango.Models/.gitignore
new file mode 100644
index 000000000..796b96d1c
--- /dev/null
+++ b/Software/Android-Studio/Tango.Models/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/Software/Android-Studio/Tango.Models/build.gradle b/Software/Android-Studio/Tango.Models/build.gradle
new file mode 100644
index 000000000..127943df7
--- /dev/null
+++ b/Software/Android-Studio/Tango.Models/build.gradle
@@ -0,0 +1,41 @@
+apply plugin: 'com.android.library'
+
+android {
+ compileSdkVersion 26
+ buildToolsVersion "26.0.1"
+
+
+ defaultConfig {
+ minSdkVersion 22
+ targetSdkVersion 26
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ dataBinding {
+ enabled = true
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+
+ implementation 'com.android.support:appcompat-v7:26.1.0'
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'com.android.support.test:runner:1.0.1'
+ androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
+}
diff --git a/Software/Android-Studio/Tango.Models/proguard-rules.pro b/Software/Android-Studio/Tango.Models/proguard-rules.pro
new file mode 100644
index 000000000..a0eef131a
--- /dev/null
+++ b/Software/Android-Studio/Tango.Models/proguard-rules.pro
@@ -0,0 +1,25 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in C:\Users\Roy\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/Software/Android-Studio/Tango.Models/src/androidTest/java/com/twine/tango/models/ExampleInstrumentedTest.java b/Software/Android-Studio/Tango.Models/src/androidTest/java/com/twine/tango/models/ExampleInstrumentedTest.java
new file mode 100644
index 000000000..ffdb40c47
--- /dev/null
+++ b/Software/Android-Studio/Tango.Models/src/androidTest/java/com/twine/tango/models/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.twine.tango.models;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() throws Exception {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getTargetContext();
+
+ assertEquals("com.twine.tango.models.test", appContext.getPackageName());
+ }
+}
diff --git a/Software/Android-Studio/Tango.Models/src/main/AndroidManifest.xml b/Software/Android-Studio/Tango.Models/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..85096ec75
--- /dev/null
+++ b/Software/Android-Studio/Tango.Models/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.twine.tango.models" />
diff --git a/Software/Android-Studio/Tango.Models/src/main/java/com/twine/tango/models/User.java b/Software/Android-Studio/Tango.Models/src/main/java/com/twine/tango/models/User.java
new file mode 100644
index 000000000..41ea672e4
--- /dev/null
+++ b/Software/Android-Studio/Tango.Models/src/main/java/com/twine/tango/models/User.java
@@ -0,0 +1,39 @@
+package com.twine.tango.models;
+
+import android.databinding.BaseObservable;
+import android.databinding.Bindable;
+
+/**
+ * Created by Roy on 11/7/2017.
+ */
+
+public class User extends BaseObservable {
+
+ private String email;
+ private String password;
+
+ public User(String email, String password) {
+ this.email = email;
+ this.password = password;
+ }
+
+ @Bindable
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ notifyPropertyChanged(BR.email);
+ }
+
+ @Bindable
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ notifyPropertyChanged(BR.password);
+ }
+}
diff --git a/Software/Android-Studio/Tango.Models/src/main/java/com/twine/tango/models/stubs/Stub.java b/Software/Android-Studio/Tango.Models/src/main/java/com/twine/tango/models/stubs/Stub.java
new file mode 100644
index 000000000..397c4b4e4
--- /dev/null
+++ b/Software/Android-Studio/Tango.Models/src/main/java/com/twine/tango/models/stubs/Stub.java
@@ -0,0 +1,35 @@
+package com.twine.tango.models.stubs;
+
+import android.databinding.BaseObservable;
+import android.databinding.Bindable;
+import com.twine.tango.models.BR;
+
+/**
+ * Created by Roy on 11/7/2017.
+ */
+
+public class Stub extends BaseObservable {
+
+ private String name;
+ private String description;
+
+ @Bindable
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ notifyPropertyChanged(BR.name);
+ }
+
+ @Bindable
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ notifyPropertyChanged(BR.description);
+ }
+}
diff --git a/Software/Android-Studio/Tango.Models/src/main/res/values/strings.xml b/Software/Android-Studio/Tango.Models/src/main/res/values/strings.xml
new file mode 100644
index 000000000..8caa8d0fd
--- /dev/null
+++ b/Software/Android-Studio/Tango.Models/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+<resources>
+ <string name="app_name">Tango.Models</string>
+</resources>
diff --git a/Software/Android-Studio/Tango.Models/src/test/java/com/twine/tango/models/ExampleUnitTest.java b/Software/Android-Studio/Tango.Models/src/test/java/com/twine/tango/models/ExampleUnitTest.java
new file mode 100644
index 000000000..f00a91cc0
--- /dev/null
+++ b/Software/Android-Studio/Tango.Models/src/test/java/com/twine/tango/models/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.twine.tango.models;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() throws Exception {
+ assertEquals(4, 2 + 2);
+ }
+} \ No newline at end of file
diff --git a/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/binding_adapters/BindingAdapters.java b/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/binding_adapters/BindingAdapters.java
new file mode 100644
index 000000000..04d1ea5e7
--- /dev/null
+++ b/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/binding_adapters/BindingAdapters.java
@@ -0,0 +1,34 @@
+package com.twine.tango.sharedui.binding_adapters;
+
+import android.databinding.BindingAdapter;
+import android.graphics.Bitmap;
+import android.widget.ImageView;
+import android.widget.ListView;
+
+/**
+ * Created by Roy on 11/7/2017.
+ */
+
+public class BindingAdapters {
+
+ @BindingAdapter("android:memory_bitmap")
+ public static void bitmapAdapter(ImageView view, Bitmap bitmap) {
+ if (bitmap != null) {
+ view.setImageBitmap(bitmap);
+ }
+ }
+
+ @BindingAdapter("android:onItemClick")
+ public static void listViewClickAdapter(ListView view, ListView.OnItemClickListener listener) {
+ if (view != null && listener != null) {
+ view.setOnItemClickListener(listener);
+ }
+ }
+
+ @BindingAdapter("android:selectedItemPosition")
+ public static void listViewSelectedItemPosition(ListView view, int position) {
+ if (view != null) {
+ view.setItemChecked(position, true);
+ }
+ }
+}
diff --git a/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/ActivityBase.java b/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/ActivityBase.java
index fab3a2897..7f52ffae6 100644
--- a/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/ActivityBase.java
+++ b/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/ActivityBase.java
@@ -1,5 +1,6 @@
package com.twine.tango.sharedui.containers;
+import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.os.Bundle;
@@ -7,18 +8,25 @@ import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
+
import com.mobsandgeeks.saripaar.ValidationError;
import com.mobsandgeeks.saripaar.Validator;
import com.twine.tango.sharedui.mvvm.ViewContract;
import com.twine.tango.sharedui.mvvm.ViewModelBase;
+
import java.lang.reflect.Method;
import java.util.List;
+import java.util.concurrent.Callable;
+
import javax.inject.Inject;
+
import butterknife.ButterKnife;
import io.reactivex.functions.Consumer;
public abstract class ActivityBase<BindingView extends ViewDataBinding, VM extends ViewModelBase> extends AppCompatActivity implements ViewContract, Validator.ValidationListener {
+ protected static final String ACTIVITY_CALLBACK_INTENT = "ACTIVITY_CALLBACK_INTENT";
+
private Consumer<Boolean> lastValidationConsumer;
private Validator validator;
@@ -45,6 +53,11 @@ public abstract class ActivityBase<BindingView extends ViewDataBinding, VM exten
validator = new Validator(this);
validator.setValidationListener(this);
+ String key = getIntent().getStringExtra(ACTIVITY_CALLBACK_INTENT);
+ if (key != null && !key.isEmpty()) {
+ ActivityCallbackEngine.getInstance().runAndRemove(key);
+ }
+
} catch (Exception e) {
e.printStackTrace();
}
@@ -97,4 +110,12 @@ public abstract class ActivityBase<BindingView extends ViewDataBinding, VM exten
protected abstract int getLayoutId();
protected abstract void inject();
+
+ public void startActivityNotify(Class<?> activity, Runnable callback) {
+
+ String key = ActivityCallbackEngine.getInstance().putCallback(callback);
+ Intent i = new Intent(getApplicationContext(), activity);
+ i.putExtra(ACTIVITY_CALLBACK_INTENT, key);
+ startActivity(i);
+ }
}
diff --git a/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/ActivityCallbackEngine.java b/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/ActivityCallbackEngine.java
new file mode 100644
index 000000000..5aec7852a
--- /dev/null
+++ b/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/ActivityCallbackEngine.java
@@ -0,0 +1,55 @@
+package com.twine.tango.sharedui.containers;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * Created by Roy on 11/7/2017.
+ */
+
+public class ActivityCallbackEngine {
+
+ private static ActivityCallbackEngine instance;
+
+ private Map<String, Runnable> callbacks;
+
+ private ActivityCallbackEngine() {
+ callbacks = new HashMap<>();
+ }
+
+ public static ActivityCallbackEngine getInstance() {
+ if (instance == null) {
+ instance = new ActivityCallbackEngine();
+ }
+
+ return instance;
+ }
+
+ public void putCallback(String key, Runnable callback) {
+ callbacks.put(key,callback);
+ }
+
+ public String putCallback(Runnable callback) {
+
+ String key = UUID.randomUUID().toString();
+ callbacks.put(key,callback);
+ return key;
+ }
+
+ public void removeCallback(String key)
+ {
+ callbacks.remove(key);
+ }
+
+ public void run(String key)
+ {
+ callbacks.get(key).run();
+ }
+
+ public void runAndRemove(String key)
+ {
+ callbacks.get(key).run();
+ removeCallback(key);
+ }
+}
diff --git a/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/FragmentBase.java b/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/FragmentBase.java
index 1c116edc4..19d472e24 100644
--- a/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/FragmentBase.java
+++ b/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/FragmentBase.java
@@ -1,6 +1,6 @@
package com.twine.tango.sharedui.containers;
-import android.support.v4.app.Fragment;
+import android.app.Fragment;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.os.Bundle;
@@ -9,13 +9,17 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Toast;
+
import com.mobsandgeeks.saripaar.ValidationError;
import com.mobsandgeeks.saripaar.Validator;
import com.twine.tango.sharedui.mvvm.ViewContract;
import com.twine.tango.sharedui.mvvm.ViewModelBase;
+
import java.lang.reflect.Method;
import java.util.List;
+
import javax.inject.Inject;
+
import butterknife.ButterKnife;
import io.reactivex.functions.Consumer;
@@ -80,13 +84,13 @@ public abstract class FragmentBase<BindingView extends ViewDataBinding, VM exten
public void onValidationFailed(List<ValidationError> errors) {
for (ValidationError error : errors) {
View view = error.getView();
- String message = error.getCollatedErrorMessage(this.getContext());
+ String message = error.getCollatedErrorMessage(this.getActivity().getBaseContext());
if (view instanceof EditText) {
view.requestFocus();
((EditText) view).setError(message);
} else {
- Toast.makeText(this.getContext(), message, Toast.LENGTH_SHORT).show();
+ Toast.makeText(this.getActivity().getBaseContext(), message, Toast.LENGTH_SHORT).show();
}
}
diff --git a/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/FragmentBaseV4.java b/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/FragmentBaseV4.java
new file mode 100644
index 000000000..7f56dd49e
--- /dev/null
+++ b/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/FragmentBaseV4.java
@@ -0,0 +1,107 @@
+package com.twine.tango.sharedui.containers;
+
+import android.support.v4.app.Fragment;
+import android.databinding.DataBindingUtil;
+import android.databinding.ViewDataBinding;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.EditText;
+import android.widget.Toast;
+import com.mobsandgeeks.saripaar.ValidationError;
+import com.mobsandgeeks.saripaar.Validator;
+import com.twine.tango.sharedui.mvvm.ViewContract;
+import com.twine.tango.sharedui.mvvm.ViewModelBase;
+import java.lang.reflect.Method;
+import java.util.List;
+import javax.inject.Inject;
+import butterknife.ButterKnife;
+import io.reactivex.functions.Consumer;
+
+public abstract class FragmentBaseV4<BindingView extends ViewDataBinding, VM extends ViewModelBase> extends Fragment implements ViewContract, Validator.ValidationListener {
+
+ private Consumer<Boolean> lastValidationConsumer;
+ private Validator validator;
+
+ @Inject
+ VM vm;
+
+ BindingView binding;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+
+ inject();
+ binding = DataBindingUtil.inflate(inflater,getLayoutId(),container,false);
+
+ try {
+
+ Method method = binding.getClass().getDeclaredMethod("setVm", vm.getClass());
+ method.invoke(binding, vm);
+
+ attachView();
+
+ ButterKnife.bind(this, binding.getRoot());
+
+ validator = new Validator(this);
+ validator.setValidationListener(this);
+
+ return binding.getRoot();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void attachView() {
+ vm.attachView(this);
+ }
+
+ @Override
+ public void validateFields(Consumer<Boolean> consumer) {
+ lastValidationConsumer = consumer;
+ validator.validate();
+ }
+
+ @Override
+ public void onValidationSucceeded() {
+ try {
+ lastValidationConsumer.accept(true);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void onValidationFailed(List<ValidationError> errors) {
+ for (ValidationError error : errors) {
+ View view = error.getView();
+ String message = error.getCollatedErrorMessage(this.getContext());
+
+ if (view instanceof EditText) {
+ view.requestFocus();
+ ((EditText) view).setError(message);
+ } else {
+ Toast.makeText(this.getContext(), message, Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ if (lastValidationConsumer != null) {
+ try {
+ lastValidationConsumer.accept(false);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ protected abstract int getLayoutId();
+
+ protected abstract void inject();
+
+ public abstract String getTitle();
+}
diff --git a/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/paging/PagerAdapter.java b/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/paging/PagerAdapter.java
index d326402a3..2e151cc01 100644
--- a/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/paging/PagerAdapter.java
+++ b/Software/Android-Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/paging/PagerAdapter.java
@@ -4,7 +4,7 @@ import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
-import com.twine.tango.sharedui.containers.FragmentBase;
+import com.twine.tango.sharedui.containers.FragmentBaseV4;
import java.util.ArrayList;
import java.util.List;
@@ -15,7 +15,7 @@ import java.util.List;
public class PagerAdapter extends FragmentPagerAdapter {
- private List<FragmentBase> fragments;
+ private List<FragmentBaseV4> fragments;
private int currentPosition;
public PagerAdapter(FragmentManager fm) {
@@ -24,12 +24,12 @@ public class PagerAdapter extends FragmentPagerAdapter {
fragments = new ArrayList<>();
}
- public void addFragment(FragmentBase fragment)
+ public void addFragment(FragmentBaseV4 fragment)
{
fragments.add(fragment);
}
- public void removeFragment(FragmentBase fragment)
+ public void removeFragment(FragmentBaseV4 fragment)
{
fragments.remove(fragment);
}
diff --git a/Software/Android-Studio/Tango.Stubs.UI/build.gradle b/Software/Android-Studio/Tango.Stubs.UI/build.gradle
index ae2d7b443..3dbe0dcd8 100644
--- a/Software/Android-Studio/Tango.Stubs.UI/build.gradle
+++ b/Software/Android-Studio/Tango.Stubs.UI/build.gradle
@@ -11,6 +11,7 @@ android {
targetSdkVersion 26
versionCode 1
versionName "1.0"
+ vectorDrawables.useSupportLibrary = true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
@@ -58,4 +59,5 @@ dependencies {
compile 'com.jakewharton:butterknife:8.7.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.7.0'
compile project(path: ':Tango.SharedUI')
+ implementation project(':Tango.Models')
}
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/AndroidManifest.xml b/Software/Android-Studio/Tango.Stubs.UI/src/main/AndroidManifest.xml
index 14db2fd2e..172ff0b37 100644
--- a/Software/Android-Studio/Tango.Stubs.UI/src/main/AndroidManifest.xml
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/AndroidManifest.xml
@@ -17,6 +17,8 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
+ <activity android:name=".views.stubs.StubsActivity" />
+ <activity android:name=".views.stub.StubActivity"></activity>
</application>
</manifest> \ No newline at end of file
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..095971534
--- /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.models.stubs.Stub;
+
+/**
+ * Created by Roy on 11/7/2017.
+ */
+
+public class StubSelectedEvent {
+
+ private Stub stub;
+
+ public Stub getStub() {
+ return stub;
+ }
+
+ public void setStub(Stub stub) {
+ this.stub = stub;
+ }
+
+ public StubSelectedEvent(Stub 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
index a45ab2973..70eb8d8c3 100644
--- 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
@@ -4,6 +4,8 @@ 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;
@@ -23,5 +25,9 @@ public interface ApplicationComponent {
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/ViewModelsModule.java b/Software/Android-Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ViewModelsModule.java
index d8f7c84d4..f684e2015 100644
--- 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
@@ -6,6 +6,8 @@ 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 javax.inject.Singleton;
@@ -27,8 +29,8 @@ public class ViewModelsModule {
@Provides
@Singleton
- public LoginFragmentVM provideLoginFragmentVM() {
- return new LoginFragmentVM();
+ public LoginFragmentVM provideLoginFragmentVM(Bus eventBus, NotificationProvider notificationProvider) {
+ return new LoginFragmentVM(eventBus, notificationProvider);
}
@Provides
@@ -36,4 +38,16 @@ public class ViewModelsModule {
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) {
+ return new StubActivityVM(eventBus, notificationProvider);
+ }
}
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
index b646a7930..4a8e32afd 100644
--- 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
@@ -1,15 +1,29 @@
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> {
+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
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
index fe0c67250..ae454465e 100644
--- 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
@@ -1,6 +1,16 @@
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.
@@ -8,6 +18,34 @@ import com.twine.tango.sharedui.mvvm.ViewModelBase;
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
index 9854bed14..ee8a04a70 100644
--- 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
@@ -1,49 +1,31 @@
package com.twine.tango.stubs.ui.views.main;
-import android.databinding.DataBindingUtil;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
+import android.content.Intent;
import android.os.Bundle;
-import android.support.design.widget.TabLayout;
-import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarDrawerToggle;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.EditText;
-import com.mobsandgeeks.saripaar.annotation.NotEmpty;
import com.twine.tango.sharedui.containers.ActivityBase;
-import com.twine.tango.sharedui.paging.PagerAdapter;
-import com.twine.tango.sharedui.paging.PagerZoomTransform;
+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 butterknife.BindView;
-
-public class MainActivity extends ActivityBase<ActivityMainBinding,MainActivityVM> implements MainActivityContract {
+public class MainActivity extends ActivityBase<ActivityMainBinding, MainActivityVM> implements MainActivityContract {
ActionBarDrawerToggle mDrawerToggle;
- public PagerAdapter pagerAdapter;
+ private Fragment currentFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- ViewPager pager = binding.viewPager;
- pager.setOnTouchListener(new View.OnTouchListener() { //Disable Swipe...
- @Override
- public boolean onTouch(View view, MotionEvent motionEvent) {
- pager.setCurrentItem(pager.getCurrentItem());
- return true;
- }
- });
- pagerAdapter = new PagerAdapter(getSupportFragmentManager());
- pagerAdapter.addFragment(new LoginFragment());
- pagerAdapter.addFragment(new SelectionFragment());
- pager.setAdapter(pagerAdapter);
- pager.setPageTransformer(false, new PagerZoomTransform());
- TabLayout tabLayout = binding.tabLayout;
- tabLayout.setupWithViewPager(pager);
+ //Load login fragment.
+ navigateTo(Navigation.LOGIN);
setSupportActionBar(findViewById(R.id.toolbar1));
//initializeSideMenu();
@@ -58,4 +40,27 @@ public class MainActivity extends ActivityBase<ActivityMainBinding,MainActivityV
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
index 944763c9f..3f27e29d9 100644
--- 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
@@ -8,4 +8,11 @@ import com.twine.tango.sharedui.mvvm.ViewContract;
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
index 1fe9426f4..7a6fe2a1f 100644
--- 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
@@ -1,39 +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;
- public DependencyProperty<String> text1;
- public ReadOnlyField<String> text2;
- public RelayCommand testCommand;
-
@Inject
public MainActivityVM(Bus eventBus, NotificationProvider notificationProvider) {
this.eventBus = eventBus;
this.notificationProvider = notificationProvider;
+ this.eventBus.register(this);
+ }
- text1 = new DependencyProperty<>("Hello Roy");
- text2 = FieldUtils.toField(FieldUtils.toObservable(text1).map(text -> text));
- testCommand = new RelayCommand(() -> {
-
- view.validateFields((valid) ->
- {
- if (valid) {
- notificationProvider.notify(text1.get());
- }
- });
- });
+ @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
index dda330d42..171aa562d 100644
--- 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
@@ -1,21 +1,19 @@
package com.twine.tango.stubs.ui.views.selection;
-import android.os.Bundle;
+import android.content.Intent;
import android.support.v4.app.Fragment;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
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> {
+public class SelectionFragment extends FragmentBase<FragmentSelectionBinding, SelectionFragmentVM> implements SelectionFragmentContract {
public SelectionFragment() {
@@ -37,4 +35,15 @@ public class SelectionFragment extends FragmentBase<FragmentSelectionBinding,Sel
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
index 86991c85b..0a00a9d5b 100644
--- 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
@@ -8,4 +8,11 @@ import com.twine.tango.sharedui.mvvm.ViewContract;
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
index e9facc8e9..989ab5083 100644
--- 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
@@ -1,10 +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..16fc1eafc
--- /dev/null
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivityVM.java
@@ -0,0 +1,40 @@
+package com.twine.tango.stubs.ui.views.stub;
+
+import com.squareup.otto.Bus;
+import com.squareup.otto.Subscribe;
+import com.twine.tango.models.stubs.Stub;
+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.ui.Events.StubSelectedEvent;
+
+import javax.inject.Inject;
+
+/**
+ * Created by Roy on 11/7/2017.
+ */
+
+public class StubActivityVM extends ViewModelBase<StubActivityContract>
+{
+ private Bus eventBus;
+ private NotificationProvider notificationProvider;
+
+ public DependencyProperty<Stub> stub;
+ public DependencyProperty<String> ss;
+
+ @Inject
+ public StubActivityVM(Bus eventBus, NotificationProvider notificationProvider) {
+
+ stub = new DependencyProperty<>();
+ ss = new DependencyProperty<>("Hi ROy");
+ this.eventBus = eventBus;
+ this.notificationProvider = notificationProvider;
+ this.eventBus.register(this);
+ }
+
+ @Subscribe
+ public void handleStubSelectedEvent(StubSelectedEvent e)
+ {
+ stub.set(e.getStub());
+ }
+}
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..fb189be32
--- /dev/null
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityContract.java
@@ -0,0 +1,14 @@
+package com.twine.tango.stubs.ui.views.stubs;
+
+import com.twine.tango.models.stubs.Stub;
+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..a22684698
--- /dev/null
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityVM.java
@@ -0,0 +1,63 @@
+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.squareup.otto.Subscribe;
+import com.twine.tango.models.stubs.Stub;
+import com.twine.tango.sharedui.mvvm.FieldUtils;
+import com.twine.tango.sharedui.mvvm.ViewModelBase;
+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<Stub> stubs;
+ public ItemBinding<String> stubBinding;
+ public ObservableField<Stub> 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)));
+
+ for (int i = 0; i < 20; i++) {
+ Stub s = new Stub();
+ s.setName("Stub " + i);
+ s.setDescription("Description " + i);
+ stubs.add(s);
+ }
+ }
+
+ public void onStubSelected(AdapterView<?> adapterView, View view, int i, long l) {
+ selectedStub.set((Stub) 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()));
+ });
+ }
+}
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/database.png b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/database.png
new file mode 100644
index 000000000..4263288e8
--- /dev/null
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/database.png
Binary files differ
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/ic_database.xml b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/ic_database.xml
new file mode 100644
index 000000000..010978dae
--- /dev/null
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/ic_database.xml
@@ -0,0 +1,17 @@
+<vector android:height="64dp" android:viewportHeight="57.0"
+ android:viewportWidth="57.0" android:width="64dp" xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="#545E73" android:pathData="M49.46,8L49.46,8C48.72,3.54 38.28,0 25.5,0S2.28,3.54 1.54,8l0,0H1.5v0.5V20v0.5V21v11v0.5V33v12h0.05c0.73,4.46 11.18,8 23.95,8s23.22,-3.54 23.95,-8H49.5V33v-0.5V32V21v-0.5V20V8.5V8H49.46z"/>
+ <path android:fillColor="#38454F" android:pathData="M25.5,41c-13.26,0 -24,-3.81 -24,-8.5V45h0.05c0.73,4.46 11.18,8 23.95,8s23.22,-3.54 23.95,-8H49.5V32.5C49.5,37.19 38.76,41 25.5,41z"/>
+ <path android:fillColor="#38454F" android:pathData="M1.5,32v0.5c0,-0.17 0.02,-0.33 0.05,-0.5H1.5z"/>
+ <path android:fillColor="#38454F" android:pathData="M49.46,32c0.03,0.17 0.05,0.33 0.05,0.5V32H49.46z"/>
+ <path android:fillColor="#556080" android:pathData="M25.5,29c-13.26,0 -24,-3.81 -24,-8.5V33h0.05c0.73,4.46 11.18,8 23.95,8s23.22,-3.54 23.95,-8H49.5V20.5C49.5,25.19 38.76,29 25.5,29z"/>
+ <path android:fillColor="#556080" android:pathData="M1.5,20v0.5c0,-0.17 0.02,-0.33 0.05,-0.5H1.5z"/>
+ <path android:fillColor="#556080" android:pathData="M49.46,20c0.03,0.17 0.05,0.33 0.05,0.5V20H49.46z"/>
+ <path android:fillColor="#91BAE1" android:pathData="M1.5,8.5a24,8.5 0,1 0,48 0a24,8.5 0,1 0,-48 0z"/>
+ <path android:fillColor="#8697CB" android:pathData="M25.5,17c-13.26,0 -24,-3.81 -24,-8.5V21h0.05c0.73,4.46 11.18,8 23.95,8s23.22,-3.54 23.95,-8H49.5V8.5C49.5,13.19 38.76,17 25.5,17z"/>
+ <path android:fillColor="#8697CB" android:pathData="M1.5,8v0.5c0,-0.17 0.02,-0.33 0.05,-0.5H1.5z"/>
+ <path android:fillColor="#8697CB" android:pathData="M49.46,8C49.48,8.17 49.5,8.33 49.5,8.5V8H49.46z"/>
+ <path android:fillColor="#BDC3C7" android:pathData="M55.5,43.85l-1.44,-0.28c-2.14,-0.41 -3.13,-2.92 -1.84,-4.68l0.91,-1.24l-1.96,-1.96l-1.22,0.82c-1.81,1.22 -4.27,0.15 -4.6,-2.01L45.12,33h-2.77l-0.36,1.87c-0.4,2.1 -2.82,3.1 -4.59,1.9l-1.57,-1.07l-1.96,1.96l0.91,1.24c1.29,1.76 0.31,4.26 -1.84,4.68L31.5,43.85v2.77l1.51,0.23c2.16,0.33 3.23,2.8 2.01,4.6l-0.82,1.22l1.96,1.96l1.24,-0.91c1.76,-1.29 4.26,-0.31 4.68,1.84L42.35,57h2.77l0.16,-1.07c0.34,-2.2 2.9,-3.26 4.69,-1.94l0.87,0.64l1.96,-1.96l-0.82,-1.22c-1.22,-1.81 -0.15,-4.27 2.01,-4.6l1.51,-0.23V43.85z"/>
+ <path android:fillColor="#FFFFFF" android:pathData="M43.5,45m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0"/>
+ <path android:fillColor="#ECF0F1" android:pathData="M43.5,50c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5s5,2.24 5,5S46.26,50 43.5,50zM43.5,42c-1.65,0 -3,1.35 -3,3s1.35,3 3,3s3,-1.35 3,-3S45.15,42 43.5,42z"/>
+</vector>
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/ic_play.xml b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/ic_play.xml
new file mode 100644
index 000000000..63c765d2b
--- /dev/null
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/ic_play.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M8,5v14l11,-7z"/>
+</vector>
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/ic_stop.xml b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/ic_stop.xml
new file mode 100644
index 000000000..bd94ea32f
--- /dev/null
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/ic_stop.xml
@@ -0,0 +1,4 @@
+<vector android:height="32dp" android:viewportHeight="24.0"
+ android:viewportWidth="24.0" android:width="32dp" xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="#FF000000" android:pathData="M6,6h12v12H6z"/>
+</vector>
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/ic_stubs.xml b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/ic_stubs.xml
new file mode 100644
index 000000000..8eea0f836
--- /dev/null
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/ic_stubs.xml
@@ -0,0 +1,6 @@
+<vector android:height="64dp" android:viewportHeight="504.123"
+ android:viewportWidth="504.123" android:width="64dp" xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="#415F6F" android:pathData="M486,355.4l18.1,-10.2c-1.2,-6.7 -2.8,-13.4 -5.1,-20.1h-20.9l-11.4,-20.1l10.6,-18.1c-4.3,-5.1 -9.1,-10.2 -14.6,-14.6l-18.1,10.2l-20.1,-11.8v-20.9c-0.4,0 -0.8,-0.4 -1.6,-0.4c-5.9,-2 -12.2,-3.9 -18.5,-5.1l-10.6,18.1h-23.2l-10.2,-18.1c-6.7,1.2 -13.4,2.8 -20.1,5.1v20.9l-20.1,11.4l-18.1,-10.6c-5.1,4.3 -10.2,9.1 -14.6,14.6l10.2,18.1l-11.8,20.1h-20.9c-2.4,6.7 -4.3,13 -5.5,19.7l18.1,10.6v23.2l-18.1,10.2c1.2,6.7 2.8,13.4 5.1,20.1h20.9l11.4,20.1l-10.6,18.1c4.3,5.1 9.1,10.2 14.6,14.6l18.1,-10.2l20.1,11.8v20.9c0.4,0 0.8,0.4 1.6,0.4c5.9,2 12.2,3.9 18.5,5.1l10.6,-18.1h23.2l10.2,18.1c6.7,-1.2 13.4,-2.8 20.1,-5.1v-20.9l20.1,-11.4l18.1,10.6c5.1,-4.3 10.2,-9.1 14.6,-14.6l-10.2,-18.1l11.8,-20.1h20.9c2.4,-6.7 4.3,-13 5.5,-19.7l-18.1,-10.6V355.4zM382,435c-37.8,0 -68.9,-30.7 -68.9,-68.5s30.7,-68.9 68.9,-68.9c37.8,0 68.9,30.7 68.9,68.5S419.8,435 382,435z"/>
+ <path android:fillColor="#26A6D1" android:pathData="M274.9,240c0,-7.5 -0.4,-15.4 -1.6,-22.8l-22.4,-4.7l-8.3,-24.4l15.4,-17.3c-3.5,-6.7 -7.9,-13 -12.6,-18.9l-22.1,7.5l-19.3,-16.9l4.7,-22.8c-6.7,-3.9 -13.4,-7.5 -20.5,-10.2l-15,17.3l-25.2,-5.1l-7.5,-22.1c-7.5,0 -15.4,0.4 -22.8,1.6l-4.7,22.4l-24.4,8.3l-17.3,-15.4c-6.7,3.5 -13,7.9 -18.9,12.6l7.5,22.1l-16.9,19.3l-22.8,-4.7c-3.9,6.7 -7.5,13.4 -10.2,20.5l17.3,15.4l-5.1,25.2L0,233.7c0,7.5 0.4,15.4 1.6,22.8l22.8,4.7l8.3,24.4l-15.4,17.3c3.5,6.7 7.9,13 12.6,18.9l22.1,-7.5l19.3,16.9l-5.1,22.8c6.7,3.9 13.4,7.5 20.5,10.2l15.4,-17.3l25.2,5.1l7.5,22.1c7.5,0 15.4,-0.4 22.8,-1.6l4.7,-22.4l24.4,-8.3l17.3,15.4c6.7,-3.5 13,-7.9 18.9,-12.6l-7.5,-22.1l16.9,-19.3l22.8,4.7c3.9,-6.7 7.5,-13.4 10.2,-20.5l-17.3,-15.4l5.1,-25.2L274.9,240L274.9,240zM137.5,312.9c-42.1,0 -76.4,-34.3 -76.4,-76.4s34.3,-76.4 76.4,-76.4s76.4,34.3 76.4,76.4S179.6,312.9 137.5,312.9z"/>
+ <path android:fillColor="#638090" android:pathData="M456.9,125l16.5,-6.7c-0.4,-5.9 -1.2,-11.8 -2.4,-17.7l-17.7,-2.4l-7.5,-18.5l11,-14.2c-3.2,-5.1 -6.7,-9.8 -10.6,-14.2l-16.5,6.7l-15.8,-12.2l2.4,-17.7l-1.2,-0.8c-5.1,-2.4 -10.2,-4.7 -15.4,-6.3l-11,14.2l-19.7,-2.8l-6.7,-16.9c-5.9,0.4 -11.8,0.8 -17.7,2l-2.4,17.7l-18.9,7.9L309.2,32.1c-5.1,3.2 -9.8,6.7 -14.2,10.6l6.7,16.5l-12.2,15.8l-17.7,-2.4c-2.8,5.1 -5.1,10.6 -7.1,16.5l14.2,11l-2.8,19.7l-16.5,6.7c0.4,5.9 1.2,11.8 2.4,17.7l17.7,2.4l7.5,18.5l-11,14.2c3.2,5.1 6.7,9.8 10.6,14.2l16.5,-6.7l15.8,12.2l-2.4,17.7l1.2,0.8c5.1,2.4 10.2,4.7 15.4,6.3l11,-14.2l19.7,2.8l6.7,16.5c5.9,-0.4 11.8,-0.8 17.7,-2.4l2.4,-17.7l18.5,-7.5l14.2,11c5.1,-3.2 9.8,-6.7 14.2,-10.6l-6.7,-16.5l12.2,-15.8l17.7,2.4c2.8,-5.1 5.1,-10.6 7.1,-16.5l-14.2,-11C453.7,144.3 456.9,125 456.9,125zM366.7,183.3c-33.9,0 -61,-27.2 -61,-61s27.2,-61 61,-61s61,27.2 61,61S400.5,183.3 366.7,183.3z"/>
+</vector>
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/list_view_selectable.xml b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/list_view_selectable.xml
new file mode 100644
index 000000000..8895ad0ae
--- /dev/null
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/list_view_selectable.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@color/colorAccent" android:state_activated="true" />
+</selector> \ No newline at end of file
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/stubs.png b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/stubs.png
new file mode 100644
index 000000000..5d6249d61
--- /dev/null
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/stubs.png
Binary files differ
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/user.png b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/user.png
new file mode 100644
index 000000000..8d700439a
--- /dev/null
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/drawable/user.png
Binary files differ
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/activity_main.xml b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/activity_main.xml
index b96743542..2a3ae6a77 100644
--- a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/activity_main.xml
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/activity_main.xml
@@ -31,23 +31,18 @@
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_below="@+id/toolbar1">
+ android:layout_below="@+id/toolbar1"
+ android:layout_alignParentStart="true">
- <android.support.design.widget.TabLayout
- android:id="@+id/tabLayout"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- </android.support.design.widget.TabLayout>
- <android.support.v4.view.ViewPager
- android:id="@+id/viewPager"
+ <FrameLayout
+ android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_alignParentStart="true"
- android:layout_below="@+id/tabLayout">
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true">
- </android.support.v4.view.ViewPager>
+ </FrameLayout>
</RelativeLayout>
</RelativeLayout>
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/activity_stub.xml b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/activity_stub.xml
new file mode 100644
index 000000000..fb9891f69
--- /dev/null
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/activity_stub.xml
@@ -0,0 +1,145 @@
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:bind="http://schemas.android.com/apk/res-auto">
+
+ <data>
+
+ <variable
+ name="vm"
+ type="com.twine.tango.stubs.ui.views.stub.StubActivityVM" />
+ </data>
+
+ <RelativeLayout xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layoutDirection="ltr"
+ tools:context="com.twine.tango.stubs.ui.views.stub.StubActivity">
+
+ <RelativeLayout
+ android:id="@+id/top_bar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="?attr/colorPrimary">
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dp">
+
+ <ImageView
+ android:id="@+id/imageView"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ bind:srcCompat="@drawable/stubs" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_margin="10dp"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/textView3"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="Stub Name"
+ android:textSize="18sp" />
+
+ <TextView
+ android:id="@+id/textView4"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="Description" />
+ </LinearLayout>
+ </LinearLayout>
+ </RelativeLayout>
+
+ <FrameLayout
+ android:id="@+id/frame_params"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_above="@+id/frame_response"
+ android:layout_alignParentBottom="false"
+ android:layout_alignParentEnd="false"
+ android:layout_alignParentStart="false"
+ android:layout_alignParentTop="false"
+ android:layout_below="@+id/top_bar">
+
+ </FrameLayout>
+
+ <FrameLayout
+ android:id="@+id/frame_response"
+ android:layout_width="match_parent"
+ android:layout_height="150dp"
+ android:layout_above="@+id/bottom_bar"
+ android:paddingLeft="5dp"
+ android:paddingRight="5dp">
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <TextView
+ android:id="@+id/textView5"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentStart="true"
+ android:layout_alignParentTop="true"
+ android:background="@android:drawable/alert_dark_frame"
+ android:paddingLeft="20dp"
+ android:paddingTop="12dp"
+ android:text="Log" />
+
+ <EditText
+ android:id="@+id/editText"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentTop="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="5dp"
+ android:layout_marginLeft="20dp"
+ android:layout_marginTop="45dp"
+ android:background="@android:color/black"
+ android:ems="10"
+ android:gravity="top"
+ android:inputType="textMultiLine"
+ android:text="@android:string/defaultMsisdnAlphaTag"
+ android:textSize="12sp" />
+ </RelativeLayout>
+ </FrameLayout>
+
+ <RelativeLayout
+ android:id="@+id/bottom_bar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="0dp"
+ android:background="?attr/colorPrimary"
+ android:padding="5dp">
+
+ <ImageButton
+ android:id="@+id/imageButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentTop="true"
+ android:tint="@color/colorPlay"
+ bind:srcCompat="@drawable/ic_play" />
+
+ <ImageButton
+ android:id="@+id/imageButton2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_toStartOf="@+id/imageButton"
+ android:tint="@color/colorStop"
+ bind:srcCompat="@drawable/ic_stop" />
+
+ </RelativeLayout>
+ </RelativeLayout>
+</layout>
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/activity_stubs.xml b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/activity_stubs.xml
new file mode 100644
index 000000000..bb0598073
--- /dev/null
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/activity_stubs.xml
@@ -0,0 +1,31 @@
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:bind="http://schemas.android.com/apk/res-auto">
+
+ <data>
+ <variable
+ name="vm"
+ type="com.twine.tango.stubs.ui.views.stubs.StubsActivityVM" />
+ </data>
+
+ <RelativeLayout xmlns:tools="http://schemas.android.com/tools"
+ android:layoutDirection="ltr"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context="com.twine.tango.stubs.ui.views.stubs.StubsActivity">
+
+
+ <ListView
+ android:id="@+id/listResults"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:onItemClick="@{vm::onStubSelected}"
+ android:selectedItemPosition="@{vm.selectedStubIndex}"
+ android:choiceMode="singleChoice"
+ app:items="@{vm.stubs}"
+ app:itemBinding="@{vm.stubBinding}"/>
+
+ </RelativeLayout>
+</layout>
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/fragment_login.xml b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/fragment_login.xml
index fb3b154b3..db174541a 100644
--- a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/fragment_login.xml
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/fragment_login.xml
@@ -1,4 +1,5 @@
<layout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
@@ -15,6 +16,52 @@
android:paddingRight="40dp"
tools:context="com.twine.tango.stubs.ui.views.login.LoginFragment">
+ <ImageView
+ android:id="@+id/imageView2"
+ android:layout_width="150dp"
+ android:layout_height="150dp"
+ android:layout_alignParentTop="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginTop="34dp"
+ app:srcCompat="@drawable/user" />
+
+ <EditText
+ android:id="@+id/txtEmail"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentStart="true"
+ android:layout_below="@+id/imageView2"
+ android:layout_marginTop="41dp"
+ android:ems="10"
+ android:hint="Email"
+ android:inputType="textEmailAddress"
+ android:text="@={vm.email}" />
+
+ <EditText
+ android:textDirection="ltr"
+ android:layoutDirection="ltr"
+ android:id="@+id/txtPassword"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentStart="true"
+ android:layout_below="@+id/txtEmail"
+ android:layout_marginTop="40dp"
+ android:ems="10"
+ android:hint="Password"
+ android:inputType="textPassword"
+ android:text="@={vm.password}" />
+
+ <Button
+ android:id="@+id/btnLogin"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentStart="true"
+ android:layout_marginTop="20dp"
+ android:layout_below="@id/txtPassword"
+ android:command="@{vm.loginCommand}"
+ android:padding="20dp"
+ android:text="LOGIN" />
</RelativeLayout>
</layout>
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/fragment_selection.xml b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/fragment_selection.xml
index b8c467f40..938f06e32 100644
--- a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/fragment_selection.xml
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/fragment_selection.xml
@@ -1,4 +1,5 @@
<layout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
@@ -11,10 +12,52 @@
android:layoutDirection="ltr"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:paddingLeft="40dp"
- android:paddingRight="40dp"
tools:context="com.twine.tango.stubs.ui.views.selection.SelectionFragment">
+ <TextView
+ android:id="@+id/textView"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="40dp"
+ android:gravity="center"
+ android:text="Select Test Category"
+ android:textSize="24sp" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_below="@+id/textView"
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:gravity="center"
+ android:orientation="vertical">
+
+ <Button
+ android:id="@+id/btnStubs"
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:layout_marginBottom="10dp"
+ android:layout_marginLeft="50dp"
+ android:layout_marginRight="50dp"
+ android:drawablePadding="-30dp"
+ android:drawableStart="@drawable/ic_stubs"
+ android:text="STUBS"
+ android:command="@{vm.openStubsCommand}"
+ android:textSize="18sp" />
+
+ <Button
+ android:id="@+id/btnDB"
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:layout_marginLeft="50dp"
+ android:layout_marginRight="50dp"
+ android:drawablePadding="-30dp"
+ android:drawableStart="@drawable/ic_database"
+ android:command="@{vm.openDataBaseCommand}"
+ android:text="DATA BASE"
+ android:textSize="18sp" />
+
+ </LinearLayout>
</RelativeLayout>
</layout>
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/stubs_listview_item.xml b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/stubs_listview_item.xml
new file mode 100644
index 000000000..62edcb607
--- /dev/null
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/layout/stubs_listview_item.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <data>
+ <variable
+ name="stub"
+ type="com.twine.tango.models.stubs.Stub"/>
+ </data>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:background="@drawable/list_view_selectable"
+ android:padding="5dp">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@{stub.name}"
+ android:textSize="18sp" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="10dp"
+ android:text="@{stub.description}" />
+ </LinearLayout>
+</layout> \ No newline at end of file
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/values/colors.xml b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/values/colors.xml
index 3ab3e9cbc..29b840969 100644
--- a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/values/colors.xml
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/values/colors.xml
@@ -3,4 +3,6 @@
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
+ <color name="colorPlay">#5df15d</color>
+ <color name="colorStop">#f24954</color>
</resources>
diff --git a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/values/strings.xml b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/values/strings.xml
index e3910978c..7160cf9f5 100644
--- a/Software/Android-Studio/Tango.Stubs.UI/src/main/res/values/strings.xml
+++ b/Software/Android-Studio/Tango.Stubs.UI/src/main/res/values/strings.xml
@@ -1,5 +1,5 @@
<resources>
- <string name="app_name">Tango.Stubs.UI</string>
+ <string name="app_name">Tango Machine Tester</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
diff --git a/Software/Android-Studio/settings.gradle b/Software/Android-Studio/settings.gradle
index 5e745d3e5..4a207ac0e 100644
--- a/Software/Android-Studio/settings.gradle
+++ b/Software/Android-Studio/settings.gradle
@@ -1 +1 @@
-include ':app', ':Tango.PMR', ':Tango.BL', ':Tango.Stubs.UI', ':Tango.Core', ':Tango.SharedUI', ':Tango.DAL'
+include ':app', ':Tango.PMR', ':Tango.BL', ':Tango.Stubs.UI', ':Tango.Core', ':Tango.SharedUI', ':Tango.DAL', ':Tango.Models'