private async Task UpdateItemsAsync(int offset, int maxId, int count, bool forceClear = true) { //var lastDate = 0; //var lastMsgId = 0; //var lastPeer = (TLInputPeerBase)new TLInputPeerEmpty(); //var last = this.LastOrDefault(); //if (last != null) //{ // lastDate = last.TopMessageItem.Date; // lastMsgId = last.TopMessage; // if (last.Peer is TLPeerUser) // { // lastPeer = new TLInputPeerUser { UserId = last.Peer.Id }; // } // else if (last.Peer is TLPeerChat) // { // lastPeer = new TLInputPeerChat { ChatId = last.Peer.Id }; // } // else if (last.Peer is TLPeerChannel) // { // lastPeer = new TLInputPeerChannel { ChannelId = last.Peer.Id }; // } //} var response = await _protoService.GetDialogsAsync(0, 0, new TLInputPeerEmpty(), count); if (response.IsSucceeded) { var result = response.Result; var vector = new TLVector <TLDialog>(result.Dialogs.Count); foreach (var dialog in result.Dialogs.OrderBy(x => x.GetDateIndex())) { vector.Add(dialog); } //if (!forceClear) forceClear = Count == 0; result.Dialogs = vector; await Execute.BeginOnUIThreadAsync(() => { var needUpdate = false; var itemsCount = Count; var i = 0; var k = 0; while (i < result.Dialogs.Count && k < Count) { if (itemsCount - 1 < i || result.Dialogs[i] != this[k]) { var dialog = this[k] as TLDialog; if (dialog != null) { var serviceMessage = dialog.TopMessageItem as TLMessageService; //if (serviceMessage != null && serviceMessage.Action is TLMessageActionContactRegistered) //{ // i--; // goto IL_AE; //} } //var encryptedDialog = this[k] as TLEncryptedDialog; //if (encryptedDialog == null) //{ // needUpdate = true; // break; //} i--; } IL_AE: i++; k++; } //this.Status = ((this.Items.get_Count() == 0 && result.Dialogs.Count == 0) ? string.Format("{0}", AppResources.NoDialogsHere) : string.Empty); if (needUpdate || forceClear) { //var encryptedDialogs = this.OfType<TLEncryptedDialog>(); var startIndex = 0; //foreach (var encryptedDialog in encryptedDialogs) //{ // for (int j = startIndex; j < result.Dialogs.Count; j++) // { // if (encryptedDialog.GetDateIndex() > result.Dialogs[j].GetDateIndex()) // { // result.Dialogs.Insert(j, encryptedDialog); // startIndex = j; // break; // } // } //} //var broadcastDialogs = Enumerable.OfType<TLBroadcastDialog>(this); startIndex = 0; //foreach (var broadcastDialog in broadcastDialogs) //{ // for (int j = startIndex; j < result.Dialogs.Count; j++) // { // if (broadcastDialog.GetDateIndex() > result.Dialogs[j].GetDateIndex()) // { // result.Dialogs.Insert(j, broadcastDialog); // startIndex = j; // break; // } // } //} if (forceClear) { Clear(); } foreach (var dialog in result.Dialogs) { if (forceClear) { Insert(0, dialog); } else { MoveOrInsert(dialog); } } //HasMoreItems = Count > 0; } else { //HasMoreItems = Count > 0; } //this.IsWorking = false; }); } //}, delegate (TLRPCError error) //{ // Execute.BeginOnUIThread(delegate // { // HasMoreItems = Count > 0; // }); //}); }