1313import android .widget .TextView ;
1414
1515import com .f2prateek .rx .preferences .Preference ;
16- import com .mobsandgeeks .saripaar .annotation .Length ;
16+ import com .mobsandgeeks .saripaar .annotation .Pattern ;
1717import com .rockthevote .grommet .R ;
1818import com .rockthevote .grommet .data .Injector ;
1919import com .rockthevote .grommet .data .api .RockyService ;
2525import com .rockthevote .grommet .data .prefs .PartnerId ;
2626import com .rockthevote .grommet .data .prefs .PartnerName ;
2727import com .rockthevote .grommet .ui .misc .BetterViewAnimator ;
28+ import com .rockthevote .grommet .ui .misc .ObservableValidator ;
2829import com .rockthevote .grommet .util .Strings ;
30+ import com .rockthevote .grommet .util .ZipTextWatcher ;
2931
3032import java .util .List ;
3133import java .util .concurrent .TimeUnit ;
3941import rx .schedulers .Schedulers ;
4042import rx .subscriptions .CompositeSubscription ;
4143
44+ import static com .rockthevote .grommet .ui .views .EditableActionView .EditableActionViewListener ;
45+
4246public class EventDetails extends FrameLayout {
4347
4448 static final ButterKnife .Setter <View , Boolean > ENABLED =
@@ -47,46 +51,35 @@ public class EventDetails extends FrameLayout {
4751 @ BindViews ({R .id .ede_til_canvasser_name , R .id .ede_til_event_name ,
4852 R .id .ede_til_event_zip , R .id .ede_til_partner_id })
4953 List <TextInputLayout > editableViews ;
50-
5154 @ BindView (R .id .ed_animator ) BetterViewAnimator viewAnimator ;
5255
5356 @ BindView (R .id .ed_canvasser_name ) TextView edCanvasserName ;
54-
5557 @ BindView (R .id .ed_event_name ) TextView edEventName ;
56-
5758 @ BindView (R .id .ed_event_zip ) TextView edEventZip ;
58-
5959 @ BindView (R .id .ed_partner_name ) TextView edPartnerName ;
6060
6161 @ BindView (R .id .ede_canvasser_name ) EditText edeCanvasserName ;
62-
6362 @ BindView (R .id .ede_event_name ) EditText edeEventName ;
6463
64+ @ Pattern (regex = "^[0-9]{5}(?:-[0-9]{4})?$" , messageResId = R .string .zip_code_error )
65+ @ BindView (R .id .ede_til_event_zip ) TextInputLayout edeEventZipTIL ;
6566 @ BindView (R .id .ede_event_zip ) EditText edeEventZip ;
66-
6767 @ BindView (R .id .ede_til_partner_id ) TextInputLayout edePartnerIdTIL ;
68-
6968 @ BindView (R .id .ede_partner_id ) EditText edePartnerId ;
7069
7170 @ Inject @ EventRegTotal Preference <Integer > eventRegTotalPref ;
72-
7371 @ Inject @ CanvasserName Preference <String > canvasserNamePref ;
74-
7572 @ Inject @ EventName Preference <String > eventNamePref ;
76-
7773 @ Inject @ EventZip Preference <String > eventZipPref ;
78-
7974 @ Inject @ PartnerId Preference <String > partnerIdPref ;
80-
8175 @ Inject @ PartnerName Preference <String > partnerNamePref ;
8276
8377 @ Inject RockyService rockyService ;
8478
8579 private CompositeSubscription subscriptions = new CompositeSubscription ();
86-
87- private EditableActionView .EditableActionViewListener listener ;
88-
8980 private EditableActionView editableActionView ;
81+ private ZipTextWatcher zipTextWatcher = new ZipTextWatcher ();
82+ private ObservableValidator validator ;
9083
9184 public EventDetails (Context context ) {
9285 this (context , null );
@@ -109,13 +102,18 @@ public EventDetails(Context context, AttributeSet attrs, int defStyleAttr) {
109102 @ Override
110103 protected void onFinishInflate () {
111104 super .onFinishInflate ();
112- ButterKnife .bind (this );
105+ if (!isInEditMode ()) {
106+ ButterKnife .bind (this );
107+ validator = new ObservableValidator (this , getContext ());
108+ }
113109 }
114110
115111 @ Override
116112 protected void onAttachedToWindow () {
117113 super .onAttachedToWindow ();
118114 if (!isInEditMode ()) {
115+ edeEventZip .addTextChangedListener (zipTextWatcher );
116+
119117 subscriptions .add (canvasserNamePref .asObservable ()
120118 .subscribe (name -> edCanvasserName .setText (name )));
121119
@@ -132,7 +130,7 @@ protected void onAttachedToWindow() {
132130
133131 public void setEditableActionView (EditableActionView view ) {
134132 editableActionView = view ;
135- listener = new EditableActionView . EditableActionViewListener () {
133+ editableActionView . setListener ( new EditableActionViewListener () {
136134 @ Override
137135 public void onEdit () {
138136 enableEditMode (true );
@@ -147,41 +145,41 @@ public void onCancel() {
147145 public void onSave () {
148146
149147 // allow the user to not set a partner ID
150- if (Strings .isBlank (edePartnerId .getText ().toString ())) {
151- setPartnerName ("" );
152- } else if (edePartnerId .getText ().toString ().equals (partnerIdPref .get ())) {
153- setPartnerName (partnerNamePref .get ());
154- } else {
155- rockyService .getPartnerName (edePartnerId .getText ().toString ())
156- .subscribeOn (Schedulers .io ())
157- .delay (500 , TimeUnit .MILLISECONDS )
158- .observeOn (AndroidSchedulers .mainThread ())
159- .doOnSubscribe (() -> {
160- editableActionView .showSpinner ();
161- ButterKnife .apply (editableViews , ENABLED , false );
162- })
163- .doOnCompleted (() -> ButterKnife .apply (editableViews , ENABLED , true ))
164- .subscribe (result -> {
165- if (!result .isError () && result .response ().isSuccessful ()) {
166- PartnerNameResponse partnerNameResponse = result .response ().body ();
167- if (partnerNameResponse .isValid ()) {
168- setPartnerName (partnerNameResponse .partnerName ());
148+ if (validator .validate ().toBlocking ().single ()) {
149+ if (Strings .isBlank (edePartnerId .getText ().toString ())) {
150+ setPartnerName ("" );
151+ } else if (edePartnerId .getText ().toString ().equals (partnerIdPref .get ())) {
152+ setPartnerName (partnerNamePref .get ());
153+ } else {
154+ rockyService .getPartnerName (edePartnerId .getText ().toString ())
155+ .subscribeOn (Schedulers .io ())
156+ .delay (500 , TimeUnit .MILLISECONDS )
157+ .observeOn (AndroidSchedulers .mainThread ())
158+ .doOnSubscribe (() -> {
159+ editableActionView .showSpinner ();
160+ ButterKnife .apply (editableViews , ENABLED , false );
161+ })
162+ .doOnCompleted (() -> ButterKnife .apply (editableViews , ENABLED , true ))
163+ .subscribe (result -> {
164+ if (!result .isError () && result .response ().isSuccessful ()) {
165+ PartnerNameResponse partnerNameResponse = result .response ().body ();
166+ if (partnerNameResponse .isValid ()) {
167+ setPartnerName (partnerNameResponse .partnerName ());
168+ } else {
169+ edePartnerIdTIL .setError (
170+ getContext ().getString (R .string .error_partner_id ));
171+ editableActionView .showSaveCancel ();
172+ }
169173 } else {
170174 edePartnerIdTIL .setError (
171175 getContext ().getString (R .string .error_partner_id ));
172176 editableActionView .showSaveCancel ();
173177 }
174- } else {
175- edePartnerIdTIL .setError (
176- getContext ().getString (R .string .error_partner_id ));
177- editableActionView .showSaveCancel ();
178- }
179- });
178+ });
179+ }
180180 }
181181 }
182- };
183-
184- editableActionView .setListener (listener );
182+ });
185183 }
186184
187185 private void setPartnerName (String name ) {
0 commit comments