From 0cd6796d91605432237f379b0c28918f24c8a622 Mon Sep 17 00:00:00 2001 From: Roy Ben-Shabat Date: Mon, 20 Nov 2017 21:38:52 +0200 Subject: Added parameterized to android. Added horizontal number picker. Refactored activity/fragment. Moved Transporter connection to MainActivity ViewModel. Added application Toolbar. --- Software/Android_Studio/Tango.Core/build.gradle | 3 + .../src/main/java/com/twine/tango/core/Action.java | 9 +- .../main/java/com/twine/tango/core/Action1.java | 11 ++ .../src/main/java/com/twine/tango/core/Event.java | 35 ++++++ .../java/com/twine/tango/pmr/MessageFactory.java | 4 +- .../tango/pmr/stubs/ProgressRequestOuterClass.java | 134 ++++++++++++++++++++- .../Android_Studio/Tango.SharedUI/build.gradle | 10 +- .../sharedui/binding_adapters/BindingAdapters.java | 77 ++++++++++-- .../binding_converters/ObjectToIntConverter.java | 22 ++++ .../tango/sharedui/containers/ActivityBase.java | 5 +- .../tango/sharedui/containers/FragmentBase.java | 17 ++- .../tango/sharedui/containers/FragmentBaseV4.java | 4 +- .../tango/sharedui/editors/IParameterized.java | 46 +++++++ .../sharedui/editors/ParameterAnnotation.java | 22 ++++ .../tango/sharedui/editors/ParameterItem.java | 91 ++++++++++++++ .../sharedui/editors/ParameterizedEditor.java | 79 ++++++++++++ .../tango/sharedui/mvvm/DependencyProperty.java | 65 +++++++--- .../java/com/twine/tango/sharedui/mvvm/IView.java | 9 ++ .../twine/tango/sharedui/mvvm/ViewContract.java | 8 -- .../twine/tango/sharedui/mvvm/ViewModelBase.java | 21 +++- .../navigation/AndroidNavigationProvider.java | 117 ++++++++++++++++++ .../sharedui/navigation/INavigationProvider.java | 22 ++++ .../notifications/AndroidNotificationProvider.java | 43 ++++++- .../notifications/INotificationProvider.java | 19 +++ .../notifications/NotificationProvider.java | 11 -- .../tango/sharedui/validation/IViewValidator.java | 23 ++++ .../tango/sharedui/validation/ViewValidator.java | 23 ---- .../src/main/res/animator/slide_in_left.xml | 11 ++ .../src/main/res/animator/slide_in_right.xml | 13 ++ .../src/main/res/animator/slide_out_left.xml | 12 ++ .../src/main/res/animator/slide_out_right.xml | 13 ++ .../src/main/res/layout/editor_range.xml | 26 ++++ .../Tango.Stubs.UI/src/main/AndroidManifest.xml | 2 - .../main/java/com/twine/tango/stubs/ui/App.java | 4 +- .../stubs/ui/dagger/ApplicationComponent.java | 13 +- .../tango/stubs/ui/dagger/NavigationModule.java | 20 +++ .../tango/stubs/ui/dagger/NotificationModule.java | 4 +- .../tango/stubs/ui/dagger/TransportModule.java | 12 +- .../tango/stubs/ui/dagger/ViewModelsModule.java | 27 ++--- .../tango/stubs/ui/views/login/ILoginFragment.java | 11 ++ .../tango/stubs/ui/views/login/LoginFragment.java | 3 +- .../ui/views/login/LoginFragmentContract.java | 10 -- .../stubs/ui/views/login/LoginFragmentVM.java | 10 +- .../tango/stubs/ui/views/main/IMainActivity.java | 20 +++ .../tango/stubs/ui/views/main/MainActivity.java | 112 ++++++++--------- .../stubs/ui/views/main/MainActivityContract.java | 18 --- .../tango/stubs/ui/views/main/MainActivityVM.java | 59 +++++++-- .../ui/views/selection/ISelectionFragment.java | 12 ++ .../ui/views/selection/SelectionFragment.java | 19 +-- .../views/selection/SelectionFragmentContract.java | 18 --- .../ui/views/selection/SelectionFragmentVM.java | 14 ++- .../tango/stubs/ui/views/stub/IStubFragment.java | 11 ++ .../tango/stubs/ui/views/stub/StubActivity.java | 19 --- .../stubs/ui/views/stub/StubActivityContract.java | 10 -- .../tango/stubs/ui/views/stub/StubActivityVM.java | 78 ------------ .../tango/stubs/ui/views/stub/StubFragment.java | 26 ++++ .../tango/stubs/ui/views/stub/StubFragmentVM.java | 67 +++++++++++ .../tango/stubs/ui/views/stubs/IStubsFragment.java | 14 +++ .../tango/stubs/ui/views/stubs/StubsActivity.java | 25 ---- .../ui/views/stubs/StubsActivityContract.java | 13 -- .../stubs/ui/views/stubs/StubsActivityVM.java | 60 --------- .../tango/stubs/ui/views/stubs/StubsFragment.java | 26 ++++ .../stubs/ui/views/stubs/StubsFragmentVM.java | 65 ++++++++++ .../src/main/res/layout/activity_main.xml | 61 +++++++++- .../src/main/res/layout/activity_stub.xml | 31 +++-- .../src/main/res/layout/activity_stubs.xml | 6 +- .../src/main/res/layout/side_menu.xml | 52 ++++++++ .../Tango.Stubs.UI/src/main/res/values/colors.xml | 2 +- Software/Android_Studio/Tango.Stubs/build.gradle | 1 + .../src/main/java/com/twine/tango/stubs/IStub.java | 5 +- .../java/com/twine/tango/stubs/StubAnnotation.java | 22 ++++ .../java/com/twine/tango/stubs/StubAttribute.java | 21 ---- .../main/java/com/twine/tango/stubs/StubBase.java | 5 +- .../com/twine/tango/stubs/stubs/Calculate.java | 19 ++- .../java/com/twine/tango/stubs/stubs/Progress.java | 4 +- .../Android_Studio/Tango.Transport/build.gradle | 3 - .../twine/tango/transport/ITransportComponent.java | 13 +- .../com/twine/tango/transport/ITransporter.java | 4 - .../tango/transport/TransportAdapterBase.java | 31 +++-- .../com/twine/tango/transport/TransporterBase.java | 50 +++++--- .../transport/adapters/TcpTransportAdapter.java | 24 ++-- Software/Android_Studio/build.gradle | 4 +- 82 files changed, 1583 insertions(+), 582 deletions(-) create mode 100644 Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Action1.java create mode 100644 Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Event.java create mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/binding_converters/ObjectToIntConverter.java create mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/editors/IParameterized.java create mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/editors/ParameterAnnotation.java create mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/editors/ParameterItem.java create mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/editors/ParameterizedEditor.java create mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/IView.java delete mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/ViewContract.java create mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/navigation/AndroidNavigationProvider.java create mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/navigation/INavigationProvider.java create mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/notifications/INotificationProvider.java delete mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/notifications/NotificationProvider.java create mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/validation/IViewValidator.java delete mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/validation/ViewValidator.java create mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/res/animator/slide_in_left.xml create mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/res/animator/slide_in_right.xml create mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/res/animator/slide_out_left.xml create mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/res/animator/slide_out_right.xml create mode 100644 Software/Android_Studio/Tango.SharedUI/src/main/res/layout/editor_range.xml create mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/NavigationModule.java create mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/ILoginFragment.java delete mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragmentContract.java create mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/IMainActivity.java delete mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivityContract.java create mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/ISelectionFragment.java delete mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragmentContract.java create mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/IStubFragment.java delete mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivity.java delete mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivityContract.java delete mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivityVM.java create mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubFragment.java create mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubFragmentVM.java create mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/IStubsFragment.java delete mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivity.java delete mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityContract.java delete mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityVM.java create mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsFragment.java create mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsFragmentVM.java create mode 100644 Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/side_menu.xml create mode 100644 Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubAnnotation.java delete mode 100644 Software/Android_Studio/Tango.Stubs/src/main/java/com/twine/tango/stubs/StubAttribute.java (limited to 'Software/Android_Studio') diff --git a/Software/Android_Studio/Tango.Core/build.gradle b/Software/Android_Studio/Tango.Core/build.gradle index 36a8dfafb..55696df8c 100644 --- a/Software/Android_Studio/Tango.Core/build.gradle +++ b/Software/Android_Studio/Tango.Core/build.gradle @@ -29,4 +29,7 @@ dependencies { 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.stream + compile globalDependencies.linq } 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 index 570c30c43..48df7e346 100644 --- 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 @@ -1,11 +1,10 @@ package com.twine.tango.core; /** - * Created by Roy on 11/13/2017. + * Created by Roy on 11/20/2017. */ -public interface Action { - - void invoke(T e); - +public interface Action +{ + void invoke(); } diff --git a/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Action1.java b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Action1.java new file mode 100644 index 000000000..301134083 --- /dev/null +++ b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Action1.java @@ -0,0 +1,11 @@ +package com.twine.tango.core; + +/** + * Created by Roy on 11/13/2017. + */ + +public interface Action1 { + + void invoke(T e); + +} diff --git a/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Event.java b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Event.java new file mode 100644 index 000000000..ab651601a --- /dev/null +++ b/Software/Android_Studio/Tango.Core/src/main/java/com/twine/tango/core/Event.java @@ -0,0 +1,35 @@ +package com.twine.tango.core; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + + +/** + * Created by Roy on 11/20/2017. + */ + +public class Event +{ + private List> listeners = new ArrayList<>(); + + public void removeListener(EventHandler listener) + { + listeners.remove(listener); + } + + public void addListener(EventHandler listener) + { + listeners.add(listener); + } + + public void invoke(Object sender, T e) + { + + for (int i = 0; i < listeners.size(); i++) + { + listeners.get(i).invoke(sender, e); + } + } +} 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 index 04acf5248..9e2a88194 100644 --- 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 @@ -63,12 +63,12 @@ public class MessageFactory return cls; } catch (ClassNotFoundException e) { - e.printStackTrace(); + //Ignore because we are trying to find the right class by brute force. } } - XLog.e("Could not find PMR message class for " + name, new ClassNotFoundException()); + XLog.e(new ClassNotFoundException("Could not find PMR message class for " + name)); return null; } 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 index 41b0985a2..3cfd9dcfe 100644 --- 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 @@ -17,6 +17,16 @@ public final class ProgressRequestOuterClass { public interface ProgressRequestOrBuilder extends // @@protoc_insertion_point(interface_extends:Tango.PMR.Stubs.ProgressRequest) com.google.protobuf.MessageOrBuilder { + + /** + * int32 Amount = 1; + */ + int getAmount(); + + /** + * int32 Delay = 2; + */ + int getDelay(); } /** * Protobuf type {@code Tango.PMR.Stubs.ProgressRequest} @@ -31,6 +41,8 @@ public final class ProgressRequestOuterClass { super(builder); } private ProgressRequest() { + amount_ = 0; + delay_ = 0; } @java.lang.Override @@ -43,6 +55,7 @@ public final class ProgressRequestOuterClass { 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 { @@ -60,6 +73,16 @@ public final class ProgressRequestOuterClass { } break; } + case 8: { + + amount_ = input.readInt32(); + break; + } + case 16: { + + delay_ = input.readInt32(); + break; + } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -84,6 +107,24 @@ public final class ProgressRequestOuterClass { com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest.class, com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest.Builder.class); } + public static final int AMOUNT_FIELD_NUMBER = 1; + private int amount_; + /** + * int32 Amount = 1; + */ + public int getAmount() { + return amount_; + } + + public static final int DELAY_FIELD_NUMBER = 2; + private int delay_; + /** + * int32 Delay = 2; + */ + public int getDelay() { + return delay_; + } + private byte memoizedIsInitialized = -1; public final boolean isInitialized() { byte isInitialized = memoizedIsInitialized; @@ -96,6 +137,12 @@ public final class ProgressRequestOuterClass { public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (amount_ != 0) { + output.writeInt32(1, amount_); + } + if (delay_ != 0) { + output.writeInt32(2, delay_); + } unknownFields.writeTo(output); } @@ -104,6 +151,14 @@ public final class ProgressRequestOuterClass { if (size != -1) return size; size = 0; + if (amount_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(1, amount_); + } + if (delay_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(2, delay_); + } size += unknownFields.getSerializedSize(); memoizedSize = size; return size; @@ -120,6 +175,10 @@ public final class ProgressRequestOuterClass { com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest other = (com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest) obj; boolean result = true; + result = result && (getAmount() + == other.getAmount()); + result = result && (getDelay() + == other.getDelay()); result = result && unknownFields.equals(other.unknownFields); return result; } @@ -131,6 +190,10 @@ public final class ProgressRequestOuterClass { } int hash = 41; hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + AMOUNT_FIELD_NUMBER; + hash = (53 * hash) + getAmount(); + hash = (37 * hash) + DELAY_FIELD_NUMBER; + hash = (53 * hash) + getDelay(); hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; @@ -260,6 +323,10 @@ public final class ProgressRequestOuterClass { } public Builder clear() { super.clear(); + amount_ = 0; + + delay_ = 0; + return this; } @@ -282,6 +349,8 @@ public final class ProgressRequestOuterClass { 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); + result.amount_ = amount_; + result.delay_ = delay_; onBuilt(); return result; } @@ -323,6 +392,12 @@ public final class ProgressRequestOuterClass { public Builder mergeFrom(com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest other) { if (other == com.twine.tango.pmr.stubs.ProgressRequestOuterClass.ProgressRequest.getDefaultInstance()) return this; + if (other.getAmount() != 0) { + setAmount(other.getAmount()); + } + if (other.getDelay() != 0) { + setDelay(other.getDelay()); + } this.mergeUnknownFields(other.unknownFields); onChanged(); return this; @@ -349,6 +424,58 @@ public final class ProgressRequestOuterClass { } return this; } + + private int amount_ ; + /** + * int32 Amount = 1; + */ + public int getAmount() { + return amount_; + } + /** + * int32 Amount = 1; + */ + public Builder setAmount(int value) { + + amount_ = value; + onChanged(); + return this; + } + /** + * int32 Amount = 1; + */ + public Builder clearAmount() { + + amount_ = 0; + onChanged(); + return this; + } + + private int delay_ ; + /** + * int32 Delay = 2; + */ + public int getDelay() { + return delay_; + } + /** + * int32 Delay = 2; + */ + public Builder setDelay(int value) { + + delay_ = value; + onChanged(); + return this; + } + /** + * int32 Delay = 2; + */ + public Builder clearDelay() { + + delay_ = 0; + onChanged(); + return this; + } public final Builder setUnknownFields( final com.google.protobuf.UnknownFieldSet unknownFields) { return super.setUnknownFieldsProto3(unknownFields); @@ -413,8 +540,9 @@ public final class ProgressRequestOuterClass { static { java.lang.String[] descriptorData = { "\n\025ProgressRequest.proto\022\017Tango.PMR.Stubs" + - "\"\021\n\017ProgressRequestB\033\n\031com.twine.tango.p" + - "mr.stubsb\006proto3" + "\"0\n\017ProgressRequest\022\016\n\006Amount\030\001 \001(\005\022\r\n\005D" + + "elay\030\002 \001(\005B\033\n\031com.twine.tango.pmr.stubsb" + + "\006proto3" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { @@ -433,7 +561,7 @@ public final class ProgressRequestOuterClass { internal_static_Tango_PMR_Stubs_ProgressRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( internal_static_Tango_PMR_Stubs_ProgressRequest_descriptor, - new java.lang.String[] { }); + new java.lang.String[] { "Amount", "Delay", }); } // @@protoc_insertion_point(outer_class_scope) diff --git a/Software/Android_Studio/Tango.SharedUI/build.gradle b/Software/Android_Studio/Tango.SharedUI/build.gradle index 0eb8175ac..e677acf65 100644 --- a/Software/Android_Studio/Tango.SharedUI/build.gradle +++ b/Software/Android_Studio/Tango.SharedUI/build.gradle @@ -31,19 +31,23 @@ android { } dexOptions { - preDexLibraries = false + javaMaxHeapSize "4g" } } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) + 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 group: 'io.reactivex.rxjava2', name: 'rxjava', version: '2.1.2' + implementation 'io.reactivex.rxjava2:rxjava: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' + implementation globalDependencies.logging + implementation project(':Tango.Core') + + compile 'com.hrules:horizontalnumberpicker:1.1.1' } 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 index 04d1ea5e7..daec8892a 100644 --- 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 @@ -1,34 +1,91 @@ package com.twine.tango.sharedui.binding_adapters; import android.databinding.BindingAdapter; +import android.databinding.Observable; +import android.databinding.Observable.OnPropertyChangedCallback; import android.graphics.Bitmap; +import android.support.v7.widget.AppCompatSeekBar; +import android.text.method.ScrollingMovementMethod; +import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; +import android.widget.NumberPicker; +import android.widget.NumberPicker.OnValueChangeListener; +import android.widget.SeekBar; +import android.widget.SeekBar.OnSeekBarChangeListener; +import android.widget.TextView; + +import com.hrules.horizontalnumberpicker.HorizontalNumberPicker; +import com.twine.tango.sharedui.editors.ParameterItem; +import com.twine.tango.sharedui.mvvm.DependencyProperty; /** * Created by Roy on 11/7/2017. */ -public class BindingAdapters { - +public class BindingAdapters +{ + @BindingAdapter("android:memory_bitmap") - public static void bitmapAdapter(ImageView view, Bitmap bitmap) { - if (bitmap != null) { + 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) { + 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) { + public static void listViewSelectedItemPosition(ListView view, int position) + { + if (view != null) + { view.setItemChecked(position, true); } } + + @BindingAdapter("android:autoScrollToBottom") + public static void scrollToBottomAdapter(TextView view, Boolean scroll) + { + if (view != null) + { + view.setMovementMethod(new ScrollingMovementMethod()); + } + } + + @BindingAdapter("android:editor_range_adapter") + public static void editorSeekBarAdapter(HorizontalNumberPicker view, ParameterItem item) + { + if (view != null && item != null) + { + boolean block = false; + view.setMinValue((int) item.getMinimum()); + view.setMaxValue((int) item.getMaximum()); + view.setValue((int) ((Double) item.getDefaultValue()).doubleValue()); + + view.setListener((numberPicker, i) -> + { + item.property.setNoChange((double) numberPicker.getValue()); + }); + + item.property.addOnPropertyChangedCallback(new OnPropertyChangedCallback() + { + @Override + public void onPropertyChanged(Observable observable, int i) + { + view.setValue((int) ((Double) item.property.get()).doubleValue()); + } + }); + } + } + } diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/binding_converters/ObjectToIntConverter.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/binding_converters/ObjectToIntConverter.java new file mode 100644 index 000000000..f571e4561 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/binding_converters/ObjectToIntConverter.java @@ -0,0 +1,22 @@ +package com.twine.tango.sharedui.binding_converters; + +import android.databinding.BindingConversion; +import android.databinding.InverseBindingMethod; +import android.databinding.InverseMethod; + +/** + * Created by Roy on 11/20/2017. + */ + +public class ObjectToIntConverter +{ +// @InverseBindingMethod() +// public static int toObject(int number) { +// return number; +// } +// +// @BindingConversion +// public static int toInt(Object object) { +// return Integer.parseInt(object.toString()); +// } +} diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/ActivityBase.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/ActivityBase.java index 7f52ffae6..d8360f485 100644 --- a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/ActivityBase.java +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/ActivityBase.java @@ -11,19 +11,18 @@ 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.IView; 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 extends AppCompatActivity implements ViewContract, Validator.ValidationListener { +public abstract class ActivityBase extends AppCompatActivity implements IView, Validator.ValidationListener { protected static final String ACTIVITY_CALLBACK_INTENT = "ACTIVITY_CALLBACK_INTENT"; diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/FragmentBase.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/FragmentBase.java index 19d472e24..a65b09a7f 100644 --- a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/FragmentBase.java +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/containers/FragmentBase.java @@ -12,7 +12,8 @@ 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.core.Action1; +import com.twine.tango.sharedui.mvvm.IView; import com.twine.tango.sharedui.mvvm.ViewModelBase; import java.lang.reflect.Method; @@ -23,10 +24,11 @@ import javax.inject.Inject; import butterknife.ButterKnife; import io.reactivex.functions.Consumer; -public abstract class FragmentBase extends Fragment implements ViewContract, Validator.ValidationListener { +public abstract class FragmentBase extends Fragment implements IView, Validator.ValidationListener { private Consumer lastValidationConsumer; private Validator validator; + private Action1 onCreateListener; @Inject VM vm; @@ -50,6 +52,12 @@ public abstract class FragmentBase listener) + { + onCreateListener = listener; + } + @SuppressWarnings("unchecked") @Override public void attachView() { 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 index 7f56dd49e..15a7f4022 100644 --- 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 @@ -11,7 +11,7 @@ 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.IView; import com.twine.tango.sharedui.mvvm.ViewModelBase; import java.lang.reflect.Method; import java.util.List; @@ -19,7 +19,7 @@ import javax.inject.Inject; import butterknife.ButterKnife; import io.reactivex.functions.Consumer; -public abstract class FragmentBaseV4 extends Fragment implements ViewContract, Validator.ValidationListener { +public abstract class FragmentBaseV4 extends Fragment implements IView, Validator.ValidationListener { private Consumer lastValidationConsumer; private Validator validator; diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/editors/IParameterized.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/editors/IParameterized.java new file mode 100644 index 000000000..c400f844a --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/editors/IParameterized.java @@ -0,0 +1,46 @@ +package com.twine.tango.sharedui.editors; + +import com.twine.tango.sharedui.mvvm.DependencyProperty; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Roy on 11/20/2017. + */ + +public interface IParameterized +{ + default List getParameters() + { + List parameters = new ArrayList<>(); + + for (Field field: this.getClass().getDeclaredFields()) + { + ParameterAnnotation annotation = field.getAnnotation(ParameterAnnotation.class); + if (annotation != null) + { + try + { + ParameterItem item = new ParameterItem( + annotation.name(), + annotation.minimum(), + annotation.maximum(), + annotation.defaultValue(), + (DependencyProperty) field.get(this), + annotation.type()); + + parameters.add(item); + + } catch (IllegalAccessException e) + { + e.printStackTrace(); + } + } + } + + return parameters; + } +} diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/editors/ParameterAnnotation.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/editors/ParameterAnnotation.java new file mode 100644 index 000000000..32d15ad46 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/editors/ParameterAnnotation.java @@ -0,0 +1,22 @@ +package com.twine.tango.sharedui.editors; + +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/20/2017. + */ + +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ParameterAnnotation +{ + String name() default ""; + double minimum() default 0; + double maximum() default 100; + double defaultValue() default 0; + Class type() default double.class; +} + diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/editors/ParameterItem.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/editors/ParameterItem.java new file mode 100644 index 000000000..96ae45caf --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/editors/ParameterItem.java @@ -0,0 +1,91 @@ +package com.twine.tango.sharedui.editors; + +import com.twine.tango.sharedui.mvvm.DependencyProperty; + +/** + * Created by Roy on 11/20/2017. + */ +public class ParameterItem +{ + private String name; + private double minimum; + private double maximum; + private double defaultValue; + public DependencyProperty property; + public DependencyProperty number; + private Class type; + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public DependencyProperty getProperty() + { + return property; + } + + public void setProperty(DependencyProperty property) + { + this.property = property; + } + + public double getMinimum() + { + return minimum; + } + + public void setMinimum(double minimum) + { + this.minimum = minimum; + } + + public double getMaximum() + { + return maximum; + } + + public void setMaximum(double maximum) + { + this.maximum = maximum; + } + + public double getDefaultValue() + { + return defaultValue; + } + + public void setDefaultValue(double defaultValue) + { + this.defaultValue = defaultValue; + } + + public Class getType() + { + return type; + } + + public void setType(Class type) + { + this.type = type; + } + + public ParameterItem() + { + } + + public ParameterItem(String name, double minimum, double maximum, double defaultValue, DependencyProperty property, Class type) + { + this.name = name; + this.minimum = minimum; + this.maximum = maximum; + this.defaultValue = defaultValue; + this.property = property; + this.type = type; + } +} diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/editors/ParameterizedEditor.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/editors/ParameterizedEditor.java new file mode 100644 index 000000000..6301cdf24 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/editors/ParameterizedEditor.java @@ -0,0 +1,79 @@ +package com.twine.tango.sharedui.editors; + +import android.content.Context; +import android.content.res.TypedArray; +import android.databinding.BindingAdapter; +import android.databinding.DataBindingUtil; +import android.databinding.ViewDataBinding; +import android.graphics.drawable.GradientDrawable.Orientation; +import android.support.v7.widget.LinearLayoutCompat.OrientationMode; +import android.text.method.ScrollingMovementMethod; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ScrollView; +import android.widget.TextView; + +import com.twine.tango.core.ContextFactory; +import com.twine.tango.sharedui.BR; +import com.twine.tango.sharedui.R; + +import java.util.List; + +/** + * Created by Roy on 11/20/2017. + */ + +public class ParameterizedEditor extends ScrollView +{ + private IParameterized parameterizedObject; + + public ParameterizedEditor(Context context, AttributeSet attrs) + { + super(context, attrs); + } + + public IParameterized getParameterizedObject() + { + return parameterizedObject; + } + + public void setParameterizedObject(IParameterized parameterizedObject) + { + this.parameterizedObject = parameterizedObject; + propagateParameters(); + } + + private void propagateParameters() + { + this.removeAllViews(); + + LinearLayout layout = new LinearLayout(this.getContext()); + layout.setOrientation(LinearLayout.VERTICAL); + + this.addView(layout); + + List items = parameterizedObject.getParameters(); + + for (ParameterItem item : items) + { + TextView textView = new TextView(this.getContext()); + textView.setText(item.getName()); + layout.addView(textView); + + ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(layout.getContext()), R.layout.editor_range, layout, false); + binding.setVariable(BR.item, item); + layout.addView(binding.getRoot()); + } + } + + @BindingAdapter("android:parameterizedObject") + public static void parameterizedObjectAdapter(ParameterizedEditor view, IParameterized object) + { + if (view != null && object != null) + { + view.setParameterizedObject(object); + } + } +} 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 index b39be3dc3..15361515a 100644 --- 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 @@ -6,41 +6,70 @@ import android.databinding.ObservableField; * Created by Roy on 7/27/2017. */ -public class DependencyProperty extends ObservableField { - - public interface OnPropertyChangedCallback { +public class DependencyProperty extends ObservableField +{ + + private boolean blockNotify; + + public interface OnPropertyChangedCallback + { void onPropertyChanged(DependencyProperty dp, T value); } - + private OnPropertyChangedCallback callback; - - public DependencyProperty(OnPropertyChangedCallback callback) { + + public DependencyProperty(OnPropertyChangedCallback callback) + { this.callback = callback; init(); } - - public DependencyProperty(T defaultValue, OnPropertyChangedCallback callback) { + + public DependencyProperty(T defaultValue, OnPropertyChangedCallback callback) + { this.set(defaultValue); this.callback = callback; init(); } - - public DependencyProperty(T defaultValue) { + + public DependencyProperty(T defaultValue) + { this.set(defaultValue); init(); } - - public DependencyProperty() { + + public DependencyProperty() + { init(); } - - private void init() { + + public void setNoChange(T value) + { + blockNotify = true; + set(value); + } + + @Override + public void notifyChange() + { + if (!blockNotify) + { + super.notifyChange(); + } + + blockNotify = false; + } + + private void init() + { final DependencyProperty that = this; - - this.addOnPropertyChangedCallback(new android.databinding.Observable.OnPropertyChangedCallback() { + + this.addOnPropertyChangedCallback(new android.databinding.Observable.OnPropertyChangedCallback() + { @Override - public void onPropertyChanged(android.databinding.Observable observable, int i) { - if (that.callback != null) { + 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/IView.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/IView.java new file mode 100644 index 000000000..24597b4c5 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/IView.java @@ -0,0 +1,9 @@ +package com.twine.tango.sharedui.mvvm; + +import io.reactivex.functions.Consumer; + +public interface IView +{ + void attachView(); + void validateFields(Consumer consumer); +} 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 deleted file mode 100644 index 89427070b..000000000 --- a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/mvvm/ViewContract.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.twine.tango.sharedui.mvvm; - -import io.reactivex.functions.Consumer; - -public interface ViewContract { - void attachView(); - void validateFields(Consumer 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 index 4e66d88e9..d8aa18081 100644 --- 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 @@ -2,11 +2,13 @@ package com.twine.tango.sharedui.mvvm; import android.util.Log; +import java.lang.reflect.Field; + /** * Created by Roy on 7/26/2017. */ -public abstract class ViewModelBase { +public abstract class ViewModelBase { public T view; //TODO: Maybe use WeakReference to not prevent garbage collector from disposing the activity ? @@ -18,4 +20,21 @@ public abstract class ViewModelBase { protected void onViewAttached(T view) { Log.i("MVVM",view.getClass().getSimpleName() + " attached to " + this.getClass().getSimpleName()); } + + protected void invalidateCommands() + { + for (Field field : this.getClass().getDeclaredFields()) + { + if (field.getType() == RelayCommand.class) + { + try + { + ((RelayCommand)field.get(this)).invalidateCommand(); + } catch (IllegalAccessException e) + { + e.printStackTrace(); + } + } + } + } } diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/navigation/AndroidNavigationProvider.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/navigation/AndroidNavigationProvider.java new file mode 100644 index 000000000..317e70637 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/navigation/AndroidNavigationProvider.java @@ -0,0 +1,117 @@ +package com.twine.tango.sharedui.navigation; + +import android.app.FragmentManager; +import android.app.FragmentTransaction; +import android.support.v7.app.AppCompatActivity; + +import com.elvishew.xlog.XLog; +import com.twine.tango.core.Action1; +import com.twine.tango.sharedui.R; +import com.twine.tango.sharedui.containers.FragmentBase; + +public class AndroidNavigationProvider implements INavigationProvider +{ + private AppCompatActivity activity; + private FragmentBase currentFragment; + private int fragment_container; + private String basePackagePath; + + @Override + public void registerNavigationActivity(AppCompatActivity activity, int fragmentContainerId, String basePackagePath) + { + this.activity = activity; + this.fragment_container = fragmentContainerId; + this.basePackagePath = basePackagePath; + } + + + @Override + public void navigateTo(Enum fragmentValue) + { + navigateTo(fragmentValue.name()); + } + + @Override + public void navigateTo(Enum fragmentValue, Action1 onCreateListener) + { + navigateTo(fragmentValue.name(), onCreateListener); + } + + @Override + public void navigateTo(String fragmentName) + { + navigateTo(fragmentName, null); + } + + @Override + public void navigateTo(String fragmentName, Action1 onCreateListener) + { + if (activity == null) + { + XLog.e(new NullPointerException("No navigation activity registered.")); + return; + } + + fragmentName = basePackagePath + "." + fragmentName.toLowerCase() + "." + fragmentName + "Fragment"; + + FragmentManager fragmentManager = activity.getFragmentManager(); + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); + FragmentBase fragment; + + fragment = (FragmentBase) fragmentManager.findFragmentByTag(fragmentName); + + if (fragment == null) + { + try + { + fragment = (FragmentBase) Class.forName(fragmentName).newInstance(); + } catch (Exception ex) + { + XLog.e("Fragment " + fragmentName + " not found.", ex); + return; + } + } + +// Slide enterSlide = new Slide(); +// enterSlide.setSlideEdge(Gravity.END); +// enterSlide.setDuration(300); +// +// Fade enterFade = new Fade(Fade.IN); +// enterFade.setDuration(300); +// +// TransitionSet enterGroup = new TransitionSet(); +// enterGroup.addTransition(enterSlide); +// enterGroup.addTransition(enterFade); +// +// Slide exitSlide = new Slide(); +// Fade exitFade = new Fade(Fade.OUT); +// +// exitSlide.setSlideEdge(Gravity.START); +// exitSlide.setDuration(300); +// exitFade.setDuration(300); +// +// TransitionSet exitGroup = new TransitionSet(); +// exitGroup.addTransition(exitSlide); +// exitGroup.addTransition(exitFade); +// +// fragment.setEnterTransition(enterGroup); +// fragment.setExitTransition(exitGroup); + + fragment.setOnCreateListener(onCreateListener); + + fragmentTransaction.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_left, R.animator.slide_out_right, R.animator.slide_in_right); + fragmentTransaction.replace(fragment_container, fragment).addToBackStack(fragmentName); + fragmentTransaction.commit(); + + try + { + //noinspection ConstantConditions + //fragment.getView().setFocusableInTouchMode(true); + } catch (Exception ex) + { + XLog.e(ex); + } + + currentFragment = fragment; + } +} diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/navigation/INavigationProvider.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/navigation/INavigationProvider.java new file mode 100644 index 000000000..fda6db70a --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/navigation/INavigationProvider.java @@ -0,0 +1,22 @@ +package com.twine.tango.sharedui.navigation; + +import android.support.v7.app.AppCompatActivity; + +import com.twine.tango.core.Action1; +import com.twine.tango.sharedui.containers.FragmentBase; + +/** + * Represents an activity fragments navigator. + */ +public interface INavigationProvider +{ + void registerNavigationActivity(AppCompatActivity activity, int fragmentContainerId, String basePackagePath); + + void navigateTo(String fragmentName); + + void navigateTo(String fragmentName, Action1 onCreateListener); + + void navigateTo(Enum fragmentValue); + + void navigateTo(Enum fragmentValue, Action1 onCreateListener); +} 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 index 7fd2cfacd..e1e86efe9 100644 --- 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 @@ -1,22 +1,53 @@ package com.twine.tango.sharedui.notifications; import android.content.Context; +import android.content.DialogInterface; +import android.support.v7.app.AlertDialog; import android.widget.Toast; +import com.twine.tango.core.Action; +import com.twine.tango.sharedui.mvvm.IView; + /** * Created by Roy on 7/29/2017. */ -public class AndroidNotificationProvider implements NotificationProvider { - +public class AndroidNotificationProvider implements INotificationProvider +{ + private Context context; - - public AndroidNotificationProvider(Context context) { + + public AndroidNotificationProvider(Context context) + { this.context = context; } - + @Override - public void notify(String message) { + public void toast(String message) + { Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } + + @Override + public void showMessage(IView view, String message) + { + showMessage(view, message, null); + } + + @Override + public void showMessage(IView view, String message, Action action) + { + AlertDialog.Builder builder = new AlertDialog.Builder((Context) view); + builder.setMessage("Look at this dialog!") + .setCancelable(false) + .setTitle("Tango") + .setMessage(message) + .setIcon(android.R.drawable.ic_dialog_info) + .setPositiveButton("OK", (dialog, id) -> + { + if (action != null) action.invoke(); + }); + AlertDialog alert = builder.create(); + alert.show(); + } } diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/notifications/INotificationProvider.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/notifications/INotificationProvider.java new file mode 100644 index 000000000..191f8ffcb --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/notifications/INotificationProvider.java @@ -0,0 +1,19 @@ +package com.twine.tango.sharedui.notifications; + +import com.twine.tango.core.Action; +import com.twine.tango.sharedui.mvvm.IView; + +/** + * Created by Roy on 7/29/2017. + */ + +public interface INotificationProvider +{ + + void toast(String message); + + void showMessage(IView view, String message); + + void showMessage(IView view, String message, Action action); + +} 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 deleted file mode 100644 index 87fe8359d..000000000 --- a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/notifications/NotificationProvider.java +++ /dev/null @@ -1,11 +0,0 @@ -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/validation/IViewValidator.java b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/validation/IViewValidator.java new file mode 100644 index 000000000..5158a118b --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/validation/IViewValidator.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 IViewValidator implements Validator.ValidationListener { + + @Override + public void onValidationSucceeded() { + + } + + @Override + public void onValidationFailed(List errors) { + + } +} 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 deleted file mode 100644 index 4c62b7548..000000000 --- a/Software/Android_Studio/Tango.SharedUI/src/main/java/com/twine/tango/sharedui/validation/ViewValidator.java +++ /dev/null @@ -1,23 +0,0 @@ -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 errors) { - - } -} diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/res/animator/slide_in_left.xml b/Software/Android_Studio/Tango.SharedUI/src/main/res/animator/slide_in_left.xml new file mode 100644 index 000000000..4477230df --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/res/animator/slide_in_left.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/res/animator/slide_in_right.xml b/Software/Android_Studio/Tango.SharedUI/src/main/res/animator/slide_in_right.xml new file mode 100644 index 000000000..8869d9968 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/res/animator/slide_in_right.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/res/animator/slide_out_left.xml b/Software/Android_Studio/Tango.SharedUI/src/main/res/animator/slide_out_left.xml new file mode 100644 index 000000000..ba68a3065 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/res/animator/slide_out_left.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/res/animator/slide_out_right.xml b/Software/Android_Studio/Tango.SharedUI/src/main/res/animator/slide_out_right.xml new file mode 100644 index 000000000..9abbbb625 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/res/animator/slide_out_right.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/Software/Android_Studio/Tango.SharedUI/src/main/res/layout/editor_range.xml b/Software/Android_Studio/Tango.SharedUI/src/main/res/layout/editor_range.xml new file mode 100644 index 000000000..41683ddb7 --- /dev/null +++ b/Software/Android_Studio/Tango.SharedUI/src/main/res/layout/editor_range.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/AndroidManifest.xml b/Software/Android_Studio/Tango.Stubs.UI/src/main/AndroidManifest.xml index d609ad25d..e699ecbd3 100644 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/AndroidManifest.xml +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/AndroidManifest.xml @@ -19,8 +19,6 @@ - - \ 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 index f0c71477f..c57155f7b 100644 --- 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 @@ -2,12 +2,10 @@ 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; @@ -15,7 +13,6 @@ 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; @@ -76,6 +73,7 @@ public class App extends Application { Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { + throwable.printStackTrace(); XLog.e(throwable); System.exit(1); }); diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ApplicationComponent.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ApplicationComponent.java index e9a3d65de..ab0b84c25 100644 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ApplicationComponent.java +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ApplicationComponent.java @@ -4,8 +4,8 @@ import com.twine.tango.stubs.ui.views.login.LoginFragment; import com.twine.tango.stubs.ui.views.main.MainActivity; import com.twine.tango.stubs.ui.views.main.MainActivityVM; import com.twine.tango.stubs.ui.views.selection.SelectionFragment; -import com.twine.tango.stubs.ui.views.stub.StubActivity; -import com.twine.tango.stubs.ui.views.stubs.StubsActivity; +import com.twine.tango.stubs.ui.views.stub.StubFragment; +import com.twine.tango.stubs.ui.views.stubs.StubsFragment; import javax.inject.Singleton; @@ -16,8 +16,9 @@ import dagger.Component; */ @Singleton -@Component(modules = {ApplicationModule.class, ViewModelsModule.class, EventBusModule.class, NotificationModule.class, TransportModule.class}) -public interface ApplicationComponent { +@Component(modules = {ApplicationModule.class, ViewModelsModule.class, EventBusModule.class, NotificationModule.class, TransportModule.class, NavigationModule.class}) +public interface ApplicationComponent +{ void inject(MainActivity view); @@ -25,9 +26,9 @@ public interface ApplicationComponent { void inject(SelectionFragment view); - void inject(StubsActivity view); + void inject(StubsFragment view); - void inject(StubActivity view); + void inject(StubFragment view); MainActivityVM provideMainActivityVM(); } diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/NavigationModule.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/NavigationModule.java new file mode 100644 index 000000000..674157858 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/NavigationModule.java @@ -0,0 +1,20 @@ +package com.twine.tango.stubs.ui.dagger; + +import android.content.Context; +import com.twine.tango.sharedui.navigation.AndroidNavigationProvider; +import com.twine.tango.sharedui.navigation.INavigationProvider; +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +@Module +public class NavigationModule +{ + @Provides + @Singleton + public INavigationProvider provideNavigation() + { + return new AndroidNavigationProvider(); + } +} 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 index 900080c25..69d6d8f62 100644 --- 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 @@ -3,7 +3,7 @@ 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 com.twine.tango.sharedui.notifications.INotificationProvider; import javax.inject.Singleton; @@ -19,7 +19,7 @@ public class NotificationModule { @Provides @Singleton - public NotificationProvider provideNotificationProvider(Context context) + public INotificationProvider 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/TransportModule.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/TransportModule.java index 7c4babd1f..eaca13ecb 100644 --- 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 @@ -18,16 +18,8 @@ public class TransportModule @Provides @Singleton - public ITransporter provideTransporter(ITransportAdapter adapter) + public ITransporter provideTransporter() { - return new ProtoTransporter(adapter); + return new ProtoTransporter(new TcpTransportAdapter("10.0.2.2", 9999)); } - - @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 index 55fece908..927511efc 100644 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ViewModelsModule.java +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/dagger/ViewModelsModule.java @@ -1,14 +1,13 @@ 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.sharedui.navigation.INavigationProvider; +import com.twine.tango.sharedui.notifications.INotificationProvider; 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.stubs.ui.views.stub.StubFragmentVM; +import com.twine.tango.stubs.ui.views.stubs.StubsFragmentVM; import com.twine.tango.transport.ITransportAdapter; import com.twine.tango.transport.ITransporter; @@ -27,36 +26,36 @@ public class ViewModelsModule @Provides @Singleton - public MainActivityVM provideMainActivityVM(Bus eventBus, NotificationProvider notificationProvider) + public MainActivityVM provideMainActivityVM(Bus eventBus, INotificationProvider notificationProvider, INavigationProvider navigationProvider, ITransporter transporter) { - return new MainActivityVM(eventBus, notificationProvider); + return new MainActivityVM(eventBus, notificationProvider, navigationProvider, transporter); } @Provides @Singleton - public LoginFragmentVM provideLoginFragmentVM(Bus eventBus, NotificationProvider notificationProvider) + public LoginFragmentVM provideLoginFragmentVM(Bus eventBus, INotificationProvider notificationProvider) { return new LoginFragmentVM(eventBus, notificationProvider); } @Provides @Singleton - public SelectionFragmentVM provideSelectionFragmentVM() + public SelectionFragmentVM provideSelectionFragmentVM(INavigationProvider navigationProvider) { - return new SelectionFragmentVM(); + return new SelectionFragmentVM(navigationProvider); } @Provides @Singleton - public StubsActivityVM provideStubsActivityVM(Bus eventBus) + public StubsFragmentVM provideStubsFragmentVM(Bus eventBus, INavigationProvider navigationProvider) { - return new StubsActivityVM(eventBus); + return new StubsFragmentVM(eventBus, navigationProvider); } @Provides @Singleton - public StubActivityVM provideStubActivityVM(Bus eventBus, NotificationProvider notificationProvider, ITransporter transporter, ITransportAdapter adapter) + public StubFragmentVM provideStubFragmentVM(Bus eventBus, INotificationProvider notificationProvider, ITransporter transporter) { - return new StubActivityVM(eventBus, notificationProvider, transporter, adapter); + return new StubFragmentVM(eventBus, notificationProvider, transporter); } } diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/ILoginFragment.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/ILoginFragment.java new file mode 100644 index 000000000..f5ab3ec4b --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/ILoginFragment.java @@ -0,0 +1,11 @@ +package com.twine.tango.stubs.ui.views.login; + +import com.twine.tango.sharedui.mvvm.IView; + +/** + * Created by Roy on 11/6/2017. + */ + +public interface ILoginFragment extends IView +{ +} diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragment.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragment.java index 4a8e32afd..267977ede 100644 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragment.java +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragment.java @@ -15,7 +15,8 @@ import butterknife.BindView; /** * A simple {@link Fragment} subclass. */ -public class LoginFragment extends FragmentBase implements LoginFragmentContract { +public class LoginFragment extends FragmentBase implements ILoginFragment +{ @BindView(R.id.txtEmail) @Email(message = "Please enter a valid email address") 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 deleted file mode 100644 index d28e67b25..000000000 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragmentContract.java +++ /dev/null @@ -1,10 +0,0 @@ -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 index ae454465e..2701aa63d 100644 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragmentVM.java +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/login/LoginFragmentVM.java @@ -1,13 +1,11 @@ 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.sharedui.notifications.INotificationProvider; import com.twine.tango.stubs.ui.Events.LoginEvent; import javax.inject.Inject; @@ -16,10 +14,10 @@ import javax.inject.Inject; * Created by Roy on 11/6/2017. */ -public class LoginFragmentVM extends ViewModelBase { +public class LoginFragmentVM extends ViewModelBase { private Bus eventBus; - private NotificationProvider notificationProvider; + private INotificationProvider notificationProvider; public DependencyProperty email; public DependencyProperty password; @@ -27,7 +25,7 @@ public class LoginFragmentVM extends ViewModelBase { public RelayCommand loginCommand; @Inject - public LoginFragmentVM(Bus eventBus, NotificationProvider notificationProvider) { + public LoginFragmentVM(Bus eventBus, INotificationProvider notificationProvider) { this.eventBus = eventBus; this.notificationProvider = notificationProvider; diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/IMainActivity.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/IMainActivity.java new file mode 100644 index 000000000..57d550763 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/IMainActivity.java @@ -0,0 +1,20 @@ +package com.twine.tango.stubs.ui.views.main; + +import com.twine.tango.sharedui.mvvm.IView; + +/** + * Created by Roy on 11/6/2017. + */ + +public interface IMainActivity extends IView +{ + + enum Navigation + { + Login, + Selection, + Stubs, + Stub + } + +} diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivity.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivity.java index d31f2b525..c2699c640 100644 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivity.java +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivity.java @@ -1,80 +1,82 @@ 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.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarDrawerToggle; -import android.util.Log; - -import com.twine.tango.pmr.MessageFactory; +import android.view.View; import com.twine.tango.sharedui.containers.ActivityBase; -import com.twine.tango.sharedui.containers.FragmentBase; +import com.twine.tango.sharedui.navigation.INavigationProvider; 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; +import javax.inject.Inject; -public class MainActivity extends ActivityBase implements MainActivityContract { - - ActionBarDrawerToggle mDrawerToggle; +public class MainActivity extends ActivityBase implements IMainActivity +{ + + private ActionBarDrawerToggle mDrawerToggle; private Fragment currentFragment; - + + @Inject + public INavigationProvider navigationProvider; + @Override - protected void onCreate(Bundle savedInstanceState) { + protected void onCreate(Bundle savedInstanceState) + { super.onCreate(savedInstanceState); - - //Load login fragment. - navigateTo(Navigation.MAIN); - + + navigationProvider.registerNavigationActivity(this, R.id.fragment_container, "com.twine.tango.stubs.ui.views"); + + navigationProvider.navigateTo(Navigation.Login); + setSupportActionBar(findViewById(R.id.toolbar1)); - //initializeSideMenu(); + initializeSideMenu(); } - + @Override - protected int getLayoutId() { + protected int getLayoutId() + { return R.layout.activity_main; } - + @Override - protected void inject() { + 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; + + private void initializeSideMenu() { + final ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setDisplayShowHomeEnabled(true); + actionBar.setTitle("Tango"); + mDrawerToggle = new ActionBarDrawerToggle(this, findViewById(R.id.drawerLayout), findViewById(R.id.toolbar1), R.string.app_name, R.string.app_name) { + + public void onDrawerClosed(View view) { + supportInvalidateOptionsMenu(); + //drawerOpened = false; + } + + public void onDrawerOpened(View drawerView) { + supportInvalidateOptionsMenu(); + //drawerOpened = true; + } + }; + + mDrawerToggle.setDrawerIndicatorEnabled(true); + ((DrawerLayout) findViewById(R.id.drawerLayout)).addDrawerListener(mDrawerToggle); + mDrawerToggle.syncState(); } - - if (currentFragment != null) fragmentTransaction.remove(currentFragment); - currentFragment = fragment; - fragmentTransaction.add(R.id.fragment_container, fragment); - fragmentTransaction.commit(); + } + + @Override + public boolean onSupportNavigateUp() + { + onBackPressed(); + return true; } } 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 deleted file mode 100644 index 3f27e29d9..000000000 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivityContract.java +++ /dev/null @@ -1,18 +0,0 @@ -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 index 7a6fe2a1f..e77cc0810 100644 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivityVM.java +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/main/MainActivityVM.java @@ -4,34 +4,71 @@ 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.sharedui.navigation.INavigationProvider; +import com.twine.tango.sharedui.notifications.INotificationProvider; import com.twine.tango.stubs.ui.Events.LoginEvent; +import com.twine.tango.stubs.ui.views.main.IMainActivity.Navigation; +import com.twine.tango.transport.ITransporter; +import com.twine.tango.transport.TransportComponentState; import javax.inject.Inject; -public class MainActivityVM extends ViewModelBase { +import io.reactivex.android.schedulers.AndroidSchedulers; +public class MainActivityVM extends ViewModelBase +{ + private Bus eventBus; private User currentUser; - private NotificationProvider notificationProvider; - - + private INotificationProvider notificationProvider; + private INavigationProvider navigationProvider; + private ITransporter transporter; + + public DependencyProperty isConnected; + + public RelayCommand connectCommand; + public RelayCommand disconnectCommand; + + + @Inject - public MainActivityVM(Bus eventBus, NotificationProvider notificationProvider) { + public MainActivityVM(Bus eventBus, INotificationProvider notificationProvider, INavigationProvider navigationProvider,ITransporter transporter) + { this.eventBus = eventBus; this.notificationProvider = notificationProvider; + this.navigationProvider = navigationProvider; + this.transporter = transporter; this.eventBus.register(this); + + isConnected = new DependencyProperty<>(false); + + connectCommand = new RelayCommand(this::connect,() -> this.transporter.getState() != TransportComponentState.Connected); + disconnectCommand = new RelayCommand(this::disconnect,() -> this.transporter.getState() == TransportComponentState.Connected); + + this.transporter.addStateChangedListener((sender,e) -> + isConnected.set(this.transporter.getState() == TransportComponentState.Connected)); } - + + private void connect() + { + transporter.connect().observeOn(AndroidSchedulers.mainThread()).subscribe(() -> + invalidateCommands(),(ex) -> + notificationProvider.showMessage(view,"Could not connect the Transporter.")); + } + + private void disconnect() + { + transporter.disconnect().observeOn(AndroidSchedulers.mainThread()).subscribe(() -> + invalidateCommands(),(ex) -> + notificationProvider.showMessage(view,"Could not disconnect the Transporter.")); + } + @Subscribe public void loginEventHandler(LoginEvent e) { currentUser = e.getUser(); - view.navigateTo(MainActivityContract.Navigation.MAIN); - notificationProvider.notify(currentUser.getEmail() + " Log In!"); + navigationProvider.navigateTo(Navigation.Selection); } } diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/ISelectionFragment.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/ISelectionFragment.java new file mode 100644 index 000000000..bab0f1782 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/ISelectionFragment.java @@ -0,0 +1,12 @@ +package com.twine.tango.stubs.ui.views.selection; + +import com.twine.tango.sharedui.mvvm.IView; + +/** + * Created by Roy on 11/6/2017. + */ + +public interface ISelectionFragment extends IView +{ + +} diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragment.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragment.java index 171aa562d..ed1f85f55 100644 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragment.java +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/selection/SelectionFragment.java @@ -8,12 +8,13 @@ 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; +import com.twine.tango.stubs.ui.views.stubs.StubsFragment; /** * A simple {@link Fragment} subclass. */ -public class SelectionFragment extends FragmentBase implements SelectionFragmentContract { +public class SelectionFragment extends FragmentBase implements ISelectionFragment +{ public SelectionFragment() { @@ -32,18 +33,6 @@ public class SelectionFragment extends FragmentBase { +public class SelectionFragmentVM extends ViewModelBase { + private INavigationProvider navigationProvider; + public RelayCommand openStubsCommand; public RelayCommand openDataBaseCommand; @Inject - public SelectionFragmentVM() { + public SelectionFragmentVM(INavigationProvider navigationProvider) { - openStubsCommand = new RelayCommand(() -> view.navigateTo(SelectionFragmentContract.Navigation.Stubs)); - openDataBaseCommand = new RelayCommand(() -> view.navigateTo(SelectionFragmentContract.Navigation.DataBase)); + this.navigationProvider = navigationProvider; + + openStubsCommand = new RelayCommand(() -> this.navigationProvider.navigateTo(Navigation.Stubs)); + openDataBaseCommand = new RelayCommand(() -> this.navigationProvider.navigateTo(Navigation.Stubs)); } } diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/IStubFragment.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/IStubFragment.java new file mode 100644 index 000000000..bf63e15c8 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/IStubFragment.java @@ -0,0 +1,11 @@ +package com.twine.tango.stubs.ui.views.stub; + +import com.twine.tango.sharedui.mvvm.IView; + +/** + * Created by Roy on 11/7/2017. + */ + +public interface IStubFragment extends IView +{ +} 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 deleted file mode 100644 index 3b4e8f1a1..000000000 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivity.java +++ /dev/null @@ -1,19 +0,0 @@ -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 { - - @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 deleted file mode 100644 index e2fc7fb94..000000000 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivityContract.java +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index d95420dd5..000000000 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubActivityVM.java +++ /dev/null @@ -1,78 +0,0 @@ -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 -{ - private Bus eventBus; - private NotificationProvider notificationProvider; - private ITransporter transporter; - private ITransportAdapter adapter; - public DependencyProperty 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/stub/StubFragment.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubFragment.java new file mode 100644 index 000000000..48f9a1ccd --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubFragment.java @@ -0,0 +1,26 @@ +package com.twine.tango.stubs.ui.views.stub; + +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.ActivityStubBinding; + +public class StubFragment extends FragmentBase +{ + + @Override + protected int getLayoutId() { + return R.layout.activity_stub; + } + + @Override + protected void inject() { + App.getComponent().inject(this); + } + + @Override + public String getTitle() + { + return "Stubs"; + } +} diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubFragmentVM.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubFragmentVM.java new file mode 100644 index 000000000..8a052b38c --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stub/StubFragmentVM.java @@ -0,0 +1,67 @@ +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.sharedui.mvvm.RelayCommand; +import com.twine.tango.sharedui.notifications.INotificationProvider; +import com.twine.tango.stubs.AvailableStub; +import com.twine.tango.sharedui.mvvm.DependencyProperty; +import com.twine.tango.sharedui.mvvm.ViewModelBase; +import com.twine.tango.stubs.StubBase; +import com.twine.tango.stubs.ui.Events.StubSelectedEvent; +import com.twine.tango.transport.ITransporter; + +import javax.inject.Inject; + +import io.reactivex.android.schedulers.AndroidSchedulers; + +/** + * Created by Roy on 11/7/2017. + */ + +public class StubFragmentVM extends ViewModelBase +{ + private Bus eventBus; + private INotificationProvider notificationProvider; + private ITransporter transporter; + public DependencyProperty availableStub; + public DependencyProperty stub; + public DependencyProperty response; + public RelayCommand runCommand; + + @Inject + public StubFragmentVM(Bus eventBus, INotificationProvider notificationProvider, ITransporter transporter) + { + + availableStub = new DependencyProperty<>(); + stub = new DependencyProperty<>(); + response = new DependencyProperty<>(""); + this.eventBus = eventBus; + this.transporter = transporter; + this.notificationProvider = notificationProvider; + this.eventBus.register(this); + + runCommand = new RelayCommand(this::runSelectedStub); + } + + @Subscribe + public void handleStubSelectedEvent(StubSelectedEvent e) + { + availableStub.set(e.getStub()); + stub.set(availableStub.get().createInstance(transporter)); + } + + private void runSelectedStub() + { + stub.get().run().observeOn(AndroidSchedulers.mainThread()).subscribe((response) -> + { + this.response.set(this.response.get() + response + "\n"); + XLog.i(response); + }, (ex) -> + { + this.response.set(this.response.get() + ex.getMessage() + "\n"); + XLog.e(ex); + }); + } +} diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/IStubsFragment.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/IStubsFragment.java new file mode 100644 index 000000000..5d6f6a296 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/IStubsFragment.java @@ -0,0 +1,14 @@ +package com.twine.tango.stubs.ui.views.stubs; + +import com.twine.tango.sharedui.mvvm.IView; + +/** + * Created by Roy on 11/7/2017. + */ + +public interface IStubsFragment extends IView +{ + + + +} 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 deleted file mode 100644 index eba516754..000000000 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivity.java +++ /dev/null @@ -1,25 +0,0 @@ -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 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 deleted file mode 100644 index 52bfaa36f..000000000 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityContract.java +++ /dev/null @@ -1,13 +0,0 @@ -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 deleted file mode 100644 index 4afc1ed67..000000000 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsActivityVM.java +++ /dev/null @@ -1,60 +0,0 @@ -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 { - - private Bus eventBus; - - public ObservableList stubs; - public ItemBinding stubBinding; - public ObservableField selectedStub; - public ObservableField 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/java/com/twine/tango/stubs/ui/views/stubs/StubsFragment.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsFragment.java new file mode 100644 index 000000000..b48962a76 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsFragment.java @@ -0,0 +1,26 @@ +package com.twine.tango.stubs.ui.views.stubs; + +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.ActivityStubsBinding; + +public class StubsFragment extends FragmentBase implements IStubsFragment +{ + + @Override + protected int getLayoutId() { + return R.layout.activity_stubs; + } + + @Override + protected void inject() { + App.getComponent().inject(this); + } + + @Override + public String getTitle() + { + return "Stubs"; + } +} diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsFragmentVM.java b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsFragmentVM.java new file mode 100644 index 000000000..ceacf4e00 --- /dev/null +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/java/com/twine/tango/stubs/ui/views/stubs/StubsFragmentVM.java @@ -0,0 +1,65 @@ +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.navigation.INavigationProvider; +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 com.twine.tango.stubs.ui.views.main.IMainActivity.Navigation; + +import javax.inject.Inject; + +import me.tatarka.bindingcollectionadapter2.ItemBinding; + +/** + * Created by Roy on 11/7/2017. + */ + +public class StubsFragmentVM extends ViewModelBase { + + private Bus eventBus; + private INavigationProvider navigationProvider; + + public ObservableList stubs; + public ItemBinding stubBinding; + public ObservableField selectedStub; + public ObservableField selectedStubIndex; + + + @Inject + public StubsFragmentVM(Bus eventBus, INavigationProvider navigationProvider) { + + this.eventBus = eventBus; + this.navigationProvider = navigationProvider; + + 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()); + + navigationProvider.navigateTo(Navigation.Stub,(x) -> + { + eventBus.post(new StubSelectedEvent(selectedStub.get())); + }); + } +} diff --git a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/activity_main.xml b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/activity_main.xml index 2a3ae6a77..856d3f154 100644 --- a/Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/activity_main.xml +++ b/Software/Android_Studio/Tango.Stubs.UI/src/main/res/layout/activity_main.xml @@ -3,7 +3,7 @@ - + @@ -26,7 +26,31 @@ android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" - android:theme="?attr/actionBarTheme" /> + android:theme="?attr/actionBarTheme" android:gravity="end" > + + + + + + + + + + + android:layout_height="0dp"> + + + +