mirror of
				https://git.jami.net/savoirfairelinux/jami-client-qt.git
				synced 2025-10-30 07:53:33 +08:00 
			
		
		
		
	Compare commits
	
		
			29 Commits
		
	
	
		
			nightly/20
			...
			ca02cf172a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| ca02cf172a | |||
| ba44b70f97 | |||
| 87e38c2bf5 | |||
| 98a300d36f | |||
| 5ac31130d0 | |||
| 9c11ec6233 | |||
| c9ab1a8e24 | |||
| 76e1bd9eb1 | |||
| ffb20d6767 | |||
| 87e63724c3 | |||
| 9fad769040 | |||
| 4106b8c752 | |||
| fd6e733433 | |||
| ee0a754b6a | |||
| 9278919410 | |||
| 8c1b79a86c | |||
| 3e6108f167 | |||
| 22be4be864 | |||
| bb359f851b | |||
| 36730480aa | |||
| e7d626a421 | |||
| 185869824a | |||
| 9858891fea | |||
| be7ec378c8 | |||
| cbed58544f | |||
| c642c1ddfa | |||
| aa8c1edbd4 | |||
| 2a28438275 | |||
| 92945ad29f | 
| @ -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) | ||||
|  | ||||
							
								
								
									
										22
									
								
								INSTALL.md
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								INSTALL.md
									
									
									
									
									
								
							| @ -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 | ||||
|  | ||||
							
								
								
									
										5
									
								
								build.py
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								build.py
									
									
									
									
									
								
							| @ -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
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								daemon
									
									
									
									
									
								
							 Submodule daemon updated: 7fb78a0b06...c53658e211
									
								
							| @ -41,7 +41,6 @@ set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib;.so;.dll") | ||||
| set(LIBJAMI_NAMES | ||||
|   jami-core | ||||
|   jami | ||||
|   ring | ||||
| ) | ||||
|  | ||||
| if(WITH_DAEMON_SUBMODULE) | ||||
|  | ||||
| @ -164,7 +164,6 @@ DISTRIBUTIONS := \ | ||||
| 	debian_12 \ | ||||
| 	debian_testing \ | ||||
| 	debian_unstable \ | ||||
| 	ubuntu_20.04 \ | ||||
| 	ubuntu_22.04 \ | ||||
| 	ubuntu_24.04 \ | ||||
| 	ubuntu_25.04 \ | ||||
|  | ||||
| @ -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"] | ||||
| @ -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 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
|  | ||||
| @ -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* | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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}") | ||||
|  | ||||
| @ -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 | ||||
|     ( | ||||
|  | ||||
| @ -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 | 
| @ -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 | ||||
|  | ||||
| /* | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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 { | ||||
|  | ||||
| @ -117,7 +117,7 @@ Window { | ||||
|             } | ||||
|             ListElement { | ||||
|                 shortcut: "Ctrl+Y" | ||||
|                 description: qsTr("Answer incoming call") | ||||
|                 description: qsTr("Accept call") | ||||
|             } | ||||
|             ListElement { | ||||
|                 shortcut: "Ctrl+D" | ||||
|  | ||||
| @ -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; | ||||
|     } | ||||
|  | ||||
| @ -46,7 +46,7 @@ Item { | ||||
|     property string buildID: qsTr("Build ID") | ||||
|     property string version: qsTr("Version") | ||||
|     property string declarationYear: "Copyright © 2015–2025" | ||||
|     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.") | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
| @ -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()); | ||||
|                 }) | ||||
|         } | ||||
|  | ||||
| @ -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()); | ||||
|                 }) | ||||
|         } | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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() | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
| @ -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); | ||||
| } | ||||
|  | ||||
| @ -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 : ""); | ||||
|                     } | ||||
|  | ||||
| @ -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: { | ||||
|  | ||||
| @ -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() | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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."); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -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); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  | ||||
| @ -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() | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	