Skip to content

Commit 8f0983b

Browse files
committed
Repair identity key change messages
1 parent 9e4019a commit 8f0983b

File tree

5 files changed

+55
-36
lines changed

5 files changed

+55
-36
lines changed

Signal-Windows/Controls/Conversation.xaml.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@
2525

2626
namespace Signal_Windows.Controls
2727
{
28+
public interface IMessageView
29+
{
30+
SignalMessage Model { get; set; }
31+
void HandleUpdate(SignalMessage m);
32+
FrameworkElement AsFrameworkElement();
33+
}
34+
2835
public sealed partial class Conversation : UserControl, INotifyPropertyChanged
2936
{
3037
private readonly ILogger Logger = LibsignalLogging.CreateLogger<Conversation>();
@@ -196,7 +203,7 @@ public void Load(SignalConversation conversation)
196203
*/
197204
ConversationItemsControl.ItemsSource = new List<object>();
198205
UpdateLayout();
199-
Collection = new VirtualizedCollection(conversation, this);
206+
Collection = new VirtualizedCollection(conversation);
200207
ConversationItemsControl.ItemsSource = Collection;
201208
UpdateLayout();
202209
InputTextBox.IsEnabled = conversation.CanReceive;
@@ -235,10 +242,10 @@ public void UpdateMessageBox(SignalMessage updatedMessage)
235242
{
236243
if (Collection != null)
237244
{
238-
Message m = Collection.GetMessageByDbId(updatedMessage.Id);
245+
IMessageView m = Collection.GetMessageByDbId(updatedMessage.Id);
239246
if (m != null)
240247
{
241-
var attachment = FindElementByName<Attachment>(m, "Attachment");
248+
var attachment = FindElementByName<Attachment>(m.AsFrameworkElement(), "Attachment");
242249
m.HandleUpdate(updatedMessage);
243250
}
244251
}
@@ -248,10 +255,10 @@ public void UpdateAttachment(SignalAttachment sa)
248255
{
249256
if (Collection != null)
250257
{
251-
Message m = Collection.GetMessageByDbId(sa.Message.Id);
258+
IMessageView m = Collection.GetMessageByDbId(sa.Message.Id);
252259
if (m != null)
253260
{
254-
var attachment = FindElementByName<Attachment>(m, "Attachment");
261+
var attachment = FindElementByName<Attachment>(m.AsFrameworkElement(), "Attachment");
255262
attachment.HandleUpdate(sa);
256263
}
257264
}

Signal-Windows/Controls/IdentityKeyChangeMessage.xaml.cs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,35 +19,47 @@
1919

2020
namespace Signal_Windows.Controls
2121
{
22-
public sealed partial class IdentityKeyChangeMessage : UserControl
22+
public sealed partial class IdentityKeyChangeMessage : UserControl, IMessageView
2323
{
24-
public IdentityKeyChangeMessage()
24+
public IdentityKeyChangeMessage(SignalMessage model)
2525
{
2626
this.InitializeComponent();
27-
DataContextChanged += IdentityKeyChangeMessage_DataContextChanged;
27+
this.DataContextChanged += IdentityKeyChangeMessage_DataContextChanged;
28+
Model = model;
2829
}
29-
public Message Model
30+
31+
public SignalMessage Model
3032
{
3133
get
3234
{
33-
return this.DataContext as Message;
35+
return this.DataContext as SignalMessage;
3436
}
3537
set
3638
{
3739
this.DataContext = value;
3840
}
3941
}
4042

43+
public void HandleUpdate(SignalMessage m)
44+
{
45+
throw new NotImplementedException();
46+
}
47+
4148
private void IdentityKeyChangeMessage_DataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
4249
{
4350
if (Model != null)
4451
{
45-
MessageTextBlock.Text = Model.Model.Content.Content;
52+
MessageTextBlock.Text = Model.Content.Content;
4653
}
4754
else
4855
{
4956
MessageTextBlock.Text = "null";
5057
}
5158
}
59+
60+
public FrameworkElement AsFrameworkElement()
61+
{
62+
return this;
63+
}
5264
}
5365
}

Signal-Windows/Controls/Message.xaml.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
namespace Signal_Windows.Controls
1717
{
18-
public sealed partial class Message : UserControl, INotifyPropertyChanged
18+
public sealed partial class Message : UserControl, IMessageView, INotifyPropertyChanged
1919
{
2020
// This is taken from https://gist.github.com/gruber/8891611
2121
// This is public domain: https://daringfireball.net/2010/07/improved_regex_for_matching_urls
@@ -50,10 +50,11 @@ public SignalAttachment Attachment
5050
set { attachment = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Attachment))); }
5151
}
5252

53-
public Message()
53+
public Message(SignalMessage model)
5454
{
5555
this.InitializeComponent();
5656
this.DataContextChanged += MessageBox_DataContextChanged;
57+
Model = model;
5758
}
5859

5960
private void UpdateUI()
@@ -198,11 +199,15 @@ private void ResendTextBlock_Tapped(object sender, Windows.UI.Xaml.Input.TappedR
198199
App.Handle.ResendMessage(Model);
199200
}
200201

201-
internal bool HandleUpdate(SignalMessage updatedMessage)
202+
public void HandleUpdate(SignalMessage m)
202203
{
203-
Model.Status = updatedMessage.Status;
204+
Model.Status = m.Status;
204205
UpdateUI();
205-
return updatedMessage.Status != SignalMessageStatus.Received;
206+
}
207+
208+
public FrameworkElement AsFrameworkElement()
209+
{
210+
return this;
206211
}
207212
}
208213
}

Signal-Windows/Controls/VirtualizedMessagesCollection.cs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,15 @@ public class VirtualizedCollection : IList, INotifyCollectionChanged
2626
private readonly ILogger Logger = LibsignalLogging.CreateLogger<VirtualizedCollection>();
2727
private const int PAGE_SIZE = 50;
2828
public event NotifyCollectionChangedEventHandler CollectionChanged;
29-
private Dictionary<int, IList<Message>> MessageStorage = new Dictionary<int, IList<Message>>();
30-
private Dictionary<long, Message> DbIdToMessageMap = new Dictionary<long, Message>();
29+
private Dictionary<int, IList<IMessageView>> MessageStorage = new Dictionary<int, IList<IMessageView>>();
30+
private Dictionary<long, IMessageView> DbIdToMessageMap = new Dictionary<long, IMessageView>();
3131
public SignalConversation Conversation;
32-
Conversation ConversationView;
3332
private UnreadMarker UnreadMarker = new UnreadMarker();
3433
public int UnreadMarkerIndex = -1;
3534

36-
public VirtualizedCollection(SignalConversation c, Conversation conversationView)
35+
public VirtualizedCollection(SignalConversation c)
3736
{
3837
Conversation = c;
39-
ConversationView = conversationView;
4038
if (Conversation.LastSeenMessageIndex > 0 && Conversation.LastSeenMessageIndex < Conversation.MessagesCount )
4139
{
4240
UnreadMarkerIndex = (int) Conversation.LastSeenMessageIndex;
@@ -48,9 +46,9 @@ public VirtualizedCollection(SignalConversation c, Conversation conversationView
4846
}
4947
}
5048

51-
public Message GetMessageByDbId(long dbid)
49+
public IMessageView GetMessageByDbId(long dbid)
5250
{
53-
DbIdToMessageMap.TryGetValue(dbid, out Message m);
51+
DbIdToMessageMap.TryGetValue(dbid, out IMessageView m);
5452
return m;
5553
}
5654

@@ -87,7 +85,7 @@ public object this[int index]
8785
set => throw new NotImplementedException();
8886
}
8987

90-
private Message Get(int index)
88+
private IMessageView Get(int index)
9189
{
9290
int inpageIndex = index % PAGE_SIZE;
9391
int pageIndex = GetPageIndex(index);
@@ -139,7 +137,7 @@ public int Add(object value, bool hideUnreadMarker)
139137
UnreadMarkerIndex = -1;
140138
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, UnreadMarker, old));
141139
}
142-
var message = value as Message;
140+
var message = value as IMessageView;
143141
var inConversationIndex = (int)Conversation.MessagesCount - 1;
144142
int inpageIndex = inConversationIndex % PAGE_SIZE;
145143
int pageIndex = GetPageIndex(inConversationIndex);
@@ -160,16 +158,19 @@ public int Add(object value, bool hideUnreadMarker)
160158
private void LoadPage(int pageIndex)
161159
{
162160
MessageStorage[pageIndex] = App.Handle.GetMessages(Conversation, pageIndex * PAGE_SIZE, PAGE_SIZE)
163-
.Select(m => new Message() {
164-
Model = m
161+
.Select(m =>
162+
{
163+
if (m.Type == SignalMessageType.IdentityKeyChange)
164+
return new IdentityKeyChangeMessage(m) as IMessageView;
165+
return new Message(m) as IMessageView;
165166
}).ToList();
166167
foreach (var msg in MessageStorage[pageIndex])
167168
{
168169
AddMessageToMap(msg);
169170
}
170171
}
171172

172-
private void AddMessageToMap(Message msg)
173+
private void AddMessageToMap(IMessageView msg)
173174
{
174175
DbIdToMessageMap[msg.Model.Id] = msg;
175176
}

Signal-Windows/ViewModels/MainPageViewModel.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -221,10 +221,7 @@ public void AddOrUpdateConversation(SignalConversation conversation, SignalMessa
221221
{
222222
if (updateMessage != null)
223223
{
224-
var container = new Message()
225-
{
226-
Model = updateMessage //updateMessage, (int)SelectedThread.MessagesCount - 1
227-
};
224+
var container = new Message(updateMessage);
228225
View.Thread.Append(container);
229226
View.Reload();
230227
}
@@ -254,10 +251,7 @@ public AppendResult HandleMessage(SignalMessage message, SignalConversation conv
254251
localConversation.UpdateUI();
255252
if (SelectedThread != null && SelectedThread == localConversation)
256253
{
257-
var container = new Message()
258-
{
259-
Model = message
260-
};//message, (int)SelectedThread.MessagesCount - 1
254+
var container = new Message(message);
261255
result = View.Thread.Append(container);
262256
}
263257
RepositionConversation(localConversation);

0 commit comments

Comments
 (0)