a14b39d541
Summary: This patch fixes T10184 and stops the SMS app from crashing when a conversation is selected but no devices are connected. It also allows the SMS app to access the cached messages in the ConversationsDbusInterface so the app is still slightly useful even when the device is disconnected. Test Plan: - Open sms app - Open a few conversations - Disconnect phone (Force close app?) - Re-open a conversation which was previously opened - Verify that the messages appear. It is possible to scroll up to view any older cached messages too! - Open a conversation which was not opened previously - Verify that a single messages is shown (since this was the only one in cache, from populating the list of all conversations) - Verify that attempting to scroll this conversation does nothing, but also does not crash the app Note: Opening the app with no phone connected will cause it to lose its handle on the deviceId, so it can't spawn a new Dbus interface, so it will remain blank and empty. Solving that is a project for another day. Reviewers: #kde_connect Reviewed By: #kde_connect Subscribers: apol, nicolasfella, kdeconnect Tags: #kde_connect Maniphest Tasks: T10184 Differential Revision: https://phabricator.kde.org/D17634
129 lines
4.3 KiB
QML
129 lines
4.3 KiB
QML
/**
|
|
* Copyright (C) 2018 Aleix Pol Gonzalez <aleixpol@kde.org>
|
|
* Copyright (C) 2018 Nicolas Fella <nicolas.fella@gmx.de>
|
|
* Copyright (C) 2018 Simon Redman <simon@ergotech.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of
|
|
* the License or (at your option) version 3 or any later version
|
|
* accepted by the membership of KDE e.V. (or its successor approved
|
|
* by the membership of KDE e.V.), which shall act as a proxy
|
|
* defined in Section 14 of version 3 of the license.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
import QtQuick 2.5
|
|
import QtQuick.Controls 2.1
|
|
import QtQuick.Layouts 1.1
|
|
import org.kde.people 1.0
|
|
import org.kde.kirigami 2.2 as Kirigami
|
|
import org.kde.kdeconnect 1.0
|
|
import org.kde.kdeconnect.sms 1.0
|
|
|
|
Kirigami.ScrollablePage
|
|
{
|
|
id: page
|
|
footer: ComboBox {
|
|
id: devicesCombo
|
|
enabled: count > 0
|
|
model: DevicesSortProxyModel {
|
|
id: devicesModel
|
|
//TODO: make it possible to filter if they can do sms
|
|
sourceModel: DevicesModel { displayFilter: DevicesModel.Paired | DevicesModel.Reachable }
|
|
onRowsInserted: if (devicesCombo.currentIndex < 0) {
|
|
devicesCombo.currentIndex = 0
|
|
}
|
|
}
|
|
textRole: "display"
|
|
}
|
|
|
|
Label {
|
|
text: i18n("No devices available")
|
|
anchors.centerIn: parent
|
|
visible: !devicesCombo.enabled
|
|
}
|
|
|
|
readonly property bool deviceConnected: devicesCombo.enabled
|
|
readonly property QtObject device: devicesCombo.currentIndex >= 0 ? devicesModel.data(devicesModel.index(devicesCombo.currentIndex, 0), DevicesModel.DeviceRole) : null
|
|
readonly property alias lastDeviceId: conversationListModel.deviceId
|
|
|
|
Component {
|
|
id: chatView
|
|
ConversationDisplay {
|
|
deviceId: page.lastDeviceId
|
|
deviceConnected: page.deviceConnected
|
|
}
|
|
}
|
|
|
|
ListView {
|
|
id: view
|
|
currentIndex: 0
|
|
|
|
model: QSortFilterProxyModel {
|
|
sortOrder: Qt.DescendingOrder
|
|
sortRole: ConversationListModel.DateRole
|
|
filterCaseSensitivity: Qt.CaseInsensitive
|
|
sourceModel: ConversationListModel {
|
|
id: conversationListModel
|
|
deviceId: device ? device.id() : ""
|
|
}
|
|
}
|
|
|
|
header: TextField {
|
|
/**
|
|
* Used as the filter of the list of messages
|
|
*/
|
|
id: filter
|
|
placeholderText: i18n("Filter...")
|
|
width: parent.width
|
|
z: 10
|
|
onTextChanged: {
|
|
view.model.setFilterFixedString(filter.text);
|
|
view.currentIndex = 0
|
|
}
|
|
onAccepted: {
|
|
view.currentItem.startChat()
|
|
}
|
|
Keys.onReturnPressed: {
|
|
event.accepted = true
|
|
filter.onAccepted()
|
|
}
|
|
Keys.onEscapePressed: {
|
|
event.accepted = filter.text != ""
|
|
filter.text = ""
|
|
}
|
|
Shortcut {
|
|
sequence: "Ctrl+F"
|
|
onActivated: filter.forceActiveFocus()
|
|
}
|
|
}
|
|
headerPositioning: ListView.OverlayHeader
|
|
|
|
Keys.forwardTo: [headerItem]
|
|
|
|
delegate: Kirigami.BasicListItem
|
|
{
|
|
hoverEnabled: true
|
|
|
|
label: i18n("<b>%1</b> <br> %2", display, toolTip)
|
|
icon: decoration
|
|
function startChat() {
|
|
applicationWindow().pageStack.push(chatView, {
|
|
personUri: model.personUri,
|
|
phoneNumber: address,
|
|
conversationId: model.conversationId,
|
|
})
|
|
}
|
|
onClicked: { startChat(); }
|
|
}
|
|
|
|
}
|
|
}
|