public PlusOneInfo(PlatformClient client, ActivityInfo target) : base(client) { _lastUpdateMember = DateTime.MinValue; _targetId = "buzz:" + target.Id; _activity = target; }
//ActivityInfo初期化はこちらの特殊仕様を使う。 //これはActivityInfo用のCommentInfo、CommentInfo用のActivityInfoという無限ループ回避用処置 internal CommentInfo( PlatformClient client, CommentData commentData, ActivityData activityData, ActivityInfo activityInfo) : base(client) { _commentData = commentData; _activityData = activityData; _owner = commentData.Owner != null ? client.People.InternalGetAndUpdateProfile(commentData.Owner) : null; _parentActivity = activityInfo; _talkgadgetBindObjs = new Dictionary<EventHandler, IDisposable>(); }
async void CoreInfo_Refreshed(ActivityInfo newValue) { await CoreInfo.UpdateGetActivityAsync(false, ActivityUpdateApiFlag.GetActivities).ConfigureAwait(false); OnUpdated(new EventArgs()); }
public Activity(ActivityInfo target) { Comments = new ObservableCollection<Comment>(); CoreInfo = target; Initialize(); }
async void Recieved_Activity(ActivityInfo newInfo) { try { await _syncer.WaitAsync().ConfigureAwait(false); if (_isDisposed) return; //一時停止している場合は外から見えない領域でストリームを更新 //するために_activitiesではなく_tmpActivitiesが更新される var innerActiveActivities = _isPause ? _hiddenActivities : _activities; var item = innerActiveActivities.FirstOrDefault(activity => activity.CoreInfo.Id == newInfo.Id); var existUpdate = false; switch (newInfo.PostStatus) { case PostStatusType.First: case PostStatusType.Edited: //itemがnullの場合は更新する。nullでない場合はすでにある値を更新する。 //しかし更新はActivityオブジェクト自体が行うため、Streamでは行わない if (item == null) { existUpdate = true; item = new Activity(newInfo); innerActiveActivities.Insert(0, item); if (innerActiveActivities.Count > MAX_ACTIVITIES_COUNT) { var activity = innerActiveActivities[MAX_ACTIVITIES_COUNT]; //一時停止モード時の古いActivityのDispose()は表示されているActivityの更新を誤停止する可能性があるため、表示されているActivityと照合してDispose()する。 //この時、_isPauseはスレッドロック関係でinnerActiveActivitiesの状態と連動する保証がない。そのため、以下の条件文となっている。 if (innerActiveActivities == _hiddenActivities && _activities.Contains(activity) == false) innerActiveActivities[MAX_ACTIVITIES_COUNT].Dispose(); innerActiveActivities.RemoveAt(MAX_ACTIVITIES_COUNT); } //Activate()でも内部的にitem.CoreInfoの更新が発生しうる。 //そのため、すべての処理が終わってから呼び出す事で予想外の状態遷移を避ける。 await item.Activate(); } break; case PostStatusType.Removed: innerActiveActivities.Remove(item); existUpdate = true; break; } if (_isPause && existUpdate) { Status = StreamStateType.Paused; ChangedActivityCount++; } } finally { _syncer.Release(); } }