From bf51c42b8beb9627cd718f3bf45441eae36a1c6c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Thu, 23 Nov 2023 13:47:28 -0500
Subject: [PATCH] build: fix CI on android

This patch is far from perfect, but at least CI is fixed.
I opened other tickets to describe the TODO list.

Update Dockerfile to not use a random image
Avoid to build ffmpeg multiple times as it's already built in contrib.
Update android tools.
Update daemon
Start jenkinsfile
Remove useless version/branchVersion as it's in the manifest now

Change-Id: Ia64b18ac861a7839e40e83b36c0595534719cb89
---
 AudioFilter/build.sh                  |  31 ++--
 AutoAnswer/build.sh                   |  16 +-
 GreenScreen/build.sh                  |  35 +++--
 HelloWorld/build.sh                   |  16 +-
 README_ASSEMBLE.md                    |  10 +-
 SDK/Templates/build.sh                |  16 +-
 TensorflowSegmentation/build.sh       |  16 +-
 TestSuite/build.sh                    |  16 +-
 WaterMark/build.sh                    |  31 ++--
 WhisperTranscript/build.sh            |  29 ++--
 contrib/build-dependencies.sh         |  12 +-
 contrib/install-cmake.sh              |  15 ++
 daemon                                |   2 +-
 docker/Dockerfile_android_onnxruntime |  39 +++--
 extras/ci/android/Jenkinsfile         | 216 +++++++++++++++++++++-----
 extras/ci/gnulinux/Jenkinsfile        |   2 +-
 16 files changed, 338 insertions(+), 164 deletions(-)
 create mode 100755 contrib/install-cmake.sh

diff --git a/AudioFilter/build.sh b/AudioFilter/build.sh
index 1e013b2..7e70a0f 100755
--- a/AudioFilter/build.sh
+++ b/AudioFilter/build.sh
@@ -13,7 +13,7 @@ EXTRAPATH=''
 
 
 if [ -z "${DAEMON}" ]; then
-    DAEMON="./../daemon"
+    DAEMON=${DAEMON:="./../daemon"}
     echo "DAEMON not provided, building with ${DAEMON}"
 fi
 
@@ -59,7 +59,7 @@ while getopts t:c:p:d OPT; do
   esac
 done
 
-cp -r ffmpeg ${CONTRIB_PATH}/src/
+#cp -r ffmpeg ${CONTRIB_PATH}/src/
 cp -r ../contrib/mp3lame ${CONTRIB_PATH}/src/
 
 if [ "${PLATFORM}" = "linux-gnu" ] || [ "${PLATFORM}" = "redhat-linux" ]
@@ -195,7 +195,7 @@ then
     python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME} --distribution=${PLATFORM}
 
     if [ -z "$ANDROID_NDK" ]; then
-            ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/21.1.6352462"
+            ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/26.1.10909125"
         echo "ANDROID_NDK not provided, building with ${ANDROID_NDK}"
     fi
 
@@ -225,18 +225,18 @@ then
 
         if [ "$CURRENT_ABI" = armeabi-v7a ]
         then
-        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
-        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++
+        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang
+        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang++
 
         elif [ "$CURRENT_ABI" = arm64-v8a ]
         then
-        export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
-        export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
+        export CC=$TOOLCHAIN/bin/aarch64-linux-android24-clang
+        export CXX=$TOOLCHAIN/bin/aarch64-linux-android24-clang++
 
         elif [ "$CURRENT_ABI" = x86_64 ]
         then
-        export CC=$TOOLCHAIN/bin/x86_64-linux-android21-clang
-        export CXX=$TOOLCHAIN/bin/x86_64-linux-android21-clang++
+        export CC=$TOOLCHAIN/bin/x86_64-linux-android24-clang
+        export CXX=$TOOLCHAIN/bin/x86_64-linux-android24-clang++
 
         else
         echo "ABI NOT OK" >&2
@@ -262,13 +262,14 @@ then
         #NDK SOURCES FOR cpufeatures
         NDK_SOURCES=${ANDROID_NDK}/sources/android
 
-        if [ -f "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/.ffmpeg" ]; then
-            rm "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/.ffmpeg"
-        fi
+        #if [ -f "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/.ffmpeg" ]; then
+        #    rm "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/.ffmpeg"
+        #fi
         WORKPATH=$(pwd)
-        cd "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/"
-        make .ffmpeg -j$(nproc)
-        rm .ffmpeg
+        #cd "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/"
+        #make .opus -j$(nproc)
+        #make .ffmpeg -j$(nproc)
+        #rm .ffmpeg
         cd ${WORKPATH}
 
         #=========================================================
diff --git a/AutoAnswer/build.sh b/AutoAnswer/build.sh
index d7acf54..ab5552b 100755
--- a/AutoAnswer/build.sh
+++ b/AutoAnswer/build.sh
@@ -12,7 +12,7 @@ EXTRAPATH=''
 # -d: debug program.
 
 if [ -z "${DAEMON}" ]; then
-    DAEMON="./../daemon"
+    DAEMON=${DAEMON:="./../daemon"}
     echo "DAEMON not provided, building with ${DAEMON}"
 fi
 
@@ -115,7 +115,7 @@ then
     python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME} --distribution=${PLATFORM}
 
     if [ -z "$ANDROID_NDK" ]; then
-            ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/21.1.6352462"
+            ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/26.1.10909125"
         echo "ANDROID_NDK not provided, building with ${ANDROID_NDK}"
     fi
 
@@ -145,18 +145,18 @@ then
 
         if [ "$CURRENT_ABI" = armeabi-v7a ]
         then
-        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
-        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++
+        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang
+        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang++
 
         elif [ "$CURRENT_ABI" = arm64-v8a ]
         then
-        export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
-        export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
+        export CC=$TOOLCHAIN/bin/aarch64-linux-android24-clang
+        export CXX=$TOOLCHAIN/bin/aarch64-linux-android24-clang++
 
         elif [ "$CURRENT_ABI" = x86_64 ]
         then
-        export CC=$TOOLCHAIN/bin/x86_64-linux-android21-clang
-        export CXX=$TOOLCHAIN/bin/x86_64-linux-android21-clang++
+        export CC=$TOOLCHAIN/bin/x86_64-linux-android24-clang
+        export CXX=$TOOLCHAIN/bin/x86_64-linux-android24-clang++
 
         else
         echo "ABI NOT OK" >&2
diff --git a/GreenScreen/build.sh b/GreenScreen/build.sh
index 1b3422d..1273e44 100755
--- a/GreenScreen/build.sh
+++ b/GreenScreen/build.sh
@@ -1,6 +1,7 @@
 #! /bin/bash
 # Build the plugin for the project
 set -e
+set -x
 export OSTYPE
 ARCH=$(uname -m)
 EXTRAPATH=''
@@ -12,7 +13,7 @@ EXTRAPATH=''
 # -d: debug program.
 
 if [ -z "${DAEMON}" ]; then
-    DAEMON="./../daemon"
+    DAEMON=${DAEMON:="./../daemon"}
     echo "DAEMON not provided, building with ${DAEMON}"
 fi
 if [ -z "${PROCESSOR}" ]; then
@@ -73,7 +74,7 @@ while getopts t:c:p:d OPT; do
   esac
 done
 
-cp -r ffmpeg ${CONTRIB_PATH}/src/
+#cp -r ffmpeg ${CONTRIB_PATH}/src/
 cp -r ../contrib/rav1e ${CONTRIB_PATH}/src/
 
 if [ "${PLATFORM}" = "linux-gnu" ] || [ "${PLATFORM}" = "redhat-linux" ]
@@ -272,7 +273,7 @@ then
     python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME} --distribution=${PLATFORM}
 
     if [ -z "$ANDROID_NDK" ]; then
-        ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/21.1.6352462"
+        ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/26.1.10909125"
         echo "ANDROID_NDK not provided, building with ${ANDROID_NDK}"
     fi
 
@@ -302,18 +303,18 @@ then
 
         if [ "$CURRENT_ABI" = armeabi-v7a ]
         then
-        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
-        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++
+        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang
+        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang++
 
         elif [ "$CURRENT_ABI" = arm64-v8a ]
         then
-        export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
-        export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
+        export CC=$TOOLCHAIN/bin/aarch64-linux-android24-clang
+        export CXX=$TOOLCHAIN/bin/aarch64-linux-android24-clang++
 
         elif [ "$CURRENT_ABI" = x86_64 ]
         then
-        export CC=$TOOLCHAIN/bin/x86_64-linux-android21-clang
-        export CXX=$TOOLCHAIN/bin/x86_64-linux-android21-clang++
+        export CC=$TOOLCHAIN/bin/x86_64-linux-android24-clang
+        export CXX=$TOOLCHAIN/bin/x86_64-linux-android24-clang++
 
         else
         echo "ABI NOT OK" >&2
@@ -339,14 +340,15 @@ then
         #NDK SOURCES FOR cpufeatures
         NDK_SOURCES=${ANDROID_NDK}/sources/android
 
-        if [ -f "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/.ffmpeg" ]; then
-            rm "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/.ffmpeg"
-        fi
+        #if [ -f "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/.ffmpeg" ]; then
+        #    rm "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/.ffmpeg"
+        #fi
 
         WORKPATH=$(pwd)
-        cd "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/"
-        make .ffmpeg -j$(nproc)
-        rm .ffmpeg
+        #cd "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/"
+        #make .opus -j$(nproc)
+        #make .ffmpeg -j$(nproc)
+        #rm .ffmpeg
         cd ${WORKPATH}
 
         #=========================================================
@@ -364,6 +366,9 @@ then
           ONNX_PATH="${CONTRIB_PATH}/${CONTRIB_PLATFORM}"
         fi
 
+        # DIRTY HACK TO GET WORKING ONNX
+        cp ${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/onnx/build/Linux/Release/*.so ${CONTRIB_PATH}/${CONTRIB_PLATFORM}/lib/ || true
+
         # Create so destination folder
         $CXX --std=c++17 -O3 -fPIC \
         -Wl,-Bsymbolic,-rpath,"\${ORIGIN}" \
diff --git a/HelloWorld/build.sh b/HelloWorld/build.sh
index 5f630ee..a06b18a 100755
--- a/HelloWorld/build.sh
+++ b/HelloWorld/build.sh
@@ -12,7 +12,7 @@ EXTRAPATH=''
 
 
 if [ -z "${DAEMON}" ]; then
-    DAEMON="./../daemon"
+    DAEMON=${DAEMON:="./../daemon"}
     echo "DAEMON not provided, building with ${DAEMON}"
 fi
 
@@ -142,7 +142,7 @@ then
     python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME} --distribution=${PLATFORM}
 
     if [ -z "$ANDROID_NDK" ]; then
-            ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/21.1.6352462"
+            ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/26.1.10909125"
         echo "ANDROID_NDK not provided, building with ${ANDROID_NDK}"
     fi
 
@@ -172,18 +172,18 @@ then
 
         if [ "$CURRENT_ABI" = armeabi-v7a ]
         then
-        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
-        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++
+        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang
+        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang++
 
         elif [ "$CURRENT_ABI" = arm64-v8a ]
         then
-        export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
-        export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
+        export CC=$TOOLCHAIN/bin/aarch64-linux-android24-clang
+        export CXX=$TOOLCHAIN/bin/aarch64-linux-android24-clang++
 
         elif [ "$CURRENT_ABI" = x86_64 ]
         then
-        export CC=$TOOLCHAIN/bin/x86_64-linux-android21-clang
-        export CXX=$TOOLCHAIN/bin/x86_64-linux-android21-clang++
+        export CC=$TOOLCHAIN/bin/x86_64-linux-android24-clang
+        export CXX=$TOOLCHAIN/bin/x86_64-linux-android24-clang++
 
         else
         echo "ABI NOT OK" >&2
diff --git a/README_ASSEMBLE.md b/README_ASSEMBLE.md
index 39ca518..5eddb31 100644
--- a/README_ASSEMBLE.md
+++ b/README_ASSEMBLE.md
@@ -11,7 +11,7 @@ For Android:
 
         export ANDROID_NDK=<NDK>
         export ANDROID_ABI=arm64-v8a
-        export ANDROID_API=29
+        export ANDROID_API=24
         export TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64
         export TARGET=aarch64-linux-android
         export CC=$TOOLCHAIN/bin/$TARGET$ANDROID_API-clang
@@ -72,9 +72,9 @@ For Linux:
     or
     For Tensorflow C++ API:
     $ bazel build --config=v1 --define framework_shared_object=false //tensorflow:libtensorflow_cc.so
-    
-    OBS.: If you want to build Tensorflow C++ API with GPU suport, be sure to have a CUDA capable GPU and that you have 
-    followed all installation steps for the Nvidia drivers, CUDA Toolkit, CUDNN, Tensor RT, that their versions 
+
+    OBS.: If you want to build Tensorflow C++ API with GPU suport, be sure to have a CUDA capable GPU and that you have
+    followed all installation steps for the Nvidia drivers, CUDA Toolkit, CUDNN, Tensor RT, that their versions
     matches and that they are correct for the Tensorflow version you want to build. The following links may be very helpfull:
         - https://www.tensorflow.org/install/source
         - https://developer.nvidia.com/cuda-gpus
@@ -196,7 +196,7 @@ TENSORFLOW C++ API INCLUDES ASSEMBLE INSTRUCTIONS
                     third_party/
                         eigen3/
                             Eigen/
-                                -> keep folder structure and copy all files from 
+                                -> keep folder structure and copy all files from
                                 "<tensorflow>/bazel-tensorflow/external/eigen_archive/Eigen/"
                             unsupported/
                                 Eigen/
diff --git a/SDK/Templates/build.sh b/SDK/Templates/build.sh
index 7dfadbf..99c6253 100644
--- a/SDK/Templates/build.sh
+++ b/SDK/Templates/build.sh
@@ -12,7 +12,7 @@ EXTRAPATH=''
 
 
 if [ -z "${DAEMON}" ]; then
-    DAEMON="./../daemon"
+    DAEMON=${DAEMON:="./../daemon"}
     echo "DAEMON not provided, building with ${DAEMON}"
 fi
 
@@ -84,7 +84,7 @@ then
     python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME} --distribution=${PLATFORM}
 
     if [ -z "$ANDROID_NDK" ]; then
-            ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/21.1.6352462"
+            ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/26.1.10909125"
         echo "ANDROID_NDK not provided, building with ${ANDROID_NDK}"
     fi
 
@@ -114,18 +114,18 @@ then
 
         if [ "$CURRENT_ABI" = armeabi-v7a ]
         then
-        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
-        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++
+        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang
+        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang++
 
         elif [ "$CURRENT_ABI" = arm64-v8a ]
         then
-        export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
-        export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
+        export CC=$TOOLCHAIN/bin/aarch64-linux-android24-clang
+        export CXX=$TOOLCHAIN/bin/aarch64-linux-android24-clang++
 
         elif [ "$CURRENT_ABI" = x86_64 ]
         then
-        export CC=$TOOLCHAIN/bin/x86_64-linux-android21-clang
-        export CXX=$TOOLCHAIN/bin/x86_64-linux-android21-clang++
+        export CC=$TOOLCHAIN/bin/x86_64-linux-android24-clang
+        export CXX=$TOOLCHAIN/bin/x86_64-linux-android24-clang++
 
         else
         echo "ABI NOT OK" >&2
diff --git a/TensorflowSegmentation/build.sh b/TensorflowSegmentation/build.sh
index c27817f..8e5d8f2 100755
--- a/TensorflowSegmentation/build.sh
+++ b/TensorflowSegmentation/build.sh
@@ -12,7 +12,7 @@ EXTRAPATH=''
 
 
 if [ -z "${DAEMON}" ]; then
-    DAEMON="./../daemon"
+    DAEMON=${DAEMON:="./../daemon"}
     echo "DAEMON not provided, building with ${DAEMON}"
 fi
 
@@ -186,7 +186,7 @@ then
         python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME} --distribution=${PLATFORM}
 
         if [ -z "$ANDROID_NDK" ]; then
-             ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/21.1.6352462"
+             ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/26.1.10909125"
             echo "ANDROID_NDK not provided, building with ${ANDROID_NDK}"
         fi
 
@@ -216,18 +216,18 @@ then
 
             if [ "$CURRENT_ABI" = armeabi-v7a ]
             then
-            export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
-            export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++
+            export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang
+            export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang++
 
             elif [ "$CURRENT_ABI" = arm64-v8a ]
             then
-            export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
-            export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
+            export CC=$TOOLCHAIN/bin/aarch64-linux-android24-clang
+            export CXX=$TOOLCHAIN/bin/aarch64-linux-android24-clang++
 
             elif [ "$CURRENT_ABI" = x86_64 ]
             then
-            export CC=$TOOLCHAIN/bin/x86_64-linux-android21-clang
-            export CXX=$TOOLCHAIN/bin/x86_64-linux-android21-clang++
+            export CC=$TOOLCHAIN/bin/x86_64-linux-android24-clang
+            export CXX=$TOOLCHAIN/bin/x86_64-linux-android24-clang++
 
             else
             echo "ABI NOT OK" >&2
diff --git a/TestSuite/build.sh b/TestSuite/build.sh
index 8f27b90..1ca8707 100755
--- a/TestSuite/build.sh
+++ b/TestSuite/build.sh
@@ -12,7 +12,7 @@ EXTRAPATH=''
 
 
 if [ -z "${DAEMON}" ]; then
-    DAEMON="./../daemon"
+    DAEMON=${DAEMON:="./../daemon"}
     echo "DAEMON not provided, building with ${DAEMON}"
 fi
 
@@ -135,7 +135,7 @@ then
     python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME} --distribution=${PLATFORM}
 
     if [ -z "$ANDROID_NDK" ]; then
-            ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/21.1.6352462"
+            ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/26.1.10909125"
         echo "ANDROID_NDK not provided, building with ${ANDROID_NDK}"
     fi
 
@@ -165,18 +165,18 @@ then
 
         if [ "$CURRENT_ABI" = armeabi-v7a ]
         then
-        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
-        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++
+        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang
+        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang++
 
         elif [ "$CURRENT_ABI" = arm64-v8a ]
         then
-        export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
-        export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
+        export CC=$TOOLCHAIN/bin/aarch64-linux-android24-clang
+        export CXX=$TOOLCHAIN/bin/aarch64-linux-android24-clang++
 
         elif [ "$CURRENT_ABI" = x86_64 ]
         then
-        export CC=$TOOLCHAIN/bin/x86_64-linux-android21-clang
-        export CXX=$TOOLCHAIN/bin/x86_64-linux-android21-clang++
+        export CC=$TOOLCHAIN/bin/x86_64-linux-android24-clang
+        export CXX=$TOOLCHAIN/bin/x86_64-linux-android24-clang++
 
         else
         echo "ABI NOT OK" >&2
diff --git a/WaterMark/build.sh b/WaterMark/build.sh
index 4c2f37d..1c7c2d0 100755
--- a/WaterMark/build.sh
+++ b/WaterMark/build.sh
@@ -13,7 +13,7 @@ EXTRAPATH=''
 
 
 if [ -z "${DAEMON}" ]; then
-    DAEMON="./../daemon"
+    DAEMON=${DAEMON:="./../daemon"}
     echo "DAEMON not provided, building with ${DAEMON}"
 fi
 
@@ -59,7 +59,7 @@ while getopts t:c:p:d OPT; do
   esac
 done
 
-cp -r ffmpeg ${CONTRIB_PATH}/src/
+#cp -r ffmpeg ${CONTRIB_PATH}/src/
 cp -r ../contrib/rav1e ${CONTRIB_PATH}/src/
 
 if [ "${PLATFORM}" = "linux-gnu" ] || [ "${PLATFORM}" = "redhat-linux" ]
@@ -200,7 +200,7 @@ then
     python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME} --distribution=${PLATFORM}
 
     if [ -z "$ANDROID_NDK" ]; then
-            ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/21.1.6352462"
+            ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/26.1.10909125"
         echo "ANDROID_NDK not provided, building with ${ANDROID_NDK}"
     fi
 
@@ -230,18 +230,18 @@ then
 
         if [ "$CURRENT_ABI" = armeabi-v7a ]
         then
-        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
-        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++
+        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang
+        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang++
 
         elif [ "$CURRENT_ABI" = arm64-v8a ]
         then
-        export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
-        export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
+        export CC=$TOOLCHAIN/bin/aarch64-linux-android24-clang
+        export CXX=$TOOLCHAIN/bin/aarch64-linux-android24-clang++
 
         elif [ "$CURRENT_ABI" = x86_64 ]
         then
-        export CC=$TOOLCHAIN/bin/x86_64-linux-android21-clang
-        export CXX=$TOOLCHAIN/bin/x86_64-linux-android21-clang++
+        export CC=$TOOLCHAIN/bin/x86_64-linux-android24-clang
+        export CXX=$TOOLCHAIN/bin/x86_64-linux-android24-clang++
 
         else
         echo "ABI NOT OK" >&2
@@ -264,14 +264,15 @@ then
         CONTRIB_PLATFORM=x86_64-linux-android
         fi
 
-        if [ -f "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/.ffmpeg" ]; then
-            rm "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/.ffmpeg"
-        fi
+        #if [ -f "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/.ffmpeg" ]; then
+        #    rm "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/.ffmpeg"
+        #fi
 
         WORKPATH=$(pwd)
-        cd "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/"
-        make .ffmpeg -j$(nproc)
-        rm .ffmpeg
+        #cd "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/"
+        #make .opus -j$(nproc)
+        #make .ffmpeg -j$(nproc)
+        #rm .ffmpeg
         cd ${WORKPATH}
 
         #=========================================================
diff --git a/WhisperTranscript/build.sh b/WhisperTranscript/build.sh
index 6207e9e..365a82c 100755
--- a/WhisperTranscript/build.sh
+++ b/WhisperTranscript/build.sh
@@ -12,10 +12,10 @@ EXTRAPATH=''
 # -d: debug program.
 
 if [ -z "${DAEMON}" ]; then
+    DAEMON=${DAEMON:="./../daemon"}
     echo "DAEMON not provided, building with ./../daemon"
 fi
 
-DAEMON=${DAEMON:="./../daemon"}
 CONTRIB_PATH=${CONTRIB_PATH:="${DAEMON}/contrib"}
 CONTRIB_BUILD_DIR=${CONTRIB_BUILD_DIR:="native"}
 
@@ -76,7 +76,7 @@ fi
 
 echo $PROCESSOR
 
-cp -r ffmpeg ${CONTRIB_PATH}/src/
+#cp -r ffmpeg ${CONTRIB_PATH}/src/
 cp -r whispercpp ${CONTRIB_PATH}/src/
 cp -r ../contrib/rav1e ${CONTRIB_PATH}/src/
 
@@ -256,7 +256,7 @@ then
     python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME} --distribution=${PLATFORM}
 
     if [ -z "$ANDROID_NDK" ]; then
-            ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/21.1.6352462"
+            ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/26.1.10909125"
         echo "ANDROID_NDK not provided, building with ${ANDROID_NDK}"
     fi
 
@@ -286,18 +286,18 @@ then
 
         if [ "$CURRENT_ABI" = armeabi-v7a ]
         then
-        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
-        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++
+        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang
+        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang++
 
         elif [ "$CURRENT_ABI" = arm64-v8a ]
         then
-        export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
-        export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
+        export CC=$TOOLCHAIN/bin/aarch64-linux-android24-clang
+        export CXX=$TOOLCHAIN/bin/aarch64-linux-android24-clang++
 
         elif [ "$CURRENT_ABI" = x86_64 ]
         then
-        export CC=$TOOLCHAIN/bin/x86_64-linux-android21-clang
-        export CXX=$TOOLCHAIN/bin/x86_64-linux-android21-clang++
+        export CC=$TOOLCHAIN/bin/x86_64-linux-android24-clang
+        export CXX=$TOOLCHAIN/bin/x86_64-linux-android24-clang++
 
         else
         echo "ABI NOT OK" >&2
@@ -320,16 +320,17 @@ then
         CONTRIB_PLATFORM=x86_64-linux-android
         fi
 
-        if [ -f "${CONTRIB_BUILD_PATH}-${CONTRIB_PLATFORM}/.ffmpeg" ]; then
-            rm "${CONTRIB_BUILD_PATH}-${CONTRIB_PLATFORM}/.ffmpeg"
-        fi
+        #if [ -f "${CONTRIB_BUILD_PATH}-${CONTRIB_PLATFORM}/.ffmpeg" ]; then
+        #    rm "${CONTRIB_BUILD_PATH}-${CONTRIB_PLATFORM}/.ffmpeg"
+        #fi
 
         WORKPATH=$(pwd)
         cd "${CONTRIB_BUILD_PATH}-${CONTRIB_PLATFORM}/"
-        make .ffmpeg -j$(nproc)
+        #make .opus -j$(nproc)
+        #make .ffmpeg -j$(nproc)
         make .whispercpp -j$(nproc)
         rm .whispercpp
-        rm .ffmpeg
+        #rm .ffmpeg
         cd ${WORKPATH}
 
         #=========================================================
diff --git a/contrib/build-dependencies.sh b/contrib/build-dependencies.sh
index 1009ae5..ca95ecb 100755
--- a/contrib/build-dependencies.sh
+++ b/contrib/build-dependencies.sh
@@ -42,7 +42,7 @@ fi
 
 TARGET_CC=${TARGET_CC:-$TARGET}
 
-export API=21
+export API=24 # This value is from minSDK in jami-client-android
 export ANDROID_API=android-$API
 export ANDROID_TOOLCHAIN="${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64"
 export TARGET
@@ -81,7 +81,7 @@ fi
 cd $DAEMON_DIR/extras/tools
 export PATH=`pwd`/build/bin:$PATH
 echo "Building tools"
-./bootstrap
+./bootstrap # --cache-dir=/var/cache/jami --cache-builds
 make $MAKEFLAGS
 make .pkg-config
 make .gas
@@ -98,7 +98,7 @@ export STRIP=$NDK_TOOLCHAIN_PATH/llvm-strip
 FLAGS_COMMON="-fPIC"
 EXTRA_CFLAGS="${EXTRA_CFLAGS} ${FLAGS_COMMON}"
 EXTRA_CXXFLAGS="${EXTRA_CXXFLAGS} ${FLAGS_COMMON}"
-EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -llog"
+EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -llog ${FLAGS_COMMON}"
 
 ############
 # Contribs #
@@ -114,7 +114,7 @@ cp -r ${CURRENTDIR}/freetype ${DAEMON_DIR}/contrib/src
 
 cd ${CONTRIB_DIR}
 
-../bootstrap --host=${TARGET} --enable-freetype --enable-x264 --enable-ffmpeg \
+../bootstrap --host=${TARGET} --enable-freetype --disable-x264 --enable-ffmpeg \
              --disable-webrtc-audio-processing --disable-argon2 \
              --disable-asio --enable-fmt --disable-gcrypt --disable-gmp \
              --disable-gnutls --disable-gpg-error --disable-gsm \
@@ -122,8 +122,8 @@ cd ${CONTRIB_DIR}
              --disable-libarchive --disable-libressl --enable-msgpack \
              --disable-natpmp --disable-nettle --enable-opencv --enable-opendht \
              --disable-pjproject --disable-portaudio --disable-restinio \
-             --disable-secp256k1 --disable-speexdsp --disable-upnp \
-             --disable-uuid --disable-yaml-cpp
+             --disable-secp256k1 --disable-speex --disable-speexdsp --disable-upnp \
+             --disable-uuid --disable-yaml-cpp --enable-onnx --disable-dhtnet --enable-opus #  \ --cache-dir=/var/cache/jami --cache-builds
 
 make list
 make fetch
diff --git a/contrib/install-cmake.sh b/contrib/install-cmake.sh
new file mode 100755
index 0000000..ea07269
--- /dev/null
+++ b/contrib/install-cmake.sh
@@ -0,0 +1,15 @@
+#!/usr/bin/env bash
+
+set -e
+
+if command -v apt-get &> /dev/null
+then
+    apt-get remove cmake cmake-data -y
+fi
+
+wget https://github.com/Kitware/CMake/releases/download/v3.27.8/cmake-3.27.8-Linux-x86_64.sh \
+      -q -O /tmp/cmake-install.sh
+echo "c43e9237360f8cb227c721bb7cd497f80cff692a7dc0ab10d258f4c22d6aec04  /tmp/cmake-install.sh" | sha256sum --check
+chmod u+x /tmp/cmake-install.sh
+/tmp/cmake-install.sh --skip-license --prefix=/usr/local/
+rm /tmp/cmake-install.sh
\ No newline at end of file
diff --git a/daemon b/daemon
index 6c433a0..4392c72 160000
--- a/daemon
+++ b/daemon
@@ -1 +1 @@
-Subproject commit 6c433a087a0d24cb95aae3bdcaeee5e367e46a5d
+Subproject commit 4392c72206b3a7c5f294fc187b2f6904e660890e
diff --git a/docker/Dockerfile_android_onnxruntime b/docker/Dockerfile_android_onnxruntime
index 99d0a56..91f2abc 100644
--- a/docker/Dockerfile_android_onnxruntime
+++ b/docker/Dockerfile_android_onnxruntime
@@ -1,14 +1,12 @@
-FROM sflagsantos/onnxruntime1.12.0-android
+FROM gradle:jdk17
 
 ENV DEBIAN_FRONTEND noninteractive
-ENV EXTRALIBS_PATH=/home/gradle/Libs/onnxruntime/
 ENV SSH_AUTH_SOCK /home/gradle/.sockets/ssh
 
 ENV LANG en_US.utf8
 ENV LC_ALL en_US.utf8
 
 RUN apt-get update && apt-get install -y --no-install-recommends \
-        clang \
 	asciidoc \
 	autogen \
 	automake \
@@ -16,7 +14,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
 	autopoint \
 	gettext \
 	ca-certificates \
+	clang \
 	cmake \
+	default-jre \
 	bc \
 	bison \
 	build-essential \
@@ -39,38 +39,51 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
 	yasm \
 	nasm \
 	zip \
+	libpcre2-dev \
 	libpcre3 \
 	libpcre3-dev \
+	libavcodec-dev \
+	libavutil-dev \
+	libavformat-dev \
+	libswscale-dev \
+	libavdevice-dev \
+	libopus-dev \
 	ruby ruby-dev \
-        python3-distutils \
+	python3-distutils \
 	&& locale-gen $LANG $LC_ALL && update-locale $LANG $LC_ALL
 
 # Android SDK tools
 RUN echo "prefer-family = IPv6" >> /etc/wgetrc
 ENV ANDROID_HOME=/opt/android-sdk
 ENV ANDROID_SDK_ROOT=${ANDROID_HOME}
-RUN wget -O /tmp/android-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip && \
+RUN wget -O /tmp/android-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip && \
 	mkdir -p ${ANDROID_HOME} && \
 	unzip -q -d ${ANDROID_HOME} /tmp/android-tools.zip && \
 	rm -f /tmp/android-tools.zip && \
 	chown -R root:root ${ANDROID_HOME}
 ENV PATH=${PATH}:${ANDROID_HOME}/cmdline-tools/bin
 
-# Swig 4.0.2
-RUN wget -O /tmp/swig.tar.gz https://github.com/swig/swig/archive/rel-4.0.2.tar.gz && \
+# CMake 3.26
+ADD contrib/install-cmake.sh /opt/install-cmake.sh
+RUN /opt/install-cmake.sh
+
+# Swig 4.1.1
+RUN wget -O /tmp/swig.tar.gz https://github.com/swig/swig/archive/v4.1.1.tar.gz && \
 	tar xzf  /tmp/swig.tar.gz -C /opt && \
-	cd /opt/swig-rel-4.0.2/ && ./autogen.sh && ./configure && make && make install && \
-	cd .. && rm -rf /opt/swig-rel-4.0.2 /tmp/swig.tar.gz
+	cd /opt/swig-4.1.1/ && ./autogen.sh && ./configure && make && make install && \
+	cd .. && rm -rf /opt/swig-4.1.1 /tmp/swig.tar.gz
 
 # Android SDK libraries, NDK
 RUN sdkmanager --sdk_root=${ANDROID_HOME} --update
-RUN (while sleep 1; do echo "y"; done) | sdkmanager --channel=1 --sdk_root=${ANDROID_HOME} 'build-tools;32.0.0' \
-	'platforms;android-32'\
+RUN (while sleep 1; do echo "y"; done) | sdkmanager --channel=1 --sdk_root=${ANDROID_HOME} 'build-tools;34.0.0' \
+	'platforms;android-34'\
 	'extras;android;m2repository'\
 	'extras;google;m2repository'\
-	'ndk;25.0.8775105'
+	'ndk;26.1.10909125'
 ENV ANDROID_SDK=${ANDROID_HOME}
-ENV ANDROID_NDK=${ANDROID_HOME}/ndk/25.0.8775105
+ENV ANDROID_NDK=${ANDROID_HOME}/ndk/26.1.10909125
+
+RUN chmod a+rX /home/gradle
 
 # Fastlane
 RUN gem install fastlane -NV
diff --git a/extras/ci/android/Jenkinsfile b/extras/ci/android/Jenkinsfile
index d6f4d7a..c8cced6 100644
--- a/extras/ci/android/Jenkinsfile
+++ b/extras/ci/android/Jenkinsfile
@@ -24,7 +24,7 @@
 pipeline {
     agent {
         node {
-            label 'jami-buildmachine-04.mtl.sfl'
+            label 'jami-buildmachine-02.mtl.sfl'
         }
     }
 
@@ -103,7 +103,7 @@ pipeline {
         stage('Building Docker Image') {
             steps {
                 script {
-                    docker.build('plugins-android', "-f docker/${dockerfile} --no-cache .")
+                    docker.build('plugins-android', "-f docker/${dockerfile} .")
                 }
             }
         }
@@ -111,16 +111,20 @@ pipeline {
         stage('Setup and Build Dependencies') {
             steps {
                 script {
-                    docker.image('plugins-android').withRun('-t -u '+jenkinsUser+' -v '+pwd()+':/home/gradle/jami:rw -e BATCH_MODE=1', '/bin/bash') {
+                    docker.image('plugins-android').withRun('-t -v '+pwd()+':/home/gradle/jami:rw -e BATCH_MODE=1', '/bin/bash') {
                         container -> code:{
-                            def base_cmd = 'docker exec -t '+container.id+" sh -c '"
-                            def exec_cmd = { cmd -> sh base_cmd+cmd+"'" }
+                            def base_cmd = 'docker exec -u '+jenkinsUser+' '+container.id+" sh -c '"
+                            def base_root_cmd = 'docker exec '+container.id+" sh -c '"
+                            def exec_cmd = { cmd -> sh script:base_cmd+cmd+"'" }
+                            def exec_root_cmd = { cmd -> sh script:base_root_cmd+cmd+"'" }
 
                             ansiColor('css') {
                                 exec_cmd("""
                                     cd ./jami/contrib
                                     python3 -m pip install -r ../SDK/requirements.txt
+                                    ANDROID_ABI="armeabi-v7a" sh build-dependencies.sh
                                     ANDROID_ABI="arm64-v8a" sh build-dependencies.sh
+                                    ANDROID_ABI="x86_64" sh build-dependencies.sh
                                 """)
                             }
                         }
@@ -133,23 +137,35 @@ pipeline {
             steps {
                 script {
                     if(env.GERRIT_TOPIC == "all" || env.GERRIT_TOPIC == "GreenScreen") {
-                        docker.image('plugins-android').withRun('-t -u '+jenkinsUser+' -v '+pwd()+':/home/gradle/jami:rw -e BATCH_MODE=1', '/bin/bash') {
+                        docker.image('plugins-android').withRun('-t -v '+pwd()+':/home/gradle/jami:rw -e BATCH_MODE=1', '/bin/bash') {
                             container -> code:{
-                                def base_cmd = 'docker exec -t '+container.id+" sh -c '"
-                                def exec_cmd = { cmd -> sh base_cmd+cmd+"'" }
+                                def base_cmd = 'docker exec -u '+jenkinsUser+' '+container.id+" sh -c '"
+                                def base_root_cmd = 'docker exec '+container.id+" sh -c '"
+                                def exec_cmd = { cmd -> sh script:base_cmd+cmd+"'" }
+                                def exec_root_cmd = { cmd -> sh script:base_root_cmd+cmd+"'" }
 
                                 ansiColor('css') {
                                     exec_cmd("""
                                         cd jami
-                                        AUTHOR="SFL" DIVISION="Internal" ANDROID_ABI="arm64-v8a" python3 build-plugin.py --projects="GreenScreen" --distribution="android"
+                                        ANDROID_ABI="armeabi-v7a arm64-v8a x86_64" python3 build-plugin.py --projects="GreenScreen" --distribution="android"
                                         """)
                                 }
                             }
                         }
-                        if (!fileExists("./build/android/GreenScreen.jpl")) {
-                            error "GreenScreen build output not found"
+                        if (env.ARCHIVE == 'false') {
+                            sshagent(credentials: [env.SSH_CREDENTIALS]) {
+                                // def sshPrivateKey = '/var/lib/jenkins/.ssh/gplpriv'
+                                def remoteHost = env.SSH_HOST_DL_RING_CX
+                                def remoteBaseDir = '/srv/repository/ring/plugins/GreenScreen/android'
+
+                                sh """
+                                    rsync --verbose build/android/GreenScreen.jpl ${remoteHost}:${remoteBaseDir}/archive/GreenScreen-\$(date '+%Y%m%d%H%M').jpl
+                                    rsync --verbose build/android/GreenScreen.jpl ${remoteHost}:${remoteBaseDir}/GreenScreen.jpl
+                                """
+                            }
+                        } else {
+                            archiveArtifacts 'build/android/GreenScreen.jpl'
                         }
-                        archiveArtifacts 'build/android/GreenScreen.jpl'
                     }
                 }
             }
@@ -159,23 +175,35 @@ pipeline {
             steps {
                 script {
                     if(env.GERRIT_TOPIC == "all" || env.GERRIT_TOPIC == "AudioFilter") {
-                        docker.image('plugins-android').withRun('-t -u '+jenkinsUser+' -v '+pwd()+':/home/gradle/jami:rw -e BATCH_MODE=1', '/bin/bash') {
+                        docker.image('plugins-android').withRun('-t -v '+pwd()+':/home/gradle/jami:rw -e BATCH_MODE=1', '/bin/bash') {
                             container -> code:{
-                                def base_cmd = 'docker exec -t '+container.id+" sh -c '"
-                                def exec_cmd = { cmd -> sh base_cmd+cmd+"'" }
+                                def base_cmd = 'docker exec -u '+jenkinsUser+' '+container.id+" sh -c '"
+                                def base_root_cmd = 'docker exec '+container.id+" sh -c '"
+                                def exec_cmd = { cmd -> sh script:base_cmd+cmd+"'" }
+                                def exec_root_cmd = { cmd -> sh script:base_root_cmd+cmd+"'" }
 
                                 ansiColor('css') {
                                     exec_cmd("""
                                         cd jami
-                                        AUTHOR="SFL" DIVISION="Internal" ANDROID_ABI="arm64-v8a" python3 build-plugin.py --projects="AudioFilter" --distribution="android"
+                                        ANDROID_ABI="armeabi-v7a arm64-v8a x86_64" python3 build-plugin.py --projects="AudioFilter" --distribution="android"
                                 """)
                                 }
                             }
                         }
-                        if (!fileExists("./build/android/AudioFilter.jpl")) {
-                            error "AudioFilter build output not found"
+                        if (env.ARCHIVE == 'false') {
+                            sshagent(credentials: [env.SSH_CREDENTIALS]) {
+                                // def sshPrivateKey = '/var/lib/jenkins/.ssh/gplpriv'
+                                def remoteHost = env.SSH_HOST_DL_RING_CX
+                                def remoteBaseDir = '/srv/repository/ring/plugins/AudioFilter/android'
+
+                                sh """
+                                    rsync --verbose build/android/AudioFilter.jpl ${remoteHost}:${remoteBaseDir}/archive/AudioFilter-\$(date '+%Y%m%d%H%M').jpl
+                                    rsync --verbose build/android/AudioFilter.jpl ${remoteHost}:${remoteBaseDir}/AudioFilter.jpl
+                                """
+                            }
+                        } else {
+                            archiveArtifacts 'build/android/AudioFilter.jpl'
                         }
-                        archiveArtifacts 'build/android/AudioFilter.jpl'
                     }
                 }
             }
@@ -185,23 +213,35 @@ pipeline {
             steps {
                 script {
                     if(env.GERRIT_TOPIC == "all" || env.GERRIT_TOPIC == "AutoAnswer") {
-                        docker.image('plugins-android').withRun('-t -u '+jenkinsUser+' -v '+pwd()+':/home/gradle/jami:rw -e BATCH_MODE=1', '/bin/bash') {
+                        docker.image('plugins-android').withRun('-t -v '+pwd()+':/home/gradle/jami:rw -e BATCH_MODE=1', '/bin/bash') {
                             container -> code:{
-                                def base_cmd = 'docker exec -t '+container.id+" sh -c '"
-                                def exec_cmd = { cmd -> sh base_cmd+cmd+"'" }
+                                def base_cmd = 'docker exec -u '+jenkinsUser+' '+container.id+" sh -c '"
+                                def base_root_cmd = 'docker exec '+container.id+" sh -c '"
+                                def exec_cmd = { cmd -> sh script:base_cmd+cmd+"'" }
+                                def exec_root_cmd = { cmd -> sh script:base_root_cmd+cmd+"'" }
 
                                 ansiColor('css') {
                                     exec_cmd("""
                                         cd jami
-                                        AUTHOR="SFL" DIVISION="Internal" ANDROID_ABI="arm64-v8a" python3 build-plugin.py --projects="AutoAnswer" --distribution="android"
+                                        ANDROID_ABI="armeabi-v7a arm64-v8a x86_64" python3 build-plugin.py --projects="AutoAnswer" --distribution="android"
                                 """)
                                 }
                             }
                         }
-                        if (!fileExists("./build/android/AutoAnswer.jpl")) {
-                            error "AutoAnswer build output not found"
+                        if (env.ARCHIVE == 'false') {
+                            sshagent(credentials: [env.SSH_CREDENTIALS]) {
+                                // def sshPrivateKey = '/var/lib/jenkins/.ssh/gplpriv'
+                                def remoteHost = env.SSH_HOST_DL_RING_CX
+                                def remoteBaseDir = '/srv/repository/ring/plugins/AutoAnswer/android'
+
+                                sh """
+                                    rsync --verbose build/android/AutoAnswer.jpl ${remoteHost}:${remoteBaseDir}/archive/AutoAnswer-\$(date '+%Y%m%d%H%M').jpl
+                                    rsync --verbose build/android/AutoAnswer.jpl ${remoteHost}:${remoteBaseDir}/AutoAnswer.jpl
+                                """
+                            }
+                        } else {
+                            archiveArtifacts 'build/android/AutoAnswer.jpl'
                         }
-                        archiveArtifacts 'build/android/AutoAnswer.jpl'
                     }
                 }
             }
@@ -211,23 +251,35 @@ pipeline {
             steps {
                 script {
                     if(env.GERRIT_TOPIC == "all" || env.GERRIT_TOPIC == "WaterMark") {
-                        docker.image('plugins-android').withRun('-t -u '+jenkinsUser+' -v '+pwd()+':/home/gradle/jami:rw -e BATCH_MODE=1', '/bin/bash') {
+                        docker.image('plugins-android').withRun('-t -v '+pwd()+':/home/gradle/jami:rw -e BATCH_MODE=1', '/bin/bash') {
                             container -> code:{
-                                def base_cmd = 'docker exec -t '+container.id+" sh -c '"
-                                def exec_cmd = { cmd -> sh base_cmd+cmd+"'" }
+                                def base_cmd = 'docker exec -u '+jenkinsUser+' '+container.id+" sh -c '"
+                                def base_root_cmd = 'docker exec '+container.id+" sh -c '"
+                                def exec_cmd = { cmd -> sh script:base_cmd+cmd+"'" }
+                                def exec_root_cmd = { cmd -> sh script:base_root_cmd+cmd+"'" }
 
                                 ansiColor('css') {
                                     exec_cmd("""
                                         cd jami
-                                        AUTHOR="SFL" DIVISION="Internal" ANDROID_ABI="arm64-v8a" python3 build-plugin.py --projects="WaterMark" --distribution="android"
+                                        ANDROID_ABI="armeabi-v7a arm64-v8a x86_64" python3 build-plugin.py --projects="WaterMark" --distribution="android"
                                 """)
                                 }
                             }
                         }
-                        if (!fileExists("./build/android/WaterMark.jpl")) {
-                            error "WaterMark build output not found"
+                        if (env.ARCHIVE == 'false') {
+                            sshagent(credentials: [env.SSH_CREDENTIALS]) {
+                                // def sshPrivateKey = '/var/lib/jenkins/.ssh/gplpriv'
+                                def remoteHost = env.SSH_HOST_DL_RING_CX
+                                def remoteBaseDir = '/srv/repository/ring/plugins/WaterMark/android'
+
+                                sh """
+                                    rsync --verbose build/android/WaterMark.jpl ${remoteHost}:${remoteBaseDir}/archive/WaterMark-\$(date '+%Y%m%d%H%M').jpl
+                                    rsync --verbose build/android/WaterMark.jpl ${remoteHost}:${remoteBaseDir}/WaterMark.jpl
+                                """
+                            }
+                        } else {
+                            archiveArtifacts 'build/android/WaterMark.jpl'
                         }
-                        archiveArtifacts 'build/android/WaterMark.jpl'
                     }
                 }
             }
@@ -237,10 +289,12 @@ pipeline {
             steps {
                 script {
                     if(env.GERRIT_TOPIC == "all" || env.GERRIT_TOPIC == "Whisper" || env.GERRIT_TOPIC == "WhisperTranscript") {
-                        docker.image('plugins-android').withRun('-t -u '+jenkinsUser+' -v '+pwd()+':/home/gradle/jami:rw -e BATCH_MODE=1', '/bin/bash') {
+                        docker.image('plugins-android').withRun('-t -v '+pwd()+':/home/gradle/jami:rw -e BATCH_MODE=1', '/bin/bash') {
                             container -> code:{
-                                def base_cmd = 'docker exec -t '+container.id+" sh -c '"
-                                def exec_cmd = { cmd -> sh base_cmd+cmd+"'" }
+                                def base_cmd = 'docker exec -u '+jenkinsUser+' '+container.id+" sh -c '"
+                                def base_root_cmd = 'docker exec '+container.id+" sh -c '"
+                                def exec_cmd = { cmd -> sh script:base_cmd+cmd+"'" }
+                                def exec_root_cmd = { cmd -> sh script:base_root_cmd+cmd+"'" }
 
                                 ansiColor('css') {
                                     exec_cmd("""
@@ -250,10 +304,94 @@ pipeline {
                                 }
                             }
                         }
-                        if (!fileExists("./build/android/WhisperTranscript.jpl")) {
-                            error "WhisperTranscript build output not found"
+                        if (env.ARCHIVE == 'false') {
+                            sshagent(credentials: [env.SSH_CREDENTIALS]) {
+                                // def sshPrivateKey = '/var/lib/jenkins/.ssh/gplpriv'
+                                def remoteHost = env.SSH_HOST_DL_RING_CX
+                                def remoteBaseDir = '/srv/repository/ring/plugins/WhisperTranscript/android'
+
+                                sh """
+                                    rsync --verbose build/android/WhisperTranscript.jpl ${remoteHost}:${remoteBaseDir}/archive/WhisperTranscript-\$(date '+%Y%m%d%H%M').jpl
+                                    rsync --verbose build/android/WhisperTranscript.jpl ${remoteHost}:${remoteBaseDir}/WhisperTranscript.jpl
+                                """
+                            }
+                        } else {
+                            archiveArtifacts 'build/android/WhisperTranscript.jpl'
+                        }
+                    }
+                }
+            }
+        }
+
+        stage('Build Dispatcher') {
+            steps {
+                script {
+                    if(env.GERRIT_TOPIC == "all" || env.GERRIT_TOPIC == "Dispatcher") {
+                        docker.image('plugins-android').withRun('-t -v '+pwd()+':/home/gradle/jami:rw -e BATCH_MODE=1', '/bin/bash') {
+                            container -> code:{
+                                def base_cmd = 'docker exec -u '+jenkinsUser+' '+container.id+" sh -c '"
+                                def base_root_cmd = 'docker exec '+container.id+" sh -c '"
+                                def exec_cmd = { cmd -> sh script:base_cmd+cmd+"'" }
+                                def exec_root_cmd = { cmd -> sh script:base_root_cmd+cmd+"'" }
+
+                                ansiColor('css') {
+                                    exec_cmd("""
+                                        cd jami
+                                        ANDROID_ABI="armeabi-v7a arm64-v8a x86_64" python3 build-plugin.py --projects="Dispatcher" --distribution="android"
+                                """)
+                                }
+                            }
+                        }
+                        if (env.ARCHIVE == 'false') {
+                            sshagent(credentials: [env.SSH_CREDENTIALS]) {
+                                def remoteHost = env.SSH_HOST_DL_RING_CX
+                                def remoteBaseDir = '/srv/repository/ring/plugins/Dispatcher/android'
+
+                                sh """
+                                    rsync --verbose build/android/Dispatcher.jpl ${remoteHost}:${remoteBaseDir}/archive/Dispatcher-\$(date '+%Y%m%d%H%M').jpl
+                                    rsync --verbose build/android/Dispatcher.jpl ${remoteHost}:${remoteBaseDir}/Dispatcher.jpl
+                                """
+                            }
+                        } else {
+                            archiveArtifacts 'build/android/Dispatcher.jpl'
+                        }
+                    }
+                }
+            }
+        }
+
+        stage('Build Agent') {
+            steps {
+                script {
+                    if(env.GERRIT_TOPIC == "all" || env.GERRIT_TOPIC == "Agent") {
+                        docker.image('plugins-android').withRun('-t -v '+pwd()+':/home/gradle/jami:rw -e BATCH_MODE=1', '/bin/bash') {
+                            container -> code:{
+                                def base_cmd = 'docker exec -u '+jenkinsUser+' '+container.id+" sh -c '"
+                                def base_root_cmd = 'docker exec '+container.id+" sh -c '"
+                                def exec_cmd = { cmd -> sh script:base_cmd+cmd+"'" }
+                                def exec_root_cmd = { cmd -> sh script:base_root_cmd+cmd+"'" }
+
+                                ansiColor('css') {
+                                    exec_cmd("""
+                                        cd jami
+                                        ANDROID_ABI="armeabi-v7a arm64-v8a x86_64" python3 build-plugin.py --projects="Agent" --distribution="android"
+                                """)
+                                }
+                            }
+                        }
+                        if (env.ARCHIVE == 'false') {
+                            sshagent(credentials: [env.SSH_CREDENTIALS]) {
+                                def remoteHost = env.SSH_HOST_DL_RING_CX
+                                def remoteBaseDir = '/srv/repository/ring/plugins/Agent/android'
+
+                                sh """
+                                    rsync --verbose build/android/Agent.jpl ${remoteHost}:${remoteBaseDir}/archive/Agent-\$(date '+%Y%m%d%H%M').jpl
+                                    rsync --verbose build/android/Agent.jpl ${remoteHost}:${remoteBaseDir}/Agent.jpl
+                                """
+                            }
+                        } else {
+                            archiveArtifacts 'build/android/Agent.jpl'
                         }
-                        archiveArtifacts 'build/android/WhisperTranscript.jpl'
                     }
                 }
             }
diff --git a/extras/ci/gnulinux/Jenkinsfile b/extras/ci/gnulinux/Jenkinsfile
index e3d2450..8ed5b3d 100644
--- a/extras/ci/gnulinux/Jenkinsfile
+++ b/extras/ci/gnulinux/Jenkinsfile
@@ -141,7 +141,7 @@ pipeline {
             steps {
                 script {
                     if(env.GERRIT_TOPIC == "all" || env.GERRIT_TOPIC == "GreenScreen") {
-                        docker.image('plugins-linux').withRun('-t -u '+jenkinsUser+' -v '+pwd()+':/root/jami/:rw -w /root/ -e BATCH_MODE=1', '/bin/bash') {
+                        docker.image('plugins-linux').withRun('-t -u '+jenkinsUser+' -v '+pwd()+':/root/jami/:rw -v /var/cache/jami:/var/cache/jami:rw -w /root/ -e BATCH_MODE=1', '/bin/bash') {
                             container -> code:{
                                 def base_cmd = 'docker exec -t '+container.id+" sh -c '"
                                 def exec_cmd = { cmd -> sh base_cmd+cmd+"'" }
-- 
GitLab