diff --git a/linphone-app/assets/languages/en.ts b/linphone-app/assets/languages/en.ts index 57add1415..4ceb9983a 100644 --- a/linphone-app/assets/languages/en.ts +++ b/linphone-app/assets/languages/en.ts @@ -7,6 +7,11 @@ ok OK + + aboutTranslation + 'Help us translate %1' : %1 is the application name + Help us translate %1 + ActivateAppSipAccountWithEmail @@ -2879,6 +2884,7 @@ Click here: <a href="%1">%1</a> UseOtherSipAccount confirmAction + 'Use' : Popup confirmation for a form USE @@ -2909,6 +2915,26 @@ Click here: <a href="%1">%1</a> addOtherSipAccountError Unable to add this account. + + understandAction + 'I understand' : Popup confirmation for a warning + I understand + + + warningFeatures + 'Some features require a Linphone account, such as group messaging or ephemeral messaging.' : Warning text about features. + Some features require a Linphone account, such as group messaging or ephemeral messaging. + + + warningThirdParty + 'These features are hidden when you register with a third party SIP account.' : Warning text for using third party account. + These features are hidden when you register with a third party SIP account. + + + warningContact + 'To enable it in a commercial project, please contact us.' : Warning text for contacting about enabling features. + To enable it in a commercial project, please contact us. + ZrtpTokenAuthentication diff --git a/linphone-app/assets/languages/fr_FR.ts b/linphone-app/assets/languages/fr_FR.ts index fc68bcf53..2a9c3333c 100644 --- a/linphone-app/assets/languages/fr_FR.ts +++ b/linphone-app/assets/languages/fr_FR.ts @@ -7,6 +7,11 @@ ok OK + + aboutTranslation + 'Help us translate %1' : %1 is the application name + Contribuer aux traductions + ActivateAppSipAccountWithEmail @@ -521,7 +526,7 @@ URL du serveur non configurée. Forwarded 'Forwarded' : Header on a message that contains a forward. - + Transféré @@ -1579,9 +1584,9 @@ Cliquez ici : <a href="%1">%1</a> unreadMessageNotice '%1 unread messages' : Little message to show on an event where unread messages begin. - - - + + %1 message non lu + %1 messages non lus @@ -1639,7 +1644,7 @@ Cliquez ici : <a href="%1">%1</a> conversationDevicesTitle 'Conversation's devices' : Title of window that show all devices - + Liste des appareils @@ -1939,7 +1944,7 @@ Cliquez ici : <a href="%1">%1</a> chatNotificationsEnabledLabel 'Enable notifications': settings label for enabling notifications. - + Activer les notifications @@ -2296,7 +2301,7 @@ Cliquez ici : <a href="%1">%1</a> defaultDeviceNameLabel 'Device Name' : Label for setting the device name. - + Nom de l'appareil @@ -2856,6 +2861,7 @@ Cliquez ici : <a href="%1">%1</a> UseOtherSipAccount confirmAction + 'Use' : Popup confirmation for a form UTILISER @@ -2886,6 +2892,26 @@ Cliquez ici : <a href="%1">%1</a> addOtherSipAccountError Impossible d'ajouter ce compte. + + understandAction + 'I understand' : Popup confirmation for a warning + J'ai compris + + + warningFeatures + 'Some features require a Linphone account, such as group messaging or ephemeral messaging.' : Warning text about features. + Certaines fonctionnalités avancées comme les messages de groupe ou les messages éphémères nécessitent un compte Linphone. + + + warningThirdParty + 'These features are hidden when you register with a third party SIP account.' : Warning text for using third party account. + Elles seront masquées dans l'application si vous configurez un compte SIP tiers. + + + warningContact + 'To enable it in a commercial project, please contact us.' : Warning text for contacting about enabling features. + Si vous souhaitez les activer pour un projet professionnel, contactez-nous. + ZrtpTokenAuthentication diff --git a/linphone-app/cmake_builder/linphone_package/CMakeLists.txt b/linphone-app/cmake_builder/linphone_package/CMakeLists.txt index e8ec1e861..27c982400 100644 --- a/linphone-app/cmake_builder/linphone_package/CMakeLists.txt +++ b/linphone-app/cmake_builder/linphone_package/CMakeLists.txt @@ -133,7 +133,7 @@ if (WIN32) file(GLOB GRAMMAR_FILES "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/Belr/grammars/*") install(FILES ${GRAMMAR_FILES} DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/belr/grammars/" ) install(DIRECTORY "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/images" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}" USE_SOURCE_PERMISSIONS OPTIONAL) - install(DIRECTORY "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/sounds/linphone/" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/${EXECUTABLE_NAME}" USE_SOURCE_PERMISSIONS) + install(DIRECTORY "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/sounds/linphone/" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/sounds/${EXECUTABLE_NAME}" USE_SOURCE_PERMISSIONS) install(FILES "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/Linphone/rootca.pem" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/${EXECUTABLE_NAME}/") install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../../assets/linphonerc-factory" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/${EXECUTABLE_NAME}") @@ -192,7 +192,7 @@ elseif (APPLE) file(GLOB GRAMMAR_FILES "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/Belr/grammars/*") install(FILES ${GRAMMAR_FILES} DESTINATION "${APPLICATION_NAME}.app/Contents/Resources/${CMAKE_INSTALL_DATAROOTDIR}/belr/grammars/") install(DIRECTORY "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/images" DESTINATION "${APPLICATION_NAME}.app/Contents/Resources/${CMAKE_INSTALL_DATAROOTDIR}" USE_SOURCE_PERMISSIONS OPTIONAL) - install(DIRECTORY "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/sounds/linphone/" DESTINATION "${APPLICATION_NAME}.app/Contents/Resources/${CMAKE_INSTALL_DATAROOTDIR}/${EXECUTABLE_NAME}" USE_SOURCE_PERMISSIONS) + install(DIRECTORY "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/sounds/linphone/" DESTINATION "${APPLICATION_NAME}.app/Contents/Resources/${CMAKE_INSTALL_DATAROOTDIR}/sounds/${EXECUTABLE_NAME}" USE_SOURCE_PERMISSIONS) install(FILES "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/Linphone/rootca.pem" DESTINATION "${APPLICATION_NAME}.app/Contents/Resources/${CMAKE_INSTALL_DATAROOTDIR}/${EXECUTABLE_NAME}") install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../../assets/linphonerc-factory" DESTINATION "${APPLICATION_NAME}.app/Contents/Resources/${CMAKE_INSTALL_DATAROOTDIR}/${EXECUTABLE_NAME}") diff --git a/linphone-app/src/components/call/CallModel.cpp b/linphone-app/src/components/call/CallModel.cpp index 8726ecc17..e26fc6106 100644 --- a/linphone-app/src/components/call/CallModel.cpp +++ b/linphone-app/src/components/call/CallModel.cpp @@ -941,11 +941,10 @@ QString CallModel::generateSavedFilename () const { QString CallModel::generateSavedFilename (const QString &from, const QString &to) { auto escape = [](const QString &str) { - constexpr char ReservedCharacters[] = "<>:\"/\\|\\?\\*"; + constexpr char ReservedCharacters[] = "[<|>|:|\"|/|\\\\|\\?|\\*|\\+|\\|]+"; static QRegularExpression regexp(ReservedCharacters); return QString(str).replace(regexp, ""); }; - return QStringLiteral("%1_%2_%3") .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd_hh-mm-ss")) .arg(escape(from)) diff --git a/linphone-app/src/components/ldap/LdapModel.cpp b/linphone-app/src/components/ldap/LdapModel.cpp index 1d9e52e33..309f86090 100644 --- a/linphone-app/src/components/ldap/LdapModel.cpp +++ b/linphone-app/src/components/ldap/LdapModel.cpp @@ -134,8 +134,6 @@ void LdapModel::unset(){ mSipDomain = QString::fromStdString(mLdapParams->getSipDomain()); mDebug = (int)mLdapParams->getDebugLevel(); mVerifyServerCertificates = (int)mLdapParams->getServerCertificatesVerificationMode(); - int c = (int) mLdapParams->getAuthMethod(); - qWarning() << c; testServerField(); testMaxResultsField(); testTimeoutField(); diff --git a/linphone-app/src/utils/Constants.cpp b/linphone-app/src/utils/Constants.cpp index 016bc1319..af9462ac9 100644 --- a/linphone-app/src/utils/Constants.cpp +++ b/linphone-app/src/utils/Constants.cpp @@ -109,6 +109,8 @@ constexpr char Constants::VersionCheckUrl[]; constexpr char Constants::PasswordRecoveryUrl[]; constexpr char Constants::CguUrl[]; constexpr char Constants::PrivatePolicyUrl[]; +constexpr char Constants::ContactUrl[]; +constexpr char Constants::TranslationUrl[]; constexpr char Constants::LinphoneBZip2_exe[]; diff --git a/linphone-app/src/utils/Constants.hpp b/linphone-app/src/utils/Constants.hpp index ba4c7e7a1..b0440fb88 100644 --- a/linphone-app/src/utils/Constants.hpp +++ b/linphone-app/src/utils/Constants.hpp @@ -59,6 +59,10 @@ public: static constexpr char PasswordRecoveryUrl[] = "https://subscribe.linphone.org/login"; static constexpr char CguUrl[] = "https://www.linphone.org/general-terms"; static constexpr char PrivatePolicyUrl[] = "https://www.linphone.org/privacy-policy"; + static constexpr char ContactUrl[] = "https://www.linphone.org/contact"; + static constexpr char TranslationUrl[] = "https://weblate.linphone.org/projects/linphone-desktop/"; + + static constexpr char LinphoneBZip2_exe[] = "http://www.linphone.org/releases/windows/tools/bzip2/bzip2.exe"; static constexpr char LinphoneBZip2_dll[] = "http://www.linphone.org/releases/windows/tools/bzip2/bzip2.dll"; @@ -71,6 +75,9 @@ public: Q_PROPERTY(QString PasswordRecoveryUrl MEMBER PasswordRecoveryUrl CONSTANT) Q_PROPERTY(QString CguUrl MEMBER CguUrl CONSTANT) Q_PROPERTY(QString PrivatePolicyUrl MEMBER PrivatePolicyUrl CONSTANT) + Q_PROPERTY(QString ContactUrl MEMBER ContactUrl CONSTANT) + Q_PROPERTY(QString TranslationUrl MEMBER TranslationUrl CONSTANT) + static constexpr char DefaultAssistantRegistrationUrl[] = "https://subscribe.linphone.org/register"; static constexpr char DefaultAssistantLoginUrl[] = "https://subscribe.linphone.org/login"; static constexpr char DefaultAssistantLogoutUrl[] = "https://subscribe.linphone.org/logout"; diff --git a/linphone-app/ui/modules/Common/Form/ActionButton.qml b/linphone-app/ui/modules/Common/Form/ActionButton.qml index 3467b78c3..2d87ecca7 100644 --- a/linphone-app/ui/modules/Common/Form/ActionButton.qml +++ b/linphone-app/ui/modules/Common/Form/ActionButton.qml @@ -106,65 +106,81 @@ Item { // } // return wrappedButton.icon; } + function getColor(color, defaultColor, debugVar){ + if(color) + return color + else{ + console.warn("No color defined for :"+debugVar) + return defaultColor + } + } function getBackgroundColor(){ + var defaultColor = 'transparent' if(isCustom){ if(wrappedButton.icon == '') - return wrappedButton.colorSet.backgroundNormalColor + return getColor(wrappedButton.colorSet.backgroundNormalColor, defaultColor, 'backgroundNormalColor') if (wrappedButton.updating || wrappedButton.toggled) - return wrappedButton.colorSet.backgroundUpdatingColor + return getColor(wrappedButton.colorSet.backgroundUpdatingColor, defaultColor, 'backgroundUpdatingColor') if (!useStates) - return wrappedButton.colorSet.backgroundNormalColor + return getColor(wrappedButton.colorSet.backgroundNormalColor, defaultColor, 'backgroundNormalColor') if (!wrappedButton.enabled) - return wrappedButton.colorSet.backgroundDisabledColor - return button.down ? wrappedButton.colorSet.backgroundPressedColor - : (button.hovered ? wrappedButton.colorSet.backgroundHoveredColor: wrappedButton.colorSet.backgroundNormalColor) + return getColor(wrappedButton.colorSet.backgroundDisabledColor, defaultColor, 'backgroundDisabledColor') + return button.down ? getColor(wrappedButton.colorSet.backgroundPressedColor, defaultColor, 'backgroundPressedColor') + : (button.hovered ? getColor(wrappedButton.colorSet.backgroundHoveredColor, defaultColor, 'backgroundHoveredColor') + : getColor(wrappedButton.colorSet.backgroundNormalColor, defaultColor, 'backgroundNormalColor')) }else - return 'transparent' + return defaultColor } function getForegroundColor(){ + var defaultColor = 'black' if(isCustom){ if(wrappedButton.icon == '') - return wrappedButton.colorSet.foregroundNormalColor + return getColor(wrappedButton.colorSet.foregroundNormalColor, defaultColor, 'foregroundNormalColor') if (wrappedButton.updating || wrappedButton.toggled) - return wrappedButton.colorSet.foregroundUpdatingColor + return getColor(wrappedButton.colorSet.foregroundUpdatingColor, defaultColor, 'foregroundUpdatingColor') if (!useStates) - return wrappedButton.colorSet.foregroundNormalColor + return getColor(wrappedButton.colorSet.foregroundNormalColor, defaultColor, 'foregroundNormalColor') if (!wrappedButton.enabled) - return wrappedButton.colorSet.foregroundDisabledColor - return button.down ? wrappedButton.colorSet.foregroundPressedColor - : (button.hovered ? wrappedButton.colorSet.foregroundHoveredColor: wrappedButton.colorSet.foregroundNormalColor) + return getColor(wrappedButton.colorSet.foregroundDisabledColor, defaultColor, 'foregroundDisabledColor') + return button.down ? getColor(wrappedButton.colorSet.foregroundPressedColor, defaultColor, 'foregroundPressedColor') + : (button.hovered ? getColor(wrappedButton.colorSet.foregroundHoveredColor, defaultColor, 'foregroundHoveredColor') + : getColor(wrappedButton.colorSet.foregroundNormalColor, defaultColor, 'foregroundNormalColor')) }else - return "black" + return defaultColor } function getBackgroundHiddenPartColor(){ + var defaultColor = 'transparent' if(isCustom){ if(wrappedButton.icon == '') - return wrappedButton.backgroundHiddenPartNormalColor + return getColor(wrappedButton.colorSet.backgroundHiddenPartNormalColor, defaultColor, 'backgroundHiddenPartNormalColor') if (wrappedButton.updating || wrappedButton.toggled) - return wrappedButton.backgroundHiddenPartUpdatingColor + return getColor(wrappedButton.colorSet.backgroundHiddenPartUpdatingColor, defaultColor, 'backgroundHiddenPartUpdatingColor') if (!useStates) - return wrappedButton.backgroundHiddenPartNormalColor + return getColor(wrappedButton.colorSet.backgroundHiddenPartNormalColor, defaultColor, 'backgroundHiddenPartNormalColor') if (!wrappedButton.enabled) - return wrappedButton.backgroundHiddenPartDisabledColor - return button.down ? wrappedButton.backgroundHiddenPartPressedColor - : (button.hovered ? wrappedButton.backgroundHiddenPartHoveredColor: wrappedButton.backgroundHiddenPartNormalColor) + return getColor(wrappedButton.colorSet.backgroundHiddenPartDisabledColor, defaultColor, 'backgroundHiddenPartDisabledColor') + return button.down ? getColor(wrappedButton.colorSet.backgroundHiddenPartPressedColor, defaultColor, 'backgroundHiddenPartPressedColor') + : (button.hovered ? getColor(wrappedButton.colorSet.backgroundHiddenPartHoveredColor, defaultColor, 'backgroundHiddenPartHoveredColor') + : getColor(wrappedButton.colorSet.backgroundHiddenPartNormalColor, defaultColor, 'backgroundHiddenPartNormalColor')) }else - return 'transparent' + return defaultColor } function getForegroundHiddenPartColor(){ + var defaultColor = '#80FFFFFF' if(isCustom){ if(wrappedButton.icon == '') - return wrappedButton.foregroundHiddenPartNormalColor + return getColor(wrappedButton.colorSet.foregroundHiddenPartNormalColor, defaultColor, 'foregroundHiddenPartNormalColor') if (wrappedButton.updating || wrappedButton.toggled) - return wrappedButton.foregroundHiddenPartUpdatingColor + return getColor(wrappedButton.colorSet.foregroundHiddenPartUpdatingColor, defaultColor, 'foregroundHiddenPartUpdatingColor') if (!useStates) - return wrappedButton.foregroundHiddenPartNormalColor + return getColor(wrappedButton.colorSet.foregroundHiddenPartNormalColor, defaultColor, 'foregroundHiddenPartNormalColor') if (!wrappedButton.enabled) - return wrappedButton.foregroundHiddenPartDisabledColor - return button.down ? wrappedButton.foregroundHiddenPartPressedColor - : (button.hovered ? wrappedButton.foregroundHiddenPartHoveredColor: wrappedButton.foregroundHiddenPartNormalColor) + return getColor(wrappedButton.colorSet.foregroundHiddenPartDisabledColor, defaultColor, 'foregroundHiddenPartDisabledColor') + return button.down ? getColor(wrappedButton.colorSet.foregroundHiddenPartPressedColor, defaultColor, 'foregroundHiddenPartPressedColor') + : (button.hovered ? getColor(wrappedButton.colorSet.foregroundHiddenPartHoveredColor, defaultColor, 'foregroundHiddenPartHoveredColor') + : getColor(wrappedButton.colorSet.foregroundHiddenPartNormalColor, defaultColor, 'foregroundHiddenPartNormalColor')) }else - return "#80FFFFFF" + return defaultColor } // --------------------------------------------------------------------------- @@ -187,7 +203,7 @@ Item { height: parent.height width: parent.width * ( 1 - wrappedButton.percentageDisplayed / 100 ) id: backgroundHiddenPartColor - color: getBackgroundHiddenPartColor() + color: width > 0 ? getBackgroundHiddenPartColor() : 'transparent' } } hoverEnabled: !wrappedButton.updating//|| wrappedButton.autoIcon @@ -199,7 +215,7 @@ Item { color: 'transparent' Rectangle{ anchors.fill:parent - color: getForegroundColor() + color: getForegroundColor() anchors.rightMargin: parent.width * ( 1 - wrappedButton.percentageDisplayed / 100 ) } } @@ -210,7 +226,7 @@ Item { color: 'transparent' Rectangle{ anchors.fill:parent - color: getForegroundHiddenPartColor() + color: percentageDisplayed != 100 ? getForegroundHiddenPartColor() : 'transparent' anchors.leftMargin: parent.width * wrappedButton.percentageDisplayed / 100 } } diff --git a/linphone-app/ui/modules/Linphone/Chat/Chat.qml b/linphone-app/ui/modules/Linphone/Chat/Chat.qml index 3ea3e3db0..a9c97f39a 100644 --- a/linphone-app/ui/modules/Linphone/Chat/Chat.qml +++ b/linphone-app/ui/modules/Linphone/Chat/Chat.qml @@ -336,7 +336,7 @@ Rectangle { anchors.bottom: parent.bottom anchors.bottomMargin: 10 anchors.right: parent.right - anchors.rightMargin: 40 + anchors.rightMargin: 35 visible: chat.isIndexAfter(chat.count-1) onVisibleChanged: updateMarkAsRead() Component.onCompleted: updateMarkAsRead() @@ -360,9 +360,12 @@ Rectangle { MessageCounter{ anchors.left: parent.right anchors.bottom: parent.top - anchors.bottomMargin: -5 - anchors.leftMargin: -5 + anchors.bottomMargin: 0 + anchors.leftMargin: -14 count: container.proxyModel.chatRoomModel ? container.proxyModel.chatRoomModel.unreadMessagesCount : 0 + showOnlyNumber: true + iconSize: 15 + pointSize: Units.dp * 7 } } diff --git a/linphone-app/ui/modules/Linphone/Chat/ChatAudioMessage.qml b/linphone-app/ui/modules/Linphone/Chat/ChatAudioMessage.qml index 3eb598759..b304b6690 100644 --- a/linphone-app/ui/modules/Linphone/Chat/ChatAudioMessage.qml +++ b/linphone-app/ui/modules/Linphone/Chat/ChatAudioMessage.qml @@ -26,7 +26,7 @@ Loader{ property ContentModel contentModel property int maxWidth : parent.width property int fitWidth: active ? Math.max(maxWidth - ChatAudioMessageStyle.emptySpace, ChatAudioMessageStyle.minWidth) : 0 - property int fitHeight: active ? 50 : 0 + property int fitHeight: active ? 40 : 0 property font customFont : SettingsModel.textMessageFont property bool isOutgoing : contentModel && (contentModel.chatMessageModel.isOutgoing || contentModel.chatMessageModel.state == LinphoneEnums.ChatMessageStateIdle); @@ -63,6 +63,7 @@ Loader{ anchors.fill: parent spacing: 5 ActionButton{ + id: playButton Layout.preferredHeight: iconSize Layout.preferredWidth: iconSize Layout.rightMargin: 5 @@ -83,8 +84,6 @@ Loader{ Layout.fillHeight: true Layout.fillWidth: true Layout.alignment: Qt.AlignVCenter - Layout.topMargin: 5 - Layout.bottomMargin: 5 Layout.rightMargin: 15 MediaProgressBar{ id: mediaProgressBar diff --git a/linphone-app/ui/modules/Linphone/Chat/ChatTextMessage.qml b/linphone-app/ui/modules/Linphone/Chat/ChatTextMessage.qml index 96b5ce12b..d11fdd34e 100644 --- a/linphone-app/ui/modules/Linphone/Chat/ChatTextMessage.qml +++ b/linphone-app/ui/modules/Linphone/Chat/ChatTextMessage.qml @@ -23,7 +23,7 @@ TextEdit { property ContentModel contentModel property string lastTextSelected : '' property font customFont : SettingsModel.textMessageFont - property int fitHeight: visible ? contentHeight + padding : 0 + property int fitHeight: visible ? contentHeight + padding + 6 : 0 property int fitWidth: visible ? implicitWidth + 2: 0 // add 2 because there is a bug on border that lead to not fit text exactly signal rightClicked() diff --git a/linphone-app/ui/modules/Linphone/Chat/Message.qml b/linphone-app/ui/modules/Linphone/Chat/Message.qml index daa55799f..522f35e28 100644 --- a/linphone-app/ui/modules/Linphone/Chat/Message.qml +++ b/linphone-app/ui/modules/Linphone/Chat/Message.qml @@ -38,7 +38,7 @@ Item { // --------------------------------------------------------------------------- property string lastTextSelected - implicitHeight: (deliveryLayout.visible? deliveryLayout.height : 0) +(ephemeralTimerRow.visible? 16 : 0) + messageData.height +5 + implicitHeight: (deliveryLayout.visible? deliveryLayout.height : 0) +(ephemeralTimerRow.visible? 16 : 0) + messageData.height Rectangle { id: rectangle diff --git a/linphone-app/ui/modules/Linphone/History/History.js b/linphone-app/ui/modules/Linphone/History/History.js index f61c57f79..6cef48676 100644 --- a/linphone-app/ui/modules/Linphone/History/History.js +++ b/linphone-app/ui/modules/Linphone/History/History.js @@ -38,7 +38,7 @@ function loadMoreEntries () { if (history.atYBeginning && !history.tryToLoadMoreEntries) { history.tryToLoadMoreEntries = true history.positionViewAtBeginning() - container.proxyModel.loadMoreEntriesAsync() + container.proxyModel.loadMoreEntries() } } diff --git a/linphone-app/ui/modules/Linphone/History/History.qml b/linphone-app/ui/modules/Linphone/History/History.qml index a076f71d5..bdb9b6402 100644 --- a/linphone-app/ui/modules/Linphone/History/History.qml +++ b/linphone-app/ui/modules/Linphone/History/History.qml @@ -49,7 +49,7 @@ Rectangle { Component.onCompleted: Logic.initView() - onContentYChanged: Logic.loadMoreEntriesAsync() + onContentYChanged: Logic.loadMoreEntries() onMovementEnded: Logic.handleMovementEnded() onMovementStarted: Logic.handleMovementStarted() diff --git a/linphone-app/ui/modules/Linphone/Misc/MessageCounter.qml b/linphone-app/ui/modules/Linphone/Misc/MessageCounter.qml index c72cd28e3..ff04364ef 100644 --- a/linphone-app/ui/modules/Linphone/Misc/MessageCounter.qml +++ b/linphone-app/ui/modules/Linphone/Misc/MessageCounter.qml @@ -5,30 +5,41 @@ import Linphone.Styles 1.0 // ============================================================================= -Icon { - id: messageCounter - - property int count: 0 - - icon: 'chat_count' - iconSize: MessageCounterStyle.iconSize.message - visible: messageCounter.count > 0 - - Icon { - anchors { - horizontalCenter: parent.right - verticalCenter: parent.bottom - } - - icon: 'chat_amount' - iconSize: MessageCounterStyle.iconSize.amount - visible: messageCounter.count > 0 - - Text { - anchors.centerIn: parent - color: MessageCounterStyle.text.color - font.pointSize: MessageCounterStyle.text.pointSize - text: (messageCounter.count>99 ? '+' : messageCounter.count) - } - } +Item{ + id: messageCounter + property bool showOnlyNumber: false + property int count: 0 + property alias icon: backgroundIcon.icon + property alias iconSize: amountIcon.iconSize + property int pointSize: MessageCounterStyle.text.pointSize + + visible: messageCounter.count > 0 + + height: showOnlyNumber ? amountIcon.height : backgroundIcon.height + width: showOnlyNumber ? amountIcon.width : backgroundIcon.width + + Icon { + id: backgroundIcon + icon: 'chat_count' + iconSize: MessageCounterStyle.iconSize.message + visible: !messageCounter.showOnlyNumber + } + Icon { + id: amountIcon + anchors { + horizontalCenter: parent.right + verticalCenter: parent.bottom + } + + icon: 'chat_amount' + iconSize: MessageCounterStyle.iconSize.amount + visible: messageCounter.count > 0 + + Text { + anchors.centerIn: parent + color: MessageCounterStyle.text.color + font.pointSize: messageCounter.pointSize + text: (messageCounter.count>99 ? '+' : messageCounter.count) + } + } } diff --git a/linphone-app/ui/views/App/Main/Assistant/UseOtherSipAccount.qml b/linphone-app/ui/views/App/Main/Assistant/UseOtherSipAccount.qml index 4cb9f4eea..586c2dcdf 100644 --- a/linphone-app/ui/views/App/Main/Assistant/UseOtherSipAccount.qml +++ b/linphone-app/ui/views/App/Main/Assistant/UseOtherSipAccount.qml @@ -1,7 +1,9 @@ import QtQuick 2.7 +import QtQuick.Controls 2.5 import Common 1.0 import Linphone 1.0 +import ConstantsCpp 1.0 import App.Styles 1.0 @@ -9,88 +11,173 @@ import App.Styles 1.0 Item{ AssistantAbstractView { + id: mainItem mainAction: requestBlock.execute mainActionEnabled: username.text.length && sipDomain.text.length && password.text.length - - mainActionLabel: qsTr('confirmAction') - + //: 'I understand' : Popup confirmation for a warning + mainActionLabel: showWarning ? qsTr('understandAction').toUpperCase() + //: 'Use' : Popup confirmation for a form + : qsTr('confirmAction').toUpperCase() + title: qsTr('useOtherSipAccountTitle') - + width: AssistantAbstractViewStyle.content.width height: AssistantAbstractViewStyle.content.height anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter - + + property bool showWarning : true + // --------------------------------------------------------------------------- - //anchors.centerIn: parent - //anchors.horizontalCenter:parent.horizontalCenter - Column { + + StackView { + id: mainStack anchors.fill: parent.contentItem width: AssistantAbstractViewStyle.content.width height: AssistantAbstractViewStyle.content.height - - Form { - orientation: Qt.Vertical - width: parent.width - - FormLine { - FormGroup { - label: qsTr('usernameLabel') - - TextField { - id: username - } - } - - FormGroup { - label: qsTr('displayNameLabel') - - TextField { - id: displayName - } - } + initialItem: warningComponent + } + Component{ + id: warningComponent + Column{ + spacing: UseAppSipAccountStyle.warningBlock.spacing + anchors.fill: parent.contentItem + + Text { + elide: Text.ElideRight + font.pointSize: UseAppSipAccountStyle.warningBlock.pointSize + + width: parent.width + horizontalAlignment: Text.AlignLeft + color: UseAppSipAccountStyle.warningBlock.color + wrapMode: Text.WordWrap + //: 'Some features require a Linphone account, such as group messaging or ephemeral messaging.' : Warning text about features. + text: qsTr('warningFeatures') } - - FormLine { - FormGroup { - label: qsTr('sipDomainLabel') - - TextField { - id: sipDomain + Text{ + elide: Text.ElideRight + font.pointSize: UseAppSipAccountStyle.warningBlock.pointSize + + width: parent.width + horizontalAlignment: Text.AlignLeft + color: UseAppSipAccountStyle.warningBlock.color + wrapMode: Text.WordWrap + //: 'These features are hidden when you register with a third party SIP account.' : Warning text for using third party account. + text: qsTr('warningThirdParty') + } + Text { + elide: Text.ElideRight + font.pointSize: UseAppSipAccountStyle.warningBlock.pointSize + + width: parent.width + horizontalAlignment: Text.AlignLeft + color: UseAppSipAccountStyle.warningBlock.color + wrapMode: Text.WordWrap + //: 'To enable it in a commercial project, please contact us.' : Warning text for contacting about enabling features. + text: qsTr('warningContact') + } + Text { + elide: Text.ElideRight + font.pointSize: UseAppSipAccountStyle.warningBlock.contactUrl.pointSize + + width: parent.width + horizontalAlignment: Text.AlignHCenter + wrapMode: Text.WordWrap + color: UseAppSipAccountStyle.warningBlock.color + linkColor: UseAppSipAccountStyle.warningBlock.contactUrl.color + text: ''+ConstantsCpp.ContactUrl+'' + + visible: ConstantsCpp.ContactUrl != '' + + onLinkActivated: Qt.openUrlExternally(link) + + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.NoButton + cursorShape: parent.hoveredLink + ? Qt.PointingHandCursor + : Qt.IBeamCursor + } + } + } + + } + Component { + id: formComponent + Column { + anchors.fill: parent.contentItem + width: AssistantAbstractViewStyle.content.width + height: AssistantAbstractViewStyle.content.height + + Form { + orientation: Qt.Vertical + width: parent.width + + FormLine { + FormGroup { + label: qsTr('usernameLabel') + + TextField { + id: username + } + } + + FormGroup { + label: qsTr('displayNameLabel') + + TextField { + id: displayName + } } } - } - - FormLine { - FormGroup { - label: qsTr('passwordLabel') - - PasswordField { - id: password + + FormLine { + FormGroup { + label: qsTr('sipDomainLabel') + + TextField { + id: sipDomain + } } } - } - - FormLine { - FormGroup { - label: qsTr('transportLabel') - - ComboBox { - id: transport - model: [ 'UDP', 'TCP', 'TLS'] + + FormLine { + FormGroup { + label: qsTr('passwordLabel') + + PasswordField { + id: password + } + } + } + + FormLine { + FormGroup { + label: qsTr('transportLabel') + + ComboBox { + id: transport + model: [ 'UDP', 'TCP', 'TLS'] + } } } } } - - RequestBlock { - id: requestBlock - width: parent.width - - action: (function () { + } + + RequestBlock { + id: requestBlock + width: parent.width + + action: (function () { + if(mainItem.showWarning) { + mainItem.showWarning = false + mainStack.replace(formComponent); + requestBlock.stop('') + }else{ if (!assistantModel.addOtherSipAccount({ username: username.text, displayName: displayName.text, @@ -103,8 +190,8 @@ Item{ requestBlock.stop('') window.setView('Home') } - }) - } + } + }) } AssistantModel { id: assistantModel diff --git a/linphone-app/ui/views/App/Main/Conversation.qml b/linphone-app/ui/views/App/Main/Conversation.qml index e9c95ff0d..35aa10d5e 100644 --- a/linphone-app/ui/views/App/Main/Conversation.qml +++ b/linphone-app/ui/views/App/Main/Conversation.qml @@ -507,12 +507,21 @@ ColumnLayout { //: 'Search in messages' : this is a placeholder when searching something in the timeline list placeholderText: qsTr('searchMessagesPlaceholder') - onTextChanged: chatRoomProxyModel.filterText = text + onTextChanged: searchDelay.restart() onIconClicked: { searchView.visible = false chatRoomProxyModel.filterText = '' } font.pointSize: ConversationStyle.filters.pointSize + + Timer{ + id: searchDelay + interval: 500 + running: false + onTriggered: if( searchView.visible){ + chatRoomProxyModel.filterText = searchBar.text + } + } } } diff --git a/linphone-app/ui/views/App/Main/Dialogs/About.qml b/linphone-app/ui/views/App/Main/Dialogs/About.qml index 47b3e6b3a..bd00b4d76 100644 --- a/linphone-app/ui/views/App/Main/Dialogs/About.qml +++ b/linphone-app/ui/views/App/Main/Dialogs/About.qml @@ -3,6 +3,7 @@ import QtQuick.Layouts 1.3 import Common 1.0 import Linphone 1.0 +import ConstantsCpp 1.0 import App.Styles 1.0 @@ -100,6 +101,29 @@ DialogPlus { horizontalAlignment: Text.AlignHCenter } + Text { + elide: Text.ElideRight + font.pointSize: AboutStyle.copyrightBlock.url.pointSize + color: AboutStyle.copyrightBlock.url.color + linkColor: AboutStyle.copyrightBlock.url.color + //: 'Help us translate %1' : %1 is the application name + text: ''+qsTr('aboutTranslation').arg(applicationName)+'' + textFormat: Text.RichText + + width: parent.width + visible: ConstantsCpp.TranslationUrl != '' + horizontalAlignment: Text.AlignHCenter + + onLinkActivated: Qt.openUrlExternally(link) + + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.NoButton + cursorShape: parent.hoveredLink + ? Qt.PointingHandCursor + : Qt.IBeamCursor + } + } } } diff --git a/linphone-app/ui/views/App/Main/HistoryView.qml b/linphone-app/ui/views/App/Main/HistoryView.qml index fd44da1fb..0b70f5d5d 100644 --- a/linphone-app/ui/views/App/Main/HistoryView.qml +++ b/linphone-app/ui/views/App/Main/HistoryView.qml @@ -50,7 +50,11 @@ ColumnLayout { Layout.preferredHeight: HistoryViewStyle.bar.avatarSize Layout.preferredWidth: HistoryViewStyle.bar.avatarSize - image: peerAddress?Logic.getAvatar():null + image: peerAddress ? + (historyView._sipAddressObserver.contact + ? historyView._sipAddressObserver.contact + : null) + :null presenceLevel: historyView._sipAddressObserver?Presence.getPresenceLevel( historyView._sipAddressObserver.presenceStatus diff --git a/linphone-app/ui/views/App/Settings/SettingsUi.qml b/linphone-app/ui/views/App/Settings/SettingsUi.qml index 309d0aa00..e3204b480 100644 --- a/linphone-app/ui/views/App/Settings/SettingsUi.qml +++ b/linphone-app/ui/views/App/Settings/SettingsUi.qml @@ -224,24 +224,23 @@ TabContainer { } } FormLine { + maxItemWidth: parent.width FormGroup { //: 'Check for updates' : Label switch for enabling check for updates label: qsTr('checkForUpdateLabel') - maxWidth: 150 - width: 150 - Switch { - checked: SettingsModel.checkForUpdateEnabled - - onClicked: SettingsModel.checkForUpdateEnabled = !checked - } - } - FormGroup { - maxWidth: parent.width - 200 - width: parent.width - 200 - TextField { - text: SettingsModel.versionCheckUrl - - onEditingFinished: SettingsModel.versionCheckUrl = text + + RowLayout{ + Switch { + checked: SettingsModel.checkForUpdateEnabled + + onClicked: SettingsModel.checkForUpdateEnabled = !checked + } + TextField { + Layout.fillWidth: true + text: SettingsModel.versionCheckUrl + + onEditingFinished: SettingsModel.versionCheckUrl = text + } } } } diff --git a/linphone-app/ui/views/App/Styles/Main/Assistant/UseAppSipAccountStyle.qml b/linphone-app/ui/views/App/Styles/Main/Assistant/UseAppSipAccountStyle.qml index 37382b51f..5091e2e07 100644 --- a/linphone-app/ui/views/App/Styles/Main/Assistant/UseAppSipAccountStyle.qml +++ b/linphone-app/ui/views/App/Styles/Main/Assistant/UseAppSipAccountStyle.qml @@ -1,10 +1,23 @@ pragma Singleton import QtQml 2.2 +import ColorsList 1.0 +import Units 1.0 // ============================================================================= QtObject { - property QtObject checkBox: QtObject { - property int width: 300 - } + property string sectionName: 'UseAppSipAccount' + property QtObject checkBox: QtObject { + property int width: 300 + } + property QtObject warningBlock: QtObject { + property int spacing: 10 + property int pointSize: Units.dp * 10 + property color color: ColorsList.add(sectionName+'_description', 'g').color + + property QtObject contactUrl: QtObject { + property color color: ColorsList.add(sectionName+'_url', 'i').color + property int pointSize: Units.dp * 9 + } + } } diff --git a/linphone-app/ui/views/App/Styles/Main/Dialogs/AboutStyle.qml b/linphone-app/ui/views/App/Styles/Main/Dialogs/AboutStyle.qml index eff569be8..7d5172901 100644 --- a/linphone-app/ui/views/App/Styles/Main/Dialogs/AboutStyle.qml +++ b/linphone-app/ui/views/App/Styles/Main/Dialogs/AboutStyle.qml @@ -8,7 +8,7 @@ import Units 1.0 QtObject { property string sectionName: 'About' - property int height: 225 + property int height: 255 property int spacing: 20 property int width: 400 diff --git a/linphone-sdk b/linphone-sdk index e9ce4178e..b9c4a6d46 160000 --- a/linphone-sdk +++ b/linphone-sdk @@ -1 +1 @@ -Subproject commit e9ce4178eb91013d23f9aef6c080a8c9b2c978c9 +Subproject commit b9c4a6d464bcead4ad40aa652933d84c29a4194b