diff --git a/harbour-fernschreiber.pro b/harbour-fernschreiber.pro
index d19ecd1..f87ac30 100644
--- a/harbour-fernschreiber.pro
+++ b/harbour-fernschreiber.pro
@@ -117,11 +117,11 @@ DISTFILES += qml/harbour-fernschreiber.qml \
qml/components/settingsPage/SettingsAppearance.qml \
qml/components/settingsPage/SettingsBehavior.qml \
qml/components/settingsPage/SettingsPrivacy.qml \
+ qml/components/settingsPage/SettingsSession.qml \
qml/components/settingsPage/SettingsStorage.qml \
qml/components/settingsPage/SettingsUserProfile.qml \
qml/js/debug.js \
qml/js/functions.js \
- qml/pages/ActiveSessionsPage.qml \
qml/pages/ChatInformationPage.qml \
qml/pages/ChatPage.qml \
qml/pages/ChatSelectionPage.qml \
diff --git a/qml/components/settingsPage/SettingsSession.qml b/qml/components/settingsPage/SettingsSession.qml
new file mode 100644
index 0000000..8318ada
--- /dev/null
+++ b/qml/components/settingsPage/SettingsSession.qml
@@ -0,0 +1,182 @@
+/*
+ Copyright (C) 2020-21 Sebastian J. Wolf and other contributors
+
+ This file is part of Fernschreiber.
+
+ Fernschreiber 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 3 of the License, or
+ (at your option) any later version.
+
+ Fernschreiber 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 Fernschreiber. If not, see .
+*/
+
+import QtQuick 2.6
+import Sailfish.Silica 1.0
+import WerkWolf.Fernschreiber 1.0
+import "../../components"
+import "../../js/functions.js" as Functions
+
+AccordionItem {
+ text: qsTr("Sessions")
+ Component {
+ Column {
+ id: activeSessionsItem
+ bottomPadding: Theme.paddingMedium
+ property variant activeSessions;
+ property bool loaded : false;
+
+ Component.onCompleted: {
+ if (!activeSessions) {
+ tdLibWrapper.getActiveSessions();
+ } else {
+ activeSessionsItem.loaded = true;
+ }
+ }
+
+ Connections {
+ target: tdLibWrapper
+ onSessionsReceived: {
+ activeSessionsItem.activeSessions = sessions;
+ activeSessionsItem.loaded = true;
+ }
+ onOkReceived: {
+ if (request === "terminateSession") {
+ appNotification.show(qsTr("Session was terminated"));
+ activeSessionsItem.loaded = false;
+ tdLibWrapper.getActiveSessions();
+ }
+ }
+ }
+
+ Loader {
+ id: sessionInformationLoader
+ active: tdLibWrapper.authorizationState === TelegramAPI.AuthorizationReady
+ width: parent.width
+ sourceComponent: Component {
+ SilicaListView {
+ id: activeSessionsListView
+ width: parent.width
+ // one activeSessionListItem is about 1.52 times itemSizeLarge
+ // show max 5 items at a time
+ height: Theme.itemSizeLarge * 1.5 * Math.min(5 , activeSessionsItem.activeSessions.length )
+ clip: true
+
+ model: activeSessionsItem.activeSessions
+ headerPositioning: ListView.OverlayHeader
+ header: Separator {
+ width: parent.width
+ color: Theme.primaryColor
+ horizontalAlignment: Qt.AlignHCenter
+ }
+ delegate: ListItem {
+ id: activeSessionListItem
+ width: parent.width
+ contentHeight: activeSessionColumn.height + ( 2 * Theme.paddingMedium )
+
+ menu: ContextMenu {
+ hasContent: !modelData.is_current
+ MenuItem {
+ onClicked: {
+ var sessionId = modelData.id;
+ Remorse.itemAction(activeSessionListItem, qsTr("Terminating session"), function() { tdLibWrapper.terminateSession(sessionId); });
+ }
+ text: qsTr("Terminate Session")
+ }
+ }
+
+ Column {
+ id: activeSessionColumn
+ width: parent.width - ( 2 * Theme.horizontalPageMargin )
+ spacing: Theme.paddingSmall
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ Label {
+ width: parent.width
+ text: qsTr("This app")
+ font.pixelSize: Theme.fontSizeMedium
+ font.bold: true
+ visible: modelData.is_current
+ color: Theme.highlightColor
+ anchors {
+ horizontalCenter: parent.horizontalCenter
+ }
+ }
+
+ Label {
+ width: parent.width
+ text: modelData.application_name + " " + modelData.application_version
+ font.pixelSize: Theme.fontSizeMedium
+ font.bold: true
+ color: Theme.primaryColor
+ maximumLineCount: 1
+ elide: Text.ElideRight
+ anchors {
+ horizontalCenter: parent.horizontalCenter
+ }
+ }
+
+ Label {
+ width: parent.width
+ text: modelData.device_model + ", " + (modelData.platform + " " + modelData.system_version).trim()
+ font.pixelSize: Theme.fontSizeSmall
+ color: Theme.primaryColor
+ maximumLineCount: 1
+ truncationMode: TruncationMode.Fade
+ anchors {
+ horizontalCenter: parent.horizontalCenter
+ }
+ }
+
+ Label {
+ width: parent.width
+ text: qsTr("IP address: %1, origin: %2").arg(modelData.ip).arg(modelData.country)
+ font.pixelSize: Theme.fontSizeExtraSmall
+ color: Theme.secondaryColor
+ maximumLineCount: 1
+ truncationMode: TruncationMode.Fade
+ anchors {
+ horizontalCenter: parent.horizontalCenter
+ }
+ }
+
+ Label {
+ width: parent.width
+ text: qsTr("Active since: %1, last online: %2").arg(Functions.getDateTimeTimepoint(modelData.log_in_date)).arg(Functions.getDateTimeElapsed(modelData.last_active_date))
+ font.pixelSize: Theme.fontSizeExtraSmall
+ color: Theme.primaryColor
+ maximumLineCount: 1
+ truncationMode: TruncationMode.Fade
+ anchors {
+ horizontalCenter: parent.horizontalCenter
+ }
+ }
+ }
+
+ Separator {
+ id: separator
+ anchors {
+ bottom: parent.bottom
+ }
+
+ width: parent.width
+ color: Theme.primaryColor
+ horizontalAlignment: Qt.AlignHCenter
+ }
+
+ }
+
+ VerticalScrollDecorator {}
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/qml/components/settingsPage/SettingsUserProfile.qml b/qml/components/settingsPage/SettingsUserProfile.qml
index 0b6f901..5191256 100644
--- a/qml/components/settingsPage/SettingsUserProfile.qml
+++ b/qml/components/settingsPage/SettingsUserProfile.qml
@@ -23,6 +23,7 @@ import Sailfish.Pickers 1.0
import WerkWolf.Fernschreiber 1.0
import "../"
import "../../pages/"
+import "../../js/twemoji.js" as Emoji
import "../../js/functions.js" as Functions
AccordionItem {
@@ -256,6 +257,81 @@ AccordionItem {
}
}
}
+
+ SectionHeader {
+ horizontalAlignment: Text.AlignLeft
+ text: qsTr("Logged in as")
+ }
+
+ Row {
+ width: parent.width - ( 2 * Theme.horizontalPageMargin )
+ spacing: Theme.paddingMedium
+
+ Loader {
+ id: userInformationLoader
+ active: tdLibWrapper.authorizationState === TelegramAPI.AuthorizationReady
+ width: parent.width / 2
+ sourceComponent: Component {
+ Column {
+ width: parent.width
+ spacing: Theme.paddingMedium
+ anchors.topMargin: Theme.paddingMedium
+
+ Text {
+ anchors.horizontalCenter: parent.horizontalCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: Emoji.emojify(accordionContent.userInformation.first_name + " " + accordionContent.userInformation.last_name, Theme.fontSizeSmall)
+ font.pixelSize: Theme.fontSizeSmall
+ wrapMode: Text.Wrap
+ color: Theme.primaryColor
+ textFormat: Text.StyledText
+ anchors {
+ horizontalCenter: parent.horizontalCenter
+ }
+ }
+
+ ProfileThumbnail {
+ photoData: ((typeof accordionContent.userInformation.profile_photo !== "undefined") ? accordionContent.userInformation.profile_photo.small : {})
+ anchors.horizontalCenter: parent.horizontalCenter
+ width: Theme.itemSizeSmall
+ height: Theme.itemSizeSmall
+ replacementStringHint: accordionContent.userInformation.first_name + " " + accordionContent.userInformation.last_name
+ anchors {
+ horizontalCenter: parent.horizontalCenter
+ }
+ }
+
+ Label {
+ width: accordionContent.width / 2 - Theme.horizontalPageMargin
+ anchors.horizontalCenter: parent.horizontalCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: qsTr("Phone number: +%1").arg(accordionContent.userInformation.phone_number)
+ font.pixelSize: Theme.fontSizeSmall
+ wrapMode: Text.Wrap
+ anchors {
+ horizontalCenter: parent.horizontalCenter
+ }
+ }
+ }
+ }
+ }
+ BackgroundItem {
+ id: logOutItem
+ width: parent.width / 2
+ height: userInformationLoader.height
+ anchors.verticalCenter: parent.verticalCenter
+ enabled: userInformationLoader.status == Loader.Ready
+ Button {
+ id: logOutButton
+ text: qsTr("Log Out")
+ anchors.centerIn: parent
+ onClicked: Remorse.popupAction(settingsPage, qsTr("Logged out"), function() {
+ tdLibWrapper.logout();
+ pageStack.pop();
+ });
+ }
+ }
+ }
}
}
}
diff --git a/qml/pages/AboutPage.qml b/qml/pages/AboutPage.qml
index 0ae1d4a..fc5e44a 100644
--- a/qml/pages/AboutPage.qml
+++ b/qml/pages/AboutPage.qml
@@ -1,3 +1,4 @@
+
/*
Copyright (C) 2020-21 Sebastian J. Wolf and other contributors
@@ -20,14 +21,11 @@ import QtQuick 2.6
import Sailfish.Silica 1.0
import WerkWolf.Fernschreiber 1.0
import "../components"
-import "../js/twemoji.js" as Emoji
Page {
id: aboutPage
allowedOrientations: Orientation.All
- readonly property var userInformation : tdLibWrapper.userInformation
-
SilicaFlickable {
id: aboutContainer
contentHeight: column.height
@@ -156,92 +154,6 @@ Page {
}
}
- Loader {
- id: userInformationLoader
- active: tdLibWrapper.authorizationState === TelegramAPI.AuthorizationReady
- width: parent.width
- sourceComponent: Component {
- Column {
-
- spacing: Theme.paddingSmall
-
- Text {
- x: Theme.horizontalPageMargin
- width: parent.width - ( 2 * Theme.horizontalPageMargin )
- horizontalAlignment: Text.AlignHCenter
- text: qsTr("Logged in as %1").arg(Emoji.emojify(aboutPage.userInformation.first_name + " " + aboutPage.userInformation.last_name, Theme.fontSizeSmall))
- font.pixelSize: Theme.fontSizeSmall
- wrapMode: Text.Wrap
- color: Theme.primaryColor
- textFormat: Text.StyledText
- anchors {
- horizontalCenter: parent.horizontalCenter
- }
- }
-
- ProfileThumbnail {
- photoData: ((typeof aboutPage.userInformation.profile_photo !== "undefined") ? aboutPage.userInformation.profile_photo.small : {})
- width: Theme.itemSizeExtraLarge
- height: Theme.itemSizeExtraLarge
- replacementStringHint: aboutPage.userInformation.first_name + " " + aboutPage.userInformation.last_name
- anchors {
- horizontalCenter: parent.horizontalCenter
- }
- }
-
- Label {
- x: Theme.horizontalPageMargin
- width: parent.width - ( 2 * Theme.horizontalPageMargin )
- horizontalAlignment: Text.AlignHCenter
- text: qsTr("Phone number: +%1").arg(aboutPage.userInformation.phone_number)
- font.pixelSize: Theme.fontSizeSmall
- wrapMode: Text.Wrap
- anchors {
- horizontalCenter: parent.horizontalCenter
- }
- }
- BackgroundItem {
- width: parent.width
-
- BackgroundItem {
- id: logOutItem
- width: parent.width
- function showRemorseItem() {
- remorse.execute(logOutItem, qsTr("Logged out"), function() {
- tdLibWrapper.logout();
- pageStack.pop();
- });
- }
- RemorseItem {
- id: remorse
- }
- Button {
- id: logOutButton
- text: qsTr("Log Out")
- anchors {
- horizontalCenter: parent.horizontalCenter
- }
- onClicked: {
- logOutItem.showRemorseItem();
- }
- }
- }
- }
-
- Button {
- id: activeSessionsButton
- text: qsTr("Active Sessions")
- anchors {
- horizontalCenter: parent.horizontalCenter
- }
- onClicked: {
- pageStack.push(Qt.resolvedUrl("ActiveSessionsPage.qml"));
- }
- }
- }
- }
- }
-
Button {
text: qsTr("Terms of Service")
anchors {
diff --git a/qml/pages/ActiveSessionsPage.qml b/qml/pages/ActiveSessionsPage.qml
deleted file mode 100644
index 78ebd04..0000000
--- a/qml/pages/ActiveSessionsPage.qml
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- Copyright (C) 2020-21 Sebastian J. Wolf and other contributors
-
- This file is part of Fernschreiber.
-
- Fernschreiber 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 3 of the License, or
- (at your option) any later version.
-
- Fernschreiber 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 Fernschreiber. If not, see .
-*/
-import QtQuick 2.6
-import Sailfish.Silica 1.0
-import "../components"
-import "../js/twemoji.js" as Emoji
-import "../js/functions.js" as Functions
-
-Page {
- id: activeSessionsPage
- allowedOrientations: Orientation.All
-
- property variant activeSessions;
- property bool loaded : false;
-
- Component.onCompleted: {
- if (!activeSessions) {
- tdLibWrapper.getActiveSessions();
- } else {
- activeSessionsPage.loaded = true;
- }
- }
-
- Connections {
- target: tdLibWrapper
- onSessionsReceived: {
- activeSessionsPage.activeSessions = sessions;
- activeSessionsPage.loaded = true;
- }
- onOkReceived: {
- if (request === "terminateSession") {
- appNotification.show(qsTr("Session was terminated"));
- activeSessionsPage.loaded = false;
- tdLibWrapper.getActiveSessions();
- }
- }
- }
-
- SilicaFlickable {
- id: activeSessionsFlickable
- anchors.fill: parent
-
- Column {
- anchors.fill: parent
-
- PageHeader {
- id: activeSessionsHeader
- title: qsTr("Active Sessions")
- }
-
- SilicaListView {
- id: activeSessionsListView
- width: parent.width
- height: parent.height - activeSessionsHeader.height
-
- clip: true
-
- model: activeSessionsPage.activeSessions
- delegate: ListItem {
- id: activeSessionListItem
- width: parent.width
- contentHeight: activeSessionColumn.height + ( 2 * Theme.paddingMedium )
-
- menu: ContextMenu {
- hasContent: !modelData.is_current
- MenuItem {
- onClicked: {
- var sessionId = modelData.id;
- Remorse.itemAction(activeSessionListItem, qsTr("Terminating session"), function() { tdLibWrapper.terminateSession(sessionId); });
- }
- text: qsTr("Terminate Session")
- }
- }
-
- Column {
- id: activeSessionColumn
- width: parent.width - ( 2 * Theme.horizontalPageMargin )
- spacing: Theme.paddingSmall
- anchors.verticalCenter: parent.verticalCenter
- anchors.horizontalCenter: parent.horizontalCenter
-
- Label {
- width: parent.width
- text: qsTr("This app")
- font.pixelSize: Theme.fontSizeMedium
- font.bold: true
- visible: modelData.is_current
- color: Theme.highlightColor
- anchors {
- horizontalCenter: parent.horizontalCenter
- }
- }
-
- Label {
- width: parent.width
- text: modelData.application_name + " " + modelData.application_version
- font.pixelSize: Theme.fontSizeMedium
- font.bold: true
- color: Theme.primaryColor
- maximumLineCount: 1
- elide: Text.ElideRight
- anchors {
- horizontalCenter: parent.horizontalCenter
- }
- }
-
- Label {
- width: parent.width
- text: modelData.device_model + ", " + (modelData.platform + " " + modelData.system_version).trim()
- font.pixelSize: Theme.fontSizeSmall
- color: Theme.primaryColor
- maximumLineCount: 1
- truncationMode: TruncationMode.Fade
- anchors {
- horizontalCenter: parent.horizontalCenter
- }
- }
-
- Label {
- width: parent.width
- text: qsTr("IP address: %1, origin: %2").arg(modelData.ip).arg(modelData.country)
- font.pixelSize: Theme.fontSizeExtraSmall
- color: Theme.secondaryColor
- maximumLineCount: 1
- truncationMode: TruncationMode.Fade
- anchors {
- horizontalCenter: parent.horizontalCenter
- }
- }
-
- Label {
- width: parent.width
- text: qsTr("Active since: %1, last online: %2").arg(Functions.getDateTimeTimepoint(modelData.log_in_date)).arg(Functions.getDateTimeElapsed(modelData.last_active_date))
- font.pixelSize: Theme.fontSizeExtraSmall
- color: Theme.primaryColor
- maximumLineCount: 1
- truncationMode: TruncationMode.Fade
- anchors {
- horizontalCenter: parent.horizontalCenter
- }
- }
- }
-
- Separator {
- id: separator
- anchors {
- bottom: parent.bottom
- }
-
- width: parent.width
- color: Theme.primaryColor
- horizontalAlignment: Qt.AlignHCenter
- }
-
- }
-
- VerticalScrollDecorator {}
- }
- }
-
- Column {
-
- opacity: visible ? 1 : 0
- Behavior on opacity { FadeAnimation {} }
- visible: !activeSessionsPage.loaded
- width: parent.width
- height: loadingLabel.height + loadingBusyIndicator.height + Theme.paddingMedium
-
- spacing: Theme.paddingMedium
- anchors.verticalCenter: parent.verticalCenter
-
- InfoLabel {
- id: loadingLabel
- text: qsTr("Getting active sessions...")
- }
-
- BusyIndicator {
- id: loadingBusyIndicator
- anchors.horizontalCenter: parent.horizontalCenter
- running: !activeSessionsPage.loaded
- size: BusyIndicatorSize.Large
- }
- }
-
- }
-}
-
diff --git a/qml/pages/SettingsPage.qml b/qml/pages/SettingsPage.qml
index b1cf4f9..bd1d384 100644
--- a/qml/pages/SettingsPage.qml
+++ b/qml/pages/SettingsPage.qml
@@ -46,6 +46,7 @@ Page {
Accordion {
flickable: settingsContainer
SettingsUserProfile { expanded: true; asynchronous: false }
+ SettingsSession {}
SettingsPrivacy {}
SettingsBehavior {}
SettingsAppearance {}