/*************************************************************************** * 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 "SmartPanelItemsViewModel.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 Windows::Globalization::DateTimeFormatting; using namespace RingClientUWP; using namespace ViewModel; SmartPanelItemsViewModel::SmartPanelItemsViewModel() { itemsList_ = ref new Vector<SmartPanelItem^>(); RingD::instance->stateChange += ref new RingClientUWP::StateChange(this, &RingClientUWP::ViewModel::SmartPanelItemsViewModel::OnstateChange); } bool SmartPanelItemsViewModel::isInCall() { bool isInCall = false; for (auto item : itemsList) { if (item->_callId && item->_callStatus == CallStatus::IN_PROGRESS) { isInCall = true; break; } } return isInCall; } SmartPanelItem^ SmartPanelItemsViewModel::findItem(String^ callId) { for each (SmartPanelItem^ item in itemsList) if (item->_callId == callId) return item; return nullptr; } SmartPanelItem^ SmartPanelItemsViewModel::findItem(Contact^ contact) { for each (SmartPanelItem^ item in itemsList) if (item->_contact == contact) return item; return nullptr; } unsigned int SmartPanelItemsViewModel::getIndex(String^ callId) { unsigned int i; for (i = 0; i < itemsList_->Size; i++) { if (itemsList_->GetAt(i)->_callId == callId) break; } return i; } unsigned int SmartPanelItemsViewModel::getIndex(Contact^ contact) { unsigned int i; for (i = 0; i < itemsList_->Size; i++) { if (itemsList_->GetAt(i)->_contact == contact) break; } return i; } void RingClientUWP::ViewModel::SmartPanelItemsViewModel::removeItem(SmartPanelItem ^ item) { unsigned int index; if (itemsList->IndexOf(item, &index)) itemsList->RemoveAt(index); } void RingClientUWP::ViewModel::SmartPanelItemsViewModel::moveItemToTheTop(SmartPanelItem ^ item) { unsigned int spi_index, cl_index; if (itemsList->IndexOf(item, &spi_index)) { if (spi_index != 0) { auto contactList = ContactsViewModel::instance->contactsList; auto contactListItem = ContactsViewModel::instance->findContactByName(item->_contact->_name); contactList->IndexOf(contactListItem, &cl_index); contactList->RemoveAt(cl_index); contactList->Append(contactListItem); ContactsViewModel::instance->saveContactsToFile(); itemsList->RemoveAt(spi_index); itemsList->InsertAt(0, item); item->_isHovered = false; } } } void RingClientUWP::ViewModel::SmartPanelItemsViewModel::OnstateChange(Platform::String ^callId, RingClientUWP::CallStatus state, int code) { auto item = SmartPanelItemsViewModel::instance->findItem(callId); if (!item) { WNG_("item not found"); return; } item->_callStatus = state; Windows::Globalization::Calendar^ calendar = ref new Windows::Globalization::Calendar(); Windows::Foundation::DateTime dateTime = calendar->GetDateTime(); auto timestampFormatter = ref new DateTimeFormatter("day month year hour minute second"); switch (state) { case CallStatus::ENDED: { item->_contact->_lastTime = "Last call : " + timestampFormatter->Format(dateTime) + "."; ContactsViewModel::instance->saveContactsToFile(); break; } case CallStatus::IN_PROGRESS: { item->_contact->_lastTime = "in progress."; break; } case CallStatus::PEER_PAUSED: { item->_contact->_lastTime = "paused by "+ item->_contact->_name+"."; break; } case CallStatus::PAUSED: { item->_contact->_lastTime = "paused."; break; } case CallStatus::OUTGOING_REQUESTED: case CallStatus::OUTGOING_RINGING: case CallStatus::SEARCHING: { item->_contact->_lastTime = "looking for " + item->_contact->_name + "."; break; } case CallStatus::INCOMING_RINGING: item->_contact->_lastTime = "incoming call from " + item->_contact->_name + "."; break; default: break; } }