blob: 8bc689286a6c6d3f81a63bb6661f786af27277d3 [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>
Edric Milaret559bda52015-04-29 17:02:31 -040050#include "wizarddialog.h"
Edric Milaret83b248c2015-06-02 11:42:23 -040051#include "windowscontactbackend.h"
Edric Milaret43f3c1e2015-07-16 17:52:47 -040052#include "contactpicker.h"
Edric Milaret2afd2bf2015-07-21 17:12:25 -040053#include "contactmethodpicker.h"
Edric Milaret2cf34292015-06-22 16:27:03 -040054#include "globalsystemtray.h"
Edric Milareted0b2802015-10-01 15:10:02 -040055#include "smartlistdelegate.h"
Edric Milaretab12d022015-12-04 16:09:44 -050056#include "imdelegate.h"
Edric Milareta0ebd062016-01-13 12:18:23 -050057#include "pixbufmanipulator.h"
Edric Milaret70ae8782016-04-18 16:10:44 -040058#include "settingskey.h"
Edric Milaret627500d2015-03-27 16:41:40 -040059
Edric Milaret25236d92016-03-28 09:40:58 -040060#include "profilemodel.h"
Olivier SOLDANO9657fd12017-03-27 16:06:53 -040061#include "profile.h"
Edric Milaret25236d92016-03-28 09:40:58 -040062#include "peerprofilecollection.h"
63#include "localprofilecollection.h"
64
Nicolas Jager97a21b42015-12-03 16:55:45 -050065CallWidget::CallWidget(QWidget* parent) :
Nicolas Jager74fe46f2016-02-29 14:55:09 -050066 NavWidget(parent),
Edric Milaret7d40a4a2015-05-13 13:01:15 -040067 ui(new Ui::CallWidget),
Edric Milaretab12d022015-12-04 16:09:44 -050068 menu_(new QMenu()),
69 imDelegate_(new ImDelegate())
Edric Milaret627500d2015-03-27 16:41:40 -040070{
71 ui->setupUi(this);
72
Edric Milaret6b68a482016-02-01 15:23:44 -050073 pageAnim_ = new QPropertyAnimation(ui->welcomePage, "pos", this);
Nicolas Jagerca850292016-01-17 14:11:10 -050074
Edric Milaret6456baa2015-05-21 12:18:07 -040075 setActualCall(nullptr);
Edric Milaret627500d2015-03-27 16:41:40 -040076 videoRenderer_ = nullptr;
77
Nicolas Jager74fe46f2016-02-29 14:55:09 -050078 connect(ui->settingsButton, &QPushButton::clicked, this, &CallWidget::settingsButtonClicked);
79
Edric Milaret3aca8e32015-06-12 10:01:40 -040080 connect(ui->videoWidget, SIGNAL(setChatVisibility(bool)),
81 ui->instantMessagingWidget, SLOT(setVisible(bool)));
82
Edric Milareted0b2802015-10-01 15:10:02 -040083 QPixmap logo(":/images/logo-ring-standard-coul.png");
84 ui->ringLogo->setPixmap(logo.scaledToHeight(100, Qt::SmoothTransformation));
85 ui->ringLogo->setAlignment(Qt::AlignHCenter);
86
Edric Milaret1e598592016-09-02 10:10:01 -040087 ui->qrLabel->hide();
Edric Milarete19c4cd2016-02-12 10:19:44 -050088
Edric Milareta0ebd062016-01-13 12:18:23 -050089 GlobalInstances::setPixmapManipulator(std::unique_ptr<Interfaces::PixbufManipulator>(new Interfaces::PixbufManipulator()));
90
Edric Milaret627500d2015-03-27 16:41:40 -040091 try {
Edric Milareta3e47282015-10-23 15:20:30 -040092 callModel_ = &CallModel::instance();
Edric Milaret627500d2015-03-27 16:41:40 -040093
94 connect(callModel_, SIGNAL(incomingCall(Call*)),
95 this, SLOT(callIncoming(Call*)));
Edric Milaret627500d2015-03-27 16:41:40 -040096 connect(callModel_, SIGNAL(callStateChanged(Call*, Call::State)),
97 this, SLOT(callStateChanged(Call*, Call::State)));
98
Edric Milareta3e47282015-10-23 15:20:30 -040099 connect(&AccountModel::instance()
Edric Milaret67007d12015-05-07 09:40:09 -0400100 , SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>))
101 , this
102 , SLOT(findRingAccount(QModelIndex, QModelIndex, QVector<int>)));
103
Edric Milaretfa05d972016-01-13 16:22:04 -0500104 RecentModel::instance().peopleProxy()->setFilterRole(static_cast<int>(Ring::Role::Name));
105 RecentModel::instance().peopleProxy()->setFilterCaseSensitivity(Qt::CaseInsensitive);
Edric Milareta3e47282015-10-23 15:20:30 -0400106 ui->smartList->setModel(RecentModel::instance().peopleProxy());
Edric Milaret6816fd72016-01-29 16:36:24 -0500107
Edric Milaret25236d92016-03-28 09:40:58 -0400108 PersonModel::instance().addCollection<PeerProfileCollection>(LoadOptions::FORCE_ENABLED);
109 ProfileModel::instance().addCollection<LocalProfileCollection>(LoadOptions::FORCE_ENABLED);
110
Edric Milareta3e47282015-10-23 15:20:30 -0400111 PersonModel::instance().
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400112 addCollection<WindowsContactBackend>(LoadOptions::FORCE_ENABLED);
113
Edric Milaret6b68a482016-02-01 15:23:44 -0500114 connect(ui->smartList, &QTreeView::entered, this, &CallWidget::on_entered);
115
116 smartListDelegate_ = new SmartListDelegate();
117 ui->smartList->setSmartListItemDelegate(smartListDelegate_);
118
Edric Milaret627500d2015-03-27 16:41:40 -0400119 findRingAccount();
Edric Milareta0ebd062016-01-13 12:18:23 -0500120 setupOutOfCallIM();
121 setupSmartListMenu();
Edric Milaret627500d2015-03-27 16:41:40 -0400122
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500123 connect(ui->smartList, &SmartList::btnVideoClicked, this, &CallWidget::btnComBarVideoClicked);
Nicolas Jager41e4fcf2016-01-28 11:37:03 -0500124
Edric Milaret6b68a482016-02-01 15:23:44 -0500125 connect(RecentModel::instance().selectionModel(),
Olivier SOLDANO61065ec2016-11-11 16:31:34 -0500126 SIGNAL(currentChanged(QModelIndex,QModelIndex)),
127 this,
128 SLOT(smartListCurrentChanged(QModelIndex,QModelIndex)));
129
Olivier SOLDANOea6d71b2016-11-16 15:56:59 -0500130 connect(RecentModel::instance().selectionModel(), &QItemSelectionModel::selectionChanged, [=](const QItemSelection &selected, const QItemSelection &deselected) {
131 // lambda used to focus on the correct smartList element when switching automatically between two calls
132 Q_UNUSED(deselected)
133 if (selected.size()) {
134 auto idx = selected.indexes().first();
135 auto realIdx = RecentModel::instance().peopleProxy()->mapFromSource(idx);
136 ui->smartList->selectionModel()->setCurrentIndex(realIdx, QItemSelectionModel::ClearAndSelect);
137 } else
138 ui->smartList->clearSelection();
139 });
140
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400141 connect(&NameDirectory::instance(), SIGNAL(registeredNameFound(Account*,NameDirectory::LookupStatus,const QString&,const QString&)),
142 this, SLOT(contactLineEdit_registeredNameFound(Account*,NameDirectory::LookupStatus,const QString&,const QString&)));
143
144 connect(&AccountModel::instance(), SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)),
145 ui->currentAccountWidget, SLOT(update()));
146
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400147 connect(ui->searchBtn, SIGNAL(clicked(bool)), this, SLOT(searchBtnClicked()));
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400148
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400149 connect(ui->sendContactRequestWidget, &SendContactRequestWidget::sendCRclicked, [=]{slidePage(ui->messagingPage);});
150
Edric Milaret80e0b212015-10-16 10:07:43 -0400151 } catch (const std::exception& e) {
152 qDebug() << "INIT ERROR" << e.what();
Edric Milaret627500d2015-03-27 16:41:40 -0400153 }
154}
155
156CallWidget::~CallWidget()
157{
158 delete ui;
Edric Milaretc7ab5502015-06-15 11:18:02 -0400159 delete menu_;
Edric Milaretab12d022015-12-04 16:09:44 -0500160 delete imDelegate_;
Edric Milaret6b68a482016-02-01 15:23:44 -0500161 delete pageAnim_;
162 delete smartListDelegate_;
Edric Milarete19c4cd2016-02-12 10:19:44 -0500163 delete shareMenu_;
164}
165
166void
Edric Milareta0ebd062016-01-13 12:18:23 -0500167CallWidget::setupOutOfCallIM()
168{
169 ui->listMessageView->setItemDelegate(imDelegate_);
170 ui->listMessageView->setContextMenuPolicy(Qt::ActionsContextMenu);
171
172 auto copyAction = new QAction(tr("Copy"), this);
173 ui->listMessageView->addAction(copyAction);
174 connect(copyAction, &QAction::triggered, [=]() {
175 auto idx = ui->listMessageView->currentIndex();
176 if (idx.isValid()) {
177 auto text = ui->listMessageView->model()->data(idx);
178 QApplication::clipboard()->setText(text.value<QString>());
179 }
180 });
Edric Milaret70ae8782016-04-18 16:10:44 -0400181 QSettings settings;
Edric Milareta0ebd062016-01-13 12:18:23 -0500182 auto displayDate = new QAction(tr("Display date"), this);
183 displayDate->setCheckable(true);
Edric Milaret70ae8782016-04-18 16:10:44 -0400184 displayDate->setChecked(settings.value(SettingsKey::imShowDate).toBool());
Edric Milareta0ebd062016-01-13 12:18:23 -0500185 ui->listMessageView->addAction(displayDate);
186 auto displayAuthor = new QAction(tr("Display author"), this);
187 displayAuthor->setCheckable(true);
Edric Milaret70ae8782016-04-18 16:10:44 -0400188 displayAuthor->setChecked(settings.value(SettingsKey::imShowAuthor).toBool());
Edric Milareta0ebd062016-01-13 12:18:23 -0500189 ui->listMessageView->addAction(displayAuthor);
190 auto lamdba = [=](){
Edric Milaret70ae8782016-04-18 16:10:44 -0400191 QSettings settings;
192 settings.setValue(SettingsKey::imShowAuthor, displayAuthor->isChecked());
193 settings.setValue(SettingsKey::imShowDate, displayDate->isChecked());
194 emit imDelegate_->sizeHintChanged(QModelIndex());
Edric Milareta0ebd062016-01-13 12:18:23 -0500195 };
196 connect(displayAuthor, &QAction::triggered, lamdba);
197 connect(displayDate, &QAction::triggered, lamdba);
Edric Milaret00a32252016-01-19 10:37:13 -0500198
199 connect(&::Media::RecordingModel::instance(),
200 SIGNAL(newTextMessage(::Media::TextRecording*, ContactMethod*)),
201 this,
202 SLOT(onIncomingMessage(::Media::TextRecording*, ContactMethod*)));
203}
204
205void
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400206CallWidget::onIncomingMessage(::Media::TextRecording* t, ContactMethod* cm)
207{
Edric Milaret00a32252016-01-19 10:37:13 -0500208 Q_UNUSED(cm)
209
210 if (!QApplication::focusWidget()) {
211 auto idx = t->instantTextMessagingModel()->
212 index(t->instantTextMessagingModel()->rowCount()-1, 0);
213 GlobalSystemTray::instance()
214 .showMessage("Ring",
215 QString(tr("Message incoming from %1")).arg(
216 idx.data((int)Media::TextRecording::Role::AuthorDisplayname).toString()));
217 QApplication::alert(this, 5000);
218 }
Edric Milareta0ebd062016-01-13 12:18:23 -0500219}
220
221void
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400222CallWidget::setupSmartListMenu()
223{
Edric Milareta0ebd062016-01-13 12:18:23 -0500224 ui->smartList->setContextMenuPolicy(Qt::CustomContextMenu);
225 connect(ui->smartList, &QListView::customContextMenuRequested, [=](const QPoint& pos){
226 auto idx = ui->smartList->currentIndex();
227 if (not idx.isValid())
228 return;
229 QPoint globalPos = ui->smartList->mapToGlobal(pos);
230 QMenu menu;
231
Edric Milaret9949b342016-02-02 12:25:08 -0500232 QVector<ContactMethod*> contactMethods = RecentModel::instance()
233 .getContactMethods(RecentModel::instance().peopleProxy()->mapToSource(idx));
234 if (contactMethods.isEmpty())
Edric Milareta0ebd062016-01-13 12:18:23 -0500235 return;
Edric Milaret9949b342016-02-02 12:25:08 -0500236
237 if (contactMethods.size() == 1) {
238 auto contactMethod = contactMethods.at(0);
239 auto copyAction = new QAction(tr("Copy number"), this);
240 menu.addAction(copyAction);
241 connect(copyAction, &QAction::triggered, [contactMethod]() {
242 QApplication::clipboard()->setText(contactMethod->uri());
Edric Milareta0ebd062016-01-13 12:18:23 -0500243 });
Edric Milaretac21b3d2016-09-01 12:45:49 -0400244 auto copyNameAction = new QAction(tr("Copy name"), this);
245 menu.addAction(copyNameAction);
246 connect(copyNameAction, &QAction::triggered, [contactMethod]() {
247 QApplication::clipboard()->setText(contactMethod->primaryName());
248 });
Edric Milaret9949b342016-02-02 12:25:08 -0500249 if (not contactMethod->contact() || contactMethod->contact()->isPlaceHolder()) {
250 auto addExisting = new QAction(tr("Add to contact"), this);
251 menu.addAction(addExisting);
252 connect(addExisting, &QAction::triggered, [globalPos, contactMethod]() {
253 ContactPicker contactPicker(contactMethod);
254 contactPicker.move(globalPos.x(), globalPos.y() - (contactPicker.height()/2));
255 contactPicker.exec();
256 });
257 }
258 }
259 else {
260 auto callMenu = menu.addMenu(tr("Call Number"));
261 auto copyMenu = menu.addMenu(tr("Copy Number"));
262 for (auto cM : contactMethods) {
263 auto uri = cM->uri();
264 auto copyAction = new QAction(tr("Copy %1").arg(uri), this);
265 copyMenu->addAction(copyAction);
266 connect(copyAction, &QAction::triggered, [uri]() {
267 QApplication::clipboard()->setText(uri);
268 });
269 auto callAction = new QAction(tr("Call %1").arg(uri), this);
270 callMenu->addAction(callAction);
271 connect(callAction, &QAction::triggered, [cM]() {
272 Call* c = CallModel::instance().dialingCall(cM);
273 c->performAction(Call::Action::ACCEPT);
274 });
275 }
Edric Milareta0ebd062016-01-13 12:18:23 -0500276 }
277 menu.exec(globalPos);
278 });
279}
280
281void
Edric Milaret67007d12015-05-07 09:40:09 -0400282CallWidget::findRingAccount(QModelIndex idx1, QModelIndex idx2, QVector<int> vec)
283{
284 Q_UNUSED(idx1)
285 Q_UNUSED(idx2)
286 Q_UNUSED(vec)
287
Edric Milareta3e47282015-10-23 15:20:30 -0400288 auto a_count = AccountModel::instance().rowCount();
Edric Milaret67007d12015-05-07 09:40:09 -0400289 for (int i = 0; i < a_count; ++i) {
Edric Milareta3e47282015-10-23 15:20:30 -0400290 auto idx = AccountModel::instance().index(i, 0);
Edric Milaret67007d12015-05-07 09:40:09 -0400291 auto protocol = idx.data(static_cast<int>(Account::Role::Proto));
Edric Milaret74474f52016-05-16 13:36:23 -0400292 if (static_cast<Account::Protocol>(protocol.toUInt()) == Account::Protocol::RING) {
Anthony Léonarda86a8972016-12-15 10:33:47 -0500293 auto account = AccountModel::instance().getAccountByModelIndex(idx);
294 auto registeredName = account->registeredName();
Edric Milaret67007d12015-05-07 09:40:09 -0400295 auto username = idx.data(static_cast<int>(Account::Role::Username));
Anthony Léonarda86a8972016-12-15 10:33:47 -0500296 if (registeredName.isEmpty()) {
297 ui->ringIdLabel->setText(username.toString());
298 } else
299 ui->ringIdLabel->setText(registeredName);
300 setupQRCode(username.toString());
Edric Milaret67007d12015-05-07 09:40:09 -0400301 return;
302 }
303 }
Edric Milaret74474f52016-05-16 13:36:23 -0400304 ui->ringIdLabel->setText(tr("NO RING ACCOUNT FOUND"));
Edric Milaret67007d12015-05-07 09:40:09 -0400305}
306
Anthony Léonarda86a8972016-12-15 10:33:47 -0500307void CallWidget::setupQRCode(QString ringID)
Edric Milarete19c4cd2016-02-12 10:19:44 -0500308{
Anthony Léonarda86a8972016-12-15 10:33:47 -0500309 auto rcode = QRcode_encodeString(ringID.toStdString().c_str(),
Edric Milaret6d0e5312016-04-04 16:30:22 -0400310 0, //Let the version be decided by libqrencode
311 QR_ECLEVEL_L, // Lowest level of error correction
Edric Milarete19c4cd2016-02-12 10:19:44 -0500312 QR_MODE_8, // 8-bit data mode
313 1);
314 if (not rcode) {
315 qWarning() << "Failed to generate QR code: " << strerror(errno);
316 return;
317 }
318
319 auto margin = 5;
320 int qrwidth = rcode->width + margin * 2;
321 QImage result(QSize(qrwidth, qrwidth), QImage::Format_Mono);
322 QPainter painter;
323 painter.begin(&result);
324 painter.setClipRect(QRect(0, 0, qrwidth, qrwidth));
325 painter.setPen(QPen(Qt::black, 0.1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
326 painter.setBrush(Qt::black);
327 painter.fillRect(QRect(0, 0, qrwidth, qrwidth), Qt::white);
Edric Milaret74474f52016-05-16 13:36:23 -0400328 unsigned char* p;
Edric Milarete19c4cd2016-02-12 10:19:44 -0500329 p = rcode->data;
330 for(int y = 0; y < rcode->width; y++) {
Edric Milaret74474f52016-05-16 13:36:23 -0400331 unsigned char* row = (p + (y * rcode->width));
Edric Milarete19c4cd2016-02-12 10:19:44 -0500332 for(int x = 0; x < rcode->width; x++) {
333 if(*(row + x) & 0x1) {
334 painter.drawRect(margin + x, margin + y, 1, 1);
335 }
336 }
337
338 }
339 painter.end();
340 QRcode_free(rcode);
Edric Milaret6d0e5312016-04-04 16:30:22 -0400341 ui->qrLabel->setPixmap(QPixmap::fromImage(result.scaled(QSize(qrSize_, qrSize_), Qt::KeepAspectRatio)));
Edric Milarete19c4cd2016-02-12 10:19:44 -0500342}
343
Edric Milaret67007d12015-05-07 09:40:09 -0400344void
345CallWidget::findRingAccount()
346{
Anthony Léonard314c2a42016-10-20 10:39:56 -0400347 ui->ringIdLabel->clear();
Edric Milaret57467842016-08-30 13:06:11 -0400348
Edric Milareta3e47282015-10-23 15:20:30 -0400349 auto a_count = AccountModel::instance().rowCount();
Edric Milaret627500d2015-03-27 16:41:40 -0400350 for (int i = 0; i < a_count; ++i) {
Edric Milareta3e47282015-10-23 15:20:30 -0400351 auto idx = AccountModel::instance().index(i, 0);
Edric Milaret627500d2015-03-27 16:41:40 -0400352 auto protocol = idx.data(static_cast<int>(Account::Role::Proto));
Edric Milaret74474f52016-05-16 13:36:23 -0400353 if (static_cast<Account::Protocol>(protocol.toUInt()) == Account::Protocol::RING) {
Edric Milareta3e47282015-10-23 15:20:30 -0400354 auto account = AccountModel::instance().getAccountByModelIndex(idx);
Edric Milaret68779c42015-07-09 16:53:03 -0400355 if (account->displayName().isEmpty())
356 account->displayName() = account->alias();
Edric Milaret57467842016-08-30 13:06:11 -0400357 if (account->needsMigration()) {
358 WizardDialog dlg(WizardDialog::MIGRATION, account);
359 dlg.exec();
360 }
361 if (ui->ringIdLabel->text().isEmpty()) {
Anthony Léonarda86a8972016-12-15 10:33:47 -0500362 auto registeredName = account->registeredName();
363 ui->ringIdLabel->setText((registeredName.isEmpty())?account->username():registeredName);
364 setupQRCode(account->username());
Edric Milaret57467842016-08-30 13:06:11 -0400365 }
Edric Milaret627500d2015-03-27 16:41:40 -0400366 }
367 }
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400368
Edric Milaret57467842016-08-30 13:06:11 -0400369 if (ui->ringIdLabel->text().isEmpty()) {
370 ui->ringIdLabel->setText(tr("NO RING ACCOUNT FOUND"));
371 WizardDialog wizardDialog;
372 wizardDialog.exec();
373 }
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400374
375 ui->currentAccountWidget->update();
376
Edric Milaret627500d2015-03-27 16:41:40 -0400377}
378
379void
Edric Milaret00d34f22016-05-09 16:30:29 -0400380CallWidget::callChangedSlot()
381{
382 if (not actualCall_)
383 return;
Edric Milaret41941582016-09-14 12:59:04 -0400384 ui->callerIdLabel->setText(QString("%1")
Edric Milaret00d34f22016-05-09 16:30:29 -0400385 .arg(actualCall_->formattedName()));
386 ui->callerPhoto->setPixmap(
387 QPixmap::fromImage(
388 GlobalInstances::pixmapManipulator()
389 .callPhoto(actualCall_, QSize(130,130)).value<QImage>()));
Olivier SOLDANO2f9e6702016-11-02 14:20:57 -0400390
Olivier SOLDANO02971ce2016-11-04 15:38:29 -0400391 if(actualCall_->state() == Call::State::OVER || actualCall_->state() == Call::State::FAILURE){
Olivier SOLDANO2f9e6702016-11-02 14:20:57 -0400392 ui->outboundCallLabel->setText(actualCall_->toHumanStateName(Call::State::INITIALIZATION));
393 } else {
394 ui->outboundCallLabel->setText(actualCall_->toHumanStateName());
395 }
Edric Milaret00d34f22016-05-09 16:30:29 -0400396}
397
398void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500399CallWidget::callIncoming(Call* call)
Edric Milaret627500d2015-03-27 16:41:40 -0400400{
Edric Milaret00a32252016-01-19 10:37:13 -0500401 if (!QApplication::focusWidget()) {
402 GlobalSystemTray::instance()
403 .showMessage("Ring",
404 QString(tr("Call incoming from %1")).arg(call->formattedName()));
Edric Milaret2cf34292015-06-22 16:27:03 -0400405 QApplication::alert(this, 5000);
406 }
407
Edric Milaret6456baa2015-05-21 12:18:07 -0400408 setActualCall(call);
Edric Milaret627500d2015-03-27 16:41:40 -0400409}
410
411void
412CallWidget::on_acceptButton_clicked()
413{
414 if (actualCall_ != nullptr)
Edric Milaret53f57b62015-05-11 11:02:17 -0400415 actualCall_->performAction(Call::Action::ACCEPT);
Edric Milaret627500d2015-03-27 16:41:40 -0400416}
417
418void
419CallWidget::on_refuseButton_clicked()
420{
421 if (actualCall_ == nullptr)
422 return;
423 actualCall_->performAction(Call::Action::REFUSE);
Nicolas Jager13745062016-02-12 18:56:40 -0500424 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
Edric Milaret6456baa2015-05-21 12:18:07 -0400425 setActualCall(nullptr);
Edric Milaret627500d2015-03-27 16:41:40 -0400426}
427
428void
Edric Milaret67007d12015-05-07 09:40:09 -0400429CallWidget::callStateChanged(Call* call, Call::State previousState)
430{
Edric Milaret627500d2015-03-27 16:41:40 -0400431 Q_UNUSED(previousState)
Edric Milaret4b1be4a2016-01-15 16:49:20 -0500432 if (call == nullptr
433 || call != actualCall_)
Edric Milaretb5b49072015-05-08 11:56:07 -0400434 return;
Edric Milareted0b2802015-10-01 15:10:02 -0400435
Olivier SOLDANOea6d71b2016-11-16 15:56:59 -0500436 callStateToView(call);
437
Edric Milaret4b1be4a2016-01-15 16:49:20 -0500438 if (call->state() == Call::State::OVER) {
Edric Milaret6456baa2015-05-21 12:18:07 -0400439 setActualCall(nullptr);
Olivier SOLDANOea6d71b2016-11-16 15:56:59 -0500440 ui->smartList->clearSelection();
Edric Milaret6b68a482016-02-01 15:23:44 -0500441 RecentModel::instance().selectionModel()->clear();
Edric Milaret627500d2015-03-27 16:41:40 -0400442 }
Edric Milaret627500d2015-03-27 16:41:40 -0400443}
444
445void
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400446CallWidget::atExit()
447{
Edric Milaret627500d2015-03-27 16:41:40 -0400448}
Edric Milaret67007d12015-05-07 09:40:09 -0400449
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400450void
451CallWidget::callStateToView(Call* value)
Edric Milaret6b68a482016-02-01 15:23:44 -0500452{
453 if (value) {
454 switch (value->state()) {
455 case Call::State::INCOMING:
456 if (not value->account()->isAutoAnswer())
457 ui->stackedWidget->setCurrentWidget(ui->callInvitePage);
458 else
459 ui->stackedWidget->setCurrentWidget(ui->videoPage);
460 break;
461 case Call::State::CURRENT:
Edric Milareta86e3f52016-03-14 16:28:57 -0400462 case Call::State::CONFERENCE:
Edric Milaret854c6b44d2016-03-08 11:00:48 -0500463 case Call::State::HOLD:
Edric Milaret6b68a482016-02-01 15:23:44 -0500464 ui->stackedWidget->setCurrentWidget(ui->videoPage);
465 break;
Olivier SOLDANO02971ce2016-11-04 15:38:29 -0400466 case Call::State::OVER:
Olivier SOLDANOea6d71b2016-11-16 15:56:59 -0500467 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
Olivier SOLDANO02971ce2016-11-04 15:38:29 -0400468 break;
Olivier SOLDANO2f9e6702016-11-02 14:20:57 -0400469 case Call::State::FAILURE:
470 case Call::State::ERROR:
Olivier SOLDANO02971ce2016-11-04 15:38:29 -0400471 on_cancelButton_clicked();
Edric Milaret6b68a482016-02-01 15:23:44 -0500472 break;
473 case Call::State::INITIALIZATION:
474 case Call::State::CONNECTED:
475 case Call::State::RINGING:
Edric Milaret6b68a482016-02-01 15:23:44 -0500476 ui->stackedWidget->setCurrentWidget(ui->outboundCallPage);
477 break;
478 default:
Edric Milaret854c6b44d2016-03-08 11:00:48 -0500479 qWarning() << "Call state not handled doing nothing : "
480 << value->toHumanStateName();
Edric Milaret6b68a482016-02-01 15:23:44 -0500481 break;
482 }
Nicolas Jager13745062016-02-12 18:56:40 -0500483 }
Edric Milaret6b68a482016-02-01 15:23:44 -0500484}
485
Edric Milaret6456baa2015-05-21 12:18:07 -0400486void
487CallWidget::setActualCall(Call* value)
488{
489 actualCall_ = value;
Edric Milaret80e0b212015-10-16 10:07:43 -0400490 CallModel::instance().selectCall(value);
491 ui->videoWidget->pushRenderer(value);
Edric Milareta86e3f52016-03-14 16:28:57 -0400492 ui->instantMessagingWidget->setMediaText(actualCall_);
Edric Milaret6b68a482016-02-01 15:23:44 -0500493 callStateToView(value);
Edric Milaret00d34f22016-05-09 16:30:29 -0400494 if (actualCall_) {
495 callChangedConnection_ = connect(actualCall_,
496 SIGNAL(changed()),
497 this,
498 SLOT(callChangedSlot()));
499 } else
500 disconnect(callChangedConnection_);
501
Edric Milaret6456baa2015-05-21 12:18:07 -0400502}
Edric Milaretc7ab5502015-06-15 11:18:02 -0400503
504void
Edric Milareted0b2802015-10-01 15:10:02 -0400505CallWidget::on_cancelButton_clicked()
Edric Milaretd8528fa2015-07-07 14:13:51 -0400506{
Olivier SOLDANO2f9e6702016-11-02 14:20:57 -0400507 if (actualCall_){
Edric Milaretd8528fa2015-07-07 14:13:51 -0400508 actualCall_->performAction(Call::Action::REFUSE);
Olivier SOLDANO2f9e6702016-11-02 14:20:57 -0400509 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
510 }
Edric Milaretd8528fa2015-07-07 14:13:51 -0400511}
Edric Milareted0b2802015-10-01 15:10:02 -0400512
513void
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400514CallWidget::on_smartList_clicked(const QModelIndex& index)
515{
516 RecentModel::instance().selectionModel()->setCurrentIndex(
517 RecentModel::instance().peopleProxy()->mapToSource(index),
518 QItemSelectionModel::ClearAndSelect);
519}
520
521void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500522CallWidget::on_smartList_doubleClicked(const QModelIndex& index)
Edric Milareted0b2802015-10-01 15:10:02 -0400523{
Edric Milareta3e47282015-10-23 15:20:30 -0400524 auto realIndex = RecentModel::instance().peopleProxy()->mapToSource(index);
525 if (RecentModel::instance().hasActiveCall(realIndex))
Edric Milareted0b2802015-10-01 15:10:02 -0400526 return;
527
528 ContactMethod* m = nullptr;
529 if (auto cm = realIndex.data((int)Call::Role::ContactMethod).value<ContactMethod*>()) {
530 m = cm;
531 } else {
532 if (auto person = realIndex.data((int)Person::Role::Object).value<Person*>()) {
533 m = person->phoneNumbers().first();
534 }
535 }
Olivier SOLDANOad0fabb2016-11-25 09:08:01 -0500536
Edric Milareta3e47282015-10-23 15:20:30 -0400537 if (m && !RecentModel::instance().index(0, 0, realIndex).isValid()) {
Olivier SOLDANOad0fabb2016-11-25 09:08:01 -0500538
539 QPixmap map = QPixmap::fromImage(
540 GlobalInstances::pixmapManipulator().callPhoto(m, QSize(130,130)).value<QImage>());
541 ui->callingPhoto->setPixmap(map);
542
Edric Milareta3e47282015-10-23 15:20:30 -0400543 Call* c = CallModel::instance().dialingCall(m);
Edric Milareted0b2802015-10-01 15:10:02 -0400544 c->performAction(Call::Action::ACCEPT);
Edric Milaret6b68a482016-02-01 15:23:44 -0500545 setActualCall(c);
Edric Milareted0b2802015-10-01 15:10:02 -0400546 }
547}
548
549void
Olivier SOLDANO61065ec2016-11-11 16:31:34 -0500550CallWidget::smartListCurrentChanged(const QModelIndex &currentIdx, const QModelIndex &previousIdx)
551{
552 Q_UNUSED(previousIdx);
553 if (not currentIdx.isValid())
Edric Milareted0b2802015-10-01 15:10:02 -0400554 return;
555
Olivier SOLDANO703caba2016-11-15 16:18:55 -0500556 //catch call of current index
Olivier SOLDANO61065ec2016-11-11 16:31:34 -0500557 auto currentIdxCall = RecentModel::instance().getActiveCall(currentIdx);
Olivier SOLDANO703caba2016-11-15 16:18:55 -0500558
559 if (currentIdxCall && currentIdxCall != actualCall_) { //if it is different from actual call, switch between the two
Olivier SOLDANO61065ec2016-11-11 16:31:34 -0500560 setActualCall(currentIdxCall);
Olivier SOLDANO703caba2016-11-15 16:18:55 -0500561 } else if (currentIdxCall == nullptr){ // if there is no call attached to this smartlist index (contact tab)
Edric Milareta0ebd062016-01-13 12:18:23 -0500562 setActualCall(nullptr);
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400563 showIMOutOfCall(currentIdx); // change page to contact request of messaging page with correct behaviour
Olivier SOLDANO703caba2016-11-15 16:18:55 -0500564 } else { // if non defined behaviour disconnect instant messaging and return to welcome page
Edric Milareted0b2802015-10-01 15:10:02 -0400565 setActualCall(nullptr);
Edric Milaret7ef617b2016-02-01 15:40:57 -0500566 if (imConnection_)
567 disconnect(imConnection_);
Edric Milareted0b2802015-10-01 15:10:02 -0400568 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
569 }
570}
571
572void
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400573CallWidget::configureSendCRPageButton(const QModelIndex& currentIdx)
574{
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400575 if (currentIdx.isValid()){
576 QVector<ContactMethod*> cmVector = RecentModel::instance().getContactMethods(currentIdx);
577 if (cmVector.size() == 0){
578 ui->sendContactRequestPageButton->hide();
579 return;
580 }
581
582 URI cmUri = cmVector[0]->uri();
583 if (cmUri.protocolHint() == URI::ProtocolHint::RING || uriNeedNameLookup(cmUri)) {
584 ui->sendContactRequestPageButton->show();
585 } else {
586 ui->sendContactRequestPageButton->hide();
587 }
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400588 } else {
589 ui->sendContactRequestPageButton->hide();
590 }
591}
592
593void
Edric Milareted0b2802015-10-01 15:10:02 -0400594CallWidget::placeCall()
595{
Nicolas Jager97a21b42015-12-03 16:55:45 -0500596 if (ui->ringContactLineEdit->text().isEmpty())
Edric Milareted0b2802015-10-01 15:10:02 -0400597 return;
Nicolas Jager97a21b42015-12-03 16:55:45 -0500598 Call* c = CallModel::instance().dialingCall(PhoneDirectoryModel::instance().getNumber(ui->ringContactLineEdit->text()));
Edric Milareted0b2802015-10-01 15:10:02 -0400599 c->performAction(Call::Action::ACCEPT);
Nicolas Jager97a21b42015-12-03 16:55:45 -0500600 ui->ringContactLineEdit->clear();
Edric1bed3f92016-05-19 10:24:48 -0400601 ui->callingPhoto->setPixmap(
602 QPixmap::fromImage(
603 GlobalInstances::pixmapManipulator()
604 .callPhoto(c, QSize(130,130)).value<QImage>()));
Edric Milareted0b2802015-10-01 15:10:02 -0400605}
606
607void
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500608CallWidget::settingsButtonClicked()
Edric Milareted0b2802015-10-01 15:10:02 -0400609{
610 emit NavigationRequested(ScreenEnum::ConfScreen);
611}
612
613void
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400614CallWidget::searchContactLineEditEntry(const URI &uri)
615{
616 auto cm = PhoneDirectoryModel::instance().getNumber(uri);
617 // if its a new CM, bring it to the top
618 if (cm->lastUsed() == 0)
619 cm->setLastUsed(QDateTime::currentDateTime().toTime_t());
620
621 // select cm
622 RecentModel::instance().selectionModel()->setCurrentIndex(RecentModel::instance().getIndex(cm),
623 QItemSelectionModel::ClearAndSelect);
624 ui->ringContactLineEdit->clear();
625}
626
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400627bool
628CallWidget::uriNeedNameLookup(const URI uri_passed)
629{
630 if (uri_passed.protocolHint() == URI::ProtocolHint::RING_USERNAME ) {
631 return TRUE;
632 } else if (
633 uri_passed.protocolHint() != URI::ProtocolHint::RING && // not a RingID
634 uri_passed.schemeType() == URI::SchemeType::NONE // scheme type not specified
635 ){
636 // if no scheme type has been specified, determine ring vs sip by the first available account
637 auto idx = AvailableAccountModel::instance().index(0, 0);
638 if (idx.isValid()) {
639 auto account = idx.data((int)Ring::Role::Object).value<Account *>();
640 if (account && account->protocol() == Account::Protocol::RING)
641 return TRUE;
642 }
643 }
644
645 return FALSE;
646}
647
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400648void
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400649CallWidget::processContactLineEdit()
Nicolas Jager97a21b42015-12-03 16:55:45 -0500650{
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400651 auto contactLineText = ui->ringContactLineEdit->text();
652 URI uri_passed = URI(contactLineText);
Nicolas Jager5e845d52016-02-18 13:26:12 -0500653
Olivier SOLDANO63178ee2016-11-04 16:50:08 -0400654 if (!contactLineText.isNull() && !contactLineText.isEmpty()){
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400655 if (uriNeedNameLookup(uri_passed)){
Olivier SOLDANO63178ee2016-11-04 16:50:08 -0400656 NameDirectory::instance().lookupName(nullptr, QString(), uri_passed);
657 } else {
658 searchContactLineEditEntry(uri_passed);
659 }
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400660 }
Nicolas Jager97a21b42015-12-03 16:55:45 -0500661}
662
663void
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400664CallWidget::on_ringContactLineEdit_returnPressed()
Nicolas Jager97a21b42015-12-03 16:55:45 -0500665{
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400666 processContactLineEdit();
667}
668
669void
670CallWidget::searchBtnClicked()
671{
672 processContactLineEdit();
Nicolas Jager97a21b42015-12-03 16:55:45 -0500673}
674
675void
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500676CallWidget::btnComBarVideoClicked()
Nicolas Jager97a21b42015-12-03 16:55:45 -0500677{
678 if (not highLightedIndex_.isValid())
679 return;
680
681 on_smartList_doubleClicked(highLightedIndex_);
682}
Edric Milaretab12d022015-12-04 16:09:44 -0500683
684void
Edric Milaret6b68a482016-02-01 15:23:44 -0500685CallWidget::showIMOutOfCall(const QModelIndex& nodeIdx)
Edric Milaretab12d022015-12-04 16:09:44 -0500686{
Edric Milaretab12d022015-12-04 16:09:44 -0500687 ui->contactMethodComboBox->clear();
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400688 configureSendCRPageButton(nodeIdx);
Edric Milareta0ebd062016-01-13 12:18:23 -0500689 ui->imNameLabel->setText(QString(tr("Conversation with %1", "%1 is the contact name"))
690 .arg(nodeIdx.data(static_cast<int>(Ring::Role::Name)).toString()));
Edric Milaretab12d022015-12-04 16:09:44 -0500691 auto cmVector = RecentModel::instance().getContactMethods(nodeIdx);
Edric Milareta0ebd062016-01-13 12:18:23 -0500692 ui->contactMethodComboBox->setEnabled(cmVector.size() > 1);
Edric Milaretab12d022015-12-04 16:09:44 -0500693 foreach (const ContactMethod* cm, cmVector) {
Edric Milareta0ebd062016-01-13 12:18:23 -0500694 ui->contactMethodComboBox->addItem(cm->uri());
Edric Milaretab12d022015-12-04 16:09:44 -0500695 }
Olivier SOLDANOad0fabb2016-11-25 09:08:01 -0500696 ui->stackedWidget->setCurrentWidget(ui->messagingPage);
Edric Milaret70ae8782016-04-18 16:10:44 -0400697 disconnect(imClickedConnection_);
698 imClickedConnection_ = connect(ui->listMessageView, &QListView::clicked, [this](const QModelIndex& index) {
699 auto urlList = index.data(static_cast<int>(Media::TextRecording::Role::LinkList)).value<QList<QUrl>>();
700 if (urlList.size() == 1)
701 QDesktopServices::openUrl(urlList.at(0));
702 else if (urlList.size()) {
703 //TODO Handle multiple url in one message
704 }
705 });
Edric Milaretab12d022015-12-04 16:09:44 -0500706}
707
708void
Edric Milaret6a785af2016-03-07 15:39:30 -0500709CallWidget::on_sendIMButton_clicked()
Edric Milaretab12d022015-12-04 16:09:44 -0500710{
Edric Milaret6a785af2016-03-07 15:39:30 -0500711 if (ui->imMessageEdit->text().trimmed().isEmpty())
Edric Milaretab12d022015-12-04 16:09:44 -0500712 return;
713 auto number = ui->contactMethodComboBox->currentText();
714 if (auto cm = PhoneDirectoryModel::instance().getNumber(number)) {
715 QMap<QString, QString> msg;
Edric Milaret6a785af2016-03-07 15:39:30 -0500716 msg["text/plain"] = ui->imMessageEdit->text();
Edric Milaretab12d022015-12-04 16:09:44 -0500717 cm->sendOfflineTextMessage(msg);
Edric Milaret6a785af2016-03-07 15:39:30 -0500718 ui->imMessageEdit->clear();
Edric Milaretab12d022015-12-04 16:09:44 -0500719 } else {
720 qWarning() << "Contact Method not found for " << number;
721 }
722}
723
724void
Edric Milaret6a785af2016-03-07 15:39:30 -0500725CallWidget::on_imMessageEdit_returnPressed()
Edric Milaretab12d022015-12-04 16:09:44 -0500726{
Edric Milaret6a785af2016-03-07 15:39:30 -0500727 on_sendIMButton_clicked();
Edric Milaretab12d022015-12-04 16:09:44 -0500728}
729
730void
731CallWidget::on_contactMethodComboBox_currentIndexChanged(const QString& number)
732{
733 auto cm = PhoneDirectoryModel::instance().getNumber(number);
734 if (auto txtRecording = cm->textRecording()) {
735 ui->listMessageView->setModel(txtRecording->instantMessagingModel());
Edric Milaret7ef617b2016-02-01 15:40:57 -0500736 if (imConnection_)
737 disconnect(imConnection_);
Edric Milaretab12d022015-12-04 16:09:44 -0500738 imConnection_ = connect(txtRecording,
Edric Milareta0ebd062016-01-13 12:18:23 -0500739 SIGNAL(messageInserted(QMap<QString,QString>,ContactMethod*,Media::Media::Direction)),
740 this,
741 SLOT(slotAccountMessageReceived(QMap<QString,QString>,ContactMethod*,Media::Media::Direction)));
Edric Milaret4be72022016-01-19 10:24:13 -0500742 auto messagesPresent = txtRecording->instantMessagingModel()->rowCount() > 0;
743 if (messagesPresent) {
744 ui->listMessageView->scrollToBottom();
745 txtRecording->setAllRead();
746 }
747 ui->listMessageView->setVisible(messagesPresent);
748 ui->noMessagesLabel->setVisible(!messagesPresent);
749 if (not messagesPresent) {
Edric Milaret49130472016-01-22 10:39:37 -0500750 imVisibleConnection_ = connect(txtRecording->instantMessagingModel(),
751 &QAbstractItemModel::rowsInserted,
752 [this, txtRecording]() {
753 if (imVisibleConnection_)
754 disconnect(imVisibleConnection_);
755 auto messagesPresent = txtRecording->instantMessagingModel()->rowCount() > 0;
Edric Milaret4be72022016-01-19 10:24:13 -0500756 ui->listMessageView->setVisible(messagesPresent);
757 ui->noMessagesLabel->setVisible(!messagesPresent);
Edric Milaret4be72022016-01-19 10:24:13 -0500758 });
759 }
Edric Milaretab12d022015-12-04 16:09:44 -0500760 }
761}
762
763void
764CallWidget::slotAccountMessageReceived(const QMap<QString,QString> message,
765 ContactMethod* cm,
766 Media::Media::Direction dir)
767{
768 Q_UNUSED(message)
Edric Milaretab12d022015-12-04 16:09:44 -0500769 Q_UNUSED(dir)
770
771 ui->listMessageView->scrollToBottom();
Edric Milaret23fd3fa2016-01-15 15:37:35 -0500772 cm->textRecording()->setAllRead();
Edric Milaretab12d022015-12-04 16:09:44 -0500773}
Edric Milaretfa05d972016-01-13 16:22:04 -0500774
775void
Edric Milaret8001f6f2016-01-27 09:55:12 -0500776CallWidget::on_ringContactLineEdit_textChanged(const QString& text)
Edric Milaretfa05d972016-01-13 16:22:04 -0500777{
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400778 RecentModel::instance().peopleProxy()->setFilterRegExp(QRegExp(text, Qt::CaseInsensitive, QRegExp::FixedString));
Edric Milaretfa05d972016-01-13 16:22:04 -0500779}
Edric Milareta0ebd062016-01-13 12:18:23 -0500780
Nicolas Jagerca850292016-01-17 14:11:10 -0500781void
782CallWidget::on_imBackButton_clicked()
Edric Milareta0ebd062016-01-13 12:18:23 -0500783{
Edric Milaret6b68a482016-02-01 15:23:44 -0500784 RecentModel::instance().selectionModel()->clear();
785 slidePage(ui->welcomePage);
Nicolas Jagerca850292016-01-17 14:11:10 -0500786}
787
788void
Edric Milaret6b68a482016-02-01 15:23:44 -0500789CallWidget::slidePage(QWidget* widget, bool toRight)
Nicolas Jagerca850292016-01-17 14:11:10 -0500790{
Edric Milaret6b68a482016-02-01 15:23:44 -0500791 short dir = (toRight ? -1 : 1);
Nicolas Jagerca850292016-01-17 14:11:10 -0500792 ui->stackedWidget->setCurrentWidget(widget);
Edric Milaret6b68a482016-02-01 15:23:44 -0500793 pageAnim_->setTargetObject(widget);
794 pageAnim_->setDuration(animDuration_);
795 pageAnim_->setStartValue(QPoint(widget->width() * dir, widget->y()));
796 pageAnim_->setEndValue(QPoint(widget->x(), widget->y()));
797 pageAnim_->setEasingCurve(QEasingCurve::OutQuad);
798 pageAnim_->start();
Nicolas Jagerca850292016-01-17 14:11:10 -0500799}
800
801void
Edric Milaret7cf39e22016-02-02 12:44:03 -0500802CallWidget::on_copyCMButton_clicked()
803{
804 auto text = ui->contactMethodComboBox->currentText();
805 QApplication::clipboard()->setText(text);
806}
Edric Milaret4097d2f2016-02-09 14:41:50 -0500807
808void
Edric Milaret1e598592016-09-02 10:10:01 -0400809CallWidget::on_qrButton_toggled(bool checked)
810{
811 ui->qrLabel->setVisible(checked);
812}
813
814void
Edric Milaret4097d2f2016-02-09 14:41:50 -0500815CallWidget::on_shareButton_clicked()
816{
Edric Milaret1e598592016-09-02 10:10:01 -0400817 Utils::InvokeMailto(tr("Contact me on Ring"), tr("My RingId is : ") + ui->ringIdLabel->text());
Edric Milaret4097d2f2016-02-09 14:41:50 -0500818}
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400819
820void
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400821CallWidget::contactLineEdit_registeredNameFound(Account* account,NameDirectory::LookupStatus status,
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400822 const QString& address,const QString& name)
823{
824 URI uri = URI(ui->ringContactLineEdit->text());
825 QString username_to_lookup = uri.userinfo();
826
827 if (username_to_lookup.compare(name) != 0){
828 return;
829 }
830
831 switch (status)
832 {
833 case NameDirectory::LookupStatus::SUCCESS:
834 {
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400835
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400836 uri = URI("ring:" + address);
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400837 qDebug() << "contactLineEdit username to search: " << username_to_lookup;
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400838 qDebug() << uri;
839 searchContactLineEditEntry(uri);
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400840 auto cm = PhoneDirectoryModel::instance().getNumber(uri);
Olivier SOLDANO9657fd12017-03-27 16:06:53 -0400841 cm->setAccount(account);
Anthony Léonardaa90e1a2016-10-12 11:24:17 -0400842 break;
843 }
844 case NameDirectory::LookupStatus::INVALID_NAME:
845 {
846 qDebug() << "Invalid Ring username";
847 break;
848 }
849 case NameDirectory::LookupStatus::ERROR:
850 case NameDirectory::LookupStatus::NOT_FOUND:
851 default:
852 {
853 qDebug() << "Could not resolve Ring username";
854 break;
855 }
856 }
857}
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400858
859void
860CallWidget::on_sendContactRequestPageButton_clicked()
861{
862 ui->sendContactRequestWidget->sendCR(RecentModel::instance().selectionModel()->currentIndex());
863 // temporarly changed comportment waiting for message in payload implementation
864 /*ui->sendContactRequestWidget->setup(RecentModel::instance().selectionModel()->currentIndex());
865 slidePage(ui->sendContactRequestPage);*/
866}
867
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -0400868void
869CallWidget::on_sendCRBackButton_clicked()
Olivier SOLDANOdd878662017-03-27 16:00:06 -0400870{
871 slidePage(ui->messagingPage);
872}