From bf406b2c3aa16ca8f85a93df50db90c291e05b31 Mon Sep 17 00:00:00 2001
From: Nicolas Jager <nicolas.jager@savoirfairelinux.com>
Date: Fri, 21 Oct 2016 11:32:33 -0400
Subject: [PATCH] add accountListItem

Change-Id: Ic59097eb8158e8bae606409500e295684b4e5e29
Tuleap: #1238
---
 Account.cpp                     |  1 -
 Account.h                       | 10 -----
 AccountListItem.cpp             | 47 ++++++++++++++++++++
 AccountListItem.h               | 54 +++++++++++++++++++++++
 AccountListItemsViewModel.cpp   | 52 ++++++++++++++++++++++
 AccountListItemsViewModel.h     | 77 +++++++++++++++++++++++++++++++++
 AccountsViewModel.cpp           | 16 ++++---
 AccountsViewModel.h             | 27 ++----------
 RingD.cpp                       |  6 +--
 SmartPanel.xaml                 | 14 +++---
 SmartPanel.xaml.cpp             | 33 +++++++-------
 pch.h                           |  2 +
 ring-client-uwp.vcxproj         |  4 ++
 ring-client-uwp.vcxproj.filters | 12 +++++
 14 files changed, 289 insertions(+), 66 deletions(-)
 create mode 100644 AccountListItem.cpp
 create mode 100644 AccountListItem.h
 create mode 100644 AccountListItemsViewModel.cpp
 create mode 100644 AccountListItemsViewModel.h

diff --git a/Account.cpp b/Account.cpp
index 7f1c97d..43cd68f 100644
--- a/Account.cpp
+++ b/Account.cpp
@@ -38,7 +38,6 @@ Account::Account(String^ name,
     accountType_ = accountType;
     accountID_ = accountID;
     _deviceId = deviceId;
-    _isSelected = false;
 }
 
 void
diff --git a/Account.h b/Account.h
index 224e1fa..6f11812 100644
--- a/Account.h
+++ b/Account.h
@@ -45,22 +45,12 @@ public:
             devicesIdList_ = value;
         }
     }
-    property bool _isSelected {
-        void set(bool value) {
-            // isSelected_ = value; disabled on purpose for future use
-            PropertyChanged(this, ref new PropertyChangedEventArgs("_isSelected"));
-        }
-        bool get() {
-            return isSelected_;
-        }
-    }
 
 protected:
     void NotifyPropertyChanged(String^ propertyName);
 
 private:
     Windows::Foundation::Collections::IVector<String^>^ devicesIdList_;
-    bool isSelected_;
 
 };
 }
diff --git a/AccountListItem.cpp b/AccountListItem.cpp
new file mode 100644
index 0000000..aee9ffd
--- /dev/null
+++ b/AccountListItem.cpp
@@ -0,0 +1,47 @@
+/**************************************************************************
+* Copyright (C) 2016 by Savoir-faire Linux                                *
+* Author: J�ger Nicolas <nicolas.jager@savoirfairelinux.com>              *
+* Author: Traczyk Andreas <traczyk.andreas@savoirfairelinux.com>          *
+*                                                                         *
+* This program is free software; you can redistribute it and/or modify    *
+* it under the terms of the GNU General Public License as published by    *
+* the Free Software Foundation; either version 3 of the License, or       *
+* (at your option) any later version.                                     *
+*                                                                         *
+* This program is distributed in the hope that it will be useful,         *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+* GNU General Public License for more details.                            *
+*                                                                         *
+* You should have received a copy of the GNU General Public License       *
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.   *
+**************************************************************************/
+#include "pch.h"
+
+#include "AccountListItem.h"
+
+using namespace Windows::ApplicationModel::Core;
+using namespace Platform;
+using namespace Windows::Data::Json;
+using namespace Windows::UI::Core;
+
+using namespace RingClientUWP;
+using namespace RingClientUWP::Controls;
+using namespace ViewModel;
+
+AccountListItem::AccountListItem(Account^ a)
+{
+	    _account = a;
+}
+
+void
+AccountListItem::NotifyPropertyChanged(String^ propertyName)
+{
+    CoreApplicationView^ view = CoreApplication::MainView;
+    view->CoreWindow->Dispatcher->RunAsync(
+        CoreDispatcherPriority::High,
+        ref new DispatchedHandler([this, propertyName]()
+    {
+        PropertyChanged(this, ref new PropertyChangedEventArgs(propertyName));
+    }));
+}
\ No newline at end of file
diff --git a/AccountListItem.h b/AccountListItem.h
new file mode 100644
index 0000000..01608e1
--- /dev/null
+++ b/AccountListItem.h
@@ -0,0 +1,54 @@
+#pragma once
+/**************************************************************************
+* Copyright (C) 2016 by Savoir-faire Linux                                *
+* Author: Jäger Nicolas <nicolas.jager@savoirfairelinux.com>              *
+* Author: Traczyk Andreas <traczyk.andreas@savoirfairelinux.com>          *
+*                                                                         *
+* This program is free software; you can redistribute it and/or modify    *
+* it under the terms of the GNU General Public License as published by    *
+* the Free Software Foundation; either version 3 of the License, or       *
+* (at your option) any later version.                                     *
+*                                                                         *
+* This program is distributed in the hope that it will be useful,         *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+* GNU General Public License for more details.                            *
+*                                                                         *
+* You should have received a copy of the GNU General Public License       *
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.   *
+**************************************************************************/
+using namespace Platform;
+using namespace Windows::Data::Json;
+using namespace Windows::UI::Xaml;
+using namespace Windows::UI::Xaml::Data;
+
+namespace RingClientUWP
+{
+namespace Controls {
+public ref class AccountListItem sealed : public INotifyPropertyChanged
+{
+public:
+    AccountListItem(Account^ a);
+
+    virtual event PropertyChangedEventHandler^ PropertyChanged;
+    property Account^ _account;
+    property bool _isSelected {
+        void set(bool value) {
+            isSelected_ = value;
+            PropertyChanged(this, ref new PropertyChangedEventArgs("_isSelected"));
+        }
+        bool get() {
+            return isSelected_;
+        }
+    }
+
+protected:
+    void NotifyPropertyChanged(String^ propertyName);
+
+private:
+    bool isSelected_;
+
+};
+}
+}
+
diff --git a/AccountListItemsViewModel.cpp b/AccountListItemsViewModel.cpp
new file mode 100644
index 0000000..4f39c18
--- /dev/null
+++ b/AccountListItemsViewModel.cpp
@@ -0,0 +1,52 @@
+/***************************************************************************
+ * Copyright (C) 2016 by Savoir-faire Linux                                *
+ * Author: Jäger Nicolas <nicolas.jager@savoirfairelinux.com>              *
+ * Author: Traczyk Andreas <andreas.traczyk@savoirfairelinux.com>          *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License as published by    *
+ * the Free Software Foundation; either version 3 of the License, or       *
+ * (at your option) any later version.                                     *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License       *
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.   *
+ **************************************************************************/
+#include "pch.h"
+
+#include "AccountListItemsViewModel.h"
+
+using namespace Windows::ApplicationModel::Core;
+using namespace Windows::Data::Json;
+using namespace Windows::Storage;
+using namespace Windows::Storage::Streams;
+using namespace Windows::UI::Core;
+
+
+using namespace RingClientUWP;
+using namespace ViewModel;
+
+AccountListItemsViewModel::AccountListItemsViewModel()
+{
+    itemsList_ = ref new Vector<AccountListItem^>();
+
+    /* connect to delegates */
+    AccountsViewModel::instance->accountAdded += ref new RingClientUWP::AccountAdded(this, &RingClientUWP::ViewModel::AccountListItemsViewModel::OnaccountAdded);
+    AccountsViewModel::instance->clearAccountsList += ref new RingClientUWP::ClearAccountsList(this, &RingClientUWP::ViewModel::AccountListItemsViewModel::OnclearAccountsList);
+}
+
+void RingClientUWP::ViewModel::AccountListItemsViewModel::OnaccountAdded(RingClientUWP::Account ^account)
+{
+    auto item = ref new AccountListItem(account);
+    itemsList_->Append(item);
+}
+
+
+void RingClientUWP::ViewModel::AccountListItemsViewModel::OnclearAccountsList()
+{
+    itemsList_->Clear();
+}
diff --git a/AccountListItemsViewModel.h b/AccountListItemsViewModel.h
new file mode 100644
index 0000000..33c07f8
--- /dev/null
+++ b/AccountListItemsViewModel.h
@@ -0,0 +1,77 @@
+/***************************************************************************
+ * Copyright (C) 2016 by Savoir-faire Linux                                *
+ * Author: Jäger Nicolas <nicolas.jager@savoirfairelinux.com>              *
+ * Author: Traczyk Andreas <andreas.traczyk@savoirfairelinux.com>          *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License as published by    *
+ * the Free Software Foundation; either version 3 of the License, or       *
+ * (at your option) any later version.                                     *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License       *
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.   *
+ **************************************************************************/
+#pragma once
+
+using namespace Platform::Collections;
+using namespace Concurrency;
+
+using namespace RingClientUWP;
+using namespace RingClientUWP::Controls;
+
+namespace RingClientUWP
+{
+namespace ViewModel {
+
+public ref class AccountListItemsViewModel sealed
+{
+internal:
+    /* singleton */
+    static property AccountListItemsViewModel^ instance
+    {
+        AccountListItemsViewModel^ get()
+        {
+            static AccountListItemsViewModel^ instance_ = ref new AccountListItemsViewModel();
+            return instance_;
+        }
+    }
+
+    /* functions */
+    // to do
+
+
+    property Vector<AccountListItem^>^ itemsList
+    {
+        Vector<AccountListItem^>^ get()
+        {
+            return itemsList_;
+        }
+    }
+
+    property AccountListItem^ _selectedItem
+    {
+        AccountListItem^ get()
+        {
+            return currentItem_;
+        }
+        void set(AccountListItem^ value)
+        {
+            currentItem_ = value;
+        }
+    }
+
+private:
+    AccountListItemsViewModel(); // singleton
+    Vector<AccountListItem^>^ itemsList_;
+    AccountListItem^ currentItem_;
+
+    void OnaccountAdded(RingClientUWP::Account ^account);
+    void OnclearAccountsList();
+};
+}
+}
diff --git a/AccountsViewModel.cpp b/AccountsViewModel.cpp
index 655c4e4..f96a2f0 100644
--- a/AccountsViewModel.cpp
+++ b/AccountsViewModel.cpp
@@ -31,19 +31,21 @@ AccountsViewModel::AccountsViewModel()
 void
 AccountsViewModel::add(std::string& name, std::string& ringID, std::string& accountType, std::string& accountID, std::string& deviceId)
 {
+    auto account = ref new Account(
+                       Utils::toPlatformString(name),
+                       Utils::toPlatformString(ringID),
+                       Utils::toPlatformString(accountType),
+                       Utils::toPlatformString(accountID),
+                       Utils::toPlatformString(deviceId));
 
-    accountsList_->Append(ref new Account(
-                              Utils::toPlatformString(name),
-                              Utils::toPlatformString(ringID),
-                              Utils::toPlatformString(accountType),
-                              Utils::toPlatformString(accountID),
-                              Utils::toPlatformString(deviceId)
-                          ));
+    accountsList_->Append(account);
     updateScrollView();
+    accountAdded(account);
 }
 
 void
 AccountsViewModel::clearAccountList()
 {
     accountsList_->Clear();
+    clearAccountsList();
 }
\ No newline at end of file
diff --git a/AccountsViewModel.h b/AccountsViewModel.h
index 5612b10..6df26c1 100644
--- a/AccountsViewModel.h
+++ b/AccountsViewModel.h
@@ -27,6 +27,8 @@ namespace RingClientUWP
 delegate void NewAccountSelected();
 delegate void NoAccountSelected();
 delegate void UpdateScrollView();
+delegate void AccountAdded(Account^ account);
+delegate void ClearAccountsList();
 
 namespace ViewModel {
 public ref class AccountsViewModel sealed
@@ -47,27 +49,6 @@ internal:
     void clearAccountList();
 
     /* properties */
-    property Account^ selectedAccount
-    {
-        Account^ get()
-        {
-            return currentItem_;
-        }
-        void set(Account^ value)
-        {
-            oldItem_ = currentItem_;
-            if (oldItem_)
-                oldItem_->_isSelected = false;
-            currentItem_ = value;
-            if (currentItem_)
-                currentItem_->_isSelected = true;
-            if (value)
-                newAccountSelected();
-            else
-                noAccountSelected();
-        }
-    }
-
     property Vector<Account^>^ accountsList
     {
         Vector<Account^>^ get()
@@ -80,12 +61,12 @@ internal:
     event NewAccountSelected^ newAccountSelected;
     event NoAccountSelected^ noAccountSelected;
     event UpdateScrollView^ updateScrollView;
+    event AccountAdded^ accountAdded;
+    event ClearAccountsList^ clearAccountsList;
 
 private:
     AccountsViewModel(); // singleton
     Vector<Account^>^ accountsList_;
-    Account^ currentItem_;
-    Account^ oldItem_;
 
 };
 }
diff --git a/RingD.cpp b/RingD.cpp
index 5922548..814d080 100644
--- a/RingD.cpp
+++ b/RingD.cpp
@@ -73,7 +73,7 @@ RingClientUWP::RingD::reloadAccountList()
 void RingClientUWP::RingD::sendAccountTextMessage(String^ message)
 {
     /* account id */
-    auto accountId = AccountsViewModel::instance->selectedAccount->accountID_;
+    auto accountId = AccountListItemsViewModel::instance->_selectedItem->_account->accountID_;
     std::wstring accountId2(accountId->Begin());
     std::string accountId3(accountId2.begin(), accountId2.end());
 
@@ -109,7 +109,7 @@ void RingClientUWP::RingD::sendAccountTextMessage(String^ message)
 void RingClientUWP::RingD::sendSIPTextMessage(String^ message)
 {
     /* account id */
-    auto accountId = AccountsViewModel::instance->selectedAccount->accountID_;
+    auto accountId = AccountListItemsViewModel::instance->_selectedItem->_account->accountID_;
     std::wstring accountId2(accountId->Begin());
     std::string accountId3(accountId2.begin(), accountId2.end());
 
@@ -164,7 +164,7 @@ void RingClientUWP::RingD::placeCall(Contact^ contact)
 {
     MSG_("!--->> placeCall");
     auto to = contact->ringID_;
-    auto accountId = AccountsViewModel::instance->selectedAccount->accountID_;
+    auto accountId = AccountListItemsViewModel::instance->_selectedItem->_account->accountID_;
 
     auto to2 = Utils::toString(to);
     auto accountId2 = Utils::toString(accountId);
diff --git a/SmartPanel.xaml b/SmartPanel.xaml
index 213c138..ec02c6f 100644
--- a/SmartPanel.xaml
+++ b/SmartPanel.xaml
@@ -170,9 +170,9 @@
                 </Grid>
             </Grid>
         </DataTemplate>
-        <!-- template for accounts. -->
-        <DataTemplate x:Key="AccountTemplate"
-                      x:DataType="local:Account">
+        <!-- template for AccountListItems. -->
+        <DataTemplate x:Key="AccountListItemsTemplate"
+                      x:DataType="controls:AccountListItem">
             <Grid Margin="0,10">
                 <Grid.ColumnDefinitions>
                     <ColumnDefinition Width="40"/>
@@ -184,7 +184,7 @@
                     <Image x:Name="_AccountTypeIcon_"
                            VerticalAlignment="Center"
                            HorizontalAlignment="Center"
-                           Source="{x:Bind accountType_, Converter={StaticResource _AccountTypeToSourceImage_}, Mode=OneWay}"/>
+                           Source="{x:Bind  _account.accountType_, Converter={StaticResource _AccountTypeToSourceImage_}, Mode=OneWay}"/>
                 </Border>
                 <Button x:Name="_editAccountMenuButton_"
                         HorizontalAlignment="Right"
@@ -203,11 +203,11 @@
                 <StackPanel Grid.Column="1">
                     <TextBlock x:Name="_accountName_"
                            Style="{StaticResource TextStyle5}"
-                           Text="{x:Bind name_}"/>
+                           Text="{x:Bind  _account.name_}"/>
                     <TextBlock x:Name="_ringID_"
                            Grid.ColumnSpan="2"
                            Style="{StaticResource TextStyle6}"
-                           Text="{x:Bind ringID_}"/>
+                           Text="{x:Bind  _account.ringID_}"/>
                 </StackPanel>
             </Grid>
         </DataTemplate>
@@ -440,7 +440,7 @@
                          Width="320"
                          ItemContainerStyle="{StaticResource contactsListBoxStyle}"
                          Background="#FFE4F1F9"
-                         ItemTemplate="{StaticResource AccountTemplate}"/>
+                         ItemTemplate="{StaticResource AccountListItemsTemplate}"/>
                 </ScrollViewer>
                 <Button x:Name="_addAccountBtn_"
                         Grid.Row="1"
diff --git a/SmartPanel.xaml.cpp b/SmartPanel.xaml.cpp
index 2af5527..57a6276 100644
--- a/SmartPanel.xaml.cpp
+++ b/SmartPanel.xaml.cpp
@@ -39,6 +39,8 @@ using namespace Windows::Foundation;
 using namespace Windows::Graphics::Imaging;
 using namespace Windows::Foundation;
 using namespace Concurrency;
+using namespace Platform::Collections;
+
 
 
 using namespace Windows::ApplicationModel::Core;
@@ -49,7 +51,8 @@ SmartPanel::SmartPanel()
 {
     InitializeComponent();
 
-    _accountsList_->ItemsSource = AccountsViewModel::instance->accountsList;
+    /* populate accounts listBox*/
+    _accountsList_->ItemsSource = AccountListItemsViewModel::instance->itemsList;
 
     /* populate the smartlist */
     _smartList_->ItemsSource = SmartPanelItemsViewModel::instance->itemsList;
@@ -136,25 +139,25 @@ SmartPanel::SmartPanel()
 void
 RingClientUWP::Views::SmartPanel::updatePageContent()
 {
-    auto account = AccountsViewModel::instance->selectedAccount;
-    if (!account)
+    auto accountListItem = AccountListItemsViewModel::instance->_selectedItem;
+    if (!accountListItem)
         return;
 
-    auto name = account->name_;
+    auto name = accountListItem->_account->name_;
 
     Configuration::UserPreferences::instance->PREF_ACCOUNT_INDEX = _accountsList_->SelectedIndex;
     Configuration::UserPreferences::instance->save();
 
-    _selectedAccountName_->Text = name;
+    _selectedAccountName_->Text = name; // refacto : bind this in xaml directly
 ///    _devicesIdList_->ItemsSource = account->_devicesIdList;
-    _deviceId_->Text = account->_deviceId; /* this is the current device ...
+    _deviceId_->Text = accountListItem->_account->_deviceId; /* this is the current device ...
     ... in the way to get all associated devices, we have to querry the daemon : */
 
-    _devicesMenuButton_->Visibility = (account->accountType_ == "RING")
+    _devicesMenuButton_->Visibility = (accountListItem->_account->accountType_ == "RING")
                                       ? Windows::UI::Xaml::Visibility::Visible
                                       : Windows::UI::Xaml::Visibility::Collapsed;
 
-    _shareMenuButton_->Visibility = (account->accountType_ == "RING")
+    _shareMenuButton_->Visibility = (accountListItem->_account->accountType_ == "RING")
                                     ? Windows::UI::Xaml::Visibility::Visible
                                     : Windows::UI::Xaml::Visibility::Collapsed;
 }
@@ -321,8 +324,8 @@ SmartPanel::_accountList__SelectionChanged(Platform::Object^ sender, Windows::UI
             }
         }
     }
-    auto account = safe_cast<Account^>(listbox->SelectedItem);
-    AccountsViewModel::instance->selectedAccount = account;
+    auto account = safe_cast<AccountListItem^>(listbox->SelectedItem);
+    AccountListItemsViewModel::instance->_selectedItem = account;
     updatePageContent();
 }
 
@@ -432,7 +435,7 @@ void RingClientUWP::Views::SmartPanel::_contactItem__PointerReleased(Platform::O
 
 void RingClientUWP::Views::SmartPanel::generateQRcode()
 {
-    auto ringId = AccountsViewModel::instance->selectedAccount->ringID_;
+    auto ringId = AccountListItemsViewModel::instance->_selectedItem->_account->ringID_;
     auto ringId2 = Utils::toString(ringId);
 
     _ringId_->Text = ringId;
@@ -589,7 +592,7 @@ void RingClientUWP::Views::SmartPanel::_devicesMenuButton__Checked(Platform::Obj
     _waitingDevicesList_->Visibility = Windows::UI::Xaml::Visibility::Visible;
     _devicesIdList_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
 
-    auto accountId = AccountsViewModel::instance->selectedAccount->accountID_;
+    auto accountId = AccountListItemsViewModel::instance->_selectedItem->_account->accountID_;
     RingD::instance->askToRefreshKnownDevices(accountId);
 
     _shareMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
@@ -613,7 +616,7 @@ void RingClientUWP::Views::SmartPanel::_addDevice__Click(Platform::Object^ sende
 void RingClientUWP::Views::SmartPanel::OndevicesListRefreshed(Platform::Collections::Vector<Platform::String ^, std::equal_to<Platform::String ^>, true> ^devicesList)
 {
     _waitingDevicesList_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
-    AccountsViewModel::instance->selectedAccount->_devicesIdList = devicesList;
+    AccountListItemsViewModel::instance->_selectedItem->_account->_devicesIdList = devicesList;
     _devicesIdList_->ItemsSource = devicesList;
     _devicesIdList_->Visibility = Windows::UI::Xaml::Visibility::Visible;
 }
@@ -624,7 +627,7 @@ void RingClientUWP::Views::SmartPanel::_pinGeneratorYes__Click(Platform::Object^
     _addingDeviceGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
     _waitingForPin_->Visibility = Windows::UI::Xaml::Visibility::Visible;
 
-    auto accountId = AccountsViewModel::instance->selectedAccount->accountID_;
+    auto accountId = AccountListItemsViewModel::instance->_selectedItem->_account->accountID_;
     auto password = _passwordForPinGenerator_->Password;
     _passwordForPinGenerator_->Password = "";
 
@@ -690,7 +693,7 @@ Object ^ RingClientUWP::Views::AccountSelectedToVisibility::Convert(Object ^ val
 {
     //auto accountId = static_cast<bool(value);
 
-    if (/*AccountsViewModel::instance->selectedAccount->_isSelected ==*/ (bool)value == true)
+    if (/*AccountListItemsViewModel::instance->_selectedItem->_account->_isSelected ==*/ (bool)value == true)
         return Windows::UI::Xaml::Visibility::Visible;
 
     return Windows::UI::Xaml::Visibility::Collapsed;
diff --git a/pch.h b/pch.h
index 9bd464e..0be8155 100644
--- a/pch.h
+++ b/pch.h
@@ -32,6 +32,8 @@
 /* required by generated headers. */
 #include "App.xaml.h"
 #include "Account.h"
+#include "AccountListItem.h"
+#include "AccountListItemsViewModel.h"
 #include "AccountsViewModel.h"
 #include "Contact.h"
 #include "ContactsViewModel.h"
diff --git a/ring-client-uwp.vcxproj b/ring-client-uwp.vcxproj
index 2c4350a..7d523b4 100644
--- a/ring-client-uwp.vcxproj
+++ b/ring-client-uwp.vcxproj
@@ -166,6 +166,8 @@
   </ItemDefinitionGroup>
   <ItemGroup>
     <ClInclude Include="Account.h" />
+    <ClInclude Include="AccountListItem.h" />
+    <ClInclude Include="AccountListItemsViewModel.h" />
     <ClInclude Include="AccountsViewModel.h" />
     <ClInclude Include="Contact.h" />
     <ClInclude Include="ContactsViewModel.h" />
@@ -284,6 +286,8 @@
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Account.cpp" />
+    <ClCompile Include="AccountListItem.cpp" />
+    <ClCompile Include="AccountListItemsViewModel.cpp" />
     <ClCompile Include="AccountsViewModel.cpp" />
     <ClCompile Include="App.xaml.cpp">
       <DependentUpon>App.xaml</DependentUpon>
diff --git a/ring-client-uwp.vcxproj.filters b/ring-client-uwp.vcxproj.filters
index e06ba95..61b35fd 100644
--- a/ring-client-uwp.vcxproj.filters
+++ b/ring-client-uwp.vcxproj.filters
@@ -104,6 +104,12 @@
     <ClCompile Include="VideoCaptureManager.cpp">
       <Filter>Media\Video</Filter>
     </ClCompile>
+    <ClCompile Include="AccountListItem.cpp">
+      <Filter>Controls</Filter>
+    </ClCompile>
+    <ClCompile Include="AccountListItemsViewModel.cpp">
+      <Filter>ModelViews</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="pch.h" />
@@ -164,6 +170,12 @@
     <ClInclude Include="Globals.h">
       <Filter>Common</Filter>
     </ClInclude>
+    <ClInclude Include="AccountListItem.h">
+      <Filter>Controls</Filter>
+    </ClInclude>
+    <ClInclude Include="AccountListItemsViewModel.h">
+      <Filter>ModelViews</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <Image Include="Assets\LockScreenLogo.scale-200.png">
-- 
GitLab