Compare commits

...

29 Commits

Author SHA1 Message Date
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
ee0a754b6a accountmodel: rename RingNS to Nameserver
Change-Id: Ib7c82c9188adac853933d5642a85068f688cfe80
2025-08-29 11:12:04 -04:00
9278919410 build: detect correct folder in single-arch
On macOS, contrib outputs are placed under
<arch>-apple-darwin<ver> for single-arch builds and
under apple-darwin<ver> for multi-arch builds. Adjust
detection so the client picks the right include path.

Change-Id: Ia9ae2bb7b1f0d6e42cb15364b1921e94f2602836
2025-08-28 14:01:46 -04:00
8c1b79a86c build: pass IGNORE_SYSTEM_LIB flag to client
Change-Id: I7d98d49d0f990b622545cbe7b31700b2d48c0ff2
2025-08-26 09:51:50 -04:00
3e6108f167 build: add option to ignore system libs detection
Change-Id: I5ffa696df4b36cd7a62c13931c1465eeab3dc8a3
2025-08-21 17:15:48 -04:00
22be4be864 build: use cmake instead autotools
Change-Id: I73657d7fb1cd70bb150eefc2e5e60a88d1259caf
2025-08-21 17:15:22 -04:00
bb359f851b homogenize variable name: answer → accept
Follow up to the https://review.jami.net/c/jami-client-qt/+/31410 patch.

Change-Id: I83b8d3d621ebfe8930e70ef0521ef95eb28ac092
2025-08-21 16:56:48 -04:00
36730480aa src/libclient/api/account.h: cleanup
Operation was canceled. → The operation was canceled by the user.
Please verify your connection. → Please verify your connection and try again.

Change-Id: I24222b0dfc143fe6ae975b29fcfda8d706ddde6a
2025-08-21 16:44:28 -04:00
e7d626a421 misc: bump daemon submodule
Change-Id: I8837fe66385a1ae8f520f65924cfb0db80c9e1cb
2025-08-20 16:11:56 -04:00
185869824a src/libclient/api/interaction.h: change call duration format
The application currently shows the call duration as minutes:seconds,
this commit aims to have the following format: 0d 1h 2m 3s.

Change displayed call duration to include days and hours if call is
longer than 60 minutes.

GitLab: #1979
Change-Id: If2759affd5fd1b3ad3687f037f542f4149aeda4d
2025-08-20 14:10:52 -04:00
9858891fea utilsadapter: remove Kazakh (kk) from RTL languages
The language "Kazakh (kk)" we have on Transifex corresponds to the cyrillic script, which is LTR. If we want to include the arabic script of Kazakh, we must request it on Transifex and then add the corresponding code to the QStringList object of RTL languages.

GitLab: #2080
Change-Id: I321e462a1d833ce2dc7466d72cb90adcad3358b8
2025-08-20 14:09:03 -04:00
be7ec378c8 PluginAdapter: Fix missing extension store
Function getValue() of AppSettingsManager expects type Settings::Key,
but was being give a string. PluginStoreListView was placed under
InstallManuallyView, otherwise overlay occurs.

GitLab: #2012
Change-Id: If7f1c1e15e80bdc44728ace85e914092bace263f
2025-08-20 09:54:35 -04:00
cbed58544f INSTALL.md: update document for Qt 6.8.3
Change-Id: Ia3de6bd6608fd0fedefa96d2b405367e6b0e047c
2025-08-19 15:28:35 -04:00
c642c1ddfa JamiStrings.qml, KeyboardShortcutTable.qml systemtray.cpp: answer → accept
Unify with JamiStrings.qml and other clients.

Change-Id: Ieb11c992f0721dba7ff288d82dd4644021627f37
2025-08-18 16:35:13 -04:00
aa8c1edbd4 packaging: remove Ubuntu 20.04 (EOL)
GitLab: #2083
Change-Id: Ic7846ff044312e58b4333afbe80b2d8bf4d38f21
2025-08-18 14:50:31 -04:00
2a28438275 connectioninfolistmodel.cpp: cleanup
Change-Id: Ia3a8e1402c8683b7945d85f7caaff97d12f30fff
2025-08-16 21:13:14 -04:00
92945ad29f JamiStrings: unify
https://review.jami.net/c/jami-client-android/+/30551
https://review.jami.net/c/jami-client-ios/+/31199
https://review.jami.net/c/jami-client-ios/+/31247
https://review.jami.net/c/jami-docs/+/31201

all time → any time

GitLab: #2026

Change-Id: I98dcc928c33d7a30a477dfb96a9bfe141bfc2a40
2025-08-15 18:32:04 -04:00
43 changed files with 250 additions and 264 deletions

View File

@ -26,7 +26,7 @@ set(CMAKE_SCRIPTS_DIR ${PROJECT_SOURCE_DIR}/extras/build/cmake)
include(${CMAKE_SCRIPTS_DIR}/extra_tools.cmake)
option(WITH_DAEMON_SUBMODULE "Build with daemon submodule" ON)
option(JAMICORE_AS_SUBDIR "Build Jami-core as a subdir dependency" OFF)
option(JAMICORE_AS_SUBDIR "Build Jami-core as a subdir dependency" ON)
option(WITH_WEBENGINE "Build with WebEngine" ON)
option(ENABLE_LIBWRAP "Enable libwrap (single process mode)" ON)
if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
@ -58,10 +58,9 @@ 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()
# init some variables for includes, libs, etc.
@ -234,11 +233,12 @@ cloned this repository via git, perhaps you did not initialize its \
submodules afterwards. You can do so by running \"git submodule \
update --init\" in the repository.")
endif()
set(CMAKE_MODULE_PATH
${CMAKE_MODULE_PATH} "${EXTRAS_DIR}/build/cmake/modules")
find_package(LibJami REQUIRED)
if(LIBJAMI_FOUND)
include_directories(${LIBJAMI_INCLUDE_DIR})
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/extras/build/cmake/modules)
if (NOT JAMICORE_AS_SUBDIR)
find_package(LibJami REQUIRED)
if(LIBJAMI_FOUND)
include_directories(${LIBJAMI_INCLUDE_DIRS})
endif()
endif()
include(FindPython3)
@ -439,12 +439,24 @@ set(COMMON_HEADERS
${APP_SRC_DIR}/qrcodescannermodel.h
${APP_SRC_DIR}/spellchecker.h)
set(CONTRIB_DARWIN_FOLDER "")
if(APPLE)
list(LENGTH CMAKE_OSX_ARCHITECTURES ARCH_LEN)
if(ARCH_LEN EQUAL 1)
# single-arch -> use <arch>-apple-darwin<ver>
set(DARWIN_ARCH "${CMAKE_OSX_ARCHITECTURES}")
set(CONTRIB_DARWIN_FOLDER "${DARWIN_ARCH}-apple-darwin${CMAKE_SYSTEM_VERSION}")
else() # multi-arch -> use apple-darwin<ver>
set(CONTRIB_DARWIN_FOLDER "apple-darwin${CMAKE_SYSTEM_VERSION}")
endif()
endif()
# For libavutil/avframe.
set(LIBJAMI_CONTRIB_DIR "${DAEMON_DIR}/contrib")
find_path(AVUTIL_INCLUDE_DIR libavutil/avutil.h
PATHS
${LIBJAMI_CONTRIB_DIR}/native/ffmpeg
${LIBJAMI_CONTRIB_DIR}/apple-darwin/include/
${LIBJAMI_CONTRIB_DIR}/${CONTRIB_DARWIN_FOLDER}/include/
${LIBJAMI_CONTRIB_DIR}/build/ffmpeg/Build/win32/x64/include)
include_directories(${AVUTIL_INCLUDE_DIR})
@ -574,19 +586,6 @@ elseif (NOT APPLE)
add_definitions(${LIBGDKPIXBUF_CFLAGS})
endif()
# Link against the version of libavutil built in the daemon's contribs to
# make sure we don't have ABI incompatibility issues.
set(ARCHITECTURE ${CMAKE_LIBRARY_ARCHITECTURE})
if (NOT ARCHITECTURE)
execute_process(COMMAND gcc -dumpmachine COMMAND tr -d '\n' OUTPUT_VARIABLE ARCHITECTURE)
endif()
list(PREPEND CMAKE_PREFIX_PATH
${LIBJAMI_CONTRIB_DIR}/${ARCHITECTURE})
pkg_check_modules(avutil REQUIRED IMPORTED_TARGET libavutil=58.2.100)
list(REMOVE_ITEM CMAKE_PREFIX_PATH
${LIBJAMI_CONTRIB_DIR}/${ARCHITECTURE})
list(APPEND CLIENT_LIBS PkgConfig::avutil)
include_directories(
${LIBCLIENT_SRC_DIR}
${LIBNM_INCLUDE_DIRS}
@ -945,7 +944,7 @@ else()
target_sources(${PROJECT_NAME} PRIVATE ${resources})
list(APPEND CLIENT_LIBS ${libs})
file(GLOB CONTRIB ${LIBJAMI_CONTRIB_DIR}/apple-darwin/lib/*.a)
file(GLOB CONTRIB ${LIBJAMI_CONTRIB_DIR}/${CONTRIB_DARWIN_FOLDER}/lib/*.a)
list(APPEND CLIENT_LIBS ${CONTRIB})
find_package(Iconv REQUIRED)

View File

@ -189,18 +189,20 @@ Only 64-bit MSVC build can be compiled.
- Download [Qt (Open Source)](https://www.qt.io/download-open-source?hsCtaTracking=9f6a2170-a938-42df-a8e2-a9f0b1d6cdce%7C6cb0de4f-9bb5-4778-ab02-bfb62735f3e5)
- Using the online installer, install the following Qt 6.6.2 components:
- Using the online installer, install the following Qt 6.8.3 components:
- Git 2.10.2
- MSVC 2019 64-bit
- Qt 5 Compatibility Module
- MSVC 2022 64-bit
- Extension :
- Qt WebEngine
- Additional Libraries
- Qt Multimedia
- Qt Network Authorization
- Qt WebChannel
- Qt WebEngine
- Qt WebSockets
- Qt WebView
- Qt 5 Compatibility Module
- Qt Positioning
- Download [Visual Studio](https://visualstudio.microsoft.com/) (versions 2019 or 2022). _See the SDK notes below._
@ -212,7 +214,7 @@ Only 64-bit MSVC build can be compiled.
| | Qt Version |
| -------------------- | ---------- |
| Minimum requirement: | 6.6.2 |
| Minimum requirement: | 6.8.3 |
- Install [Python3](https://www.python.org/downloads/) for Windows
@ -238,11 +240,11 @@ Only 64-bit MSVC build can be compiled.
- Using a new **Non-Elevated Command Prompt**
```bash
python build.py --init --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.6.2/msvc2019_64)
python build.py --init --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.8.3/msvc2022_64)
```
```bash
python build.py --install --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.6.2/msvc2019_64)
python build.py --install --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.8.3/msvc2022_64)
```
> **CMake** Note: The build script does not specify what CMake generator should be used. This means CMake will search the system for the appropriate generator, which might not always select the right one if, for instance, Ninja is installed. To resolve that, the CMAKE_GENERATOR environment variable can be used, set to "Visual Studio 16 2019" or "Visual Studio 19 2022" depending on the installed Visual Studio version.
@ -293,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

View File

@ -417,6 +417,8 @@ def run_install(args):
install_args += ('-D', args.extra_cmake_flags)
if args.enable_crash_reports:
install_args.append('-C')
if args.ignore_system_libs:
install_args.append('-i')
if args.distribution == OSX_DISTRIBUTION_NAME:
# The `universal_newlines` parameter has been renamed to `text` in
@ -769,6 +771,9 @@ def parse_args():
ap.add_argument('--enable-crash-reports',
action='store_true', default=False,
help='Enable crash reporting')
ap.add_argument('--ignore_system_libs', dest='ignore_system_libs',
default=False, action='store_true',
help='Build contrib packages regardless of system detection')
dist = choose_distribution()

2
daemon

Submodule daemon updated: 7fb78a0b06...c53658e211

View File

@ -41,7 +41,6 @@ set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib;.so;.dll")
set(LIBJAMI_NAMES
jami-core
jami
ring
)
if(WITH_DAEMON_SUBMODULE)

View File

@ -164,7 +164,6 @@ DISTRIBUTIONS := \
debian_12 \
debian_testing \
debian_unstable \
ubuntu_20.04 \
ubuntu_22.04 \
ubuntu_24.04 \
ubuntu_25.04 \

View File

@ -1,43 +0,0 @@
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get clean
RUN apt-get update && \
apt-get install -y -o Acquire::Retries=10 \
devscripts \
equivs \
python-is-python3 \
wget \
curl
# Installing GCC 10 because GCC 9 (the default on Ubuntu 20.04) doesn't support
# the --std=gnu++20 option, which is used by one of Qt 6.6.1's dependencies
ADD extras/packaging/gnu-linux/scripts/install-gcc-debian.sh /opt/install-gcc-debian.sh
RUN /opt/install-gcc-debian.sh 10
# nodejs
RUN curl -sL https://deb.nodesource.com/setup_20.x | bash -
RUN apt install nodejs -y
ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
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
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 Ubuntu 20.04 is too old.
ENV DISABLE_PIPEWIRE=true
CMD ["/opt/build-package-debian.sh"]

View File

@ -95,8 +95,6 @@ if [ -f /etc/os-release ]; then
ENDTAG="debian_11"
elif [ "${VERSION_CODENAME}" = "bookworm" ] || [ "${ID}_${VERSION_ID}" = "debian_12" ]; then
ENDTAG="debian_12"
elif [ "${UBUNTU_CODENAME}" = "focal" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_20.04" ]; then
ENDTAG="ubuntu_20.04"
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

@ -101,10 +101,10 @@ grade: stable
base: core22
plugs:
gnome-3-38-2004:
gnome-42-2204:
interface: content
target: $SNAP/gnome-platform
default-provider: gnome-3-38-2004:gnome-3-38-2004
default-provider: gnome-42-2204
gtk-3-themes:
interface: content
target: $SNAP/data-dir/themes
@ -129,8 +129,8 @@ 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:
@ -139,7 +139,7 @@ layout:
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"
apps:
jami:
@ -153,8 +153,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
@ -295,7 +295,8 @@ parts:
-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:
@ -388,6 +389,6 @@ parts:
- -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*

View File

@ -20,8 +20,8 @@ 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/
# required files under the $CRAFT_PART_INSTALL directory.
meson configure builddir -Dprefix=$CRAFT_PART_INSTALL/usr/
meson install -C builddir
# Cleanup

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

@ -32,6 +32,7 @@ export OSTYPE
# -A: enable AddressSanitizer
# -D: extra CMake flags for the client
# -C: enable crash reporting
# -i: ignore system libraries and build everything regardless of system detection
set -ex
@ -51,8 +52,9 @@ extra_cmake_flags=''
arch=''
enable_testing=false
enable_crashreports=false
ignore_system_libs=false
while getopts gsc:dQ:P:p:uWwa:AtD:C OPT; do
while getopts gsc:dQ:P:p:uWwa:AtD:Ci OPT; do
case "$OPT" in
g)
global='true'
@ -96,6 +98,9 @@ while getopts gsc:dQ:P:p:uWwa:AtD:C OPT; do
C)
enable_crashreports='true'
;;
i)
ignore_system_libs='true'
;;
\?)
exit 1
;;
@ -124,79 +129,81 @@ else
BUILD_DIR="build"
fi
# jamid
DAEMON="${TOP}/daemon"
if [[ "$OSTYPE" == "darwin"* ]]; then
sh "${TOP}"/extras/scripts/build_daemon_macos.sh -a "$arch" -d "$debug"
else
cd "$DAEMON"
# Build the contribs.
mkdir -p contrib/native
(
cd contrib/native
../bootstrap ${prefix:+"--prefix=$prefix"} ${asan:+"--enable-asan"}
make -j"${proc}"
)
if [[ "${enable_libwrap}" != "true" ]]; then
# Disable shared if requested
if [[ "$OSTYPE" != "darwin"* ]]; then
CONFIGURE_FLAGS+=" --disable-shared"
fi
else
CONFIGURE_FLAGS+="--without-dbus"
fi
BUILD_TYPE="Release"
if [ "${debug}" = "true" ]; then
BUILD_TYPE="Debug"
CONFIGURE_FLAGS+=" --enable-debug"
fi
if [ "${asan}" = "true" ]; then
CONFIGURE_FLAGS+=" --enable-asan"
fi
# Build the daemon itself.
test -f configure || ./autogen.sh
if [ "${global}" = "true" ]; then
./configure ${CONFIGURE_FLAGS} ${prefix:+"--prefix=$prefix"}
else
./configure ${CONFIGURE_FLAGS} --prefix="${INSTALL_DIR}"
fi
make -j"${proc}" V=1
make_install "${global}" "${priv_install}"
# Verify system's version if no path provided.
if [ -z "$qtpath" ]; then
sys_qtver=""
if command -v qmake6 &> /dev/null; then
sys_qtver=$(qmake6 -v)
elif command -v qmake-qt6 &> /dev/null; then
sys_qtver=$(qmake-qt6 -v) # Fedora
elif command -v qmake &> /dev/null; then
sys_qtver=$(qmake -v)
else
echo "No valid Qt found"; exit 1;
fi
sys_qtver=${sys_qtver#*Qt version}
sys_qtver=${sys_qtver%\ in\ *}
installed_qtver=$(echo "$sys_qtver" | cut -d'.' -f 2)
required_qtver=$(echo $QT_MIN_VER | cut -d'.' -f 2)
if [[ $installed_qtver -ge $required_qtver ]] ; then
# Set qtpath to empty in order to use system's Qt.
qtpath=""
else
echo "No valid Qt found"; exit 1;
fi
#detect arch for macos
CMAKE_OSX_ARCHITECTURES="arm64"
if [[ "$arch" == 'unified' ]]; then
CMAKE_OSX_ARCHITECTURES="x86_64;arm64"
elif [[ "$arch" != '' ]]; then
CMAKE_OSX_ARCHITECTURES="$arch"
fi
fi
# jamid
DAEMON="${TOP}/daemon"
cd "$DAEMON"
mkdir -p "${BUILD_DIR}"
cd "${BUILD_DIR}"
daemon_cmake_flags=(-DCMAKE_BUILD_TYPE="${BUILD_TYPE}")
if [ "${asan}" = "true" ]; then
daemon_cmake_flags+=(-DENABLE_ASAN=On)
fi
if [ "${ignore_system_libs}" = "true" ]; then
daemon_cmake_flags+=(-DIGNORE_SYSTEM_LIBS=On)
fi
if [ "${enable_libwrap}" = "false" ]; then
daemon_cmake_flags+=(-DJAMI_DBUS=On)
else
daemon_cmake_flags+=(-DJAMI_DBUS=Off)
fi
if [ "${enable_testing}" = "true" ]; then
daemon_cmake_flags+=(-DBUILD_TESTING=On)
else
daemon_cmake_flags+=(-DBUILD_TESTING=Off)
fi
if [ "${global}" = "true" ]; then
daemon_cmake_flags+=(${prefix:+"-DCMAKE_INSTALL_PREFIX=$prefix"})
else
daemon_cmake_flags+=(-DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}")
fi
if [[ "$OSTYPE" == "darwin"* ]]; then
daemon_cmake_flags+=(-DCMAKE_OSX_ARCHITECTURES="${CMAKE_OSX_ARCHITECTURES}")
fi
cmake .. "${daemon_cmake_flags[@]}"
make -j"${proc}" V=1
make_install "${global}" "${priv_install}"
# Verify system's version if no path provided.
if [ -z "$qtpath" ]; then
sys_qtver=""
if command -v qmake6 &> /dev/null; then
sys_qtver=$(qmake6 -v)
elif command -v qmake-qt6 &> /dev/null; then
sys_qtver=$(qmake-qt6 -v) # Fedora
elif command -v qmake &> /dev/null; then
sys_qtver=$(qmake -v)
else
echo "No valid Qt found"; exit 1;
fi
sys_qtver=${sys_qtver#*Qt version}
sys_qtver=${sys_qtver%\ in\ *}
installed_qtver=$(echo "$sys_qtver" | cut -d'.' -f 2)
required_qtver=$(echo $QT_MIN_VER | cut -d'.' -f 2)
if [[ $installed_qtver -ge $required_qtver ]] ; then
# Set qtpath to empty in order to use system's Qt.
qtpath=""
else
echo "No valid Qt found"; exit 1;
fi
fi
# fi
# client
cd "${TOP}"
mkdir -p "${BUILD_DIR}"
@ -217,6 +224,10 @@ else
client_cmake_flags+=(-DBUILD_TESTING=Off)
fi
if [ "${ignore_system_libs}" = "true" ]; then
client_cmake_flags+=(-DIGNORE_SYSTEM_LIBS=On)
fi
if [ "${enable_crashreports}" = "true" ]; then
client_cmake_flags+=(-DENABLE_CRASHREPORTS=ON)
else
@ -224,13 +235,6 @@ else
fi
if [[ "$OSTYPE" == "darwin"* ]]; then
#detect arch for macos
CMAKE_OSX_ARCHITECTURES="arm64"
if [[ "$arch" == 'unified' ]]; then
CMAKE_OSX_ARCHITECTURES="x86_64;arm64"
elif [[ "$arch" != '' ]]; then
CMAKE_OSX_ARCHITECTURES="$arch"
fi
client_cmake_flags+=(-DCMAKE_OSX_ARCHITECTURES="${CMAKE_OSX_ARCHITECTURES}")
# build qrencode
(

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

@ -67,7 +67,7 @@ CallAdapter::CallAdapter(AppSettingsManager* settingsManager,
#ifdef Q_OS_LINUX
// notification responses (gnu/linux currently)
connect(systemTray_,
&SystemTray::answerCallActivated,
&SystemTray::acceptCallActivated,
this,
[this](const QString& accountId, const QString& convUid) {
acceptACall(accountId, convUid);

View File

@ -61,13 +61,13 @@ ConnectionInfoListModel::data(const QModelIndex& index, int role) const
}
case ConnectionInfoList::ConnectionDatas: {
QString peerString;
peerString += "Peer:" + peerId;
peerString += "Peer: " + peerId;
for (const auto& device : peerData.keys()) {
peerString += "{";
peerString += "Device:" + device + ",";
peerString += "Status:" + peerData[device]["status"].toString() + ",";
peerString += "Channels:" + peerData[device]["channels"].toString() + ",";
peerString += "Remote Address" + peerData[device]["remoteAddress"].toString();
peerString += ",\n {";
peerString += "Device: " + device;
peerString += ", Status: " + peerData[device]["status"].toString();
peerString += ", Channel(s): " + peerData[device]["channels"].toString();
peerString += ", Remote IP address: " + peerData[device]["remoteAddress"].toString();
peerString += "}";
}
return peerString;

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

@ -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

@ -117,7 +117,7 @@ Window {
}
ListElement {
shortcut: "Ctrl+Y"
description: qsTr("Answer incoming call")
description: qsTr("Accept call")
}
ListElement {
shortcut: "Ctrl+D"

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')
@ -100,7 +100,7 @@ Item {
// AdvancedCallSettings
property string allowCallsUnknownContacs: qsTr("Allow incoming calls from unknown contacts")
property string rendezVous: qsTr("Convert your account into a rendezvous point")
property string autoAnswerCalls: qsTr("Automatically answer incoming calls")
property string autoAcceptCalls: qsTr("Automatically accept calls")
property string enableCustomRingtone: qsTr("Enable custom ringtone")
property string selectCustomRingtone: qsTr("Select custom ringtone")
property string selectNewRingtone: qsTr("Select a new ringtone")
@ -118,10 +118,6 @@ Item {
property string assignmentIndication: qsTr("Press the key to be assigned to push-to-talk shortcut")
property string assign: qsTr("Assign")
// AdvancedChatSettings
property string enableReadReceipts: qsTr("Enable read receipts")
property string enableReadReceiptsTooltip: qsTr("Send and receive receipts indicating that messages have been displayed.")
// AdvancedVoiceMailSettings
property string voiceMail: qsTr("Voicemail")
property string voiceMailDialCode: qsTr("Voicemail dial code")
@ -280,7 +276,6 @@ Item {
property string cut: qsTr("Cut")
property string copy: qsTr("Copy")
property string paste: qsTr("Paste")
property string language: qsTr("Language")
// ConversationContextMenu
property string startAudioCall: qsTr("Start audio call")
@ -429,8 +424,8 @@ Item {
property string displayName: qsTr("Display name")
// accountSettingsPages
property string customizeAccountDescription: qsTr("Your profile is only shared with your contacts.\nYour picture and your display name can be changed at all time in the settings of your account.")
property string usernameAccountDescription: qsTr("A chosen username can help to be found more easily on Jami.\nIf a username is not chosen, a randomly generated 40-character identifier will be assigned to this account as a username. It is more difficult to be found and reached with this identifier.")
property string customizeAccountDescription: qsTr("Your profile is only shared with your contacts. You can customize your profile at any time.")
property string usernameAccountDescription: qsTr("A chosen username can help to be found more easily on Jami. If a username is not chosen, a randomly generated 40-character identifier will be assigned to this account as a username. It is more difficult to be found and reached with this identifier.")
property string encryptAccountDescription: qsTr("Your Jami account is registered only on this device as an archive containing the keys of your account. Access to this archive can be protected with a password.")
property string saveAccountTitle: qsTr("Backup account")
property string saveAccountDescription: qsTr("This Jami account exists only on this device. The account will be lost if this device is lost or the application is uninstalled. It is recommended to make a backup of this account.")
@ -511,8 +506,10 @@ Item {
property string defaultSettings: qsTr("Default settings")
// ChatviewSettings
property string enableTypingIndicator: qsTr("Enable typing indicators")
property string enableTypingIndicator: qsTr("Typing indicator")
property string enableTypingIndicatorDescription: qsTr("Send and receive typing indicators showing when messages are being typed.")
property string enableReadReceipts: qsTr("Read receipts")
property string enableReadReceiptsTooltip: qsTr("Send and request delivery and read receipts to be sent when messages are delivered or read.")
property string displayHyperlinkPreviews: qsTr("Web link previews")
property string displayHyperlinkPreviewsDescription: qsTr("Preview requires downloading content from third-party servers.")
@ -609,13 +606,13 @@ Item {
property string enterPasswordPinCode: qsTr("This account is password encrypted, enter the password to generate a PIN code.")
property string addDevice: qsTr("Add Device")
property string linkNewDevice: qsTr("Link new device")
property string linkDeviceConnecting: qsTr("Connecting to your new device…")
property string linkDeviceConnecting: qsTr("Connecting to the new device…")
property string linkDeviceInProgress: qsTr("The export account operation to the new device is in progress.\nPlease confirm the import on the new device.")
property string linkDeviceScanQR: qsTr("On the new device, initiate a new account.\nSelect Add account → Connect from another device.\nWhen ready, scan the QR code.")
property string linkDeviceEnterManually: qsTr("Alternatively, enter the authentication code manually.")
property string linkDeviceEnterCodePlaceholder: qsTr("Enter authentication code")
property string linkDeviceAllSet: qsTr("The account was imported successfully.")
property string linkDeviceFoundAddress: qsTr("New device found at address below. Is that you?\nClicking on confirm will continue transfering account.")
property string linkDeviceFoundAddress: qsTr("New device connected at the following IP address. Is that you? To continue the export account operation, click Confirm.")
property string linkDeviceNewDeviceIP: qsTr("New device IP address: %1")
property string linkDeviceCloseWarningTitle: qsTr("Do you want to exit?")
property string linkDeviceCloseWarningMessage: qsTr("Exiting will cancel the import account operation.")

View File

@ -215,7 +215,7 @@ PluginAdapter::checkVersionStatus(const QString& pluginId)
QString
PluginAdapter::baseUrl() const
{
return settingsManager_->getValue("PluginStoreEndpoint").toString();
return settingsManager_->getValue(Settings::Key::PluginStoreEndpoint).toString();
}
QString

View File

@ -104,7 +104,7 @@ public:
return;
}
parent_.sendGetRequest(
QUrl(settingsManager_->getValue("PluginStoreEndpoint").toString() + "/versions/"
QUrl(settingsManager_->getValue(Settings::Key::PluginStoreEndpoint).toString() + "/versions/"
+ plugin.id + "?arch=" + lrcInstance_->pluginModel().getPlatformInfo()["os"]),
[this, plugin](const QByteArray& data) {
// `data` represents the version in this case.
@ -122,7 +122,7 @@ public:
void installRemotePlugin(const QString& pluginId)
{
parent_.downloadFile(
QUrl(settingsManager_->getValue("PluginStoreEndpoint").toString() + "/download/"
QUrl(settingsManager_->getValue(Settings::Key::PluginStoreEndpoint).toString() + "/download/"
+ lrcInstance_->pluginModel().getPlatformInfo()["os"] + "/" + pluginId),
pluginId,
0,

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

@ -14,6 +14,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
@ -90,7 +91,7 @@ SettingsPageBase {
ToggleSwitch {
id: checkBoxAutoAnswer
labelText: JamiStrings.autoAnswerCalls
labelText: JamiStrings.autoAcceptCalls
checked: CurrentAccount.autoAnswer
onSwitchToggled: CurrentAccount.autoAnswer = checked
}
@ -153,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

@ -70,16 +70,17 @@ SettingsPageBase {
}
}
}
InstallManuallyView {
Layout.fillWidth: true
spacing: 10
}
// View of available plugins in the store
PluginStoreListView {
id: pluginRemoteList
Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter
Layout.fillWidth: true
}
InstallManuallyView {
Layout.fillWidth: true
spacing: 10
}
}
}
property real previousDetailsWidth: 500

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

@ -53,10 +53,10 @@ refusePending(NotifyNotification*, char* action, SystemTray* nm)
}
void
answerCall(NotifyNotification*, char* action, SystemTray* nm)
acceptCall(NotifyNotification*, char* action, SystemTray* nm)
{
QStringList sl = QString(action).split(";");
Q_EMIT nm->answerCallActivated(sl.at(1), sl.at(2));
Q_EMIT nm->acceptCallActivated(sl.at(1), sl.at(2));
}
void
@ -221,7 +221,7 @@ SystemTray::showNotification(const QString& id,
if (pimpl_->actions) {
if (type == NotificationType::CALL) {
pimpl_->addNotificationAction(n, tr("Answer call"), (void*) answerCall);
pimpl_->addNotificationAction(n, tr("Accept call"), (void*) acceptCall);
pimpl_->addNotificationAction(n, tr("Decline call"), (void*) declineCall);
} else {
pimpl_->addNotificationAction(n, tr("Open conversation"), (void*) openConversation);

View File

@ -49,7 +49,7 @@ Q_SIGNALS:
void openConversationActivated(const QString& accountId, const QString& convUid);
void acceptPendingActivated(const QString& accountId, const QString& peerUri);
void refusePendingActivated(const QString& accountId, const QString&);
void answerCallActivated(const QString& accountId, const QString&);
void acceptCallActivated(const QString& accountId, const QString&);
void declineCallActivated(const QString& accountId, const QString&);
#else
void showNotification(const QString& message,

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
}
@ -826,8 +826,9 @@ UtilsAdapter::isRTL()
"dv", // Dhivehi (Maldivian)
"yi", // Yiddish
"am", // Amharic
"ti", // Tigrinya
"kk" // Kazakh (in Arabic script)
"ti" // Tigrinya
// Since we haven't requested the Arabic script of Kazakh in Transifex, we cannot include it here.
// However we have the Cyrillic script of Kazakh which is LTR (code: "kk").
};
return rtlLanguages.contains(pref);
}

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

@ -435,11 +435,11 @@ Rectangle {
anchors.bottom: parent.bottom
anchors.margins: JamiTheme.wizardViewPageBackButtonMargins
Accessible.role: Accessible.ComboBox
Accessible.name: JamiStrings.language
Accessible.name: JamiStrings.userInterfaceLanguage
Accessible.description: JamiStrings.languageComboBoxExplanation
labelText: JamiStrings.userInterfaceLanguage
tipText: JamiStrings.language
tipText: JamiStrings.userInterfaceLanguage
comboModel: ListModel {
id: langModel
Component.onCompleted: {

View File

@ -191,12 +191,6 @@ else()
endif()
if(ENABLE_LIBWRAP)
# The daemon is only required for when using direct linking
if(NOT LIBJAMI_LIB)
message(FATAL_ERROR "Jami daemon library is required when \
building with ENABLE_LIBWRAP")
endif()
# Use native calls (no DBus)
add_definitions(-DENABLE_LIBWRAP=true)
if (NOT (CMAKE_CXX_COMPILER_ID MATCHES "MSVC"))
@ -311,10 +305,23 @@ set(LIBCLIENT_HEADERS_API
# For libavutil/avframe.
set(LIBJAMI_CONTRIB_DIR
"${DAEMON_DIR}/contrib")
set(CONTRIB_DARWIN_FOLDER "")
if(APPLE)
list(LENGTH CMAKE_OSX_ARCHITECTURES ARCH_LEN)
if(ARCH_LEN EQUAL 1)
# single-arch -> use <arch>-apple-darwin<ver>
set(DARWIN_ARCH "${CMAKE_OSX_ARCHITECTURES}")
set(CONTRIB_DARWIN_FOLDER "${DARWIN_ARCH}-apple-darwin${CMAKE_SYSTEM_VERSION}")
else() # multi-arch -> use apple-darwin<ver>
set(CONTRIB_DARWIN_FOLDER "apple-darwin${CMAKE_SYSTEM_VERSION}")
endif()
endif()
find_path(AVUTIL_INCLUDE_DIR libavutil/avutil.h
PATHS
${LIBJAMI_CONTRIB_DIR}/native/ffmpeg
${LIBJAMI_CONTRIB_DIR}/apple-darwin/include/
${LIBJAMI_CONTRIB_DIR}/${CONTRIB_DARWIN_FOLDER}/include/
${LIBJAMI_CONTRIB_DIR}/build/ffmpeg/Build/win32/x64/include)
include_directories(${AVUTIL_INCLUDE_DIR})
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
@ -324,10 +331,6 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
else()
set(CC_MACHINE "")
endif()
find_library(AVUTIL_LIBRARY avutil
HINTS
${LIBJAMI_CONTRIB_DIR}/${CC_MACHINE}/lib
${LIBJAMI_CONTRIB_DIR}/apple-darwin/lib)
if(ENABLE_LIBWRAP)
list(APPEND LIBCLIENT_HEADERS directrenderer.h)
@ -478,7 +481,7 @@ if(NOT(APPLE OR MSVC))
endif()
if(ENABLE_LIBWRAP)
target_link_libraries(${LIBCLIENT_NAME} qtwrapper ${LIBJAMI_LIB})
target_link_libraries(${LIBCLIENT_NAME} qtwrapper)
if (NOT (CMAKE_CXX_COMPILER_ID MATCHES "MSVC"))
target_link_libraries(${LIBCLIENT_NAME} ${AVUTIL_LIBRARY})
endif()

View File

@ -965,8 +965,8 @@ account::Info::fromDetails(const MapStringString& details)
confProperties.DHT.PublicInCalls = toBool(details[ConfProperties::DHT::PUBLIC_IN_CALLS]);
confProperties.DHT.AllowFromTrusted = toBool(details[ConfProperties::DHT::ALLOW_FROM_TRUSTED]);
// RingNS
confProperties.RingNS.uri = details[ConfProperties::RingNS::URI];
confProperties.RingNS.account = details[ConfProperties::RingNS::ACCOUNT];
confProperties.RingNS.uri = details[ConfProperties::Nameserver::URI];
confProperties.RingNS.account = details[ConfProperties::Nameserver::ACCOUNT];
// Jams
confProperties.managerUri = details[ConfProperties::MANAGER_URI];
confProperties.managerUsername = details[ConfProperties::MANAGER_USERNAME];
@ -1076,8 +1076,8 @@ account::ConfProperties_t::toDetails() const
details[ConfProperties::DHT::PUBLIC_IN_CALLS] = toQString(this->DHT.PublicInCalls);
details[ConfProperties::DHT::ALLOW_FROM_TRUSTED] = toQString(this->DHT.AllowFromTrusted);
// RingNS
details[ConfProperties::RingNS::URI] = this->RingNS.uri;
details[ConfProperties::RingNS::ACCOUNT] = this->RingNS.account;
details[ConfProperties::Nameserver::URI] = this->RingNS.uri;
details[ConfProperties::Nameserver::ACCOUNT] = this->RingNS.account;
// Manager
details[ConfProperties::MANAGER_URI] = this->managerUri;
details[ConfProperties::MANAGER_USERNAME] = this->managerUsername;

View File

@ -236,18 +236,18 @@ getLinkDeviceString(DeviceLinkError error)
switch (error) {
case DeviceLinkError::WRONG_DEVICE_PASSWORD:
return QObject::tr(
"An authentication error occurred.\nPlease check credentials and try again.");
"An authentication error occurred while linking the device. Please check credentials and try again.");
case DeviceLinkError::NETWORK:
return QObject::tr("A network error occurred.\nPlease verify your connection.");
return QObject::tr("A network error occurred while linking the account. Please verify your connection and try again.");
case DeviceLinkError::TIMEOUT:
return QObject::tr("The operation has timed out.\nPlease try again.");
return QObject::tr("The operation timed out. Please try again.");
case DeviceLinkError::STATE:
return QObject::tr("An error occurred while exporting the account.\nPlease try again.");
return QObject::tr("An error occurred while exporting the account. Please try again.");
case DeviceLinkError::CANCELED:
return QObject::tr("Operation was canceled.");
return QObject::tr("The operation was canceled by the user.");
case DeviceLinkError::UNKNOWN:
default:
return QObject::tr("An unexpected error occurred.\nPlease try again.");
return QObject::tr("An unexpected error occurred while linking the device. Please try again.");
}
}

View File

@ -307,21 +307,31 @@ getFormattedCallDuration(const std::time_t duration)
{
if (duration == 0)
return {};
std::string formattedString;
auto minutes = duration / 60;
auto seconds = duration % 60;
if (minutes > 0) {
formattedString += std::to_string(minutes) + ":";
if (formattedString.length() == 2) {
formattedString = "0" + formattedString;
}
int minutes = duration / 60;
int seconds = duration % 60;
int hours = minutes / 60;
int days = hours / 24;
if (days > 0) {
hours = hours % 24;
minutes = minutes % 60;
return QString("%1d %2h %3m %4s")
.arg(days)
.arg(hours)
.arg(minutes, 2, 10, QChar('0'))
.arg(seconds, 2, 10, QChar('0'));
} 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'));
} else if (minutes > 0) {
return QString("%1m %2s").arg(minutes).arg(seconds, 2, 10, QChar('0'));
} else {
formattedString += "00:";
return QString("%1s").arg(seconds);
}
if (seconds < 10)
formattedString += "0";
formattedString += std::to_string(seconds);
return QString::fromStdString(formattedString);
}
/**

View File

@ -120,6 +120,7 @@ function(setup_test TEST_NAME TEST_SOURCES TEST_INPUT)
target_link_libraries(${TEST_BINARY_NAME} ${ALL_TESTS_LIBS})
target_include_directories(${TEST_BINARY_NAME} PUBLIC ${ALL_TESTS_INCLUDES})
if(MSVC)
string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE)
set_target_properties(${TEST_BINARY_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_${BUILD_TYPE} ${OUTPUT_DIRECTORY})
endif()