Esempio n. 1
0
        protected override void Setup(CompositeDisposable disposable)
        {
            SetSupportActionBar(UserDetailsToolBar);

            var json = Intent.GetStringExtra(GetString(Resource.String.UserDetailsIntentKey));

            if (!String.IsNullOrWhiteSpace(json))
            {
                ViewModel = CompositionRoot.CreateUserDetailsViewModel(JsonConvert.DeserializeObject <UserModel>(json));
            }
            else
            {
                ViewModel = CompositionRoot.CreateUserDetailsViewModel(null);
            }


            this.OneWayBind(ViewModel,
                            vm => vm.UserName,
                            v => v.UserDetailsCollapsingToolBar.Title,
                            txt => !String.IsNullOrWhiteSpace(txt) ? txt : "Welcome")
            .DisposeWith(disposable);


            this.Bind(ViewModel, vm => vm.UserName, v => v.UserName.Text)
            .DisposeWith(disposable);

            this.WhenAnyValue(v => v.ViewModel.UserNameIsUnique, v => v.ViewModel.UserNameIsValid)
            .Subscribe(items =>
            {
                if (!items.Item1)
                {
                    UserNameTextInputLayout.Error = GetString(Resource.String.UserNameIsUnique);
                    return;
                }

                if (!items.Item2)
                {
                    UserNameTextInputLayout.Error = GetString(Resource.String.UserNameIsInvalid);
                    return;
                }

                UserNameTextInputLayout.Error = String.Empty;
            })
            .DisposeWith(disposable);



            this.Bind(ViewModel, vm => vm.Password, v => v.Password.Text)
            .DisposeWith(disposable);

            this.OneWayBind(ViewModel, vm => vm.ShowPasswordIsInvalid, v => v.PasswordTextInputLayout.Error,
                            result => result ? GetString(Resource.String.PasswordIsInvalid) : String.Empty)
            .DisposeWith(disposable);



            this.WhenAnyValue(x => x.ViewModel.UserImage)
            .Subscribe(bytes =>
            {
                if (bytes == null || bytes.Length == 0)
                {
                    ToolBarImage.SetImageResource(0);
                }
                else
                {
                    Func <CancellationToken, Task <Stream> > processMe =
                        (ct) =>
                    {
                        return(Task.FromResult((System.IO.Stream) new MemoryStream(bytes ?? new byte[0])));
                    };

                    ImageService.Instance
                    .LoadStream(processMe)
                    .Into(ToolBarImage);
                }
            })
            .DisposeWith(disposable);



            this.OneWayBind(ViewModel, vm => vm.EnableSaveButton, v => v.UpdateUser.Enabled)
            .DisposeWith(disposable);

            this.BindCommand(ViewModel, vm => vm.SaveUser, v => v.UpdateUser)
            .DisposeWith(disposable);


            this.WhenAnyObservable(v => v.ViewModel.GoBackWithResult)
            .Subscribe(results =>
            {
                Intent intent = new Intent();
                intent.PutExtra(
                    Resources.GetString(Resource.String.UserDetailsIntentKey),
                    JsonConvert.SerializeObject(results)
                    );

                SetResult(Result.Ok, intent);
                OnBackPressed();
            })
            .DisposeWith(disposable);


            this.AddNewImageButton
            .Events()
            .Click.Subscribe(_ =>
            {
                var imageIntent = new Intent();
                imageIntent.SetType("image/*");
                imageIntent.SetAction(Intent.ActionGetContent);
                StartActivityForResult(
                    Intent.CreateChooser(imageIntent, "Select photo"), 0);
            });

            SupportActionBar?.SetDisplayHomeAsUpEnabled(true);
            SupportActionBar?.SetHomeButtonEnabled(true);
        }