Compare commits

...

27 Commits

Author SHA1 Message Date
f8d74fb170 snap: use core24 as base
In addition to migrating from core22 to core24 as the Jami snap's base,
this commits removes the install-pipewire-from-source.sh script, which
is no longer necessary, and adds the gpu-2404 interface, which will
hopefully reduce the likelihood of graphics hardware-related bugs in the
future (https://canonical.com/mir/docs/the-gpu-2404-snap-interface).

GitLab: #2095
Change-Id: I838553a8d3fc8e9731316458903901f7de617424
2025-09-17 09:59:21 -04:00
7a03b4d410 src/libclient/api/interaction.h: improve call duration format
Remove leading zeros. For example:
34m 05s → 34m 5s
15m 03s → 15m 3s

GitLab: #1979
Change-Id: I98922c3baa0ce35ce9d3ab8406a548328f8f0a0a
2025-09-16 18:59:19 -04:00
77a9b447f1 misc: bump daemon
Change-Id: Ic9c8c178e24e27bdc64b8f8009e8ee48472d89b3
2025-09-16 15:01:22 -04:00
98f868fb5e packaging: remove Debian 11
GitLab: #2082
Change-Id: I7e092df6269eb7abe0934d8a20e1a620e4d0fa8c
2025-09-16 14:30:53 -04:00
0ff0ee2bd8 packaging: add Debian 13
GitLab: #2082
Change-Id: I27157c6de6b029710248fe29ed5e0d6dac816f98
2025-09-16 14:30:53 -04:00
002af53f81 Metainfo: update screenshots
The screenshots seen on https://flathub.org/apps/net.jami.Jami are very
old. New screenshots are currently being made. For the time being,
screenshots should be updated to these somewhat newer ones for an
improved public appearance.

Screenshots can be previewed using the command:
gnome-software --show-metainfo extras/data/net.jami.Jami.metainfo.xml

Change-Id: Ieb03d13c7aee2bab624bdbeaac44868cd32f68dc
2025-09-16 14:11:54 -04:00
4289545f94 debian/control: remove obsolete dependency
GitLab: #2083
Change-Id: I5c67c4858896e8b36a12122c26ddf9c4a9f7ab21
2025-09-16 09:52:56 -04:00
bd3552a049 Metainfo.xml: update versions for new stable
Change-Id: I0c7e3c8a94c4c07de69ad25ec679f32c74b4b2e8
2025-09-12 14:30:24 -04:00
03bcd905e5 misc: bump daemon
Change-Id: I8afd7d7f2fde3b933906b95c2f06f104b0003459
2025-09-12 13:25:46 -04:00
9bfd149d45 Spelling: confrimLeaveGroup -> confirmLeaveGroup
Change-Id: I4451b9314cc40de5175da9257fcc9645ee481012
2025-09-12 11:28:35 -04:00
6c5ab1e483 JamiStrings: reword group and 1-to-1 leaving
Change-Id: I767f9f49f4e1ac46faef70804ff1bd71d0cb8acc
2025-09-11 16:44:51 -04:00
faba758254 conversation: add ended banner
Change-Id: I4e58f8da33a2776b6f2cdc15b4f8f11ad8f88482
2025-09-11 15:22:28 -04:00
d8f548261d conversation: add option remove one-to-one conversation
Change-Id: I44d2c69b99a5359f0fce0d6c134374c11efbd286
2025-09-11 15:22:28 -04:00
fe504827fa build: fix --debug option
The install.sh script's -d option and (therefore) the build.py script's
--debug option were broken by commit 22be4be864.

Change-Id: I165eb625735d93b5fb3a2a845387d29cc4f6c18a
2025-09-11 09:02:11 -04:00
ca02cf172a ImportFromDevicePage: allow confirm for all cases
Change-Id: Id4848a5d8f87a5d0321e7b13870bb717341db041
2025-09-10 12:18:51 -04:00
ba44b70f97 3rdparty: bump md4c
This reverts the change that was accidentally made in commit 22be4be864.

Change-Id: Id51fe4b8edafa57c1152872460a2f60ace222826
2025-09-09 09:53:54 -04:00
87e38c2bf5 misc: bump daemon
This fixes an issue where Jami was looking for ringtones in the wrong
directory and was therefore forced to fall back on the default one.

Change-Id: Iba64e839e75b7e6bf4210b6398dd5002dd4adf99
2025-09-08 17:01:56 -04:00
98a300d36f SettingMaterialButton: fix method name conflict
The call to click() in SettingMaterialButton used to send a custom
signal, but now that we are on Qt 6.8, it calls the underlying button's
click method, thus resulting in an infinite loop of clicks (which
eventually gets interrupted by the QML engine with a "Maximum call stack
exceeded" error).

GitLab: #2091
Change-Id: Id56c7f1b9d7cb302c7d3363d3b11dbd01cf938db
2025-09-08 12:58:59 -04:00
5ac31130d0 misc: bump daemon
Change-Id: I882b0e074ec7e1f780d112dcd9c1e543a9f67b40
2025-09-06 08:53:37 -04:00
9c11ec6233 update version name to "Atlas"
Change-Id: Ia399907ddc18a733ae5524a29a1067b0407dbb07
2025-09-06 08:51:49 -04:00
c9ab1a8e24 donations: schedule 2025 campaign
Set donation campaign from 15 September to 15 November

Change-Id: Ifee0ed347ab786fe0d20f1545bfb02563ac09541
2025-09-06 08:51:30 -04:00
76e1bd9eb1 resources: fix stale images
This patch skips disk caching for qrc images, so images
could be updated. Currently welcome background, welcome logo,
and plugin image resources are stored. Need to be investigated
as it should not be intended to store.

Change-Id: I800649278cdb38dc0a0c732d1d5ec0760a844137
2025-09-06 08:31:04 -04:00
ffb20d6767 update welcome images
Change-Id: I47c7045714787123395daaddb8708c8a8b47eb63
2025-09-05 15:48:21 -04:00
87e63724c3 packaging: fix Linux build
GitLab: #2090
Change-Id: I7621264bebb683ed06294d9bee0bf15bddf3f0cd
2025-09-04 16:41:52 -04:00
9fad769040 macOS: bump minimum version to 12
Set the minimum deployment target to macOS 12,
as required for Qt 6.8.

Change-Id: Idb3b551567c39889020663caa1e5735983e3d05e
2025-09-04 09:32:41 -04:00
4106b8c752 snap: fix runtime issues
This commit updates LD_LIBRARY_PATH and the gnome plug in snapcraft.yaml
in order to fix runtime issues that were introduced when switching from
core20 to core22 as the Jami snap's base. It also replaces the
deprecated project variable CRAFT_ARCH_TRIPLET by
CRAFT_ARCH_TRIPLET_BUILD_FOR as recommended in snap's documentation:
https://documentation.ubuntu.com/snapcraft/stable/reference/architectures/

GitLab: #2087
Change-Id: If14efb39979af3bddf5575dc7d0d9fd66c8d3ec2
2025-09-02 13:30:15 -04:00
fd6e733433 misc: bump daemon
Change-Id: I5cae20449c9e33c40870e72dd0d85b95464168d1
2025-09-02 12:58:19 -04:00
40 changed files with 362 additions and 493 deletions

2
3rdparty/md4c vendored

View File

@ -58,10 +58,8 @@ else()
set(DAEMON_DIR ${PROJECT_SOURCE_DIR}/daemon)
endif()
# For now only MSVC is supported for building Jami-core within the
# client cmake.
if(JAMICORE_AS_SUBDIR)
add_subdirectory(${DAEMON_DIR})
add_subdirectory(${DAEMON_DIR} EXCLUDE_FROM_ALL)
set(LIBJAMI_LIB jami-core)
endif()

View File

@ -29,7 +29,7 @@ sudo apt-get update && sudo apt-get install libqt-jami
#### Install libqt-jami, Debian based
To install libqt-jami on Debian, execute these commands replacing `debian_<VERSION>` by your distribution version. For example "debian_11"
To install libqt-jami on Debian, execute these commands replacing `debian_<VERSION>` by your distribution version. For example "debian_12"
```bash
sudo apt install gnupg dirmngr ca-certificates curl --no-install-recommends
@ -295,12 +295,12 @@ Once the build has finished, you should then be able to use the Visual Studio So
**Set up**
- macOS minimum version 11.0
- macOS minimum version 12.0
- install python3
- download xcode
- install Qt 6.6
- install Qt 6.8
Qt 6.6 can be installed via brew
Qt 6.8 can be installed via brew
```bash
brew install qt

2
daemon

Submodule daemon updated: 7e2e18ff7b...798c1fcf69

View File

@ -87,12 +87,27 @@
</developer>
<releases>
<release version="20250912.0" date="2025-09-12">
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250912</url>
</release>
<release version="20250815.1" date="2025-08-17">
<url type="detials">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#stable-20250817</url>
</release>
<release version="20250718.0" date="2025-07-18">
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250718</url>
</release>
<release version="20250613.0" date="2025-06-13">
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250613</url>
</release>
<release version="20250610.0" date="2025-06-10">
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250610</url>
</release>
<release version="20250523.0" date="2025-05-23">
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250523</url>
</release>
<release version="20250430.1" date="2025-04-30">
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250430</url>
</release>
</releases>
<branding>
@ -1295,232 +1310,82 @@
<!-- Officially GIF is not an allowed video format, but it appears to work nonetheless -->
<screenshots>
<screenshot type="default">
<image type="source" width="1310" height="650">https://dl.jami.net/media-resources/screenshots/jami_linux_audiovideo.png</image>
<caption>Send chat messages and talk with audio and video</caption>
<caption xml:lang="ab">Ачат адырраҭарақәа рышьҭра, аудиои авидеои рыла аицәажәара</caption>
<caption xml:lang="af">Stuur kletsboodskappe en praat met oudio en video</caption>
<caption xml:lang="am">የውይይት መልዕክቶችን ይላኩ እና በድምጽ እና በቪዲዮ ይናገሩ</caption>
<caption xml:lang="ar">إرسال رسائل الدردشة والتحدث بالصوت والفيديو</caption>
<caption xml:lang="az">Çat mesajları göndərin və audio və video ilə danışın</caption>
<caption xml:lang="be">Адпраўляйце паведамленні ў чаце і размаўляйце з аўдыё і відэа</caption>
<caption xml:lang="bg">Изпращайте чат съобщения и говорете с аудио и видео</caption>
<caption xml:lang="bn">চ্যাট বার্তা পাঠান এবং অডিও এবং ভিডিওর মাধ্যমে কথা বলুন</caption>
<caption xml:lang="ca">Envia missatges de xat i parla amb àudio i vídeo</caption>
<caption xml:lang="cs">Odesílejte chatové zprávy a mluvte se zvukem a videem</caption>
<caption xml:lang="da">Send chatbeskeder og tal med lyd og video</caption>
<caption xml:lang="de">Senden Sie Chatnachrichten und sprechen Sie mit Audio und Video</caption>
<caption xml:lang="el">Στείλτε μηνύματα συνομιλίας και μιλήστε με ήχο και βίντεο</caption>
<caption xml:lang="eo">Sendu babilajn mesaĝojn kaj parolu per audio kaj video</caption>
<caption xml:lang="es">Envía mensajes de chat y habla con audio y video.</caption>
<caption xml:lang="et">Saatke vestlussõnumeid ja rääkige heli ja videoga</caption>
<caption xml:lang="fa">پیام های چت بفرستید و با صدا و تصویر صحبت کنید</caption>
<caption xml:lang="fi">Lähetä chat-viestejä ja keskustele äänen ja videon avulla</caption>
<caption xml:lang="fil">Magpadala ng mga mensahe sa chat at makipag-usap gamit ang audio at video</caption>
<caption xml:lang="fr">Envoyez des messages de chat et discutez avec audio et vidéo</caption>
<caption xml:lang="gl">Envía mensaxes de chat e fala con audio e vídeo</caption>
<caption xml:lang="he">שלח הודעות צ'אט ודבר עם אודיו ווידאו</caption>
<caption xml:lang="hi">चैट संदेश भेजें और ऑडियो और वीडियो के साथ बात करें</caption>
<caption xml:lang="hr">Šaljite chat poruke i razgovarajte uz zvuk i video</caption>
<caption xml:lang="hu">Csevegőüzenetek küldése, valamint hang- és videobeszélgetés</caption>
<caption xml:lang="hy">Ուղարկեք զրույցի հաղորդագրություններ և խոսեք աուդիո և վիդեո</caption>
<caption xml:lang="id">Kirim pesan obrolan dan berbicara dengan audio dan video</caption>
<caption xml:lang="is">Sendu spjallskilaboð og talaðu með hljóði og myndböndum</caption>
<caption xml:lang="it">Invia messaggi di chat e parla con audio e video</caption>
<caption xml:lang="ja">チャットメッセージを送信し、音声とビデオで会話する</caption>
<caption xml:lang="ka">გაგზავნეთ ჩატის შეტყობინებები და ისაუბრეთ აუდიო და ვიდეოთი</caption>
<caption xml:lang="km">ផ្ញើសារជជែក និងនិយាយជាមួយអូឌីយ៉ូ និងវីដេអូ</caption>
<caption xml:lang="kn">ಚಾಟ್ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಿ ಮತ್ತು ಆಡಿಯೋ ಮತ್ತು ವೀಡಿಯೊದೊಂದಿಗೆ ಮಾತನಾಡಿ</caption>
<caption xml:lang="ko">채팅 메시지를 보내고 오디오와 비디오로 대화하세요</caption>
<caption xml:lang="ky">Чат билдирүүлөрүн жөнөтүңүз жана аудио жана видео менен сүйлөшүңүз</caption>
<caption xml:lang="la">Mitte chat nuntios et colloqui cum audio et video</caption>
<caption xml:lang="lo">ສົ່ງຂໍ້ຄວາມສົນທະນາ ແລະສົນທະນາດ້ວຍສຽງ ແລະວິດີໂອ</caption>
<caption xml:lang="lt">Siųskite pokalbių pranešimus ir kalbėkite naudodami garso ir vaizdo įrašus</caption>
<caption xml:lang="lv">Sūtiet tērzēšanas ziņas un runājiet ar audio un video</caption>
<caption xml:lang="mk">Испраќајте пораки за разговор и разговарајте со аудио и видео</caption>
<caption xml:lang="ml">ചാറ്റ് സന്ദേശങ്ങൾ അയച്ച് ഓഡിയോ, വീഡിയോ ഉപയോഗിച്ച് സംസാരിക്കുക</caption>
<caption xml:lang="mn">Чат мессеж илгээж, аудио болон видеотой ярилцаарай</caption>
<caption xml:lang="mr">चॅट संदेश पाठवा आणि ऑडिओ आणि व्हिडिओसह बोल</caption>
<caption xml:lang="ms">Hantar mesej sembang dan bercakap dengan audio dan video</caption>
<caption xml:lang="my">ချတ်မက်ဆေ့ခ်ျများပို့ပြီး အသံနှင့် ဗီဒီယိုဖြင့် စကားပြောပါ။</caption>
<caption xml:lang="ne">अडियो र भिडियो मार्फत च्याट सन्देशहरू पठाउनुहोस् र कुरा गर्नुहोस्</caption>
<caption xml:lang="nl">Verstuur chatberichten en praat met audio en video</caption>
<caption xml:lang="no">Send chat-meldinger og snakk med lyd og video</caption>
<caption xml:lang="pl">Wysyłaj wiadomości czatu i rozmawiaj z dźwiękiem i obrazem</caption>
<caption xml:lang="pt-BR">Envie mensagens de bate-papo e fale com áudio e vídeo</caption>
<caption xml:lang="pt-PT">Envie mensagens de chat e fale com áudio e vídeo</caption>
<caption xml:lang="ro">Trimiteți mesaje de chat și vorbiți cu audio și video</caption>
<caption xml:lang="ru">Отправляйте сообщения в чате и общайтесь с помощью аудио и видео</caption>
<caption xml:lang="si">කතාබස් පණිවිඩ යවන්න සහ ශ්‍රව්‍ය සහ දෘශ්‍ය සමඟ කතා කරන්න</caption>
<caption xml:lang="sk">Posielajte četové správy a rozprávajte sa so zvukom a videom</caption>
<caption xml:lang="sl">Pošiljajte sporočila v klepetu in se pogovarjajte z zvokom in videom</caption>
<caption xml:lang="sq">Dërgoni mesazhe bisede dhe bisedoni me audio dhe video</caption>
<caption xml:lang="sr">Шаљите поруке за ћаскање и разговарајте уз аудио и видео</caption>
<caption xml:lang="sv">Skicka chattmeddelanden och prata med ljud och video</caption>
<caption xml:lang="sw">Tuma ujumbe wa gumzo na zungumza na sauti na video</caption>
<caption xml:lang="ta">அரட்டை செய்திகளை அனுப்பவும், ஆடியோ மற்றும் வீடியோ மூலம் பேசவும்</caption>
<caption xml:lang="te">చాట్ సందేశాలను పంపండి మరియు ఆడియో మరియు వీడియోతో మాట్లాడండి</caption>
<caption xml:lang="th">ส่งข้อความแชทและพูดคุยด้วยเสียงและวิดีโอ</caption>
<caption xml:lang="tl">Magpadala ng mga mensahe sa chat at makipag-usap gamit ang audio at video</caption>
<caption xml:lang="tr">Sohbet mesajları gönderin ve sesli ve görüntülü konuşun</caption>
<caption xml:lang="uk">Надсилайте повідомлення чату та спілкуйтеся з аудіо та відео</caption>
<caption xml:lang="vi">Gửi tin nhắn trò chuyện và nói chuyện bằng âm thanh và video</caption>
<caption xml:lang="zh-CN">发送聊天消息并通过音频和视频进行交谈</caption>
<caption xml:lang="zh-HK">發送聊天訊息並透過音訊和視訊進行交談</caption>
<caption xml:lang="zh-TW">發送聊天訊息並透過音訊和視訊進行交談</caption>
<caption xml:lang="zu">Thumela imilayezo yengxoxo futhi ukhulume ngomsindo nevidiyo</caption>
<image>https://dl.jami.net/media-resources/screenshots/flathub/jami_linux_welcome.PNG</image>
<caption>Share, freely and privately</caption>
<caption xml:lang="ab">Ацеиҩшара, хақәиҭла, хала</caption>
<caption xml:lang="af">Deel, vrylik en privaat</caption>
<caption xml:lang="am">በነጻ እና በግል ያካፍሉ።</caption>
<caption xml:lang="ar">شارك بحرية وبشكل خاص</caption>
<caption xml:lang="az">Sərbəst və gizli şəkildə paylaşın</caption>
<caption xml:lang="be">Падзяліцеся свабодна і прыватна</caption>
<caption xml:lang="bg">Споделяйте, свободно и частно</caption>
<caption xml:lang="bn">শেয়ার করুন, অবাধে এবং গোপনে</caption>
<caption xml:lang="ca">Comparteix, lliurement i de forma privada</caption>
<caption xml:lang="cs">Sdílejte svobodně a soukromě</caption>
<caption xml:lang="da">Del, frit og privat</caption>
<caption xml:lang="de">Teilen, frei und privat</caption>
<caption xml:lang="el">Κοινοποιήστε, ελεύθερα και ιδιωτικά</caption>
<caption xml:lang="eo">Kunhavigu, libere kaj private</caption>
<caption xml:lang="es">Comparte, libre y privadamente</caption>
<caption xml:lang="et">Jaga, vabalt ja privaatselt</caption>
<caption xml:lang="fa">به اشتراک بگذارید، آزادانه و خصوصی</caption>
<caption xml:lang="fi">Jaa, vapaasti ja yksityisesti</caption>
<caption xml:lang="fil">Ibahagi, libre at pribado</caption>
<caption xml:lang="fr">Partagez, librement, gratuitement et en toute confidentialité</caption>
<caption xml:lang="gl">Comparte, de xeito libre e privado</caption>
<caption xml:lang="he">שתפו, באופן חופשי ופרטי</caption>
<caption xml:lang="hi">स्वतंत्र रूप से और निजी तौर पर साझा करें</caption>
<caption xml:lang="hr">Dijelite, slobodno i privatno</caption>
<caption xml:lang="hu">Megosztás, szabadon és bizalmasan</caption>
<caption xml:lang="hy">Տարածեք, ազատ և մասնավոր</caption>
<caption xml:lang="id">Berbagi, secara bebas dan pribadi</caption>
<caption xml:lang="is">Deildu, frjálslega og einslega</caption>
<caption xml:lang="it">Condividere, liberamente e privatamente</caption>
<caption xml:lang="ja">自由に、プライベートに共有</caption>
<caption xml:lang="ka">გააზიარეთ, თავისუფლად და პირადად</caption>
<caption xml:lang="km">ចែករំលែកដោយសេរី និងឯកជន</caption>
<caption xml:lang="kn">ಮುಕ್ತವಾಗಿ ಮತ್ತು ಖಾಸಗಿಯಾಗಿ ಹಂಚಿಕೊಳ್ಳಿ</caption>
<caption xml:lang="ko">자유롭고 비공개적으로 공유하세요</caption>
<caption xml:lang="ky">Бөлүшүү, эркин жана купуя</caption>
<caption xml:lang="la">Communicantes, libere et privatim</caption>
<caption xml:lang="lo">ແບ່ງ​ປັນ​, ຢ່າງ​ເສລີ​ແລະ​ເປັນ​ສ່ວນ​ຕົວ​</caption>
<caption xml:lang="lt">Dalintis, laisvai ir privačiai</caption>
<caption xml:lang="lv">Kopīgojiet, brīvi un privāti</caption>
<caption xml:lang="mk">Споделете, слободно и приватно</caption>
<caption xml:lang="ml">സ്വതന്ത്രമായും സ്വകാര്യമായും പങ്കിടുക</caption>
<caption xml:lang="mn">Чөлөөт, хувийн байдлаар хуваалцах</caption>
<caption xml:lang="mr">सामायिक करा, मुक्तपणे आणि खाजगीरित्य</caption>
<caption xml:lang="ms">Kongsi, secara bebas dan peribadi</caption>
<caption xml:lang="my">လွတ်လပ်စွာ သီးသန့်မျှဝေပါ။</caption>
<caption xml:lang="ne">स्वतन्त्र र गोप्य रूपमा सेयर गर्नुहोस्</caption>
<caption xml:lang="nl">Deel, vrij en privé</caption>
<caption xml:lang="no">Del, fritt og privat</caption>
<caption xml:lang="pl">Udostępniaj swobodnie i prywatnie</caption>
<caption xml:lang="pt-BR">Compartilhe, livre e privadamente</caption>
<caption xml:lang="pt-PT">Partilhe, livre e privadamente</caption>
<caption xml:lang="ro">Distribuie, în mod liber și privat</caption>
<caption xml:lang="ru">Делитесь, свободно и конфиденциально</caption>
<caption xml:lang="si">නිදහසේ සහ පෞද්ගලිකව බෙදා ගන්න</caption>
<caption xml:lang="sk">Zdieľajte, slobodne a súkromne</caption>
<caption xml:lang="sl">Delite brezplačno in zasebno</caption>
<caption xml:lang="sq">Shpërndaje, lirisht dhe privatisht</caption>
<caption xml:lang="sr">Делите, слободно и приватно</caption>
<caption xml:lang="sv">Dela, fritt och privat</caption>
<caption xml:lang="sw">Shiriki, kwa uhuru na kwa faragha</caption>
<caption xml:lang="ta">பகிரவும், சுதந்திரமாகவும் தனிப்பட்ட முறையிலும்</caption>
<caption xml:lang="te">ఉచితంగా మరియు ప్రైవేట్‌గా షేర్ చేయండి</caption>
<caption xml:lang="th">แบ่งปันได้อย่างอิสระและเป็นส่วนตัว</caption>
<caption xml:lang="tl">Ibahagi, libre at pribado</caption>
<caption xml:lang="tr">Özgürce ve özel olarak paylaşın</caption>
<caption xml:lang="uk">Поділіться вільно та приватно</caption>
<caption xml:lang="vi">Chia sẻ, tự do và riêng tư</caption>
<caption xml:lang="zh-CN">自由且私密地分享</caption>
<caption xml:lang="zh-HK">自由且私密地分享</caption>
<caption xml:lang="zh-TW">自由且私密地分享</caption>
<caption xml:lang="zu">Yabelana, ngokukhululekile nangasese</caption>
</screenshot>
<screenshot>
<image type="source" width="1016" height="659">https://dl.jami.net/media-resources/screenshots/jami_linux_screenshare.png</image>
<caption>Screen sharing</caption>
<caption xml:lang="ab">Аекран аимадара</caption>
<caption xml:lang="af">Skermdeling</caption>
<caption xml:lang="am">ማያ ገጽ ማጋራት።</caption>
<caption xml:lang="ar">مشاركة الشاشة</caption>
<caption xml:lang="az">Ekran paylaşımı</caption>
<caption xml:lang="be">Агульны доступ да экрана</caption>
<caption xml:lang="bg">Споделяне на екрана</caption>
<caption xml:lang="bn">স্ক্রিন শেয়ারিং</caption>
<caption xml:lang="ca">Compartició de pantalla</caption>
<caption xml:lang="cs">Sdílení obrazovky</caption>
<caption xml:lang="da">Skærmdeling</caption>
<caption xml:lang="de">Bildschirmfreigabe</caption>
<caption xml:lang="el">Κοινή χρήση οθόνης</caption>
<caption xml:lang="eo">Kundivido de ekrano</caption>
<caption xml:lang="es">Compartir pantalla</caption>
<caption xml:lang="et">Ekraani jagamine</caption>
<caption xml:lang="fa">اشتراک گذاری صفحه نمایش</caption>
<caption xml:lang="fi">Näytön jakaminen</caption>
<caption xml:lang="fil">Pagbabahagi ng screen</caption>
<caption xml:lang="fr">Partage d'écran</caption>
<caption xml:lang="gl">Compartir pantalla</caption>
<caption xml:lang="he">שיתוף מסך</caption>
<caption xml:lang="hi">स्क्रीन शेयरिंग</caption>
<caption xml:lang="hr">Dijeljenje zaslona</caption>
<caption xml:lang="hu">Képernyőmegosztás</caption>
<caption xml:lang="hy">Էկրանի փոխանակում</caption>
<caption xml:lang="id">Berbagi layar</caption>
<caption xml:lang="is">Skjádeiling</caption>
<caption xml:lang="it">Condivisione dello schermo</caption>
<caption xml:lang="ja">画面共有</caption>
<caption xml:lang="ka">ეკრანის გაზიარება</caption>
<caption xml:lang="km">ការចែករំលែកអេក្រង់</caption>
<caption xml:lang="kn">ಪರದೆ ಹಂಚಿಕೆ</caption>
<caption xml:lang="ko">화면 공유</caption>
<caption xml:lang="ky">Экранды бөлүшүү</caption>
<caption xml:lang="la">Screen sharing</caption>
<caption xml:lang="lo">ການແບ່ງປັນໜ້າຈໍ</caption>
<caption xml:lang="lt">Ekrano bendrinimas</caption>
<caption xml:lang="lv">Ekrāna koplietošana</caption>
<caption xml:lang="mk">Споделување екран</caption>
<caption xml:lang="ml">സ്ക്രീൻ പങ്കിടൽ</caption>
<caption xml:lang="mn">Дэлгэц хуваалцах</caption>
<caption xml:lang="mr">स्क्रीन शेअरिंग</caption>
<caption xml:lang="ms">Perkongsian skrin</caption>
<caption xml:lang="my">မျက်နှာပြင်မျှဝေခြင်း။</caption>
<caption xml:lang="ne">स्क्रिन सेयरिङ</caption>
<caption xml:lang="nl">Scherm delen</caption>
<caption xml:lang="no">Skjermdeling</caption>
<caption xml:lang="pl">Udostępnianie ekranu</caption>
<caption xml:lang="pt-BR">Compartilhamento de tela</caption>
<caption xml:lang="pt-PT">Partilha de tela</caption>
<caption xml:lang="ro">Partajarea ecranului</caption>
<caption xml:lang="ru">Совместное использование экрана</caption>
<caption xml:lang="si">තිර බෙදා ගැනීම</caption>
<caption xml:lang="sk">Zdieľanie obrazovky</caption>
<caption xml:lang="sl">Skupna raba zaslona</caption>
<caption xml:lang="sq">Ndarja e ekranit</caption>
<caption xml:lang="sr">Дељење екрана</caption>
<caption xml:lang="sv">Skärmdelning</caption>
<caption xml:lang="sw">Kushiriki skrini</caption>
<caption xml:lang="ta">திரைப் பகிர்வு</caption>
<caption xml:lang="te">స్క్రీన్ షేరింగ్</caption>
<caption xml:lang="th">การแชร์หน้าจอ</caption>
<caption xml:lang="tl">Pagbabahagi ng screen</caption>
<caption xml:lang="tr">Ekran paylaşımı</caption>
<caption xml:lang="uk">Спільне використання екрана</caption>
<caption xml:lang="vi">Chia sẻ màn hình</caption>
<caption xml:lang="zh-CN">屏幕共享</caption>
<caption xml:lang="zh-HK">螢幕分享</caption>
<caption xml:lang="zh-TW">螢幕分享</caption>
<caption xml:lang="zu">Ukwabelana kwesikrini</caption>
</screenshot>
<screenshot>
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/audio-call_web.webm</video>
<caption>Crystal clear audio</caption>
<caption xml:lang="ab">Ицқьоу аудио</caption>
<caption xml:lang="af">Kristalhelder klank</caption>
<caption xml:lang="am">ክሪስታል ግልጽ ኦዲዮ</caption>
<caption xml:lang="ar">صوت نقي للغاية</caption>
<caption xml:lang="az">Kristal təmiz səs</caption>
<caption xml:lang="be">Крышталёва чысты аўдыё</caption>
<caption xml:lang="bg">Кристално чист звук</caption>
<caption xml:lang="bn">স্ফটিক স্বচ্ছ অডিও</caption>
<caption xml:lang="ca">Àudio cristal·lí</caption>
<caption xml:lang="cs">Křišťálově čistý zvuk</caption>
<caption xml:lang="da">Krystalklar lyd</caption>
<caption xml:lang="de">Kristallklarer Klang</caption>
<caption xml:lang="el">Κρυστάλλινος ήχος</caption>
<caption xml:lang="eo">Kristalklara aŭdio</caption>
<caption xml:lang="es">Audio cristalina</caption>
<caption xml:lang="et">Kristallselge heli</caption>
<caption xml:lang="fa">صدای شفاف</caption>
<caption xml:lang="fi">Kristallinkirkas ääni</caption>
<caption xml:lang="fil">Malinaw na audio</caption>
<caption xml:lang="fr">Un son cristallin</caption>
<caption xml:lang="gl">Audio cristalino</caption>
<caption xml:lang="he">אודיו צלול</caption>
<caption xml:lang="hi">क्रिस्टल स्पष्ट ऑडियो</caption>
<caption xml:lang="hr">Kristalno čist zvuk</caption>
<caption xml:lang="hu">Kristálytiszta hang</caption>
<caption xml:lang="hy">Բյուրեղյա մաքուր աուդիո</caption>
<caption xml:lang="id">Audio sebening kristal</caption>
<caption xml:lang="is">Kristaltært hljóð</caption>
<caption xml:lang="it">Audio cristallino</caption>
<caption xml:lang="ja">非常にクリアな音声</caption>
<caption xml:lang="ka">კრისტალურად სუფთა აუდიო</caption>
<caption xml:lang="km">សំឡេងច្បាស់ល្អ</caption>
<caption xml:lang="kn">ಸ್ಫಟಿಕ ಸ್ಪಷ್ಟ ಆಡಿಯೋ</caption>
<caption xml:lang="ko">매우 선명한 오디오</caption>
<caption xml:lang="ky">Кристалл таза аудио</caption>
<caption xml:lang="la">Patet Crystal audio</caption>
<caption xml:lang="lo">ສຽງທີ່ຊັດເຈນ</caption>
<caption xml:lang="lt">Krištolo skaidrumo garsas</caption>
<caption xml:lang="lv">Kristāldzidra audio</caption>
<caption xml:lang="mk">Кристално чист звук</caption>
<caption xml:lang="ml">ക്രിസ്റ്റൽ ക്ലിയർ ഓഡിയോ</caption>
<caption xml:lang="mn">Кристал тунгалаг аудио</caption>
<caption xml:lang="mr">क्रिस्टल क्लियर ऑडिओ</caption>
<caption xml:lang="ms">Audio yang jernih</caption>
<caption xml:lang="my">ကြည်လင်ပြတ်သားသော အသံ</caption>
<caption xml:lang="ne">क्रिस्टल क्लियर अडियो</caption>
<caption xml:lang="nl">Kristalheldere audio</caption>
<caption xml:lang="no">Krystallklar lyd</caption>
<caption xml:lang="pl">Krystalicznie czysty dźwięk</caption>
<caption xml:lang="pt-BR">Áudio cristalino</caption>
<caption xml:lang="pt-PT">Áudio cristalino</caption>
<caption xml:lang="ro">Sunet clar de cristal</caption>
<caption xml:lang="ru">Кристально чистый звук</caption>
<caption xml:lang="si">ස්ඵටික පැහැදිලි ශ්‍රව්‍ය</caption>
<caption xml:lang="sk">Krištáľovo čistý zvuk</caption>
<caption xml:lang="sl">Kristalno čist zvok</caption>
<caption xml:lang="sq">Audio i pastër kristal</caption>
<caption xml:lang="sr">Кристално чист звук</caption>
<caption xml:lang="sv">Kristallklart ljud</caption>
<caption xml:lang="sw">Sauti safi kabisa</caption>
<caption xml:lang="ta">தெளிவான ஆடியோ</caption>
<caption xml:lang="te">క్రిస్టల్ క్లియర్ ఆడియో</caption>
<caption xml:lang="th">เสียงชัดใส</caption>
<caption xml:lang="tl">Malinaw na audio</caption>
<caption xml:lang="tr">Kristal netliğinde ses</caption>
<caption xml:lang="uk">Кришталево чистий звук</caption>
<caption xml:lang="vi">Âm thanh trong trẻo</caption>
<caption xml:lang="zh-CN">清晰的音频</caption>
<caption xml:lang="zh-HK">清晰的音訊</caption>
<caption xml:lang="zh-TW">清晰的音訊</caption>
<caption xml:lang="zu">Umsindo ocacile we-Crystal</caption>
</screenshot>
<screenshot>
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/conference_web.webm</video>
<image>https://dl.jami.net/media-resources/screenshots/flathub/jami_linux_swarm.PNG</image>
<caption>Group calls with an unlimited number of participants</caption>
<caption xml:lang="ab">Ԥынгыла змам алахәылацәа зцу агәыԥтәи аԥхьарақәа</caption>
<caption xml:lang="af">Groepoproepe met 'n onbeperkte aantal deelnemers</caption>
@ -1595,7 +1460,7 @@
<caption xml:lang="zu">Izingcingo zeqembu ezinenombolo engenamkhawulo yabahlanganyeli</caption>
</screenshot>
<screenshot>
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/chat_web.webm</video>
<image>https://dl.jami.net/media-resources/screenshots/flathub/jami_linux_chat_full.PNG</image>
<caption>Encrypted and secure text messaging without servers</caption>
<caption xml:lang="ab">Ишәарҭоу, насгьы ишәарҭам атексттә дырраҭарақәа асерверқәа рыда</caption>
<caption xml:lang="af">Geënkripteerde en veilige teksboodskappe sonder bedieners</caption>
@ -1669,81 +1534,6 @@
<caption xml:lang="zh-TW">無需伺服器的加密安全短信</caption>
<caption xml:lang="zu">Imiyalezo yombhalo ebethelwe futhi evikelekile ngaphandle kwamaseva</caption>
</screenshot>
<screenshot>
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/files-share_web.webm</video>
<caption>Transfer files of any size</caption>
<caption xml:lang="ab">Иарбанзаалак ашәагаа змоу афаилқәа аиагара</caption>
<caption xml:lang="af">Dra lêers van enige grootte oor</caption>
<caption xml:lang="am">ማንኛውንም መጠን ያላቸውን ፋይሎች ያስተላልፉ</caption>
<caption xml:lang="ar">نقل الملفات بأي حجم</caption>
<caption xml:lang="az">İstənilən ölçüdə faylları köçürün</caption>
<caption xml:lang="be">Перадача файлаў любога памеру</caption>
<caption xml:lang="bg">Прехвърляне на файлове с всякакъв размер</caption>
<caption xml:lang="bn">যেকোনো আকারের ফাইল স্থানান্তর করুন</caption>
<caption xml:lang="ca">Transfereix fitxers de qualsevol mida</caption>
<caption xml:lang="cs">Přenášejte soubory libovolné velikosti</caption>
<caption xml:lang="da">Overfør filer af enhver størrelse</caption>
<caption xml:lang="de">Übertragen Sie Dateien jeder Größe</caption>
<caption xml:lang="el">Μεταφορά αρχείων οποιουδήποτε μεγέθους</caption>
<caption xml:lang="eo">Transloki dosierojn de ajna grandeco</caption>
<caption xml:lang="es">Transfiere archivos de cualquier tamaño</caption>
<caption xml:lang="et">Edastage mis tahes suurusega faile</caption>
<caption xml:lang="fa">انتقال فایل در هر اندازه</caption>
<caption xml:lang="fi">Siirrä minkä tahansa kokoisia tiedostoja</caption>
<caption xml:lang="fil">Maglipat ng mga file sa anumang laki</caption>
<caption xml:lang="fr">Transférer des fichiers de toute taille</caption>
<caption xml:lang="gl">Transferir ficheiros de calquera tamaño</caption>
<caption xml:lang="he">העבר קבצים בכל גודל</caption>
<caption xml:lang="hi">किसी भी आकार की फ़ाइलें स्थानांतरित करें</caption>
<caption xml:lang="hr">Prijenos datoteka bilo koje veličine</caption>
<caption xml:lang="hu">Bármilyen méretű fájl küldése</caption>
<caption xml:lang="hy">Փոխանցել ցանկացած չափի ֆայլեր</caption>
<caption xml:lang="id">Transfer file dengan ukuran apa pun</caption>
<caption xml:lang="is">Flytja skrár af hvaða stærð sem er</caption>
<caption xml:lang="it">Trasferisci file di qualsiasi dimensione</caption>
<caption xml:lang="ja">あらゆるサイズのファイルを転送</caption>
<caption xml:lang="ka">ნებისმიერი ზომის ფაილების გადატანა</caption>
<caption xml:lang="km">ផ្ទេរឯកសារគ្រប់ទំហំ</caption>
<caption xml:lang="kn">ಯಾವುದೇ ಗಾತ್ರದ ಫೈಲ್‌ಗಳನ್ನು ವರ್ಗಾಯಿಸಿ</caption>
<caption xml:lang="ko">모든 크기의 파일 전송</caption>
<caption xml:lang="ky">Каалаган өлчөмдөгү файлдарды өткөрүңүз</caption>
<caption xml:lang="la">De translatione cuiuslibet magnitudinis files</caption>
<caption xml:lang="lo">ໂອນໄຟລ໌ທຸກຂະຫນາດ</caption>
<caption xml:lang="lt">Perkelkite bet kokio dydžio failus</caption>
<caption xml:lang="lv">Pārsūtiet jebkura izmēra failus</caption>
<caption xml:lang="mk">Пренесувајте датотеки од која било големина</caption>
<caption xml:lang="ml">ഏത് വലുപ്പത്തിലുള്ള ഫയലുകളും കൈമാറുക</caption>
<caption xml:lang="mn">Ямар ч хэмжээтэй файлуудыг шилжүүлэх</caption>
<caption xml:lang="mr">कोणत्याही आकाराच्या फायली हस्तांतरित करा</caption>
<caption xml:lang="ms">Pindahkan fail dari sebarang saiz</caption>
<caption xml:lang="my">မည်သည့်အရွယ်အစား ဖိုင်များကို လွှဲပြောင်းပါ။</caption>
<caption xml:lang="ne">कुनै पनि आकारका फाइलहरू स्थानान्तरण गर्नुहोस्</caption>
<caption xml:lang="nl">Bestanden van elke grootte overbrengen</caption>
<caption xml:lang="no">Overfør filer i alle størrelser</caption>
<caption xml:lang="pl">Przesyłaj pliki o dowolnym rozmiarze</caption>
<caption xml:lang="pt-BR">Transferir arquivos de qualquer tamanho</caption>
<caption xml:lang="pt-PT">Transferir ficheiros de qualquer tamanho</caption>
<caption xml:lang="ro">Transferați fișiere de orice dimensiune</caption>
<caption xml:lang="ru">Передача файлов любого размера</caption>
<caption xml:lang="si">ඕනෑම ප්‍රමාණයක ගොනු මාරු කරන්න</caption>
<caption xml:lang="sk">Prenášajte súbory akejkoľvek veľkosti</caption>
<caption xml:lang="sl">Prenesite datoteke poljubne velikosti</caption>
<caption xml:lang="sq">Transferoni skedarë të çdo madhësie</caption>
<caption xml:lang="sr">Пренесите датотеке било које величине</caption>
<caption xml:lang="sv">Överför filer av valfri storlek</caption>
<caption xml:lang="sw">Hamisha faili za ukubwa wowote</caption>
<caption xml:lang="ta">எந்த அளவிலான கோப்புகளையும் மாற்றவும்</caption>
<caption xml:lang="te">ఏ పరిమాణంలోనైనా ఫైళ్లను బదిలీ చేయండి</caption>
<caption xml:lang="th">ถ่ายโอนไฟล์ได้ทุกขนาด</caption>
<caption xml:lang="tl">Maglipat ng mga file sa anumang laki</caption>
<caption xml:lang="tr">Herhangi bir boyuttaki dosyaları aktarın</caption>
<caption xml:lang="uk">Передача файлів будь-якого розміру</caption>
<caption xml:lang="vi">Chuyển các tập tin có bất kỳ kích thước nào</caption>
<caption xml:lang="zh-CN">传输任意大小的文件</caption>
<caption xml:lang="zh-HK">傳輸任意大小的文件</caption>
<caption xml:lang="zh-TW">傳輸任意大小的文件</caption>
<caption xml:lang="zu">Dlulisa amafayela anoma yimuphi usayizi</caption>
</screenshot>
</screenshots>
<launchable type="desktop-id">net.jami.Jami.desktop</launchable>

View File

@ -160,8 +160,8 @@ endif
# Traditionally built packages (in Docker containers).
#
DISTRIBUTIONS := \
debian_11 \
debian_12 \
debian_13 \
debian_testing \
debian_unstable \
ubuntu_22.04 \

View File

@ -1,19 +1,15 @@
FROM debian:bullseye
FROM debian:trixie
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get clean
RUN apt-get update && \
RUN apt-get update --allow-releaseinfo-change && \
apt-get install -y -o Acquire::Retries=10 \
devscripts \
equivs \
python-is-python3 \
wget \
curl
# nodejs
RUN curl -sL https://deb.nodesource.com/setup_20.x | bash -
RUN apt install nodejs -y
nasm
ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
@ -23,16 +19,8 @@ RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
# Install CMake 3.21 for Qt 6
ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
RUN /opt/install-cmake.sh
RUN apt-get remove -y libre2-dev libre2-11
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
# Setting this variable so that FFmpeg gets built without pipewiregrab
# (see daemon/contrib/bootstrap and daemon/contrib/src/ffmpeg/rules.mak)
# We rely on PipeWire for screen sharing on Wayland, but the version available on Debian 11 is too old.
ENV DISABLE_PIPEWIRE=true
CMD ["/opt/build-package-debian.sh"]

View File

@ -2,7 +2,7 @@
# https://snapcraft.io/docs/build-on-docker
# https://github.com/canonical/snapcraft/issues/5079#issuecomment-2414199613
ARG UBUNTU=jammy
ARG UBUNTU=noble
FROM ubuntu:$UBUNTU AS builder
ARG UBUNTU
@ -16,11 +16,6 @@ RUN apt-get install --yes \
jq \
squashfs-tools
# Download and unpack the core22 snap
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core22' | jq '.download_url' -r) --output core22.snap
RUN mkdir -p /snap/core22
RUN unsquashfs -d /snap/core22/current core22.snap
# Download and unpack the core24 snap
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core24' | jq '.download_url' -r) --output core24.snap
RUN mkdir -p /snap/core24
@ -43,7 +38,6 @@ RUN chmod +x /snap/bin/snapcraft
# time so they can be cached.
FROM ubuntu:$UBUNTU
COPY --from=builder /snap/core22 /snap/core22
COPY --from=builder /snap/core24 /snap/core24
COPY --from=builder /snap/snapcraft /snap/snapcraft
COPY --from=builder /snap/bin/snapcraft /snap/bin/snapcraft

View File

@ -45,8 +45,7 @@ Build-Depends: debhelper (>= 9),
libvdpau-dev,
libssl-dev,
libargon2-dev | libargon2-0-dev,
# TODO: remove libpipewire-0.2-dev once we stop supporting Ubuntu 20.04
libpipewire-0.3-dev | libpipewire-0.2-dev,
libpipewire-0.3-dev,
# other
nasm,
yasm,

View File

@ -91,10 +91,10 @@ if [ -f /etc/os-release ]; then
. /etc/os-release
# Set-up Jami repository end tag
if [ "${VERSION_CODENAME}" = "bullseye" ] || [ "${ID}_${VERSION_ID}" = "debian_11" ]; then
ENDTAG="debian_11"
elif [ "${VERSION_CODENAME}" = "bookworm" ] || [ "${ID}_${VERSION_ID}" = "debian_12" ]; then
if [ "${VERSION_CODENAME}" = "bookworm" ] || [ "${ID}_${VERSION_ID}" = "debian_12" ]; then
ENDTAG="debian_12"
elif [ "${VERSION_CODENAME}" = "trixie" ] || [ "${ID}_${VERSION_ID}" = "debian_13" ]; then
ENDTAG="debian_13"
elif [ "${UBUNTU_CODENAME}" = "jammy" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_22.04" ]; then
ENDTAG="ubuntu_22.04"
elif [ "${UBUNTU_CODENAME}" = "noble" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_24.04" ]; then

View File

@ -95,6 +95,7 @@ override_dh_auto_build:
-DCMAKE_INSTALL_PREFIX=/usr \
-DLIBJAMI_BUILD_DIR=$(CURDIR)/daemon/src \
-DENABLE_LIBWRAP=true \
-DBUILD_TESTING=Off \
$(CMAKE_OPTIONS) ..
make -C build -j$(NO_CPUS) VERBOSE=1

View File

@ -75,6 +75,7 @@ cd %{_builddir}/jami-%{version} && \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_VERSION=${BUILD_VERSION} \
-DCMAKE_PREFIX_PATH=%{QT_JAMI_PREFIX} \
-DBUILD_TESTING=Off \
..
make -C %{_builddir}/jami-%{version}/build %{_smp_mflags} VERBOSE=1

View File

@ -98,13 +98,13 @@ description: |
confinement: strict
grade: stable
base: core22
base: core24
plugs:
gnome-3-38-2004:
gnome-46-2404:
interface: content
target: $SNAP/gnome-platform
default-provider: gnome-3-38-2004:gnome-3-38-2004
default-provider: gnome-46-2404
gtk-3-themes:
interface: content
target: $SNAP/data-dir/themes
@ -117,6 +117,10 @@ plugs:
interface: content
target: $SNAP/data-dir/sounds
default-provider: gtk-common-themes:sounds-themes
gpu-2404:
interface: content
target: $SNAP/gpu-2404
default-provider: mesa-2404
slots:
dbus-jami:
@ -129,22 +133,24 @@ slots:
name: cx.ring.Ring
layout:
/usr/lib/$CRAFT_ARCH_TRIPLET/alsa-lib:
bind: $SNAP/usr/lib/$CRAFT_ARCH_TRIPLET/alsa-lib
/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/alsa-lib:
bind: $SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/alsa-lib
/usr/share/alsa:
bind: $SNAP/usr/share/alsa
/usr/share/X11/xkb:
bind: $SNAP/usr/share/X11/xkb
/usr/share/X11/XErrorDB:
symlink: $SNAP/gpu-2404/X11/XErrorDB
environment:
XDG_CURRENT_DESKTOP: Unity
QT_BASE_DIR: "/usr/lib/libqt-jami"
LD_LIBRARY_PATH: "${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$SNAP$QT_BASE_DIR/lib"
LD_LIBRARY_PATH: "${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$SNAP$QT_BASE_DIR/lib:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/pulseaudio:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libproxy"
apps:
jami:
command: usr/bin/jami
command-chain:
- bin/gpu-2404-wrapper
- bin/desktop-launch
- snap/command-chain/alsa-launch
- bin/jami-wrapper
@ -153,8 +159,8 @@ apps:
desktop: usr/share/applications/net.jami.Jami.desktop
environment:
PIPEWIRE_CONFIG_NAME: "$SNAP/usr/share/pipewire/pipewire.conf"
PIPEWIRE_MODULE_DIR: "$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET/pipewire-0.3"
SPA_PLUGIN_DIR: "$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET/spa-0.2"
PIPEWIRE_MODULE_DIR: "$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/pipewire-0.3"
SPA_PLUGIN_DIR: "$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/spa-0.2"
slots:
- dbus-jami
- dbus-ring
@ -185,7 +191,7 @@ package-repositories:
components: [main]
suites: [jami]
key-id: A295D773307D25A33AE72F2F64CD5FA175348F84
url: https://dl.jami.net/internal/ubuntu_22.04/
url: https://dl.jami.net/internal/ubuntu_24.04/
parts:
desktop-launch:
@ -244,10 +250,15 @@ parts:
- -usr/lib/x86_64-linux-gnu/libproxy.so*
- -usr/share/doc/libp11-kit0/changelog.Debian.gz
- -usr/share/doc/libproxy1v5/changelog.Debian.gz
- -usr/lib/x86_64-linux-gnu/gio/modules/libdconfsettings.so
- -usr/lib/x86_64-linux-gnu/libdconf.so.1.0.0
- -usr/libexec/dconf-service
- -usr/share/doc/libdconf1/changelog.Debian.gz
- -usr/share/man/man1/dconf-service.1.gz
build-packages:
- libasound2-dev
stage-packages:
- libasound2
- libasound2t64
- libasound2-plugins
- yad
@ -272,8 +283,6 @@ parts:
sed -i -E 's|(tmpName) << (PACKAGE_NAME << "_shm_")|\1 << "snap.jami." << \2|' ./daemon/src/media/video/sinkclient.cpp
sed -i -E 's|^Icon=.*|Icon=${SNAP}/usr/share/icons/hicolor/scalable/apps/net.jami.Jami.svg|' extras/data/net.jami.Jami.desktop
override-build: |
$CRAFT_PART_BUILD/extras/packaging/gnu-linux/scripts/install-pipewire-from-source.sh
cd $CRAFT_PART_BUILD/daemon/contrib
mkdir -p native
cd native
@ -288,19 +297,19 @@ parts:
DESTDIR=$CRAFT_PART_INSTALL make install
cd $CRAFT_PART_BUILD/
mkdir build
mkdir -p build
cd build
cmake .. -DENABLE_LIBWRAP=true \
-DLIBJAMI_BUILD_DIR=$CRAFT_PART_BUILD/daemon/src \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH=$QT_BASE_DIR \
-DBUILD_VERSION=BUILD_VERSION_PLACEHOLDER
-DBUILD_VERSION=BUILD_VERSION_PLACEHOLDER \
-DBUILD_TESTING=Off
make -j$CRAFT_PARALLEL_BUILD_COUNT
DESTDIR=$CRAFT_PART_INSTALL make install
build-packages:
- autoconf
- autoconf-archive
- automake
- autopoint
- bzip2
@ -311,8 +320,8 @@ parts:
- gettext
- gzip
- libnotify-dev
- libpipewire-0.3-dev
- libqrencode-dev
- libsndfile1-dev
- libspeex-dev
- python3
- python3-dev
@ -320,13 +329,9 @@ parts:
- yasm
- wget
- nasm # ffmpeg
- libavcodec-dev
- libavdevice-dev
- libavformat-dev
- libswscale-dev
- libva-dev
- libvdpau-dev
- libargon2-0-dev # opendht
- libargon2-dev # opendht
- libexpat1-dev
- libjsoncpp-dev
- libnm-dev # connectivityChanged()
@ -339,55 +344,45 @@ parts:
- libgl-dev
- libvulkan-dev
- libgnutls28-dev # TLS
- gnutls-bin
- libssl-dev
- git # PipeWire build dependencies
- meson #
- libasound2-dev #
- libdbus-1-dev # These packages are needed by the
- libglib2.0-dev # install-pipewire-from-source.sh
- ninja-build # script in order to build PipeWire
- pkg-config # from source.
stage-packages:
- libgnutls30
- libavutil56
- libdouble-conversion3
- libegl1
- libgbm1
- libgudev-1.0-0
- libjsoncpp25
- libllvm12
- libminizip1
- libminizip1t64
- libnm0
- libnotify4
- libnspr4
- libnss3
- libopengl0
- libopus0
- liborc-0.4-0
- libpcre2-16-0
- libpcre2-8-0
- pipewire-bin
- libqrencode4
- libqt-jami
- libsnappy1v5
- libspeex1
- libproxy1v5
- libwayland-server0
- libwebpdemux2
- libwebpmux3
- libxkbfile1
- libxtst6
- ocl-icd-libopencl1
- libva-drm2
- libva-glx2
- libva-wayland2
- libva2
- libvdpau-va-gl1
- libvdpau1
- va-driver-all
prime:
- -usr/lib/libqt-jami/bin/
- -usr/lib/libqt-jami/docs/
- -usr/lib/libqt-jami/examples/
- -usr/lib/$CRAFT_ARCH_TRIPLET/libLLVM-*.so*
- -usr/lib/$CRAFT_ARCH_TRIPLET/libclang-*.so*
- -usr/lib/$CRAFT_ARCH_TRIPLET/libflite*.so*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libLLVM-*.so*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libclang-*.so*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libflite*.so*
gpu-2404:
after: [jami]
source: https://github.com/canonical/gpu-snap.git
plugin: dump
override-prime: |
craftctl default
${CRAFT_PART_SRC}/bin/gpu-2404-cleanup mesa-2404
# Workaround for https://bugs.launchpad.net/snapd/+bug/2055273
mkdir -p "${CRAFT_PRIME}/gpu-2404"
prime:
- bin/gpu-2404-wrapper

View File

@ -32,7 +32,7 @@ sed -i "s/RELEASE_VERSION/${RELEASE_VERSION}/g" snapcraft.yaml
# set the build version of the app
sed -i "s/BUILD_VERSION_PLACEHOLDER/${BUILD_VERSION}/g" snapcraft.yaml
snapcraft # requires snapcraft >= 4.8
snapcraft pack
# move the built snap to output
mv *.snap /opt/output/

View File

@ -1,30 +0,0 @@
#!/usr/bin/env bash
# The purpose of this script is to build PipeWire from source in a snap based on core22 / Ubuntu 22.04
# It must be called in the "override-build" section of the relevant part in snapcraft.yaml
set -e
OLD_WD=$(pwd)
cd /tmp
# Build PipeWire 1.0.5 and install it in the /usr directory of the build environment
wget -q https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/1.0.5/pipewire-1.0.5.tar.gz
echo "c5a5de26d684a1a84060ad7b6131654fb2835e03fccad85059be92f8e3ffe993 pipewire-1.0.5.tar.gz" | sha256sum --check
tar xzf pipewire-1.0.5.tar.gz
cd pipewire-1.0.5
meson setup builddir -Dsession-managers=media-session -Dalsa=disabled -Dprefix=/usr
meson compile -C builddir
meson install -C builddir
# The files installed by the previous command are only for the "Build" step of the snap
# creation process (https://snapcraft.io/docs/how-snapcraft-builds). In order to ensure
# that PipeWire is installed in the final snap archive, we also need to copy all the
# required files under the $SNAPCRAFT_PART_INSTALL directory.
meson configure builddir -Dprefix=$SNAPCRAFT_PART_INSTALL/usr/
meson install -C builddir
# Cleanup
cd /tmp
rm -rf pipewire-1.0.5 pipewire-1.0.5.tar.gz
cd $OLD_WD

View File

@ -34,7 +34,7 @@ cat << EOFILE > ${REPO_FOLDER}/${SPARKLE_FILE}
<pubDate>$DATE_RFC2822</pubDate>
<sparkle:version>${BUILD}</sparkle:version>
<sparkle:shortVersionString>${VERSION}</sparkle:shortVersionString>
<sparkle:minimumSystemVersion>11.0</sparkle:minimumSystemVersion>
<sparkle:minimumSystemVersion>12.0</sparkle:minimumSystemVersion>
<enclosure url="${REPO_URL}/$(basename ${PACKAGE})" type="application/octet-stream" $(./sign_update ${PACKAGE}) />
</item>
$(echo -e "${ITEMS}")

View File

@ -129,6 +129,11 @@ else
BUILD_DIR="build"
fi
BUILD_TYPE="Release"
if [ "${debug}" = "true" ]; then
BUILD_TYPE="Debug"
fi
if [[ "$OSTYPE" == "darwin"* ]]; then
#detect arch for macos
CMAKE_OSX_ARCHITECTURES="arm64"

View File

@ -17,7 +17,7 @@
<key>CFBundleShortVersionString</key>
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
<key>LSMinimumSystemVersion</key>
<string>11.0</string>
<string>12.0</string>
<key>CFBundleVersion</key>
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
<key>LSApplicationCategoryType</key>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 522 KiB

After

Width:  |  Height:  |  Size: 298 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 528 KiB

After

Width:  |  Height:  |  Size: 410 KiB

View File

@ -84,9 +84,9 @@ extern const QString defaultDownloadPath;
// Additional key-value pairs for non-APPSTORE builds including donation
// related settings.
#define KEYS COMMON_KEYS \
X(Donation2023VisibleDate, "2023-11-27 05:00") \
X(Donation2025StartDate, "2025-09-15 00:00") \
X(IsDonationVisible, true) \
X(Donation2023EndDate2, "2024-04-01 00:00")
X(Donation2025EndDate, "2025-11-16 00:00")
#endif
/*

View File

@ -84,6 +84,12 @@ Item {
}
function updateImageSource(downloadUrl, localPath, defaultImage) {
// TODO: this is a temporary fix to load bundled resources directly from qrc
// we need to investigate why we use a cached image for bundled resources
if (downloadUrl.startsWith("qrc:")) {
image.source = downloadUrl;
return;
}
if (downloadUrl === "") {
image.source = defaultImage;
return;

View File

@ -45,6 +45,7 @@ Rectangle {
color: JamiTheme.chatviewBgColor
property var mapPositions: PositionManager.mapStatus
property bool isConversationEndedFlag: false
// The purpose of this alias is to make the message bar
// accessible to the EmojiPicker
@ -85,6 +86,32 @@ Rectangle {
}
}
function isConversationEnded() {
if (!CurrentConversation.isSwarm)
return false;
var myRole = UtilsAdapter.getParticipantRole(CurrentAccount.id, CurrentConversation.id, CurrentAccount.uri);
var info = ConversationsAdapter.getConvInfoMap(CurrentConversation.id);
var peers = info && info.uris ? info.uris : [];
peers = peers.filter(function(u) { return u !== CurrentAccount.uri; });
for (var i = 0; i < peers.length; i++) {
var role = UtilsAdapter.getParticipantRole(CurrentAccount.id, CurrentConversation.id, peers[i]);
if (!(role === Member.Role.LEFT || role === Member.Role.BANNED)) {
return false;
}
}
if (CurrentConversation.isCoreDialog) {
return true
}
return myRole !== Member.Role.ADMIN;
}
function updateConversationEndedFlag() {
var newVal = isConversationEnded();
if (isConversationEndedFlag !== newVal) {
isConversationEndedFlag = newVal;
}
}
// Used externally to switch to a extras panel.
function switchToPanel(panel, toggle = true) {
extrasPanel.switchToPanel(panel, toggle);
@ -102,16 +129,33 @@ Rectangle {
}
}
Connections {
target: LRCInstance
function onConversationUpdated(convId, accountId) {
if (convId === CurrentConversation.id) {
updateConversationEndedFlag();
}
}
}
Connections {
target: CurrentConversation.members
function onCountChanged() {
updateConversationEndedFlag();
}
}
Connections {
target: CurrentConversation
function onIdChanged() {
MessagesAdapter.loadMoreMessages();
updateConversationEndedFlag();
}
}
onVisibleChanged: {
if (visible) {
chatViewSplitView.resolvePanes(true);
Qt.callLater(updateConversationEndedFlag);
}
}
@ -196,6 +240,29 @@ Rectangle {
visible: false
}
Control {
id: conversationEndedBanner
Layout.fillWidth: true
visible: isConversationEndedFlag
padding: 10
background: Rectangle {
color: JamiTheme.infoRectangleColor
radius: 5
}
contentItem: RowLayout {
spacing: 8
Label {
text: JamiStrings.conversationEnded
color: JamiTheme.textColor
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
Layout.alignment: Qt.AlignHCenter
Layout.fillWidth: true
}
}
}
NotificationArea {
id: notificationArea
Layout.fillWidth: true
@ -333,6 +400,8 @@ Rectangle {
return false;
else if (CurrentConversation.isRequest)
return false;
else if (isConversationEndedFlag)
return false;
return CurrentConversation.isSwarm || CurrentConversation.isTemporary;
}

View File

@ -73,28 +73,37 @@ ContextMenuAutoLoader {
onClicked: MessagesAdapter.clearConversationHistory(responsibleAccountId, responsibleConvUid)
},
GeneralMenuItem {
id: removeContact
id: removeConversation
canTrigger: !hasCall && !root.isBanned
itemName: {
if (mode !== Conversation.Mode.NON_SWARM)
return JamiStrings.removeConversation;
else
return JamiStrings.removeContact;
}
itemName: mode === Conversation.Mode.ONE_TO_ONE ? JamiStrings.removeConversation : JamiStrings.leaveGroup
iconSource: JamiResources.ic_hangup_participant_24dp_svg
onClicked: {
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/ConfirmDialog.qml", {
"title": JamiStrings.confirmAction,
"textLabel": JamiStrings.confirmLeaveConversation,
"confirmLabel": JamiStrings.optionLeave
});
"title": JamiStrings.confirmAction,
"textLabel": mode === Conversation.Mode.ONE_TO_ONE ? JamiStrings.confirmRemoveOneToOneConversation : JamiStrings.confirmLeaveGroup,
"confirmLabel": mode === Conversation.Mode.ONE_TO_ONE ? JamiStrings.optionRemove : JamiStrings.optionLeave
});
dlg.accepted.connect(function () {
if (mode !== Conversation.Mode.NON_SWARM)
MessagesAdapter.removeConversation(responsibleConvUid);
else
MessagesAdapter.removeContact(responsibleConvUid);
});
MessagesAdapter.removeConversation(responsibleConvUid, true);
});
}
},
GeneralMenuItem {
id: removeContact
canTrigger: !hasCall && !root.isBanned && mode === Conversation.Mode.ONE_TO_ONE
itemName: JamiStrings.removeContact
iconSource: JamiResources.kick_member_svg
onClicked: {
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/ConfirmDialog.qml", {
"title": JamiStrings.confirmAction,
"textLabel": JamiStrings.confirmRemoveContact,
"confirmLabel": JamiStrings.optionRemove
});
dlg.accepted.connect(function () {
MessagesAdapter.removeContact(responsibleConvUid);
});
}
},
GeneralMenuItem {
@ -129,13 +138,13 @@ ContextMenuAutoLoader {
iconSource: JamiResources.block_black_24dp_svg
onClicked: {
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/ConfirmDialog.qml", {
"title": JamiStrings.confirmAction,
"textLabel": JamiStrings.confirmBlockConversation,
"confirmLabel": JamiStrings.optionBlock
});
"title": JamiStrings.confirmAction,
"textLabel": JamiStrings.confirmBlockContact,
"confirmLabel": JamiStrings.optionBlock
});
dlg.accepted.connect(function () {
MessagesAdapter.blockConversation(responsibleConvUid);
});
MessagesAdapter.blockConversation(responsibleConvUid);
});
}
},
GeneralMenuItem {
@ -155,11 +164,11 @@ ContextMenuAutoLoader {
onClicked: {
if (isCoreDialog) {
viewCoordinator.presentDialog(appWindow, "mainview/components/UserProfile.qml", {
"aliasText": aliasText,
"registeredNameText": registeredNameText,
"idText": idText,
"convId": responsibleConvUid
});
"aliasText": aliasText,
"registeredNameText": registeredNameText,
"idText": idText,
"convId": responsibleConvUid
});
} else {
root.showSwarmDetails();
}

View File

@ -32,7 +32,7 @@ Control {
// Calculate the time 7 days from now
var futureDate = new Date(new Date().getTime() + 7 * 24 * 60 * 60 * 1000);
var formattedDate = Qt.formatDateTime(futureDate, "yyyy-MM-dd hh:mm");
UtilsAdapter.setAppValue(Settings.Key.Donation2023VisibleDate, formattedDate);
UtilsAdapter.setAppValue(Settings.Key.Donation2025StartDate, formattedDate);
}
MouseArea {

View File

@ -297,7 +297,7 @@ Rectangle {
anchors.right: parent.right
anchors.top: parent.top
anchors.margins: JamiTheme.preferredMarginSize
text: JamiStrings.leaveConversation
text: CurrentConversation.modeString.indexOf("group") >= 0 ? JamiStrings.leaveGroup : JamiStrings.removeConversation
font.pixelSize: JamiTheme.settingsDescriptionPixelSize
font.kerning: true
elide: Text.ElideRight
@ -312,13 +312,49 @@ Rectangle {
enabled: parent.visible
onTapped: function onTapped(eventPoint) {
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/ConfirmDialog.qml", {
"title": JamiStrings.confirmAction,
"textLabel": JamiStrings.confirmLeaveConversation,
"confirmLabel": JamiStrings.optionLeave
});
"title": JamiStrings.confirmAction,
"textLabel": CurrentConversation.modeString.indexOf("group") >= 0 ? JamiStrings.confirmLeaveGroup : JamiStrings.confirmRemoveOneToOneConversation,
"confirmLabel": CurrentConversation.modeString.indexOf("group") >= 0 ? JamiStrings.optionLeave : JamiStrings.optionRemove
});
dlg.accepted.connect(function () {
MessagesAdapter.removeConversation(LRCInstance.selectedConvUid);
});
MessagesAdapter.removeConversation(LRCInstance.selectedConvUid, true);
});
}
}
}
SwarmDetailsItem {
Layout.fillWidth: true
Layout.preferredHeight: JamiTheme.settingsFontSize + 2 * JamiTheme.preferredMarginSize + 4
visible: CurrentConversation.isCoreDialog
Text {
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.margins: JamiTheme.preferredMarginSize
text: JamiStrings.removeContact
font.pixelSize: JamiTheme.settingsDescriptionPixelSize
font.kerning: true
elide: Text.ElideRight
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
color: JamiTheme.textColor
}
TapHandler {
target: parent
enabled: parent.visible
onTapped: function onTapped(eventPoint) {
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/ConfirmDialog.qml", {
"title": JamiStrings.confirmAction,
"textLabel": JamiStrings.confirmRemoveContact,
"confirmLabel": JamiStrings.optionRemove
});
dlg.accepted.connect(function () {
MessagesAdapter.removeConversation(LRCInstance.selectedConvUid);
});
}
}
}
@ -500,8 +536,6 @@ Rectangle {
verticalAlignment: Text.AlignVCenter
color: JamiTheme.textColor
}
Text {

View File

@ -480,10 +480,10 @@ MessagesAdapter::clearConversationHistory(const QString& accountId, const QStrin
}
void
MessagesAdapter::removeConversation(const QString& convUid)
MessagesAdapter::removeConversation(const QString& convUid, bool keepContact)
{
auto& accInfo = lrcInstance_->getCurrentAccountInfo();
accInfo.conversationModel->removeConversation(convUid);
accInfo.conversationModel->removeConversation(convUid, false, keepContact);
}
void

View File

@ -113,7 +113,7 @@ public:
Q_INVOKABLE void loadMoreMessages();
Q_INVOKABLE void connectConversationModel();
Q_INVOKABLE void sendConversationRequest();
Q_INVOKABLE void removeConversation(const QString& convUid);
Q_INVOKABLE void removeConversation(const QString& convUid, bool keepContact = false);
Q_INVOKABLE void addConversationMember(const QString& convUid, const QString& participantUri);
Q_INVOKABLE void removeConversationMember(const QString& convUid, const QString& participantUri);
Q_INVOKABLE void removeContact(const QString& convUid, bool banContact = false);

View File

@ -103,8 +103,8 @@ Item {
// The banner is visible if the current date is after the date set in the settings and before the end date
// And if the donation toggle is checked
const isVisible = UtilsAdapter.getAppValue(Settings.Key.IsDonationVisible);
const endDate = Date.parse(UtilsAdapter.getAppValue(Settings.Key.Donation2023EndDate2));
const startDate = Date.parse(UtilsAdapter.getAppValue(Settings.Key.Donation2023VisibleDate));
const endDate = Date.parse(UtilsAdapter.getAppValue(Settings.Key.Donation2025EndDate));
const startDate = Date.parse(UtilsAdapter.getAppValue(Settings.Key.Donation2025StartDate));
const now = new Date();
return isVisible && now < endDate && now >= startDate;
}

View File

@ -46,7 +46,7 @@ Item {
property string buildID: qsTr("Build ID")
property string version: qsTr("Version")
property string declarationYear: "Copyright © 20152025"
property string slogan: "Εἰρήνη"
property string slogan: "Atlas"
property string declaration: qsTr('Jami, a GNU package, is software for universal and distributed peer-to-peer communication that respects the freedom and privacy of its users. Visit <a href="https://jami.net" style="color: ' + JamiTheme.buttonTintedBlue + '">jami.net</a>' + ' to learn more.')
property string noWarranty: qsTr('This program comes with absolutely no warranty. See the <a href="https://www.gnu.org/licenses/gpl-3.0.html" style="color: ' + JamiTheme.buttonTintedBlue + '">GNU General Public License</a>, version 3 or later for details.')
property string contribute: qsTr('Contribute')
@ -282,9 +282,13 @@ Item {
property string startVideoCall: qsTr("Start video call")
property string deleteConversation: qsTr("Delete conversation")
property string confirmAction: qsTr("Confirm action")
property string removeConversation: qsTr("Leave conversation")
property string confirmLeaveConversation: qsTr("Do you want to leave this conversation?")
property string confirmBlockConversation: qsTr("Do you want to block this conversation?")
property string removeConversation: qsTr("Remove conversation")
property string confirmRemoveConversation: qsTr("Do you want to leave this conversation?")
property string leaveGroup: qsTr("Leave group")
property string confirmLeaveGroup: qsTr("Are you sure you want to leave this group?")
property string confirmRemoveContact: qsTr("Do you want to remove this contact? The existing conversation will be deleted.")
property string confirmBlockContact: qsTr("Do you want to block this contact?")
property string confirmRemoveOneToOneConversation: qsTr("Are you sure you want to remove this conversation? The contact will not be removed.")
property string removeContact: qsTr("Remove contact")
property string blockContact: qsTr("Block contact")
property string convDetails: qsTr("Conversation details")
@ -366,6 +370,9 @@ Item {
property string deletedMedia: qsTr("%1 deleted a media")
property string returnToCall: qsTr("Return to call")
// Conversation ended banner
property string conversationEnded: qsTr("This conversation has ended.")
// MessagesResearch
property string jumpTo: qsTr("Jump to")
property string messages: qsTr("Messages")
@ -828,7 +835,6 @@ Item {
property string ignoreNotificationsTooltip: qsTr("Ignore all notifications from this conversation")
property string chooseAColor: qsTr("Color")
property string defaultCallHost: qsTr("Default host (calls)")
property string leaveConversation: qsTr("Leave conversation")
property string typeOfSwarm: qsTr("Conversation type")
property string none: qsTr("None")

View File

@ -65,7 +65,7 @@ ColumnLayout {
titleField: JamiStrings.caCertificate
itemWidth: root.itemWidth
onClick: openFileDialog(JamiStrings.selectCACert, CurrentAccount.certificateListFile_TLS, JamiStrings.certificateFile, function (file) {
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectCACert, CurrentAccount.certificateListFile_TLS, JamiStrings.certificateFile, function (file) {
CurrentAccount.certificateListFile_TLS = UtilsAdapter.getAbsPath(file.toString());
})
}
@ -80,7 +80,7 @@ ColumnLayout {
titleField: JamiStrings.userCertificate
itemWidth: root.itemWidth
onClick: openFileDialog(JamiStrings.selectUserCert, CurrentAccount.certificateFile_TLS, JamiStrings.certificateFile, function (file) {
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectUserCert, CurrentAccount.certificateFile_TLS, JamiStrings.certificateFile, function (file) {
CurrentAccount.certificateFile_TLS = UtilsAdapter.getAbsPath(file.toString());
})
}
@ -95,7 +95,7 @@ ColumnLayout {
titleField: JamiStrings.privateKey
itemWidth: root.itemWidth
onClick: openFileDialog(JamiStrings.selectPrivateKey, CurrentAccount.privateKeyFile_TLS, JamiStrings.keyFile, function (file) {
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectPrivateKey, CurrentAccount.privateKeyFile_TLS, JamiStrings.keyFile, function (file) {
CurrentAccount.privateKeyFile_TLS = UtilsAdapter.getAbsPath(file.toString());
})
}

View File

@ -84,7 +84,7 @@ ColumnLayout {
textField: UtilsAdapter.toFileInfoName(CurrentAccount.certificateListFile_TLS) !== "" ? UtilsAdapter.toFileInfoName(CurrentAccount.certificateListFile_TLS) : JamiStrings.selectCACertDefault
itemWidth: root.itemWidth
onClick: openFileDialog(JamiStrings.selectCACert, CurrentAccount.certificateListFile_TLS, JamiStrings.certificateFile, function (file) {
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectCACert, CurrentAccount.certificateListFile_TLS, JamiStrings.certificateFile, function (file) {
CurrentAccount.certificateListFile_TLS = UtilsAdapter.getAbsPath(file.toString());
})
}
@ -99,7 +99,7 @@ ColumnLayout {
itemWidth: root.itemWidth
textField: UtilsAdapter.toFileInfoName(CurrentAccount.certificateFile_TLS) !== "" ? UtilsAdapter.toFileInfoName(CurrentAccount.certificateFile_TLS) : JamiStrings.selectCACertDefault
onClick: openFileDialog(JamiStrings.selectUserCert, CurrentAccount.certificateFile_TLS, JamiStrings.certificateFile, function (file) {
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectUserCert, CurrentAccount.certificateFile_TLS, JamiStrings.certificateFile, function (file) {
CurrentAccount.certificateFile_TLS = UtilsAdapter.getAbsPath(file.toString());
})
}
@ -114,7 +114,7 @@ ColumnLayout {
itemWidth: root.itemWidth
textField: UtilsAdapter.toFileInfoName(CurrentAccount.privateKeyFile_TLS) !== "" ? UtilsAdapter.toFileInfoName(CurrentAccount.privateKeyFile_TLS) : JamiStrings.selectCACertDefault
onClick: openFileDialog(JamiStrings.selectPrivateKey, CurrentAccount.privateKeyFile_TLS, JamiStrings.keyFile, function (file) {
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectPrivateKey, CurrentAccount.privateKeyFile_TLS, JamiStrings.keyFile, function (file) {
CurrentAccount.privateKeyFile_TLS = UtilsAdapter.getAbsPath(file.toString());
})
}

View File

@ -154,7 +154,7 @@ SettingsPageBase {
titleField: JamiStrings.selectCustomRingtone
itemWidth: root.itemWidth
onClick: {
onSettingMaterialButtonClicked: {
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/JamiFileDialog.qml", {
"title": JamiStrings.selectNewRingtone,
"fileMode": JamiFileDialog.OpenFile,

View File

@ -31,7 +31,7 @@ RowLayout {
property string source
property int itemWidth
signal click
signal settingMaterialButtonClicked
Text {
id: title
@ -59,6 +59,6 @@ RowLayout {
iconSource: root.source
secondary: true
onClicked: click()
onClicked: settingMaterialButtonClicked()
}
}

View File

@ -92,7 +92,7 @@ SettingsPageBase {
onSwitchToggled: {
UtilsAdapter.setAppValue(Settings.Key.IsDonationVisible, checked);
if (checked) {
UtilsAdapter.setToDefault(Settings.Key.Donation2023VisibleDate);
UtilsAdapter.setToDefault(Settings.Key.Donation2025StartDate);
}
}
}
@ -246,7 +246,7 @@ SettingsPageBase {
UtilsAdapter.setToDefault(Settings.Key.LANG);
UtilsAdapter.setToDefault(Settings.Key.EnableExperimentalSwarm);
UtilsAdapter.setToDefault(Settings.Key.IsDonationVisible);
UtilsAdapter.setToDefault(Settings.Key.Donation2023VisibleDate);
UtilsAdapter.setToDefault(Settings.Key.Donation2025StartDate);
enableDonation.checked = Qt.binding(() => UtilsAdapter.getAppValue(Settings.Key.IsDonationVisible));
}
}

View File

@ -100,8 +100,8 @@ UtilsAdapter::setAppValue(const Settings::Key key, const QVariant& value)
#if !APPSTORE
// Any donation campaign-related keys can trigger a donation campaign check
else if (key == Settings::Key::IsDonationVisible
|| key == Settings::Key::Donation2023VisibleDate
|| key == Settings::Key::Donation2023EndDate2)
|| key == Settings::Key::Donation2025StartDate
|| key == Settings::Key::Donation2025EndDate)
Q_EMIT donationCampaignSettingsChanged();
#endif
}

View File

@ -291,7 +291,7 @@ Rectangle {
id: confirmButton
text: JamiStrings.optionConfirm
primary: true
enabled: !passwordField.visible || passwordField.dynamicText.length > 0
enabled: true
onClicked: {
AccountAdapter.provideAccountAuthentication(passwordField.visible ? passwordField.dynamicText : "");
}

View File

@ -191,8 +191,9 @@ public:
* Remove a conversation and the contact if it's a dialog
* @param uid of the conversation
* @param banned if we want to ban the contact.
* @param keepContact if we want to keep the contact. New conversation could be created
*/
void removeConversation(const QString& uid, bool banned = false);
void removeConversation(const QString& uid, bool banned = false, bool keepContact = false);
/**
* Get the action wanted by the user when they click on the conversation
* @param uid of the conversation

View File

@ -319,18 +319,21 @@ getFormattedCallDuration(const std::time_t duration)
return QString("%1d %2h %3m %4s")
.arg(days)
.arg(hours)
.arg(minutes, 2, 10, QChar('0'))
.arg(seconds, 2, 10, QChar('0'));
.arg(minutes)
.arg(seconds);
} else if (hours > 0) {
minutes = minutes % 60;
return QString("%1h %2m %3s")
.arg(hours)
.arg(minutes, 2, 10, QChar('0'))
.arg(seconds, 2, 10, QChar('0'));
.arg(minutes)
.arg(seconds);
} else if (minutes > 0) {
return QString("%1m %2s").arg(minutes).arg(seconds, 2, 10, QChar('0'));
return QString("%1m %2s")
.arg(minutes)
.arg(seconds);
} else {
return QString("%1s").arg(seconds);
return QString("%1s")
.arg(seconds);
}
}

View File

@ -819,7 +819,7 @@ ConversationModel::selectConversation(const QString& uid) const
}
void
ConversationModel::removeConversation(const QString& uid, bool banned)
ConversationModel::removeConversation(const QString& uid, bool banned, bool keepContact)
{
// Get conversation
auto conversationIdx = pimpl_->indexOf(uid);
@ -837,7 +837,7 @@ ConversationModel::removeConversation(const QString& uid, bool banned)
"participant.";
return;
}
if (conversation.isSwarm() && !banned && !conversation.isCoreDialog()) {
if (conversation.isSwarm() && !banned && (!conversation.isCoreDialog() || keepContact)) {
if (conversation.isRequest) {
ConfigurationManager::instance().declineConversationRequest(owner.id, uid);
} else {