aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Android_Studio
diff options
context:
space:
mode:
authorRoy Ben-Shabat <Roy@Twine-s.com>2017-11-16 13:38:56 +0200
committerRoy Ben-Shabat <Roy@Twine-s.com>2017-11-16 13:38:56 +0200
commit914f4db513477d9aff726546bac47545195a3e37 (patch)
treed2ff190fd84b1dfaa03eec76563c431592ece7ff /Software/Android_Studio
parent65d01ff549d80fbe13ff5e966df216c9f7c03653 (diff)
downloadTango-914f4db513477d9aff726546bac47545195a3e37.tar.gz
Tango-914f4db513477d9aff726546bac47545195a3e37.zip
Rename "Visual Studio" to "Visual_Studio"
Rename "External Repositories" to "External_Repositories".
Diffstat (limited to 'Software/Android_Studio')
-rw-r--r--Software/Android_Studio/.gitignore9
-rw-r--r--Software/Android_Studio/Tango.BL/.gitignore1
-rw-r--r--Software/Android_Studio/Tango.BL/CMakeLists.txt45
-rw-r--r--Software/Android_Studio/Tango.BL/build.gradle42
-rw-r--r--Software/Android_Studio/Tango.BL/proguard-rules.pro25
-rw-r--r--Software/Android_Studio/Tango.BL/src/androidTest/java/com/twine/tango/bl/ExampleInstrumentedTest.java29
-rw-r--r--Software/Android_Studio/Tango.BL/src/main/AndroidManifest.xml2
-rw-r--r--Software/Android_Studio/Tango.BL/src/main/cpp/Android.mk0
-rw-r--r--Software/Android_Studio/Tango.BL/src/main/cpp/OtherClass.cpp9
-rw-r--r--Software/Android_Studio/Tango.BL/src/main/cpp/OtherClass.h19
-rw-r--r--Software/Android_Studio/Tango.BL/src/main/cpp/native-lib.cpp18
-rw-r--r--Software/Android_Studio/Tango.BL/src/main/java/com/twine/tango/bl/Example.java21
-rw-r--r--Software/Android_Studio/Tango.BL/src/main/res/values/strings.xml3
-rw-r--r--Software/Android_Studio/Tango.BL/src/test/java/com/twine/tango/bl/ExampleUnitTest.java17
-rw-r--r--Software/Android_Studio/Tango.Core/.gitignore1
-rw-r--r--Software/Android_Studio/Tango.Core/build.gradle32
-rw-r--r--Software/Android_Studio/Tango.Core/proguard-rules.pro25
-rw-r--r--Software/Android_Studio/Tango.Core/src/androidTest/java/com/twine/tango/core/ExampleInstrumentedTest.java26
-rw-r--r--Software/Android_Studio/Tango.Core/src/main/AndroidManifest.xml2
-rw-r--r--Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Action.java11
-rw-r--r--Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/ContextFactory.java22
-rw-r--r--Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/EventHandler.java11
-rw-r--r--Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Func.java11
-rw-r--r--Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/IDisposable.java15
-rw-r--r--Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/ObjectDisposedException.java12
-rw-r--r--Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/ObservableCollection.java213
-rw-r--r--Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Reflections.java40
-rw-r--r--Software/Android_Studio/Tango.Core/src/main/res/values/strings.xml3
-rw-r--r--Software/Android_Studio/Tango.Core/src/test/java/com/twine/tango/core/ExampleUnitTest.java17
-rw-r--r--Software/Android_Studio/Tango.DAL/.gitignore1
-rw-r--r--Software/Android_Studio/Tango.DAL/build.gradle8
-rw-r--r--Software/Android_Studio/Tango.DAL/src/main/java/com/twine/tango/dal/myClass.java4
-rw-r--r--Software/Android_Studio/Tango.Integration/.gitignore1
-rw-r--r--Software/Android_Studio/Tango.Integration/build.gradle46
-rw-r--r--Software/Android_Studio/Tango.Integration/proguard-rules.pro25
-rw-r--r--Software/Android_Studio/Tango.Integration/src/androidTest/java/com/twine/tango/integration/ExampleInstrumentedTest.java26
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/AndroidManifest.xml6
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/adapters/SerialAdapter.java20
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/adapters/TcpAdapter.java92
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/MachineOperator.java244
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/MachineOperatorInterface.java19
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/MessageBase.java24
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/RequestMessage.java59
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/machine/ResponseMessage.java37
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/res/values/strings.xml3
-rw-r--r--Software/Android_Studio/Tango.Integration/src/test/java/com/twine/tango/integration/ExampleUnitTest.java17
-rw-r--r--Software/Android_Studio/Tango.Models/.gitignore1
-rw-r--r--Software/Android_Studio/Tango.Models/build.gradle41
-rw-r--r--Software/Android_Studio/Tango.Models/proguard-rules.pro25
-rw-r--r--Software/Android_Studio/Tango.Models/src/androidTest/java/com/twine/tango/models/ExampleInstrumentedTest.java26
-rw-r--r--Software/Android_Studio/Tango.Models/src/main/AndroidManifest.xml2
-rw-r--r--Software/Android_Studio/Tango.Models/src/main/java/com/twine/tango/models/User.java39
-rw-r--r--Software/Android_Studio/Tango.Models/src/main/res/values/strings.xml3
-rw-r--r--Software/Android_Studio/Tango.Models/src/test/java/com/twine/tango/models/ExampleUnitTest.java17
-rw-r--r--Software/Android_Studio/Tango.PMR/.gitignore1
-rw-r--r--Software/Android_Studio/Tango.PMR/build.gradle65
-rw-r--r--Software/Android_Studio/Tango.PMR/proguard-rules.pro25
-rw-r--r--Software/Android_Studio/Tango.PMR/src/androidTest/java/com/twine/tango/pmr/ExampleInstrumentedTest.java26
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/AndroidManifest.xml2
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/MessageFactory.java163
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/TangoMessage.java91
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/common/MessageContainerOuterClass.java869
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/common/MessageTypeOuterClass.java191
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/common/RGBOuterClass.java630
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/jobs/JobOuterClass.java953
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/jobs/SegmentOuterClass.java838
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/stubs/CalculateRequestOuterClass.java573
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/stubs/CalculateResponseOuterClass.java507
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/stubs/ProgressRequestOuterClass.java440
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/stubs/ProgressResponseOuterClass.java507
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/res/raw/packages.txt3
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/res/values/strings.xml3
-rw-r--r--Software/Android_Studio/Tango.PMR/src/test/java/com/twine/tango/pmr/ExampleUnitTest.java35
-rw-r--r--Software/Android_Studio/Tango.SharedUI/.gitignore1
-rw-r--r--Software/Android_Studio/Tango.SharedUI/build.gradle49
-rw-r--r--Software/Android_Studio/Tango.SharedUI/proguard-rules.pro25
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/androidTest/java/com/twine/tango/sharedui/ExampleInstrumentedTest.java26
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/AndroidManifest.xml2
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/binding_adapters/BindingAdapters.java34
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/ActivityBase.java121
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/ActivityCallbackEngine.java55
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/FragmentBase.java111
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/FragmentBaseV4.java107
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/BindingConverters.java19
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/DependencyProperty.java49
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/FieldUtils.java68
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/ReadOnlyField.java74
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/RelayCommand.java68
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/ViewContract.java8
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/ViewModelBase.java21
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/notifications/AndroidNotificationProvider.java22
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/notifications/NotificationProvider.java11
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/paging/PagerAdapter.java61
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/paging/PagerZoomTransform.java44
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/validation/ViewValidator.java23
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/main/res/values/strings.xml3
-rw-r--r--Software/Android_Studio/Tango.SharedUI/src/test/java/com/twine/tango/sharedui/ExampleUnitTest.java17
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/.gitignore1
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/build.gradle68
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/proguard-rules.pro25
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/androidTest/java/com/twine/tango/stubs/ui/ExampleInstrumentedTest.java26
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/AndroidManifest.xml26
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/App.java91
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/Events/LoginEvent.java24
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/Events/StubSelectedEvent.java24
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ApplicationComponent.java33
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ApplicationModule.java30
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/EventBusModule.java24
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/NotificationModule.java27
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ServicesModule.java8
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/TransportModule.java33
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ViewModelsModule.java62
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragment.java46
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragmentContract.java10
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragmentVM.java51
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivity.java80
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivityContract.java18
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivityVM.java37
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragment.java49
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragmentContract.java18
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragmentVM.java23
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivity.java19
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivityContract.java10
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivityVM.java78
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivity.java25
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityContract.java13
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityVM.java60
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/database.pngbin0 -> 2304 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/ic_database.xml17
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/ic_launcher_background.xml113
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/ic_play.xml9
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/ic_stop.xml4
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/ic_stubs.xml6
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/list_view_selectable.xml4
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/stubs.pngbin0 -> 2543 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/user.pngbin0 -> 9817 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/activity_main.xml54
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/activity_stub.xml146
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/activity_stubs.xml31
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/fragment_login.xml67
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/fragment_selection.xml63
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/stubs_listview_item.xml30
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-anydpi-v26/ic_launcher.xml5
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml5
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-hdpi/ic_launcher.pngbin0 -> 3358 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-hdpi/ic_launcher_foreground.pngbin0 -> 5117 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-hdpi/ic_launcher_round.pngbin0 -> 5084 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-mdpi/ic_launcher.pngbin0 -> 2386 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-mdpi/ic_launcher_foreground.pngbin0 -> 2652 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-mdpi/ic_launcher_round.pngbin0 -> 3179 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xhdpi/ic_launcher.pngbin0 -> 4648 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xhdpi/ic_launcher_foreground.pngbin0 -> 7011 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xhdpi/ic_launcher_round.pngbin0 -> 7381 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxhdpi/ic_launcher.pngbin0 -> 7008 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.pngbin0 -> 14578 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxhdpi/ic_launcher_round.pngbin0 -> 11545 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxxhdpi/ic_launcher.pngbin0 -> 9442 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.pngbin0 -> 21908 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxxhdpi/ic_launcher_round.pngbin0 -> 16109 bytes
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/values/colors.xml8
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/values/strings.xml6
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/main/res/values/styles.xml11
-rw-r--r--Software/Android_Studio/Tango.Stubs.UI/src/test/java/com/twine/tango/stubs/ui/ExampleUnitTest.java17
-rw-r--r--Software/Android_Studio/Tango.Stubs/.gitignore1
-rw-r--r--Software/Android_Studio/Tango.Stubs/build.gradle61
-rw-r--r--Software/Android_Studio/Tango.Stubs/proguard-rules.pro25
-rw-r--r--Software/Android_Studio/Tango.Stubs/src/androidTest/java/com/twine/tango/stubs/ExampleInstrumentedTest.java26
-rw-r--r--Software/Android_Studio/Tango.Stubs/src/main/AndroidManifest.xml2
-rw-r--r--Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/AvailableStub.java66
-rw-r--r--Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/IStub.java16
-rw-r--r--Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubAttribute.java21
-rw-r--r--Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubBase.java100
-rw-r--r--Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubDirection.java11
-rw-r--r--Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubState.java13
-rw-r--r--Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/stubs/Calculate.java44
-rw-r--r--Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/stubs/Progress.java39
-rw-r--r--Software/Android_Studio/Tango.Stubs/src/main/res/raw/stubs.txt2
-rw-r--r--Software/Android_Studio/Tango.Stubs/src/main/res/values/strings.xml3
-rw-r--r--Software/Android_Studio/Tango.Stubs/src/test/java/com/twine/tango/stubs/ExampleUnitTest.java17
-rw-r--r--Software/Android_Studio/Tango.Transport/.gitignore1
-rw-r--r--Software/Android_Studio/Tango.Transport/build.gradle56
-rw-r--r--Software/Android_Studio/Tango.Transport/proguard-rules.pro25
-rw-r--r--Software/Android_Studio/Tango.Transport/src/androidTest/java/com/twine/tango/transport/ExampleInstrumentedTest.java26
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/AndroidManifest.xml2
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportAdapter.java43
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportComponent.java42
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransporter.java43
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/PendingResponse.java63
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportAdapterBase.java94
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportComponentState.java25
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportMessage.java37
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportMessageBase.java91
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportMessageDirection.java10
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransporterBase.java566
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/adapters/TcpTransportAdapter.java205
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/transporters/ProtoTransporter.java18
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/res/values/strings.xml3
-rw-r--r--Software/Android_Studio/Tango.Transport/src/test/java/com/twine/tango/transport/ExampleUnitTest.java17
-rw-r--r--Software/Android_Studio/app/.gitignore1
-rw-r--r--Software/Android_Studio/app/CMakeLists.txt44
-rw-r--r--Software/Android_Studio/app/build.gradle41
-rw-r--r--Software/Android_Studio/app/proguard-rules.pro25
-rw-r--r--Software/Android_Studio/app/src/androidTest/java/com/twine/tango/ExampleInstrumentedTest.java29
-rw-r--r--Software/Android_Studio/app/src/main/AndroidManifest.xml21
-rw-r--r--Software/Android_Studio/app/src/main/cpp/Android.mk0
-rw-r--r--Software/Android_Studio/app/src/main/cpp/native-lib.cpp13
-rw-r--r--Software/Android_Studio/app/src/main/java/com/twine/tango/MainActivity.java34
-rw-r--r--Software/Android_Studio/app/src/main/res/drawable/ic_launcher_background.xml113
-rw-r--r--Software/Android_Studio/app/src/main/res/layout/activity_main.xml19
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml5
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml5
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-hdpi/ic_launcher.pngbin0 -> 3358 bytes
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.pngbin0 -> 5117 bytes
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-hdpi/ic_launcher_round.pngbin0 -> 5084 bytes
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-mdpi/ic_launcher.pngbin0 -> 2386 bytes
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.pngbin0 -> 2652 bytes
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-mdpi/ic_launcher_round.pngbin0 -> 3179 bytes
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-xhdpi/ic_launcher.pngbin0 -> 4648 bytes
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.pngbin0 -> 7011 bytes
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-xhdpi/ic_launcher_round.pngbin0 -> 7381 bytes
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-xxhdpi/ic_launcher.pngbin0 -> 7008 bytes
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.pngbin0 -> 14578 bytes
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.pngbin0 -> 11545 bytes
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-xxxhdpi/ic_launcher.pngbin0 -> 9442 bytes
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.pngbin0 -> 21908 bytes
-rw-r--r--Software/Android_Studio/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.pngbin0 -> 16109 bytes
-rw-r--r--Software/Android_Studio/app/src/main/res/values/colors.xml6
-rw-r--r--Software/Android_Studio/app/src/main/res/values/strings.xml3
-rw-r--r--Software/Android_Studio/app/src/main/res/values/styles.xml11
-rw-r--r--Software/Android_Studio/app/src/test/java/com/twine/tango/ExampleUnitTest.java20
-rw-r--r--Software/Android_Studio/app/src/test/java/com/twine/tango/PMR_TST.java73
-rw-r--r--Software/Android_Studio/build.gradle41
-rw-r--r--Software/Android_Studio/gradle.properties17
-rw-r--r--Software/Android_Studio/gradle/wrapper/gradle-wrapper.jarbin0 -> 53636 bytes
-rw-r--r--Software/Android_Studio/gradle/wrapper/gradle-wrapper.properties6
-rw-r--r--Software/Android_Studio/gradlew160
-rw-r--r--Software/Android_Studio/gradlew.bat90
-rw-r--r--Software/Android_Studio/settings.gradle1
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
new file mode 100644
index 000000000..4263288e8
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/database.png
Binary files differ
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/ic_database.xml b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/ic_database.xml
new file mode 100644
index 000000000..010978dae
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/ic_database.xml
@@ -0,0 +1,17 @@
+<vector android:height="64dp" android:viewportHeight="57.0"
+ android:viewportWidth="57.0" android:width="64dp" xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="#545E73" android:pathData="M49.46,8L49.46,8C48.72,3.54 38.28,0 25.5,0S2.28,3.54 1.54,8l0,0H1.5v0.5V20v0.5V21v11v0.5V33v12h0.05c0.73,4.46 11.18,8 23.95,8s23.22,-3.54 23.95,-8H49.5V33v-0.5V32V21v-0.5V20V8.5V8H49.46z"/>
+ <path android:fillColor="#38454F" android:pathData="M25.5,41c-13.26,0 -24,-3.81 -24,-8.5V45h0.05c0.73,4.46 11.18,8 23.95,8s23.22,-3.54 23.95,-8H49.5V32.5C49.5,37.19 38.76,41 25.5,41z"/>
+ <path android:fillColor="#38454F" android:pathData="M1.5,32v0.5c0,-0.17 0.02,-0.33 0.05,-0.5H1.5z"/>
+ <path android:fillColor="#38454F" android:pathData="M49.46,32c0.03,0.17 0.05,0.33 0.05,0.5V32H49.46z"/>
+ <path android:fillColor="#556080" android:pathData="M25.5,29c-13.26,0 -24,-3.81 -24,-8.5V33h0.05c0.73,4.46 11.18,8 23.95,8s23.22,-3.54 23.95,-8H49.5V20.5C49.5,25.19 38.76,29 25.5,29z"/>
+ <path android:fillColor="#556080" android:pathData="M1.5,20v0.5c0,-0.17 0.02,-0.33 0.05,-0.5H1.5z"/>
+ <path android:fillColor="#556080" android:pathData="M49.46,20c0.03,0.17 0.05,0.33 0.05,0.5V20H49.46z"/>
+ <path android:fillColor="#91BAE1" android:pathData="M1.5,8.5a24,8.5 0,1 0,48 0a24,8.5 0,1 0,-48 0z"/>
+ <path android:fillColor="#8697CB" android:pathData="M25.5,17c-13.26,0 -24,-3.81 -24,-8.5V21h0.05c0.73,4.46 11.18,8 23.95,8s23.22,-3.54 23.95,-8H49.5V8.5C49.5,13.19 38.76,17 25.5,17z"/>
+ <path android:fillColor="#8697CB" android:pathData="M1.5,8v0.5c0,-0.17 0.02,-0.33 0.05,-0.5H1.5z"/>
+ <path android:fillColor="#8697CB" android:pathData="M49.46,8C49.48,8.17 49.5,8.33 49.5,8.5V8H49.46z"/>
+ <path android:fillColor="#BDC3C7" android:pathData="M55.5,43.85l-1.44,-0.28c-2.14,-0.41 -3.13,-2.92 -1.84,-4.68l0.91,-1.24l-1.96,-1.96l-1.22,0.82c-1.81,1.22 -4.27,0.15 -4.6,-2.01L45.12,33h-2.77l-0.36,1.87c-0.4,2.1 -2.82,3.1 -4.59,1.9l-1.57,-1.07l-1.96,1.96l0.91,1.24c1.29,1.76 0.31,4.26 -1.84,4.68L31.5,43.85v2.77l1.51,0.23c2.16,0.33 3.23,2.8 2.01,4.6l-0.82,1.22l1.96,1.96l1.24,-0.91c1.76,-1.29 4.26,-0.31 4.68,1.84L42.35,57h2.77l0.16,-1.07c0.34,-2.2 2.9,-3.26 4.69,-1.94l0.87,0.64l1.96,-1.96l-0.82,-1.22c-1.22,-1.81 -0.15,-4.27 2.01,-4.6l1.51,-0.23V43.85z"/>
+ <path android:fillColor="#FFFFFF" android:pathData="M43.5,45m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0"/>
+ <path android:fillColor="#ECF0F1" android:pathData="M43.5,50c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5s5,2.24 5,5S46.26,50 43.5,50zM43.5,42c-1.65,0 -3,1.35 -3,3s1.35,3 3,3s3,-1.35 3,-3S45.15,42 43.5,42z"/>
+</vector>
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/ic_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
new file mode 100644
index 000000000..5d6249d61
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/stubs.png
Binary files differ
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/user.png b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/user.png
new file mode 100644
index 000000000..8d700439a
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/drawable/user.png
Binary files differ
diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/activity_main.xml b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/activity_main.xml
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
new file mode 100644
index 000000000..550730310
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
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
new file mode 100644
index 000000000..4e526c95b
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
Binary files differ
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
new file mode 100644
index 000000000..8fab6a3a5
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-hdpi/ic_launcher_round.png
Binary files differ
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
new file mode 100644
index 000000000..6bc7fcd6f
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
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
new file mode 100644
index 000000000..2c38c7190
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
Binary files differ
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
new file mode 100644
index 000000000..1eecc0e7d
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-mdpi/ic_launcher_round.png
Binary files differ
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
new file mode 100644
index 000000000..ec87dcebe
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
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
new file mode 100644
index 000000000..072467eaa
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
Binary files differ
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
new file mode 100644
index 000000000..05ca079ca
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Binary files differ
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
new file mode 100644
index 000000000..6f67f21ba
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
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
new file mode 100644
index 000000000..78a6b7a34
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
Binary files differ
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
new file mode 100644
index 000000000..8bac0f274
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Binary files differ
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
new file mode 100644
index 000000000..0327e13fa
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
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
new file mode 100644
index 000000000..68ebe33fe
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
Binary files differ
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
new file mode 100644
index 000000000..bacd3e758
--- /dev/null
+++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Binary files differ
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
new file mode 100644
index 000000000..550730310
--- /dev/null
+++ b/Software/Android_Studio/app/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
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
new file mode 100644
index 000000000..4e526c95b
--- /dev/null
+++ b/Software/Android_Studio/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
Binary files differ
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
new file mode 100644
index 000000000..8fab6a3a5
--- /dev/null
+++ b/Software/Android_Studio/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
Binary files differ
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
new file mode 100644
index 000000000..6bc7fcd6f
--- /dev/null
+++ b/Software/Android_Studio/app/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
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
new file mode 100644
index 000000000..2c38c7190
--- /dev/null
+++ b/Software/Android_Studio/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
Binary files differ
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
new file mode 100644
index 000000000..1eecc0e7d
--- /dev/null
+++ b/Software/Android_Studio/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
Binary files differ
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
new file mode 100644
index 000000000..ec87dcebe
--- /dev/null
+++ b/Software/Android_Studio/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
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
new file mode 100644
index 000000000..072467eaa
--- /dev/null
+++ b/Software/Android_Studio/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
Binary files differ
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
new file mode 100644
index 000000000..05ca079ca
--- /dev/null
+++ b/Software/Android_Studio/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Binary files differ
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
new file mode 100644
index 000000000..6f67f21ba
--- /dev/null
+++ b/Software/Android_Studio/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
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
new file mode 100644
index 000000000..78a6b7a34
--- /dev/null
+++ b/Software/Android_Studio/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
Binary files differ
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
new file mode 100644
index 000000000..8bac0f274
--- /dev/null
+++ b/Software/Android_Studio/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Binary files differ
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
new file mode 100644
index 000000000..0327e13fa
--- /dev/null
+++ b/Software/Android_Studio/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
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
new file mode 100644
index 000000000..68ebe33fe
--- /dev/null
+++ b/Software/Android_Studio/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
Binary files differ
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
new file mode 100644
index 000000000..bacd3e758
--- /dev/null
+++ b/Software/Android_Studio/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Binary files differ
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
new file mode 100644
index 000000000..13372aef5
--- /dev/null
+++ b/Software/Android_Studio/gradle/wrapper/gradle-wrapper.jar
Binary files differ
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'