...
 
Commits (98)
AccessModifierOffset: -8
AlignAfterOpenBracket: DontAlign
AlignConsecutiveAssignments: true
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: DontAlign
AlignOperands: true
AlignTrailingComments: true
#AllowAllArgumentsOnNextLine: false
#AllowAllConstructorInitializersOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: false
#AllowShortLambdasOnASingleLine: Empty
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
BinPackArguments: false
BinPackParameters: false
BraceWrapping:
# AfterCaseLabel: false
AfterClass: true
AfterControlStatement: false
AfterEnum: false
AfterFunction: true
AfterNamespace: true
AfterStruct: true
AfterUnion: true
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakAfterJavaFieldAnnotations: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Linux
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeColon
BreakInheritanceList: BeforeColon
BreakStringLiterals: true
ColumnLimit: 90
CommentPragmas: ''
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 8
ContinuationIndentWidth: 8
Cpp11BracedListStyle: true
DerivePointerAlignment: false
FixNamespaceComments: true
IncludeBlocks: Preserve
IndentCaseLabels: false
#IndentPPDirectives: BeforeHash
IndentWidth: 8
IndentWrappedFunctionNames: false
KeepEmptyLinesAtTheStartOfBlocks: false
Language: Cpp
NamespaceIndentation: All
PenaltyBreakBeforeFirstCallParameter: 90
PenaltyBreakComment: 90
PenaltyBreakFirstLessLess: 0
PenaltyBreakString: 90
PenaltyExcessCharacter: 1
PenaltyReturnTypeOnItsOwnLine: 20
PointerAlignment: Right
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: true
#SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: true
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInContainerLiterals: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Cpp11
TabWidth: 8
UseTab: ForContinuationAndIndentation
......@@ -54,6 +54,7 @@ click-xenial:
stage: deploy
image: kaidan/ubuntu-touch-xenial
script: utils/travis/build.sh
allow_failure: true
variables:
PLATFORM: ubuntu-touch
artifacts:
......@@ -61,6 +62,50 @@ click-xenial:
- "*.click"
expire_in: 1 week
windows-mxe:
stage: deploy
image: kaidan/windows-mxe
script:
- utils/build-windows-mxe.sh
- mv build/bin/kaidan.exe kaidan.exe
allow_failure: true
artifacts:
paths:
- "kaidan.exe"
expire_in: 1 week
android:
stage: deploy
image: kdeorg/android-sdk
script:
- sudo apt update
- sudo apt -y install inkscape optipng
- GIT_EXTRA="--branch ${KF5_VERSION}" /opt/helpers/build-kde-dependencies --withProject kirigami
- /opt/helpers/build-cmake qxmpp https://github.com/qxmpp-project/qxmpp.git -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF
- GIT_EXTRA="--branch ${CI_COMMIT_REF_NAME} --recursive" /opt/helpers/build-cmake ${CI_PROJECT_NAME} ${CI_REPOSITORY_URL} -DQTANDROID_EXPORTED_TARGET=kaidan -DANDROID_APK_DIR=${CI_PROJECT_DIR}/src/${CI_PROJECT_NAME}/misc/android -DI18N=1 -DUSE_KNOTIFICATIONS=OFF
- ${CI_PROJECT_DIR}/src/${CI_PROJECT_NAME}/utils/render-logos.sh
- /opt/helpers/create-apk ${CI_PROJECT_NAME}
- mv ${CI_PROJECT_DIR}/build/${CI_PROJECT_NAME}/kaidan_build_apk/build/outputs/apk/kaidan_build_apk-debug.apk ${CI_PROJECT_DIR}
variables:
KF5_VERSION: master
allow_failure: true
artifacts:
paths:
- "kaidan_build_apk-debug.apk"
expire_in: 1 week
mac-osxcross:
stage: deploy
image: kaidan/mac-osxcross
script:
- utils/build-mac-osxcross.sh
- tar -cf kaidan.tar -C build/bin/ kaidan.app
allow_failure: true
artifacts:
paths:
- "kaidan.tar"
expire_in: 1 week
variables:
GIT_SUBMODULE_STRATEGY: recursive
BUILD_SYSTEM: cmake
......
Subproject commit 9df7e7f24a2a6c313e7367d596601e07dbd2baeb
Subproject commit e6eb0b78d0cb17fccd5ddb60966ba2a0a2d2b593
cmake_minimum_required(VERSION 2.8.12)
cmake_minimum_required(VERSION 3.3)
find_package(ECM 5.40.0 REQUIRED NO_MODULE)
set(CMAKE_CXX_STANDARD 14)
set(QT_MIN_VERSION "5.8.0")
if(POLICY CMP0071)
cmake_policy(SET CMP0071 NEW)
endif()
project(kaidan)
set(APPLICATION_ID "im.kaidan.kaidan")
set(APPLICATION_NAME "kaidan")
set(APPLICATION_DISPLAY_NAME "Kaidan")
if(UBUNTU_TOUCH)
set(APPLICATION_NAME "${APPLICATION_ID}")
endif()
set(VERSION_STRING "0.4.0~dev")
set(DEVELOPMENT_BUILD TRUE)
set(ANDROID_VERSION_CODE 3)
# CMake options
option(I18N "Enable i18n support" FALSE)
option(STATIC_BUILD "Build Kaidan statically")
option(UBUNTU_TOUCH "Building a Ubuntu Touch click (internal use only!)" FALSE)
option(UBUNTU_TOUCH "Building an Ubuntu Touch click (internal use only!)" FALSE)
option(CLICK_ARCH "Architecture that will be used in the click's manifest")
option(CLICK_DATE "Date used in the version number in the click's manifest")
option(QUICK_COMPILER "Use QtQuick compiler to improve performance" TRUE)
option(QUICK_COMPILER "Use QtQuick compiler to improve performance" FALSE)
option(USE_KNOTIFICATIONS "Use KNotifications for displaying notifications" TRUE)
option(BUNDLE_ICONS "Bundle breeze icons" FALSE)
# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
......@@ -22,7 +36,7 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(AUTOMOC_MOC_OPTIONS -Muri=im.kaidan.kaidan)
set(AUTOMOC_MOC_OPTIONS -Muri=${APPLICATION_ID})
#
# Dependecies
......@@ -32,7 +46,6 @@ set(AUTOMOC_MOC_OPTIONS -Muri=im.kaidan.kaidan)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
# CMake modules include
include(GNUInstallDirs)
include(KDEInstallDirs)
include(KDECompilerSettings NO_POLICY_SCOPE)
include(KDECMakeSettings)
......@@ -51,10 +64,16 @@ if(QUICK_COMPILER)
find_package(Qt5QuickCompiler)
set_package_properties(Qt5QuickCompiler PROPERTIES
DESCRIPTION "Compile QML at build time"
TYPE OPTIONAL
TYPE OPTIONAL
)
endif()
if(USE_KNOTIFICATIONS)
find_package(KF5Notifications REQUIRED)
set(__KF5Notifications_LIBRARIES KF5::Notifications)
add_definitions(-DHAVE_KNOTIFICATIONS)
endif()
# Optional QWidget style integration (not on mobile)
if(NOT UBUNTU_TOUCH AND NOT ANDROID AND NOT IOS)
find_package(Qt5Widgets)
......@@ -100,7 +119,7 @@ endif()
#
# Include bundled icons on Ubuntu Touch, Android, Windows, macOS and iOS
if(UBUNTU_TOUCH OR ANDROID OR WIN32 OR APPLE)
if(BUNDLE_ICONS OR UBUNTU_TOUCH OR ANDROID OR WIN32 OR APPLE)
set(KAIDAN_ICONS_QRC kirigami-icons.qrc)
endif()
......@@ -149,6 +168,7 @@ target_link_libraries(${PROJECT_NAME}
Qt5::Network
Qt5::Xml
${__Qt5Widgets_LIBRARIES}
${__KF5Notifications_LIBRARIES}
# currently needs to be hardcoded for windows builds
qxmpp
)
......@@ -303,7 +323,7 @@ endif()
if(UBUNTU_TOUCH)
set(KAIDAN_COMPILE_DEFINITIONS UBUNTU_TOUCH=True)
elseif(NOT ANDROID AND NOT IOS AND NOT WIN32)
elseif(NOT ANDROID AND NOT IOS AND NOT WIN32 AND NOT APPLE)
set(KAIDAN_COMPILE_DEFINITIONS NOTIFICATIONS_LIBNOTIFY=True)
endif()
......@@ -316,6 +336,10 @@ endif()
target_compile_definitions(${PROJECT_NAME} PRIVATE
DEBUG_SOURCE_PATH="${CMAKE_SOURCE_DIR}"
VERSION_STRING="${VERSION_STRING}"
APPLICATION_ID="${APPLICATION_ID}"
APPLICATION_NAME="${APPLICATION_NAME}"
APPLICATION_DISPLAY_NAME="${APPLICATION_DISPLAY_NAME}"
${KAIDAN_COMPILE_DEFINITIONS}
)
......@@ -323,7 +347,17 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE
# Install Kaidan
#
if(ANDROID)
configure_file(${CMAKE_SOURCE_DIR}/misc/android/AndroidManifest.xml.in
${CMAKE_SOURCE_DIR}/misc/android/AndroidManifest.xml)
endif()
if(UBUNTU_TOUCH AND CLICK_ARCH)
set(CLICK_VERSION ${VERSION_STRING})
if(DEVELOPMENT_BUILD)
set(CLICK_VERSION "${CLICK_VERSION}.${CLICK_DATE}")
endif()
# will replace ${CLICK_ARCH} with its value
configure_file(${CMAKE_SOURCE_DIR}/misc/ubuntu-touch/manifest.json.in
${CMAKE_SOURCE_DIR}/misc/ubuntu-touch/manifest.json)
......@@ -371,5 +405,9 @@ elseif(UNIX AND NOT APPLE)
)
endif()
# KNotifications
if(USE_KNOTIFICATIONS)
install(FILES misc/kaidan.notifyrc DESTINATION ${KNOTIFYRC_INSTALL_DIR})
endif()
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
......@@ -9,6 +9,7 @@ Copyright: 2016-2019, Linus Jahn <lnj@kaidan.im>
2016-2019, Jonah Brüchert <jbb@kaidan.im>
2017-2019, Ilya Bizyaev <bizyaev@zoho.com>
2018, Allan Nordhøy <epost@anotheragency.no>
2019, Xavier <xavi@delape.net>
2018, Nicolas Fella <nicolas.fella@gmx.de>
2018, Bjarne Roß <ross.b@freenet.de>
2018, SohnyBohny <sohny.bean@streber24.de>
......@@ -38,10 +39,8 @@ Files: src/StatusBar.cpp
src/StatusBar.h
src/singleapp/*
src/hsluv-c/*
data/images/xmpp.svg
utils/generate-license.py
Copyright: 2016, J-P Nurmi <jpnurmi@gmail.com>
2007, Raja Sandhu, XMPP Standards Foundation
2018-2019, Linus Jahn <lnj@kaidan.im>
2015-2018, Itay Grudev <itay+github.com@grudev.com>
2015, Alexei Boronine <alexei@boronine.com>
......@@ -56,13 +55,10 @@ Copyright: 2017, Konstantinos Sideris <siderisk@auth.gr>
License: GPL-3+
Files: data/images/message_checkmark.svg
data/images/diaspora.svg
Copyright: 2014, Michael Kurz <betheg@bitcloner.org>
2016, Gregor Santner <gsantner@mailbox.org>
License: GPL-3+
Comment:
message_checkmark.svg: Originally from conversations, optimized using SVGO by LNJ <git@lnj.li>
diaspora.svg: Originally from dandelion, <https://github.com/diaspora-for-android/dandelion>
Files: misc/kaidan.svg
misc/kaidan-small-margin.svg
......
# Kaidan - A user-friendly XMPP client for every device!
[![Kaidan MUC](https://search.jabbercat.org/api/1.0/badge?address=kaidan@muc.kaidan.im)](https://i.kaidan.im)
[![Flatpak Build Status](https://binary-factory.kde.org/buildStatus/icon?job=Kaidan_flatpak)](https://binary-factory.kde.org/job/Kaidan_flatpak/)
[![Translation](https://hosted.weblate.org/widgets/kaidan/-/svg-badge.svg)](https://hosted.weblate.org/projects/kaidan/translations/)
[![license](https://img.shields.io/badge/License-GPLv3%2B%20%2F%20CC%20BY--SA%204.0-blue.svg)](https://raw.githubusercontent.com/kaidanim/kaidan/master/LICENSE)
[![Donations](https://img.shields.io/liberapay/patrons/kaidan.svg?logo=liberapay)](https://liberapay.com/kaidan)
![Kaidan v0.3 screenshot](https://git.kaidan.im/kaidan/kaidan/uploads/da4886ea50581517bde0278a804b311c/kaidan-screenshot-0.3.png)
![Kaidan screenshot](https://www.kaidan.im/images/screenshot.png)
## About
Kaidan is a simple, user-friendly Jabber/XMPP client providing a modern user-interface using
[Kirigami](https://techbase.kde.org/Kirigami) and [QtQuick](https://wiki.qt.io/Qt_Quick). The back-end of
Kaidan is entirely written in C++ using the [qxmpp](https://github.com/qxmpp-project/qxmpp) XMPP client library and
[Qt 5](https://www.qt.io/).
Kaidan is a simple, user-friendly Jabber/XMPP client providing a modern user
interface using [Kirigami][kg] and [QtQuick][qquick]. The back-end of Kaidan is
written in C++ using the [QXmpp][qxmpp] XMPP client library and [Qt 5][qt].
Currently Kaidan only has been tested on GNU/Linux Desktops, Android & Plasma Mobile, but of course
Ubuntu Touch, OS X, iOS and Windows will follow. Of course this is still not everything, i.e. Sailfish OS
is missing. To support that we need to wait for a proper QtQuickControls 2 style for it or rewrite the GUI
using Silica. Both options are rather unlikely in the near future, so if you want to get a client for
Sailfish OS _now_, maybe take a look at [Shmoose](https://github.com/geobra/harbour-shmoose), a fork by an
earlier developer of Kaidan.
Kaidan runs on mobile and desktop Linux systems, including Plasma Mobile and
[Ubuntu Touch][openstore]. There are static Windows builds and macOS is also
supported, but we currently can't provide builds for it. The support for the
legacy mobile systems Android and iOS is very experimental and we currently only
provide test builds for [Android][android]. We might support SailfishOS in the
future in case the Sailfish SDK gets an update for Qt.
Kaidan is *not* finished yet, so don't expect it working as well as a finished client will do.
Kaidan is *not* finished yet, so don't expect it working as well as a finished
client will do -- Many features are still missing, many things still need to be
fixed and improved.
For a list of supported XEPs, have a look at the [Wiki](https://git.kaidan.im/kaidan/kaidan/wikis/Supported-XEPs).
For a list of supported XEPs, have a look at the [Wiki][supp-xeps].
## Installing Kaidan
Instead of building Kaidan yourself, you can also just install ready-made builds. On these pages is explained
how to do that:
* [Install the Flatpak](https://git.kaidan.im/kaidan/kaidan/wikis/install/flatpak)
* [Install the Flatpak](https://invent.kde.org/kde/kaidan/wikis/install/flatpak)
* [Install from OpenStore (Ubuntu Touch)][openstore]
## Building Kaidan
......@@ -37,12 +40,23 @@ how to do that:
Here are the general dependencies of Kaidan listed:
* [Qt](https://doc.qt.io/qt-5/build-sources.html) (Core Qml Quick Svg Sql QuickControls2) (>= 5.8.0)
* [qxmpp](https://github.com/qxmpp-project/qxmpp) (>= 0.9.0)
* [QXmpp][qxmpp] (>= 0.9.0)
* [Kirigami 2](https://phabricator.kde.org/source/kirigami/) (>= 5.42.0)
* [ECM (extra-cmake-modules)](https://api.kde.org/ecm/manual/ecm.7.html)
* [KNotifications][knotif] (`-DUSE_KNOTIFICATIONS=OFF` to disable)
### Build instructions
There are guides on how to build Kaidan for each supported platform (currently there are still pages missing):
* [Linux Desktop](https://git.kaidan.im/kaidan/kaidan/wikis/building/linux-debian-based)
* [Ubuntu Touch (click package)](https://git.kaidan.im/kaidan/kaidan/wikis/building/ubuntu-touch)
* [Linux Desktop](https://invent.kde.org/kde/kaidan/wikis/building/linux-debian-based)
* [Ubuntu Touch (click package)](https://invent.kde.org/kde/kaidan/wikis/building/ubuntu-touch)
[kg]: https://kde.org/products/kirigami/
[qquick]: https://wiki.qt.io/Qt_Quick
[qxmpp]: http://qxmpp.org
[qt]: https://www.qt.io/
[openstore]: https://open-store.io/app/im.kaidan.kaidan
[android]: https://www.kaidan.im/download/#android
[supp-xeps]: https://invent.kde.org/kde/kaidan/wikis/Supported-XEPs
[knotif]: https://api.kde.org/frameworks/knotifications/html/index.html
# Changelog
### Version 0.4.0 (UNRELEASED)
Build system:
* Support for Android (ilyabizyaev)
* Support for Ubuntu Touch (jbb)
* Support for MacOS (ilyabizyaev)
* Support for Windows (ilyabizyaev)
* Support for iOS (ilyabizyaev)
* Add KDE Flatpak (jbb)
* Switch Android builds to CMake with ECM (ilyabizyaev)
* Improve Linux AppImage build script (ilyabizyaev)
* Add additional image formats in AppImage (jbb)
Back-end:
* Add XEP-0352: Client State Indication (gloox/QXmpp) (lnj)
* Add media/file sharing (lnj)
* Full back-end rewrite to QXmpp (lnj)
* Implement XEP-0363: HTTP File Upload and UploadManager for QXmpp (lnj)
* Use XEP-0280: Message Carbons from QXmpp (lnj)
* Use XEP-0352: Client State Indication from QXmpp (lnj)
* Check incoming messages for media links (lnj)
* Implement XEP-0308: Last Message Correction (lnj, jbb)
* Make attachments downloadable (lnj)
* Implement XEP-0382: Spoiler messages (xavi)
* Kaidan is now offline usable (lnj)
* Kaidan is able to open xmpp: URIs (lnj)
User interface:
* New logo (ilyabizyaev)
* Show presence information of contacts (lnj)
* Add EmojiPicker from Spectral (jbb)
* Highlight links in chat and make links clickable (lnj)
* New about dialog instead of the about page (ilyabizyaev)
* Add image preview in chat and before sending (lnj)
* Send messages on Enter, new line on Ctrl-Enter (ilyabizyaev)
* 'Add contact' is now the main action on the contacts page (lnj)
* Elide contact names and messages in roster (lnj)
* Chat page redesign (ilyabizyaev)
* Display passive notifications when trying to use online actions while offline (lnj)
* Automatically reconnect on connection loss (lnj)
* Contacts page: Display whether online in title (lnj)
* Add different connection error messages (jbb)
* Use QApplication when building with QWidgets (notmart)
* Ask user to approve subscription requests (lnj)
* Remove contact action: Make JIDs bold (lnj)
* Add contact sheet: Ask for optional message to contact (lnj)
* Add empty chat page with help notice to be displayed on start up (jbb)
* Redesign log in page (sohnybohny)
* Add Copy Invitaion URL action (jbb)
* Add 'press and hold' functionality for messages context menu (jbb)
* Add copy to clipboard function for messages (jbb)
* Add mobile file chooser (jbb)
* Highlight the currently opened chat on contacts page (lnj)
* Remove predefined window sizes (lnj)
* Use new Kirigami application header (nicofee)
* Make images open externally when clicked (jbb)
* Use QtQuickCompiler (jbb)
* Display upload progress bar (lnj)
* Add text+color avatars as fallback (lnj, jbb)
* Remove diaspora log in option (lnj)
Misc:
* Forget passwords on log out (lnj)
* Append four random chars to resource (lnj)
* Save passwords in base64 instead of clear text (lnj)
* Generate the LICENSE file automatically with all git authors (lnj)
* Store ubuntu touch builds as job artifacts (lnj)
* Add GitLab CI integration (jbb)
Fixes:
* Fix TLS connection bug (lnj)
* Don't send notifications when receiving own messages via. carbons (lnj)
* Fix timezone bug of message timestamps (lnj)
* Fix several message editing bugs (lnj)
* Fix black icons (jbb)
* Fix richt text labels in Plasma Mobile (lnj)
* Small Plasma Mobile fixes (jbb)
### Version 0.3.2 (released on 25.11.2017)
* Added AppImage build script (#138) (@JBBgameich)
* Use relative paths to find resource files (#143) (@LNJ2)
......
{
"template": "custom",
"dir": "./bin/ubuntu-touch/",
"build_dir": "./bin/ubuntu-touch/",
"build": "../../utils/build-linux-click.sh",
"kill": "kaidan",
"dependencies_build": [
"ninja-build",
"extra-cmake-modules"
]
],
"libraries": {
"qxmpp": {
"template": "cmake",
"src_dir": "3rdparty/qxmpp",
"make_jobs": 2,
"build_args": [
"-DCMAKE_BUILD_TYPE=Release",
"-DBUILD_TESTS=OFF",
"-DBUILD_EXAMPLES=OFF",
"-DCMAKE_PREFIX_PATH=../../../bin/ubuntu-touch/tmp",
"-DCMAKE_INSTALL_PREFIX=../../../bin/ubuntu-touch/tmp"
],
"postbuild": "make install"
}
}
}
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 187.50293 187.50293"><circle cx="93.852" cy="93.806" r="93.678" fill="#207be6"/><path d="M37.984 37.837h113.43v112.806H37.984zm141.788 141.788h113.43V292.43h-113.43z" fill="none"/><path d="M107.337 133.213l-9.102-12.714c-2.43-3.403-4.405-6.05-4.51-6.05-.113 0-3.932 5.143-9.055 12.166a793.067 793.067 0 0 1-8.951 12.165c-.142 0-17.582-12.288-17.63-12.41-.018-.067 3.923-5.861 8.763-12.866 4.84-7.013 8.8-12.855 8.8-12.997 0-.217-1.569-.766-13.876-4.868L47.74 90.951c-.123-.048.596-2.486 3.091-10.341 1.796-5.663 3.3-10.332 3.346-10.389.048-.057 6.683 2.07 14.746 4.726 8.054 2.647 14.708 4.812 14.793 4.812.076 0 .17-.123.208-.284.029-.142.095-6.995.152-15.237.056-8.224.141-15.03.189-15.124.085-.114 2.344-.142 10.653-.142 5.804 0 10.615.038 10.681.094.095.057.255 4.585.53 14.746.434 16.694.444 16.92.708 16.92.095 0 6.485-2.136 14.189-4.754a480.141 480.141 0 0 1 14.084-4.65c.151.179 6.475 20.738 6.39 20.814-.038.047-6.466 2.24-14.274 4.887-10.747 3.648-14.216 4.868-14.244 5.019-.029.113 3.667 5.643 8.374 12.515 4.632 6.768 8.394 12.364 8.375 12.42a916.375 916.375 0 0 1-17.506 12.894c-.056 0-2.259-2.997-4.887-6.664z" fill="#fafafa"/></svg>
\ No newline at end of file
......@@ -2,10 +2,7 @@
<qresource prefix="/images/">
<file alias="banner.png">banner.png</file>
<file alias="chat.png">chat.png</file>
<file alias="diaspora.svg">diaspora.svg</file>
<file alias="fallback-avatar.svg">fallback-avatar.svg</file>
<file alias="message_checkmark.svg">message_checkmark.svg</file>
<file alias="xmpp.svg">xmpp.svg</file>
<file alias="kaidan.svg">kaidan.svg</file>
</qresource>
<qresource prefix="/org/kde/kirigami/icons/">
......
<svg xmlns="http://www.w3.org/2000/svg" height="181.44" viewBox="0 0 176.486 181.437" width="176.49"><linearGradient id="a" gradientUnits="userSpaceOnUse" x2="-1807.2" gradientTransform="translate(1916)" y1="125.86" x1="-1807.2"><stop stop-color="#1b3967" offset=".011"/><stop stop-color="#13b5ea" offset=".467"/><stop stop-color="#002b5c" offset=".995"/></linearGradient><path d="M136.29 14.189c.077 1.313-1.786.968-1.786 2.293 0 38.551-44.72 96.831-89.847 108.19v1.182c59.957-5.51 126.73-66.8 128.24-125.85l-36.6 14.189z" fill="url(#a)"/><path d="M120.23 17.96c.077 1.313.121 2.633.121 3.958 0 38.551-30.7 90.497-75.827 101.86v1.637c59.065-3.823 105.81-63.023 105.81-109.2a67.1 67.1 0 0 0-.371-7.056l-29.73 8.796z" fill="#E96D1F"/><linearGradient id="b" gradientUnits="userSpaceOnUse" x2="-1073.2" gradientTransform="matrix(-1 0 0 1 -1008.2 0)" y1="126.85" x1="-1073.2"><stop stop-color="#1b3967" offset=".011"/><stop stop-color="#13b5ea" offset=".467"/><stop stop-color="#002b5c" offset=".995"/></linearGradient><path d="M36.599 14.189c-.077 1.313 1.787.968 1.787 2.293 0 38.551 46.558 97.366 91.688 108.73v1.639C70.121 121.331 1.514 59.051.004.001L36.603 14.19z" fill="url(#b)"/><path d="M54.731 18.932a68.401 68.401 0 0 0-.12 3.957c0 38.551 30.699 90.497 75.827 101.86v1.639c-59.044-2.79-105.81-63.024-105.81-109.2 0-2.375.128-4.729.371-7.056l29.73 8.798z" fill="#A0CE67"/><path d="M24.713 9.583l7.617 2.722a84.24 84.24 0 0 0-.066 3.225c0 41.219 37.271 98.204 87.272 107.12 3.245 1.088 7.538 2.077 10.932 2.931v1.638c-65.254-5.56-111.1-71.866-105.76-117.64z" fill="#439639"/><path d="M150.34 8.76l-7.833 2.625c.041.963.191 2.203.191 3.173 0 41.219-37.272 98.205-87.274 107.12-3.243 1.089-7.538 2.077-10.93 2.932v1.639c68.344-8.66 111.18-71.719 105.84-117.49z" fill="#D9541E"/><path d="M14.576 166.71L1.188 152.06h11.643l9.127 10.268 9.129-10.268H42.73l-13.387 14.646 14.401 14.728h-12.09l-9.697-10.67-9.693 10.67H.172l14.404-14.73zm32.52-14.65h13.836l10.183 18.905 10.183-18.905H95.13v29.374h-8.762v-21.096h-.08l-11.807 21.096h-6.733l-11.807-21.096h-.082v21.096h-8.764v-29.37zm54.154 0h24.546c8.559 0 10.628 4.302 10.628 10.063v2.516c0 4.381-1.908 9.41-8.275 9.41h-17.894v7.385h-9.005v-29.38zm9 14.69h13.997c2.109 0 2.924-1.377 2.924-3.123v-1.135c0-1.99-.976-3.127-3.694-3.127H110.25v7.38zm31.06-14.69h24.546c8.561 0 10.63 4.302 10.63 10.063v2.516c0 4.381-1.907 9.41-8.275 9.41h-17.893v7.385h-9.008v-29.38zm9.01 14.69h13.996c2.11 0 2.922-1.377 2.922-3.123v-1.135c0-1.99-.974-3.127-3.693-3.127H150.32v7.38z"/></svg>
\ No newline at end of file
<RCC>
<qresource prefix="/i18n">
<file>ca.qm</file>
<file>cs.qm</file>
<file>de.qm</file>
<file>de_AT.qm</file>
<file>es.qm</file>
......
......@@ -5,6 +5,8 @@ find_package(Qt5LinguistTools)
file(GLOB FILES_TO_TRANSLATE
${CMAKE_SOURCE_DIR}/src/*.cpp
${CMAKE_SOURCE_DIR}/src/qml/*.qml
${CMAKE_SOURCE_DIR}/src/qml/elements/*.qml
${CMAKE_SOURCE_DIR}/src/qml/settings/*.qml
)
file(GLOB TS_FILES
${CMAKE_CURRENT_LIST_DIR}/*.ts
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -16,6 +16,68 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ChangePassword</name>
<message>
<source>Change password</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Current password:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>New password:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>New password (repeat):</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>New passwords do not match.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Current password is invalid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>You need to be connected to change your password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>After changing your password, you will need to reenter it on all your other devices.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ChatMessage</name>
<message>
<source>Copy Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Edit Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Spoiler</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ChatPage</name>
<message>
......@@ -46,11 +108,23 @@
<source>Other file</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Send a spoiler message</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Spoiler hint</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DownloadJob</name>
<message>
<source>Download failed.</source>
<source>Could not save file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download failed: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
......@@ -61,6 +135,24 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FileChooser</name>
<message>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FileChooserMobile</name>
<message>
<source>Go to parent folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>GlobalDrawer</name>
<message>
......@@ -79,6 +171,10 @@
<source>Invitation link copied to clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Kaidan</name>
......@@ -102,18 +198,10 @@
<source>Your Jabber-ID:</source>
<translation></translation>
</message>
<message>
<source>Your diaspora*-ID:</source>
<translation></translation>
</message>
<message>
<source>user@example.org</source>
<translation></translation>
</message>
<message>
<source>user@diaspora.pod</source>
<translation></translation>
</message>
<message>
<source>Your Password:</source>
<translation></translation>
......@@ -169,6 +257,95 @@
<source>Could not correct message, as a result of not being connected.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Spoiler</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RegistrationManager</name>
<message>
<source>Password changed successfully.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Failed to change password: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RosterAddContactSheet</name>
<message>
<source>Add new contact</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will also send a request to access the presence of the contact.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Jabber-ID:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>user@example.org</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Nickname:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Optional message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Tell your chat partner who you are.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RosterListItem</name>
<message>
<source>Error: Please check the JID.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Available</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Free for chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Away</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Do not disturb</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Away for longer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RosterManager</name>
......@@ -180,6 +357,10 @@
<source>Could not remove contact, as a result of not being connected.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Spoiler</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RosterPage</name>
......@@ -200,6 +381,74 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RosterRemoveContactSheet</name>
<message>
<source>Do you really want to delete the contact &lt;b&gt;%1&lt;/b&gt; from your roster?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete contact</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SendMediaSheet</name>
<message>
<source>Caption</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Send</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsPage</name>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Change password</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Changes your account&apos;s password. You will need to re-enter it on your other devices.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SubRequestAcceptSheet</name>
<message>
<source>Subscription Request</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>You received a subscription request by &lt;b&gt;%1&lt;/b&gt;. If you accept it, the account will have access to your presence status.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Decline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UploadManager</name>
<message>
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -7,6 +7,7 @@
<file alias="qml/AboutDialog.qml">src/qml/AboutDialog.qml</file>
<file alias="qml/GlobalDrawer.qml">src/qml/GlobalDrawer.qml</file>
<file alias="qml/EmptyChatPage.qml">src/qml/EmptyChatPage.qml</file>
<file alias="qml/elements/SubRequestAcceptSheet.qml">src/qml/elements/SubRequestAcceptSheet.qml</file>
<file alias="qml/elements/RosterAddContactSheet.qml">src/qml/elements/RosterAddContactSheet.qml</file>
<file alias="qml/elements/RosterRemoveContactSheet.qml">src/qml/elements/RosterRemoveContactSheet.qml</file>
......@@ -25,6 +26,11 @@
<file alias="qml/elements/EmojiPicker.qml">src/qml/elements/EmojiPicker.qml</file>
<file alias="qml/elements/TextAvatar.qml">src/qml/elements/TextAvatar.qml</file>
<file alias="qml/settings/SettingsItem.qml">src/qml/settings/SettingsItem.qml</file>
<file alias="qml/settings/SettingsPage.qml">src/qml/settings/SettingsPage.qml</file>
<file alias="qml/settings/SettingsSheet.qml">src/qml/settings/SettingsSheet.qml</file>
<file alias="qml/settings/ChangePassword.qml">src/qml/settings/ChangePassword.qml</file>
<file alias="qtquickcontrols2.conf">misc/qtquickcontrols2.conf</file>
</qresource>
</RCC>
......@@ -23,6 +23,11 @@
<file alias="go-parent-folder.svg">3rdparty/breeze-icons/icons/actions/22/go-parent-folder.svg</file>
<file alias="folder.svg">3rdparty/breeze-icons/icons/places/22/folder.svg</file>
<file alias="text-x-plain.svg">3rdparty/breeze-icons/icons/mimetypes/22/text-x-plain.svg</file>
<file alias="tab-close.svg">3rdparty/breeze-icons/icons/actions/22/tab-close.svg</file>
<file alias="password-show-on.svg">3rdparty/breeze-icons/icons/actions/22/password-show-on.svg</file>
<file alias="password-show-off.svg">3rdparty/breeze-icons/icons/actions/22/password-show-off.svg</file>
<file alias="settings-configure.svg">3rdparty/breeze-icons/icons/actions/22/settings-configure.svg</file>
<file alias="lock.svg">3rdparty/breeze-icons/icons/actions/22/lock.svg</file>
</qresource>
<qresource prefix="/icons/breeze/actions/16">
......
<?xml version="1.0"?>
<manifest package="org.kaidanim.kaidan" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="0.4.0-dev" android:versionCode="1" android:installLocation="auto">
<application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="Kaidan" android:icon="@mipmap/icon">
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="Kaidan" android:screenOrientation="unspecified" android:launchMode="singleTop">
<manifest package="@APPLICATION_ID@" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="@VERSION_STRING@" android:versionCode="@ANDROID_VERSION_CODE@" android:installLocation="auto">
<application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="@APPLICATION_DISPLAY_NAME@" android:icon="@mipmap/icon">
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="Kaidan" android:screenOrientation="unspecified" android:launchMode="singleTop" android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
......@@ -75,7 +75,4 @@
<!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.
Remove the comment if you do not require these default features. -->
<!-- %%INSERT_FEATURES -->
</manifest>
[Global]
IconName=kaidan
Comment=A user-friendly XMPP client for every device
Name=Kaidan
[Event/new-message]
Name=New message
Comment=You have received a new message
Action=Sound|Popup
......@@ -15,11 +15,13 @@
<category>Network</category>
</categories>
<url type="homepage">https://kaidan.im</url>
<url type="bugtracker">https://invent.kde.org/KDE/kaidan/issues</url>
<url type="help">https://invent.kde.org/KDE/kaidan/wikis</url>
<launchable type="desktop-id">kaidan.desktop</launchable>
<screenshots>
<screenshot>
<caption>Example chat on a desktop and on a mobile device</caption>
<image type="source">https://git.kaidan.im/kaidan/kaidan/uploads/da4886ea50581517bde0278a804b311c/kaidan-screenshot-0.3.png</image>
<image type="source">https://www.kaidan.im/images/screenshot.png</image>
</screenshot>
</screenshots>
<provides>
......
......@@ -10,6 +10,6 @@
"apparmor": "apparmor.json"
}
},
"version": "0.4.0~dev.@CLICK_DATE@",
"version": "@CLICK_VERSION@",
"maintainer": "Kaidan developers <gamerbude@lnj.li>"
}
......@@ -92,7 +92,6 @@ AvatarFileStorage::AddAvatarResult AvatarFileStorage::addAvatar(const QString &j
if (oldHash != result.hash) {
jidAvatarMap[jid] = result.hash;
result.hasChanged = true;
emit avatarIdsChanged();
// delete the avatar if it isn't used anymore
cleanUp(oldHash);
......@@ -100,11 +99,9 @@ AvatarFileStorage::AddAvatarResult AvatarFileStorage::addAvatar(const QString &j
// abort if the avatar with this hash is already saved
// only update GUI, if avatar really has changed
bool hasAvatar = hasAvatarHash(result.hash);
if (hasAvatar && result.hasChanged) {
emit avatarIdsChanged();
return result;
} else if (hasAvatar) {
if (hasAvatarHash(result.hash)) {
if (result.hasChanged)
emit avatarIdsChanged();
return result;
}
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -46,8 +46,11 @@ class DownloadJob : public QObject
{
Q_OBJECT
public:
DownloadJob(QString msgId, QUrl source, QString filePath,
QNetworkAccessManager *netMngr, TransferCache *transferCache,
DownloadJob(QString msgId,
QUrl source,
QString filePath,
QNetworkAccessManager *netMngr,
TransferCache *transferCache,
Kaidan *kaidan);
QString downloadLocation() const;
......@@ -99,8 +102,8 @@ signals:
void abortDownloadRequested(const QString msgId);
public slots:
void startDownload(const QString msgId, const QString url);
void abortDownload(const QString msgId);
void startDownload(const QString &msgId, const QString &url);
void abortDownload(const QString &msgId);
private:
DownloadThread *thread;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -28,9 +28,10 @@
* along with Kaidan. If not, see <http://www.gnu.org/licenses/>.
*/
#include <string>
#include <QString>
namespace Notifications
class Notifications
{
void sendMessageNotification(std::string fromName, std::string message);
}
public:
static void sendMessageNotification(const QString &fromName, const QString &message);
};
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.