From 0788e96db52f4aeb5dbddf41c64cbc1901189eb2 Mon Sep 17 00:00:00 2001
From: Nicolas Jager <nicolas.jager@savoirfairelinux.com>
Date: Fri, 26 Aug 2016 15:41:06 -0400
Subject: [PATCH] text message : add visual new message notification

- adds a red buble with the number of unread messages.

Change-Id: I8c40df3e0421fba02444e5092a8975ce27ce989c
Tuleap: #961
---
 Contact.cpp           | 19 +++++++++++++++++++
 Contact.h             | 23 ++++++++++++++++++++++-
 ContactsViewModel.cpp |  6 ++++++
 ContactsViewModel.h   |  5 +++++
 SmartPanel.xaml       |  4 ++--
 SmartPanel.xaml.cpp   |  5 +++++
 6 files changed, 59 insertions(+), 3 deletions(-)

diff --git a/Contact.cpp b/Contact.cpp
index 1fb7032..b49cbbd 100644
--- a/Contact.cpp
+++ b/Contact.cpp
@@ -26,6 +26,7 @@ using namespace Windows::Data::Json;
 using namespace Windows::UI::Core;
 
 using namespace RingClientUWP;
+using namespace ViewModel;
 
 Contact::Contact(String^ name,
                  String^ ringID)
@@ -33,6 +34,24 @@ Contact::Contact(String^ name,
     name_ = name;
     ringID_ = ringID;
     conversation_ = ref new Conversation();
+    notificationNewMessage_ = Windows::UI::Xaml::Visibility::Collapsed;
+    unreadMessages_ = 0; // not saved on disk yet (TO DO)
+
+    /* connect to delegate */
+    ContactsViewModel::instance->notifyNewConversationMessage += ref new NotifyNewConversationMessage([&] () {
+        notificationNewMessage = Windows::UI::Xaml::Visibility::Visible;
+        unreadMessages_++;
+        PropertyChanged(this, ref new PropertyChangedEventArgs("unreadMessages"));
+    });
+    ContactsViewModel::instance->newContactSelected += ref new RingClientUWP::NewContactSelected([&]() {
+        if (ContactsViewModel::instance->selectedContact == this) {
+            PropertyChanged(this, ref new PropertyChangedEventArgs("unreadMessages"));
+            notificationNewMessage = Windows::UI::Xaml::Visibility::Collapsed;
+            unreadMessages_ = 0;
+        }
+    });
+
+
 }
 
 void
diff --git a/Contact.h b/Contact.h
index eb1ff21..7e84d87 100644
--- a/Contact.h
+++ b/Contact.h
@@ -19,6 +19,7 @@
 **************************************************************************/
 using namespace Platform;
 using namespace Windows::Data::Json;
+using namespace Windows::UI::Xaml;
 using namespace Windows::UI::Xaml::Data;
 
 /* strings required by Windows::Data::Json. Defined here on puprose */
@@ -36,7 +37,6 @@ public:
     Contact(String^ name, String^ ringID);
     JsonObject^ ToJsonObject();
 
-
     virtual event PropertyChangedEventHandler^ PropertyChanged;
 
     property String^ name_;
@@ -48,12 +48,33 @@ public:
             return conversation_;
         }
     }
+    property Visibility notificationNewMessage
+    {
+        Visibility get()
+        {
+            return notificationNewMessage_;
+        }
+        void set(Visibility visibility)
+        {
+            notificationNewMessage_ = visibility;
+            PropertyChanged(this, ref new PropertyChangedEventArgs("notificationNewMessage"));
+        }
+    }
+    property String^ unreadMessages
+    {
+        String^ get()
+        {
+            return unreadMessages_.ToString();
+        }
+    }
 
 protected:
     void NotifyPropertyChanged(String^ propertyName);
 
 private:
     Conversation^ conversation_;
+    Visibility notificationNewMessage_;
+    unsigned int unreadMessages_;
 
 };
 }
diff --git a/ContactsViewModel.cpp b/ContactsViewModel.cpp
index 80799ff..0aa9aed 100644
--- a/ContactsViewModel.cpp
+++ b/ContactsViewModel.cpp
@@ -43,11 +43,17 @@ ContactsViewModel::ContactsViewModel()
         if (contact == nullptr)
             contact = addNewContact(from, from); // contact checked inside addNewContact.
 
+        bool isNotSelected = (contact != ContactsViewModel::instance->selectedContact) ? true : false;
+
         if (contact == nullptr) {
             ERR_("contact not handled!");
             return;
         }
 
+        screenConversationMessage("" /* accountId not used yet at this stage */, from, payload);
+
+        if (contact->ringID_ == from && isNotSelected)
+            notifyNewConversationMessage();
     });
 
 }
diff --git a/ContactsViewModel.h b/ContactsViewModel.h
index 29dfec8..b4de756 100644
--- a/ContactsViewModel.h
+++ b/ContactsViewModel.h
@@ -25,8 +25,11 @@ using namespace Concurrency;
 namespace RingClientUWP
 {
 
+/* delegates */
 delegate void NewContactSelected();
 delegate void NoContactSelected();
+delegate void ScreenConversationMessage(String^ accountId, String^ from, String^ payload);
+delegate void NotifyNewConversationMessage();
 
 namespace ViewModel {
 public ref class ContactsViewModel sealed
@@ -79,6 +82,8 @@ internal:
     /* events */
     event NewContactSelected^ newContactSelected;
     event NoContactSelected^ noContactSelected;
+    event ScreenConversationMessage^ screenConversationMessage;
+    event NotifyNewConversationMessage^ notifyNewConversationMessage;
 
 private:
     ContactsViewModel(); // singleton
diff --git a/SmartPanel.xaml b/SmartPanel.xaml
index 9e5fb61..cef2e26 100644
--- a/SmartPanel.xaml
+++ b/SmartPanel.xaml
@@ -58,9 +58,9 @@
                         </Border.RenderTransform>
                     </Border>
                     <Border x:Name="_visualNotificationNewMessage_"
-                            Visibility="Collapsed"
+                            Visibility="{x:Bind notificationNewMessage, Mode=OneWay}"
                             Style="{StaticResource BorderStyle2}">
-                        <TextBlock Text="0"
+                        <TextBlock Text="{x:Bind unreadMessages, Mode=OneWay}"
                                    Style="{StaticResource TextStyle3}"/>
                         <Border.RenderTransform>
                             <TranslateTransform X="-17" Y="-14"/>
diff --git a/SmartPanel.xaml.cpp b/SmartPanel.xaml.cpp
index d9e0dd5..4c340ef 100644
--- a/SmartPanel.xaml.cpp
+++ b/SmartPanel.xaml.cpp
@@ -44,6 +44,11 @@ SmartPanel::SmartPanel()
 
     _accountsList_->ItemsSource = AccountsViewModel::instance->accountsList;
     _smartList_->ItemsSource = ContactsViewModel::instance->contactsList;
+
+    /* connect delegate */
+    ContactsViewModel::instance->notifyNewConversationMessage += ref new NotifyNewConversationMessage([&]() {
+        //_visualNotificationNewMessage_->Vi
+    });
 }
 
 void
-- 
GitLab