Skip to content

Commit 669ad20

Browse files
committed
display attachments in messages which arrived after the conversation was loaded
1 parent 4e52a29 commit 669ad20

File tree

8 files changed

+103
-21
lines changed

8 files changed

+103
-21
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using libsignalservice;
2+
using Microsoft.Extensions.Logging;
3+
using Signal_Windows.Models;
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Linq;
7+
using System.Text;
8+
using System.Threading.Tasks;
9+
10+
namespace Signal_Windows.Lib.Models
11+
{
12+
public class SignalAttachmentContainer
13+
{
14+
public SignalAttachment Attachment;
15+
public int AttachmentIndex;
16+
public int MessageIndex;
17+
public SignalAttachmentContainer(SignalAttachment attachment, int attachmentIndex, int messageIndex)
18+
{
19+
Attachment = attachment;
20+
AttachmentIndex = attachmentIndex;
21+
MessageIndex = messageIndex;
22+
}
23+
}
24+
}

Signal-Windows.Lib/Models/SignalMessage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class SignalMessage
2121
public long ComposedTimestamp { get; set; }
2222
public uint ExpiresAt { get; set; }
2323
public uint AttachmentsCount { get; set; }
24-
public List<SignalAttachment> Attachments { get; set; }
24+
public List<SignalAttachment> Attachments { get; set; } = new List<SignalAttachment>();
2525
}
2626

2727
public enum SignalMessageType

Signal-Windows.Lib/Signal-Windows.Lib.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@
137137
<Compile Include="Migrations\SignalDB\SignalDBContextModelSnapshot.cs" />
138138
<Compile Include="Models\PhoneContact.cs" />
139139
<Compile Include="Models\SignalAttachment.cs" />
140+
<Compile Include="Models\SignalAttachmentContainer.cs" />
140141
<Compile Include="Models\SignalContact.cs" />
141142
<Compile Include="Models\SignalConversation.cs" />
142143
<Compile Include="Models\SignalEarlyReceipt.cs" />

Signal-Windows/Controls/Attachment.xaml.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using Windows.UI.Xaml.Data;
1919
using Windows.UI.Xaml.Input;
2020
using Windows.UI.Xaml.Media;
21+
using Windows.UI.Xaml.Media.Imaging;
2122
using Windows.UI.Xaml.Navigation;
2223

2324
// The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236
@@ -52,6 +53,12 @@ public Attachment()
5253
{
5354
this.InitializeComponent();
5455
DataContextChanged += Attachment_DataContextChanged;
56+
AttachmentImage.ImageFailed += AttachmentImage_ImageFailed;
57+
}
58+
59+
private void AttachmentImage_ImageFailed(object sender, ExceptionRoutedEventArgs e)
60+
{
61+
Logger.LogError("AttachmentImage_ImageFailed {0}", e.ErrorMessage);
5562
}
5663

5764
private void Attachment_DataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
@@ -87,5 +94,11 @@ private void AttachmentDownloadIcon_Tapped(object sender, TappedRoutedEventArgs
8794
"image/png",
8895
"image/gif"
8996
};
97+
98+
public bool HandleUpdate(SignalAttachment sa)
99+
{
100+
DataContext = sa;
101+
return Model.Status != SignalAttachmentStatus.Finished && Model.Status != SignalAttachmentStatus.Failed_Permanently;
102+
}
90103
}
91104
}

Signal-Windows/Controls/Conversation.xaml.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
using libsignalservice;
12
using libsignalservice.util;
3+
using Microsoft.Extensions.Logging;
24
using Signal_Windows.Lib;
5+
using Signal_Windows.Lib.Models;
36
using Signal_Windows.Models;
47
using Signal_Windows.Storage;
58
using Signal_Windows.ViewModels;
@@ -10,6 +13,7 @@
1013
using System.Diagnostics;
1114
using System.Threading.Tasks;
1215
using Windows.Foundation;
16+
using Windows.Storage;
1317
using Windows.UI.ViewManagement;
1418
using Windows.UI.Xaml;
1519
using Windows.UI.Xaml.Controls;
@@ -25,6 +29,7 @@ public sealed partial class Conversation : UserControl, INotifyPropertyChanged
2529
public event PropertyChangedEventHandler PropertyChanged;
2630
private bool SendingMessage = false;
2731
private Dictionary<long, SignalMessageContainer> OutgoingCache = new Dictionary<long, SignalMessageContainer>();
32+
private Dictionary<long, SignalAttachmentContainer> UnfinishedAttachmentsCache = new Dictionary<long, SignalAttachmentContainer>();
2833
private SignalConversation SignalConversation;
2934
public VirtualizedCollection Collection;
3035

@@ -150,6 +155,7 @@ public void Load(SignalConversation conversation)
150155
public void DisposeCurrentThread()
151156
{
152157
OutgoingCache.Clear();
158+
UnfinishedAttachmentsCache.Clear();
153159
}
154160

155161
public T FindElementByName<T>(FrameworkElement element, string sChildName) where T : FrameworkElement
@@ -195,6 +201,25 @@ public void UpdateMessageBox(SignalMessage updatedMessage)
195201
}
196202
}
197203

204+
public void UpdateAttachment(SignalAttachment sa)
205+
{
206+
if (UnfinishedAttachmentsCache.ContainsKey(sa.Id))
207+
{
208+
var a = UnfinishedAttachmentsCache[sa.Id];
209+
var messageItem = (ListViewItem)ConversationItemsControl.ContainerFromIndex(Collection.GetVirtualIndex(a.MessageIndex));
210+
if (messageItem != null)
211+
{
212+
var message = FindElementByName<Message>(messageItem, "ListBoxItemContent");
213+
var attachment = FindElementByName<Attachment>(message, "Attachment");
214+
bool retain = attachment.HandleUpdate(sa);
215+
if (!retain)
216+
{
217+
OutgoingCache.Remove(sa.Id);
218+
}
219+
}
220+
}
221+
}
222+
198223
public void Append(SignalMessageContainer sm)
199224
{
200225
var sourcePanel = (ItemsStackPanel)ConversationItemsControl.ItemsPanelRoot;
@@ -211,6 +236,11 @@ public void AddToOutgoingMessagesCache(SignalMessageContainer m)
211236
{
212237
OutgoingCache[m.Message.Id] = m;
213238
}
239+
240+
public void AddToUnfinishedAttachmentsCache(SignalAttachmentContainer m)
241+
{
242+
UnfinishedAttachmentsCache[m.Attachment.Id] = m;
243+
}
214244

215245
private async void TextBox_KeyDown(object sender, KeyRoutedEventArgs e)
216246
{

Signal-Windows/Controls/Message.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
</UserControl.Resources>
1717
<Border Name="MessageBoxBorder" BorderBrush="#00000000" BorderThickness="1,1,1,1" CornerRadius="4,4,4,4" Padding="10 5 10 5" Margin="4">
1818
<ItemsControl>
19-
<local:Attachment DataContext="{x:Bind Attachment, Mode=OneWay}" Visibility="{x:Bind HasAttachment, Mode=OneWay}"/>
19+
<local:Attachment Name="Attachment" DataContext="{x:Bind Attachment, Mode=OneWay}" Visibility="{x:Bind HasAttachment, Mode=OneWay}"/>
2020
<TextBlock Name="MessageAuthor" FontWeight="Bold" />
2121
<TextBlock Name="MessageContentTextBlock" TextWrapping="Wrap" MaxWidth="300" IsTextSelectionEnabled="True" FontSize="14" Foreground="Black" HorizontalAlignment="Left" />
2222
<Grid Name="FooterPanel" MaxWidth="300">

Signal-Windows/Controls/VirtualizedMessagesCollection.cs

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using libsignalservice;
33
using Microsoft.Extensions.Logging;
44
using Signal_Windows.Lib;
5+
using Signal_Windows.Lib.Models;
56
using Signal_Windows.Models;
67
using Signal_Windows.Storage;
78
using System;
@@ -86,14 +87,7 @@ private SignalMessageContainer Get(int index)
8687
if (!Cache.ContainsKey(pageIndex))
8788
{
8889
Logger.LogTrace("Get() cache miss ({0})", pageIndex);
89-
Cache[pageIndex] = App.Handle.GetMessages(Conversation, pageIndex * PAGE_SIZE, PAGE_SIZE);
90-
foreach (var msg in Cache[pageIndex])
91-
{
92-
if (msg.Message.Author == null)
93-
{
94-
ConversationView.AddToOutgoingMessagesCache(msg);
95-
}
96-
}
90+
LoadPage(pageIndex);
9791
}
9892
var page = Cache[pageIndex];
9993
var item = page[inpageIndex];
@@ -144,24 +138,40 @@ public int Add(object value, bool hideUnreadMarker)
144138
Logger.LogTrace("Add() Id={0} Index={1} PageIndex={2} InpageIndex={3}", message.Message.Id, message.Index, pageIndex, inpageIndex);
145139
if (!Cache.ContainsKey(pageIndex))
146140
{
147-
Cache[pageIndex] = App.Handle.GetMessages(Conversation, pageIndex * PAGE_SIZE, PAGE_SIZE);
148-
foreach (var msg in Cache[pageIndex])
149-
{
150-
if (msg.Message.Author == null)
151-
{
152-
ConversationView.AddToOutgoingMessagesCache(msg);
153-
}
154-
}
141+
LoadPage(pageIndex);
155142
}
156143
Cache[pageIndex].Insert(inpageIndex, message);
157144
int virtualIndex = GetVirtualIndex(message.Index);
158145
Logger.LogTrace("Add() Index={0} VirtualIndex={1}", message.Index, virtualIndex);
159146
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, message, virtualIndex));
160-
if (message.Message.Author == null)
147+
FillUpdateCaches(message);
148+
return message.Index;
149+
}
150+
151+
private void LoadPage(int pageIndex)
152+
{
153+
Cache[pageIndex] = App.Handle.GetMessages(Conversation, pageIndex * PAGE_SIZE, PAGE_SIZE);
154+
foreach (var msg in Cache[pageIndex])
161155
{
162-
ConversationView.AddToOutgoingMessagesCache(message);
156+
FillUpdateCaches(msg);
157+
}
158+
}
159+
160+
private void FillUpdateCaches(SignalMessageContainer msg)
161+
{
162+
if (msg.Message.Author == null)
163+
{
164+
ConversationView.AddToOutgoingMessagesCache(msg);
165+
}
166+
int attachmentIndex = 0;
167+
foreach (var attachment in msg.Message.Attachments)
168+
{
169+
if (attachment.Status != SignalAttachmentStatus.Finished && attachment.Status != SignalAttachmentStatus.Failed_Permanently)
170+
{
171+
ConversationView.AddToUnfinishedAttachmentsCache(new SignalAttachmentContainer(attachment, attachmentIndex, msg.Index));
172+
}
173+
attachmentIndex++;
163174
}
164-
return message.Index;
165175
}
166176

167177
public void Clear()

Signal-Windows/ViewModels/MainPageViewModel.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,10 @@ public void ReplaceConversationList(List<SignalConversation> conversations)
291291
public void HandleAttachmentStatusChanged(SignalAttachment sa)
292292
{
293293
Logger.LogInformation("MPVM received attachment status update! {0}", sa.Status);
294+
if (SelectedThread != null && SelectedThread.ThreadId == sa.Message.ThreadId)
295+
{
296+
View.Thread.UpdateAttachment(sa);
297+
}
294298
}
295299
#endregion
296300
}

0 commit comments

Comments
 (0)