2018-10-30 20:01:13 +00:00
|
|
|
/**
|
2020-08-17 10:48:10 +01:00
|
|
|
* SPDX-FileCopyrightText: 2018 Aleix Pol Gonzalez <aleixpol@kde.org>
|
|
|
|
* SPDX-FileCopyrightText: 2018 Nicolas Fella <nicolas.fella@gmx.de>
|
|
|
|
* SPDX-FileCopyrightText: 2018 Simon Redman <simon@ergotech.com>
|
2018-10-30 20:01:13 +00:00
|
|
|
*
|
2020-08-17 10:48:10 +01:00
|
|
|
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
2018-10-30 20:01:13 +00:00
|
|
|
*/
|
|
|
|
|
2023-12-23 16:48:04 +00:00
|
|
|
import QtQuick
|
|
|
|
import QtQuick.Controls as Controls
|
|
|
|
import QtQuick.Layouts
|
|
|
|
import org.kde.people
|
|
|
|
import org.kde.kirigami as Kirigami
|
|
|
|
import org.kde.kdeconnect.sms
|
2023-09-21 18:23:06 +01:00
|
|
|
import Qt5Compat.GraphicalEffects
|
2018-10-30 20:01:13 +00:00
|
|
|
|
|
|
|
Kirigami.ScrollablePage
|
|
|
|
{
|
|
|
|
id: page
|
2019-01-23 01:27:10 +00:00
|
|
|
|
|
|
|
property bool deviceConnected
|
[SMS App] Allow passing a message via args
Summary:
Add --message option to kdeconnect-sms to pass a message. The user only needs to choose a recepient and the message will be sent. Useful for integration with 3rd party
apps, e.g. via Purpose
Test Plan:
kdeconnect-sms --message "Hello World", choose chat, message is sent
Click another chat, no message sent
kdeconnect-sms without args, no message sent
Reviewers: #kde_connect, sredman
Reviewed By: #kde_connect, sredman
Subscribers: andyholmes, sredman, apol, kdeconnect
Tags: #kde_connect
Differential Revision: https://phabricator.kde.org/D17292
2019-03-09 21:32:36 +00:00
|
|
|
property string conversationId
|
2019-07-19 16:29:28 +01:00
|
|
|
property bool isMultitarget
|
[SMS App] Allow passing a message via args
Summary:
Add --message option to kdeconnect-sms to pass a message. The user only needs to choose a recepient and the message will be sent. Useful for integration with 3rd party
apps, e.g. via Purpose
Test Plan:
kdeconnect-sms --message "Hello World", choose chat, message is sent
Click another chat, no message sent
kdeconnect-sms without args, no message sent
Reviewers: #kde_connect, sredman
Reviewed By: #kde_connect, sredman
Subscribers: andyholmes, sredman, apol, kdeconnect
Tags: #kde_connect
Differential Revision: https://phabricator.kde.org/D17292
2019-03-09 21:32:36 +00:00
|
|
|
property string initialMessage
|
2020-03-21 22:57:28 +00:00
|
|
|
property string invalidId: "-1"
|
2018-10-30 20:01:13 +00:00
|
|
|
|
2019-07-21 12:16:11 +01:00
|
|
|
property bool isInitalized: false
|
|
|
|
|
2019-07-19 18:33:15 +01:00
|
|
|
property var conversationModel: ConversationModel {
|
2022-05-30 21:29:17 +01:00
|
|
|
deviceId: AppData.deviceId
|
2019-07-19 18:33:15 +01:00
|
|
|
threadId: page.conversationId
|
2020-05-18 03:41:26 +01:00
|
|
|
addressList: page.addresses
|
2019-07-29 21:12:32 +01:00
|
|
|
|
|
|
|
onLoadingFinished: {
|
|
|
|
page.isInitalized = true
|
|
|
|
}
|
2019-07-19 18:33:15 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
property var addresses
|
2020-05-09 17:50:08 +01:00
|
|
|
title: SmsHelper.getTitleForAddresses(addresses)
|
2018-10-30 20:01:13 +00:00
|
|
|
|
[SMS App] Allow passing a message via args
Summary:
Add --message option to kdeconnect-sms to pass a message. The user only needs to choose a recepient and the message will be sent. Useful for integration with 3rd party
apps, e.g. via Purpose
Test Plan:
kdeconnect-sms --message "Hello World", choose chat, message is sent
Click another chat, no message sent
kdeconnect-sms without args, no message sent
Reviewers: #kde_connect, sredman
Reviewed By: #kde_connect, sredman
Subscribers: andyholmes, sredman, apol, kdeconnect
Tags: #kde_connect
Differential Revision: https://phabricator.kde.org/D17292
2019-03-09 21:32:36 +00:00
|
|
|
Component.onCompleted: {
|
|
|
|
if (initialMessage.length > 0) {
|
2022-05-12 19:34:24 +01:00
|
|
|
sendingArea.text = initialMessage;
|
[SMS App] Allow passing a message via args
Summary:
Add --message option to kdeconnect-sms to pass a message. The user only needs to choose a recepient and the message will be sent. Useful for integration with 3rd party
apps, e.g. via Purpose
Test Plan:
kdeconnect-sms --message "Hello World", choose chat, message is sent
Click another chat, no message sent
kdeconnect-sms without args, no message sent
Reviewers: #kde_connect, sredman
Reviewed By: #kde_connect, sredman
Subscribers: andyholmes, sredman, apol, kdeconnect
Tags: #kde_connect
Differential Revision: https://phabricator.kde.org/D17292
2019-03-09 21:32:36 +00:00
|
|
|
initialMessage = ""
|
|
|
|
}
|
2020-03-21 22:57:28 +00:00
|
|
|
if (conversationId == invalidId) {
|
|
|
|
isInitalized = true
|
|
|
|
}
|
[SMS App] Allow passing a message via args
Summary:
Add --message option to kdeconnect-sms to pass a message. The user only needs to choose a recepient and the message will be sent. Useful for integration with 3rd party
apps, e.g. via Purpose
Test Plan:
kdeconnect-sms --message "Hello World", choose chat, message is sent
Click another chat, no message sent
kdeconnect-sms without args, no message sent
Reviewers: #kde_connect, sredman
Reviewed By: #kde_connect, sredman
Subscribers: andyholmes, sredman, apol, kdeconnect
Tags: #kde_connect
Differential Revision: https://phabricator.kde.org/D17292
2019-03-09 21:32:36 +00:00
|
|
|
}
|
|
|
|
|
2018-12-13 05:50:08 +00:00
|
|
|
/**
|
|
|
|
* Build a chat message which is representative of all chat messages
|
|
|
|
*
|
|
|
|
* In other words, one which I can use to get a reasonable height guess
|
|
|
|
*/
|
|
|
|
ChatMessage {
|
|
|
|
id: genericMessage
|
2019-07-27 11:02:24 +01:00
|
|
|
name: "Generic Sender"
|
2018-12-13 05:50:08 +00:00
|
|
|
messageBody: "Generic Message Body"
|
|
|
|
dateTime: new Date('2000-0-0')
|
|
|
|
visible: false
|
|
|
|
enabled: false
|
|
|
|
}
|
|
|
|
|
2018-10-30 20:01:13 +00:00
|
|
|
ListView {
|
2018-12-13 05:50:08 +00:00
|
|
|
id: viewport
|
2018-10-30 20:01:13 +00:00
|
|
|
model: QSortFilterProxyModel {
|
|
|
|
id: model
|
|
|
|
sortOrder: Qt.AscendingOrder
|
|
|
|
sortRole: ConversationModel.DateRole
|
2019-07-19 18:33:15 +01:00
|
|
|
sourceModel: conversationModel
|
2018-10-30 20:01:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
spacing: Kirigami.Units.largeSpacing
|
2019-07-21 12:16:11 +01:00
|
|
|
highlightMoveDuration: 0
|
2018-10-30 20:01:13 +00:00
|
|
|
|
2020-05-09 17:50:08 +01:00
|
|
|
Controls.BusyIndicator {
|
2019-07-21 18:27:08 +01:00
|
|
|
running: !isInitalized
|
2022-02-09 03:47:36 +00:00
|
|
|
anchors.centerIn: parent
|
2019-07-21 18:27:08 +01:00
|
|
|
}
|
|
|
|
|
2022-02-09 03:47:36 +00:00
|
|
|
header: Item {
|
|
|
|
height: Kirigami.Units.largeSpacing * 2
|
|
|
|
}
|
|
|
|
headerPositioning: ListView.InlineHeader
|
|
|
|
|
2019-07-21 18:27:08 +01:00
|
|
|
onContentHeightChanged: {
|
|
|
|
if (viewport.contentHeight <= 0) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!isInitalized) {
|
2019-12-22 07:49:55 +00:00
|
|
|
// If we aren't initialized, we need to request enough messages to fill the view
|
2019-07-21 18:27:08 +01:00
|
|
|
// In order to do that, request one more message until we have enough
|
|
|
|
if (viewport.contentHeight < viewport.height) {
|
|
|
|
console.debug("Requesting another message to fill the screen")
|
|
|
|
conversationModel.requestMoreMessages(1)
|
|
|
|
} else {
|
2019-12-22 07:49:55 +00:00
|
|
|
// Finish initializing: Scroll to the bottom of the view
|
2019-07-21 18:27:08 +01:00
|
|
|
|
|
|
|
// View the most-recent message
|
|
|
|
viewport.forceLayout()
|
|
|
|
Qt.callLater(viewport.positionViewAtEnd)
|
|
|
|
isInitalized = true
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-30 20:01:13 +00:00
|
|
|
delegate: ChatMessage {
|
2019-07-27 11:02:24 +01:00
|
|
|
name: model.sender
|
2018-10-30 20:01:13 +00:00
|
|
|
messageBody: model.display
|
|
|
|
sentByMe: model.fromMe
|
|
|
|
dateTime: new Date(model.date)
|
2020-06-27 17:37:59 +01:00
|
|
|
multiTarget: isMultitarget
|
2020-08-09 20:00:57 +01:00
|
|
|
attachmentList: model.attachments
|
2018-12-13 05:50:08 +00:00
|
|
|
|
2020-07-01 20:15:45 +01:00
|
|
|
width: viewport.width
|
|
|
|
|
2018-12-13 05:50:08 +00:00
|
|
|
ListView.onAdd: {
|
2019-07-21 12:16:11 +01:00
|
|
|
if (!isInitalized) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-07-21 18:27:08 +01:00
|
|
|
if (index == viewport.count - 1) {
|
2018-12-13 05:50:08 +00:00
|
|
|
// This message is being inserted at the newest position
|
|
|
|
// We want to scroll to show it if the user is "almost" looking at it
|
|
|
|
|
|
|
|
// Define some fudge area. If the message is being drawn offscreen but within
|
|
|
|
// this distance, we move to show it anyway.
|
|
|
|
// Selected to be genericMessage.height because that value scales for different
|
|
|
|
// font sizes / DPI / etc. -- Better ideas are welcome!
|
|
|
|
// Double the value works nicely
|
|
|
|
var offscreenFudge = 2 * genericMessage.height
|
|
|
|
|
|
|
|
var viewportYBottom = viewport.contentY + viewport.height
|
|
|
|
|
|
|
|
if (y < viewportYBottom + genericMessage.height) {
|
2019-07-21 12:16:11 +01:00
|
|
|
viewport.highlightMoveDuration = -1
|
2018-12-13 05:50:08 +00:00
|
|
|
viewport.currentIndex = index
|
|
|
|
}
|
2019-07-21 18:27:08 +01:00
|
|
|
}
|
2018-12-13 05:50:08 +00:00
|
|
|
}
|
2019-07-27 11:02:24 +01:00
|
|
|
|
|
|
|
onMessageCopyRequested: {
|
2020-05-09 17:50:08 +01:00
|
|
|
SmsHelper.copyToClipboard(message)
|
2019-07-27 11:02:24 +01:00
|
|
|
}
|
2018-10-30 20:01:13 +00:00
|
|
|
}
|
|
|
|
|
2023-01-22 22:10:46 +00:00
|
|
|
/// As the user scrolls, load more messages when they get to the top.
|
|
|
|
/// This used to use the onMovementEnded signal, but at some point
|
|
|
|
/// that signal stopped being emitted reliably when scrolling with
|
|
|
|
/// the mouse. onContentYChanged is fine for our use, just a bit noisy.
|
|
|
|
onContentYChanged: {
|
2019-07-21 12:16:11 +01:00
|
|
|
if (!isInitalized) {
|
|
|
|
return
|
|
|
|
}
|
2018-12-13 05:50:08 +00:00
|
|
|
|
2023-01-22 22:10:46 +00:00
|
|
|
// If we have scrolled near to the top, request more messages
|
|
|
|
// This threshold of visibleArea.yPosition has been chosen experimentally, but
|
|
|
|
// should generally be OK because it is defined as a ratio of the content to the visible
|
|
|
|
// area. As more messages get loaded into our view, this constant will start to be
|
|
|
|
// less-sane, meaning we will request messages earlier as the user scrolls back in time.
|
|
|
|
// This is probably a good thing, because it means that scrolling back further and further
|
|
|
|
// quickly, will be more likely to be smooth.
|
|
|
|
// Combined with `atYBeginning`, the view scrolls smoothly for me, long past the point where
|
|
|
|
// the rest of the app is stable, and past the point where Android can fetch messages fast
|
|
|
|
// enough.
|
|
|
|
if (visibleArea.yPosition < 0.075 || atYBeginning) {
|
2018-12-13 05:50:08 +00:00
|
|
|
// "Lock" the view to the message currently at the beginning of the view
|
|
|
|
// This prevents the view from snapping to the top of the messages we are about to request
|
|
|
|
currentIndex = 0 // Index 0 is the beginning of the view
|
|
|
|
preferredHighlightBegin = visibleArea.yPosition
|
|
|
|
preferredHighlightEnd = preferredHighlightBegin + currentItem.height
|
|
|
|
highlightRangeMode = ListView.StrictlyEnforceRange
|
|
|
|
|
2019-07-21 18:27:08 +01:00
|
|
|
highlightMoveDuration = 0
|
2018-12-13 05:50:08 +00:00
|
|
|
|
|
|
|
// Get more messages
|
2019-07-19 18:33:15 +01:00
|
|
|
conversationModel.requestMoreMessages()
|
2018-12-13 05:50:08 +00:00
|
|
|
}
|
|
|
|
}
|
2018-10-30 20:01:13 +00:00
|
|
|
}
|
|
|
|
|
2020-08-31 11:05:25 +01:00
|
|
|
footer: SendingArea {
|
2022-05-12 19:34:24 +01:00
|
|
|
id: sendingArea
|
|
|
|
|
2020-08-31 11:05:25 +01:00
|
|
|
width: parent.width
|
|
|
|
addresses: page.addresses
|
2018-10-30 20:01:13 +00:00
|
|
|
}
|
|
|
|
}
|