blob: 51bca6d5390ce6aa5b57473a10452a35778f3398 [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Anthony Léonard2fde81d2017-04-17 10:06:55 -04002 * Copyright (C) 2015-2017 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"
Anthony Léonardf95f7f62017-04-04 11:01:51 -040061#include "contactrequestitemdelegate.h"
Edric Milaret627500d2015-03-27 16:41:40 -040062
Edric Milaret25236d92016-03-28 09:40:58 -040063#include "profilemodel.h"
Olivier SOLDANO9657fd12017-03-27 16:06:53 -040064#include "profile.h"
Edric Milaret25236d92016-03-28 09:40:58 -040065#include "peerprofilecollection.h"
66#include "localprofilecollection.h"
67
Nicolas Jager97a21b42015-12-03 16:55:45 -050068CallWidget::CallWidget(QWidget* parent) :
Nicolas Jager74fe46f2016-02-29 14:55:09 -050069 NavWidget(parent),
Edric Milaret7d40a4a2015-05-13 13:01:15 -040070 ui(new Ui::CallWidget),
Edric Milaretab12d022015-12-04 16:09:44 -050071 menu_(new QMenu()),
72 imDelegate_(new ImDelegate())
Edric Milaret627500d2015-03-27 16:41:40 -040073{
74 ui->setupUi(this);
75
Edric Milaret6b68a482016-02-01 15:23:44 -050076 pageAnim_ = new QPropertyAnimation(ui->welcomePage, "pos", this);
Nicolas Jagerca850292016-01-17 14:11:10 -050077
Edric Milaret6456baa2015-05-21 12:18:07 -040078 setActualCall(nullptr);
Edric Milaret627500d2015-03-27 16:41:40 -040079 videoRenderer_ = nullptr;
80
Nicolas Jager74fe46f2016-02-29 14:55:09 -050081 connect(ui->settingsButton, &QPushButton::clicked, this, &CallWidget::settingsButtonClicked);
82
Edric Milaret3aca8e32015-06-12 10:01:40 -040083 connect(ui->videoWidget, SIGNAL(setChatVisibility(bool)),
84 ui->instantMessagingWidget, SLOT(setVisible(bool)));
85
Edric Milareted0b2802015-10-01 15:10:02 -040086 QPixmap logo(":/images/logo-ring-standard-coul.png");
87 ui->ringLogo->setPixmap(logo.scaledToHeight(100, Qt::SmoothTransformation));
88 ui->ringLogo->setAlignment(Qt::AlignHCenter);
89
Edric Milaret1e598592016-09-02 10:10:01 -040090 ui->qrLabel->hide();
Edric Milarete19c4cd2016-02-12 10:19:44 -050091
Edric Milareta0ebd062016-01-13 12:18:23 -050092 GlobalInstances::setPixmapManipulator(std::unique_ptr<Interfaces::PixbufManipulator>(new Interfaces::PixbufManipulator()));
93
Edric Milaret627500d2015-03-27 16:41:40 -040094 try {
Edric Milareta3e47282015-10-23 15:20:30 -040095 callModel_ = &CallModel::instance();
Edric Milaret627500d2015-03-27 16:41:40 -040096
97 connect(callModel_, SIGNAL(incomingCall(Call*)),
98 this, SLOT(callIncoming(Call*)));
Edric Milaret627500d2015-03-27 16:41:40 -040099 connect(callModel_, SIGNAL(callStateChanged(Call*, Call::State)),
100 this, SLOT(callStateChanged(Call*, Call::State)));
101
Edric Milaretfa05d972016-01-13 16:22:04 -0500102 RecentModel::instance().peopleProxy()->setFilterRole(static_cast<int>(Ring::Role::Name));
103 RecentModel::instance().peopleProxy()->setFilterCaseSensitivity(Qt::CaseInsensitive);
Edric Milareta3e47282015-10-23 15:20:30 -0400104 ui->smartList->setModel(RecentModel::instance().peopleProxy());
Edric Milaret6816fd72016-01-29 16:36:24 -0500105
Edric Milaret25236d92016-03-28 09:40:58 -0400106 PersonModel::instance().addCollection<PeerProfileCollection>(LoadOptions::FORCE_ENABLED);
107 ProfileModel::instance().addCollection<LocalProfileCollection>(LoadOptions::FORCE_ENABLED);
108
Edric Milareta3e47282015-10-23 15:20:30 -0400109 PersonModel::instance().
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400110 addCollection<WindowsContactBackend>(LoadOptions::FORCE_ENABLED);
111
Edric Milaret6b68a482016-02-01 15:23:44 -0500112 connect(ui->smartList, &QTreeView::entered, this, &CallWidget::on_entered);
113
114 smartListDelegate_ = new SmartListDelegate();
115 ui->smartList->setSmartListItemDelegate(smartListDelegate_);
116
Edric Milaret627500d2015-03-27 16:41:40 -0400117 findRingAccount();
Edric Milareta0ebd062016-01-13 12:18:23 -0500118 setupOutOfCallIM();
119 setupSmartListMenu();
Edric Milaret627500d2015-03-27 16:41:40 -0400120
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500121 connect(ui->smartList, &SmartList::btnVideoClicked, this, &CallWidget::btnComBarVideoClicked);
Nicolas Jager41e4fcf2016-01-28 11:37:03 -0500122
Edric Milaret6b68a482016-02-01 15:23:44 -0500123 connect(RecentModel::instance().selectionModel(),
Olivier SOLDANO61065ec2016-11-11 16:31:34 -0500124 SIGNAL(currentChanged(QModelIndex,QModelIndex)),
125 this,
126 SLOT(smartListCurrentChanged(QModelIndex,QModelIndex)));
127
Olivier SOLDANOea6d71b2016-11-16 15:56:59 -0500128 connect(RecentModel::instance().selectionModel(), &QItemSelectionModel::selectionChanged, [=](const QItemSelection &selected, const QItemSelection &deselected) {
129 // lambda used to focus on the correct smartList element when switching automatically between two calls
130 Q_UNUSED(deselected)
131 if (selected.size()) {
132 auto idx = selected.indexes().first();
133 auto realIdx = RecentModel::instance().peopleProxy()->mapFromSource(idx);
134 ui->smartList->selectionModel()->setCurrentIndex(realIdx, QItemSelectionModel::ClearAndSelect);
135 } else
136 ui->smartList->clearSelection();
137 });
138
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400139 connect(&NameDirectory::instance(), SIGNAL(registeredNameFound(Account*,NameDirectory::LookupStatus,const QString&,const QString&)),
140 this, SLOT(contactLineEdit_registeredNameFound(Account*,NameDirectory::LookupStatus,const QString&,const QString&)));
141
142 connect(&AccountModel::instance(), SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)),
143 ui->currentAccountWidget, SLOT(update()));
144
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400145 connect(ui->searchBtn, SIGNAL(clicked(bool)), this, SLOT(searchBtnClicked()));
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400146
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400147 connect(ui->sendContactRequestWidget, &SendContactRequestWidget::sendCRclicked, [=]{slidePage(ui->messagingPage);});
148
Anthony Léonardd47179c2017-03-28 10:39:10 -0400149 connect(ui->contactRequestWidget, &ContactRequestWidget::choiceMade, [this]() {
150 slidePage(ui->welcomePage);
151 });
152
153 connect(AccountModel::instance().userSelectionModel(), &QItemSelectionModel::currentChanged,
154 this, &CallWidget::selectedAccountChanged);
155
Anthony Léonardf95f7f62017-04-04 11:01:51 -0400156 ui->contactReqList->setItemDelegate(new ContactRequestItemDelegate());
157
Anthony Léonardd47179c2017-03-28 10:39:10 -0400158 // It needs to be called manually once to initialize the ui with the account selected at start.
159 // The second argument (previous) is set to an invalid QModelIndex as it is the first selection.
160 selectedAccountChanged(AccountModel::instance().userSelectionModel()->currentIndex(), QModelIndex());
161
Edric Milaret80e0b212015-10-16 10:07:43 -0400162 } catch (const std::exception& e) {
163 qDebug() << "INIT ERROR" << e.what();
Edric Milaret627500d2015-03-27 16:41:40 -0400164 }
165}
166
167CallWidget::~CallWidget()
168{
169 delete ui;
Edric Milaretc7ab5502015-06-15 11:18:02 -0400170 delete menu_;
Edric Milaretab12d022015-12-04 16:09:44 -0500171 delete imDelegate_;
Edric Milaret6b68a482016-02-01 15:23:44 -0500172 delete pageAnim_;
173 delete smartListDelegate_;
Edric Milarete19c4cd2016-02-12 10:19:44 -0500174 delete shareMenu_;
175}
176
177void
Edric Milareta0ebd062016-01-13 12:18:23 -0500178CallWidget::setupOutOfCallIM()
179{
180 ui->listMessageView->setItemDelegate(imDelegate_);
181 ui->listMessageView->setContextMenuPolicy(Qt::ActionsContextMenu);
182
183 auto copyAction = new QAction(tr("Copy"), this);
184 ui->listMessageView->addAction(copyAction);
185 connect(copyAction, &QAction::triggered, [=]() {
186 auto idx = ui->listMessageView->currentIndex();
187 if (idx.isValid()) {
188 auto text = ui->listMessageView->model()->data(idx);
189 QApplication::clipboard()->setText(text.value<QString>());
190 }
191 });
Edric Milaret70ae8782016-04-18 16:10:44 -0400192 QSettings settings;
Edric Milareta0ebd062016-01-13 12:18:23 -0500193 auto displayDate = new QAction(tr("Display date"), this);
194 displayDate->setCheckable(true);
Edric Milaret70ae8782016-04-18 16:10:44 -0400195 displayDate->setChecked(settings.value(SettingsKey::imShowDate).toBool());
Edric Milareta0ebd062016-01-13 12:18:23 -0500196 ui->listMessageView->addAction(displayDate);
197 auto displayAuthor = new QAction(tr("Display author"), this);
198 displayAuthor->setCheckable(true);
Edric Milaret70ae8782016-04-18 16:10:44 -0400199 displayAuthor->setChecked(settings.value(SettingsKey::imShowAuthor).toBool());
Edric Milareta0ebd062016-01-13 12:18:23 -0500200 ui->listMessageView->addAction(displayAuthor);
201 auto lamdba = [=](){
Edric Milaret70ae8782016-04-18 16:10:44 -0400202 QSettings settings;
203 settings.setValue(SettingsKey::imShowAuthor, displayAuthor->isChecked());
204 settings.setValue(SettingsKey::imShowDate, displayDate->isChecked());
205 emit imDelegate_->sizeHintChanged(QModelIndex());
Edric Milareta0ebd062016-01-13 12:18:23 -0500206 };
207 connect(displayAuthor, &QAction::triggered, lamdba);
208 connect(displayDate, &QAction::triggered, lamdba);
Edric Milaret00a32252016-01-19 10:37:13 -0500209
210 connect(&::Media::RecordingModel::instance(),
211 SIGNAL(newTextMessage(::Media::TextRecording*, ContactMethod*)),
212 this,
213 SLOT(onIncomingMessage(::Media::TextRecording*, ContactMethod*)));
214}
215
216void
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400217CallWidget::onIncomingMessage(::Media::TextRecording* t, ContactMethod* cm)
218{
Edric Milaret00a32252016-01-19 10:37:13 -0500219 Q_UNUSED(cm)
220
221 if (!QApplication::focusWidget()) {
222 auto idx = t->instantTextMessagingModel()->
223 index(t->instantTextMessagingModel()->rowCount()-1, 0);
224 GlobalSystemTray::instance()
225 .showMessage("Ring",
226 QString(tr("Message incoming from %1")).arg(
227 idx.data((int)Media::TextRecording::Role::AuthorDisplayname).toString()));
228 QApplication::alert(this, 5000);
229 }
Edric Milareta0ebd062016-01-13 12:18:23 -0500230}
231
232void
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400233CallWidget::setupSmartListMenu()
234{
Edric Milareta0ebd062016-01-13 12:18:23 -0500235 ui->smartList->setContextMenuPolicy(Qt::CustomContextMenu);
236 connect(ui->smartList, &QListView::customContextMenuRequested, [=](const QPoint& pos){
237 auto idx = ui->smartList->currentIndex();
238 if (not idx.isValid())
239 return;
240 QPoint globalPos = ui->smartList->mapToGlobal(pos);
241 QMenu menu;
242
Edric Milaret9949b342016-02-02 12:25:08 -0500243 QVector<ContactMethod*> contactMethods = RecentModel::instance()
244 .getContactMethods(RecentModel::instance().peopleProxy()->mapToSource(idx));
245 if (contactMethods.isEmpty())
Edric Milareta0ebd062016-01-13 12:18:23 -0500246 return;
Edric Milaret9949b342016-02-02 12:25:08 -0500247
248 if (contactMethods.size() == 1) {
249 auto contactMethod = contactMethods.at(0);
250 auto copyAction = new QAction(tr("Copy number"), this);
251 menu.addAction(copyAction);
252 connect(copyAction, &QAction::triggered, [contactMethod]() {
253 QApplication::clipboard()->setText(contactMethod->uri());
Edric Milareta0ebd062016-01-13 12:18:23 -0500254 });
Edric Milaretac21b3d2016-09-01 12:45:49 -0400255 auto copyNameAction = new QAction(tr("Copy name"), this);
256 menu.addAction(copyNameAction);
257 connect(copyNameAction, &QAction::triggered, [contactMethod]() {
258 QApplication::clipboard()->setText(contactMethod->primaryName());
259 });
Edric Milaret9949b342016-02-02 12:25:08 -0500260 if (not contactMethod->contact() || contactMethod->contact()->isPlaceHolder()) {
261 auto addExisting = new QAction(tr("Add to contact"), this);
262 menu.addAction(addExisting);
263 connect(addExisting, &QAction::triggered, [globalPos, contactMethod]() {
264 ContactPicker contactPicker(contactMethod);
265 contactPicker.move(globalPos.x(), globalPos.y() - (contactPicker.height()/2));
266 contactPicker.exec();
267 });
268 }
269 }
270 else {
271 auto callMenu = menu.addMenu(tr("Call Number"));
272 auto copyMenu = menu.addMenu(tr("Copy Number"));
273 for (auto cM : contactMethods) {
274 auto uri = cM->uri();
275 auto copyAction = new QAction(tr("Copy %1").arg(uri), this);
276 copyMenu->addAction(copyAction);
277 connect(copyAction, &QAction::triggered, [uri]() {
278 QApplication::clipboard()->setText(uri);
279 });
280 auto callAction = new QAction(tr("Call %1").arg(uri), this);
281 callMenu->addAction(callAction);
282 connect(callAction, &QAction::triggered, [cM]() {
283 Call* c = CallModel::instance().dialingCall(cM);
284 c->performAction(Call::Action::ACCEPT);
285 });
286 }
Edric Milareta0ebd062016-01-13 12:18:23 -0500287 }
288 menu.exec(globalPos);
289 });
290}
291
Anthony Léonarda86a8972016-12-15 10:33:47 -0500292void CallWidget::setupQRCode(QString ringID)
Edric Milarete19c4cd2016-02-12 10:19:44 -0500293{
Anthony Léonarda86a8972016-12-15 10:33:47 -0500294 auto rcode = QRcode_encodeString(ringID.toStdString().c_str(),
Edric Milaret6d0e5312016-04-04 16:30:22 -0400295 0, //Let the version be decided by libqrencode
296 QR_ECLEVEL_L, // Lowest level of error correction
Edric Milarete19c4cd2016-02-12 10:19:44 -0500297 QR_MODE_8, // 8-bit data mode
298 1);
299 if (not rcode) {
300 qWarning() << "Failed to generate QR code: " << strerror(errno);
301 return;
302 }
303
304 auto margin = 5;
305 int qrwidth = rcode->width + margin * 2;
306 QImage result(QSize(qrwidth, qrwidth), QImage::Format_Mono);
307 QPainter painter;
308 painter.begin(&result);
309 painter.setClipRect(QRect(0, 0, qrwidth, qrwidth));
310 painter.setPen(QPen(Qt::black, 0.1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
311 painter.setBrush(Qt::black);
312 painter.fillRect(QRect(0, 0, qrwidth, qrwidth), Qt::white);
Edric Milaret74474f52016-05-16 13:36:23 -0400313 unsigned char* p;
Edric Milarete19c4cd2016-02-12 10:19:44 -0500314 p = rcode->data;
315 for(int y = 0; y < rcode->width; y++) {
Edric Milaret74474f52016-05-16 13:36:23 -0400316 unsigned char* row = (p + (y * rcode->width));
Edric Milarete19c4cd2016-02-12 10:19:44 -0500317 for(int x = 0; x < rcode->width; x++) {
318 if(*(row + x) & 0x1) {
319 painter.drawRect(margin + x, margin + y, 1, 1);
320 }
321 }
322
323 }
324 painter.end();
325 QRcode_free(rcode);
Edric Milaret6d0e5312016-04-04 16:30:22 -0400326 ui->qrLabel->setPixmap(QPixmap::fromImage(result.scaled(QSize(qrSize_, qrSize_), Qt::KeepAspectRatio)));
Edric Milarete19c4cd2016-02-12 10:19:44 -0500327}
328
Edric Milaret67007d12015-05-07 09:40:09 -0400329void
330CallWidget::findRingAccount()
331{
Anthony Léonard266dd302017-03-31 14:38:32 -0400332 bool ringAccountFound = false;
Edric Milaret57467842016-08-30 13:06:11 -0400333
Edric Milareta3e47282015-10-23 15:20:30 -0400334 auto a_count = AccountModel::instance().rowCount();
Edric Milaret627500d2015-03-27 16:41:40 -0400335 for (int i = 0; i < a_count; ++i) {
Edric Milareta3e47282015-10-23 15:20:30 -0400336 auto idx = AccountModel::instance().index(i, 0);
Edric Milaret627500d2015-03-27 16:41:40 -0400337 auto protocol = idx.data(static_cast<int>(Account::Role::Proto));
Edric Milaret74474f52016-05-16 13:36:23 -0400338 if (static_cast<Account::Protocol>(protocol.toUInt()) == Account::Protocol::RING) {
Anthony Léonard266dd302017-03-31 14:38:32 -0400339 ringAccountFound = true;
Edric Milareta3e47282015-10-23 15:20:30 -0400340 auto account = AccountModel::instance().getAccountByModelIndex(idx);
Edric Milaret68779c42015-07-09 16:53:03 -0400341 if (account->displayName().isEmpty())
342 account->displayName() = account->alias();
Edric Milaret57467842016-08-30 13:06:11 -0400343 if (account->needsMigration()) {
344 WizardDialog dlg(WizardDialog::MIGRATION, account);
345 dlg.exec();
346 }
Edric Milaret627500d2015-03-27 16:41:40 -0400347 }
348 }
Anthony Léonard266dd302017-03-31 14:38:32 -0400349 if (!ringAccountFound) {
Edric Milaret57467842016-08-30 13:06:11 -0400350 WizardDialog wizardDialog;
351 wizardDialog.exec();
352 }
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400353
354 ui->currentAccountWidget->update();
355
Edric Milaret627500d2015-03-27 16:41:40 -0400356}
357
358void
Edric Milaret00d34f22016-05-09 16:30:29 -0400359CallWidget::callChangedSlot()
360{
361 if (not actualCall_)
362 return;
Edric Milaret41941582016-09-14 12:59:04 -0400363 ui->callerIdLabel->setText(QString("%1")
Edric Milaret00d34f22016-05-09 16:30:29 -0400364 .arg(actualCall_->formattedName()));
365 ui->callerPhoto->setPixmap(
366 QPixmap::fromImage(
367 GlobalInstances::pixmapManipulator()
368 .callPhoto(actualCall_, QSize(130,130)).value<QImage>()));
Olivier SOLDANO2f9e6702016-11-02 14:20:57 -0400369
Olivier SOLDANO02971ce2016-11-04 15:38:29 -0400370 if(actualCall_->state() == Call::State::OVER || actualCall_->state() == Call::State::FAILURE){
Olivier SOLDANO2f9e6702016-11-02 14:20:57 -0400371 ui->outboundCallLabel->setText(actualCall_->toHumanStateName(Call::State::INITIALIZATION));
372 } else {
373 ui->outboundCallLabel->setText(actualCall_->toHumanStateName());
374 }
Edric Milaret00d34f22016-05-09 16:30:29 -0400375}
376
377void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500378CallWidget::callIncoming(Call* call)
Edric Milaret627500d2015-03-27 16:41:40 -0400379{
Edric Milaret00a32252016-01-19 10:37:13 -0500380 if (!QApplication::focusWidget()) {
381 GlobalSystemTray::instance()
382 .showMessage("Ring",
383 QString(tr("Call incoming from %1")).arg(call->formattedName()));
Edric Milaret2cf34292015-06-22 16:27:03 -0400384 QApplication::alert(this, 5000);
385 }
386
Edric Milaret6456baa2015-05-21 12:18:07 -0400387 setActualCall(call);
Edric Milaret627500d2015-03-27 16:41:40 -0400388}
389
390void
391CallWidget::on_acceptButton_clicked()
392{
393 if (actualCall_ != nullptr)
Edric Milaret53f57b62015-05-11 11:02:17 -0400394 actualCall_->performAction(Call::Action::ACCEPT);
Edric Milaret627500d2015-03-27 16:41:40 -0400395}
396
397void
398CallWidget::on_refuseButton_clicked()
399{
400 if (actualCall_ == nullptr)
401 return;
402 actualCall_->performAction(Call::Action::REFUSE);
Nicolas Jager13745062016-02-12 18:56:40 -0500403 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
Edric Milaret6456baa2015-05-21 12:18:07 -0400404 setActualCall(nullptr);
Edric Milaret627500d2015-03-27 16:41:40 -0400405}
406
407void
Edric Milaret67007d12015-05-07 09:40:09 -0400408CallWidget::callStateChanged(Call* call, Call::State previousState)
409{
Edric Milaret627500d2015-03-27 16:41:40 -0400410 Q_UNUSED(previousState)
Edric Milaret4b1be4a2016-01-15 16:49:20 -0500411 if (call == nullptr
412 || call != actualCall_)
Edric Milaretb5b49072015-05-08 11:56:07 -0400413 return;
Edric Milareted0b2802015-10-01 15:10:02 -0400414
Olivier SOLDANOea6d71b2016-11-16 15:56:59 -0500415 callStateToView(call);
416
Edric Milaret4b1be4a2016-01-15 16:49:20 -0500417 if (call->state() == Call::State::OVER) {
Edric Milaret6456baa2015-05-21 12:18:07 -0400418 setActualCall(nullptr);
Olivier SOLDANOea6d71b2016-11-16 15:56:59 -0500419 ui->smartList->clearSelection();
Edric Milaret6b68a482016-02-01 15:23:44 -0500420 RecentModel::instance().selectionModel()->clear();
Edric Milaret627500d2015-03-27 16:41:40 -0400421 }
Edric Milaret627500d2015-03-27 16:41:40 -0400422}
423
424void
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400425CallWidget::atExit()
426{
Edric Milaret627500d2015-03-27 16:41:40 -0400427}
Edric Milaret67007d12015-05-07 09:40:09 -0400428
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400429void
430CallWidget::callStateToView(Call* value)
Edric Milaret6b68a482016-02-01 15:23:44 -0500431{
432 if (value) {
433 switch (value->state()) {
434 case Call::State::INCOMING:
435 if (not value->account()->isAutoAnswer())
436 ui->stackedWidget->setCurrentWidget(ui->callInvitePage);
437 else
438 ui->stackedWidget->setCurrentWidget(ui->videoPage);
439 break;
440 case Call::State::CURRENT:
Edric Milareta86e3f52016-03-14 16:28:57 -0400441 case Call::State::CONFERENCE:
Edric Milaret854c6b44d2016-03-08 11:00:48 -0500442 case Call::State::HOLD:
Edric Milaret6b68a482016-02-01 15:23:44 -0500443 ui->stackedWidget->setCurrentWidget(ui->videoPage);
444 break;
Olivier SOLDANO02971ce2016-11-04 15:38:29 -0400445 case Call::State::OVER:
Olivier SOLDANOea6d71b2016-11-16 15:56:59 -0500446 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
Olivier SOLDANO02971ce2016-11-04 15:38:29 -0400447 break;
Olivier SOLDANO2f9e6702016-11-02 14:20:57 -0400448 case Call::State::FAILURE:
449 case Call::State::ERROR:
Olivier SOLDANO02971ce2016-11-04 15:38:29 -0400450 on_cancelButton_clicked();
Edric Milaret6b68a482016-02-01 15:23:44 -0500451 break;
452 case Call::State::INITIALIZATION:
453 case Call::State::CONNECTED:
454 case Call::State::RINGING:
Edric Milaret6b68a482016-02-01 15:23:44 -0500455 ui->stackedWidget->setCurrentWidget(ui->outboundCallPage);
456 break;
457 default:
Edric Milaret854c6b44d2016-03-08 11:00:48 -0500458 qWarning() << "Call state not handled doing nothing : "
459 << value->toHumanStateName();
Edric Milaret6b68a482016-02-01 15:23:44 -0500460 break;
461 }
Nicolas Jager13745062016-02-12 18:56:40 -0500462 }
Edric Milaret6b68a482016-02-01 15:23:44 -0500463}
464
Edric Milaret6456baa2015-05-21 12:18:07 -0400465void
466CallWidget::setActualCall(Call* value)
467{
468 actualCall_ = value;
Edric Milaret80e0b212015-10-16 10:07:43 -0400469 CallModel::instance().selectCall(value);
470 ui->videoWidget->pushRenderer(value);
Edric Milareta86e3f52016-03-14 16:28:57 -0400471 ui->instantMessagingWidget->setMediaText(actualCall_);
Edric Milaret6b68a482016-02-01 15:23:44 -0500472 callStateToView(value);
Edric Milaret00d34f22016-05-09 16:30:29 -0400473 if (actualCall_) {
474 callChangedConnection_ = connect(actualCall_,
475 SIGNAL(changed()),
476 this,
477 SLOT(callChangedSlot()));
478 } else
479 disconnect(callChangedConnection_);
480
Edric Milaret6456baa2015-05-21 12:18:07 -0400481}
Edric Milaretc7ab5502015-06-15 11:18:02 -0400482
483void
Edric Milareted0b2802015-10-01 15:10:02 -0400484CallWidget::on_cancelButton_clicked()
Edric Milaretd8528fa2015-07-07 14:13:51 -0400485{
Olivier SOLDANO2f9e6702016-11-02 14:20:57 -0400486 if (actualCall_){
Edric Milaretd8528fa2015-07-07 14:13:51 -0400487 actualCall_->performAction(Call::Action::REFUSE);
Olivier SOLDANO2f9e6702016-11-02 14:20:57 -0400488 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
489 }
Edric Milaretd8528fa2015-07-07 14:13:51 -0400490}
Edric Milareted0b2802015-10-01 15:10:02 -0400491
492void
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400493CallWidget::on_smartList_clicked(const QModelIndex& index)
494{
495 RecentModel::instance().selectionModel()->setCurrentIndex(
496 RecentModel::instance().peopleProxy()->mapToSource(index),
497 QItemSelectionModel::ClearAndSelect);
498}
499
500void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500501CallWidget::on_smartList_doubleClicked(const QModelIndex& index)
Edric Milareted0b2802015-10-01 15:10:02 -0400502{
Edric Milareta3e47282015-10-23 15:20:30 -0400503 auto realIndex = RecentModel::instance().peopleProxy()->mapToSource(index);
504 if (RecentModel::instance().hasActiveCall(realIndex))
Edric Milareted0b2802015-10-01 15:10:02 -0400505 return;
506
507 ContactMethod* m = nullptr;
508 if (auto cm = realIndex.data((int)Call::Role::ContactMethod).value<ContactMethod*>()) {
509 m = cm;
510 } else {
511 if (auto person = realIndex.data((int)Person::Role::Object).value<Person*>()) {
512 m = person->phoneNumbers().first();
513 }
514 }
Olivier SOLDANOad0fabb2016-11-25 09:08:01 -0500515
Edric Milareta3e47282015-10-23 15:20:30 -0400516 if (m && !RecentModel::instance().index(0, 0, realIndex).isValid()) {
Olivier SOLDANOad0fabb2016-11-25 09:08:01 -0500517
518 QPixmap map = QPixmap::fromImage(
519 GlobalInstances::pixmapManipulator().callPhoto(m, QSize(130,130)).value<QImage>());
520 ui->callingPhoto->setPixmap(map);
521
Edric Milareta3e47282015-10-23 15:20:30 -0400522 Call* c = CallModel::instance().dialingCall(m);
Edric Milareted0b2802015-10-01 15:10:02 -0400523 c->performAction(Call::Action::ACCEPT);
Edric Milaret6b68a482016-02-01 15:23:44 -0500524 setActualCall(c);
Edric Milareted0b2802015-10-01 15:10:02 -0400525 }
526}
527
528void
Olivier SOLDANO61065ec2016-11-11 16:31:34 -0500529CallWidget::smartListCurrentChanged(const QModelIndex &currentIdx, const QModelIndex &previousIdx)
530{
531 Q_UNUSED(previousIdx);
532 if (not currentIdx.isValid())
Edric Milareted0b2802015-10-01 15:10:02 -0400533 return;
534
Olivier SOLDANO703caba2016-11-15 16:18:55 -0500535 //catch call of current index
Olivier SOLDANO61065ec2016-11-11 16:31:34 -0500536 auto currentIdxCall = RecentModel::instance().getActiveCall(currentIdx);
Olivier SOLDANO703caba2016-11-15 16:18:55 -0500537
538 if (currentIdxCall && currentIdxCall != actualCall_) { //if it is different from actual call, switch between the two
Olivier SOLDANO61065ec2016-11-11 16:31:34 -0500539 setActualCall(currentIdxCall);
Olivier SOLDANO703caba2016-11-15 16:18:55 -0500540 } else if (currentIdxCall == nullptr){ // if there is no call attached to this smartlist index (contact tab)
Edric Milareta0ebd062016-01-13 12:18:23 -0500541 setActualCall(nullptr);
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400542 showIMOutOfCall(currentIdx); // change page to contact request of messaging page with correct behaviour
Olivier SOLDANO703caba2016-11-15 16:18:55 -0500543 } else { // if non defined behaviour disconnect instant messaging and return to welcome page
Edric Milareted0b2802015-10-01 15:10:02 -0400544 setActualCall(nullptr);
Edric Milaret7ef617b2016-02-01 15:40:57 -0500545 if (imConnection_)
546 disconnect(imConnection_);
Edric Milareted0b2802015-10-01 15:10:02 -0400547 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
548 }
549}
550
551void
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400552CallWidget::configureSendCRPageButton(const QModelIndex& currentIdx)
553{
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400554 if (currentIdx.isValid()){
555 QVector<ContactMethod*> cmVector = RecentModel::instance().getContactMethods(currentIdx);
556 if (cmVector.size() == 0){
557 ui->sendContactRequestPageButton->hide();
558 return;
559 }
560
561 URI cmUri = cmVector[0]->uri();
562 if (cmUri.protocolHint() == URI::ProtocolHint::RING || uriNeedNameLookup(cmUri)) {
563 ui->sendContactRequestPageButton->show();
564 } else {
565 ui->sendContactRequestPageButton->hide();
566 }
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400567 } else {
568 ui->sendContactRequestPageButton->hide();
569 }
570}
571
572void
Anthony Léonardd47179c2017-03-28 10:39:10 -0400573CallWidget::contactReqListCurrentChanged(const QModelIndex &currentIdx, const QModelIndex &previousIdx)
574{
575 Q_UNUSED(previousIdx)
576
577 ContactRequest* cr = currentIdx.data((int)Ring::Role::Object).value<ContactRequest*>();
578 ui->contactRequestWidget->setCurrentContactRequest(cr);
Anthony Léonard2fde81d2017-04-17 10:06:55 -0400579 ui->stackedWidget->setCurrentWidget(ui->contactRequestPage);
Anthony Léonardd47179c2017-03-28 10:39:10 -0400580}
581
582void
Edric Milareted0b2802015-10-01 15:10:02 -0400583CallWidget::placeCall()
584{
Nicolas Jager97a21b42015-12-03 16:55:45 -0500585 if (ui->ringContactLineEdit->text().isEmpty())
Edric Milareted0b2802015-10-01 15:10:02 -0400586 return;
Nicolas Jager97a21b42015-12-03 16:55:45 -0500587 Call* c = CallModel::instance().dialingCall(PhoneDirectoryModel::instance().getNumber(ui->ringContactLineEdit->text()));
Edric Milareted0b2802015-10-01 15:10:02 -0400588 c->performAction(Call::Action::ACCEPT);
Nicolas Jager97a21b42015-12-03 16:55:45 -0500589 ui->ringContactLineEdit->clear();
Edric1bed3f92016-05-19 10:24:48 -0400590 ui->callingPhoto->setPixmap(
591 QPixmap::fromImage(
592 GlobalInstances::pixmapManipulator()
593 .callPhoto(c, QSize(130,130)).value<QImage>()));
Edric Milareted0b2802015-10-01 15:10:02 -0400594}
595
596void
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500597CallWidget::settingsButtonClicked()
Edric Milareted0b2802015-10-01 15:10:02 -0400598{
599 emit NavigationRequested(ScreenEnum::ConfScreen);
600}
601
602void
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400603CallWidget::searchContactLineEditEntry(const URI &uri)
604{
605 auto cm = PhoneDirectoryModel::instance().getNumber(uri);
606 // if its a new CM, bring it to the top
607 if (cm->lastUsed() == 0)
608 cm->setLastUsed(QDateTime::currentDateTime().toTime_t());
609
610 // select cm
611 RecentModel::instance().selectionModel()->setCurrentIndex(RecentModel::instance().getIndex(cm),
612 QItemSelectionModel::ClearAndSelect);
613 ui->ringContactLineEdit->clear();
614}
615
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400616bool
617CallWidget::uriNeedNameLookup(const URI uri_passed)
618{
619 if (uri_passed.protocolHint() == URI::ProtocolHint::RING_USERNAME ) {
620 return TRUE;
621 } else if (
622 uri_passed.protocolHint() != URI::ProtocolHint::RING && // not a RingID
623 uri_passed.schemeType() == URI::SchemeType::NONE // scheme type not specified
624 ){
625 // if no scheme type has been specified, determine ring vs sip by the first available account
626 auto idx = AvailableAccountModel::instance().index(0, 0);
627 if (idx.isValid()) {
628 auto account = idx.data((int)Ring::Role::Object).value<Account *>();
629 if (account && account->protocol() == Account::Protocol::RING)
630 return TRUE;
631 }
632 }
633
634 return FALSE;
635}
636
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400637void
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400638CallWidget::processContactLineEdit()
Nicolas Jager97a21b42015-12-03 16:55:45 -0500639{
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400640 auto contactLineText = ui->ringContactLineEdit->text();
641 URI uri_passed = URI(contactLineText);
Nicolas Jager5e845d52016-02-18 13:26:12 -0500642
Olivier SOLDANO63178ee2016-11-04 16:50:08 -0400643 if (!contactLineText.isNull() && !contactLineText.isEmpty()){
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400644 if (uriNeedNameLookup(uri_passed)){
Olivier SOLDANO63178ee2016-11-04 16:50:08 -0400645 NameDirectory::instance().lookupName(nullptr, QString(), uri_passed);
646 } else {
647 searchContactLineEditEntry(uri_passed);
648 }
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400649 }
Nicolas Jager97a21b42015-12-03 16:55:45 -0500650}
651
652void
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400653CallWidget::on_ringContactLineEdit_returnPressed()
Nicolas Jager97a21b42015-12-03 16:55:45 -0500654{
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400655 processContactLineEdit();
656}
657
658void
659CallWidget::searchBtnClicked()
660{
661 processContactLineEdit();
Nicolas Jager97a21b42015-12-03 16:55:45 -0500662}
663
664void
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500665CallWidget::btnComBarVideoClicked()
Nicolas Jager97a21b42015-12-03 16:55:45 -0500666{
667 if (not highLightedIndex_.isValid())
668 return;
669
670 on_smartList_doubleClicked(highLightedIndex_);
671}
Edric Milaretab12d022015-12-04 16:09:44 -0500672
673void
Anthony Léonardd47179c2017-03-28 10:39:10 -0400674CallWidget::selectedAccountChanged(const QModelIndex &current, const QModelIndex &previous)
675{
676 Q_UNUSED(previous)
677
678 if (current.isValid()) {
679 auto ac = AccountModel::instance().getAccountByModelIndex(current);
680
681 // First, we get back to the welcome view
682 if (ui->stackedWidget->currentWidget() != ui->welcomePage) {
683 slidePage(ui->welcomePage);
684 }
685
Anthony Léonard266dd302017-03-31 14:38:32 -0400686 // We setup the ringIdLabel and the QRCode
687 auto protocol = ac->protocol();
688 if (protocol == Account::Protocol::RING) {
689 ui->ringIdLabel->setText((ac->registeredName().isEmpty())?ac->username():ac->registeredName());
690 setupQRCode(ac->username());
691 } else {
692 ui->ringIdLabel->setText(tr("NO RING ACCOUNT FOUND"));
693 }
694
Anthony Léonardd47179c2017-03-28 10:39:10 -0400695 // Then, we update the pending CR list with those from the newly selected account
696 if (disconnect(crListSelectionConnection_)) {
697 // The selection model must be deleted by the application (see QT doc).
698 QItemSelectionModel* sMod = ui->contactReqList->selectionModel();
699 delete sMod;
700 }
701
702 ui->contactReqList->setModel(ac->pendingContactRequestModel());
703 crListSelectionConnection_ = connect(ui->contactReqList->selectionModel(), &QItemSelectionModel::currentChanged,
704 this, &CallWidget::contactReqListCurrentChanged);
705 }
706}
707
708void
Edric Milaret6b68a482016-02-01 15:23:44 -0500709CallWidget::showIMOutOfCall(const QModelIndex& nodeIdx)
Edric Milaretab12d022015-12-04 16:09:44 -0500710{
Edric Milaretab12d022015-12-04 16:09:44 -0500711 ui->contactMethodComboBox->clear();
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400712 configureSendCRPageButton(nodeIdx);
Edric Milareta0ebd062016-01-13 12:18:23 -0500713 ui->imNameLabel->setText(QString(tr("Conversation with %1", "%1 is the contact name"))
714 .arg(nodeIdx.data(static_cast<int>(Ring::Role::Name)).toString()));
Edric Milaretab12d022015-12-04 16:09:44 -0500715 auto cmVector = RecentModel::instance().getContactMethods(nodeIdx);
Edric Milareta0ebd062016-01-13 12:18:23 -0500716 ui->contactMethodComboBox->setEnabled(cmVector.size() > 1);
Edric Milaretab12d022015-12-04 16:09:44 -0500717 foreach (const ContactMethod* cm, cmVector) {
Edric Milareta0ebd062016-01-13 12:18:23 -0500718 ui->contactMethodComboBox->addItem(cm->uri());
Edric Milaretab12d022015-12-04 16:09:44 -0500719 }
Olivier SOLDANOad0fabb2016-11-25 09:08:01 -0500720 ui->stackedWidget->setCurrentWidget(ui->messagingPage);
Edric Milaret70ae8782016-04-18 16:10:44 -0400721 disconnect(imClickedConnection_);
722 imClickedConnection_ = connect(ui->listMessageView, &QListView::clicked, [this](const QModelIndex& index) {
723 auto urlList = index.data(static_cast<int>(Media::TextRecording::Role::LinkList)).value<QList<QUrl>>();
724 if (urlList.size() == 1)
725 QDesktopServices::openUrl(urlList.at(0));
726 else if (urlList.size()) {
727 //TODO Handle multiple url in one message
728 }
729 });
Edric Milaretab12d022015-12-04 16:09:44 -0500730}
731
732void
Edric Milaret6a785af2016-03-07 15:39:30 -0500733CallWidget::on_sendIMButton_clicked()
Edric Milaretab12d022015-12-04 16:09:44 -0500734{
Edric Milaret6a785af2016-03-07 15:39:30 -0500735 if (ui->imMessageEdit->text().trimmed().isEmpty())
Edric Milaretab12d022015-12-04 16:09:44 -0500736 return;
737 auto number = ui->contactMethodComboBox->currentText();
738 if (auto cm = PhoneDirectoryModel::instance().getNumber(number)) {
739 QMap<QString, QString> msg;
Edric Milaret6a785af2016-03-07 15:39:30 -0500740 msg["text/plain"] = ui->imMessageEdit->text();
Edric Milaretab12d022015-12-04 16:09:44 -0500741 cm->sendOfflineTextMessage(msg);
Edric Milaret6a785af2016-03-07 15:39:30 -0500742 ui->imMessageEdit->clear();
Edric Milaretab12d022015-12-04 16:09:44 -0500743 } else {
744 qWarning() << "Contact Method not found for " << number;
745 }
746}
747
748void
Edric Milaret6a785af2016-03-07 15:39:30 -0500749CallWidget::on_imMessageEdit_returnPressed()
Edric Milaretab12d022015-12-04 16:09:44 -0500750{
Edric Milaret6a785af2016-03-07 15:39:30 -0500751 on_sendIMButton_clicked();
Edric Milaretab12d022015-12-04 16:09:44 -0500752}
753
754void
755CallWidget::on_contactMethodComboBox_currentIndexChanged(const QString& number)
756{
757 auto cm = PhoneDirectoryModel::instance().getNumber(number);
758 if (auto txtRecording = cm->textRecording()) {
759 ui->listMessageView->setModel(txtRecording->instantMessagingModel());
Edric Milaret7ef617b2016-02-01 15:40:57 -0500760 if (imConnection_)
761 disconnect(imConnection_);
Edric Milaretab12d022015-12-04 16:09:44 -0500762 imConnection_ = connect(txtRecording,
Edric Milareta0ebd062016-01-13 12:18:23 -0500763 SIGNAL(messageInserted(QMap<QString,QString>,ContactMethod*,Media::Media::Direction)),
764 this,
765 SLOT(slotAccountMessageReceived(QMap<QString,QString>,ContactMethod*,Media::Media::Direction)));
Edric Milaret4be72022016-01-19 10:24:13 -0500766 auto messagesPresent = txtRecording->instantMessagingModel()->rowCount() > 0;
767 if (messagesPresent) {
768 ui->listMessageView->scrollToBottom();
769 txtRecording->setAllRead();
770 }
771 ui->listMessageView->setVisible(messagesPresent);
772 ui->noMessagesLabel->setVisible(!messagesPresent);
773 if (not messagesPresent) {
Edric Milaret49130472016-01-22 10:39:37 -0500774 imVisibleConnection_ = connect(txtRecording->instantMessagingModel(),
775 &QAbstractItemModel::rowsInserted,
776 [this, txtRecording]() {
777 if (imVisibleConnection_)
778 disconnect(imVisibleConnection_);
779 auto messagesPresent = txtRecording->instantMessagingModel()->rowCount() > 0;
Edric Milaret4be72022016-01-19 10:24:13 -0500780 ui->listMessageView->setVisible(messagesPresent);
781 ui->noMessagesLabel->setVisible(!messagesPresent);
Edric Milaret4be72022016-01-19 10:24:13 -0500782 });
783 }
Edric Milaretab12d022015-12-04 16:09:44 -0500784 }
785}
786
787void
788CallWidget::slotAccountMessageReceived(const QMap<QString,QString> message,
789 ContactMethod* cm,
790 Media::Media::Direction dir)
791{
792 Q_UNUSED(message)
Edric Milaretab12d022015-12-04 16:09:44 -0500793 Q_UNUSED(dir)
794
795 ui->listMessageView->scrollToBottom();
Edric Milaret23fd3fa2016-01-15 15:37:35 -0500796 cm->textRecording()->setAllRead();
Edric Milaretab12d022015-12-04 16:09:44 -0500797}
Edric Milaretfa05d972016-01-13 16:22:04 -0500798
799void
Edric Milaret8001f6f2016-01-27 09:55:12 -0500800CallWidget::on_ringContactLineEdit_textChanged(const QString& text)
Edric Milaretfa05d972016-01-13 16:22:04 -0500801{
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400802 RecentModel::instance().peopleProxy()->setFilterRegExp(QRegExp(text, Qt::CaseInsensitive, QRegExp::FixedString));
Edric Milaretfa05d972016-01-13 16:22:04 -0500803}
Edric Milareta0ebd062016-01-13 12:18:23 -0500804
Nicolas Jagerca850292016-01-17 14:11:10 -0500805void
806CallWidget::on_imBackButton_clicked()
Edric Milareta0ebd062016-01-13 12:18:23 -0500807{
Edric Milaret6b68a482016-02-01 15:23:44 -0500808 RecentModel::instance().selectionModel()->clear();
809 slidePage(ui->welcomePage);
Nicolas Jagerca850292016-01-17 14:11:10 -0500810}
811
812void
Edric Milaret6b68a482016-02-01 15:23:44 -0500813CallWidget::slidePage(QWidget* widget, bool toRight)
Nicolas Jagerca850292016-01-17 14:11:10 -0500814{
Edric Milaret6b68a482016-02-01 15:23:44 -0500815 short dir = (toRight ? -1 : 1);
Nicolas Jagerca850292016-01-17 14:11:10 -0500816 ui->stackedWidget->setCurrentWidget(widget);
Edric Milaret6b68a482016-02-01 15:23:44 -0500817 pageAnim_->setTargetObject(widget);
818 pageAnim_->setDuration(animDuration_);
819 pageAnim_->setStartValue(QPoint(widget->width() * dir, widget->y()));
820 pageAnim_->setEndValue(QPoint(widget->x(), widget->y()));
821 pageAnim_->setEasingCurve(QEasingCurve::OutQuad);
822 pageAnim_->start();
Nicolas Jagerca850292016-01-17 14:11:10 -0500823}
824
825void
Edric Milaret7cf39e22016-02-02 12:44:03 -0500826CallWidget::on_copyCMButton_clicked()
827{
828 auto text = ui->contactMethodComboBox->currentText();
829 QApplication::clipboard()->setText(text);
830}
Edric Milaret4097d2f2016-02-09 14:41:50 -0500831
832void
Edric Milaret1e598592016-09-02 10:10:01 -0400833CallWidget::on_qrButton_toggled(bool checked)
834{
835 ui->qrLabel->setVisible(checked);
836}
837
838void
Edric Milaret4097d2f2016-02-09 14:41:50 -0500839CallWidget::on_shareButton_clicked()
840{
Edric Milaret1e598592016-09-02 10:10:01 -0400841 Utils::InvokeMailto(tr("Contact me on Ring"), tr("My RingId is : ") + ui->ringIdLabel->text());
Edric Milaret4097d2f2016-02-09 14:41:50 -0500842}
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400843
844void
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400845CallWidget::contactLineEdit_registeredNameFound(Account* account,NameDirectory::LookupStatus status,
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400846 const QString& address,const QString& name)
847{
848 URI uri = URI(ui->ringContactLineEdit->text());
849 QString username_to_lookup = uri.userinfo();
850
851 if (username_to_lookup.compare(name) != 0){
852 return;
853 }
854
855 switch (status)
856 {
857 case NameDirectory::LookupStatus::SUCCESS:
858 {
859 uri = URI("ring:" + address);
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400860 qDebug() << "contactLineEdit username to search: " << username_to_lookup;
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400861 qDebug() << uri;
862 searchContactLineEditEntry(uri);
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400863 auto cm = PhoneDirectoryModel::instance().getNumber(uri);
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400864 cm->setAccount(account);
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400865 break;
866 }
867 case NameDirectory::LookupStatus::INVALID_NAME:
868 {
869 qDebug() << "Invalid Ring username";
870 break;
871 }
872 case NameDirectory::LookupStatus::ERROR:
873 case NameDirectory::LookupStatus::NOT_FOUND:
874 default:
875 {
876 qDebug() << "Could not resolve Ring username";
877 break;
878 }
879 }
880}
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400881
882void
883CallWidget::on_sendContactRequestPageButton_clicked()
884{
885 ui->sendContactRequestWidget->sendCR(RecentModel::instance().selectionModel()->currentIndex());
886 // temporarly changed comportment waiting for message in payload implementation
887 /*ui->sendContactRequestWidget->setup(RecentModel::instance().selectionModel()->currentIndex());
888 slidePage(ui->sendContactRequestPage);*/
889}
890
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400891void
892CallWidget::on_sendCRBackButton_clicked()
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400893{
894 slidePage(ui->messagingPage);
895}
Anthony Léonardd47179c2017-03-28 10:39:10 -0400896
897void
898CallWidget::on_pendingCRBackButton_clicked()
899{
900 ui->contactReqList->selectionModel()->clear();
901 slidePage(ui->welcomePage);
902}