protected internal void OnBubbleUpdated(VisualBubble bubble, BubbleGroup group) { if (Bubbles.Count >= BubblesCapSize) { Bubbles.RemoveAt(0); } var addedToEnd = false; var unreadIndicatorGuid = BubbleGroupSettingsManager.GetUnreadIndicatorGuid(this); for (int i = Bubbles.Count - 1; i >= 0; i--) { var nBubble = Bubbles[i]; var unreadIndicatorIndex = -1; if (unreadIndicatorGuid != null && unreadIndicatorGuid == nBubble.ID) { unreadIndicatorIndex = i; } if (nBubble.Time <= bubble.Time) { // adding it to the end, we can do a simple contract if (i == Bubbles.Count - 1) { addedToEnd = true; Bubbles.Add(bubble); if (bubble.Direction == Bubble.BubbleDirection.Incoming) { BubbleGroupSettingsManager.SetUnread(this, true); } } // inserting, do a full contract else { Bubbles.Insert(i + 1, bubble); } if (i >= unreadIndicatorIndex && bubble.Direction == Bubble.BubbleDirection.Outgoing) { BubbleGroupSettingsManager.SetUnreadIndicatorGuid(this, bubble.ID, false); } break; } // could not find a valid place to insert, then skip insertion. if (i == 0) { return; } } if (SendingGroup != group && addedToEnd) { SendingGroup = group; BubbleGroupEvents.RaiseSendingServiceChange(this); } RaiseBubbleInserted(bubble); }
public void InsertByTime(VisualBubble b) { if (Bubbles.Count > BubblesCapSize) { Bubbles.RemoveAt(0); } for (int i = Bubbles.Count - 1; i >= 0; i--) { var nBubble = Bubbles[i]; if (nBubble.Time <= b.Time) { // adding it to the end, we can do a simple contract if (i == Bubbles.Count - 1) { Bubbles.Add(b); if (b.Direction == Bubble.BubbleDirection.Incoming) { BubbleGroupSettingsManager.SetUnread(this, true); } } // inserting, do a full contract else { Bubbles.Insert(i + 1, b); } break; } // could not find a valid place to insert, then skip insertion. if (i == 0) { return; } } if (Unified == null) { _bubblesInsertedCount++; if (_bubblesInsertedCount % 100 == 0) { if (BubbleGroupSync.SupportsSyncAndIsRunning(this)) { Action doSync = async() => { using (Platform.AquireWakeLock("DisaSync")) { await Utils.Delay(1000); await BubbleGroupSync.Sync(this, true); } }; doSync(); } } } RaiseBubbleInserted(b); RaiseUnifiedBubblesUpdatedIfUnified(b); }
public void UnloadFullUnifiedLoad() { UnifiedGroupLoaded = false; var lastBubble = Bubbles.Last(); Bubbles.Clear(); Bubbles.Add(lastBubble); }
public void UnloadFullLoad() { PartiallyLoaded = true; var lastBubble = Bubbles.Last(); Bubbles.Clear(); Bubbles.Add(lastBubble); }
public void InsertByTime(VisualBubble b) { if (Bubbles.Count >= BubblesCapSize) { Bubbles.RemoveAt(0); } if (!(this is ComposeBubbleGroup)) { var unreadIndicatorGuid = BubbleGroupSettingsManager.GetUnreadIndicatorGuid(this); for (int i = Bubbles.Count - 1; i >= 0; i--) { var nBubble = Bubbles[i]; var unreadIndicatorIndex = -1; if (unreadIndicatorGuid != null && unreadIndicatorGuid == nBubble.ID) { unreadIndicatorIndex = i; } // IMPORTANT: Our Time field is specified in seconds, however scenarios are appearing // (e.g., bots) where messages are sent in on the same second but still require // proper ordering. In this case, Services may set a flag specifying a fallback // to the ID assigned by the Service (e.g. Telegram). if ((nBubble.Time == b.Time) && (nBubble.IsServiceIdSequence && b.IsServiceIdSequence)) { if (string.Compare( strA: nBubble.IdService, strB: b.IdService, ignoreCase: false, culture: CultureInfo.InvariantCulture) < 0) { // // Incoming bubble must be placed AFTER current bubble we are evaluating // if (i == Bubbles.Count - 1) { Bubbles.Add(b); if (b.Direction == Bubble.BubbleDirection.Incoming) { BubbleGroupSettingsManager.SetUnread(this, true); } } else { Bubbles.Insert(i + 1, b); if (i >= unreadIndicatorIndex && b.Direction == Bubble.BubbleDirection.Outgoing) { BubbleGroupSettingsManager.SetUnreadIndicatorGuid(this, b.ID, false); } } } else { // // Incoming bubble must be placed BEFORE current bubble we are evaluating // Bubbles.Insert(i, b); if (i >= unreadIndicatorIndex && b.Direction == Bubble.BubbleDirection.Outgoing) { BubbleGroupSettingsManager.SetUnreadIndicatorGuid(this, b.ID, false); } } break; } // OK, simpler scenario, incoming bubble must be placed AFTER current bubble we are evaluating else if (nBubble.Time <= b.Time) { // adding it to the end, we can do a simple contract if (i == Bubbles.Count - 1) { Bubbles.Add(b); if (b.Direction == Bubble.BubbleDirection.Incoming) { BubbleGroupSettingsManager.SetUnread(this, true); } } // inserting, do a full contract else { Bubbles.Insert(i + 1, b); } if (i >= unreadIndicatorIndex && b.Direction == Bubble.BubbleDirection.Outgoing) { BubbleGroupSettingsManager.SetUnreadIndicatorGuid(this, b.ID, false); } break; } // could not find a valid place to insert, then skip insertion. if (i == 0) { return; } } } if (Unified == null) { _bubblesInsertedCount++; if (_bubblesInsertedCount % 100 == 0) { if (BubbleGroupSync.SupportsSyncAndIsRunning(this)) { Action doSync = async() => { using (Platform.AquireWakeLock("DisaSync")) { await Utils.Delay(1000); await BubbleGroupSync.Sync(this, true); } }; doSync(); } } } RaiseBubbleInserted(b); RaiseUnifiedBubblesUpdatedIfUnified(b); }