Mute option for each chatrooms.

This commit is contained in:
Julien Wadel 2023-02-27 16:52:08 +01:00
parent 32e7739d4d
commit ee526c262c
32 changed files with 506 additions and 72 deletions

View file

@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Colored Emojis with its own font family.
- OAuth2 connection to retrieve remote provisioning (Experimental and not usable without configuration).
- Add/View contact from a message.
- Mute option for each chatrooms.
## 5.0.11 - undefined

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="80"
height="80"
version="1.1"
id="svg4"
sodipodi:docname="Mute.svg"
inkscape:version="1.1 (c68e22c387, 2021-05-23)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview12"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="3.1144962"
inkscape:cx="-69.032031"
inkscape:cy="17.338277"
inkscape:window-width="1920"
inkscape:window-height="1043"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<g
id="notifs-inactif_alpha"
transform="matrix(2.5614426,0,0,2.5614426,21.508927,20)">
<g
id="Group"
transform="translate(0.9314515)">
<g
id="Group-21"
transform="translate(0.05947038)"
filter="url(#filter_1)">
<path
d="m 0.549145,11.7847 c 0.363134,0.3632 0.853445,0.5629 1.379995,0.5629 H 11.9344 c 0.5265,0 1.0168,-0.1997 1.38,-0.5629 0.3813,-0.3814 0.5811,-0.8898 0.5628,-1.4163 C 13.8591,9.8236 13.6411,9.33329 13.2416,8.97016 L 12.7877,8.57068 C 12.606,8.40728 12.5153,8.1712 12.5153,7.93507 V 5.71976 C 12.5153,4.35789 11.9888,2.97789 11.099,1.90652 10.0459,0.671954 8.6296,0 7.06786,0 7.0134,0 6.97704,0 6.94069,0.0181126 6.88623,0 6.83176,0 6.79541,0 5.2338,0 3.79936,0.671824 2.78243,1.8884 1.87451,2.9597 1.36608,4.33983 1.36608,5.70164 v 2.21531 c 0,0.23609 -0.10893,0.47208 -0.27232,0.6356 L 0.639801,8.95204 C 0.240318,9.31517 0.0224514,9.80548 0.00419584,10.3503 -0.0320299,10.8949 0.167718,11.4033 0.549107,11.7847 Z M 1.34801,9.76916 1.80197,9.36968 C 2.20145,9.00654 2.43757,8.47989 2.43757,7.93524 V 5.71992 c 0,-2.85091 2.26979,-4.6122 4.35799,-4.6122 0.05447,0 0.09082,0 0.12717,-0.01811 0.03636,0.01811 0.09082,0.01811 0.12717,0.01811 2.08814,0 4.358,1.76135 4.358,4.6122 v 2.21532 c 0,0.54478 0.2361,1.0713 0.6356,1.43444 l 0.454,0.39948 c 0.1816,0.16339 0.2723,0.38134 0.2723,0.61734 0,0.2361 -0.0908,0.454 -0.2542,0.6356 -0.1453,0.1453 -0.3632,0.236 -0.5993,0.236 H 1.92929 c -0.2361,0 -0.45396,-0.0908 -0.59923,-0.2542 -0.16339,-0.1634 -0.25421,-0.3995 -0.25421,-0.6356 0,-0.236 0.09082,-0.45386 0.27232,-0.59916 z"
id="Shape"
fill="#000000"
stroke="none" />
<path
d="m 8.28458,13.1648 c 0,0.7445 -0.61735,1.3618 -1.36188,1.3618 -0.74452,0 -1.36187,-0.6173 -1.36187,-1.3618 0,-0.3087 -0.23609,-0.5448 -0.54478,-0.5448 -0.30868,0 -0.54478,0.2361 -0.54478,0.5448 0,1.3437 1.10766,2.4514 2.45143,2.4514 1.34378,0 2.45144,-1.1077 2.45144,-2.4514 0,-0.3087 -0.2361,-0.5448 -0.54478,-0.5448 -0.30869,0 -0.54478,0.2361 -0.54478,0.5448 z"
id="Path"
fill="#000000"
fill-rule="evenodd"
stroke="none" />
</g>
<path
d="M 0,14.697 14,0.815972 Z"
id="camera_off"
fill="none"
fill-rule="evenodd"
stroke="#000000"
stroke-width="1.1"
stroke-linecap="round"
stroke-linejoin="round" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View file

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="80"
height="80"
version="1.1"
id="svg4"
sodipodi:docname="unmute.svg"
inkscape:version="1.1 (c68e22c387, 2021-05-23)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs6">
<sodipodi:namedview
id="namedview15"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="3.2539063"
inkscape:cx="-68.840336"
inkscape:cy="2.1512605"
inkscape:window-width="1920"
inkscape:window-height="1043"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<rect
width="15"
height="16"
id="artboard_1"
x="0"
y="0" />
<clipPath
id="clip_1">
<use
xlink:href="#artboard_1"
clip-rule="evenodd"
id="use3"
x="0"
y="0"
width="100%"
height="100%" />
</clipPath>
</defs>
<g
id="notifs-inactif_alpha"
clip-path="url(#clip_1)"
transform="matrix(2.5614426,0,0,2.5614426,19.961774,20)">
<g
id="Group"
transform="translate(0.9909363)">
<g
id="Group-21"
filter="url(#filter_1)">
<path
d="m 0.549145,11.7847 c 0.363134,0.3632 0.853445,0.5629 1.379995,0.5629 H 11.9344 c 0.5265,0 1.0168,-0.1997 1.38,-0.5629 0.3813,-0.3814 0.5811,-0.8898 0.5628,-1.4163 C 13.8591,9.8236 13.6411,9.33329 13.2416,8.97016 L 12.7877,8.57068 C 12.606,8.40728 12.5153,8.1712 12.5153,7.93507 V 5.71976 C 12.5153,4.35789 11.9888,2.97789 11.099,1.90652 10.0459,0.671954 8.6296,0 7.06786,0 7.0134,0 6.97704,0 6.94069,0.0181126 6.88623,0 6.83176,0 6.79541,0 5.2338,0 3.79936,0.671824 2.78243,1.8884 1.87451,2.9597 1.36608,4.33983 1.36608,5.70164 v 2.21531 c 0,0.23609 -0.10893,0.47208 -0.27232,0.6356 L 0.639801,8.95204 C 0.240318,9.31517 0.0224514,9.80548 0.00419584,10.3503 -0.0320299,10.8949 0.167718,11.4033 0.549107,11.7847 Z M 1.34801,9.76916 1.80197,9.36968 C 2.20145,9.00654 2.43757,8.47989 2.43757,7.93524 V 5.71992 c 0,-2.85091 2.26979,-4.6122 4.35799,-4.6122 0.05447,0 0.09082,0 0.12717,-0.01811 0.03636,0.01811 0.09082,0.01811 0.12717,0.01811 2.08814,0 4.358,1.76135 4.358,4.6122 v 2.21532 c 0,0.54478 0.2361,1.0713 0.6356,1.43444 l 0.454,0.39948 c 0.1816,0.16339 0.2723,0.38134 0.2723,0.61734 0,0.2361 -0.0908,0.454 -0.2542,0.6356 -0.1453,0.1453 -0.3632,0.236 -0.5993,0.236 H 1.92929 c -0.2361,0 -0.45396,-0.0908 -0.59923,-0.2542 -0.16339,-0.1634 -0.25421,-0.3995 -0.25421,-0.6356 0,-0.236 0.09082,-0.45386 0.27232,-0.59916 z"
id="Shape"
fill="#000000"
stroke="none" />
<path
d="m 8.28458,13.1648 c 0,0.7445 -0.61735,1.3618 -1.36188,1.3618 -0.74452,0 -1.36187,-0.6173 -1.36187,-1.3618 0,-0.3087 -0.23609,-0.5448 -0.54478,-0.5448 -0.30868,0 -0.54478,0.2361 -0.54478,0.5448 0,1.3437 1.10766,2.4514 2.45143,2.4514 1.34378,0 2.45144,-1.1077 2.45144,-2.4514 0,-0.3087 -0.2361,-0.5448 -0.54478,-0.5448 -0.30869,0 -0.54478,0.2361 -0.54478,0.5448 z"
id="Path"
fill="#000000"
stroke="none" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View file

@ -1103,6 +1103,16 @@ Server url ikke konfigureret.</translation>
<extracomment>&apos;Schedule a meeting&apos; : Item menu to schedule a meeting with the chat participants.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuDeactivate</source>
<extracomment>&apos;Disable notifications&apos; : Item menu to disable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuActivate</source>
<extracomment>&apos;Enable notifications&apos; : Item menu to enable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>

View file

@ -1103,6 +1103,16 @@ Server URL ist nicht konfiguriert.</translation>
<extracomment>&apos;Schedule a meeting&apos; : Item menu to schedule a meeting with the chat participants.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuDeactivate</source>
<extracomment>&apos;Disable notifications&apos; : Item menu to disable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuActivate</source>
<extracomment>&apos;Enable notifications&apos; : Item menu to enable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>

View file

@ -1103,6 +1103,16 @@ Server URL not configured.</translation>
<extracomment>&apos;Schedule a meeting&apos; : Item menu to schedule a meeting with the chat participants.</extracomment>
<translation>Schedule a meeting</translation>
</message>
<message>
<source>conversationMenuDeactivate</source>
<extracomment>&apos;Disable notifications&apos; : Item menu to disable chat&apos;s notifications</extracomment>
<translation>Disable notifications</translation>
</message>
<message>
<source>conversationMenuActivate</source>
<extracomment>&apos;Enable notifications&apos; : Item menu to enable chat&apos;s notifications</extracomment>
<translation>Enable notifications</translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>

View file

@ -1103,6 +1103,16 @@ URL del servidor no configurada.</translation>
<extracomment>&apos;Schedule a meeting&apos; : Item menu to schedule a meeting with the chat participants.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuDeactivate</source>
<extracomment>&apos;Disable notifications&apos; : Item menu to disable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuActivate</source>
<extracomment>&apos;Enable notifications&apos; : Item menu to enable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>

View file

@ -173,7 +173,7 @@
</message>
<message>
<source>usernameStatusInvalidCharacters</source>
<translation>Caractères invalides détectés (regex: `%1`).</translation>
<translation>Caractères invalides détectés (regex&#x202f;: `%1`).</translation>
</message>
<message>
<source>usernameStatusInvalid</source>
@ -189,7 +189,7 @@
</message>
<message>
<source>passwordStatusInvalidCharacters</source>
<translation>Caractères invalides détectés (regex: `%1`).</translation>
<translation>Caractères invalides détectés (regex&#x202f;: `%1`).</translation>
</message>
<message>
<source>passwordStatusMissingCharacters</source>
@ -1103,6 +1103,16 @@ URL du serveur non configurée.</translation>
<extracomment>&apos;Schedule a meeting&apos; : Item menu to schedule a meeting with the chat participants.</extracomment>
<translation>Planifier une réunion</translation>
</message>
<message>
<source>conversationMenuDeactivate</source>
<extracomment>&apos;Disable notifications&apos; : Item menu to disable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuActivate</source>
<extracomment>&apos;Enable notifications&apos; : Item menu to enable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -1259,7 +1269,7 @@ URL du serveur non configurée.</translation>
<message>
<source>ephemeralNotInConference!</source>
<extracomment>&apos;Ephemeral message is only supported in conference based chat room!&apos;</extracomment>
<translation>Les messages éphémères ne sont disponibles que pour une conversation définie en mode conférence!</translation>
<translation>Les messages éphémères ne sont disponibles que pour une conversation définie en mode conférence&#x202f;!</translation>
<extra-Context>Warning about not being in conference based chat room.</extra-Context>
</message>
<message>
@ -2066,7 +2076,7 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<message>
<source>newConferenceScheduleTitle</source>
<extracomment>&apos;Would you like to schedule your meeting?&apos; : Ask about setting the meeting as scheduled.</extracomment>
<translation>Voulez-vous programmer cette réunion?</translation>
<translation>Voulez-vous programmer cette réunion&#x202f;?</translation>
</message>
<message>
<source>newConferenceDate</source>
@ -2535,12 +2545,12 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<message>
<source>vfsDeactivation</source>
<extracomment>&apos;Are you sure to deactivate the encryption? The application will exit and all your data will be lost. You must delete them before using the application.&apos; : Explanation to deactivate the VFS encryption.</extracomment>
<translation>Êtes-vous certain de désactiver le chiffrement de l&apos;application ? Elle redémarrera et toutes vos données seront perdues. Vous devez les supprimer avant d&apos;utiliser l&apos;application.</translation>
<translation>Êtes-vous certain de désactiver le chiffrement de l&apos;application&#xa0;? Elle redémarrera et toutes vos données seront perdues. Vous devez les supprimer avant d&apos;utiliser l&apos;application.</translation>
</message>
<message>
<source>vfsActivation</source>
<extracomment>&apos;Are you sure to activate the encryption? You cannot revert without deleting ALL your data&apos; : Explanation to activate the VFS encryption.</extracomment>
<translation>Êtes-vous certain d&apos;activer le chiffrement ? Cette action est irréversible sans perdre TOUTES vos données.</translation>
<translation>Êtes-vous certain d&apos;activer le chiffrement&#xa0;? Cette action est irréversible sans perdre TOUTES vos données.</translation>
</message>
<message>
<source>cancel</source>
@ -2809,7 +2819,7 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
</message>
<message>
<source>serverTooltip</source>
<translation>Serveur LDAP. ie: ldap:// pour un serveur local ou ldap://ldap.example.org/</translation>
<translation>Serveur LDAP. ie&#x202f;: ldap:// pour un serveur local ou ldap://ldap.example.org/</translation>
</message>
<message>
<source>bindDNLabel</source>
@ -3755,7 +3765,7 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<message>
<source>deleteTimeline</source>
<extracomment>&apos;Are you sure you want to delete and leave this timeline?&apos;</extracomment>
<translation>Êtes-vous certain de vouloir tout effacer et de quitter cette conversation?</translation>
<translation>Êtes-vous certain de vouloir tout effacer et de quitter cette conversation&#x202f;?</translation>
</message>
<message>
<source>deleteTimelineTooltip</source>
@ -3877,15 +3887,15 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<name>VfsUtils</name>
<message>
<source>Delete key failed: %1</source>
<translation>Échec lors de la suppression de la clef : %1</translation>
<translation>Échec lors de la suppression de la clef&#xa0;: %1</translation>
</message>
<message>
<source>Read key failed: %1</source>
<translation>Échec lors de la lecture de la clef : %1</translation>
<translation>Échec lors de la lecture de la clef&#xa0;: %1</translation>
</message>
<message>
<source>Write key failed: %1</source>
<translation>Échec lors de l&apos;écriture de la clef : %1</translation>
<translation>Échec lors de l&apos;écriture de la clef&#xa0;: %1</translation>
</message>
</context>
<context>

View file

@ -1097,6 +1097,16 @@ A kiszolgáló URL-je nincs konfigurálva.</translation>
<extracomment>&apos;Schedule a meeting&apos; : Item menu to schedule a meeting with the chat participants.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuDeactivate</source>
<extracomment>&apos;Disable notifications&apos; : Item menu to disable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuActivate</source>
<extracomment>&apos;Enable notifications&apos; : Item menu to enable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>

View file

@ -1103,6 +1103,16 @@ URL del server non configurato.</translation>
<extracomment>&apos;Schedule a meeting&apos; : Item menu to schedule a meeting with the chat participants.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuDeactivate</source>
<extracomment>&apos;Disable notifications&apos; : Item menu to disable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuActivate</source>
<extracomment>&apos;Enable notifications&apos; : Item menu to enable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>

View file

@ -1097,6 +1097,16 @@
<extracomment>&apos;Schedule a meeting&apos; : Item menu to schedule a meeting with the chat participants.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuDeactivate</source>
<extracomment>&apos;Disable notifications&apos; : Item menu to disable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuActivate</source>
<extracomment>&apos;Enable notifications&apos; : Item menu to enable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>

View file

@ -1109,6 +1109,16 @@ Nesukonfigūruotas serverio url.</translation>
<extracomment>&apos;Schedule a meeting&apos; : Item menu to schedule a meeting with the chat participants.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuDeactivate</source>
<extracomment>&apos;Disable notifications&apos; : Item menu to disable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuActivate</source>
<extracomment>&apos;Enable notifications&apos; : Item menu to enable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>

View file

@ -1103,6 +1103,16 @@ URL do servidor não configurado.</translation>
<extracomment>&apos;Schedule a meeting&apos; : Item menu to schedule a meeting with the chat participants.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuDeactivate</source>
<extracomment>&apos;Disable notifications&apos; : Item menu to disable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuActivate</source>
<extracomment>&apos;Enable notifications&apos; : Item menu to enable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>

View file

@ -1109,6 +1109,16 @@
<extracomment>&apos;Schedule a meeting&apos; : Item menu to schedule a meeting with the chat participants.</extracomment>
<translation>Запланировать встречу</translation>
</message>
<message>
<source>conversationMenuDeactivate</source>
<extracomment>&apos;Disable notifications&apos; : Item menu to disable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuActivate</source>
<extracomment>&apos;Enable notifications&apos; : Item menu to enable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>

View file

@ -1103,6 +1103,16 @@ Serverwebbadressen är inte konfigurerad.</translation>
<extracomment>&apos;Schedule a meeting&apos; : Item menu to schedule a meeting with the chat participants.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuDeactivate</source>
<extracomment>&apos;Disable notifications&apos; : Item menu to disable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuActivate</source>
<extracomment>&apos;Enable notifications&apos; : Item menu to enable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>

View file

@ -1097,6 +1097,16 @@ Sunucu url&apos;si yapılandırılmadı.</translation>
<extracomment>&apos;Schedule a meeting&apos; : Item menu to schedule a meeting with the chat participants.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuDeactivate</source>
<extracomment>&apos;Disable notifications&apos; : Item menu to disable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuActivate</source>
<extracomment>&apos;Enable notifications&apos; : Item menu to enable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>

View file

@ -1109,6 +1109,16 @@
<extracomment>&apos;Schedule a meeting&apos; : Item menu to schedule a meeting with the chat participants.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuDeactivate</source>
<extracomment>&apos;Disable notifications&apos; : Item menu to disable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuActivate</source>
<extracomment>&apos;Enable notifications&apos; : Item menu to enable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>

View file

@ -1097,6 +1097,16 @@
<extracomment>&apos;Schedule a meeting&apos; : Item menu to schedule a meeting with the chat participants.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuDeactivate</source>
<extracomment>&apos;Disable notifications&apos; : Item menu to disable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuActivate</source>
<extracomment>&apos;Enable notifications&apos; : Item menu to enable chat&apos;s notifications</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>

View file

@ -0,0 +1,6 @@
nsis_banner should be in old format.
file nsis_banner.bmp => "PC bitmap, Windows 98/2000 and newer format" is not good.
convert nsis_banner.bmp BMP3:nsis_banner.bmp
file nsis_banner.bmp => "PC bitmap, Windows 3.x format" OK

View file

@ -121,6 +121,8 @@
<file>assets/images/move_to_bottom_custom.svg</file>
<file>assets/images/new_call_custom.svg</file>
<file>assets/images/new_chat_group_custom.svg</file>
<file>assets/images/notifications_off_custom.svg</file>
<file>assets/images/notifications_on_custom.svg</file>
<file>assets/images/options_custom.svg</file>
<file>assets/images/outgoing_call_custom.svg</file>
<file>assets/images/panel_arrow_custom.svg</file>

View file

@ -27,6 +27,7 @@
#include <QElapsedTimer>
#include <QFileInfo>
#include <QMimeDatabase>
#include <QSettings>
#include <QTimer>
#include <QUuid>
#include <QMessageBox>
@ -486,6 +487,14 @@ bool ChatRoomModel::isUpdating() const{
return getState() == LinphoneEnums::ChatRoomStateCreationPending || getState() == LinphoneEnums::ChatRoomStateTerminationPending;
}
bool ChatRoomModel::isNotificationsEnabled() const{
auto id = getChatRoomId();
QSettings settings;
settings.beginGroup("chatrooms");
settings.beginGroup(id);
return settings.value("notifications", true).toBool();
}
std::shared_ptr<linphone::ChatRoom> ChatRoomModel::getChatRoom(){
return mChatRoom;
}
@ -601,6 +610,16 @@ void ChatRoomModel::enableMarkAsRead(const bool& enable){
emit markAsReadEnabledChanged();
}
}
void ChatRoomModel::enableNotifications(const bool& enable){
if(enable != isNotificationsEnabled()){
auto id = getChatRoomId();
QSettings settings;
settings.beginGroup("chatrooms");
settings.beginGroup(id);
settings.setValue("notifications", enable);
notificationsEnabledChanged();
}
}
void ChatRoomModel::setReply(ChatMessageModel * model){
if(model != mReplyModel.get()){
@ -1166,6 +1185,20 @@ void ChatRoomModel::insertNotices (const QList<std::shared_ptr<linphone::EventLo
}
}
QString ChatRoomModel::getChatRoomId()const{
return getChatRoomId(getLocalAddress(), getPeerAddress());
}
QString ChatRoomModel::getChatRoomId(const QString& localAddress, const QString& remoteAddress){
return localAddress + "~"+remoteAddress;
}
QString ChatRoomModel::getChatRoomId(const std::shared_ptr<linphone::ChatRoom>& chatRoom){
auto localAddress = chatRoom->getLocalAddress()->clone();
localAddress->clean();
return getChatRoomId(Utils::coreStringToAppString(localAddress->asStringUriOnly()), (chatRoom->getPeerAddress() ? Utils::coreStringToAppString(chatRoom->getPeerAddress()->asStringUriOnly()) : ""));
}
// -----------------------------------------------------------------------------
/*
void ChatRoomModel::removeUnreadMessagesNotice() {

View file

@ -88,6 +88,7 @@ public:
Q_PROPERTY(bool ephemeralEnabled READ isEphemeralEnabled WRITE setEphemeralEnabled NOTIFY ephemeralEnabledChanged)
Q_PROPERTY(bool canBeEphemeral READ canBeEphemeral NOTIFY canBeEphemeralChanged)
Q_PROPERTY(bool markAsReadEnabled READ markAsReadEnabled WRITE enableMarkAsRead NOTIFY markAsReadEnabledChanged)
Q_PROPERTY(bool notificationsEnabled READ isNotificationsEnabled WRITE enableNotifications NOTIFY notificationsEnabledChanged)
Q_PROPERTY(ParticipantListModel* participants READ getParticipantListModel CONSTANT)
@ -139,6 +140,7 @@ public:
bool isEntriesLoading() const;
bool isBasic() const;
bool isUpdating() const;
bool isNotificationsEnabled() const;
ParticipantListModel* getParticipantListModel() const;
std::list<std::shared_ptr<linphone::Participant>> getParticipants(const bool& withMe = true) const;
@ -159,6 +161,7 @@ public:
void setEphemeralEnabled(bool enabled);
void setEphemeralLifetime(long lifetime);
void enableMarkAsRead(const bool& enable);
void enableNotifications(const bool& enable);
void setReply(ChatMessageModel * model);
ChatMessageModel * getReply()const;
@ -206,6 +209,10 @@ public:
void insertNotice (const std::shared_ptr<linphone::EventLog> &enventLog);
void insertNotices (const QList<std::shared_ptr<linphone::EventLog>> &eventLogs);
QString getChatRoomId()const;
static QString getChatRoomId(const QString& localAddress, const QString& remoteAddress);
static QString getChatRoomId(const std::shared_ptr<linphone::ChatRoom>& chatRoom); // For convenience
//-------------------- CHAT ROOM HANDLER
public slots:
@ -279,6 +286,7 @@ signals:
void chatRoomDeleted();// Must be connected with DirectConnection mode
void replyChanged();
void updatingChanged();
void notificationsEnabledChanged();
// Chat Room listener callbacks

View file

@ -20,6 +20,7 @@
#include <QMutex>
#include <QtDebug>
#include <QSettings>
#include <QThread>
#include <QTimer>
@ -223,7 +224,9 @@ void CoreHandlers::onMessagesReceived (
SettingsModel *settingsModel = coreManager->getSettingsModel();
const App *app = App::getInstance();
QStringList notNotifyReasons;
QSettings appSettings;
appSettings.beginGroup("chatrooms");
for(auto message : messages){
if( !message || message->isOutgoing() )
continue;
@ -235,7 +238,16 @@ void CoreHandlers::onMessagesReceived (
|| chatRoom->getCurrentParams()->getEncryptionBackend() != linphone::ChatRoomEncryptionBackend::None && !settingsModel->getSecureChatEnabled())
continue;
// 2. Notify with Notification popup.
// 2. Do not notify if the chatroom's notification has been deactivated.
appSettings.beginGroup(ChatRoomModel::getChatRoomId(chatRoom));
if(!appSettings.value("notifications", true).toBool()){
appSettings.endGroup();
continue;
}else{
appSettings.endGroup();
}
// 3. Notify with Notification popup.
if (coreManager->getSettingsModel()->getChatNotificationsEnabled()
&& (!app->hasFocus() || !Utils::isMe(chatRoom->getLocalAddress()))
&& !message->isRead())// On aggregation, the list can contains already displayed messages.

View file

@ -47,7 +47,10 @@ QtObject {
property QtObject scheduleMeeting: QtObject {
property string icon : 'meetings_custom'
}
property QtObject notifications: QtObject {
property string off : 'notifications_off_custom'
property string on : 'notifications_on_custom'
}
property QtObject contact: QtObject {
property string add : 'contact_add_custom'
property string view : 'contact_view_custom'

View file

@ -120,7 +120,7 @@ Item {
iconSizeMenu: MenuItemStyle.entry.iconSize
iconLayoutDirection: Qt.RightToLeft
menuItemStyle : MenuItemStyle.aux
visible: !chatMessageModel.isOutgoing
visible: container.chatMessageModel && !container.chatMessageModel.isOutgoing
onTriggered: container.isContact ? container.viewContactClicked(container.chatMessageModel.fromSipAddress) : container.addContactClicked(container.chatMessageModel.fromSipAddress)
}
MenuItem {

View file

@ -50,7 +50,6 @@ Rectangle {
anchors {
fill: parent
leftMargin: ContactStyle.leftMargin
rightMargin: ContactStyle.rightMargin
}
spacing: 0
@ -138,11 +137,9 @@ Rectangle {
ContactMessageCounter {
Layout.alignment: Qt.AlignTop
count: entry?Number(entry.unreadMessagesCount) + Number(entry.missedCallsCount):0
isComposing: Boolean(entry && entry.composers && entry.composers.length > 0)
visible: entry?(entry.unreadMessagesCount !== null || entry.missedCallsCount !== null) && item.displayUnreadMessageCount:false
Layout.preferredWidth: count > 0 && visible ? implicitWidth : 0
entry: item.entry
displayCounter: item.displayUnreadMessageCount
}
}
}

View file

@ -11,10 +11,13 @@ Item {
id: messageCounter
property alias count: counterIcon.count
property bool isComposing
property var entry
property bool isComposing: Boolean(entry && entry.composers && entry.composers.length > 0)
property bool displayCounter: true
implicitHeight: counterIcon.height + ContactMessageCounterStyle.verticalMargins * 2
implicitWidth: counterIcon.width + ContactMessageCounterStyle.horizontalMargins * 2
visible: count > 0 ?(entry.unreadMessagesCount !== null || entry.missedCallsCount !== null) && displayCounter:false
MessageCounter {
id: counterIcon
@ -27,6 +30,8 @@ Item {
? ('chat_is_composing_' + counterIcon.composingIndex)
: 'chat_count'
visible: messageCounter.count > 0 || messageCounter.isComposing
count: messageCounter.entry?Number(messageCounter.entry.unreadMessagesCount) + Number(messageCounter.entry.missedCallsCount):0
Timer {
interval: 500

View file

@ -6,5 +6,5 @@ import QtQml 2.2
QtObject {
property int horizontalMargins: 0
property int verticalMargins: 10
property int verticalMargins: 5
}

View file

@ -9,6 +9,15 @@ import ColorsList 1.0
QtObject {
property string sectionName: 'Timeline'
property var colorModel: ColorsList.add(sectionName+'_bg', 'q')
property QtObject status: QtObject{
property int iconSize : 30
}
property QtObject disabledNotifications: QtObject{
property string icon: 'notifications_off_custom'
property var colorModel: ColorsList.addImageColor(sectionName+'_disabledNotifications', icon, 'ad')
property var selectedColorModel: ColorsList.addImageColor(sectionName+'_disabledNotifications_c', icon, 'q')
}
property QtObject ephemeralTimer: QtObject{
property string icon: 'timer_custom'

View file

@ -14,7 +14,7 @@ import 'Timeline.js' as Logic
import 'qrc:/ui/scripts/Utils/utils.js' as Utils
// =============================================================================
Item {
Rectangle {
id: mainItem
property TimelineModel timelineModel
property bool optionsToggled: false
@ -46,61 +46,106 @@ Item {
]
enabled: !contactView.showBusyIndicator
Contact {
id: contactView
property bool isSelected: mainItem.timelineModel != undefined && mainItem.timelineModel.selected //view.currentIndex === index
height: mainItem.height
width: mainItem.width
color: isSelected
color: contactView.isSelected
? TimelineStyle.contact.backgroundColor.selected.color
: (
mainItem.modelIndex % 2 == 0
? TimelineStyle.contact.backgroundColor.a.color
: TimelineStyle.contact.backgroundColor.b.color
)
displayUnreadMessageCount: SettingsModel.standardChatEnabled || SettingsModel.secureChatEnabled
entry: mainItem.timelineModel && mainItem.timelineModel.chatRoomModel
property var subtitleSelectedColors: TimelineStyle.contact.subtitle.color.selected
property var subtitleNormalColors: TimelineStyle.contact.subtitle.color.normal
property var titleSelectedColors: TimelineStyle.contact.title.color.selected
property var titleNormalColors: TimelineStyle.contact.title.color.normal
subtitleColor: isSelected
? subtitleSelectedColors.color
: subtitleNormalColors.color
titleColor: isSelected
? titleSelectedColors.color
: titleNormalColors.color
showSubtitle: mainItem.timelineModel && (mainItem.timelineModel.chatRoomModel && (mainItem.timelineModel.chatRoomModel.isOneToOne || !mainItem.timelineModel.chatRoomModel.isConference))
showBusyIndicator: mainItem.timelineModel && mainItem.timelineModel.updating
TooltipArea {
id: contactTooltip
text: mainItem.timelineModel && UtilsCpp.toDateTimeString(mainItem.timelineModel.chatRoomModel.lastUpdateTime)
isClickable: true
RowLayout{
anchors.fill: parent
anchors.rightMargin: 5
spacing: 0
Contact {
id: contactView
property bool isSelected: mainItem.timelineModel != undefined && mainItem.timelineModel.selected //view.currentIndex === index
Layout.fillHeight: true
Layout.fillWidth: true
color: isSelected
? TimelineStyle.contact.backgroundColor.selected.color
: (
mainItem.modelIndex % 2 == 0
? TimelineStyle.contact.backgroundColor.a.color
: TimelineStyle.contact.backgroundColor.b.color
)
displayUnreadMessageCount: false
entry: mainItem.timelineModel && mainItem.timelineModel.chatRoomModel
property var subtitleSelectedColors: TimelineStyle.contact.subtitle.color.selected
property var subtitleNormalColors: TimelineStyle.contact.subtitle.color.normal
property var titleSelectedColors: TimelineStyle.contact.title.color.selected
property var titleNormalColors: TimelineStyle.contact.title.color.normal
subtitleColor: isSelected
? subtitleSelectedColors.color
: subtitleNormalColors.color
titleColor: isSelected
? titleSelectedColors.color
: titleNormalColors.color
showSubtitle: mainItem.timelineModel && (mainItem.timelineModel.chatRoomModel && (mainItem.timelineModel.chatRoomModel.isOneToOne || !mainItem.timelineModel.chatRoomModel.isConference))
showBusyIndicator: mainItem.timelineModel && mainItem.timelineModel.updating
TooltipArea {
id: contactTooltip
text: mainItem.timelineModel && UtilsCpp.toDateTimeString(mainItem.timelineModel.chatRoomModel.lastUpdateTime)
isClickable: true
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
propagateComposedEvents: true
preventStealing: false
onClicked: {
if(mouse.button == Qt.LeftButton){
mainItem.timelineModel.selected = true
}else{
mainItem.optionsToggled = !mainItem.optionsToggled
}
}
}
}
Icon{
icon: TimelineStyle.ephemeralTimer.icon
iconSize: TimelineStyle.ephemeralTimer.iconSize
overwriteColor: mainItem.timelineModel && mainItem.timelineModel.selected ? TimelineStyle.ephemeralTimer.selectedTimerColor.color : TimelineStyle.ephemeralTimer.timerColor.color
anchors.right:parent.right
anchors.bottom:parent.bottom
anchors.bottomMargin: 7
anchors.rightMargin: 7
visible: mainItem.timelineModel && mainItem.timelineModel.chatRoomModel.ephemeralEnabled
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
propagateComposedEvents: true
preventStealing: false
onClicked: {
if(mouse.button == Qt.LeftButton){
mainItem.timelineModel.selected = true
}else{
mainItem.optionsToggled = !mainItem.optionsToggled
ColumnLayout{
spacing: 0
Layout.maximumWidth: statusLayout.count > 0 || unreadMessageCounter.visible ? -1 : 0
Layout.fillHeight: true
RowLayout{
Layout.alignment: Qt.AlignTop | Qt.AlignRight
Layout.fillHeight: true
spacing: 0
ContactMessageCounter {
id: unreadMessageCounter
Layout.alignment: Qt.AlignTop
Layout.preferredWidth: implicitWidth
Layout.preferredHeight: implicitHeight
Layout.rightMargin: 9
displayCounter: SettingsModel.standardChatEnabled || SettingsModel.secureChatEnabled
entry: contactView.entry
}
}
RowLayout{
id: statusLayout
property int count : (ephemeralIcon.visible ? 1 : 0) + (notificationsIcon.visible ? 1 : 0)
spacing: 0
Layout.alignment: Qt.AlignBottom | Qt.AlignRight
Layout.preferredHeight: TimelineStyle.status.iconSize
Icon{
id: notificationsIcon
Layout.preferredHeight: TimelineStyle.status.iconSize
Layout.preferredWidth: TimelineStyle.status.iconSize
icon: TimelineStyle.disabledNotifications.icon
iconSize: TimelineStyle.status.iconSize
overwriteColor: mainItem.timelineModel && mainItem.timelineModel.selected ? TimelineStyle.disabledNotifications.selectedColorModel.color : TimelineStyle.disabledNotifications.colorModel.color
visible: mainItem.timelineModel && !mainItem.timelineModel.chatRoomModel.notificationsEnabled
}
Icon{
id: ephemeralIcon
Layout.preferredHeight: TimelineStyle.status.iconSize
Layout.preferredWidth: TimelineStyle.status.iconSize
icon: TimelineStyle.ephemeralTimer.icon
iconSize: TimelineStyle.status.iconSize
overwriteColor: mainItem.timelineModel && mainItem.timelineModel.selected ? TimelineStyle.ephemeralTimer.selectedTimerColor.color : TimelineStyle.ephemeralTimer.timerColor.color
visible: mainItem.timelineModel && mainItem.timelineModel.chatRoomModel.ephemeralEnabled
}
}
}

View file

@ -33,6 +33,7 @@ CodecsViewer 1.0 Codecs/CodecsViewer.qml
Avatar 1.0 Contact/Avatar.qml
Contact 1.0 Contact/Contact.qml
ContactDescription 1.0 Contact/ContactDescription.qml
ContactMessageCounter 1.0 Contact/ContactMessageCounter.qml
SipAddressDialog 1.0 Dialog/SipAddressDialog.qml
MultimediaParametersDialog 1.0 Dialog/MultimediaParametersDialog.qml

View file

@ -507,7 +507,28 @@ ColumnLayout {
height:visible ? 1 : 0
width:parent.width
color: ConversationStyle.menu.separatorColor.color
visible: deleteMenuItem.visible && (contactMenu.visible || groupInfoMenu.visible || devicesMenuItem.visible || ephemeralMenuItem.visible || scheduleMeetingMenuItem.visible)
visible: muteMenuItem.visible && (contactMenu.visible || groupInfoMenu.visible || devicesMenuItem.visible || ephemeralMenuItem.visible || scheduleMeetingMenuItem.visible)
}
MenuItem{
id: muteMenuItem
text: chatRoomModel.notificationsEnabled
//: 'Disable notifications' : Item menu to disable chat's notifications
? qsTr('conversationMenuDeactivate')
//: 'Enable notifications' : Item menu to enable chat's notifications
: qsTr('conversationMenuActivate')
iconMenu: chatRoomModel.notificationsEnabled ? MenuItemStyle.notifications.off : MenuItemStyle.notifications.on
iconSizeMenu: 40
menuItemStyle : MenuItemStyle.aux2
onTriggered: {
chatRoomModel.notificationsEnabled = !chatRoomModel.notificationsEnabled
}
}
Rectangle{
height:visible ? 1 : 0
width:parent.width
color: ConversationStyle.menu.separatorColor.color
visible: deleteMenuItem.visible && (contactMenu.visible || groupInfoMenu.visible || devicesMenuItem.visible || ephemeralMenuItem.visible || scheduleMeetingMenuItem.visible || muteMenuItem.visible)
}
MenuItem{
id: deleteMenuItem