public void HandleUpdatedStateFromNetwork(Player state)
 {
     this.InvokeOnMainThread(() => {
         this.state = state;
         this.VolumeSlider.SetValue(state.Volume.Value, true);
         if(state.Current != null) {
             this.ArtistLabel.Text = state.Current.Artist;
             this.TitleLabel.Text = state.Current.Title;
             this.SeekSlider.MaxValue = state.Current.Length.Value;
             if(state.PlayPosition.HasValue) {
                 this.SeekSlider.SetValue (state.PlayPosition.Value, true);
             } else {
                 this.SeekSlider.Value = 0;
             }
         } else {
             this.ArtistLabel.Text = "";
             this.TitleLabel.Text = "";
             this.SeekSlider.SetValue (0, false);
         }
         if(state.Playing == 1) {
             this.PlayPauseButton.SetTitle("Pause", UIControlState.Normal);
         } else {
             this.PlayPauseButton.SetTitle ("Play", UIControlState.Normal);
         }
     });
 }
        protected void HandleUpdatedStateFromNetwork(Player state)
        {
            Log.WriteLine(Android.Util.LogPriority.Info, c, String.Format ("SUCCESS, CURRENTLY {0}: {1} " , state.Playing ==  1 ? "Playing" : "Stopped", state.Current.Title));
            RunOnUiThread(() => {
                currentState = state;
                preventSeekBarUpdates = true;
                titleTextView.SetText (state.Current.Title, TextView.BufferType.Normal);
                artistTextView.SetText (state.Current.Artist, TextView.BufferType.Normal);
                if(state.Current != null) {
                    if (state.Current.Rating.HasValue) {
                        ratingBar.Rating = state.Current.Rating.Value / (float)20;
                    }

                    songSeekBar.Max = (int)state.Current.Length;
                    songSeekBar.Progress = (int)state.PlayPosition;
                }
                volumeSeekBar.Progress = (int)state.Volume.Value; // volume always has a value

                playButton.SetImageResource(state.Playing == 1 ? Resource.Drawable.media_pause : Resource.Drawable.media_play);
                preventSeekBarUpdates = false;
            });
        }
 protected void PushNewPlayerState(Player state)
 {
     gmb.PushNewPlayerState(state).ContinueWith ((playerResult) => {
         if(playerResult.IsFaulted || playerResult.IsCanceled) {
             Log.WriteLine(LogPriority.Error, c, "Problem pushing player state: " + playerResult.Exception);
             // TODO: reflect error in UI
         } else {
             HandleUpdatedStateFromNetwork(playerResult.Result);
         }
     });
 }
        public Task<Player> PushNewPlayerState(Player state)
        {
            var req = new RestRequest("/player", Method.POST);

            var json = JsonConvert.SerializeObject(state, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new UnderscorePropertyNamesResolver(), NullValueHandling = NullValueHandling.Ignore });
            req.AddParameter("text/json", json, ParameterType.RequestBody);

            Logging.Debug (c, "Posting updated player state...");
            return ExecuteHttpTaskThatReturnsPlayerState(req, "pushing player state");
        }
partial         void PlayPauseClicked(NSObject sender)
        {
            if(state != null) {
                var newState = new Player() { Playing = state.Playing == 1 ? 0 : 1};
                this.gmb.PushNewPlayerState(newState).ContinueWith(HandleUpdatedStateFromNetworkCompletedTask);
            }
        }