diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2017-11-16 13:38:56 +0200 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2017-11-16 13:38:56 +0200 |
| commit | 914f4db513477d9aff726546bac47545195a3e37 (patch) | |
| tree | d2ff190fd84b1dfaa03eec76563c431592ece7ff /Software/Android_Studio | |
| parent | 65d01ff549d80fbe13ff5e966df216c9f7c03653 (diff) | |
| download | Tango-914f4db513477d9aff726546bac47545195a3e37.tar.gz Tango-914f4db513477d9aff726546bac47545195a3e37.zip | |
Rename "Visual Studio" to "Visual_Studio"
Rename "External Repositories" to "External_Repositories".
Diffstat (limited to 'Software/Android_Studio')
238 files changed, 12635 insertions, 0 deletions
diff --git a/Software/Android_Studio/.gitignore b/Software/Android_Studio/.gitignore new file mode 100644 index 000000000..39fb081a4 --- /dev/null +++ b/Software/Android_Studio/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/Software/Android_Studio/Tango.BL/.gitignore b/Software/Android_Studio/Tango.BL/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/Software/Android_Studio/Tango.BL/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Software/Android_Studio/Tango.BL/CMakeLists.txt b/Software/Android_Studio/Tango.BL/CMakeLists.txt new file mode 100644 index 000000000..201e7c537 --- /dev/null +++ b/Software/Android_Studio/Tango.BL/CMakeLists.txt @@ -0,0 +1,45 @@ +# For more information about using CMake with Android Studio, read the +# documentation: https://d.android.com/studio/projects/add-native-code.html + +# Sets the minimum version of CMake required to build the native library. + +cmake_minimum_required(VERSION 3.4.1) + +# Creates and names a library, sets it as either STATIC +# or SHARED, and provides the relative paths to its source code. +# You can define multiple libraries, and CMake builds them for you. +# Gradle automatically packages shared libraries with your APK. + +add_library( # Sets the name of the library. + native-lib + + # Sets the library as a shared library. + SHARED + + # Provides a relative path to your source file(s). + src/main/cpp/native-lib.cpp + src/main/cpp/OtherClass.cpp ) + +# Searches for a specified prebuilt library and stores the path as a +# variable. Because CMake includes system libraries in the search path by +# default, you only need to specify the name of the public NDK library +# you want to add. CMake verifies that the library exists before +# completing its build. + +find_library( # Sets the name of the path variable. + log-lib + + # Specifies the name of the NDK library that + # you want CMake to locate. + log ) + +# Specifies libraries CMake should link to your target library. You +# can link multiple libraries, such as libraries you define in this +# build script, prebuilt third-party libraries, or system libraries. + +target_link_libraries( # Specifies the target library. + native-lib + + # Links the target library to the log library + # included in the NDK. + ${log-lib} )
\ No newline at end of file diff --git a/Software/Android_Studio/Tango.BL/build.gradle b/Software/Android_Studio/Tango.BL/build.gradle new file mode 100644 index 000000000..f93ac6d3d --- /dev/null +++ b/Software/Android_Studio/Tango.BL/build.gradle @@ -0,0 +1,42 @@ +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" + externalNativeBuild { + cmake { + cppFlags "-std=c++11 -frtti -fexceptions" + } + } + + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + externalNativeBuild { + cmake { + path "CMakeLists.txt" + } + } +} + +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.BL/proguard-rules.pro b/Software/Android_Studio/Tango.BL/proguard-rules.pro new file mode 100644 index 000000000..a0eef131a --- /dev/null +++ b/Software/Android_Studio/Tango.BL/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.BL/src/androidTest/java/com/twine/tango/bl/ExampleInstrumentedTest.java b/Software/Android_Studio/Tango.BL/src/androidTest/java/com/twine/tango/bl/ExampleInstrumentedTest.java new file mode 100644 index 000000000..53e0be06b --- /dev/null +++ b/Software/Android_Studio/Tango.BL/src/androidTest/java/com/twine/tango/bl/ExampleInstrumentedTest.java @@ -0,0 +1,29 @@ +package com.twine.tango.bl; + +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(); + + Example e = new Example(); + e.Do(); + + assertEquals("com.twine.tango.bl.test", appContext.getPackageName()); + } +} diff --git a/Software/Android_Studio/Tango.BL/src/main/AndroidManifest.xml b/Software/Android_Studio/Tango.BL/src/main/AndroidManifest.xml new file mode 100644 index 000000000..29e67ea39 --- /dev/null +++ b/Software/Android_Studio/Tango.BL/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.twine.tango.bl" /> diff --git a/Software/Android_Studio/Tango.BL/src/main/cpp/Android.mk b/Software/Android_Studio/Tango.BL/src/main/cpp/Android.mk new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/Software/Android_Studio/Tango.BL/src/main/cpp/Android.mk diff --git a/Software/Android_Studio/Tango.BL/src/main/cpp/OtherClass.cpp b/Software/Android_Studio/Tango.BL/src/main/cpp/OtherClass.cpp new file mode 100644 index 000000000..50d6304dd --- /dev/null +++ b/Software/Android_Studio/Tango.BL/src/main/cpp/OtherClass.cpp @@ -0,0 +1,9 @@ +// +// Created by Roy on 11/5/2017. +// + +#include "OtherClass.h" + +string OtherClass::getString(string str) { + return str; +} diff --git a/Software/Android_Studio/Tango.BL/src/main/cpp/OtherClass.h b/Software/Android_Studio/Tango.BL/src/main/cpp/OtherClass.h new file mode 100644 index 000000000..0efe65b71 --- /dev/null +++ b/Software/Android_Studio/Tango.BL/src/main/cpp/OtherClass.h @@ -0,0 +1,19 @@ +// +// Created by Roy on 11/5/2017. +// +#include <string> + +using namespace std; + +#ifndef ANDROID_STUDIO_OTHERCLASS_H +#define ANDROID_STUDIO_OTHERCLASS_H + + +class OtherClass { + +public: + string getString(string str); +}; + + +#endif //ANDROID_STUDIO_OTHERCLASS_H diff --git a/Software/Android_Studio/Tango.BL/src/main/cpp/native-lib.cpp b/Software/Android_Studio/Tango.BL/src/main/cpp/native-lib.cpp new file mode 100644 index 000000000..c7317d615 --- /dev/null +++ b/Software/Android_Studio/Tango.BL/src/main/cpp/native-lib.cpp @@ -0,0 +1,18 @@ +#include <jni.h> +#include <string> +#include "OtherClass.h" + +extern "C" +JNIEXPORT jstring + +JNICALL +Java_com_twine_tango_bl_Example_getString( + JNIEnv *env, + jobject /* this */) +{ + + OtherClass c; + + std::string hello = "Hello from C++" + c.getString(" Some String"); + return env->NewStringUTF(hello.c_str()); +} diff --git a/Software/Android_Studio/Tango.BL/src/main/java/com/twine/tango/bl/Example.java b/Software/Android_Studio/Tango.BL/src/main/java/com/twine/tango/bl/Example.java new file mode 100644 index 000000000..992ddf16f --- /dev/null +++ b/Software/Android_Studio/Tango.BL/src/main/java/com/twine/tango/bl/Example.java @@ -0,0 +1,21 @@ +package com.twine.tango.bl; + +import android.util.Log; + +/** + * Created by Roy on 11/2/2017. + */ + +public class Example { + public native String getString(); + + static { + System.loadLibrary("native-lib"); + } + + public void Do() + { + String a = getString(); + Log.i("NATIVE NATIVE",a); + } +} diff --git a/Software/Android_Studio/Tango.BL/src/main/res/values/strings.xml b/Software/Android_Studio/Tango.BL/src/main/res/values/strings.xml new file mode 100644 index 000000000..5c465ac04 --- /dev/null +++ b/Software/Android_Studio/Tango.BL/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">Tango.BL</string> +</resources> diff --git a/Software/Android_Studio/Tango.BL/src/test/java/com/twine/tango/bl/ExampleUnitTest.java b/Software/Android_Studio/Tango.BL/src/test/java/com/twine/tango/bl/ExampleUnitTest.java new file mode 100644 index 000000000..5db76b579 --- /dev/null +++ b/Software/Android_Studio/Tango.BL/src/test/java/com/twine/tango/bl/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.twine.tango.bl; + +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.Core/.gitignore b/Software/Android_Studio/Tango.Core/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/Software/Android_Studio/Tango.Core/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Software/Android_Studio/Tango.Core/build.gradle b/Software/Android_Studio/Tango.Core/build.gradle new file mode 100644 index 000000000..36a8dfafb --- /dev/null +++ b/Software/Android_Studio/Tango.Core/build.gradle @@ -0,0 +1,32 @@ +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' + } + } +} + +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.Core/proguard-rules.pro b/Software/Android_Studio/Tango.Core/proguard-rules.pro new file mode 100644 index 000000000..a0eef131a --- /dev/null +++ b/Software/Android_Studio/Tango.Core/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.Core/src/androidTest/java/com/twine/tango/core/ExampleInstrumentedTest.java b/Software/Android_Studio/Tango.Core/src/androidTest/java/com/twine/tango/core/ExampleInstrumentedTest.java new file mode 100644 index 000000000..dd94a8561 --- /dev/null +++ b/Software/Android_Studio/Tango.Core/src/androidTest/java/com/twine/tango/core/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.twine.tango.core; + +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.core.test", appContext.getPackageName()); + } +} diff --git a/Software/Android_Studio/Tango.Core/src/main/AndroidManifest.xml b/Software/Android_Studio/Tango.Core/src/main/AndroidManifest.xml new file mode 100644 index 000000000..ac8559e1a --- /dev/null +++ b/Software/Android_Studio/Tango.Core/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.twine.tango.core" /> diff --git a/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Action.java b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Action.java new file mode 100644 index 000000000..570c30c43 --- /dev/null +++ b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Action.java @@ -0,0 +1,11 @@ +package com.twine.tango.core; + +/** + * Created by Roy on 11/13/2017. + */ + +public interface Action<T> { + + void invoke(T e); + +} diff --git a/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/ContextFactory.java b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/ContextFactory.java new file mode 100644 index 000000000..e3a08dad1 --- /dev/null +++ b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/ContextFactory.java @@ -0,0 +1,22 @@ +package com.twine.tango.core; + +import android.content.Context; + +/** + * Created by Roy on 11/14/2017. + */ + +public class ContextFactory +{ + private static Context appContext; + + public static void init(Context context) + { + appContext = context; + } + + public static Context getApplicationContext() + { + return appContext; + } +} diff --git a/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/EventHandler.java b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/EventHandler.java new file mode 100644 index 000000000..cb455ab4e --- /dev/null +++ b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/EventHandler.java @@ -0,0 +1,11 @@ +package com.twine.tango.core; + +/** + * Created by Roy on 11/13/2017. + */ + +public interface EventHandler<T> { + + void invoke(Object sender,T e); + +} diff --git a/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Func.java b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Func.java new file mode 100644 index 000000000..a0df10ed6 --- /dev/null +++ b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Func.java @@ -0,0 +1,11 @@ +package com.twine.tango.core; + +/** + * Created by Roy on 11/13/2017. + */ + +public interface Func<TOut> { + + TOut invoke(); + +} diff --git a/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/IDisposable.java b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/IDisposable.java new file mode 100644 index 000000000..109f4e23b --- /dev/null +++ b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/IDisposable.java @@ -0,0 +1,15 @@ +package com.twine.tango.core; + + +/** + * Represents a disposable object. + */ +public interface IDisposable { + + + /** + * Release any resources which are occupied by this object. + */ + void dispose(); + +} diff --git a/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/ObjectDisposedException.java b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/ObjectDisposedException.java new file mode 100644 index 000000000..5cd676c7e --- /dev/null +++ b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/ObjectDisposedException.java @@ -0,0 +1,12 @@ +package com.twine.tango.core; + +/** + * Created by Roy on 11/13/2017. + */ + +public class ObjectDisposedException extends IllegalAccessException { + + public ObjectDisposedException(String s) { + super(s); + } +} diff --git a/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/ObservableCollection.java b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/ObservableCollection.java new file mode 100644 index 000000000..7775a55ee --- /dev/null +++ b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/ObservableCollection.java @@ -0,0 +1,213 @@ +package com.twine.tango.core; + +import android.support.annotation.NonNull; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + + +/** + * Represents an observable collection with change notification. + * + * @param <T> the type parameter + */ +public class ObservableCollection<T> implements List<T> { + + /** + * The interface On changed listener. + */ + public interface OnChangedListener { + /** + * On change. + */ + void onChange(); + } + + private List<T> list; + private OnChangedListener onChangedListener; + + /** + * Sets on change listener. + * + * @param listener the listener + */ + public void setOnChangeListener(OnChangedListener listener) { + this.onChangedListener = listener; + } + + + /** + * Clear on change listener. + */ + public void clearOnChangeListener() + { + this.onChangedListener = null; + } + + /** + * On change. + */ + protected void onChange() { + if (this.onChangedListener != null) { + this.onChangedListener.onChange(); + } + } + + /** + * Instantiates a new Observable collection. + */ + public ObservableCollection() { + list = new ArrayList<>(); + } + + @Override + public int size() { + return list.size(); + } + + @Override + public boolean isEmpty() { + return list.isEmpty(); + } + + @Override + public boolean contains(Object o) { + return list.contains(o); + } + + @NonNull + @Override + public Iterator<T> iterator() { + return list.iterator(); + } + + @NonNull + @Override + public Object[] toArray() { + return list.toArray(); + } + + @NonNull + @Override + public <T1> T1[] toArray(@NonNull T1[] t1s) { + return list.toArray(t1s); + } + + @Override + public boolean add(T t) { + boolean result = list.add(t); + onChange(); + return result; + } + + @Override + public boolean remove(Object o) { + boolean result = list.remove(o); + onChange(); + return result; + } + + @Override + public boolean containsAll(@NonNull Collection<?> collection) { + return list.containsAll(collection); + } + + @Override + public boolean addAll(@NonNull Collection<? extends T> collection) { + boolean result = list.addAll(collection); + onChange(); + return result; + } + + @Override + public boolean addAll(int i, @NonNull Collection<? extends T> collection) { + boolean result = list.addAll(i, collection); + onChange(); + return result; + } + + @Override + public boolean removeAll(@NonNull Collection<?> collection) { + boolean result = list.removeAll(collection); + onChange(); + return result; + } + + @Override + public boolean retainAll(@NonNull Collection<?> collection) { + boolean result = list.retainAll(collection); + onChange(); + return result; + } + + @Override + public void clear() { + list.clear(); + onChange(); + } + + @Override + public boolean equals(Object o) { + return list.equals(o); + } + + @Override + public int hashCode() { + return list.hashCode(); + } + + @Override + public T get(int i) { + return list.get(i); + } + + @Override + public T set(int i, T t) { + T result = list.set(i, t); + onChange(); + return result; + } + + @Override + public void add(int i, T t) { + list.add(i,t); + onChange(); + } + + @Override + public T remove(int i) { + T result = list.remove(i); + onChange(); + return result; + } + + @Override + public int indexOf(Object o) { + return list.indexOf(o); + } + + @Override + public int lastIndexOf(Object o) { + return list.lastIndexOf(o); + } + + @NonNull + @Override + public ListIterator<T> listIterator() { + return listIterator(); + } + + @NonNull + @Override + public ListIterator<T> listIterator(int i) { + return listIterator(i); + } + + @NonNull + @Override + public List<T> subList(int i, int i1) { + return list.subList(i,i1); + } +} diff --git a/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Reflections.java b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Reflections.java new file mode 100644 index 000000000..a986d6e80 --- /dev/null +++ b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Reflections.java @@ -0,0 +1,40 @@ +package com.twine.tango.core; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Roy on 11/13/2017. + */ + +public class Reflections { + + public static List<String> getReflectionListFromResource(int id) + { + List<String> list = new ArrayList<>(); + + BufferedReader inputStream = new BufferedReader(new InputStreamReader(ContextFactory.getApplicationContext().getResources().openRawResource(id))); + + String line; + + try + { + while ((line = inputStream.readLine()) != null) + { + if (!line.isEmpty()) + { + list.add(line); + } + } + } catch (IOException e) + { + e.printStackTrace(); + } + + return list; + } + +} diff --git a/Software/Android_Studio/Tango.Core/src/main/res/values/strings.xml b/Software/Android_Studio/Tango.Core/src/main/res/values/strings.xml new file mode 100644 index 000000000..fd639f5b6 --- /dev/null +++ b/Software/Android_Studio/Tango.Core/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">Tango.Core</string> +</resources> diff --git a/Software/Android_Studio/Tango.Core/src/test/java/com/twine/tango/core/ExampleUnitTest.java b/Software/Android_Studio/Tango.Core/src/test/java/com/twine/tango/core/ExampleUnitTest.java new file mode 100644 index 000000000..b6f700635 --- /dev/null +++ b/Software/Android_Studio/Tango.Core/src/test/java/com/twine/tango/core/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.twine.tango.core; + +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.DAL/.gitignore b/Software/Android_Studio/Tango.DAL/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/Software/Android_Studio/Tango.DAL/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Software/Android_Studio/Tango.DAL/build.gradle b/Software/Android_Studio/Tango.DAL/build.gradle new file mode 100644 index 000000000..dd45e60cd --- /dev/null +++ b/Software/Android_Studio/Tango.DAL/build.gradle @@ -0,0 +1,8 @@ +apply plugin: 'java-library' + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) +} + +sourceCompatibility = "1.7" +targetCompatibility = "1.7" diff --git a/Software/Android_Studio/Tango.DAL/src/main/java/com/twine/tango/dal/myClass.java b/Software/Android_Studio/Tango.DAL/src/main/java/com/twine/tango/dal/myClass.java new file mode 100644 index 000000000..1e28b85bb --- /dev/null +++ b/Software/Android_Studio/Tango.DAL/src/main/java/com/twine/tango/dal/myClass.java @@ -0,0 +1,4 @@ +package com.twine.tango.dal; + +public class myClass { +} diff --git a/Software/Android_Studio/Tango.Integration/.gitignore b/Software/Android_Studio/Tango.Integration/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/Software/Android_Studio/Tango.Integration/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Software/Android_Studio/Tango.Integration/build.gradle b/Software/Android_Studio/Tango.Integration/build.gradle new file mode 100644 index 000000000..dc482d641 --- /dev/null +++ b/Software/Android_Studio/Tango.Integration/build.gradle @@ -0,0 +1,46 @@ +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' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + dexOptions { + preDexLibraries = false + } +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + 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' + compile globalDependencies.rxJavaAndroid + compile globalDependencies.rxJava + compile globalDependencies.logging + compile globalDependencies.dagger + compile globalDependencies.daggerAndroid + implementation project(':Tango.PMR') +} diff --git a/Software/Android_Studio/Tango.Integration/proguard-rules.pro b/Software/Android_Studio/Tango.Integration/proguard-rules.pro new file mode 100644 index 000000000..a0eef131a --- /dev/null +++ b/Software/Android_Studio/Tango.Integration/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.Integration/src/androidTest/java/com/twine/tango/integration/ExampleInstrumentedTest.java b/Software/Android_Studio/Tango.Integration/src/androidTest/java/com/twine/tango/integration/ExampleInstrumentedTest.java new file mode 100644 index 000000000..52db49c5f --- /dev/null +++ b/Software/Android_Studio/Tango.Integration/src/androidTest/java/com/twine/tango/integration/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.twine.tango.integration; + +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.integration.test", appContext.getPackageName()); + } +} diff --git a/Software/Android_Studio/Tango.Integration/src/main/AndroidManifest.xml b/Software/Android_Studio/Tango.Integration/src/main/AndroidManifest.xml new file mode 100644 index 000000000..b57dcb665 --- /dev/null +++ b/Software/Android_Studio/Tango.Integration/src/main/AndroidManifest.xml @@ -0,0 +1,6 @@ +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.twine.tango.integration"> + + <uses-permission android:name="android.permission.INTERNET"/> + +</manifest> diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/adapters/SerialAdapter.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/adapters/SerialAdapter.java new file mode 100644 index 000000000..5224a0729 --- /dev/null +++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/adapters/SerialAdapter.java @@ -0,0 +1,20 @@ +package com.twine.tango.integration.adapters; + +import java.io.IOException; + +import io.reactivex.Observable; + +/** + * Created by Roy on 11/8/2017. + */ + +public interface SerialAdapter { + + void setAddress(String address); + String getAddress(); + void open() throws IOException; + void close() throws IOException; + void write(byte[] data) throws IOException; + Observable<byte[]> registerReceiveListener(); + boolean getIsOpen(); +} diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/adapters/TcpAdapter.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/adapters/TcpAdapter.java new file mode 100644 index 000000000..3858b2c5f --- /dev/null +++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/adapters/TcpAdapter.java @@ -0,0 +1,92 @@ +package com.twine.tango.integration.adapters; + +import android.os.SystemClock; +import com.elvishew.xlog.XLog; +import java.io.IOException; +import java.io.InputStream; +import java.net.Socket; +import io.reactivex.Observable; +import io.reactivex.schedulers.Schedulers; +import io.reactivex.subjects.PublishSubject; + +/** + * Created by Roy on 11/8/2017. + */ + +public class TcpAdapter implements SerialAdapter { + + private Socket socket; + private String address; + private boolean isOpen; + private static final int port = 9999; + private Thread receiveThread; + private PublishSubject<byte[]> subject; + + public TcpAdapter(String address) { + this.address = address; + } + + @Override + public void setAddress(String address) { + this.address = address; + } + + @Override + public String getAddress() { + return this.address; + } + + @Override + public void open() throws IOException { + socket = new Socket(address, port); + isOpen = true; + receiveThread = new Thread(this::receiveThreadMethod); + receiveThread.start(); + } + + @Override + public void close() throws IOException { + socket.close(); + isOpen = false; + } + + @Override + public void write(byte[] data) throws IOException { + socket.getOutputStream().write(data); + } + + @Override + public Observable<byte[]> registerReceiveListener() { + subject = PublishSubject.create(); + return subject.observeOn(Schedulers.io()); + } + + @Override + public boolean getIsOpen() { + return isOpen; + } + + private void receiveThreadMethod() { + while (isOpen) { + + try { + + InputStream stream = socket.getInputStream(); + + if (stream.available() > 0) + { + byte[] data = new byte[stream.available()]; + int read = stream.read(data); + if (subject != null && read > 0) subject.onNext(data); + } + + } catch (Exception e) { + isOpen = false; + XLog.e(e); + if (subject != null) subject.onError(e); + } + + SystemClock.sleep(10); + } + } +} diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/MachineOperator.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/MachineOperator.java new file mode 100644 index 000000000..33a7d40ff --- /dev/null +++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/MachineOperator.java @@ -0,0 +1,244 @@ +package com.twine.tango.integration.machine; + +import android.os.SystemClock; +import com.elvishew.xlog.XLog; +import com.google.protobuf.GeneratedMessageV3; +import com.google.protobuf.InvalidProtocolBufferException; +import com.twine.tango.integration.adapters.SerialAdapter; +import com.twine.tango.pmr.MessageFactory; +import com.twine.tango.pmr.TangoMessage; +import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer; +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.Locale; +import java.util.UUID; +import java.util.concurrent.ConcurrentLinkedQueue; + +import javax.inject.Inject; + +import io.reactivex.Observable; +import io.reactivex.Scheduler; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import io.reactivex.subjects.PublishSubject; + +/** + * Created by Roy on 11/8/2017. + */ + +public class MachineOperator implements MachineOperatorInterface { + + private SerialAdapter channel; + private Calendar calendar; + private DateFormat dateFormatter; + private ConcurrentLinkedQueue<RequestMessage> requestsQueue; + private List<RequestMessage> pendingRequests; + private ConcurrentLinkedQueue<ResponseMessage> responsesQueue; + private PublishSubject<byte[]> receiveDataSubject; + private Thread pushThread; + private Thread pullThread; + private boolean isConnected; + private Scheduler ioScheduler; + private Scheduler uiScheduler; + + @Inject + public MachineOperator(SerialAdapter channel) { + + ioScheduler = Schedulers.io(); + uiScheduler = AndroidSchedulers.mainThread(); + calendar = Calendar.getInstance(); + dateFormatter = new SimpleDateFormat("HH:mm:ss.SSS", Locale.US); + requestsQueue = new ConcurrentLinkedQueue<>(); + pendingRequests = new ArrayList<>(); + responsesQueue = new ConcurrentLinkedQueue<>(); + + setCommunicationChannel(channel); + + connect().subscribe(); + } + + private void setCommunicationChannel(SerialAdapter channel) { + if (channel.getIsOpen()) { + try { + channel.close(); + } catch (IOException e) { + XLog.e(e); + } + } + + boolean reconnect = false; + + if (isConnected) { + reconnect = true; + disconnect(); + } + + this.channel = channel; + this.channel.registerReceiveListener().subscribe((data) -> + { + + try { + MessageContainer container = MessageContainer.parseFrom(data); + + RequestMessage pendingRequest = Observable.fromIterable(pendingRequests).filter(x -> x.getToken().equals(container.getToken())).blockingFirst(null); + + if (pendingRequest != null) { + pendingRequests.remove(pendingRequest); + responsesQueue.add(new ResponseMessage(pendingRequest.getSubject(), pendingRequest.getResponseClass(), data)); + } else { + XLog.w("Could not find matching request for response: %s", container.getType().toString()); + } + } catch (InvalidProtocolBufferException e) { + XLog.e(e); + } + + if (receiveDataSubject != null) + { + receiveDataSubject.onNext(data); + } + + }); + + if (reconnect) { + connect(); + } + } + + public <Request extends GeneratedMessageV3, Response extends GeneratedMessageV3> Observable<Response> send(TangoMessage<Request> message, Class<Response> className) { + + PublishSubject<Response> subject = PublishSubject.create(); + requestsQueue.add(new RequestMessage<>(subject, message, className, UUID.randomUUID().toString(), calendar.getTime())); + return subject.subscribeOn(ioScheduler).observeOn(uiScheduler); + } + + + @Override + public Observable connect() { + + return Observable.create((x) -> + { + try { + channel.open(); + isConnected = true; + startThreads(); + x.onComplete(); + } catch (Exception e) { + XLog.e("Could not connect to Tango machine.", e); + x.onError(e); + } + + }).subscribeOn(ioScheduler).observeOn(uiScheduler); + + } + + @Override + public Observable disconnect() { + + return Observable.create((x) -> + { + try { + channel.close(); + isConnected = false; + x.onComplete(); + stopThreads(); + } catch (Exception e) { + XLog.e("Could not disconnect from Tango machine.", e); + x.onError(e); + } + + }).subscribeOn(ioScheduler).observeOn(uiScheduler); + + } + + private void startThreads() { + pushThread = new Thread(this::pushThreadMethod, "Push Thread"); + pushThread.start(); + + pullThread = new Thread(this::pullThreadMethod, "Pull Thread"); + pullThread.start(); + } + + private void stopThreads() { + isConnected = false; + pullThread.interrupt(); + pushThread.interrupt(); + } + + public void writeData(byte[] data) + { + try { + channel.write(data); + } catch (IOException e) { + XLog.e(e); + } + } + + @Override + public Observable<byte[]> receiveData() { + receiveDataSubject = PublishSubject.create(); + return receiveDataSubject.observeOn(uiScheduler).subscribeOn(ioScheduler); + } + + private void pushThreadMethod() { + + while (isConnected) { + + if (requestsQueue.size() > 0) { + RequestMessage request = requestsQueue.poll(); + if (request != null) { + pendingRequests.add(request); + try { + channel.write(request.getMessage().toBytes()); + } catch (IOException e) { + isConnected = false; + XLog.e(e); + } + } + } + + SystemClock.sleep(10); + } + } + + private void pullThreadMethod() { + while (isConnected) { + + if (responsesQueue.size() > 0) { + ResponseMessage response = responsesQueue.poll(); + if (response != null) { + + try { + TangoMessage message = MessageFactory.parseTangoMessage(response.getData()); + response.getSubject().onNext(message); + response.getSubject().onComplete(); + } catch (Exception e) { + response.getSubject().onError(e); + XLog.e("Could not parse response.", e); + } + + } + } + + SystemClock.sleep(10); + } + } + + private void postRequest(RequestMessage request) { + +// SystemClock.sleep(5000); +// +// TangoMessage<Job> jobTangoMessage = MessageFactory.createTangoMessage(Job.class); +// +// jobTangoMessage.setMessage(Job.newBuilder().setName("Result Job").build()); +// +// XLog.d("Posting result for request: %s TIME: %s", request.token, dateFormatter.format(request.dateTime)); +// +// request.subject.onNext(jobTangoMessage.getMessage()); +// +// request.subject.onComplete(); + } +} diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/MachineOperatorInterface.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/MachineOperatorInterface.java new file mode 100644 index 000000000..39e7e31d7 --- /dev/null +++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/MachineOperatorInterface.java @@ -0,0 +1,19 @@ +package com.twine.tango.integration.machine; + +import com.google.protobuf.GeneratedMessageV3; +import com.twine.tango.pmr.TangoMessage; + +import io.reactivex.Observable; + +/** + * Created by Roy on 11/8/2017. + */ + +public interface MachineOperatorInterface { + + <Request extends GeneratedMessageV3, Response extends GeneratedMessageV3> Observable<Response> send(TangoMessage<Request> message,Class<Response> className); + Observable connect(); + Observable disconnect(); + void writeData(byte[] data); + Observable<byte[]> receiveData(); +} diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/MessageBase.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/MessageBase.java new file mode 100644 index 000000000..c34e3653a --- /dev/null +++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/MessageBase.java @@ -0,0 +1,24 @@ +package com.twine.tango.integration.machine; + +import io.reactivex.subjects.PublishSubject; + +/** + * Created by Roy on 11/8/2017. + */ + +public class MessageBase { + + private PublishSubject subject; + + public PublishSubject getSubject() { + return subject; + } + + public void setSubject(PublishSubject subject) { + this.subject = subject; + } + + public MessageBase(PublishSubject subject) { + this.subject = subject; + } +} diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/RequestMessage.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/RequestMessage.java new file mode 100644 index 000000000..dde1ff765 --- /dev/null +++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/RequestMessage.java @@ -0,0 +1,59 @@ +package com.twine.tango.integration.machine; + +import com.google.protobuf.GeneratedMessageV3; +import com.twine.tango.pmr.TangoMessage; + +import java.util.Date; + +import io.reactivex.subjects.PublishSubject; + +/** + * Created by Roy on 11/8/2017. + */ +public class RequestMessage<T extends GeneratedMessageV3,Response extends GeneratedMessageV3> extends MessageBase { + + private String token; + private Date dateTime; + private TangoMessage<T> message; + private Class<Response> responseClass; + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public Date getDateTime() { + return dateTime; + } + + public void setDateTime(Date dateTime) { + this.dateTime = dateTime; + } + + public TangoMessage<T> getMessage() { + return message; + } + + public void setMessage(TangoMessage<T> message) { + this.message = message; + } + + public Class<Response> getResponseClass() { + return responseClass; + } + + public void setResponseClass(Class<Response> responseClass) { + this.responseClass = responseClass; + } + + public RequestMessage(PublishSubject subject, TangoMessage<T> message, Class<Response> responseClass, String token, Date time) { + super(subject); + this.message = message; + this.token = token; + this.dateTime = time; + this.responseClass = responseClass; + } +} diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/ResponseMessage.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/ResponseMessage.java new file mode 100644 index 000000000..13de24286 --- /dev/null +++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/ResponseMessage.java @@ -0,0 +1,37 @@ +package com.twine.tango.integration.machine; + +import com.twine.tango.pmr.TangoMessage; + +import io.reactivex.subjects.PublishSubject; + +/** + * Created by Roy on 11/8/2017. + */ + +public class ResponseMessage extends MessageBase { + + private byte[] data; + private Class<?> responseClass; + + public byte[] getData() { + return data; + } + + public void setData(byte[] data) { + this.data = data; + } + + public Class<?> getResponseClass() { + return responseClass; + } + + public void setResponseClass(Class<?> responseClass) { + this.responseClass = responseClass; + } + + public ResponseMessage(PublishSubject subject, Class<?> responseClass, byte[] data) { + super(subject); + this.data = data; + this.responseClass = responseClass; + } +} diff --git a/Software/Android_Studio/Tango.Integration/src/main/res/values/strings.xml b/Software/Android_Studio/Tango.Integration/src/main/res/values/strings.xml new file mode 100644 index 000000000..58ea29ec7 --- /dev/null +++ b/Software/Android_Studio/Tango.Integration/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">Tango.Integration</string> +</resources> diff --git a/Software/Android_Studio/Tango.Integration/src/test/java/com/twine/tango/integration/ExampleUnitTest.java b/Software/Android_Studio/Tango.Integration/src/test/java/com/twine/tango/integration/ExampleUnitTest.java new file mode 100644 index 000000000..3bba564e2 --- /dev/null +++ b/Software/Android_Studio/Tango.Integration/src/test/java/com/twine/tango/integration/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.twine.tango.integration; + +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.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/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.PMR/.gitignore b/Software/Android_Studio/Tango.PMR/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Software/Android_Studio/Tango.PMR/build.gradle b/Software/Android_Studio/Tango.PMR/build.gradle new file mode 100644 index 000000000..8fc6f67db --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/build.gradle @@ -0,0 +1,65 @@ +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' + } + } +} + +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' + + compile globalDependencies.protobuf + compile globalDependencies.logging + compile project(path: ':Tango.Core') +} + +task createPMR(type: Exec, description: 'Update all PMR files') { + + commandLine '..\\Visual Studio\\Build\\Debug\\proto-tc.exe', '-i', '..\\..\\PMR\\Messages', '-o', 'src\\main\\java', '-l', 'Java' + + ext.output = { + return standardOutput.toString() + } +} + +task reflectPMR() << { + def file = new File("$projectDir/src\\main\\res\\raw\\packages.txt") + + file.newWriter().withWriter { w -> + def pmrDir = new File("Tango.PMR\\src\\main\\java\\com\\twine\\tango\\pmr") + + pmrDir.eachDirRecurse { dir -> + w << dir.name + "\r\n" + } + } +} + +tasks.withType(JavaCompile) { + compileTask -> compileTask.dependsOn createPMR +} + +tasks.withType(JavaCompile) { + compileTask -> compileTask.dependsOn reflectPMR +} diff --git a/Software/Android_Studio/Tango.PMR/proguard-rules.pro b/Software/Android_Studio/Tango.PMR/proguard-rules.pro new file mode 100644 index 000000000..a0eef131a --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/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.PMR/src/androidTest/java/com/twine/tango/pmr/ExampleInstrumentedTest.java b/Software/Android_Studio/Tango.PMR/src/androidTest/java/com/twine/tango/pmr/ExampleInstrumentedTest.java new file mode 100644 index 000000000..9b208f17f --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/src/androidTest/java/com/twine/tango/pmr/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.twine.tango.pmr; + +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.pmr.test", appContext.getPackageName()); + } +} diff --git a/Software/Android_Studio/Tango.PMR/src/main/AndroidManifest.xml b/Software/Android_Studio/Tango.PMR/src/main/AndroidManifest.xml new file mode 100644 index 000000000..aa1bf8a98 --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.twine.tango.pmr" /> diff --git a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/MessageFactory.java b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/MessageFactory.java new file mode 100644 index 000000000..04acf5248 --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/MessageFactory.java @@ -0,0 +1,163 @@ +package com.twine.tango.pmr; + +import android.content.Context; + +import com.elvishew.xlog.XLog; +import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.Parser; +import com.twine.tango.core.Reflections; +import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer; +import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Contains helper method for generating {@link TangoMessage} messages. + */ +public class MessageFactory +{ + private static boolean initialized; + private static List<String> packages; + private static Map<String, Class> knownClasses; + + + public static void init() + { + if (!initialized) + { + packages = new ArrayList<>(); + knownClasses = new HashMap<>(); + + List<String> names = Reflections.getReflectionListFromResource(R.raw.packages); + + for (String name : names) + { + packages.add("com.twine.tango.pmr." + name); + } + + initialized = true; + } + } + + private static Class<?> getClassForName(String name) + { + init(); + + Class knownClass = knownClasses.get(name); + if (knownClass != null) return knownClass; + + for (String p : packages) + { + try + { + Class cls = Class.forName(p + "." + name + "OuterClass$" + name); + knownClasses.put(name, cls); + return cls; + } catch (ClassNotFoundException e) + { + e.printStackTrace(); + } + } + + + XLog.e("Could not find PMR message class for " + name, new ClassNotFoundException()); + return null; + } + + /** + * Creates a new {@link TangoMessage} message wrapper. + * + * @param typeName The inner message class. + * @param <T> Type of message. + * @return New instance of {@link TangoMessage}. + */ + public static <T extends com.google.protobuf.GeneratedMessageV3> TangoMessage<T> createTangoMessage(Class<T> typeName) + { + try + { + String a = typeName.getSimpleName(); + + Method newBuilder = typeName.getMethod("newBuilder"); + Object builder = newBuilder.invoke(null); + + Method build = builder.getClass().getMethod("build"); + Object instance = build.invoke(builder); + + TangoMessage<T> tangoMessage = new TangoMessage<>((T) instance, MessageType.valueOf(typeName.getSimpleName())); + return tangoMessage; + } catch (Exception e) + { + e.printStackTrace(); + return null; + } + } + + public static <T extends com.google.protobuf.GeneratedMessageV3> TangoMessage<T> createTangoMessage(Class<T> typeName, T message) + { + TangoMessage<T> tangoMessage = createTangoMessage(typeName); + tangoMessage.setMessage(message); + return tangoMessage; + } + + public static <T extends com.google.protobuf.GeneratedMessageV3> TangoMessage<T> createTangoMessage(Class<T> typeName, String token) + { + TangoMessage<T> tangoMessage = createTangoMessage(typeName); + tangoMessage.getContainer().setToken(token); + return tangoMessage; + } + + /** + * Parses a {@link MessageContainer} byte array to a new {@link TangoMessage}. + * + * @param data MessageContainer bytes. + * @param <T> Type of expected inner message. + * @return New instance of {@link TangoMessage}. + */ + @SuppressWarnings("unchecked") + public static <T extends com.google.protobuf.GeneratedMessageV3> TangoMessage<T> parseTangoMessage(byte[] data) + { + try + { + MessageContainer container = MessageContainer.parseFrom(data); + + Class<?> type = getClassForName(container.getType().toString()); + Parser<T> parser = (Parser<T>) type.getMethod("parser").invoke(null); + TangoMessage<T> tangoMessage = new TangoMessage<>(parser.parseFrom(container.getData()), container.getType()); + return tangoMessage; + } catch (Exception e) + { + e.printStackTrace(); + return null; + } + } + + public static <T extends com.google.protobuf.GeneratedMessageV3> T parseMessageFromContainer(MessageContainer container) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InvalidProtocolBufferException + { + + Class<?> type = getClassForName(container.getType().toString()); + Parser<T> parser = (Parser<T>) type.getMethod("parser").invoke(null); + return (T) parser.parseFrom(container.getData()); + } + + public static com.google.protobuf.GeneratedMessageV3 parseMessageFromContainerAgnostic(MessageContainer container) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InvalidProtocolBufferException + { + Class<?> type = getClassForName(container.getType().toString()); + Parser parser = (Parser) type.getMethod("parser").invoke(null); + return (com.google.protobuf.GeneratedMessageV3) parser.parseFrom(container.getData()); + } + + public static MessageContainer parseContainer(byte[] data) throws InvalidProtocolBufferException + { + MessageContainer container = MessageContainer.parseFrom(data); + return container; + } + +} diff --git a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/TangoMessage.java b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/TangoMessage.java new file mode 100644 index 000000000..48422575d --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/TangoMessage.java @@ -0,0 +1,91 @@ +package com.twine.tango.pmr; + +import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer; +import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.UUID; + +/** + * Generic Tango message wrapper. + * @param <T> + */ +public class TangoMessage<T extends com.google.protobuf.GeneratedMessageV3> { + + private T message; + private MessageType type; + private MessageContainer.Builder container; + + /** + * Initialize a new instance of Tango message. + * @param message The message. + * @param type The message type. + */ + public TangoMessage(T message, MessageType type) { + this.message = message; + this.type = type; + + this.container = MessageContainer.newBuilder() + .setToken(UUID.randomUUID().toString()) + .setType(type); + } + + /** + * Gets the inner message. + * @return The inner message. + */ + public T getMessage() { + return message; + } + + /** + * Sets the inner message. + * @param message The inner message. + */ + public void setMessage(T message) { + this.message = message; + } + + /** + * Gets the inner message type. + * @return The inner message type. + */ + public MessageType getType() { + return type; + } + + /** + * Sets the inner message type. + * @param type Inner message type. + */ + public void setType(MessageType type) { + this.type = type; + } + + /** + * Gets the message container. + * @return the message container. + */ + public MessageContainer.Builder getContainer() { + return container; + } + + /** + * Sets the message container. + * @param container + */ + public void setContainer(MessageContainer.Builder container) { + this.container = container; + } + + /** + * Serializes the container and message to byte array. + * @return Container and message byte array. + */ + public byte[] toBytes() + { + container.setData(message.toByteString()); + return container.build().toByteArray(); + } +} diff --git a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/common/MessageContainerOuterClass.java b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/common/MessageContainerOuterClass.java new file mode 100644 index 000000000..c4919dae3 --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/common/MessageContainerOuterClass.java @@ -0,0 +1,869 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: MessageContainer.proto + +package com.twine.tango.pmr.common; + +public final class MessageContainerOuterClass { + private MessageContainerOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface MessageContainerOrBuilder extends + // @@protoc_insertion_point(interface_extends:Tango.PMR.Common.MessageContainer) + com.google.protobuf.MessageOrBuilder { + + /** + * <code>.Tango.PMR.Common.MessageType Type = 1;</code> + */ + int getTypeValue(); + /** + * <code>.Tango.PMR.Common.MessageType Type = 1;</code> + */ + com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType getType(); + + /** + * <code>string Token = 2;</code> + */ + java.lang.String getToken(); + /** + * <code>string Token = 2;</code> + */ + com.google.protobuf.ByteString + getTokenBytes(); + + /** + * <code>bool Continuous = 3;</code> + */ + boolean getContinuous(); + + /** + * <code>bool Completed = 4;</code> + */ + boolean getCompleted(); + + /** + * <code>bytes Data = 5;</code> + */ + com.google.protobuf.ByteString getData(); + } + /** + * Protobuf type {@code Tango.PMR.Common.MessageContainer} + */ + public static final class MessageContainer extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Tango.PMR.Common.MessageContainer) + MessageContainerOrBuilder { + private static final long serialVersionUID = 0L; + // Use MessageContainer.newBuilder() to construct. + private MessageContainer(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) { + super(builder); + } + private MessageContainer() { + type_ = 0; + token_ = ""; + continuous_ = false; + completed_ = false; + data_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private MessageContainer( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + int rawValue = input.readEnum(); + + type_ = rawValue; + break; + } + case 18: { + java.lang.String s = input.readStringRequireUtf8(); + + token_ = s; + break; + } + case 24: { + + continuous_ = input.readBool(); + break; + } + case 32: { + + completed_ = input.readBool(); + break; + } + case 42: { + + data_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.twine.tango.pmr.common.MessageContainerOuterClass.internal_static_Tango_PMR_Common_MessageContainer_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.twine.tango.pmr.common.MessageContainerOuterClass.internal_static_Tango_PMR_Common_MessageContainer_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer.class, com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer.Builder.class); + } + + public static final int TYPE_FIELD_NUMBER = 1; + private int type_; + /** + * <code>.Tango.PMR.Common.MessageType Type = 1;</code> + */ + public int getTypeValue() { + return type_; + } + /** + * <code>.Tango.PMR.Common.MessageType Type = 1;</code> + */ + public com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType getType() { + com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType result = com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType.valueOf(type_); + return result == null ? com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType.UNRECOGNIZED : result; + } + + public static final int TOKEN_FIELD_NUMBER = 2; + private volatile java.lang.Object token_; + /** + * <code>string Token = 2;</code> + */ + public java.lang.String getToken() { + java.lang.Object ref = token_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + token_ = s; + return s; + } + } + /** + * <code>string Token = 2;</code> + */ + public com.google.protobuf.ByteString + getTokenBytes() { + java.lang.Object ref = token_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + token_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int CONTINUOUS_FIELD_NUMBER = 3; + private boolean continuous_; + /** + * <code>bool Continuous = 3;</code> + */ + public boolean getContinuous() { + return continuous_; + } + + public static final int COMPLETED_FIELD_NUMBER = 4; + private boolean completed_; + /** + * <code>bool Completed = 4;</code> + */ + public boolean getCompleted() { + return completed_; + } + + public static final int DATA_FIELD_NUMBER = 5; + private com.google.protobuf.ByteString data_; + /** + * <code>bytes Data = 5;</code> + */ + public com.google.protobuf.ByteString getData() { + return data_; + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (type_ != com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType.RGB.getNumber()) { + output.writeEnum(1, type_); + } + if (!getTokenBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, token_); + } + if (continuous_ != false) { + output.writeBool(3, continuous_); + } + if (completed_ != false) { + output.writeBool(4, completed_); + } + if (!data_.isEmpty()) { + output.writeBytes(5, data_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (type_ != com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType.RGB.getNumber()) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, type_); + } + if (!getTokenBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, token_); + } + if (continuous_ != false) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(3, continuous_); + } + if (completed_ != false) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(4, completed_); + } + if (!data_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(5, data_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer)) { + return super.equals(obj); + } + com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer other = (com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer) obj; + + boolean result = true; + result = result && type_ == other.type_; + result = result && getToken() + .equals(other.getToken()); + result = result && (getContinuous() + == other.getContinuous()); + result = result && (getCompleted() + == other.getCompleted()); + result = result && getData() + .equals(other.getData()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + TYPE_FIELD_NUMBER; + hash = (53 * hash) + type_; + hash = (37 * hash) + TOKEN_FIELD_NUMBER; + hash = (53 * hash) + getToken().hashCode(); + hash = (37 * hash) + CONTINUOUS_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getContinuous()); + hash = (37 * hash) + COMPLETED_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getCompleted()); + hash = (37 * hash) + DATA_FIELD_NUMBER; + hash = (53 * hash) + getData().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Tango.PMR.Common.MessageContainer} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements + // @@protoc_insertion_point(builder_implements:Tango.PMR.Common.MessageContainer) + com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainerOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.twine.tango.pmr.common.MessageContainerOuterClass.internal_static_Tango_PMR_Common_MessageContainer_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.twine.tango.pmr.common.MessageContainerOuterClass.internal_static_Tango_PMR_Common_MessageContainer_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer.class, com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer.Builder.class); + } + + // Construct using com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + type_ = 0; + + token_ = ""; + + continuous_ = false; + + completed_ = false; + + data_ = com.google.protobuf.ByteString.EMPTY; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.twine.tango.pmr.common.MessageContainerOuterClass.internal_static_Tango_PMR_Common_MessageContainer_descriptor; + } + + public com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer getDefaultInstanceForType() { + return com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer.getDefaultInstance(); + } + + public com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer build() { + com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer buildPartial() { + com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer result = new com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer(this); + result.type_ = type_; + result.token_ = token_; + result.continuous_ = continuous_; + result.completed_ = completed_; + result.data_ = data_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer) { + return mergeFrom((com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer other) { + if (other == com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer.getDefaultInstance()) return this; + if (other.type_ != 0) { + setTypeValue(other.getTypeValue()); + } + if (!other.getToken().isEmpty()) { + token_ = other.token_; + onChanged(); + } + if (other.getContinuous() != false) { + setContinuous(other.getContinuous()); + } + if (other.getCompleted() != false) { + setCompleted(other.getCompleted()); + } + if (other.getData() != com.google.protobuf.ByteString.EMPTY) { + setData(other.getData()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int type_ = 0; + /** + * <code>.Tango.PMR.Common.MessageType Type = 1;</code> + */ + public int getTypeValue() { + return type_; + } + /** + * <code>.Tango.PMR.Common.MessageType Type = 1;</code> + */ + public Builder setTypeValue(int value) { + type_ = value; + onChanged(); + return this; + } + /** + * <code>.Tango.PMR.Common.MessageType Type = 1;</code> + */ + public com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType getType() { + com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType result = com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType.valueOf(type_); + return result == null ? com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType.UNRECOGNIZED : result; + } + /** + * <code>.Tango.PMR.Common.MessageType Type = 1;</code> + */ + public Builder setType(com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType value) { + if (value == null) { + throw new NullPointerException(); + } + + type_ = value.getNumber(); + onChanged(); + return this; + } + /** + * <code>.Tango.PMR.Common.MessageType Type = 1;</code> + */ + public Builder clearType() { + + type_ = 0; + onChanged(); + return this; + } + + private java.lang.Object token_ = ""; + /** + * <code>string Token = 2;</code> + */ + public java.lang.String getToken() { + java.lang.Object ref = token_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + token_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * <code>string Token = 2;</code> + */ + public com.google.protobuf.ByteString + getTokenBytes() { + java.lang.Object ref = token_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + token_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * <code>string Token = 2;</code> + */ + public Builder setToken( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + token_ = value; + onChanged(); + return this; + } + /** + * <code>string Token = 2;</code> + */ + public Builder clearToken() { + + token_ = getDefaultInstance().getToken(); + onChanged(); + return this; + } + /** + * <code>string Token = 2;</code> + */ + public Builder setTokenBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + token_ = value; + onChanged(); + return this; + } + + private boolean continuous_ ; + /** + * <code>bool Continuous = 3;</code> + */ + public boolean getContinuous() { + return continuous_; + } + /** + * <code>bool Continuous = 3;</code> + */ + public Builder setContinuous(boolean value) { + + continuous_ = value; + onChanged(); + return this; + } + /** + * <code>bool Continuous = 3;</code> + */ + public Builder clearContinuous() { + + continuous_ = false; + onChanged(); + return this; + } + + private boolean completed_ ; + /** + * <code>bool Completed = 4;</code> + */ + public boolean getCompleted() { + return completed_; + } + /** + * <code>bool Completed = 4;</code> + */ + public Builder setCompleted(boolean value) { + + completed_ = value; + onChanged(); + return this; + } + /** + * <code>bool Completed = 4;</code> + */ + public Builder clearCompleted() { + + completed_ = false; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString data_ = com.google.protobuf.ByteString.EMPTY; + /** + * <code>bytes Data = 5;</code> + */ + public com.google.protobuf.ByteString getData() { + return data_; + } + /** + * <code>bytes Data = 5;</code> + */ + public Builder setData(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + + data_ = value; + onChanged(); + return this; + } + /** + * <code>bytes Data = 5;</code> + */ + public Builder clearData() { + + data_ = getDefaultInstance().getData(); + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Tango.PMR.Common.MessageContainer) + } + + // @@protoc_insertion_point(class_scope:Tango.PMR.Common.MessageContainer) + private static final com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer(); + } + + public static com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser<MessageContainer> + PARSER = new com.google.protobuf.AbstractParser<MessageContainer>() { + public MessageContainer parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new MessageContainer(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser<MessageContainer> parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser<MessageContainer> getParserForType() { + return PARSER; + } + + public com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Tango_PMR_Common_MessageContainer_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Tango_PMR_Common_MessageContainer_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\026MessageContainer.proto\022\020Tango.PMR.Comm" + + "on\032\021MessageType.proto\"\203\001\n\020MessageContain" + + "er\022+\n\004Type\030\001 \001(\0162\035.Tango.PMR.Common.Mess" + + "ageType\022\r\n\005Token\030\002 \001(\t\022\022\n\nContinuous\030\003 \001" + + "(\010\022\021\n\tCompleted\030\004 \001(\010\022\014\n\004Data\030\005 \001(\014B\034\n\032c" + + "om.twine.tango.pmr.commonb\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.twine.tango.pmr.common.MessageTypeOuterClass.getDescriptor(), + }, assigner); + internal_static_Tango_PMR_Common_MessageContainer_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Tango_PMR_Common_MessageContainer_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Tango_PMR_Common_MessageContainer_descriptor, + new java.lang.String[] { "Type", "Token", "Continuous", "Completed", "Data", }); + com.twine.tango.pmr.common.MessageTypeOuterClass.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/common/MessageTypeOuterClass.java b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/common/MessageTypeOuterClass.java new file mode 100644 index 000000000..45185ab6d --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/common/MessageTypeOuterClass.java @@ -0,0 +1,191 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: MessageType.proto + +package com.twine.tango.pmr.common; + +public final class MessageTypeOuterClass { + private MessageTypeOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + /** + * Protobuf enum {@code Tango.PMR.Common.MessageType} + */ + public enum MessageType + implements com.google.protobuf.ProtocolMessageEnum { + /** + * <code>RGB = 0;</code> + */ + RGB(0), + /** + * <code>Job = 1;</code> + */ + Job(1), + /** + * <code>Segment = 2;</code> + */ + Segment(2), + /** + * <code>CalculateRequest = 3;</code> + */ + CalculateRequest(3), + /** + * <code>CalculateResponse = 4;</code> + */ + CalculateResponse(4), + /** + * <code>ProgressRequest = 5;</code> + */ + ProgressRequest(5), + /** + * <code>ProgressResponse = 6;</code> + */ + ProgressResponse(6), + UNRECOGNIZED(-1), + ; + + /** + * <code>RGB = 0;</code> + */ + public static final int RGB_VALUE = 0; + /** + * <code>Job = 1;</code> + */ + public static final int Job_VALUE = 1; + /** + * <code>Segment = 2;</code> + */ + public static final int Segment_VALUE = 2; + /** + * <code>CalculateRequest = 3;</code> + */ + public static final int CalculateRequest_VALUE = 3; + /** + * <code>CalculateResponse = 4;</code> + */ + public static final int CalculateResponse_VALUE = 4; + /** + * <code>ProgressRequest = 5;</code> + */ + public static final int ProgressRequest_VALUE = 5; + /** + * <code>ProgressResponse = 6;</code> + */ + public static final int ProgressResponse_VALUE = 6; + + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static MessageType valueOf(int value) { + return forNumber(value); + } + + public static MessageType forNumber(int value) { + switch (value) { + case 0: return RGB; + case 1: return Job; + case 2: return Segment; + case 3: return CalculateRequest; + case 4: return CalculateResponse; + case 5: return ProgressRequest; + case 6: return ProgressResponse; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap<MessageType> + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + MessageType> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap<MessageType>() { + public MessageType findValueByNumber(int number) { + return MessageType.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.twine.tango.pmr.common.MessageTypeOuterClass.getDescriptor().getEnumTypes().get(0); + } + + private static final MessageType[] VALUES = values(); + + public static MessageType valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private MessageType(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Tango.PMR.Common.MessageType) + } + + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\021MessageType.proto\022\020Tango.PMR.Common*\204\001" + + "\n\013MessageType\022\007\n\003RGB\020\000\022\007\n\003Job\020\001\022\013\n\007Segme" + + "nt\020\002\022\024\n\020CalculateRequest\020\003\022\025\n\021CalculateR" + + "esponse\020\004\022\023\n\017ProgressRequest\020\005\022\024\n\020Progre" + + "ssResponse\020\006B\034\n\032com.twine.tango.pmr.comm" + + "onb\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/common/RGBOuterClass.java b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/common/RGBOuterClass.java new file mode 100644 index 000000000..4e751dd48 --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/common/RGBOuterClass.java @@ -0,0 +1,630 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: RGB.proto + +package com.twine.tango.pmr.common; + +public final class RGBOuterClass { + private RGBOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface RGBOrBuilder extends + // @@protoc_insertion_point(interface_extends:Tango.PMR.Common.RGB) + com.google.protobuf.MessageOrBuilder { + + /** + * <code>int32 R = 1;</code> + */ + int getR(); + + /** + * <code>int32 G = 2;</code> + */ + int getG(); + + /** + * <code>int32 B = 3;</code> + */ + int getB(); + } + /** + * Protobuf type {@code Tango.PMR.Common.RGB} + */ + public static final class RGB extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Tango.PMR.Common.RGB) + RGBOrBuilder { + private static final long serialVersionUID = 0L; + // Use RGB.newBuilder() to construct. + private RGB(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) { + super(builder); + } + private RGB() { + r_ = 0; + g_ = 0; + b_ = 0; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private RGB( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + + r_ = input.readInt32(); + break; + } + case 16: { + + g_ = input.readInt32(); + break; + } + case 24: { + + b_ = input.readInt32(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.twine.tango.pmr.common.RGBOuterClass.internal_static_Tango_PMR_Common_RGB_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.twine.tango.pmr.common.RGBOuterClass.internal_static_Tango_PMR_Common_RGB_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.twine.tango.pmr.common.RGBOuterClass.RGB.class, com.twine.tango.pmr.common.RGBOuterClass.RGB.Builder.class); + } + + public static final int R_FIELD_NUMBER = 1; + private int r_; + /** + * <code>int32 R = 1;</code> + */ + public int getR() { + return r_; + } + + public static final int G_FIELD_NUMBER = 2; + private int g_; + /** + * <code>int32 G = 2;</code> + */ + public int getG() { + return g_; + } + + public static final int B_FIELD_NUMBER = 3; + private int b_; + /** + * <code>int32 B = 3;</code> + */ + public int getB() { + return b_; + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (r_ != 0) { + output.writeInt32(1, r_); + } + if (g_ != 0) { + output.writeInt32(2, g_); + } + if (b_ != 0) { + output.writeInt32(3, b_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (r_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(1, r_); + } + if (g_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(2, g_); + } + if (b_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(3, b_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.twine.tango.pmr.common.RGBOuterClass.RGB)) { + return super.equals(obj); + } + com.twine.tango.pmr.common.RGBOuterClass.RGB other = (com.twine.tango.pmr.common.RGBOuterClass.RGB) obj; + + boolean result = true; + result = result && (getR() + == other.getR()); + result = result && (getG() + == other.getG()); + result = result && (getB() + == other.getB()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + R_FIELD_NUMBER; + hash = (53 * hash) + getR(); + hash = (37 * hash) + G_FIELD_NUMBER; + hash = (53 * hash) + getG(); + hash = (37 * hash) + B_FIELD_NUMBER; + hash = (53 * hash) + getB(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.twine.tango.pmr.common.RGBOuterClass.RGB parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.common.RGBOuterClass.RGB parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.common.RGBOuterClass.RGB parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.common.RGBOuterClass.RGB parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.common.RGBOuterClass.RGB parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.common.RGBOuterClass.RGB parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.common.RGBOuterClass.RGB parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.common.RGBOuterClass.RGB parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.twine.tango.pmr.common.RGBOuterClass.RGB parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.common.RGBOuterClass.RGB parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.twine.tango.pmr.common.RGBOuterClass.RGB parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.common.RGBOuterClass.RGB parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.twine.tango.pmr.common.RGBOuterClass.RGB prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Tango.PMR.Common.RGB} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements + // @@protoc_insertion_point(builder_implements:Tango.PMR.Common.RGB) + com.twine.tango.pmr.common.RGBOuterClass.RGBOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.twine.tango.pmr.common.RGBOuterClass.internal_static_Tango_PMR_Common_RGB_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.twine.tango.pmr.common.RGBOuterClass.internal_static_Tango_PMR_Common_RGB_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.twine.tango.pmr.common.RGBOuterClass.RGB.class, com.twine.tango.pmr.common.RGBOuterClass.RGB.Builder.class); + } + + // Construct using com.twine.tango.pmr.common.RGBOuterClass.RGB.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + r_ = 0; + + g_ = 0; + + b_ = 0; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.twine.tango.pmr.common.RGBOuterClass.internal_static_Tango_PMR_Common_RGB_descriptor; + } + + public com.twine.tango.pmr.common.RGBOuterClass.RGB getDefaultInstanceForType() { + return com.twine.tango.pmr.common.RGBOuterClass.RGB.getDefaultInstance(); + } + + public com.twine.tango.pmr.common.RGBOuterClass.RGB build() { + com.twine.tango.pmr.common.RGBOuterClass.RGB result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.twine.tango.pmr.common.RGBOuterClass.RGB buildPartial() { + com.twine.tango.pmr.common.RGBOuterClass.RGB result = new com.twine.tango.pmr.common.RGBOuterClass.RGB(this); + result.r_ = r_; + result.g_ = g_; + result.b_ = b_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.twine.tango.pmr.common.RGBOuterClass.RGB) { + return mergeFrom((com.twine.tango.pmr.common.RGBOuterClass.RGB)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.twine.tango.pmr.common.RGBOuterClass.RGB other) { + if (other == com.twine.tango.pmr.common.RGBOuterClass.RGB.getDefaultInstance()) return this; + if (other.getR() != 0) { + setR(other.getR()); + } + if (other.getG() != 0) { + setG(other.getG()); + } + if (other.getB() != 0) { + setB(other.getB()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.twine.tango.pmr.common.RGBOuterClass.RGB parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.twine.tango.pmr.common.RGBOuterClass.RGB) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int r_ ; + /** + * <code>int32 R = 1;</code> + */ + public int getR() { + return r_; + } + /** + * <code>int32 R = 1;</code> + */ + public Builder setR(int value) { + + r_ = value; + onChanged(); + return this; + } + /** + * <code>int32 R = 1;</code> + */ + public Builder clearR() { + + r_ = 0; + onChanged(); + return this; + } + + private int g_ ; + /** + * <code>int32 G = 2;</code> + */ + public int getG() { + return g_; + } + /** + * <code>int32 G = 2;</code> + */ + public Builder setG(int value) { + + g_ = value; + onChanged(); + return this; + } + /** + * <code>int32 G = 2;</code> + */ + public Builder clearG() { + + g_ = 0; + onChanged(); + return this; + } + + private int b_ ; + /** + * <code>int32 B = 3;</code> + */ + public int getB() { + return b_; + } + /** + * <code>int32 B = 3;</code> + */ + public Builder setB(int value) { + + b_ = value; + onChanged(); + return this; + } + /** + * <code>int32 B = 3;</code> + */ + public Builder clearB() { + + b_ = 0; + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Tango.PMR.Common.RGB) + } + + // @@protoc_insertion_point(class_scope:Tango.PMR.Common.RGB) + private static final com.twine.tango.pmr.common.RGBOuterClass.RGB DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.twine.tango.pmr.common.RGBOuterClass.RGB(); + } + + public static com.twine.tango.pmr.common.RGBOuterClass.RGB getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser<RGB> + PARSER = new com.google.protobuf.AbstractParser<RGB>() { + public RGB parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new RGB(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser<RGB> parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser<RGB> getParserForType() { + return PARSER; + } + + public com.twine.tango.pmr.common.RGBOuterClass.RGB getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Tango_PMR_Common_RGB_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Tango_PMR_Common_RGB_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\tRGB.proto\022\020Tango.PMR.Common\"&\n\003RGB\022\t\n\001" + + "R\030\001 \001(\005\022\t\n\001G\030\002 \001(\005\022\t\n\001B\030\003 \001(\005B\034\n\032com.twi" + + "ne.tango.pmr.commonb\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + internal_static_Tango_PMR_Common_RGB_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Tango_PMR_Common_RGB_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Tango_PMR_Common_RGB_descriptor, + new java.lang.String[] { "R", "G", "B", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/jobs/JobOuterClass.java b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/jobs/JobOuterClass.java new file mode 100644 index 000000000..79c17d6a8 --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/jobs/JobOuterClass.java @@ -0,0 +1,953 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: Job.proto + +package com.twine.tango.pmr.jobs; + +public final class JobOuterClass { + private JobOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface JobOrBuilder extends + // @@protoc_insertion_point(interface_extends:Tango.PMR.Jobs.Job) + com.google.protobuf.MessageOrBuilder { + + /** + * <code>string Name = 1;</code> + */ + java.lang.String getName(); + /** + * <code>string Name = 1;</code> + */ + com.google.protobuf.ByteString + getNameBytes(); + + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + java.util.List<com.twine.tango.pmr.jobs.SegmentOuterClass.Segment> + getSegmentsList(); + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + com.twine.tango.pmr.jobs.SegmentOuterClass.Segment getSegments(int index); + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + int getSegmentsCount(); + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + java.util.List<? extends com.twine.tango.pmr.jobs.SegmentOuterClass.SegmentOrBuilder> + getSegmentsOrBuilderList(); + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + com.twine.tango.pmr.jobs.SegmentOuterClass.SegmentOrBuilder getSegmentsOrBuilder( + int index); + } + /** + * Protobuf type {@code Tango.PMR.Jobs.Job} + */ + public static final class Job extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Tango.PMR.Jobs.Job) + JobOrBuilder { + private static final long serialVersionUID = 0L; + // Use Job.newBuilder() to construct. + private Job(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) { + super(builder); + } + private Job() { + name_ = ""; + segments_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Job( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + java.lang.String s = input.readStringRequireUtf8(); + + name_ = s; + break; + } + case 18: { + if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + segments_ = new java.util.ArrayList<com.twine.tango.pmr.jobs.SegmentOuterClass.Segment>(); + mutable_bitField0_ |= 0x00000002; + } + segments_.add( + input.readMessage(com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.parser(), extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + segments_ = java.util.Collections.unmodifiableList(segments_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.twine.tango.pmr.jobs.JobOuterClass.internal_static_Tango_PMR_Jobs_Job_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.twine.tango.pmr.jobs.JobOuterClass.internal_static_Tango_PMR_Jobs_Job_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.twine.tango.pmr.jobs.JobOuterClass.Job.class, com.twine.tango.pmr.jobs.JobOuterClass.Job.Builder.class); + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 1; + private volatile java.lang.Object name_; + /** + * <code>string Name = 1;</code> + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } + } + /** + * <code>string Name = 1;</code> + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int SEGMENTS_FIELD_NUMBER = 2; + private java.util.List<com.twine.tango.pmr.jobs.SegmentOuterClass.Segment> segments_; + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public java.util.List<com.twine.tango.pmr.jobs.SegmentOuterClass.Segment> getSegmentsList() { + return segments_; + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public java.util.List<? extends com.twine.tango.pmr.jobs.SegmentOuterClass.SegmentOrBuilder> + getSegmentsOrBuilderList() { + return segments_; + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public int getSegmentsCount() { + return segments_.size(); + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public com.twine.tango.pmr.jobs.SegmentOuterClass.Segment getSegments(int index) { + return segments_.get(index); + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public com.twine.tango.pmr.jobs.SegmentOuterClass.SegmentOrBuilder getSegmentsOrBuilder( + int index) { + return segments_.get(index); + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!getNameBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_); + } + for (int i = 0; i < segments_.size(); i++) { + output.writeMessage(2, segments_.get(i)); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!getNameBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_); + } + for (int i = 0; i < segments_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, segments_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.twine.tango.pmr.jobs.JobOuterClass.Job)) { + return super.equals(obj); + } + com.twine.tango.pmr.jobs.JobOuterClass.Job other = (com.twine.tango.pmr.jobs.JobOuterClass.Job) obj; + + boolean result = true; + result = result && getName() + .equals(other.getName()); + result = result && getSegmentsList() + .equals(other.getSegmentsList()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + if (getSegmentsCount() > 0) { + hash = (37 * hash) + SEGMENTS_FIELD_NUMBER; + hash = (53 * hash) + getSegmentsList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.twine.tango.pmr.jobs.JobOuterClass.Job parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.jobs.JobOuterClass.Job parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.jobs.JobOuterClass.Job parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.jobs.JobOuterClass.Job parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.jobs.JobOuterClass.Job parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.jobs.JobOuterClass.Job parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.jobs.JobOuterClass.Job parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.jobs.JobOuterClass.Job parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.twine.tango.pmr.jobs.JobOuterClass.Job parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.jobs.JobOuterClass.Job parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.twine.tango.pmr.jobs.JobOuterClass.Job parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.jobs.JobOuterClass.Job parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.twine.tango.pmr.jobs.JobOuterClass.Job prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Tango.PMR.Jobs.Job} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements + // @@protoc_insertion_point(builder_implements:Tango.PMR.Jobs.Job) + com.twine.tango.pmr.jobs.JobOuterClass.JobOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.twine.tango.pmr.jobs.JobOuterClass.internal_static_Tango_PMR_Jobs_Job_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.twine.tango.pmr.jobs.JobOuterClass.internal_static_Tango_PMR_Jobs_Job_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.twine.tango.pmr.jobs.JobOuterClass.Job.class, com.twine.tango.pmr.jobs.JobOuterClass.Job.Builder.class); + } + + // Construct using com.twine.tango.pmr.jobs.JobOuterClass.Job.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getSegmentsFieldBuilder(); + } + } + public Builder clear() { + super.clear(); + name_ = ""; + + if (segmentsBuilder_ == null) { + segments_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + } else { + segmentsBuilder_.clear(); + } + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.twine.tango.pmr.jobs.JobOuterClass.internal_static_Tango_PMR_Jobs_Job_descriptor; + } + + public com.twine.tango.pmr.jobs.JobOuterClass.Job getDefaultInstanceForType() { + return com.twine.tango.pmr.jobs.JobOuterClass.Job.getDefaultInstance(); + } + + public com.twine.tango.pmr.jobs.JobOuterClass.Job build() { + com.twine.tango.pmr.jobs.JobOuterClass.Job result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.twine.tango.pmr.jobs.JobOuterClass.Job buildPartial() { + com.twine.tango.pmr.jobs.JobOuterClass.Job result = new com.twine.tango.pmr.jobs.JobOuterClass.Job(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + result.name_ = name_; + if (segmentsBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002)) { + segments_ = java.util.Collections.unmodifiableList(segments_); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.segments_ = segments_; + } else { + result.segments_ = segmentsBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.twine.tango.pmr.jobs.JobOuterClass.Job) { + return mergeFrom((com.twine.tango.pmr.jobs.JobOuterClass.Job)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.twine.tango.pmr.jobs.JobOuterClass.Job other) { + if (other == com.twine.tango.pmr.jobs.JobOuterClass.Job.getDefaultInstance()) return this; + if (!other.getName().isEmpty()) { + name_ = other.name_; + onChanged(); + } + if (segmentsBuilder_ == null) { + if (!other.segments_.isEmpty()) { + if (segments_.isEmpty()) { + segments_ = other.segments_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureSegmentsIsMutable(); + segments_.addAll(other.segments_); + } + onChanged(); + } + } else { + if (!other.segments_.isEmpty()) { + if (segmentsBuilder_.isEmpty()) { + segmentsBuilder_.dispose(); + segmentsBuilder_ = null; + segments_ = other.segments_; + bitField0_ = (bitField0_ & ~0x00000002); + segmentsBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getSegmentsFieldBuilder() : null; + } else { + segmentsBuilder_.addAllMessages(other.segments_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.twine.tango.pmr.jobs.JobOuterClass.Job parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.twine.tango.pmr.jobs.JobOuterClass.Job) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + * <code>string Name = 1;</code> + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * <code>string Name = 1;</code> + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * <code>string Name = 1;</code> + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + name_ = value; + onChanged(); + return this; + } + /** + * <code>string Name = 1;</code> + */ + public Builder clearName() { + + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * <code>string Name = 1;</code> + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + name_ = value; + onChanged(); + return this; + } + + private java.util.List<com.twine.tango.pmr.jobs.SegmentOuterClass.Segment> segments_ = + java.util.Collections.emptyList(); + private void ensureSegmentsIsMutable() { + if (!((bitField0_ & 0x00000002) == 0x00000002)) { + segments_ = new java.util.ArrayList<com.twine.tango.pmr.jobs.SegmentOuterClass.Segment>(segments_); + bitField0_ |= 0x00000002; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.twine.tango.pmr.jobs.SegmentOuterClass.Segment, com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.Builder, com.twine.tango.pmr.jobs.SegmentOuterClass.SegmentOrBuilder> segmentsBuilder_; + + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public java.util.List<com.twine.tango.pmr.jobs.SegmentOuterClass.Segment> getSegmentsList() { + if (segmentsBuilder_ == null) { + return java.util.Collections.unmodifiableList(segments_); + } else { + return segmentsBuilder_.getMessageList(); + } + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public int getSegmentsCount() { + if (segmentsBuilder_ == null) { + return segments_.size(); + } else { + return segmentsBuilder_.getCount(); + } + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public com.twine.tango.pmr.jobs.SegmentOuterClass.Segment getSegments(int index) { + if (segmentsBuilder_ == null) { + return segments_.get(index); + } else { + return segmentsBuilder_.getMessage(index); + } + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public Builder setSegments( + int index, com.twine.tango.pmr.jobs.SegmentOuterClass.Segment value) { + if (segmentsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureSegmentsIsMutable(); + segments_.set(index, value); + onChanged(); + } else { + segmentsBuilder_.setMessage(index, value); + } + return this; + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public Builder setSegments( + int index, com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.Builder builderForValue) { + if (segmentsBuilder_ == null) { + ensureSegmentsIsMutable(); + segments_.set(index, builderForValue.build()); + onChanged(); + } else { + segmentsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public Builder addSegments(com.twine.tango.pmr.jobs.SegmentOuterClass.Segment value) { + if (segmentsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureSegmentsIsMutable(); + segments_.add(value); + onChanged(); + } else { + segmentsBuilder_.addMessage(value); + } + return this; + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public Builder addSegments( + int index, com.twine.tango.pmr.jobs.SegmentOuterClass.Segment value) { + if (segmentsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureSegmentsIsMutable(); + segments_.add(index, value); + onChanged(); + } else { + segmentsBuilder_.addMessage(index, value); + } + return this; + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public Builder addSegments( + com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.Builder builderForValue) { + if (segmentsBuilder_ == null) { + ensureSegmentsIsMutable(); + segments_.add(builderForValue.build()); + onChanged(); + } else { + segmentsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public Builder addSegments( + int index, com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.Builder builderForValue) { + if (segmentsBuilder_ == null) { + ensureSegmentsIsMutable(); + segments_.add(index, builderForValue.build()); + onChanged(); + } else { + segmentsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public Builder addAllSegments( + java.lang.Iterable<? extends com.twine.tango.pmr.jobs.SegmentOuterClass.Segment> values) { + if (segmentsBuilder_ == null) { + ensureSegmentsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, segments_); + onChanged(); + } else { + segmentsBuilder_.addAllMessages(values); + } + return this; + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public Builder clearSegments() { + if (segmentsBuilder_ == null) { + segments_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + } else { + segmentsBuilder_.clear(); + } + return this; + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public Builder removeSegments(int index) { + if (segmentsBuilder_ == null) { + ensureSegmentsIsMutable(); + segments_.remove(index); + onChanged(); + } else { + segmentsBuilder_.remove(index); + } + return this; + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.Builder getSegmentsBuilder( + int index) { + return getSegmentsFieldBuilder().getBuilder(index); + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public com.twine.tango.pmr.jobs.SegmentOuterClass.SegmentOrBuilder getSegmentsOrBuilder( + int index) { + if (segmentsBuilder_ == null) { + return segments_.get(index); } else { + return segmentsBuilder_.getMessageOrBuilder(index); + } + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public java.util.List<? extends com.twine.tango.pmr.jobs.SegmentOuterClass.SegmentOrBuilder> + getSegmentsOrBuilderList() { + if (segmentsBuilder_ != null) { + return segmentsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(segments_); + } + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.Builder addSegmentsBuilder() { + return getSegmentsFieldBuilder().addBuilder( + com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.getDefaultInstance()); + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.Builder addSegmentsBuilder( + int index) { + return getSegmentsFieldBuilder().addBuilder( + index, com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.getDefaultInstance()); + } + /** + * <code>repeated .Tango.PMR.Jobs.Segment Segments = 2;</code> + */ + public java.util.List<com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.Builder> + getSegmentsBuilderList() { + return getSegmentsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.twine.tango.pmr.jobs.SegmentOuterClass.Segment, com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.Builder, com.twine.tango.pmr.jobs.SegmentOuterClass.SegmentOrBuilder> + getSegmentsFieldBuilder() { + if (segmentsBuilder_ == null) { + segmentsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.twine.tango.pmr.jobs.SegmentOuterClass.Segment, com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.Builder, com.twine.tango.pmr.jobs.SegmentOuterClass.SegmentOrBuilder>( + segments_, + ((bitField0_ & 0x00000002) == 0x00000002), + getParentForChildren(), + isClean()); + segments_ = null; + } + return segmentsBuilder_; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Tango.PMR.Jobs.Job) + } + + // @@protoc_insertion_point(class_scope:Tango.PMR.Jobs.Job) + private static final com.twine.tango.pmr.jobs.JobOuterClass.Job DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.twine.tango.pmr.jobs.JobOuterClass.Job(); + } + + public static com.twine.tango.pmr.jobs.JobOuterClass.Job getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser<Job> + PARSER = new com.google.protobuf.AbstractParser<Job>() { + public Job parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Job(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser<Job> parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser<Job> getParserForType() { + return PARSER; + } + + public com.twine.tango.pmr.jobs.JobOuterClass.Job getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Tango_PMR_Jobs_Job_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Tango_PMR_Jobs_Job_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\tJob.proto\022\016Tango.PMR.Jobs\032\rSegment.pro" + + "to\">\n\003Job\022\014\n\004Name\030\001 \001(\t\022)\n\010Segments\030\002 \003(" + + "\0132\027.Tango.PMR.Jobs.SegmentB\032\n\030com.twine." + + "tango.pmr.jobsb\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.twine.tango.pmr.jobs.SegmentOuterClass.getDescriptor(), + }, assigner); + internal_static_Tango_PMR_Jobs_Job_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Tango_PMR_Jobs_Job_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Tango_PMR_Jobs_Job_descriptor, + new java.lang.String[] { "Name", "Segments", }); + com.twine.tango.pmr.jobs.SegmentOuterClass.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/jobs/SegmentOuterClass.java b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/jobs/SegmentOuterClass.java new file mode 100644 index 000000000..eb19e884e --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/jobs/SegmentOuterClass.java @@ -0,0 +1,838 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: Segment.proto + +package com.twine.tango.pmr.jobs; + +public final class SegmentOuterClass { + private SegmentOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface SegmentOrBuilder extends + // @@protoc_insertion_point(interface_extends:Tango.PMR.Jobs.Segment) + com.google.protobuf.MessageOrBuilder { + + /** + * <code>string Name = 1;</code> + */ + java.lang.String getName(); + /** + * <code>string Name = 1;</code> + */ + com.google.protobuf.ByteString + getNameBytes(); + + /** + * <code>int32 Length = 2;</code> + */ + int getLength(); + + /** + * <code>.Tango.PMR.Common.RGB Color = 3;</code> + */ + boolean hasColor(); + /** + * <code>.Tango.PMR.Common.RGB Color = 3;</code> + */ + com.twine.tango.pmr.common.RGBOuterClass.RGB getColor(); + /** + * <code>.Tango.PMR.Common.RGB Color = 3;</code> + */ + com.twine.tango.pmr.common.RGBOuterClass.RGBOrBuilder getColorOrBuilder(); + } + /** + * Protobuf type {@code Tango.PMR.Jobs.Segment} + */ + public static final class Segment extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Tango.PMR.Jobs.Segment) + SegmentOrBuilder { + private static final long serialVersionUID = 0L; + // Use Segment.newBuilder() to construct. + private Segment(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) { + super(builder); + } + private Segment() { + name_ = ""; + length_ = 0; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Segment( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + java.lang.String s = input.readStringRequireUtf8(); + + name_ = s; + break; + } + case 16: { + + length_ = input.readInt32(); + break; + } + case 26: { + com.twine.tango.pmr.common.RGBOuterClass.RGB.Builder subBuilder = null; + if (color_ != null) { + subBuilder = color_.toBuilder(); + } + color_ = input.readMessage(com.twine.tango.pmr.common.RGBOuterClass.RGB.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(color_); + color_ = subBuilder.buildPartial(); + } + + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.twine.tango.pmr.jobs.SegmentOuterClass.internal_static_Tango_PMR_Jobs_Segment_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.twine.tango.pmr.jobs.SegmentOuterClass.internal_static_Tango_PMR_Jobs_Segment_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.class, com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.Builder.class); + } + + public static final int NAME_FIELD_NUMBER = 1; + private volatile java.lang.Object name_; + /** + * <code>string Name = 1;</code> + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } + } + /** + * <code>string Name = 1;</code> + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int LENGTH_FIELD_NUMBER = 2; + private int length_; + /** + * <code>int32 Length = 2;</code> + */ + public int getLength() { + return length_; + } + + public static final int COLOR_FIELD_NUMBER = 3; + private com.twine.tango.pmr.common.RGBOuterClass.RGB color_; + /** + * <code>.Tango.PMR.Common.RGB Color = 3;</code> + */ + public boolean hasColor() { + return color_ != null; + } + /** + * <code>.Tango.PMR.Common.RGB Color = 3;</code> + */ + public com.twine.tango.pmr.common.RGBOuterClass.RGB getColor() { + return color_ == null ? com.twine.tango.pmr.common.RGBOuterClass.RGB.getDefaultInstance() : color_; + } + /** + * <code>.Tango.PMR.Common.RGB Color = 3;</code> + */ + public com.twine.tango.pmr.common.RGBOuterClass.RGBOrBuilder getColorOrBuilder() { + return getColor(); + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!getNameBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_); + } + if (length_ != 0) { + output.writeInt32(2, length_); + } + if (color_ != null) { + output.writeMessage(3, getColor()); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!getNameBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_); + } + if (length_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(2, length_); + } + if (color_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, getColor()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.twine.tango.pmr.jobs.SegmentOuterClass.Segment)) { + return super.equals(obj); + } + com.twine.tango.pmr.jobs.SegmentOuterClass.Segment other = (com.twine.tango.pmr.jobs.SegmentOuterClass.Segment) obj; + + boolean result = true; + result = result && getName() + .equals(other.getName()); + result = result && (getLength() + == other.getLength()); + result = result && (hasColor() == other.hasColor()); + if (hasColor()) { + result = result && getColor() + .equals(other.getColor()); + } + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + hash = (37 * hash) + LENGTH_FIELD_NUMBER; + hash = (53 * hash) + getLength(); + if (hasColor()) { + hash = (37 * hash) + COLOR_FIELD_NUMBER; + hash = (53 * hash) + getColor().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.twine.tango.pmr.jobs.SegmentOuterClass.Segment parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.jobs.SegmentOuterClass.Segment parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.jobs.SegmentOuterClass.Segment parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.jobs.SegmentOuterClass.Segment parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.jobs.SegmentOuterClass.Segment parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.jobs.SegmentOuterClass.Segment parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.jobs.SegmentOuterClass.Segment parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.jobs.SegmentOuterClass.Segment parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.twine.tango.pmr.jobs.SegmentOuterClass.Segment parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.jobs.SegmentOuterClass.Segment parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.twine.tango.pmr.jobs.SegmentOuterClass.Segment parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.jobs.SegmentOuterClass.Segment parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.twine.tango.pmr.jobs.SegmentOuterClass.Segment prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Tango.PMR.Jobs.Segment} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements + // @@protoc_insertion_point(builder_implements:Tango.PMR.Jobs.Segment) + com.twine.tango.pmr.jobs.SegmentOuterClass.SegmentOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.twine.tango.pmr.jobs.SegmentOuterClass.internal_static_Tango_PMR_Jobs_Segment_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.twine.tango.pmr.jobs.SegmentOuterClass.internal_static_Tango_PMR_Jobs_Segment_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.class, com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.Builder.class); + } + + // Construct using com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + name_ = ""; + + length_ = 0; + + if (colorBuilder_ == null) { + color_ = null; + } else { + color_ = null; + colorBuilder_ = null; + } + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.twine.tango.pmr.jobs.SegmentOuterClass.internal_static_Tango_PMR_Jobs_Segment_descriptor; + } + + public com.twine.tango.pmr.jobs.SegmentOuterClass.Segment getDefaultInstanceForType() { + return com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.getDefaultInstance(); + } + + public com.twine.tango.pmr.jobs.SegmentOuterClass.Segment build() { + com.twine.tango.pmr.jobs.SegmentOuterClass.Segment result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.twine.tango.pmr.jobs.SegmentOuterClass.Segment buildPartial() { + com.twine.tango.pmr.jobs.SegmentOuterClass.Segment result = new com.twine.tango.pmr.jobs.SegmentOuterClass.Segment(this); + result.name_ = name_; + result.length_ = length_; + if (colorBuilder_ == null) { + result.color_ = color_; + } else { + result.color_ = colorBuilder_.build(); + } + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.twine.tango.pmr.jobs.SegmentOuterClass.Segment) { + return mergeFrom((com.twine.tango.pmr.jobs.SegmentOuterClass.Segment)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.twine.tango.pmr.jobs.SegmentOuterClass.Segment other) { + if (other == com.twine.tango.pmr.jobs.SegmentOuterClass.Segment.getDefaultInstance()) return this; + if (!other.getName().isEmpty()) { + name_ = other.name_; + onChanged(); + } + if (other.getLength() != 0) { + setLength(other.getLength()); + } + if (other.hasColor()) { + mergeColor(other.getColor()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.twine.tango.pmr.jobs.SegmentOuterClass.Segment parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.twine.tango.pmr.jobs.SegmentOuterClass.Segment) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private java.lang.Object name_ = ""; + /** + * <code>string Name = 1;</code> + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * <code>string Name = 1;</code> + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * <code>string Name = 1;</code> + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + name_ = value; + onChanged(); + return this; + } + /** + * <code>string Name = 1;</code> + */ + public Builder clearName() { + + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * <code>string Name = 1;</code> + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + name_ = value; + onChanged(); + return this; + } + + private int length_ ; + /** + * <code>int32 Length = 2;</code> + */ + public int getLength() { + return length_; + } + /** + * <code>int32 Length = 2;</code> + */ + public Builder setLength(int value) { + + length_ = value; + onChanged(); + return this; + } + /** + * <code>int32 Length = 2;</code> + */ + public Builder clearLength() { + + length_ = 0; + onChanged(); + return this; + } + + private com.twine.tango.pmr.common.RGBOuterClass.RGB color_ = null; + private com.google.protobuf.SingleFieldBuilderV3< + com.twine.tango.pmr.common.RGBOuterClass.RGB, com.twine.tango.pmr.common.RGBOuterClass.RGB.Builder, com.twine.tango.pmr.common.RGBOuterClass.RGBOrBuilder> colorBuilder_; + /** + * <code>.Tango.PMR.Common.RGB Color = 3;</code> + */ + public boolean hasColor() { + return colorBuilder_ != null || color_ != null; + } + /** + * <code>.Tango.PMR.Common.RGB Color = 3;</code> + */ + public com.twine.tango.pmr.common.RGBOuterClass.RGB getColor() { + if (colorBuilder_ == null) { + return color_ == null ? com.twine.tango.pmr.common.RGBOuterClass.RGB.getDefaultInstance() : color_; + } else { + return colorBuilder_.getMessage(); + } + } + /** + * <code>.Tango.PMR.Common.RGB Color = 3;</code> + */ + public Builder setColor(com.twine.tango.pmr.common.RGBOuterClass.RGB value) { + if (colorBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + color_ = value; + onChanged(); + } else { + colorBuilder_.setMessage(value); + } + + return this; + } + /** + * <code>.Tango.PMR.Common.RGB Color = 3;</code> + */ + public Builder setColor( + com.twine.tango.pmr.common.RGBOuterClass.RGB.Builder builderForValue) { + if (colorBuilder_ == null) { + color_ = builderForValue.build(); + onChanged(); + } else { + colorBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + /** + * <code>.Tango.PMR.Common.RGB Color = 3;</code> + */ + public Builder mergeColor(com.twine.tango.pmr.common.RGBOuterClass.RGB value) { + if (colorBuilder_ == null) { + if (color_ != null) { + color_ = + com.twine.tango.pmr.common.RGBOuterClass.RGB.newBuilder(color_).mergeFrom(value).buildPartial(); + } else { + color_ = value; + } + onChanged(); + } else { + colorBuilder_.mergeFrom(value); + } + + return this; + } + /** + * <code>.Tango.PMR.Common.RGB Color = 3;</code> + */ + public Builder clearColor() { + if (colorBuilder_ == null) { + color_ = null; + onChanged(); + } else { + color_ = null; + colorBuilder_ = null; + } + + return this; + } + /** + * <code>.Tango.PMR.Common.RGB Color = 3;</code> + */ + public com.twine.tango.pmr.common.RGBOuterClass.RGB.Builder getColorBuilder() { + + onChanged(); + return getColorFieldBuilder().getBuilder(); + } + /** + * <code>.Tango.PMR.Common.RGB Color = 3;</code> + */ + public com.twine.tango.pmr.common.RGBOuterClass.RGBOrBuilder getColorOrBuilder() { + if (colorBuilder_ != null) { + return colorBuilder_.getMessageOrBuilder(); + } else { + return color_ == null ? + com.twine.tango.pmr.common.RGBOuterClass.RGB.getDefaultInstance() : color_; + } + } + /** + * <code>.Tango.PMR.Common.RGB Color = 3;</code> + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.twine.tango.pmr.common.RGBOuterClass.RGB, com.twine.tango.pmr.common.RGBOuterClass.RGB.Builder, com.twine.tango.pmr.common.RGBOuterClass.RGBOrBuilder> + getColorFieldBuilder() { + if (colorBuilder_ == null) { + colorBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.twine.tango.pmr.common.RGBOuterClass.RGB, com.twine.tango.pmr.common.RGBOuterClass.RGB.Builder, com.twine.tango.pmr.common.RGBOuterClass.RGBOrBuilder>( + getColor(), + getParentForChildren(), + isClean()); + color_ = null; + } + return colorBuilder_; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Tango.PMR.Jobs.Segment) + } + + // @@protoc_insertion_point(class_scope:Tango.PMR.Jobs.Segment) + private static final com.twine.tango.pmr.jobs.SegmentOuterClass.Segment DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.twine.tango.pmr.jobs.SegmentOuterClass.Segment(); + } + + public static com.twine.tango.pmr.jobs.SegmentOuterClass.Segment getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser<Segment> + PARSER = new com.google.protobuf.AbstractParser<Segment>() { + public Segment parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Segment(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser<Segment> parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser<Segment> getParserForType() { + return PARSER; + } + + public com.twine.tango.pmr.jobs.SegmentOuterClass.Segment getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Tango_PMR_Jobs_Segment_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Tango_PMR_Jobs_Segment_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\rSegment.proto\022\016Tango.PMR.Jobs\032\tRGB.pro" + + "to\"M\n\007Segment\022\014\n\004Name\030\001 \001(\t\022\016\n\006Length\030\002 " + + "\001(\005\022$\n\005Color\030\003 \001(\0132\025.Tango.PMR.Common.RG" + + "BB\032\n\030com.twine.tango.pmr.jobsb\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.twine.tango.pmr.common.RGBOuterClass.getDescriptor(), + }, assigner); + internal_static_Tango_PMR_Jobs_Segment_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Tango_PMR_Jobs_Segment_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Tango_PMR_Jobs_Segment_descriptor, + new java.lang.String[] { "Name", "Length", "Color", }); + com.twine.tango.pmr.common.RGBOuterClass.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/stubs/CalculateRequestOuterClass.java b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/stubs/CalculateRequestOuterClass.java new file mode 100644 index 000000000..09180939e --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/stubs/CalculateRequestOuterClass.java @@ -0,0 +1,573 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: CalculateRequest.proto + +package com.twine.tango.pmr.stubs; + +public final class CalculateRequestOuterClass { + private CalculateRequestOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface CalculateRequestOrBuilder extends + // @@protoc_insertion_point(interface_extends:Tango.PMR.Stubs.CalculateRequest) + com.google.protobuf.MessageOrBuilder { + + /** + * <code>double A = 1;</code> + */ + double getA(); + + /** + * <code>double B = 2;</code> + */ + double getB(); + } + /** + * Protobuf type {@code Tango.PMR.Stubs.CalculateRequest} + */ + public static final class CalculateRequest extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Tango.PMR.Stubs.CalculateRequest) + CalculateRequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use CalculateRequest.newBuilder() to construct. + private CalculateRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) { + super(builder); + } + private CalculateRequest() { + a_ = 0D; + b_ = 0D; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CalculateRequest( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 9: { + + a_ = input.readDouble(); + break; + } + case 17: { + + b_ = input.readDouble(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.twine.tango.pmr.stubs.CalculateRequestOuterClass.internal_static_Tango_PMR_Stubs_CalculateRequest_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.twine.tango.pmr.stubs.CalculateRequestOuterClass.internal_static_Tango_PMR_Stubs_CalculateRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest.class, com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest.Builder.class); + } + + public static final int A_FIELD_NUMBER = 1; + private double a_; + /** + * <code>double A = 1;</code> + */ + public double getA() { + return a_; + } + + public static final int B_FIELD_NUMBER = 2; + private double b_; + /** + * <code>double B = 2;</code> + */ + public double getB() { + return b_; + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (a_ != 0D) { + output.writeDouble(1, a_); + } + if (b_ != 0D) { + output.writeDouble(2, b_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (a_ != 0D) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(1, a_); + } + if (b_ != 0D) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(2, b_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest)) { + return super.equals(obj); + } + com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest other = (com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest) obj; + + boolean result = true; + result = result && ( + java.lang.Double.doubleToLongBits(getA()) + == java.lang.Double.doubleToLongBits( + other.getA())); + result = result && ( + java.lang.Double.doubleToLongBits(getB()) + == java.lang.Double.doubleToLongBits( + other.getB())); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + A_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + java.lang.Double.doubleToLongBits(getA())); + hash = (37 * hash) + B_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + java.lang.Double.doubleToLongBits(getB())); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Tango.PMR.Stubs.CalculateRequest} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements + // @@protoc_insertion_point(builder_implements:Tango.PMR.Stubs.CalculateRequest) + com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.twine.tango.pmr.stubs.CalculateRequestOuterClass.internal_static_Tango_PMR_Stubs_CalculateRequest_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.twine.tango.pmr.stubs.CalculateRequestOuterClass.internal_static_Tango_PMR_Stubs_CalculateRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest.class, com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest.Builder.class); + } + + // Construct using com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + a_ = 0D; + + b_ = 0D; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.twine.tango.pmr.stubs.CalculateRequestOuterClass.internal_static_Tango_PMR_Stubs_CalculateRequest_descriptor; + } + + public com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest getDefaultInstanceForType() { + return com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest.getDefaultInstance(); + } + + public com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest build() { + com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest buildPartial() { + com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest result = new com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest(this); + result.a_ = a_; + result.b_ = b_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest) { + return mergeFrom((com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest other) { + if (other == com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest.getDefaultInstance()) return this; + if (other.getA() != 0D) { + setA(other.getA()); + } + if (other.getB() != 0D) { + setB(other.getB()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private double a_ ; + /** + * <code>double A = 1;</code> + */ + public double getA() { + return a_; + } + /** + * <code>double A = 1;</code> + */ + public Builder setA(double value) { + + a_ = value; + onChanged(); + return this; + } + /** + * <code>double A = 1;</code> + */ + public Builder clearA() { + + a_ = 0D; + onChanged(); + return this; + } + + private double b_ ; + /** + * <code>double B = 2;</code> + */ + public double getB() { + return b_; + } + /** + * <code>double B = 2;</code> + */ + public Builder setB(double value) { + + b_ = value; + onChanged(); + return this; + } + /** + * <code>double B = 2;</code> + */ + public Builder clearB() { + + b_ = 0D; + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Tango.PMR.Stubs.CalculateRequest) + } + + // @@protoc_insertion_point(class_scope:Tango.PMR.Stubs.CalculateRequest) + private static final com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest(); + } + + public static com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser<CalculateRequest> + PARSER = new com.google.protobuf.AbstractParser<CalculateRequest>() { + public CalculateRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CalculateRequest(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser<CalculateRequest> parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser<CalculateRequest> getParserForType() { + return PARSER; + } + + public com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Tango_PMR_Stubs_CalculateRequest_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Tango_PMR_Stubs_CalculateRequest_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\026CalculateRequest.proto\022\017Tango.PMR.Stub" + + "s\"(\n\020CalculateRequest\022\t\n\001A\030\001 \001(\001\022\t\n\001B\030\002 " + + "\001(\001B\033\n\031com.twine.tango.pmr.stubsb\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + internal_static_Tango_PMR_Stubs_CalculateRequest_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Tango_PMR_Stubs_CalculateRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Tango_PMR_Stubs_CalculateRequest_descriptor, + new java.lang.String[] { "A", "B", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/stubs/CalculateResponseOuterClass.java b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/stubs/CalculateResponseOuterClass.java new file mode 100644 index 000000000..b20ba95cd --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/stubs/CalculateResponseOuterClass.java @@ -0,0 +1,507 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: CalculateResponse.proto + +package com.twine.tango.pmr.stubs; + +public final class CalculateResponseOuterClass { + private CalculateResponseOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface CalculateResponseOrBuilder extends + // @@protoc_insertion_point(interface_extends:Tango.PMR.Stubs.CalculateResponse) + com.google.protobuf.MessageOrBuilder { + + /** + * <code>double Sum = 1;</code> + */ + double getSum(); + } + /** + * Protobuf type {@code Tango.PMR.Stubs.CalculateResponse} + */ + public static final class CalculateResponse extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Tango.PMR.Stubs.CalculateResponse) + CalculateResponseOrBuilder { + private static final long serialVersionUID = 0L; + // Use CalculateResponse.newBuilder() to construct. + private CalculateResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) { + super(builder); + } + private CalculateResponse() { + sum_ = 0D; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CalculateResponse( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 9: { + + sum_ = input.readDouble(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.twine.tango.pmr.stubs.CalculateResponseOuterClass.internal_static_Tango_PMR_Stubs_CalculateResponse_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.twine.tango.pmr.stubs.CalculateResponseOuterClass.internal_static_Tango_PMR_Stubs_CalculateResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse.class, com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse.Builder.class); + } + + public static final int SUM_FIELD_NUMBER = 1; + private double sum_; + /** + * <code>double Sum = 1;</code> + */ + public double getSum() { + return sum_; + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (sum_ != 0D) { + output.writeDouble(1, sum_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (sum_ != 0D) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(1, sum_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse)) { + return super.equals(obj); + } + com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse other = (com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse) obj; + + boolean result = true; + result = result && ( + java.lang.Double.doubleToLongBits(getSum()) + == java.lang.Double.doubleToLongBits( + other.getSum())); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + SUM_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + java.lang.Double.doubleToLongBits(getSum())); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Tango.PMR.Stubs.CalculateResponse} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements + // @@protoc_insertion_point(builder_implements:Tango.PMR.Stubs.CalculateResponse) + com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.twine.tango.pmr.stubs.CalculateResponseOuterClass.internal_static_Tango_PMR_Stubs_CalculateResponse_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.twine.tango.pmr.stubs.CalculateResponseOuterClass.internal_static_Tango_PMR_Stubs_CalculateResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse.class, com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse.Builder.class); + } + + // Construct using com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + sum_ = 0D; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.twine.tango.pmr.stubs.CalculateResponseOuterClass.internal_static_Tango_PMR_Stubs_CalculateResponse_descriptor; + } + + public com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse getDefaultInstanceForType() { + return com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse.getDefaultInstance(); + } + + public com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse build() { + com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse buildPartial() { + com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse result = new com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse(this); + result.sum_ = sum_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse) { + return mergeFrom((com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse other) { + if (other == com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse.getDefaultInstance()) return this; + if (other.getSum() != 0D) { + setSum(other.getSum()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private double sum_ ; + /** + * <code>double Sum = 1;</code> + */ + public double getSum() { + return sum_; + } + /** + * <code>double Sum = 1;</code> + */ + public Builder setSum(double value) { + + sum_ = value; + onChanged(); + return this; + } + /** + * <code>double Sum = 1;</code> + */ + public Builder clearSum() { + + sum_ = 0D; + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Tango.PMR.Stubs.CalculateResponse) + } + + // @@protoc_insertion_point(class_scope:Tango.PMR.Stubs.CalculateResponse) + private static final com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse(); + } + + public static com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser<CalculateResponse> + PARSER = new com.google.protobuf.AbstractParser<CalculateResponse>() { + public CalculateResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CalculateResponse(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser<CalculateResponse> parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser<CalculateResponse> getParserForType() { + return PARSER; + } + + public com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Tango_PMR_Stubs_CalculateResponse_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Tango_PMR_Stubs_CalculateResponse_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\027CalculateResponse.proto\022\017Tango.PMR.Stu" + + "bs\" \n\021CalculateResponse\022\013\n\003Sum\030\001 \001(\001B\033\n\031" + + "com.twine.tango.pmr.stubsb\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + internal_static_Tango_PMR_Stubs_CalculateResponse_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Tango_PMR_Stubs_CalculateResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Tango_PMR_Stubs_CalculateResponse_descriptor, + new java.lang.String[] { "Sum", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/stubs/ProgressRequestOuterClass.java b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/stubs/ProgressRequestOuterClass.java new file mode 100644 index 000000000..41b0985a2 --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/stubs/ProgressRequestOuterClass.java @@ -0,0 +1,440 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: ProgressRequest.proto + +package com.twine.tango.pmr.stubs; + +public final class ProgressRequestOuterClass { + private ProgressRequestOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface ProgressRequestOrBuilder extends + // @@protoc_insertion_point(interface_extends:Tango.PMR.Stubs.ProgressRequest) + com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code Tango.PMR.Stubs.ProgressRequest} + */ + public static final class ProgressRequest extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Tango.PMR.Stubs.ProgressRequest) + ProgressRequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use ProgressRequest.newBuilder() to construct. + private ProgressRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) { + super(builder); + } + private ProgressRequest() { + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ProgressRequest( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.twine.tango.pmr.stubs.ProgressRequestOuterClass.internal_static_Tango_PMR_Stubs_ProgressRequest_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.twine.tango.pmr.stubs.ProgressRequestOuterClass.internal_static_Tango_PMR_Stubs_ProgressRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest.class, com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest.Builder.class); + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest)) { + return super.equals(obj); + } + com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest other = (com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest) obj; + + boolean result = true; + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Tango.PMR.Stubs.ProgressRequest} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements + // @@protoc_insertion_point(builder_implements:Tango.PMR.Stubs.ProgressRequest) + com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.twine.tango.pmr.stubs.ProgressRequestOuterClass.internal_static_Tango_PMR_Stubs_ProgressRequest_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.twine.tango.pmr.stubs.ProgressRequestOuterClass.internal_static_Tango_PMR_Stubs_ProgressRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest.class, com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest.Builder.class); + } + + // Construct using com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.twine.tango.pmr.stubs.ProgressRequestOuterClass.internal_static_Tango_PMR_Stubs_ProgressRequest_descriptor; + } + + public com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest getDefaultInstanceForType() { + return com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest.getDefaultInstance(); + } + + public com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest build() { + com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest buildPartial() { + com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest result = new com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest(this); + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest) { + return mergeFrom((com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest other) { + if (other == com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest.getDefaultInstance()) return this; + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Tango.PMR.Stubs.ProgressRequest) + } + + // @@protoc_insertion_point(class_scope:Tango.PMR.Stubs.ProgressRequest) + private static final com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest(); + } + + public static com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser<ProgressRequest> + PARSER = new com.google.protobuf.AbstractParser<ProgressRequest>() { + public ProgressRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ProgressRequest(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser<ProgressRequest> parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser<ProgressRequest> getParserForType() { + return PARSER; + } + + public com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Tango_PMR_Stubs_ProgressRequest_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Tango_PMR_Stubs_ProgressRequest_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\025ProgressRequest.proto\022\017Tango.PMR.Stubs" + + "\"\021\n\017ProgressRequestB\033\n\031com.twine.tango.p" + + "mr.stubsb\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + internal_static_Tango_PMR_Stubs_ProgressRequest_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Tango_PMR_Stubs_ProgressRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Tango_PMR_Stubs_ProgressRequest_descriptor, + new java.lang.String[] { }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/stubs/ProgressResponseOuterClass.java b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/stubs/ProgressResponseOuterClass.java new file mode 100644 index 000000000..1a14dd2a5 --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/stubs/ProgressResponseOuterClass.java @@ -0,0 +1,507 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: ProgressResponse.proto + +package com.twine.tango.pmr.stubs; + +public final class ProgressResponseOuterClass { + private ProgressResponseOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface ProgressResponseOrBuilder extends + // @@protoc_insertion_point(interface_extends:Tango.PMR.Stubs.ProgressResponse) + com.google.protobuf.MessageOrBuilder { + + /** + * <code>double Progress = 1;</code> + */ + double getProgress(); + } + /** + * Protobuf type {@code Tango.PMR.Stubs.ProgressResponse} + */ + public static final class ProgressResponse extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Tango.PMR.Stubs.ProgressResponse) + ProgressResponseOrBuilder { + private static final long serialVersionUID = 0L; + // Use ProgressResponse.newBuilder() to construct. + private ProgressResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) { + super(builder); + } + private ProgressResponse() { + progress_ = 0D; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ProgressResponse( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownFieldProto3( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 9: { + + progress_ = input.readDouble(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.twine.tango.pmr.stubs.ProgressResponseOuterClass.internal_static_Tango_PMR_Stubs_ProgressResponse_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.twine.tango.pmr.stubs.ProgressResponseOuterClass.internal_static_Tango_PMR_Stubs_ProgressResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse.class, com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse.Builder.class); + } + + public static final int PROGRESS_FIELD_NUMBER = 1; + private double progress_; + /** + * <code>double Progress = 1;</code> + */ + public double getProgress() { + return progress_; + } + + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (progress_ != 0D) { + output.writeDouble(1, progress_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (progress_ != 0D) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(1, progress_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse)) { + return super.equals(obj); + } + com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse other = (com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse) obj; + + boolean result = true; + result = result && ( + java.lang.Double.doubleToLongBits(getProgress()) + == java.lang.Double.doubleToLongBits( + other.getProgress())); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + PROGRESS_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + java.lang.Double.doubleToLongBits(getProgress())); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Tango.PMR.Stubs.ProgressResponse} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements + // @@protoc_insertion_point(builder_implements:Tango.PMR.Stubs.ProgressResponse) + com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.twine.tango.pmr.stubs.ProgressResponseOuterClass.internal_static_Tango_PMR_Stubs_ProgressResponse_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.twine.tango.pmr.stubs.ProgressResponseOuterClass.internal_static_Tango_PMR_Stubs_ProgressResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse.class, com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse.Builder.class); + } + + // Construct using com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + public Builder clear() { + super.clear(); + progress_ = 0D; + + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.twine.tango.pmr.stubs.ProgressResponseOuterClass.internal_static_Tango_PMR_Stubs_ProgressResponse_descriptor; + } + + public com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse getDefaultInstanceForType() { + return com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse.getDefaultInstance(); + } + + public com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse build() { + com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse buildPartial() { + com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse result = new com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse(this); + result.progress_ = progress_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.setField(field, value); + } + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return (Builder) super.addRepeatedField(field, value); + } + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse) { + return mergeFrom((com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse other) { + if (other == com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse.getDefaultInstance()) return this; + if (other.getProgress() != 0D) { + setProgress(other.getProgress()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private double progress_ ; + /** + * <code>double Progress = 1;</code> + */ + public double getProgress() { + return progress_; + } + /** + * <code>double Progress = 1;</code> + */ + public Builder setProgress(double value) { + + progress_ = value; + onChanged(); + return this; + } + /** + * <code>double Progress = 1;</code> + */ + public Builder clearProgress() { + + progress_ = 0D; + onChanged(); + return this; + } + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFieldsProto3(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Tango.PMR.Stubs.ProgressResponse) + } + + // @@protoc_insertion_point(class_scope:Tango.PMR.Stubs.ProgressResponse) + private static final com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse(); + } + + public static com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser<ProgressResponse> + PARSER = new com.google.protobuf.AbstractParser<ProgressResponse>() { + public ProgressResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ProgressResponse(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser<ProgressResponse> parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser<ProgressResponse> getParserForType() { + return PARSER; + } + + public com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Tango_PMR_Stubs_ProgressResponse_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Tango_PMR_Stubs_ProgressResponse_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\026ProgressResponse.proto\022\017Tango.PMR.Stub" + + "s\"$\n\020ProgressResponse\022\020\n\010Progress\030\001 \001(\001B" + + "\033\n\031com.twine.tango.pmr.stubsb\006proto3" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + internal_static_Tango_PMR_Stubs_ProgressResponse_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Tango_PMR_Stubs_ProgressResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Tango_PMR_Stubs_ProgressResponse_descriptor, + new java.lang.String[] { "Progress", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/Software/Android_Studio/Tango.PMR/src/main/res/raw/packages.txt b/Software/Android_Studio/Tango.PMR/src/main/res/raw/packages.txt new file mode 100644 index 000000000..f332c1ed6 --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/src/main/res/raw/packages.txt @@ -0,0 +1,3 @@ +common +jobs +stubs diff --git a/Software/Android_Studio/Tango.PMR/src/main/res/values/strings.xml b/Software/Android_Studio/Tango.PMR/src/main/res/values/strings.xml new file mode 100644 index 000000000..13796832c --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">Tango.PMR</string> +</resources> diff --git a/Software/Android_Studio/Tango.PMR/src/test/java/com/twine/tango/pmr/ExampleUnitTest.java b/Software/Android_Studio/Tango.PMR/src/test/java/com/twine/tango/pmr/ExampleUnitTest.java new file mode 100644 index 000000000..8f586503c --- /dev/null +++ b/Software/Android_Studio/Tango.PMR/src/test/java/com/twine/tango/pmr/ExampleUnitTest.java @@ -0,0 +1,35 @@ +package com.twine.tango.pmr; + +import com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest; + +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 parseTangoMessage() throws Exception { + + TangoMessage<CalculateRequest> message = MessageFactory.createTangoMessage(CalculateRequest.class); + message.setMessage(CalculateRequest.newBuilder().setA(10).build()); + + byte[] data = message.toBytes(); + + TangoMessage<CalculateRequest> msg = MessageFactory.parseTangoMessage(data); + + double a = msg.getMessage().getA(); + double b = message.getMessage().getA(); + + CalculateRequest request = (CalculateRequest) MessageFactory.parseMessageFromContainerAgnostic(message.getContainer().build()); + + double c = request.getA(); + + assertEquals(msg.getMessage().getA(),message.getMessage().getA()); + + } +}
\ No newline at end of file diff --git a/Software/Android_Studio/Tango.SharedUI/.gitignore b/Software/Android_Studio/Tango.SharedUI/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Software/Android_Studio/Tango.SharedUI/build.gradle b/Software/Android_Studio/Tango.SharedUI/build.gradle new file mode 100644 index 000000000..0eb8175ac --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/build.gradle @@ -0,0 +1,49 @@ +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 + } + + dexOptions { + preDexLibraries = false + } +} + +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' + implementation group: 'io.reactivex.rxjava2', name: 'rxjava', version: '2.1.2' + implementation 'com.mobsandgeeks:android-saripaar:2.0.3' + implementation 'javax.inject:javax.inject:1' + implementation 'com.jakewharton:butterknife:8.7.0' + annotationProcessor 'com.jakewharton:butterknife-compiler:8.7.0' +} diff --git a/Software/Android_Studio/Tango.SharedUI/proguard-rules.pro b/Software/Android_Studio/Tango.SharedUI/proguard-rules.pro new file mode 100644 index 000000000..a0eef131a --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/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.SharedUI/src/androidTest/java/com/twine/tango/sharedui/ExampleInstrumentedTest.java b/Software/Android_Studio/Tango.SharedUI/src/androidTest/java/com/twine/tango/sharedui/ExampleInstrumentedTest.java new file mode 100644 index 000000000..5e8c901eb --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/androidTest/java/com/twine/tango/sharedui/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.twine.tango.sharedui; + +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.sharedui.test", appContext.getPackageName()); + } +} diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/AndroidManifest.xml b/Software/Android_Studio/Tango.SharedUI/src/main/AndroidManifest.xml new file mode 100644 index 000000000..36d543b36 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.twine.tango.sharedui" /> 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 new file mode 100644 index 000000000..7f52ffae6 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/ActivityBase.java @@ -0,0 +1,121 @@ +package com.twine.tango.sharedui.containers; + +import android.content.Intent; +import android.databinding.DataBindingUtil; +import android.databinding.ViewDataBinding; +import android.os.Bundle; +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; + + @Inject + public VM vm; + + public BindingView binding; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + inject(); + binding = DataBindingUtil.setContentView(this, getLayoutId()); + 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); + + String key = getIntent().getStringExtra(ACTIVITY_CALLBACK_INTENT); + if (key != null && !key.isEmpty()) { + ActivityCallbackEngine.getInstance().runAndRemove(key); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + @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); + + if (view instanceof EditText) { + view.requestFocus(); + ((EditText) view).setError(message); + } else { + Toast.makeText(this, 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 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 new file mode 100644 index 000000000..19d472e24 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/FragmentBase.java @@ -0,0 +1,111 @@ +package com.twine.tango.sharedui.containers; + +import android.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 FragmentBase<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.getActivity().getBaseContext()); + + if (view instanceof EditText) { + view.requestFocus(); + ((EditText) view).setError(message); + } else { + Toast.makeText(this.getActivity().getBaseContext(), 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/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/mvvm/BindingConverters.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/BindingConverters.java new file mode 100644 index 000000000..130890c07 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/BindingConverters.java @@ -0,0 +1,19 @@ +package com.twine.tango.sharedui.mvvm; + +import android.app.Application; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; + +import java.util.Calendar; + +/** + * Created by Roy on 7/27/2017. + */ + +public class BindingConverters { + + public static String convertDateToYear(Calendar calendar) { + return String.valueOf(calendar.get(Calendar.YEAR)); + } +} diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/DependencyProperty.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/DependencyProperty.java new file mode 100644 index 000000000..b39be3dc3 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/DependencyProperty.java @@ -0,0 +1,49 @@ +package com.twine.tango.sharedui.mvvm; + +import android.databinding.ObservableField; + +/** + * Created by Roy on 7/27/2017. + */ + +public class DependencyProperty<T> extends ObservableField<T> { + + public interface OnPropertyChangedCallback<T> { + void onPropertyChanged(DependencyProperty<T> dp, T value); + } + + private OnPropertyChangedCallback<T> callback; + + public DependencyProperty(OnPropertyChangedCallback<T> callback) { + this.callback = callback; + init(); + } + + public DependencyProperty(T defaultValue, OnPropertyChangedCallback<T> callback) { + this.set(defaultValue); + this.callback = callback; + init(); + } + + public DependencyProperty(T defaultValue) { + this.set(defaultValue); + init(); + } + + public DependencyProperty() { + init(); + } + + private void init() { + final DependencyProperty<T> that = this; + + this.addOnPropertyChangedCallback(new android.databinding.Observable.OnPropertyChangedCallback() { + @Override + public void onPropertyChanged(android.databinding.Observable observable, int i) { + if (that.callback != null) { + that.callback.onPropertyChanged(that, that.get()); + } + } + }); + } +} diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/FieldUtils.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/FieldUtils.java new file mode 100644 index 000000000..94f99359a --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/FieldUtils.java @@ -0,0 +1,68 @@ +package com.twine.tango.sharedui.mvvm;/* + * Copyright 2016 Manas Chaudhari + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import android.databinding.Observable.OnPropertyChangedCallback; +import android.databinding.ObservableField; +import android.support.annotation.NonNull; + +import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; +import io.reactivex.functions.Cancellable; + + +public class FieldUtils { + /** + * Converts an ObservableField to an Observable. Note that setting null value inside + * ObservableField (except for initial value) throws a NullPointerException. + * @return Observable that contains the latest value in the ObservableField + */ + @NonNull + public static <T> Observable<T> toObservable(@NonNull final ObservableField<T> field) { + + return Observable.create(new ObservableOnSubscribe<T>() { + @Override + public void subscribe(final ObservableEmitter<T> e) throws Exception { + T initialValue = field.get(); + if (initialValue != null) { + e.onNext(initialValue); + } + final OnPropertyChangedCallback callback = new OnPropertyChangedCallback() { + @Override + public void onPropertyChanged(android.databinding.Observable observable, int i) { + e.onNext(field.get()); + } + }; + field.addOnPropertyChangedCallback(callback); + e.setCancellable(new Cancellable() { + @Override + public void cancel() throws Exception { + field.removeOnPropertyChangedCallback(callback); + } + }); + } + }); + } + + /** + * A convenient wrapper for {@code ReadOnlyField#create(Observable)} + * @return DataBinding field created from the specified Observable + */ + @NonNull + public static <T> ReadOnlyField<T> toField(@NonNull final Observable<T> observable) { + return ReadOnlyField.create(observable); + } +}
\ No newline at end of file diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/ReadOnlyField.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/ReadOnlyField.java new file mode 100644 index 000000000..cf6f8abd8 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/ReadOnlyField.java @@ -0,0 +1,74 @@ +package com.twine.tango.sharedui.mvvm;/* + * Copyright 2016 Manas Chaudhari + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import android.databinding.ObservableField; +import android.support.annotation.NonNull; +import android.util.Log; + +import java.util.HashMap; + +import io.reactivex.Observable; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; + + +public class ReadOnlyField<T> extends ObservableField<T> { + private final Observable<T> source; + private final HashMap<OnPropertyChangedCallback, Disposable> subscriptions = new HashMap<>(); + + public static <U> ReadOnlyField<U> create(@NonNull Observable<U> source) { + return new ReadOnlyField<>(source); + } + + private ReadOnlyField(@NonNull Observable<T> source) { + super(); + this.source = source.doOnNext(new Consumer<T>() { + @Override + public void accept(T t) throws Exception { + ReadOnlyField.super.set(t); + } + }).doOnError(new Consumer<Throwable>() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e("Twine", "onError in source observable", throwable); + } + }).onErrorResumeNext(Observable.<T>empty()).share(); + } + + /** + * @deprecated Setter of com.sirilix.mvvm.ReadOnlyField does nothing. Merge with the source Observable instead. + * See <a href="https://github.com/manas-chaudhari/android-mvvm/tree/master/Documentation/ObservablesAndSetters.md">Documentation/ObservablesAndSetters.md</a> + */ + @Deprecated + @Override + public void set(T value) { + } + + @Override + public synchronized void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) { + super.addOnPropertyChangedCallback(callback); + subscriptions.put(callback, source.subscribe()); + } + + @Override + public synchronized void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) { + super.removeOnPropertyChangedCallback(callback); + Disposable subscription = subscriptions.remove(callback); + if (subscription != null && !subscription.isDisposed()) { + subscription.dispose(); + } + } +} diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/RelayCommand.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/RelayCommand.java new file mode 100644 index 000000000..586ef9ef6 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/RelayCommand.java @@ -0,0 +1,68 @@ +package com.twine.tango.sharedui.mvvm; + +import android.databinding.BindingAdapter; +import android.view.View; + +/** + * Created by Roy on 7/27/2017. + */ + +public class RelayCommand { + + public interface OnCommandExecute + { + void execute(); + } + + public interface CommandCanExecute + { + boolean canExecute(); + } + + public OnCommandExecute onCommandExecute; + + public CommandCanExecute commandCanExecute; + + private View bindedView; + + @BindingAdapter("android:command") + public static void CommandBinding(View view, RelayCommand command) + { + command.bindedView = view; + + view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + command.execute(); + } + }); + + command.invalidateCommand(); + } + + public RelayCommand(OnCommandExecute onCommandExecute) { + this.onCommandExecute = onCommandExecute; + } + + public RelayCommand(OnCommandExecute onCommandExecute, CommandCanExecute commandCanExecute) { + this.onCommandExecute = onCommandExecute; + this.commandCanExecute = commandCanExecute; + } + + public RelayCommand() { + + } + + public void execute() + { + onCommandExecute.execute(); + } + + public void invalidateCommand() + { + if (commandCanExecute != null) + { + bindedView.setEnabled(commandCanExecute.canExecute()); + } + } +} diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/ViewContract.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/ViewContract.java new file mode 100644 index 000000000..89427070b --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/ViewContract.java @@ -0,0 +1,8 @@ +package com.twine.tango.sharedui.mvvm; + +import io.reactivex.functions.Consumer; + +public interface ViewContract { + void attachView(); + void validateFields(Consumer<Boolean> consumer); +} diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/ViewModelBase.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/ViewModelBase.java new file mode 100644 index 000000000..4e66d88e9 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/ViewModelBase.java @@ -0,0 +1,21 @@ +package com.twine.tango.sharedui.mvvm; + +import android.util.Log; + +/** + * Created by Roy on 7/26/2017. + */ + +public abstract class ViewModelBase<T extends ViewContract> { + + public T view; //TODO: Maybe use WeakReference<T> to not prevent garbage collector from disposing the activity ? + + public void attachView(T view) { + this.view = view; + onViewAttached(view); + } + + protected void onViewAttached(T view) { + Log.i("MVVM",view.getClass().getSimpleName() + " attached to " + this.getClass().getSimpleName()); + } +} diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/notifications/AndroidNotificationProvider.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/notifications/AndroidNotificationProvider.java new file mode 100644 index 000000000..7fd2cfacd --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/notifications/AndroidNotificationProvider.java @@ -0,0 +1,22 @@ +package com.twine.tango.sharedui.notifications; + +import android.content.Context; +import android.widget.Toast; + +/** + * Created by Roy on 7/29/2017. + */ + +public class AndroidNotificationProvider implements NotificationProvider { + + private Context context; + + public AndroidNotificationProvider(Context context) { + this.context = context; + } + + @Override + public void notify(String message) { + Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); + } +} diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/notifications/NotificationProvider.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/notifications/NotificationProvider.java new file mode 100644 index 000000000..87fe8359d --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/notifications/NotificationProvider.java @@ -0,0 +1,11 @@ +package com.twine.tango.sharedui.notifications; + +/** + * Created by Roy on 7/29/2017. + */ + +public interface NotificationProvider { + + void notify(String message); + +} 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 new file mode 100644 index 000000000..2e151cc01 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/paging/PagerAdapter.java @@ -0,0 +1,61 @@ +package com.twine.tango.sharedui.paging; + +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; + +import com.twine.tango.sharedui.containers.FragmentBaseV4; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Roy on 7/24/2017. + */ + +public class PagerAdapter extends FragmentPagerAdapter { + + private List<FragmentBaseV4> fragments; + private int currentPosition; + + public PagerAdapter(FragmentManager fm) { + super(fm); + + fragments = new ArrayList<>(); + } + + public void addFragment(FragmentBaseV4 fragment) + { + fragments.add(fragment); + } + + public void removeFragment(FragmentBaseV4 fragment) + { + fragments.remove(fragment); + } + + @Override + public Fragment getItem(int position) { + currentPosition = position; + return fragments.get(position); + } + + @SuppressWarnings("unchecked") + public <T> T getCurrentFragment() { + return (T) getItem(currentPosition); + } + + @Override + public int getCount() { + return fragments.size(); + } + + @Override + public CharSequence getPageTitle(int position) { + if (fragments.get(position) != null) { + return fragments.get(position).getTitle(); + } else { + return ""; + } + } +} diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/paging/PagerZoomTransform.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/paging/PagerZoomTransform.java new file mode 100644 index 000000000..9c114c01c --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/paging/PagerZoomTransform.java @@ -0,0 +1,44 @@ +package com.twine.tango.sharedui.paging; + +import android.support.v4.view.ViewPager; +import android.view.View; + +public class PagerZoomTransform implements ViewPager.PageTransformer { + private static final float MIN_SCALE = 0.85f; + private static final float MIN_ALPHA = 0.5f; + + public void transformPage(View view, float position) { + int pageWidth = view.getWidth(); + int pageHeight = view.getHeight(); + + if (position < -1) { // [-Infinity,-1) + // This page is way off-screen to the left. + view.setAlpha(0); + + } else if (position <= 1) { // [-1,1] + // Modify the default slide transition to shrink the page as well + float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); + float vertMargin = pageHeight * (1 - scaleFactor) / 2; + float horzMargin = pageWidth * (1 - scaleFactor) / 2; + if (position < 0) { + view.setTranslationX(horzMargin - vertMargin / 2); + } else { + view.setTranslationX(-horzMargin + vertMargin / 2); + } + + // Scale the page down (between MIN_SCALE and 1) + view.setScaleX(scaleFactor); + view.setScaleY(scaleFactor); + + // Fade the page relative to its size. + view.setAlpha(MIN_ALPHA + + (scaleFactor - MIN_SCALE) / + (1 - MIN_SCALE) * (1 - MIN_ALPHA)); + + } else { // (1,+Infinity] + // This page is way off-screen to the right. + view.setAlpha(0); + } + } +} + diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/validation/ViewValidator.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/validation/ViewValidator.java new file mode 100644 index 000000000..4c62b7548 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/validation/ViewValidator.java @@ -0,0 +1,23 @@ +package com.twine.tango.sharedui.validation; + +import com.mobsandgeeks.saripaar.ValidationError; +import com.mobsandgeeks.saripaar.Validator; + +import java.util.List; + +/** + * Created by Roy on 11/6/2017. + */ + +public class ViewValidator implements Validator.ValidationListener { + + @Override + public void onValidationSucceeded() { + + } + + @Override + public void onValidationFailed(List<ValidationError> errors) { + + } +} diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/res/values/strings.xml b/Software/Android_Studio/Tango.SharedUI/src/main/res/values/strings.xml new file mode 100644 index 000000000..824fc72c7 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">Tango.SharedUI</string> +</resources> diff --git a/Software/Android_Studio/Tango.SharedUI/src/test/java/com/twine/tango/sharedui/ExampleUnitTest.java b/Software/Android_Studio/Tango.SharedUI/src/test/java/com/twine/tango/sharedui/ExampleUnitTest.java new file mode 100644 index 000000000..0ad67a99f --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/test/java/com/twine/tango/sharedui/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.twine.tango.sharedui; + +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.Stubs.UI/.gitignore b/Software/Android_Studio/Tango.Stubs.UI/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Software/Android_Studio/Tango.Stubs.UI/build.gradle b/Software/Android_Studio/Tango.Stubs.UI/build.gradle new file mode 100644 index 000000000..dc8ece75e --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/build.gradle @@ -0,0 +1,68 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 26 + buildToolsVersion "26.0.1" + + + defaultConfig { + applicationId "com.twine.tango.stubs.ui" + minSdkVersion 22 + targetSdkVersion 26 + versionCode 1 + versionName "1.0" + vectorDrawables.useSupportLibrary = true + + 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 + } + + dexOptions { + preDexLibraries = false + } +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'com.android.support:appcompat-v7:26.1.0' + implementation 'com.android.support.constraint:constraint-layout:1.0.2' + implementation 'com.android.support:support-v4:26.1.0' + compile 'com.android.support:design: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' + //Extensions + compile 'io.reactivex.rxjava2:rxjava:2.1.2' + compile globalDependencies.dagger + compile globalDependencies.daggerAndroid + compile 'com.squareup:otto:1.3.8' + compile 'me.tatarka.bindingcollectionadapter2:bindingcollectionadapter:2.2.0' + compile 'me.tatarka.bindingcollectionadapter2:bindingcollectionadapter-recyclerview:2.2.0' + annotationProcessor 'com.google.dagger:dagger-android-processor:2.11' + annotationProcessor 'com.google.dagger:dagger-compiler:2.11' + compile 'com.mobsandgeeks:android-saripaar:2.0.3' + compile 'com.jakewharton:butterknife:8.7.0' + annotationProcessor 'com.jakewharton:butterknife-compiler:8.7.0' + compile project(path: ':Tango.SharedUI') + implementation project(':Tango.Models') + implementation project(':Tango.Stubs') + implementation project(':Tango.Integration') + compile globalDependencies.joda + implementation project(':Tango.Transport') + implementation project(':Tango.Core') +} diff --git a/Software/Android_Studio/Tango.Stubs.UI/proguard-rules.pro b/Software/Android_Studio/Tango.Stubs.UI/proguard-rules.pro new file mode 100644 index 000000000..a0eef131a --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/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.Stubs.UI/src/androidTest/java/com/twine/tango/stubs/ui/ExampleInstrumentedTest.java b/Software/Android_Studio/Tango.Stubs.UI/src/androidTest/java/com/twine/tango/stubs/ui/ExampleInstrumentedTest.java new file mode 100644 index 000000000..96fd8593f --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/androidTest/java/com/twine/tango/stubs/ui/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.twine.tango.stubs.ui; + +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.stubs.ui", appContext.getPackageName()); + } +} diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/AndroidManifest.xml b/Software/Android_Studio/Tango.Stubs.UI/src/main/AndroidManifest.xml new file mode 100644 index 000000000..d609ad25d --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.twine.tango.stubs.ui"> + + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + + <application + android:name=".App" + android:allowBackup="true" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:roundIcon="@mipmap/ic_launcher_round" + android:supportsRtl="false" + android:theme="@style/AppTheme"> + <activity android:name=".views.main.MainActivity"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + + <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/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())); + }); + } +} 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 Binary files differnew file mode 100644 index 000000000..4263288e8 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/database.png 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_launcher_background.xml b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000..1cd2a3665 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,113 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="108.0" + android:viewportWidth="108.0"> + <path + android:fillColor="#26A69A" + android:pathData="M0,0h108v108h-108z" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M19,0L19,108" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M9,0L9,108" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M39,0L39,108" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M29,0L29,108" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M59,0L59,108" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M49,0L49,108" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M79,0L79,108" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M69,0L69,108" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M89,0L89,108" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M99,0L99,108" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,89L108,89" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,99L108,99" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,69L108,69" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,79L108,79" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,49L108,49" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,59L108,59" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,29L108,29" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,39L108,39" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,19L108,19" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,9L108,9" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> +</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 Binary files differnew file mode 100644 index 000000000..5d6249d61 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/stubs.png 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 Binary files differnew file mode 100644 index 000000000..8d700439a --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/user.png 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 new file mode 100644 index 000000000..2a3ae6a77 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/activity_main.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="utf-8"?> + +<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bind="http://schemas.android.com/apk/res-auto"> + + <data> + + <variable + name="vm" + type="com.twine.tango.stubs.ui.views.main.MainActivityVM" /> + </data> + + <android.support.v4.widget.DrawerLayout + android:id="@+id/drawerLayout" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <!--Main Content--> + <RelativeLayout xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="com.twine.tango.stubs.ui.views.main.MainActivity"> + + <android.support.v7.widget.Toolbar + android:id="@+id/toolbar1" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?attr/colorPrimary" + android:minHeight="?attr/actionBarSize" + android:theme="?attr/actionBarTheme" /> + + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_below="@+id/toolbar1" + android:layout_alignParentStart="true"> + + + <FrameLayout + android:id="@+id/fragment_container" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_centerHorizontal="true" + android:layout_centerVertical="true"> + + </FrameLayout> + </RelativeLayout> + </RelativeLayout> + + <!--Side Menu--> + <!--<include layout="@layout/side_menu" bind:vm="@{vm}" />--> + + </android.support.v4.widget.DrawerLayout> + +</layout> 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..0db72ee5b --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/activity_stub.xml @@ -0,0 +1,146 @@ +<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="@{vm.stub.name}" + android:textSize="18sp" /> + + <TextView + android:id="@+id/textView4" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@{vm.stub.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" + android:command="@{vm.runCommand}" /> + + <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..20fc4aae7 --- /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="@{safeUnbox(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 new file mode 100644 index 000000000..db174541a --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/fragment_login.xml @@ -0,0 +1,67 @@ +<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.login.LoginFragmentVM" /> + </data> + + <RelativeLayout xmlns:tools="http://schemas.android.com/tools" + 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.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 new file mode 100644 index 000000000..938f06e32 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/fragment_selection.xml @@ -0,0 +1,63 @@ +<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.selection.SelectionFragmentVM" /> + </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.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..0300fc558 --- /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.stubs.AvailableStub"/> + </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/mipmap-anydpi-v26/ic_launcher.xml b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..00f9eaaf3 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@drawable/ic_launcher_background" /> + <foreground android:drawable="@mipmap/ic_launcher_foreground" /> +</adaptive-icon>
\ No newline at end of file diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..00f9eaaf3 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@drawable/ic_launcher_background" /> + <foreground android:drawable="@mipmap/ic_launcher_foreground" /> +</adaptive-icon>
\ No newline at end of file diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-hdpi/ic_launcher.png b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-hdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..550730310 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-hdpi/ic_launcher_foreground.png Binary files differnew file mode 100644 index 000000000..4e526c95b --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-hdpi/ic_launcher_foreground.png diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-hdpi/ic_launcher_round.png b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-hdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000..8fab6a3a5 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-mdpi/ic_launcher.png b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-mdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..6bc7fcd6f --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-mdpi/ic_launcher_foreground.png Binary files differnew file mode 100644 index 000000000..2c38c7190 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-mdpi/ic_launcher_foreground.png diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-mdpi/ic_launcher_round.png b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-mdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000..1eecc0e7d --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xhdpi/ic_launcher.png b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xhdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..ec87dcebe --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png Binary files differnew file mode 100644 index 000000000..072467eaa --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xhdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000..05ca079ca --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..6f67f21ba --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png Binary files differnew file mode 100644 index 000000000..78a6b7a34 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxhdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000..8bac0f274 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..0327e13fa --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png Binary files differnew file mode 100644 index 000000000..68ebe33fe --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000..bacd3e758 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png 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 new file mode 100644 index 000000000..29b840969 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/values/colors.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <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 new file mode 100644 index 000000000..7160cf9f5 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/values/strings.xml @@ -0,0 +1,6 @@ +<resources> + <string name="app_name">Tango Machine Tester</string> + + <!-- TODO: Remove or change this placeholder text --> + <string name="hello_blank_fragment">Hello blank fragment</string> +</resources> diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/values/styles.xml b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/values/styles.xml new file mode 100644 index 000000000..19e556ba1 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ +<resources> + + <!-- Base application theme. --> + <style name="AppTheme" parent="Theme.AppCompat.NoActionBar"> + <!-- Customize your theme here. --> + <!--<item name="colorPrimary">@color/colorPrimary</item>--> + <!--<item name="colorPrimaryDark">@color/colorPrimaryDark</item>--> + <!--<item name="colorAccent">@color/colorAccent</item>--> + </style> + +</resources> diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/test/java/com/twine/tango/stubs/ui/ExampleUnitTest.java b/Software/Android_Studio/Tango.Stubs.UI/src/test/java/com/twine/tango/stubs/ui/ExampleUnitTest.java new file mode 100644 index 000000000..e57a25835 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/test/java/com/twine/tango/stubs/ui/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.twine.tango.stubs.ui; + +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.Stubs/.gitignore b/Software/Android_Studio/Tango.Stubs/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Software/Android_Studio/Tango.Stubs/build.gradle b/Software/Android_Studio/Tango.Stubs/build.gradle new file mode 100644 index 000000000..569ef5a96 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs/build.gradle @@ -0,0 +1,61 @@ +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(include: ['*.jar'], dir: 'libs') + implementation 'com.android.support:appcompat-v7:26.1.0' + compile globalDependencies.logging + 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' + implementation project(':Tango.Integration') + compile project(path: ':Tango.PMR') + implementation project(':Tango.Core') + compile project(path: ':Tango.Transport') +} + +task reflectStubs() << { + def file = new File("$projectDir/src\\main\\res\\raw\\stubs.txt") + + file.newWriter().withWriter { w -> + def pmrDir = new File("Tango.Stubs\\src\\main\\java\\com\\twine\\tango\\stubs\\stubs") + + pmrDir.eachFileRecurse { f -> + w << f.name.replace(".java","") + "\r\n" + } + } +} + +tasks.withType(JavaCompile) { + compileTask -> compileTask.dependsOn reflectStubs +} diff --git a/Software/Android_Studio/Tango.Stubs/proguard-rules.pro b/Software/Android_Studio/Tango.Stubs/proguard-rules.pro new file mode 100644 index 000000000..a0eef131a --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs/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.Stubs/src/androidTest/java/com/twine/tango/stubs/ExampleInstrumentedTest.java b/Software/Android_Studio/Tango.Stubs/src/androidTest/java/com/twine/tango/stubs/ExampleInstrumentedTest.java new file mode 100644 index 000000000..b8283f5e3 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs/src/androidTest/java/com/twine/tango/stubs/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.twine.tango.stubs; + +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.stubs.test", appContext.getPackageName()); + } +} diff --git a/Software/Android_Studio/Tango.Stubs/src/main/AndroidManifest.xml b/Software/Android_Studio/Tango.Stubs/src/main/AndroidManifest.xml new file mode 100644 index 000000000..9e51ae77e --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.twine.tango.stubs" /> diff --git a/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/AvailableStub.java b/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/AvailableStub.java new file mode 100644 index 000000000..ca6d691de --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/AvailableStub.java @@ -0,0 +1,66 @@ +package com.twine.tango.stubs; + +import com.elvishew.xlog.XLog; +import com.twine.tango.transport.ITransporter; + +/** + * Created by Roy on 11/14/2017. + */ + +public class AvailableStub +{ + + private Class<?> type; + private String name; + private String description; + + public Class<?> getType() + { + return type; + } + + public void setType(Class<?> type) + { + this.type = type; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getDescription() + { + return description; + } + + public void setDescription(String description) + { + this.description = description; + } + + public AvailableStub(Class<?> type, String name, String description) + { + this.type = type; + this.name = name; + this.description = description; + } + + public StubBase createInstance(ITransporter transporter) + { + try + { + return (StubBase) type.getConstructor(ITransporter.class).newInstance(transporter); + } catch (Exception e) + { + XLog.e(e); + } + + return null; + } +} diff --git a/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/IStub.java b/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/IStub.java new file mode 100644 index 000000000..c91c11caf --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/IStub.java @@ -0,0 +1,16 @@ +package com.twine.tango.stubs; + +import com.twine.tango.core.Action; + +import io.reactivex.Observable; +import io.reactivex.Single; + +/** + * Created by Roy on 11/14/2017. + */ + +public interface IStub { + StubState getState(); + Observable<String> run(); + Single<String> cancel(); +} diff --git a/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubAttribute.java b/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubAttribute.java new file mode 100644 index 000000000..91f81db5b --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubAttribute.java @@ -0,0 +1,21 @@ +package com.twine.tango.stubs; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by Roy on 11/14/2017. + */ + + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface StubAttribute { + + StubDirection direction() default StubDirection.ToMachine; + String name() default ""; + String description() default ""; + +} diff --git a/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubBase.java b/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubBase.java new file mode 100644 index 000000000..b26e3ae3f --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubBase.java @@ -0,0 +1,100 @@ +package com.twine.tango.stubs; + +import com.elvishew.xlog.XLog; +import com.twine.tango.core.Action; +import com.twine.tango.core.Reflections; +import com.twine.tango.stubs.stubs.Calculate; +import com.twine.tango.transport.ITransporter; + +import java.lang.annotation.Annotation; +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Observable; +import io.reactivex.Single; +import io.reactivex.subjects.PublishSubject; + +/** + * Created by Roy on 11/14/2017. + */ + +public abstract class StubBase implements IStub { + + private ITransporter transporter; + private StubState state; + + public ITransporter getTransporter() { + return transporter; + } + + public void setTransporter(ITransporter transporter) { + this.transporter = transporter; + } + + @Override + public StubState getState() { + return state; + } + + protected void setState(StubState state) { + this.state = state; + } + + public StubBase(ITransporter transporter) { + this.transporter = transporter; + } + + @Override + public Observable<String> run() { + + PublishSubject<String> subject = PublishSubject.create(); + + XLog.i("Executing stub " + this.getClass().getSimpleName() + "..."); + setState(StubState.Running); + + onRun().subscribe((res) -> + { + subject.onNext(res); + setState(StubState.Passed); + XLog.i("Stub completed successfully with result " + res); + }, + (ex) -> + { + setState(StubState.Failed); + XLog.i("Stub failed."); + subject.onError(ex); + }); + setState(StubState.Running); + + return subject; + } + + @Override + public Single<String> cancel() { + return null; + } + + protected abstract Observable<String> onRun(); + + public static List<AvailableStub> getAllStubs(StubDirection direction) + { + List<AvailableStub> stubs = new ArrayList<>(); + + List<String> names = Reflections.getReflectionListFromResource(R.raw.stubs); + + for (String name : names) + { + try + { + Class cls = Class.forName("com.twine.tango.stubs.stubs." + name); + StubAttribute att = (StubAttribute) cls.getAnnotation(StubAttribute.class); + stubs.add(new AvailableStub(cls,att.name(),att.description())); + } catch (ClassNotFoundException e) + { + e.printStackTrace(); + } + } + + return stubs; + } +} diff --git a/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubDirection.java b/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubDirection.java new file mode 100644 index 000000000..17409dd8e --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubDirection.java @@ -0,0 +1,11 @@ +package com.twine.tango.stubs; + +/** + * Created by Roy on 11/14/2017. + */ + +public enum StubDirection { + ToMachine, + ToMobile, + Both, +} diff --git a/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubState.java b/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubState.java new file mode 100644 index 000000000..5a83533f0 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubState.java @@ -0,0 +1,13 @@ +package com.twine.tango.stubs; + +/** + * Created by Roy on 11/14/2017. + */ + +public enum StubState { + Stopped, + Running, + Passed, + Failed, + Canceled +} diff --git a/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/stubs/Calculate.java b/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/stubs/Calculate.java new file mode 100644 index 000000000..185858958 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/stubs/Calculate.java @@ -0,0 +1,44 @@ +package com.twine.tango.stubs.stubs; + +import com.twine.tango.core.Action; +import com.twine.tango.pmr.MessageFactory; +import com.twine.tango.pmr.stubs.CalculateRequestOuterClass.CalculateRequest; +import com.twine.tango.pmr.stubs.CalculateResponseOuterClass.CalculateResponse; +import com.twine.tango.stubs.StubAttribute; +import com.twine.tango.stubs.StubBase; +import com.twine.tango.stubs.StubDirection; +import com.twine.tango.transport.ITransporter; + +import io.reactivex.Observable; +import io.reactivex.Single; +import io.reactivex.subjects.PublishSubject; + +/** + * Created by Roy on 11/14/2017. + */ + + +@StubAttribute(direction = StubDirection.ToMachine, name = "Calculate", description = "Calculate Description...") +public class Calculate extends StubBase +{ + + public Calculate(ITransporter transporter) + { + super(transporter); + } + + @Override + protected Observable<String> onRun() + { + + PublishSubject<String> subject = PublishSubject.create(); + + getTransporter().<CalculateRequest, CalculateResponse>sendRequest( + MessageFactory.createTangoMessage( + CalculateRequest.class, + CalculateRequest.newBuilder().setA(10).setB(5).build())).subscribe((response) -> + subject.onNext(String.valueOf(response.getSum()))); + + return subject; + } +} diff --git a/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/stubs/Progress.java b/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/stubs/Progress.java new file mode 100644 index 000000000..4bfe84609 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/stubs/Progress.java @@ -0,0 +1,39 @@ +package com.twine.tango.stubs.stubs; + +import com.twine.tango.pmr.MessageFactory; +import com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest; +import com.twine.tango.pmr.stubs.ProgressResponseOuterClass.ProgressResponse; +import com.twine.tango.stubs.StubAttribute; +import com.twine.tango.stubs.StubBase; +import com.twine.tango.stubs.StubDirection; +import com.twine.tango.transport.ITransporter; + +import io.reactivex.Observable; +import io.reactivex.subjects.PublishSubject; + +/** + * Created by Roy on 11/14/2017. + */ + +@StubAttribute(direction = StubDirection.ToMachine, name = "Progress", description = "Multi Response Test...") +public class Progress extends StubBase +{ + public Progress(ITransporter transporter) + { + super(transporter); + } + + @Override + protected Observable<String> onRun() + { + PublishSubject<String> subject = PublishSubject.create(); + + getTransporter().<ProgressRequest, ProgressResponse>sendContinuousRequest( + MessageFactory.createTangoMessage( + ProgressRequest.class, + ProgressRequest.newBuilder().build())).subscribe((response) -> + subject.onNext(String.valueOf(response.getProgress()))); + + return subject; + } +} diff --git a/Software/Android_Studio/Tango.Stubs/src/main/res/raw/stubs.txt b/Software/Android_Studio/Tango.Stubs/src/main/res/raw/stubs.txt new file mode 100644 index 000000000..62376dd96 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs/src/main/res/raw/stubs.txt @@ -0,0 +1,2 @@ +Calculate +Progress diff --git a/Software/Android_Studio/Tango.Stubs/src/main/res/values/strings.xml b/Software/Android_Studio/Tango.Stubs/src/main/res/values/strings.xml new file mode 100644 index 000000000..62b1a5fd0 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">Tango.Stubs</string> +</resources> diff --git a/Software/Android_Studio/Tango.Stubs/src/test/java/com/twine/tango/stubs/ExampleUnitTest.java b/Software/Android_Studio/Tango.Stubs/src/test/java/com/twine/tango/stubs/ExampleUnitTest.java new file mode 100644 index 000000000..d111c04aa --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs/src/test/java/com/twine/tango/stubs/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.twine.tango.stubs; + +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.Transport/.gitignore b/Software/Android_Studio/Tango.Transport/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Software/Android_Studio/Tango.Transport/build.gradle b/Software/Android_Studio/Tango.Transport/build.gradle new file mode 100644 index 000000000..cb10be67c --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/build.gradle @@ -0,0 +1,56 @@ +apply plugin: 'com.android.library' +//apply plugin: 'me.tatarka.retrolambda' + +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' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +//retrolambda { +// jdk System.getenv("java_home") +// javaVersion JavaVersion.VERSION_1_7 +// defaultMethods false +// incremental true +//} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + 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' + + implementation project(':Tango.PMR') + implementation project(':Tango.Core') + + compile globalDependencies.rxJavaAndroid + compile globalDependencies.rxJava + compile globalDependencies.logging + compile globalDependencies.protobuf + compile globalDependencies.joda + + compile 'net.sourceforge.streamsupport:streamsupport:1.5.6' + compile 'br.com.zbra:android-linq:1.1.0' +} diff --git a/Software/Android_Studio/Tango.Transport/proguard-rules.pro b/Software/Android_Studio/Tango.Transport/proguard-rules.pro new file mode 100644 index 000000000..a0eef131a --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/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.Transport/src/androidTest/java/com/twine/tango/transport/ExampleInstrumentedTest.java b/Software/Android_Studio/Tango.Transport/src/androidTest/java/com/twine/tango/transport/ExampleInstrumentedTest.java new file mode 100644 index 000000000..77769c3d9 --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/src/androidTest/java/com/twine/tango/transport/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.twine.tango.transport; + +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.transport.test", appContext.getPackageName()); + } +} diff --git a/Software/Android_Studio/Tango.Transport/src/main/AndroidManifest.xml b/Software/Android_Studio/Tango.Transport/src/main/AndroidManifest.xml new file mode 100644 index 000000000..385ee4a47 --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.twine.tango.transport" /> diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportAdapter.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportAdapter.java new file mode 100644 index 000000000..cdb2d4a6d --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportAdapter.java @@ -0,0 +1,43 @@ +package com.twine.tango.transport; + +import com.twine.tango.core.EventHandler; +import com.twine.tango.core.ObjectDisposedException; + +import java.io.IOException; + +import java8.util.function.Consumer; + +/** + * Represents a transport adapter capable of connecting, writing and receiving data from a serial stream. + */ +public interface ITransportAdapter extends ITransportComponent { + + /** + * Writes the specified data to the stream. + * + * @param data the data + */ + void write(byte[] data) throws ObjectDisposedException, IOException; + + /** + * Add data available listener. + * + * @param handler event handler + */ + void setDataAvailableListener(EventHandler<byte[]> handler); + + /** + * Gets the adapter address. + * + * @return the address + */ + String getAddress(); + + /** + * Sets the adapter address. + * + * @param address the address + */ + void setAddress(String address); + +} diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportComponent.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportComponent.java new file mode 100644 index 000000000..b2b78f94b --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportComponent.java @@ -0,0 +1,42 @@ +package com.twine.tango.transport; + +import com.twine.tango.core.EventHandler; +import com.twine.tango.core.IDisposable; +import com.twine.tango.core.ObjectDisposedException; +import io.reactivex.Completable; +import java8.util.function.Consumer; + + +/** + * Represents a transport component. + */ +public interface ITransportComponent extends IDisposable { + + /** + * Connects the transport component. + * + * @return the completable future + */ + Completable connect() throws ObjectDisposedException; + + /** + * Disconnects the transport component. + * + * @return the completable future + */ + Completable disconnect(); + + /** + * Add state changed listener. + * + * @param listener the listener + */ + void setStateChangedListener(EventHandler<TransportComponentState> listener); + + /** + * Gets state. + * + * @return the state + */ + TransportComponentState getState(); +} diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransporter.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransporter.java new file mode 100644 index 000000000..0ad375cba --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransporter.java @@ -0,0 +1,43 @@ +package com.twine.tango.transport; + +import com.google.protobuf.GeneratedMessageV3; +import com.twine.tango.core.Action; +import com.twine.tango.core.EventHandler; +import com.twine.tango.core.ObservableCollection; +import com.twine.tango.pmr.TangoMessage; +import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer; + +import org.joda.time.Period; + +import java.time.Duration; + +import io.reactivex.Observable; +import java8.util.function.Consumer; +import io.reactivex.Single; + +/** + * Created by Roy on 11/13/2017. + */ + +public interface ITransporter extends ITransportComponent { + + ObservableCollection<ITransportAdapter> getAdapters(); + + <Request extends GeneratedMessageV3,Response extends GeneratedMessageV3> Single<Response> sendRequest(TangoMessage<Request> request); + + <Request extends GeneratedMessageV3,Response extends GeneratedMessageV3> Single<Response> sendRequest(TangoMessage<Request> request,ITransportAdapter adapter); + + <Request extends GeneratedMessageV3,Response extends GeneratedMessageV3> Observable<Response> sendContinuousRequest(TangoMessage<Request> request); + + <Request extends GeneratedMessageV3,Response extends GeneratedMessageV3> Observable<Response> sendContinuousRequest(TangoMessage<Request> request, ITransportAdapter adapter); + + <Response extends GeneratedMessageV3> Single<Response> sendResponse(TangoMessage<Response> response); + + <Response extends GeneratedMessageV3> Single<Response> sendResponse(TangoMessage<Response> response,String token); + + void setRequestReceiverListener(EventHandler<MessageContainer> listener); + + Period getRequestTimeout(); + + void setRequestTimeout(Period duration); +} diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/PendingResponse.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/PendingResponse.java new file mode 100644 index 000000000..bb4f2505a --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/PendingResponse.java @@ -0,0 +1,63 @@ +package com.twine.tango.transport; + + +/** + * Represents a pending response waiting to be returned to the request sender. + */ +public class PendingResponse { + + private ITransportAdapter adapter; + private boolean isContinuous; + + /** + * Gets adapter. + * + * @return the adapter + */ + public ITransportAdapter getAdapter() + { + return adapter; + } + + /** + * Sets adapter. + * + * @param adapter the adapter + */ + public void setAdapter(ITransportAdapter adapter) + { + this.adapter = adapter; + } + + /** + * Is continuous boolean. + * + * @return the boolean + */ + public boolean isContinuous() + { + return isContinuous; + } + + /** + * Sets continuous. + * + * @param continuous the continuous + */ + public void setContinuous(boolean continuous) + { + isContinuous = continuous; + } + + /** + * Instantiates a new Pending response. + * + * @param adapter the adapter + * @param isContinuous is continuous + */ + public PendingResponse(ITransportAdapter adapter, boolean isContinuous) + { + this.adapter = adapter; + this.isContinuous = isContinuous; + } +} diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportAdapterBase.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportAdapterBase.java new file mode 100644 index 000000000..faa50dadf --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportAdapterBase.java @@ -0,0 +1,94 @@ +package com.twine.tango.transport; + +import com.elvishew.xlog.XLog; +import com.twine.tango.core.Action; +import com.twine.tango.core.EventHandler; +import com.twine.tango.core.ObjectDisposedException; + +import java.io.IOException; + +import io.reactivex.Completable; +import java8.util.function.Consumer; + +/** + * Created by Roy on 11/12/2017. + */ + +public abstract class TransportAdapterBase implements ITransportAdapter { + + private String address; + private EventHandler<TransportComponentState> stateChangedListener; + private EventHandler<byte[]> dataAvailableListener; + private TransportComponentState state; + + + public abstract void write(byte[] data) throws ObjectDisposedException, IOException; + + public abstract Completable connect() throws ObjectDisposedException; + + public abstract Completable disconnect(); + + @Override + public void setDataAvailableListener(EventHandler<byte[]> handler) { + dataAvailableListener = handler; + } + + @Override + public String getAddress() { + return this.address; + } + + @Override + public void setAddress(String address) { + this.address = address; + } + + @Override + public void setStateChangedListener(EventHandler<TransportComponentState> listener) { + stateChangedListener = listener; + } + + @Override + public TransportComponentState getState() { + return state; + } + + protected void setState(TransportComponentState state) { + this.state = state; + if (stateChangedListener != null) { + try { + stateChangedListener.invoke(this, this.state); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + @Override + public void dispose() { + disconnect().blockingAwait(); + setState(TransportComponentState.Disposed); + } + + protected void throwIfDisposed() throws ObjectDisposedException { + if (state == TransportComponentState.Disposed) { + throw new ObjectDisposedException("The adapter is in a " + state + " state."); + } + } + + protected void onDataAvailable(byte[] data) { + if (dataAvailableListener != null) { + try { + dataAvailableListener.invoke(this, data); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + protected void onFailed(Exception ex) { + disconnect().blockingAwait(); + setState(TransportComponentState.Failed); + XLog.e(ex); + } +} diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportComponentState.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportComponentState.java new file mode 100644 index 000000000..fb9fa7b60 --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportComponentState.java @@ -0,0 +1,25 @@ +package com.twine.tango.transport; + +/** + * Represents an {@link ITransportComponent} state. + */ +public enum TransportComponentState { + + /** + * Disconnected transport component state. + */ + Disconnected, + /** + * Connected transport component state. + */ + Connected, + /** + * Failed transport component state. + */ + Failed, + /** + * Disposed transport component state. + */ + Disposed, + +} diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportMessage.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportMessage.java new file mode 100644 index 000000000..4ed894dba --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportMessage.java @@ -0,0 +1,37 @@ +package com.twine.tango.transport; + +import com.twine.tango.core.Func; + +import io.reactivex.subjects.PublishSubject; + +/** + * Created by Roy on 11/13/2017. + */ + +public class TransportMessage<T> extends TransportMessageBase +{ + + private PublishSubject<T> publishSubject; + + public TransportMessage(ITransportAdapter adapter, String token, Object message, TransportMessageDirection direction, Func<byte[]> serialize, PublishSubject<T> publishSubject) + { + super(adapter, token, message, direction, serialize); + this.publishSubject = publishSubject; + } + + @SuppressWarnings("unchecked") + @Override + protected void setResult(Object result, boolean completed) + { + + publishSubject.onNext((T) result); + if (completed) publishSubject.onComplete(); + } + + @Override + protected void setException(Exception error) + { + publishSubject.onError(error); + publishSubject.onComplete(); + } +} diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportMessageBase.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportMessageBase.java new file mode 100644 index 000000000..e236fc44f --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportMessageBase.java @@ -0,0 +1,91 @@ +package com.twine.tango.transport; + +import com.twine.tango.core.Func; + +/** + * Created by Roy on 11/13/2017. + */ + +public abstract class TransportMessageBase +{ + + private ITransportAdapter adapter; + private boolean isContinuous; + private String token; + private TransportMessageDirection direction; + private Func<byte[]> serialize; + private Object message; + + protected abstract void setResult(Object result, boolean completed); + + protected abstract void setException(Exception error); + + public ITransportAdapter getAdapter() + { + return adapter; + } + + public void setAdapter(ITransportAdapter adapter) + { + this.adapter = adapter; + } + + public boolean isContinuous() + { + return isContinuous; + } + + public void setContinuous(boolean continuous) + { + isContinuous = continuous; + } + + public String getToken() + { + return token; + } + + public void setToken(String token) + { + this.token = token; + } + + public TransportMessageDirection getDirection() + { + return direction; + } + + public void setDirection(TransportMessageDirection direction) + { + this.direction = direction; + } + + public Func<byte[]> getSerialize() + { + return serialize; + } + + public void setSerialize(Func<byte[]> serialize) + { + this.serialize = serialize; + } + + public Object getMessage() + { + return message; + } + + public void setMessage(Object message) + { + this.message = message; + } + + public TransportMessageBase(ITransportAdapter adapter, String token, Object message, TransportMessageDirection direction, Func<byte[]> serialize) + { + this.adapter = adapter; + this.token = token; + this.direction = direction; + this.serialize = serialize; + this.message = message; + } +} diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportMessageDirection.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportMessageDirection.java new file mode 100644 index 000000000..f055aa744 --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportMessageDirection.java @@ -0,0 +1,10 @@ +package com.twine.tango.transport; + +/** + * Created by Roy on 11/13/2017. + */ + +public enum TransportMessageDirection { + Request, + Response +} diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransporterBase.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransporterBase.java new file mode 100644 index 000000000..83ce58b97 --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransporterBase.java @@ -0,0 +1,566 @@ +package com.twine.tango.transport; + +import android.os.AsyncTask; +import android.os.SystemClock; +import android.util.Pair; + +import com.elvishew.xlog.XLog; +import com.google.protobuf.GeneratedMessageV3; +import com.google.protobuf.InvalidProtocolBufferException; +import com.twine.tango.core.EventHandler; +import com.twine.tango.core.Func; +import com.twine.tango.core.ObjectDisposedException; +import com.twine.tango.core.ObservableCollection; +import com.twine.tango.pmr.MessageFactory; +import com.twine.tango.pmr.TangoMessage; +import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer; + +import org.joda.time.Period; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import io.reactivex.Completable; +import io.reactivex.Observable; +import io.reactivex.Single; +import io.reactivex.schedulers.Schedulers; +import io.reactivex.subjects.PublishSubject; + +import static br.com.zbra.androidlinq.Linq.stream; + +/** + * Represents an {@link ITransporter} base class. + */ +public abstract class TransporterBase implements ITransporter +{ + + private ConcurrentLinkedQueue<TransportMessageBase> sendingQueue; + private List<TransportMessageBase> pendingRequests; + private ConcurrentLinkedQueue<Pair<ITransportAdapter, byte[]>> arrivedResponses; + private Thread pushThread; + private Thread pullThread; + private ObservableCollection<ITransportAdapter> adapters; + private Map<String, PendingResponse> pendingResponses; + private TransportComponentState state; + private Period requestTimeout; + + //region Events + + private EventHandler<MessageContainer> requestReceivedListener; + private EventHandler<TransportComponentState> stateChangedListener; + + //endregion + + //region Properties + + @Override + public ObservableCollection<ITransportAdapter> getAdapters() + { + return adapters; + } + + protected void setAdapters(ObservableCollection<ITransportAdapter> adapters) + { + + if (this.adapters != null) + { + adapters.clearOnChangeListener(); + } + + this.adapters = adapters; + + if (this.adapters != null) + { + adapters.setOnChangeListener(this::onAdaptersChanged); + } + } + + @Override + public TransportComponentState getState() + { + return state; + } + + protected void setState(TransportComponentState state) + { + this.state = state; + onStateChanged(this.state); + } + + @Override + public Period getRequestTimeout() + { + return requestTimeout; + } + + @Override + public void setRequestTimeout(Period requestTimeout) + { + this.requestTimeout = requestTimeout; + } + + //endregion + + //region Protected Methods + + protected void onAdaptersChanged() + { + + XLog.i("Adapters collection changed, Listing adapters:"); + + for (ITransportAdapter adapter : adapters) + { + + XLog.i(adapter.getClass().getName() + ", " + adapter.getAddress() + ", " + adapter.getState()); + + adapter.setStateChangedListener(this::onAdapterStateChanged); + adapter.setDataAvailableListener(this::onAdapterDataAvailable); + + if (this.getState() == TransportComponentState.Connected && adapter.getState() == TransportComponentState.Disconnected) + { + try + { + adapter.connect().subscribe(); + } catch (ObjectDisposedException e) + { + XLog.e(e); + } + } + } + } + + private void onAdapterDataAvailable(Object sender, byte[] data) + { + arrivedResponses.add(new Pair<>((ITransportAdapter) sender, data)); + } + + + private void onAdapterStateChanged(Object sender, TransportComponentState state) + { + + if (state == TransportComponentState.Disposed) + { + adapters.remove((ITransportAdapter) sender); + } else if (state == TransportComponentState.Failed) + { + //TODO: decide what to do here... + } + } + + protected void onStateChanged(TransportComponentState state) + { + if (stateChangedListener != null) stateChangedListener.invoke(this, state); + } + + protected <T extends GeneratedMessageV3> Func<byte[]> onSerializingMessage(TangoMessage<T> message) + { + return new Func<byte[]>() + { + @Override + public byte[] invoke() + { + return message.toBytes(); + } + }; + } + + protected void onFailed(Exception ex) + { + disconnect().blockingAwait(); + setState(TransportComponentState.Failed); + XLog.e("Transporter failed.", ex); + } + + protected void onRequestReceived(MessageContainer request) + { + if (requestReceivedListener != null) requestReceivedListener.invoke(this, request); + } + + protected MessageContainer onParseContainer(byte[] data) throws InvalidProtocolBufferException + { + return MessageFactory.parseContainer(data); + } + + protected GeneratedMessageV3 onParseMessage(MessageContainer container) throws InvalidProtocolBufferException, NoSuchMethodException, IllegalAccessException, InvocationTargetException + { + return MessageFactory.parseMessageFromContainerAgnostic(container); + } + + //endregion + + //region Constructors + + public TransporterBase() + { + setAdapters(new ObservableCollection<>()); + pendingResponses = new HashMap<>(); + sendingQueue = new ConcurrentLinkedQueue<>(); + pendingRequests = new ArrayList<>(); + arrivedResponses = new ConcurrentLinkedQueue<>(); + setRequestTimeout(Period.seconds(10)); + } + + public TransporterBase(ITransportAdapter adapter) + { + this(); + adapters.add(adapter); + } + + //endregion + + //region Public Methods + + @Override + public void setStateChangedListener(EventHandler<TransportComponentState> stateChangedListener) + { + this.stateChangedListener = stateChangedListener; + } + + @Override + public void setRequestReceiverListener(EventHandler<MessageContainer> listener) + { + this.requestReceivedListener = listener; + } + + @Override + public Completable connect() throws ObjectDisposedException + { + return Completable.create((x) -> + { + + try + { + if (adapters.size() == 0) + { + throw new IllegalArgumentException("This transporter has zero adapters."); + } + + for (ITransportAdapter adapter : adapters) + { + + adapter.connect().blockingAwait(); + } + + setState(TransportComponentState.Connected); + startThreads(); + + XLog.i("Transporter connected..."); + x.onComplete(); + } catch (Exception e) + { + XLog.e("Error connecting transporter", e); + } + }).subscribeOn(Schedulers.io()); + } + + @Override + public Completable disconnect() + { + setState(TransportComponentState.Disconnected); + + return Completable.create((x) -> + { + + try + { + for (ITransportAdapter adapter : adapters) + { + + adapter.disconnect().blockingAwait(); + } + + XLog.i("Transporter disconnected..."); + + x.onComplete(); + } catch (Exception e) + { + x.onError(e); + } + + }).subscribeOn(Schedulers.io()); + } + + @Override + public <Request extends GeneratedMessageV3, Response extends GeneratedMessageV3> Single<Response> sendRequest(TangoMessage<Request> request) + { + return sendRequest(request, null); + } + + @Override + public <Request extends GeneratedMessageV3, Response extends GeneratedMessageV3> Single<Response> sendRequest(TangoMessage<Request> request, ITransportAdapter adapter) + { + XLog.i("Queuing request message: " + request.getClass().getSimpleName() + " Token: " + request.getContainer().getToken() + " on adapter: " + (adapter != null ? adapter.getAddress() : "ALL")); + XLog.i("Expected response: " + Response.Builder.class.getSimpleName()); + + PublishSubject<Response> subject = PublishSubject.create(); + TransportMessage<Response> message = new TransportMessage<>(adapter, request.getContainer().getToken(), request, TransportMessageDirection.Request, onSerializingMessage(request), subject); + sendingQueue.add(message); + + Completable.timer(getRequestTimeout().getSeconds(), TimeUnit.SECONDS) + .subscribe(() -> + { + if (!subject.hasComplete()) + { + XLog.i("Request message " + request.getClass().getSimpleName() + " had timed out after " + getRequestTimeout().getSeconds() + " seconds."); + XLog.i("Setting request task exception..."); + subject.onError(new TimeoutException()); + } + }); + + return subject.singleOrError(); + } + + @Override + public <Request extends GeneratedMessageV3, Response extends GeneratedMessageV3> Observable<Response> sendContinuousRequest(TangoMessage<Request> request) + { + return sendContinuousRequest(request, null); + } + + @Override + public <Request extends GeneratedMessageV3, Response extends GeneratedMessageV3> Observable<Response> sendContinuousRequest(TangoMessage<Request> request, ITransportAdapter adapter) + { + XLog.i("Queuing continuous response request message: " + request.getClass().getSimpleName() + " Token: " + request.getContainer().getToken() + " on adapter: " + (adapter != null ? adapter.getAddress() : "ALL")); + XLog.i("Expected response: " + Response.Builder.class.getSimpleName()); + + request.getContainer().setContinuous(true); + request.getContainer().setCompleted(false); + + PublishSubject<Response> subject = PublishSubject.create(); + TransportMessage<Response> message = new TransportMessage<>(adapter, request.getContainer().getToken(), request, TransportMessageDirection.Request, onSerializingMessage(request), subject); + message.setContinuous(true); + sendingQueue.add(message); + + return subject; + } + + @Override + public <Response extends GeneratedMessageV3> Single<Response> sendResponse(TangoMessage<Response> response) + { + return sendResponse(response, response.getContainer().getToken()); + } + + @Override + public <Response extends GeneratedMessageV3> Single<Response> sendResponse(TangoMessage<Response> response, String token) + { + + response.getContainer().setToken(token); + + XLog.i("Queuing response message: " + response.getClass().getSimpleName()); + + PendingResponse pendingResponse = null; + ITransportAdapter adapter = null; + + XLog.i("Searching for matching request token: " + token); + + pendingResponse = pendingResponses.get(token); + + if (pendingResponse != null) + { + adapter = pendingResponse.getAdapter(); + XLog.i("Found matching request token: " + token + " on adapter: " + adapter.getAddress()); + + if (!pendingResponse.isContinuous()) + { + XLog.i("Removing matching request token..."); + pendingResponses.remove(token); + } else if (response.getContainer().getCompleted()) + { + XLog.i("Response completed. Removing matching request token..."); + pendingResponses.remove(token); + } + } else + { + //This should never happen. + XLog.w("Matching request token was not found..."); + throw new RuntimeException(); + } + + PublishSubject<Response> subject = PublishSubject.create(); + TransportMessage<Response> message = new TransportMessage<>(adapter, token, response, TransportMessageDirection.Response, onSerializingMessage(response), subject); + sendingQueue.add(message); + + return subject.singleOrError(); + } + //endregion + + //region Private Methods + + private void startThreads() + { + + pullThread = new Thread(this::pullThreadMethod); + pullThread.setName("Pull Thread"); + pullThread.start(); + + pushThread = new Thread(this::pushThreadMethod); + pushThread.setName("Push Thread"); + pushThread.start(); + } + + //endregion + + //region Push Thread + + public void pushThreadMethod() + { + try + { + + while (getState() == TransportComponentState.Connected) + { + if (sendingQueue.size() > 0) + { + TransportMessageBase message = null; + message = sendingQueue.poll(); + + if (message != null) + { + try + { + if (message.getAdapter() == null) + { + for (ITransportAdapter adapter : adapters) + { + if (adapter.getState() == TransportComponentState.Connected) + { + adapter.write(message.getSerialize().invoke()); + XLog.i("message sent on adapter: " + adapter.getAddress() + "..."); + } + } + } else + { + message.getAdapter().write(message.getSerialize().invoke()); + XLog.i("message sent on adapter: " + message.getAdapter().getAddress() + "..."); + } + + if (message.getDirection() == TransportMessageDirection.Request) + { + pendingRequests.add(message); + } else + { + message.setResult(true, true); + } + } catch (Exception ex) + { + message.setException(ex); + } + } + } + + SystemClock.sleep(10); + } + + } catch (Exception ex) + { + onFailed(ex); + } + } + + //endregion + + //region Pull Thread + + public void pullThreadMethod() + { + try + { + + while (getState() == TransportComponentState.Connected) + { + Pair<ITransportAdapter, byte[]> data; + + if (arrivedResponses.size() > 0) + { + data = arrivedResponses.poll(); + + if (data != null) + { + XLog.i("Message received on adapter: " + data.first.getAddress()); + XLog.i("Parsing message container..."); + MessageContainer container = onParseContainer(data.second); + XLog.i("Searching for pending request token: " + container.getToken()); + TransportMessageBase request = stream(pendingRequests).singleOrDefault(x -> x.getToken().equals(container.getToken()), null); + + if (request != null) + { + XLog.i("Found pending request: " + request.getMessage().getClass().getSimpleName()); + + if (!request.isContinuous()) + { + XLog.i("Pending request was identified as 'single response'. Removing pending request."); + + pendingRequests.remove(request); + + try + { + XLog.i("Parsing inner response message and setting pending request task result..."); + request.setResult(onParseMessage(container), true); + } catch (Exception ex) + { + XLog.e("Error parsing inner message", ex); + request.setException(ex); + } + } else + { + XLog.i("Pending request was identified as 'continuous response'. keeping pending request."); + + try + { + XLog.i("Parsing inner response message and invoking continuous response callback..."); + if (container.getCompleted()) + { + XLog.i("Continuous sequence completed."); + } + request.setResult(onParseMessage(container), container.getCompleted()); + } catch (Exception ex) + { + XLog.e("Error parsing inner message", ex); + request.setException(ex); + } + } + } else + { + XLog.i("Message was identified as a new request message: " + container.getType().toString()); + + try + { + XLog.i("Saving request token and adapter: " + container.getToken() + ", " + data.first.getAddress()); + pendingResponses.put(container.getToken(), new PendingResponse(data.first, container.getContinuous())); + XLog.i("Invoking RequestReceived event..."); + AsyncTask.execute(() -> onRequestReceived(container)); + } catch (Exception ex) + { + //Ignore any exception that might occur on the event handler side... + } + } + } + } + + SystemClock.sleep(10); + } + + } catch (Exception ex) + { + onFailed(ex); + } + } + + //endregion + + //region Dispose + + @Override + public void dispose() + { + disconnect().blockingAwait(); + setState(TransportComponentState.Disposed); + } + + //endregion +} diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/adapters/TcpTransportAdapter.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/adapters/TcpTransportAdapter.java new file mode 100644 index 000000000..25c23919f --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/adapters/TcpTransportAdapter.java @@ -0,0 +1,205 @@ +package com.twine.tango.transport.adapters; + +import android.os.SystemClock; + +import com.elvishew.xlog.XLog; +import com.twine.tango.core.ObjectDisposedException; +import com.twine.tango.transport.TransportAdapterBase; +import com.twine.tango.transport.TransportComponentState; + +import java.io.IOException; +import java.io.InputStream; +import java.net.Socket; +import java.net.SocketException; +import java.nio.channels.Selector; + +import io.reactivex.Completable; +import io.reactivex.schedulers.Schedulers; + +/** + * Represents an {@link com.twine.tango.transport.ITransportAdapter} which communicates over TCP/IP. + */ +public class TcpTransportAdapter extends TransportAdapterBase +{ + + private Socket socket; + private int port; + private Thread pullThread; + private boolean initializedFromConstructor; + private Selector selector; + + //region Constructors + + public TcpTransportAdapter() + { + + setAddress("127.0.0.1"); + setPort(9999); + } + + public TcpTransportAdapter(String address, int port) + { + this(); + setAddress(address); + setPort(port); + } + + public TcpTransportAdapter(Socket socket) + { + this(); + initializedFromConstructor = true; + this.socket = socket; + } + + //endregion + + //region Properties + + public int getPort() + { + return port; + } + + public void setPort(int port) + { + this.port = port; + } + + //endregion + + //region Public Methods + + @Override + public Completable connect() throws ObjectDisposedException + { + throwIfDisposed(); + + return Completable.create((x) -> + { + + try + { + if (getState() != TransportComponentState.Connected) + { + if (!initializedFromConstructor) + { + socket = new Socket(getAddress(), getPort()); + //selector = Selector.open(); + //socket.getChannel().register(selector, SelectionKey.OP_READ); + } + + setState(TransportComponentState.Connected); + pullThread = new Thread(this::pullThreadMethod); + pullThread.setName("Adapter Pull Thread"); + pullThread.start(); + XLog.i("TCP adapter connected..."); + x.onComplete(); + } + } catch (IOException e) + { + XLog.e("Could not connect the TCP adapter."); + x.onError(e); + } + }).subscribeOn(Schedulers.io()); + } + + @Override + public Completable disconnect() + { + return Completable.create((x) -> + { + + try + { + if (getState() == TransportComponentState.Connected) + { + setState(TransportComponentState.Disconnected); + socket.getInputStream().close(); + socket.getOutputStream().close(); + socket.close(); + XLog.i("TCP adapter disconnected."); + x.onComplete(); + } + } catch (IOException e) + { + XLog.e("Could not disconnect the TCP adapter."); + x.onError(e); + } + + }).subscribeOn(Schedulers.io()); + } + + @Override + public void write(byte[] data) throws ObjectDisposedException, IOException + { + throwIfDisposed(); + + try + { + socket.getOutputStream().write(data); + } catch (IOException e) + { + onFailed(e); + } + } + + //endregion + + //region Pull Thread + + private void pullThreadMethod() + { + + int counter = 0; + + try + { + + while (getState() == TransportComponentState.Connected) + { + InputStream stream = socket.getInputStream(); + + if (stream.available() > 0) + { + byte[] data = new byte[stream.available()]; + int read = stream.read(data); + + if (read == -1) + { + throw new SocketException("Error reading from TCP adapter."); + } + + onDataAvailable(data); + } + + SystemClock.sleep(10); +// counter++; + +// if (counter > 200) +// { +// try +// { +// if (socket.getChannel().keyFor(selector).isWritable() && socket.getChannel().keyFor(selector).isReadable()) +// { +// onFailed(new SocketTimeoutException("Client disconnected.")); +// return; +// } +// } catch (Exception e) +// { +// onFailed(e); +// return; +// } +// +// counter = 0; +// } + } + + } catch (Exception e) + { + onFailed(e); + } + + } + + //endregion +} diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/transporters/ProtoTransporter.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/transporters/ProtoTransporter.java new file mode 100644 index 000000000..1e40d5a72 --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/transporters/ProtoTransporter.java @@ -0,0 +1,18 @@ +package com.twine.tango.transport.transporters; + +import com.twine.tango.transport.ITransportAdapter; +import com.twine.tango.transport.TransporterBase; + +/** + * Created by Roy on 11/14/2017. + */ + +public class ProtoTransporter extends TransporterBase { + + public ProtoTransporter() { + } + + public ProtoTransporter(ITransportAdapter adapter) { + super(adapter); + } +} diff --git a/Software/Android_Studio/Tango.Transport/src/main/res/values/strings.xml b/Software/Android_Studio/Tango.Transport/src/main/res/values/strings.xml new file mode 100644 index 000000000..f04af91fb --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">Tango.Transport</string> +</resources> diff --git a/Software/Android_Studio/Tango.Transport/src/test/java/com/twine/tango/transport/ExampleUnitTest.java b/Software/Android_Studio/Tango.Transport/src/test/java/com/twine/tango/transport/ExampleUnitTest.java new file mode 100644 index 000000000..049f7b76d --- /dev/null +++ b/Software/Android_Studio/Tango.Transport/src/test/java/com/twine/tango/transport/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.twine.tango.transport; + +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/app/.gitignore b/Software/Android_Studio/app/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/Software/Android_Studio/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Software/Android_Studio/app/CMakeLists.txt b/Software/Android_Studio/app/CMakeLists.txt new file mode 100644 index 000000000..f8e6e8b3d --- /dev/null +++ b/Software/Android_Studio/app/CMakeLists.txt @@ -0,0 +1,44 @@ +# For more information about using CMake with Android Studio, read the +# documentation: https://d.android.com/studio/projects/add-native-code.html + +# Sets the minimum version of CMake required to build the native library. + +cmake_minimum_required(VERSION 3.4.1) + +# Creates and names a library, sets it as either STATIC +# or SHARED, and provides the relative paths to its source code. +# You can define multiple libraries, and CMake builds them for you. +# Gradle automatically packages shared libraries with your APK. + +add_library( # Sets the name of the library. + native-lib + + # Sets the library as a shared library. + SHARED + + # Provides a relative path to your source file(s). + src/main/cpp/native-lib.cpp ) + +# Searches for a specified prebuilt library and stores the path as a +# variable. Because CMake includes system libraries in the search path by +# default, you only need to specify the name of the public NDK library +# you want to add. CMake verifies that the library exists before +# completing its build. + +find_library( # Sets the name of the path variable. + log-lib + + # Specifies the name of the NDK library that + # you want CMake to locate. + log ) + +# Specifies libraries CMake should link to your target library. You +# can link multiple libraries, such as libraries you define in this +# build script, prebuilt third-party libraries, or system libraries. + +target_link_libraries( # Specifies the target library. + native-lib + + # Links the target library to the log library + # included in the NDK. + ${log-lib} )
\ No newline at end of file diff --git a/Software/Android_Studio/app/build.gradle b/Software/Android_Studio/app/build.gradle new file mode 100644 index 000000000..ccd536141 --- /dev/null +++ b/Software/Android_Studio/app/build.gradle @@ -0,0 +1,41 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 26 + buildToolsVersion "26.0.1" + defaultConfig { + applicationId "com.twine.tango" + minSdkVersion 22 + targetSdkVersion 26 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + externalNativeBuild { + cmake { + cppFlags "-std=c++11 -frtti -fexceptions" + } + } + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + externalNativeBuild { + cmake { + path "CMakeLists.txt" + } + } +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'com.android.support:appcompat-v7:26.1.0' + implementation 'com.android.support.constraint:constraint-layout:1.0.2' + 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' + compile 'com.google.protobuf:protobuf-java:3.4.0' + implementation project(':Tango.PMR') +} diff --git a/Software/Android_Studio/app/proguard-rules.pro b/Software/Android_Studio/app/proguard-rules.pro new file mode 100644 index 000000000..a0eef131a --- /dev/null +++ b/Software/Android_Studio/app/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/app/src/androidTest/java/com/twine/tango/ExampleInstrumentedTest.java b/Software/Android_Studio/app/src/androidTest/java/com/twine/tango/ExampleInstrumentedTest.java new file mode 100644 index 000000000..bed558a6e --- /dev/null +++ b/Software/Android_Studio/app/src/androidTest/java/com/twine/tango/ExampleInstrumentedTest.java @@ -0,0 +1,29 @@ +package com.twine.tango; + +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(); + + MainActivity a = new MainActivity(); + a.Do(); + + assertEquals("com.twine.tango", appContext.getPackageName()); + } +} diff --git a/Software/Android_Studio/app/src/main/AndroidManifest.xml b/Software/Android_Studio/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..9fb70555b --- /dev/null +++ b/Software/Android_Studio/app/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.twine.tango"> + + <application + android:allowBackup="true" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:roundIcon="@mipmap/ic_launcher_round" + android:supportsRtl="true" + android:theme="@style/AppTheme"> + <activity android:name=".MainActivity"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> + +</manifest>
\ No newline at end of file diff --git a/Software/Android_Studio/app/src/main/cpp/Android.mk b/Software/Android_Studio/app/src/main/cpp/Android.mk new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/Software/Android_Studio/app/src/main/cpp/Android.mk diff --git a/Software/Android_Studio/app/src/main/cpp/native-lib.cpp b/Software/Android_Studio/app/src/main/cpp/native-lib.cpp new file mode 100644 index 000000000..fa595fbae --- /dev/null +++ b/Software/Android_Studio/app/src/main/cpp/native-lib.cpp @@ -0,0 +1,13 @@ +#include <jni.h> +#include <string> + +extern "C" +JNIEXPORT jstring + +JNICALL +Java_com_twine_tango_MainActivity_stringFromJNI( + JNIEnv *env, + jobject /* this */) { + std::string hello = "Hello from C++"; + return env->NewStringUTF(hello.c_str()); +} diff --git a/Software/Android_Studio/app/src/main/java/com/twine/tango/MainActivity.java b/Software/Android_Studio/app/src/main/java/com/twine/tango/MainActivity.java new file mode 100644 index 000000000..e739c599d --- /dev/null +++ b/Software/Android_Studio/app/src/main/java/com/twine/tango/MainActivity.java @@ -0,0 +1,34 @@ +package com.twine.tango; + +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.widget.TextView; + +public class MainActivity extends AppCompatActivity { + + // Used to load the 'native-lib' library on application startup. + static { + System.loadLibrary("native-lib"); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + // Example of a call to a native method + TextView tv = (TextView) findViewById(R.id.sample_text); + tv.setText(stringFromJNI()); + } + + public void Do() + { + stringFromJNI(); + } + + /** + * A native method that is implemented by the 'native-lib' native library, + * which is packaged with this application. + */ + public native String stringFromJNI(); +} diff --git a/Software/Android_Studio/app/src/main/res/drawable/ic_launcher_background.xml b/Software/Android_Studio/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000..1cd2a3665 --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,113 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="108.0" + android:viewportWidth="108.0"> + <path + android:fillColor="#26A69A" + android:pathData="M0,0h108v108h-108z" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M19,0L19,108" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M9,0L9,108" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M39,0L39,108" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M29,0L29,108" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M59,0L59,108" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M49,0L49,108" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M79,0L79,108" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M69,0L69,108" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M89,0L89,108" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M99,0L99,108" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,89L108,89" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,99L108,99" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,69L108,69" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,79L108,79" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,49L108,49" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,59L108,59" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,29L108,29" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,39L108,39" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,19L108,19" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,9L108,9" + android:strokeColor="#66FFFFFF" + android:strokeWidth="0.8" /> +</vector> + diff --git a/Software/Android_Studio/app/src/main/res/layout/activity_main.xml b/Software/Android_Studio/app/src/main/res/layout/activity_main.xml new file mode 100644 index 000000000..ef968203f --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="com.twine.tango.MainActivity"> + + <TextView + android:id="@+id/sample_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Hello World!" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + +</android.support.constraint.ConstraintLayout> diff --git a/Software/Android_Studio/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Software/Android_Studio/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..00f9eaaf3 --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@drawable/ic_launcher_background" /> + <foreground android:drawable="@mipmap/ic_launcher_foreground" /> +</adaptive-icon>
\ No newline at end of file diff --git a/Software/Android_Studio/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Software/Android_Studio/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..00f9eaaf3 --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@drawable/ic_launcher_background" /> + <foreground android:drawable="@mipmap/ic_launcher_foreground" /> +</adaptive-icon>
\ No newline at end of file diff --git a/Software/Android_Studio/app/src/main/res/mipmap-hdpi/ic_launcher.png b/Software/Android_Studio/app/src/main/res/mipmap-hdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..550730310 --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/Software/Android_Studio/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/Software/Android_Studio/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png Binary files differnew file mode 100644 index 000000000..4e526c95b --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png diff --git a/Software/Android_Studio/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/Software/Android_Studio/app/src/main/res/mipmap-hdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000..8fab6a3a5 --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/Software/Android_Studio/app/src/main/res/mipmap-mdpi/ic_launcher.png b/Software/Android_Studio/app/src/main/res/mipmap-mdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..6bc7fcd6f --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/Software/Android_Studio/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/Software/Android_Studio/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png Binary files differnew file mode 100644 index 000000000..2c38c7190 --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png diff --git a/Software/Android_Studio/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/Software/Android_Studio/app/src/main/res/mipmap-mdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000..1eecc0e7d --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/Software/Android_Studio/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/Software/Android_Studio/app/src/main/res/mipmap-xhdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..ec87dcebe --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/Software/Android_Studio/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/Software/Android_Studio/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png Binary files differnew file mode 100644 index 000000000..072467eaa --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png diff --git a/Software/Android_Studio/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/Software/Android_Studio/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000..05ca079ca --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/Software/Android_Studio/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Software/Android_Studio/app/src/main/res/mipmap-xxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..6f67f21ba --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/Software/Android_Studio/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/Software/Android_Studio/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png Binary files differnew file mode 100644 index 000000000..78a6b7a34 --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png diff --git a/Software/Android_Studio/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/Software/Android_Studio/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000..8bac0f274 --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/Software/Android_Studio/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Software/Android_Studio/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..0327e13fa --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/Software/Android_Studio/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/Software/Android_Studio/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png Binary files differnew file mode 100644 index 000000000..68ebe33fe --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png diff --git a/Software/Android_Studio/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/Software/Android_Studio/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000..bacd3e758 --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/Software/Android_Studio/app/src/main/res/values/colors.xml b/Software/Android_Studio/app/src/main/res/values/colors.xml new file mode 100644 index 000000000..3ab3e9cbc --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="colorPrimary">#3F51B5</color> + <color name="colorPrimaryDark">#303F9F</color> + <color name="colorAccent">#FF4081</color> +</resources> diff --git a/Software/Android_Studio/app/src/main/res/values/strings.xml b/Software/Android_Studio/app/src/main/res/values/strings.xml new file mode 100644 index 000000000..9bff8a19c --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">Tango</string> +</resources> diff --git a/Software/Android_Studio/app/src/main/res/values/styles.xml b/Software/Android_Studio/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..5885930df --- /dev/null +++ b/Software/Android_Studio/app/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ +<resources> + + <!-- Base application theme. --> + <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> + <!-- Customize your theme here. --> + <item name="colorPrimary">@color/colorPrimary</item> + <item name="colorPrimaryDark">@color/colorPrimaryDark</item> + <item name="colorAccent">@color/colorAccent</item> + </style> + +</resources> diff --git a/Software/Android_Studio/app/src/test/java/com/twine/tango/ExampleUnitTest.java b/Software/Android_Studio/app/src/test/java/com/twine/tango/ExampleUnitTest.java new file mode 100644 index 000000000..4ef42c6db --- /dev/null +++ b/Software/Android_Studio/app/src/test/java/com/twine/tango/ExampleUnitTest.java @@ -0,0 +1,20 @@ +package com.twine.tango; + +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 { + + MainActivity a = new MainActivity(); + a.Do(); + assertEquals(4, 2 + 2); + } +}
\ No newline at end of file diff --git a/Software/Android_Studio/app/src/test/java/com/twine/tango/PMR_TST.java b/Software/Android_Studio/app/src/test/java/com/twine/tango/PMR_TST.java new file mode 100644 index 000000000..1bb15f4d7 --- /dev/null +++ b/Software/Android_Studio/app/src/test/java/com/twine/tango/PMR_TST.java @@ -0,0 +1,73 @@ +package com.twine.tango; + +import org.junit.Test; + +import com.google.protobuf.InvalidProtocolBufferException; +import com.twine.tango.pmr.MessageFactory; +import com.twine.tango.pmr.TangoMessage; +import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer; +import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType; +import com.twine.tango.pmr.common.RGBOuterClass.RGB; +import com.twine.tango.pmr.jobs.JobOuterClass.Job; +import com.twine.tango.pmr.jobs.SegmentOuterClass.Segment; + +import java.lang.reflect.InvocationTargetException; + +import static org.junit.Assert.assertEquals; + +/** + * Created by Roy on 11/2/2017. + */ + +public class PMR_TST { + @Test + public void read_write_PMR() throws Exception { + + MessageContainer.Builder container = MessageContainer.newBuilder(); + + Job.Builder job = Job.newBuilder(); + job.setName("Test Job"); + + job.addSegments( + Segment.newBuilder(). + setName("Segment 1"). + setColor(RGB.newBuilder() + .setR(10) + .setG(20) + .setB(30)) + .build()); + + job.addSegments( + Segment.newBuilder(). + setName("Segment 2"). + setColor(RGB.newBuilder() + .setR(100) + .setG(200) + .setB(300)) + .build()); + + container.setType(MessageType.Job); + Job buildJob = job.build(); + container.setData(buildJob.toByteString()); + + byte[] bytes = container.build().toByteArray(); + + MessageContainer parsed = MessageContainer.parseFrom(bytes); + Job parsedJob = Job.parseFrom(parsed.getData()); + + assertEquals(buildJob, parsedJob); + } + + @Test + public void read_write_PMR_Generic() throws InstantiationException, IllegalAccessException, InvalidProtocolBufferException, NoSuchMethodException, InvocationTargetException { + + TangoMessage<Job> message = MessageFactory.createTangoMessage(Job.class); + message.setMessage(Job.newBuilder().setName("Roy").build()); + + byte[] bytes = message.toBytes(); + + TangoMessage<Job> parsed = MessageFactory.parseTangoMessage(bytes); + + assertEquals(message.getMessage(), parsed.getMessage()); + } +} diff --git a/Software/Android_Studio/build.gradle b/Software/Android_Studio/build.gradle new file mode 100644 index 000000000..a24f16d68 --- /dev/null +++ b/Software/Android_Studio/build.gradle @@ -0,0 +1,41 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + + repositories { + google() + jcenter() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.0.0-beta2' + //classpath 'me.tatarka:gradle-retrolambda:3.7.0' + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + mavenCentral() + } +} + +ext { + //Support Libraries dependencies + globalDependencies = [ + logging : 'com.elvishew:xlog:1.4.0', + rxJavaAndroid: 'io.reactivex.rxjava2:rxandroid:2.0.1', + rxJava : 'io.reactivex.rxjava2:rxjava:2.1.5', + dagger : 'com.google.dagger:dagger:2.11', + daggerAndroid: 'com.google.dagger:dagger-android:2.11', + protobuf: 'com.google.protobuf:protobuf-java:3.4.0', + joda: 'net.danlew:android.joda:2.9.9.1' + ] +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/Software/Android_Studio/gradle.properties b/Software/Android_Studio/gradle.properties new file mode 100644 index 000000000..aac7c9b46 --- /dev/null +++ b/Software/Android_Studio/gradle.properties @@ -0,0 +1,17 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true diff --git a/Software/Android_Studio/gradle/wrapper/gradle-wrapper.jar b/Software/Android_Studio/gradle/wrapper/gradle-wrapper.jar Binary files differnew file mode 100644 index 000000000..13372aef5 --- /dev/null +++ b/Software/Android_Studio/gradle/wrapper/gradle-wrapper.jar diff --git a/Software/Android_Studio/gradle/wrapper/gradle-wrapper.properties b/Software/Android_Studio/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..d86868739 --- /dev/null +++ b/Software/Android_Studio/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Nov 02 18:59:39 IST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/Software/Android_Studio/gradlew b/Software/Android_Studio/gradlew new file mode 100644 index 000000000..9d82f7891 --- /dev/null +++ b/Software/Android_Studio/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/Software/Android_Studio/gradlew.bat b/Software/Android_Studio/gradlew.bat new file mode 100644 index 000000000..8a0b282aa --- /dev/null +++ b/Software/Android_Studio/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/Software/Android_Studio/settings.gradle b/Software/Android_Studio/settings.gradle new file mode 100644 index 000000000..88b0e3c36 --- /dev/null +++ b/Software/Android_Studio/settings.gradle @@ -0,0 +1 @@ +include ':app', ':Tango.BL', ':Tango.Stubs.UI', ':Tango.SharedUI', ':Tango.DAL', ':Tango.Models', ':Tango.Stubs', ':Tango.Integration', ':Tango.Transport', ':Tango.Core', ':Tango.PMR' |
