blob: 382f8f26e968f8725927ec324d3033ca3995b560 [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Nicolas Jager45bf7c02016-01-20 09:53:02 -05002 * Copyright (C) 2015-2016 by Savoir-faire Linux *
Edric Milaret627500d2015-03-27 16:41:40 -04003 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -04004 * Author: Anthony Léonard <anthony.leonard@savoirfairelinux.com> *
5 * Author: Olivier Soldano <olivier.soldano@savoirfairelinux.com> *
Edric Milaret627500d2015-03-27 16:41:40 -04006 * *
7 * This program is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
19 **************************************************************************/
20
21#include "callwidget.h"
22#include "ui_callwidget.h"
23
Edric Milaret43f3c1e2015-07-16 17:52:47 -040024#include <QClipboard>
Edric Milaret70ae8782016-04-18 16:10:44 -040025#include <QDesktopServices>
Edric Milaret43f3c1e2015-07-16 17:52:47 -040026
Edric Milaret53f57b62015-05-11 11:02:17 -040027#include <memory>
Edric Milaret627500d2015-03-27 16:41:40 -040028
Edric Milarete19c4cd2016-02-12 10:19:44 -050029#include "qrencode.h"
30
Edric Milaret43f3c1e2015-07-16 17:52:47 -040031//ERROR is defined in windows.h
32#include "utils.h"
33#undef ERROR
Edric Milareta0ebd062016-01-13 12:18:23 -050034#undef interface
Edric Milaret43f3c1e2015-07-16 17:52:47 -040035
Edric Milaret627500d2015-03-27 16:41:40 -040036#include "audio/settings.h"
Olivier SOLDANO9657fd12017-03-27 16:06:53 -040037#include "accountmodel.h"
Edric Milaret627500d2015-03-27 16:41:40 -040038#include "personmodel.h"
Edric Milaret43f3c1e2015-07-16 17:52:47 -040039#include "person.h"
Edric Milaret627500d2015-03-27 16:41:40 -040040#include "fallbackpersoncollection.h"
Edric Milaret67007d12015-05-07 09:40:09 -040041#include "categorizedcontactmodel.h"
Edric Milaret6a642e22015-05-27 15:06:30 -040042#include "localhistorycollection.h"
Edric Milaret1b197eb2015-06-01 15:09:56 -040043#include "media/text.h"
44#include "media/recording.h"
Edric Milaret00a32252016-01-19 10:37:13 -050045#include "media/recordingmodel.h"
Edric Milareted0b2802015-10-01 15:10:02 -040046#include "recentmodel.h"
Edric Milaretab12d022015-12-04 16:09:44 -050047#include "contactmethod.h"
Edric Milareta0ebd062016-01-13 12:18:23 -050048#include "globalinstances.h"
Olivier SOLDANO63178ee2016-11-04 16:50:08 -040049#include <availableaccountmodel.h>
Anthony Léonardd47179c2017-03-28 10:39:10 -040050#include "pendingcontactrequestmodel.h"
51
Edric Milaret559bda52015-04-29 17:02:31 -040052#include "wizarddialog.h"
Edric Milaret83b248c2015-06-02 11:42:23 -040053#include "windowscontactbackend.h"
Edric Milaret43f3c1e2015-07-16 17:52:47 -040054#include "contactpicker.h"
Edric Milaret2afd2bf2015-07-21 17:12:25 -040055#include "contactmethodpicker.h"
Edric Milaret2cf34292015-06-22 16:27:03 -040056#include "globalsystemtray.h"
Edric Milareted0b2802015-10-01 15:10:02 -040057#include "smartlistdelegate.h"
Edric Milaretab12d022015-12-04 16:09:44 -050058#include "imdelegate.h"
Edric Milareta0ebd062016-01-13 12:18:23 -050059#include "pixbufmanipulator.h"
Edric Milaret70ae8782016-04-18 16:10:44 -040060#include "settingskey.h"
Edric Milaret627500d2015-03-27 16:41:40 -040061
Edric Milaret25236d92016-03-28 09:40:58 -040062#include "profilemodel.h"
Olivier SOLDANO9657fd12017-03-27 16:06:53 -040063#include "profile.h"
Edric Milaret25236d92016-03-28 09:40:58 -040064#include "peerprofilecollection.h"
65#include "localprofilecollection.h"
66
Nicolas Jager97a21b42015-12-03 16:55:45 -050067CallWidget::CallWidget(QWidget* parent) :
Nicolas Jager74fe46f2016-02-29 14:55:09 -050068 NavWidget(parent),
Edric Milaret7d40a4a2015-05-13 13:01:15 -040069 ui(new Ui::CallWidget),
Edric Milaretab12d022015-12-04 16:09:44 -050070 menu_(new QMenu()),
71 imDelegate_(new ImDelegate())
Edric Milaret627500d2015-03-27 16:41:40 -040072{
73 ui->setupUi(this);
74
Edric Milaret6b68a482016-02-01 15:23:44 -050075 pageAnim_ = new QPropertyAnimation(ui->welcomePage, "pos", this);
Nicolas Jagerca850292016-01-17 14:11:10 -050076
Edric Milaret6456baa2015-05-21 12:18:07 -040077 setActualCall(nullptr);
Edric Milaret627500d2015-03-27 16:41:40 -040078 videoRenderer_ = nullptr;
79
Nicolas Jager74fe46f2016-02-29 14:55:09 -050080 connect(ui->settingsButton, &QPushButton::clicked, this, &CallWidget::settingsButtonClicked);
81
Edric Milaret3aca8e32015-06-12 10:01:40 -040082 connect(ui->videoWidget, SIGNAL(setChatVisibility(bool)),
83 ui->instantMessagingWidget, SLOT(setVisible(bool)));
84
Edric Milareted0b2802015-10-01 15:10:02 -040085 QPixmap logo(":/images/logo-ring-standard-coul.png");
86 ui->ringLogo->setPixmap(logo.scaledToHeight(100, Qt::SmoothTransformation));
87 ui->ringLogo->setAlignment(Qt::AlignHCenter);
88
Edric Milaret1e598592016-09-02 10:10:01 -040089 ui->qrLabel->hide();
Edric Milarete19c4cd2016-02-12 10:19:44 -050090
Edric Milareta0ebd062016-01-13 12:18:23 -050091 GlobalInstances::setPixmapManipulator(std::unique_ptr<Interfaces::PixbufManipulator>(new Interfaces::PixbufManipulator()));
92
Edric Milaret627500d2015-03-27 16:41:40 -040093 try {
Edric Milareta3e47282015-10-23 15:20:30 -040094 callModel_ = &CallModel::instance();
Edric Milaret627500d2015-03-27 16:41:40 -040095
96 connect(callModel_, SIGNAL(incomingCall(Call*)),
97 this, SLOT(callIncoming(Call*)));
Edric Milaret627500d2015-03-27 16:41:40 -040098 connect(callModel_, SIGNAL(callStateChanged(Call*, Call::State)),
99 this, SLOT(callStateChanged(Call*, Call::State)));
100
Edric Milareta3e47282015-10-23 15:20:30 -0400101 connect(&AccountModel::instance()
Edric Milaret67007d12015-05-07 09:40:09 -0400102 , SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>))
103 , this
104 , SLOT(findRingAccount(QModelIndex, QModelIndex, QVector<int>)));
105
Edric Milaretfa05d972016-01-13 16:22:04 -0500106 RecentModel::instance().peopleProxy()->setFilterRole(static_cast<int>(Ring::Role::Name));
107 RecentModel::instance().peopleProxy()->setFilterCaseSensitivity(Qt::CaseInsensitive);
Edric Milareta3e47282015-10-23 15:20:30 -0400108 ui->smartList->setModel(RecentModel::instance().peopleProxy());
Edric Milaret6816fd72016-01-29 16:36:24 -0500109
Edric Milaret25236d92016-03-28 09:40:58 -0400110 PersonModel::instance().addCollection<PeerProfileCollection>(LoadOptions::FORCE_ENABLED);
111 ProfileModel::instance().addCollection<LocalProfileCollection>(LoadOptions::FORCE_ENABLED);
112
Edric Milareta3e47282015-10-23 15:20:30 -0400113 PersonModel::instance().
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400114 addCollection<WindowsContactBackend>(LoadOptions::FORCE_ENABLED);
115
Edric Milaret6b68a482016-02-01 15:23:44 -0500116 connect(ui->smartList, &QTreeView::entered, this, &CallWidget::on_entered);
117
118 smartListDelegate_ = new SmartListDelegate();
119 ui->smartList->setSmartListItemDelegate(smartListDelegate_);
120
Edric Milaret627500d2015-03-27 16:41:40 -0400121 findRingAccount();
Edric Milareta0ebd062016-01-13 12:18:23 -0500122 setupOutOfCallIM();
123 setupSmartListMenu();
Edric Milaret627500d2015-03-27 16:41:40 -0400124
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500125 connect(ui->smartList, &SmartList::btnVideoClicked, this, &CallWidget::btnComBarVideoClicked);
Nicolas Jager41e4fcf2016-01-28 11:37:03 -0500126
Edric Milaret6b68a482016-02-01 15:23:44 -0500127 connect(RecentModel::instance().selectionModel(),
Olivier SOLDANO61065ec2016-11-11 16:31:34 -0500128 SIGNAL(currentChanged(QModelIndex,QModelIndex)),
129 this,
130 SLOT(smartListCurrentChanged(QModelIndex,QModelIndex)));
131
Olivier SOLDANOea6d71b2016-11-16 15:56:59 -0500132 connect(RecentModel::instance().selectionModel(), &QItemSelectionModel::selectionChanged, [=](const QItemSelection &selected, const QItemSelection &deselected) {
133 // lambda used to focus on the correct smartList element when switching automatically between two calls
134 Q_UNUSED(deselected)
135 if (selected.size()) {
136 auto idx = selected.indexes().first();
137 auto realIdx = RecentModel::instance().peopleProxy()->mapFromSource(idx);
138 ui->smartList->selectionModel()->setCurrentIndex(realIdx, QItemSelectionModel::ClearAndSelect);
139 } else
140 ui->smartList->clearSelection();
141 });
142
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400143 connect(&NameDirectory::instance(), SIGNAL(registeredNameFound(Account*,NameDirectory::LookupStatus,const QString&,const QString&)),
144 this, SLOT(contactLineEdit_registeredNameFound(Account*,NameDirectory::LookupStatus,const QString&,const QString&)));
145
146 connect(&AccountModel::instance(), SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)),
147 ui->currentAccountWidget, SLOT(update()));
148
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400149 connect(ui->searchBtn, SIGNAL(clicked(bool)), this, SLOT(searchBtnClicked()));
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400150
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400151 connect(ui->sendContactRequestWidget, &SendContactRequestWidget::sendCRclicked, [=]{slidePage(ui->messagingPage);});
152
Anthony Léonardd47179c2017-03-28 10:39:10 -0400153 connect(ui->contactRequestWidget, &ContactRequestWidget::choiceMade, [this]() {
154 slidePage(ui->welcomePage);
155 });
156
157 connect(AccountModel::instance().userSelectionModel(), &QItemSelectionModel::currentChanged,
158 this, &CallWidget::selectedAccountChanged);
159
160 // It needs to be called manually once to initialize the ui with the account selected at start.
161 // The second argument (previous) is set to an invalid QModelIndex as it is the first selection.
162 selectedAccountChanged(AccountModel::instance().userSelectionModel()->currentIndex(), QModelIndex());
163
Edric Milaret80e0b212015-10-16 10:07:43 -0400164 } catch (const std::exception& e) {
165 qDebug() << "INIT ERROR" << e.what();
Edric Milaret627500d2015-03-27 16:41:40 -0400166 }
167}
168
169CallWidget::~CallWidget()
170{
171 delete ui;
Edric Milaretc7ab5502015-06-15 11:18:02 -0400172 delete menu_;
Edric Milaretab12d022015-12-04 16:09:44 -0500173 delete imDelegate_;
Edric Milaret6b68a482016-02-01 15:23:44 -0500174 delete pageAnim_;
175 delete smartListDelegate_;
Edric Milarete19c4cd2016-02-12 10:19:44 -0500176 delete shareMenu_;
177}
178
179void
Edric Milareta0ebd062016-01-13 12:18:23 -0500180CallWidget::setupOutOfCallIM()
181{
182 ui->listMessageView->setItemDelegate(imDelegate_);
183 ui->listMessageView->setContextMenuPolicy(Qt::ActionsContextMenu);
184
185 auto copyAction = new QAction(tr("Copy"), this);
186 ui->listMessageView->addAction(copyAction);
187 connect(copyAction, &QAction::triggered, [=]() {
188 auto idx = ui->listMessageView->currentIndex();
189 if (idx.isValid()) {
190 auto text = ui->listMessageView->model()->data(idx);
191 QApplication::clipboard()->setText(text.value<QString>());
192 }
193 });
Edric Milaret70ae8782016-04-18 16:10:44 -0400194 QSettings settings;
Edric Milareta0ebd062016-01-13 12:18:23 -0500195 auto displayDate = new QAction(tr("Display date"), this);
196 displayDate->setCheckable(true);
Edric Milaret70ae8782016-04-18 16:10:44 -0400197 displayDate->setChecked(settings.value(SettingsKey::imShowDate).toBool());
Edric Milareta0ebd062016-01-13 12:18:23 -0500198 ui->listMessageView->addAction(displayDate);
199 auto displayAuthor = new QAction(tr("Display author"), this);
200 displayAuthor->setCheckable(true);
Edric Milaret70ae8782016-04-18 16:10:44 -0400201 displayAuthor->setChecked(settings.value(SettingsKey::imShowAuthor).toBool());
Edric Milareta0ebd062016-01-13 12:18:23 -0500202 ui->listMessageView->addAction(displayAuthor);
203 auto lamdba = [=](){
Edric Milaret70ae8782016-04-18 16:10:44 -0400204 QSettings settings;
205 settings.setValue(SettingsKey::imShowAuthor, displayAuthor->isChecked());
206 settings.setValue(SettingsKey::imShowDate, displayDate->isChecked());
207 emit imDelegate_->sizeHintChanged(QModelIndex());
Edric Milareta0ebd062016-01-13 12:18:23 -0500208 };
209 connect(displayAuthor, &QAction::triggered, lamdba);
210 connect(displayDate, &QAction::triggered, lamdba);
Edric Milaret00a32252016-01-19 10:37:13 -0500211
212 connect(&::Media::RecordingModel::instance(),
213 SIGNAL(newTextMessage(::Media::TextRecording*, ContactMethod*)),
214 this,
215 SLOT(onIncomingMessage(::Media::TextRecording*, ContactMethod*)));
216}
217
218void
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400219CallWidget::onIncomingMessage(::Media::TextRecording* t, ContactMethod* cm)
220{
Edric Milaret00a32252016-01-19 10:37:13 -0500221 Q_UNUSED(cm)
222
223 if (!QApplication::focusWidget()) {
224 auto idx = t->instantTextMessagingModel()->
225 index(t->instantTextMessagingModel()->rowCount()-1, 0);
226 GlobalSystemTray::instance()
227 .showMessage("Ring",
228 QString(tr("Message incoming from %1")).arg(
229 idx.data((int)Media::TextRecording::Role::AuthorDisplayname).toString()));
230 QApplication::alert(this, 5000);
231 }
Edric Milareta0ebd062016-01-13 12:18:23 -0500232}
233
234void
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400235CallWidget::setupSmartListMenu()
236{
Edric Milareta0ebd062016-01-13 12:18:23 -0500237 ui->smartList->setContextMenuPolicy(Qt::CustomContextMenu);
238 connect(ui->smartList, &QListView::customContextMenuRequested, [=](const QPoint& pos){
239 auto idx = ui->smartList->currentIndex();
240 if (not idx.isValid())
241 return;
242 QPoint globalPos = ui->smartList->mapToGlobal(pos);
243 QMenu menu;
244
Edric Milaret9949b342016-02-02 12:25:08 -0500245 QVector<ContactMethod*> contactMethods = RecentModel::instance()
246 .getContactMethods(RecentModel::instance().peopleProxy()->mapToSource(idx));
247 if (contactMethods.isEmpty())
Edric Milareta0ebd062016-01-13 12:18:23 -0500248 return;
Edric Milaret9949b342016-02-02 12:25:08 -0500249
250 if (contactMethods.size() == 1) {
251 auto contactMethod = contactMethods.at(0);
252 auto copyAction = new QAction(tr("Copy number"), this);
253 menu.addAction(copyAction);
254 connect(copyAction, &QAction::triggered, [contactMethod]() {
255 QApplication::clipboard()->setText(contactMethod->uri());
Edric Milareta0ebd062016-01-13 12:18:23 -0500256 });
Edric Milaretac21b3d2016-09-01 12:45:49 -0400257 auto copyNameAction = new QAction(tr("Copy name"), this);
258 menu.addAction(copyNameAction);
259 connect(copyNameAction, &QAction::triggered, [contactMethod]() {
260 QApplication::clipboard()->setText(contactMethod->primaryName());
261 });
Edric Milaret9949b342016-02-02 12:25:08 -0500262 if (not contactMethod->contact() || contactMethod->contact()->isPlaceHolder()) {
263 auto addExisting = new QAction(tr("Add to contact"), this);
264 menu.addAction(addExisting);
265 connect(addExisting, &QAction::triggered, [globalPos, contactMethod]() {
266 ContactPicker contactPicker(contactMethod);
267 contactPicker.move(globalPos.x(), globalPos.y() - (contactPicker.height()/2));
268 contactPicker.exec();
269 });
270 }
271 }
272 else {
273 auto callMenu = menu.addMenu(tr("Call Number"));
274 auto copyMenu = menu.addMenu(tr("Copy Number"));
275 for (auto cM : contactMethods) {
276 auto uri = cM->uri();
277 auto copyAction = new QAction(tr("Copy %1").arg(uri), this);
278 copyMenu->addAction(copyAction);
279 connect(copyAction, &QAction::triggered, [uri]() {
280 QApplication::clipboard()->setText(uri);
281 });
282 auto callAction = new QAction(tr("Call %1").arg(uri), this);
283 callMenu->addAction(callAction);
284 connect(callAction, &QAction::triggered, [cM]() {
285 Call* c = CallModel::instance().dialingCall(cM);
286 c->performAction(Call::Action::ACCEPT);
287 });
288 }
Edric Milareta0ebd062016-01-13 12:18:23 -0500289 }
290 menu.exec(globalPos);
291 });
292}
293
294void
Edric Milaret67007d12015-05-07 09:40:09 -0400295CallWidget::findRingAccount(QModelIndex idx1, QModelIndex idx2, QVector<int> vec)
296{
297 Q_UNUSED(idx1)
298 Q_UNUSED(idx2)
299 Q_UNUSED(vec)
300
Edric Milareta3e47282015-10-23 15:20:30 -0400301 auto a_count = AccountModel::instance().rowCount();
Edric Milaret67007d12015-05-07 09:40:09 -0400302 for (int i = 0; i < a_count; ++i) {
Edric Milareta3e47282015-10-23 15:20:30 -0400303 auto idx = AccountModel::instance().index(i, 0);
Edric Milaret67007d12015-05-07 09:40:09 -0400304 auto protocol = idx.data(static_cast<int>(Account::Role::Proto));
Edric Milaret74474f52016-05-16 13:36:23 -0400305 if (static_cast<Account::Protocol>(protocol.toUInt()) == Account::Protocol::RING) {
Anthony Léonarda86a8972016-12-15 10:33:47 -0500306 auto account = AccountModel::instance().getAccountByModelIndex(idx);
307 auto registeredName = account->registeredName();
Edric Milaret67007d12015-05-07 09:40:09 -0400308 auto username = idx.data(static_cast<int>(Account::Role::Username));
Anthony Léonarda86a8972016-12-15 10:33:47 -0500309 if (registeredName.isEmpty()) {
310 ui->ringIdLabel->setText(username.toString());
311 } else
312 ui->ringIdLabel->setText(registeredName);
313 setupQRCode(username.toString());
Anthony Léonardd47179c2017-03-28 10:39:10 -0400314
Edric Milaret67007d12015-05-07 09:40:09 -0400315 return;
316 }
317 }
Edric Milaret74474f52016-05-16 13:36:23 -0400318 ui->ringIdLabel->setText(tr("NO RING ACCOUNT FOUND"));
Edric Milaret67007d12015-05-07 09:40:09 -0400319}
320
Anthony Léonarda86a8972016-12-15 10:33:47 -0500321void CallWidget::setupQRCode(QString ringID)
Edric Milarete19c4cd2016-02-12 10:19:44 -0500322{
Anthony Léonarda86a8972016-12-15 10:33:47 -0500323 auto rcode = QRcode_encodeString(ringID.toStdString().c_str(),
Edric Milaret6d0e5312016-04-04 16:30:22 -0400324 0, //Let the version be decided by libqrencode
325 QR_ECLEVEL_L, // Lowest level of error correction
Edric Milarete19c4cd2016-02-12 10:19:44 -0500326 QR_MODE_8, // 8-bit data mode
327 1);
328 if (not rcode) {
329 qWarning() << "Failed to generate QR code: " << strerror(errno);
330 return;
331 }
332
333 auto margin = 5;
334 int qrwidth = rcode->width + margin * 2;
335 QImage result(QSize(qrwidth, qrwidth), QImage::Format_Mono);
336 QPainter painter;
337 painter.begin(&result);
338 painter.setClipRect(QRect(0, 0, qrwidth, qrwidth));
339 painter.setPen(QPen(Qt::black, 0.1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
340 painter.setBrush(Qt::black);
341 painter.fillRect(QRect(0, 0, qrwidth, qrwidth), Qt::white);
Edric Milaret74474f52016-05-16 13:36:23 -0400342 unsigned char* p;
Edric Milarete19c4cd2016-02-12 10:19:44 -0500343 p = rcode->data;
344 for(int y = 0; y < rcode->width; y++) {
Edric Milaret74474f52016-05-16 13:36:23 -0400345 unsigned char* row = (p + (y * rcode->width));
Edric Milarete19c4cd2016-02-12 10:19:44 -0500346 for(int x = 0; x < rcode->width; x++) {
347 if(*(row + x) & 0x1) {
348 painter.drawRect(margin + x, margin + y, 1, 1);
349 }
350 }
351
352 }
353 painter.end();
354 QRcode_free(rcode);
Edric Milaret6d0e5312016-04-04 16:30:22 -0400355 ui->qrLabel->setPixmap(QPixmap::fromImage(result.scaled(QSize(qrSize_, qrSize_), Qt::KeepAspectRatio)));
Edric Milarete19c4cd2016-02-12 10:19:44 -0500356}
357
Edric Milaret67007d12015-05-07 09:40:09 -0400358void
359CallWidget::findRingAccount()
360{
Anthony Léonard314c2a42016-10-20 10:39:56 -0400361 ui->ringIdLabel->clear();
Edric Milaret57467842016-08-30 13:06:11 -0400362
Edric Milareta3e47282015-10-23 15:20:30 -0400363 auto a_count = AccountModel::instance().rowCount();
Edric Milaret627500d2015-03-27 16:41:40 -0400364 for (int i = 0; i < a_count; ++i) {
Edric Milareta3e47282015-10-23 15:20:30 -0400365 auto idx = AccountModel::instance().index(i, 0);
Edric Milaret627500d2015-03-27 16:41:40 -0400366 auto protocol = idx.data(static_cast<int>(Account::Role::Proto));
Edric Milaret74474f52016-05-16 13:36:23 -0400367 if (static_cast<Account::Protocol>(protocol.toUInt()) == Account::Protocol::RING) {
Edric Milareta3e47282015-10-23 15:20:30 -0400368 auto account = AccountModel::instance().getAccountByModelIndex(idx);
Edric Milaret68779c42015-07-09 16:53:03 -0400369 if (account->displayName().isEmpty())
370 account->displayName() = account->alias();
Edric Milaret57467842016-08-30 13:06:11 -0400371 if (account->needsMigration()) {
372 WizardDialog dlg(WizardDialog::MIGRATION, account);
373 dlg.exec();
374 }
375 if (ui->ringIdLabel->text().isEmpty()) {
Anthony Léonarda86a8972016-12-15 10:33:47 -0500376 auto registeredName = account->registeredName();
377 ui->ringIdLabel->setText((registeredName.isEmpty())?account->username():registeredName);
378 setupQRCode(account->username());
Edric Milaret57467842016-08-30 13:06:11 -0400379 }
Edric Milaret627500d2015-03-27 16:41:40 -0400380 }
381 }
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400382
Edric Milaret57467842016-08-30 13:06:11 -0400383 if (ui->ringIdLabel->text().isEmpty()) {
384 ui->ringIdLabel->setText(tr("NO RING ACCOUNT FOUND"));
385 WizardDialog wizardDialog;
386 wizardDialog.exec();
387 }
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400388
389 ui->currentAccountWidget->update();
390
Edric Milaret627500d2015-03-27 16:41:40 -0400391}
392
393void
Edric Milaret00d34f22016-05-09 16:30:29 -0400394CallWidget::callChangedSlot()
395{
396 if (not actualCall_)
397 return;
Edric Milaret41941582016-09-14 12:59:04 -0400398 ui->callerIdLabel->setText(QString("%1")
Edric Milaret00d34f22016-05-09 16:30:29 -0400399 .arg(actualCall_->formattedName()));
400 ui->callerPhoto->setPixmap(
401 QPixmap::fromImage(
402 GlobalInstances::pixmapManipulator()
403 .callPhoto(actualCall_, QSize(130,130)).value<QImage>()));
Olivier SOLDANO2f9e6702016-11-02 14:20:57 -0400404
Olivier SOLDANO02971ce2016-11-04 15:38:29 -0400405 if(actualCall_->state() == Call::State::OVER || actualCall_->state() == Call::State::FAILURE){
Olivier SOLDANO2f9e6702016-11-02 14:20:57 -0400406 ui->outboundCallLabel->setText(actualCall_->toHumanStateName(Call::State::INITIALIZATION));
407 } else {
408 ui->outboundCallLabel->setText(actualCall_->toHumanStateName());
409 }
Edric Milaret00d34f22016-05-09 16:30:29 -0400410}
411
412void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500413CallWidget::callIncoming(Call* call)
Edric Milaret627500d2015-03-27 16:41:40 -0400414{
Edric Milaret00a32252016-01-19 10:37:13 -0500415 if (!QApplication::focusWidget()) {
416 GlobalSystemTray::instance()
417 .showMessage("Ring",
418 QString(tr("Call incoming from %1")).arg(call->formattedName()));
Edric Milaret2cf34292015-06-22 16:27:03 -0400419 QApplication::alert(this, 5000);
420 }
421
Edric Milaret6456baa2015-05-21 12:18:07 -0400422 setActualCall(call);
Edric Milaret627500d2015-03-27 16:41:40 -0400423}
424
425void
426CallWidget::on_acceptButton_clicked()
427{
428 if (actualCall_ != nullptr)
Edric Milaret53f57b62015-05-11 11:02:17 -0400429 actualCall_->performAction(Call::Action::ACCEPT);
Edric Milaret627500d2015-03-27 16:41:40 -0400430}
431
432void
433CallWidget::on_refuseButton_clicked()
434{
435 if (actualCall_ == nullptr)
436 return;
437 actualCall_->performAction(Call::Action::REFUSE);
Nicolas Jager13745062016-02-12 18:56:40 -0500438 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
Edric Milaret6456baa2015-05-21 12:18:07 -0400439 setActualCall(nullptr);
Edric Milaret627500d2015-03-27 16:41:40 -0400440}
441
442void
Edric Milaret67007d12015-05-07 09:40:09 -0400443CallWidget::callStateChanged(Call* call, Call::State previousState)
444{
Edric Milaret627500d2015-03-27 16:41:40 -0400445 Q_UNUSED(previousState)
Edric Milaret4b1be4a2016-01-15 16:49:20 -0500446 if (call == nullptr
447 || call != actualCall_)
Edric Milaretb5b49072015-05-08 11:56:07 -0400448 return;
Edric Milareted0b2802015-10-01 15:10:02 -0400449
Olivier SOLDANOea6d71b2016-11-16 15:56:59 -0500450 callStateToView(call);
451
Edric Milaret4b1be4a2016-01-15 16:49:20 -0500452 if (call->state() == Call::State::OVER) {
Edric Milaret6456baa2015-05-21 12:18:07 -0400453 setActualCall(nullptr);
Olivier SOLDANOea6d71b2016-11-16 15:56:59 -0500454 ui->smartList->clearSelection();
Edric Milaret6b68a482016-02-01 15:23:44 -0500455 RecentModel::instance().selectionModel()->clear();
Edric Milaret627500d2015-03-27 16:41:40 -0400456 }
Edric Milaret627500d2015-03-27 16:41:40 -0400457}
458
459void
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400460CallWidget::atExit()
461{
Edric Milaret627500d2015-03-27 16:41:40 -0400462}
Edric Milaret67007d12015-05-07 09:40:09 -0400463
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400464void
465CallWidget::callStateToView(Call* value)
Edric Milaret6b68a482016-02-01 15:23:44 -0500466{
467 if (value) {
468 switch (value->state()) {
469 case Call::State::INCOMING:
470 if (not value->account()->isAutoAnswer())
471 ui->stackedWidget->setCurrentWidget(ui->callInvitePage);
472 else
473 ui->stackedWidget->setCurrentWidget(ui->videoPage);
474 break;
475 case Call::State::CURRENT:
Edric Milareta86e3f52016-03-14 16:28:57 -0400476 case Call::State::CONFERENCE:
Edric Milaret854c6b44d2016-03-08 11:00:48 -0500477 case Call::State::HOLD:
Edric Milaret6b68a482016-02-01 15:23:44 -0500478 ui->stackedWidget->setCurrentWidget(ui->videoPage);
479 break;
Olivier SOLDANO02971ce2016-11-04 15:38:29 -0400480 case Call::State::OVER:
Olivier SOLDANOea6d71b2016-11-16 15:56:59 -0500481 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
Olivier SOLDANO02971ce2016-11-04 15:38:29 -0400482 break;
Olivier SOLDANO2f9e6702016-11-02 14:20:57 -0400483 case Call::State::FAILURE:
484 case Call::State::ERROR:
Olivier SOLDANO02971ce2016-11-04 15:38:29 -0400485 on_cancelButton_clicked();
Edric Milaret6b68a482016-02-01 15:23:44 -0500486 break;
487 case Call::State::INITIALIZATION:
488 case Call::State::CONNECTED:
489 case Call::State::RINGING:
Edric Milaret6b68a482016-02-01 15:23:44 -0500490 ui->stackedWidget->setCurrentWidget(ui->outboundCallPage);
491 break;
492 default:
Edric Milaret854c6b44d2016-03-08 11:00:48 -0500493 qWarning() << "Call state not handled doing nothing : "
494 << value->toHumanStateName();
Edric Milaret6b68a482016-02-01 15:23:44 -0500495 break;
496 }
Nicolas Jager13745062016-02-12 18:56:40 -0500497 }
Edric Milaret6b68a482016-02-01 15:23:44 -0500498}
499
Edric Milaret6456baa2015-05-21 12:18:07 -0400500void
501CallWidget::setActualCall(Call* value)
502{
503 actualCall_ = value;
Edric Milaret80e0b212015-10-16 10:07:43 -0400504 CallModel::instance().selectCall(value);
505 ui->videoWidget->pushRenderer(value);
Edric Milareta86e3f52016-03-14 16:28:57 -0400506 ui->instantMessagingWidget->setMediaText(actualCall_);
Edric Milaret6b68a482016-02-01 15:23:44 -0500507 callStateToView(value);
Edric Milaret00d34f22016-05-09 16:30:29 -0400508 if (actualCall_) {
509 callChangedConnection_ = connect(actualCall_,
510 SIGNAL(changed()),
511 this,
512 SLOT(callChangedSlot()));
513 } else
514 disconnect(callChangedConnection_);
515
Edric Milaret6456baa2015-05-21 12:18:07 -0400516}
Edric Milaretc7ab5502015-06-15 11:18:02 -0400517
518void
Edric Milareted0b2802015-10-01 15:10:02 -0400519CallWidget::on_cancelButton_clicked()
Edric Milaretd8528fa2015-07-07 14:13:51 -0400520{
Olivier SOLDANO2f9e6702016-11-02 14:20:57 -0400521 if (actualCall_){
Edric Milaretd8528fa2015-07-07 14:13:51 -0400522 actualCall_->performAction(Call::Action::REFUSE);
Olivier SOLDANO2f9e6702016-11-02 14:20:57 -0400523 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
524 }
Edric Milaretd8528fa2015-07-07 14:13:51 -0400525}
Edric Milareted0b2802015-10-01 15:10:02 -0400526
527void
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400528CallWidget::on_smartList_clicked(const QModelIndex& index)
529{
530 RecentModel::instance().selectionModel()->setCurrentIndex(
531 RecentModel::instance().peopleProxy()->mapToSource(index),
532 QItemSelectionModel::ClearAndSelect);
533}
534
535void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500536CallWidget::on_smartList_doubleClicked(const QModelIndex& index)
Edric Milareted0b2802015-10-01 15:10:02 -0400537{
Edric Milareta3e47282015-10-23 15:20:30 -0400538 auto realIndex = RecentModel::instance().peopleProxy()->mapToSource(index);
539 if (RecentModel::instance().hasActiveCall(realIndex))
Edric Milareted0b2802015-10-01 15:10:02 -0400540 return;
541
542 ContactMethod* m = nullptr;
543 if (auto cm = realIndex.data((int)Call::Role::ContactMethod).value<ContactMethod*>()) {
544 m = cm;
545 } else {
546 if (auto person = realIndex.data((int)Person::Role::Object).value<Person*>()) {
547 m = person->phoneNumbers().first();
548 }
549 }
Olivier SOLDANOad0fabb2016-11-25 09:08:01 -0500550
Edric Milareta3e47282015-10-23 15:20:30 -0400551 if (m && !RecentModel::instance().index(0, 0, realIndex).isValid()) {
Olivier SOLDANOad0fabb2016-11-25 09:08:01 -0500552
553 QPixmap map = QPixmap::fromImage(
554 GlobalInstances::pixmapManipulator().callPhoto(m, QSize(130,130)).value<QImage>());
555 ui->callingPhoto->setPixmap(map);
556
Edric Milareta3e47282015-10-23 15:20:30 -0400557 Call* c = CallModel::instance().dialingCall(m);
Edric Milareted0b2802015-10-01 15:10:02 -0400558 c->performAction(Call::Action::ACCEPT);
Edric Milaret6b68a482016-02-01 15:23:44 -0500559 setActualCall(c);
Edric Milareted0b2802015-10-01 15:10:02 -0400560 }
561}
562
563void
Olivier SOLDANO61065ec2016-11-11 16:31:34 -0500564CallWidget::smartListCurrentChanged(const QModelIndex &currentIdx, const QModelIndex &previousIdx)
565{
566 Q_UNUSED(previousIdx);
567 if (not currentIdx.isValid())
Edric Milareted0b2802015-10-01 15:10:02 -0400568 return;
569
Olivier SOLDANO703caba2016-11-15 16:18:55 -0500570 //catch call of current index
Olivier SOLDANO61065ec2016-11-11 16:31:34 -0500571 auto currentIdxCall = RecentModel::instance().getActiveCall(currentIdx);
Olivier SOLDANO703caba2016-11-15 16:18:55 -0500572
573 if (currentIdxCall && currentIdxCall != actualCall_) { //if it is different from actual call, switch between the two
Olivier SOLDANO61065ec2016-11-11 16:31:34 -0500574 setActualCall(currentIdxCall);
Olivier SOLDANO703caba2016-11-15 16:18:55 -0500575 } else if (currentIdxCall == nullptr){ // if there is no call attached to this smartlist index (contact tab)
Edric Milareta0ebd062016-01-13 12:18:23 -0500576 setActualCall(nullptr);
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400577 showIMOutOfCall(currentIdx); // change page to contact request of messaging page with correct behaviour
Olivier SOLDANO703caba2016-11-15 16:18:55 -0500578 } else { // if non defined behaviour disconnect instant messaging and return to welcome page
Edric Milareted0b2802015-10-01 15:10:02 -0400579 setActualCall(nullptr);
Edric Milaret7ef617b2016-02-01 15:40:57 -0500580 if (imConnection_)
581 disconnect(imConnection_);
Edric Milareted0b2802015-10-01 15:10:02 -0400582 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
583 }
584}
585
586void
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400587CallWidget::configureSendCRPageButton(const QModelIndex& currentIdx)
588{
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400589 if (currentIdx.isValid()){
590 QVector<ContactMethod*> cmVector = RecentModel::instance().getContactMethods(currentIdx);
591 if (cmVector.size() == 0){
592 ui->sendContactRequestPageButton->hide();
593 return;
594 }
595
596 URI cmUri = cmVector[0]->uri();
597 if (cmUri.protocolHint() == URI::ProtocolHint::RING || uriNeedNameLookup(cmUri)) {
598 ui->sendContactRequestPageButton->show();
599 } else {
600 ui->sendContactRequestPageButton->hide();
601 }
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400602 } else {
603 ui->sendContactRequestPageButton->hide();
604 }
605}
606
607void
Anthony Léonardd47179c2017-03-28 10:39:10 -0400608CallWidget::contactReqListCurrentChanged(const QModelIndex &currentIdx, const QModelIndex &previousIdx)
609{
610 Q_UNUSED(previousIdx)
611
612 ContactRequest* cr = currentIdx.data((int)Ring::Role::Object).value<ContactRequest*>();
613 ui->contactRequestWidget->setCurrentContactRequest(cr);
614 ui->stackedWidget->setCurrentWidget(ui->contactRequestView);
615}
616
617void
Edric Milareted0b2802015-10-01 15:10:02 -0400618CallWidget::placeCall()
619{
Nicolas Jager97a21b42015-12-03 16:55:45 -0500620 if (ui->ringContactLineEdit->text().isEmpty())
Edric Milareted0b2802015-10-01 15:10:02 -0400621 return;
Nicolas Jager97a21b42015-12-03 16:55:45 -0500622 Call* c = CallModel::instance().dialingCall(PhoneDirectoryModel::instance().getNumber(ui->ringContactLineEdit->text()));
Edric Milareted0b2802015-10-01 15:10:02 -0400623 c->performAction(Call::Action::ACCEPT);
Nicolas Jager97a21b42015-12-03 16:55:45 -0500624 ui->ringContactLineEdit->clear();
Edric1bed3f92016-05-19 10:24:48 -0400625 ui->callingPhoto->setPixmap(
626 QPixmap::fromImage(
627 GlobalInstances::pixmapManipulator()
628 .callPhoto(c, QSize(130,130)).value<QImage>()));
Edric Milareted0b2802015-10-01 15:10:02 -0400629}
630
631void
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500632CallWidget::settingsButtonClicked()
Edric Milareted0b2802015-10-01 15:10:02 -0400633{
634 emit NavigationRequested(ScreenEnum::ConfScreen);
635}
636
637void
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400638CallWidget::searchContactLineEditEntry(const URI &uri)
639{
640 auto cm = PhoneDirectoryModel::instance().getNumber(uri);
641 // if its a new CM, bring it to the top
642 if (cm->lastUsed() == 0)
643 cm->setLastUsed(QDateTime::currentDateTime().toTime_t());
644
645 // select cm
646 RecentModel::instance().selectionModel()->setCurrentIndex(RecentModel::instance().getIndex(cm),
647 QItemSelectionModel::ClearAndSelect);
648 ui->ringContactLineEdit->clear();
649}
650
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400651bool
652CallWidget::uriNeedNameLookup(const URI uri_passed)
653{
654 if (uri_passed.protocolHint() == URI::ProtocolHint::RING_USERNAME ) {
655 return TRUE;
656 } else if (
657 uri_passed.protocolHint() != URI::ProtocolHint::RING && // not a RingID
658 uri_passed.schemeType() == URI::SchemeType::NONE // scheme type not specified
659 ){
660 // if no scheme type has been specified, determine ring vs sip by the first available account
661 auto idx = AvailableAccountModel::instance().index(0, 0);
662 if (idx.isValid()) {
663 auto account = idx.data((int)Ring::Role::Object).value<Account *>();
664 if (account && account->protocol() == Account::Protocol::RING)
665 return TRUE;
666 }
667 }
668
669 return FALSE;
670}
671
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400672void
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400673CallWidget::processContactLineEdit()
Nicolas Jager97a21b42015-12-03 16:55:45 -0500674{
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400675 auto contactLineText = ui->ringContactLineEdit->text();
676 URI uri_passed = URI(contactLineText);
Nicolas Jager5e845d52016-02-18 13:26:12 -0500677
Olivier SOLDANO63178ee2016-11-04 16:50:08 -0400678 if (!contactLineText.isNull() && !contactLineText.isEmpty()){
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400679 if (uriNeedNameLookup(uri_passed)){
Olivier SOLDANO63178ee2016-11-04 16:50:08 -0400680 NameDirectory::instance().lookupName(nullptr, QString(), uri_passed);
681 } else {
682 searchContactLineEditEntry(uri_passed);
683 }
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400684 }
Nicolas Jager97a21b42015-12-03 16:55:45 -0500685}
686
687void
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400688CallWidget::on_ringContactLineEdit_returnPressed()
Nicolas Jager97a21b42015-12-03 16:55:45 -0500689{
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400690 processContactLineEdit();
691}
692
693void
694CallWidget::searchBtnClicked()
695{
696 processContactLineEdit();
Nicolas Jager97a21b42015-12-03 16:55:45 -0500697}
698
699void
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500700CallWidget::btnComBarVideoClicked()
Nicolas Jager97a21b42015-12-03 16:55:45 -0500701{
702 if (not highLightedIndex_.isValid())
703 return;
704
705 on_smartList_doubleClicked(highLightedIndex_);
706}
Edric Milaretab12d022015-12-04 16:09:44 -0500707
708void
Anthony Léonardd47179c2017-03-28 10:39:10 -0400709CallWidget::selectedAccountChanged(const QModelIndex &current, const QModelIndex &previous)
710{
711 Q_UNUSED(previous)
712
713 if (current.isValid()) {
714 auto ac = AccountModel::instance().getAccountByModelIndex(current);
715
716 // First, we get back to the welcome view
717 if (ui->stackedWidget->currentWidget() != ui->welcomePage) {
718 slidePage(ui->welcomePage);
719 }
720
721 // Then, we update the pending CR list with those from the newly selected account
722 if (disconnect(crListSelectionConnection_)) {
723 // The selection model must be deleted by the application (see QT doc).
724 QItemSelectionModel* sMod = ui->contactReqList->selectionModel();
725 delete sMod;
726 }
727
728 ui->contactReqList->setModel(ac->pendingContactRequestModel());
729 crListSelectionConnection_ = connect(ui->contactReqList->selectionModel(), &QItemSelectionModel::currentChanged,
730 this, &CallWidget::contactReqListCurrentChanged);
731 }
732}
733
734void
Edric Milaret6b68a482016-02-01 15:23:44 -0500735CallWidget::showIMOutOfCall(const QModelIndex& nodeIdx)
Edric Milaretab12d022015-12-04 16:09:44 -0500736{
Edric Milaretab12d022015-12-04 16:09:44 -0500737 ui->contactMethodComboBox->clear();
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400738 configureSendCRPageButton(nodeIdx);
Edric Milareta0ebd062016-01-13 12:18:23 -0500739 ui->imNameLabel->setText(QString(tr("Conversation with %1", "%1 is the contact name"))
740 .arg(nodeIdx.data(static_cast<int>(Ring::Role::Name)).toString()));
Edric Milaretab12d022015-12-04 16:09:44 -0500741 auto cmVector = RecentModel::instance().getContactMethods(nodeIdx);
Edric Milareta0ebd062016-01-13 12:18:23 -0500742 ui->contactMethodComboBox->setEnabled(cmVector.size() > 1);
Edric Milaretab12d022015-12-04 16:09:44 -0500743 foreach (const ContactMethod* cm, cmVector) {
Edric Milareta0ebd062016-01-13 12:18:23 -0500744 ui->contactMethodComboBox->addItem(cm->uri());
Edric Milaretab12d022015-12-04 16:09:44 -0500745 }
Olivier SOLDANOad0fabb2016-11-25 09:08:01 -0500746 ui->stackedWidget->setCurrentWidget(ui->messagingPage);
Edric Milaret70ae8782016-04-18 16:10:44 -0400747 disconnect(imClickedConnection_);
748 imClickedConnection_ = connect(ui->listMessageView, &QListView::clicked, [this](const QModelIndex& index) {
749 auto urlList = index.data(static_cast<int>(Media::TextRecording::Role::LinkList)).value<QList<QUrl>>();
750 if (urlList.size() == 1)
751 QDesktopServices::openUrl(urlList.at(0));
752 else if (urlList.size()) {
753 //TODO Handle multiple url in one message
754 }
755 });
Edric Milaretab12d022015-12-04 16:09:44 -0500756}
757
758void
Edric Milaret6a785af2016-03-07 15:39:30 -0500759CallWidget::on_sendIMButton_clicked()
Edric Milaretab12d022015-12-04 16:09:44 -0500760{
Edric Milaret6a785af2016-03-07 15:39:30 -0500761 if (ui->imMessageEdit->text().trimmed().isEmpty())
Edric Milaretab12d022015-12-04 16:09:44 -0500762 return;
763 auto number = ui->contactMethodComboBox->currentText();
764 if (auto cm = PhoneDirectoryModel::instance().getNumber(number)) {
765 QMap<QString, QString> msg;
Edric Milaret6a785af2016-03-07 15:39:30 -0500766 msg["text/plain"] = ui->imMessageEdit->text();
Edric Milaretab12d022015-12-04 16:09:44 -0500767 cm->sendOfflineTextMessage(msg);
Edric Milaret6a785af2016-03-07 15:39:30 -0500768 ui->imMessageEdit->clear();
Edric Milaretab12d022015-12-04 16:09:44 -0500769 } else {
770 qWarning() << "Contact Method not found for " << number;
771 }
772}
773
774void
Edric Milaret6a785af2016-03-07 15:39:30 -0500775CallWidget::on_imMessageEdit_returnPressed()
Edric Milaretab12d022015-12-04 16:09:44 -0500776{
Edric Milaret6a785af2016-03-07 15:39:30 -0500777 on_sendIMButton_clicked();
Edric Milaretab12d022015-12-04 16:09:44 -0500778}
779
780void
781CallWidget::on_contactMethodComboBox_currentIndexChanged(const QString& number)
782{
783 auto cm = PhoneDirectoryModel::instance().getNumber(number);
784 if (auto txtRecording = cm->textRecording()) {
785 ui->listMessageView->setModel(txtRecording->instantMessagingModel());
Edric Milaret7ef617b2016-02-01 15:40:57 -0500786 if (imConnection_)
787 disconnect(imConnection_);
Edric Milaretab12d022015-12-04 16:09:44 -0500788 imConnection_ = connect(txtRecording,
Edric Milareta0ebd062016-01-13 12:18:23 -0500789 SIGNAL(messageInserted(QMap<QString,QString>,ContactMethod*,Media::Media::Direction)),
790 this,
791 SLOT(slotAccountMessageReceived(QMap<QString,QString>,ContactMethod*,Media::Media::Direction)));
Edric Milaret4be72022016-01-19 10:24:13 -0500792 auto messagesPresent = txtRecording->instantMessagingModel()->rowCount() > 0;
793 if (messagesPresent) {
794 ui->listMessageView->scrollToBottom();
795 txtRecording->setAllRead();
796 }
797 ui->listMessageView->setVisible(messagesPresent);
798 ui->noMessagesLabel->setVisible(!messagesPresent);
799 if (not messagesPresent) {
Edric Milaret49130472016-01-22 10:39:37 -0500800 imVisibleConnection_ = connect(txtRecording->instantMessagingModel(),
801 &QAbstractItemModel::rowsInserted,
802 [this, txtRecording]() {
803 if (imVisibleConnection_)
804 disconnect(imVisibleConnection_);
805 auto messagesPresent = txtRecording->instantMessagingModel()->rowCount() > 0;
Edric Milaret4be72022016-01-19 10:24:13 -0500806 ui->listMessageView->setVisible(messagesPresent);
807 ui->noMessagesLabel->setVisible(!messagesPresent);
Edric Milaret4be72022016-01-19 10:24:13 -0500808 });
809 }
Edric Milaretab12d022015-12-04 16:09:44 -0500810 }
811}
812
813void
814CallWidget::slotAccountMessageReceived(const QMap<QString,QString> message,
815 ContactMethod* cm,
816 Media::Media::Direction dir)
817{
818 Q_UNUSED(message)
Edric Milaretab12d022015-12-04 16:09:44 -0500819 Q_UNUSED(dir)
820
821 ui->listMessageView->scrollToBottom();
Edric Milaret23fd3fa2016-01-15 15:37:35 -0500822 cm->textRecording()->setAllRead();
Edric Milaretab12d022015-12-04 16:09:44 -0500823}
Edric Milaretfa05d972016-01-13 16:22:04 -0500824
825void
Edric Milaret8001f6f2016-01-27 09:55:12 -0500826CallWidget::on_ringContactLineEdit_textChanged(const QString& text)
Edric Milaretfa05d972016-01-13 16:22:04 -0500827{
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400828 RecentModel::instance().peopleProxy()->setFilterRegExp(QRegExp(text, Qt::CaseInsensitive, QRegExp::FixedString));
Edric Milaretfa05d972016-01-13 16:22:04 -0500829}
Edric Milareta0ebd062016-01-13 12:18:23 -0500830
Nicolas Jagerca850292016-01-17 14:11:10 -0500831void
832CallWidget::on_imBackButton_clicked()
Edric Milareta0ebd062016-01-13 12:18:23 -0500833{
Edric Milaret6b68a482016-02-01 15:23:44 -0500834 RecentModel::instance().selectionModel()->clear();
835 slidePage(ui->welcomePage);
Nicolas Jagerca850292016-01-17 14:11:10 -0500836}
837
838void
Edric Milaret6b68a482016-02-01 15:23:44 -0500839CallWidget::slidePage(QWidget* widget, bool toRight)
Nicolas Jagerca850292016-01-17 14:11:10 -0500840{
Edric Milaret6b68a482016-02-01 15:23:44 -0500841 short dir = (toRight ? -1 : 1);
Nicolas Jagerca850292016-01-17 14:11:10 -0500842 ui->stackedWidget->setCurrentWidget(widget);
Edric Milaret6b68a482016-02-01 15:23:44 -0500843 pageAnim_->setTargetObject(widget);
844 pageAnim_->setDuration(animDuration_);
845 pageAnim_->setStartValue(QPoint(widget->width() * dir, widget->y()));
846 pageAnim_->setEndValue(QPoint(widget->x(), widget->y()));
847 pageAnim_->setEasingCurve(QEasingCurve::OutQuad);
848 pageAnim_->start();
Nicolas Jagerca850292016-01-17 14:11:10 -0500849}
850
851void
Edric Milaret7cf39e22016-02-02 12:44:03 -0500852CallWidget::on_copyCMButton_clicked()
853{
854 auto text = ui->contactMethodComboBox->currentText();
855 QApplication::clipboard()->setText(text);
856}
Edric Milaret4097d2f2016-02-09 14:41:50 -0500857
858void
Edric Milaret1e598592016-09-02 10:10:01 -0400859CallWidget::on_qrButton_toggled(bool checked)
860{
861 ui->qrLabel->setVisible(checked);
862}
863
864void
Edric Milaret4097d2f2016-02-09 14:41:50 -0500865CallWidget::on_shareButton_clicked()
866{
Edric Milaret1e598592016-09-02 10:10:01 -0400867 Utils::InvokeMailto(tr("Contact me on Ring"), tr("My RingId is : ") + ui->ringIdLabel->text());
Edric Milaret4097d2f2016-02-09 14:41:50 -0500868}
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400869
870void
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400871CallWidget::contactLineEdit_registeredNameFound(Account* account,NameDirectory::LookupStatus status,
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400872 const QString& address,const QString& name)
873{
874 URI uri = URI(ui->ringContactLineEdit->text());
875 QString username_to_lookup = uri.userinfo();
876
877 if (username_to_lookup.compare(name) != 0){
878 return;
879 }
880
881 switch (status)
882 {
883 case NameDirectory::LookupStatus::SUCCESS:
884 {
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400885
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400886 uri = URI("ring:" + address);
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400887 qDebug() << "contactLineEdit username to search: " << username_to_lookup;
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400888 qDebug() << uri;
889 searchContactLineEditEntry(uri);
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400890 auto cm = PhoneDirectoryModel::instance().getNumber(uri);
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400891 cm->setAccount(account);
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400892 break;
893 }
894 case NameDirectory::LookupStatus::INVALID_NAME:
895 {
896 qDebug() << "Invalid Ring username";
897 break;
898 }
899 case NameDirectory::LookupStatus::ERROR:
900 case NameDirectory::LookupStatus::NOT_FOUND:
901 default:
902 {
903 qDebug() << "Could not resolve Ring username";
904 break;
905 }
906 }
907}
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400908
909void
910CallWidget::on_sendContactRequestPageButton_clicked()
911{
912 ui->sendContactRequestWidget->sendCR(RecentModel::instance().selectionModel()->currentIndex());
913 // temporarly changed comportment waiting for message in payload implementation
914 /*ui->sendContactRequestWidget->setup(RecentModel::instance().selectionModel()->currentIndex());
915 slidePage(ui->sendContactRequestPage);*/
916}
917
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400918void
919CallWidget::on_sendCRBackButton_clicked()
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400920{
921 slidePage(ui->messagingPage);
922}
Anthony Léonardd47179c2017-03-28 10:39:10 -0400923
924void
925CallWidget::on_pendingCRBackButton_clicked()
926{
927 ui->contactReqList->selectionModel()->clear();
928 slidePage(ui->welcomePage);
929}