From 9e4f5a19c6a8a3062dfdf876e625dfb15261a9b0 Mon Sep 17 00:00:00 2001
From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
Date: Fri, 4 Nov 2022 17:53:15 -0400
Subject: [PATCH] misc: regenerate qml.qrc at configure time

Our qml.qrc is:
- commonly in conflict and prone to erroneous conflict resolution
- platform dependant (generation is used anyway for removing
  webengine dependant resources)
- a poorly maintained hodge-podge with resources in subdirectories
  that aren't grouped
- requires alteration when moving resources (if not done correctly,
  without tests, results in uncaught runtime failures)

This patch uses a python script at configure time to generate the
qml.qrc resource file, and removes it from versioning.

GitLab: #749
Change-Id: Ia2b81bb5b2c29d0bf6f5a5302e76795864e93e40
---
 .gitignore                                    |   2 +-
 CMakeLists.txt                                |  43 ++--
 extras/scripts/gen-qrc-without-webengine.py   |  32 ---
 extras/scripts/gen_qml_qrc.py                 |  91 ++++++++
 .../DataTransferMessageDelegate.qml           |   4 +-
 .../mainview/components/ChatViewFooter.qml    |  20 +-
 src/app/qml.qrc                               | 217 ------------------
 .../GeneralWebEngineView.qml                  |   0
 .../MediaPreviewBase.qml                      |   2 +
 .../emojipicker/EmojiPicker.qml               |   6 +-
 .../emojipicker/emoji.js                      |   0
 .../emojipicker/emojiPickerLoader.html        |   0
 .../emojipicker/emojiPickerLoader.js          |   0
 13 files changed, 135 insertions(+), 282 deletions(-)
 delete mode 100755 extras/scripts/gen-qrc-without-webengine.py
 create mode 100644 extras/scripts/gen_qml_qrc.py
 delete mode 100644 src/app/qml.qrc
 rename src/app/{commoncomponents => webengine}/GeneralWebEngineView.qml (100%)
 rename src/app/{commoncomponents => webengine}/MediaPreviewBase.qml (98%)
 rename src/app/{commoncomponents => webengine}/emojipicker/EmojiPicker.qml (91%)
 rename src/app/{commoncomponents => webengine}/emojipicker/emoji.js (100%)
 rename src/app/{commoncomponents => webengine}/emojipicker/emojiPickerLoader.html (100%)
 rename src/app/{commoncomponents => webengine}/emojipicker/emojiPickerLoader.js (100%)

diff --git a/.gitignore b/.gitignore
index 36d779993..80cf8f117 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,8 +26,8 @@ install-local/
 .deploy.stamp
 
 # auto-gen files
-src/app/qml_without_webengine.qrc
 src/app/resources.qrc
+src/app/qml.qrc
 src/app/constant/JamiResources.qml
 
 # macOS
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d5c6f3e05..567653aa5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -125,17 +125,32 @@ include(FindPython3)
 find_package(Python3 3.6 REQUIRED COMPONENTS Interpreter)
 set(PYTHON_EXEC ${Python3_EXECUTABLE})
 
-set(QML_RESOURCES ${APP_SRC_DIR}/resources.qrc)
+# Resource auto-gen
+# QML and related code files
+# Check files in the app's src directory and force a reconfigure if it
+# changes.
+# Only include webengine resources if specified.
 if(WITH_WEBENGINE)
-  set(QML_RESOURCES_QML ${APP_SRC_DIR}/qml.qrc)
-else()
-  execute_process(
-    COMMAND
-    ${PYTHON_EXEC} ${SCRIPTS_DIR}/gen-qrc-without-webengine.py
-    WORKING_DIRECTORY ${APP_SRC_DIR})
-  set(QML_RESOURCES_QML
-    ${APP_SRC_DIR}/qml_without_webengine.qrc)
+  set(GEN_QML_QRC_ARGS "--with-webengine")
 endif()
+file(GLOB_RECURSE
+  QML_FILES CONFIGURE_DEPENDS
+  ${APP_SRC_DIR}/*)
+execute_process(
+  COMMAND
+  ${PYTHON_EXEC} ${SCRIPTS_DIR}/gen_qml_qrc.py ${GEN_QML_QRC_ARGS}
+  WORKING_DIRECTORY ${APP_SRC_DIR})
+set(QML_RESOURCES_QML ${APP_SRC_DIR}/qml.qrc)
+# Image and misc. resources
+# check files in the resources directory and force a reconfigure if it
+# changes
+file(GLOB_RECURSE
+  RES_FILES CONFIGURE_DEPENDS
+  ${PROJECT_SOURCE_DIR}/resources/*)
+execute_process(
+  COMMAND ${PYTHON_EXEC} ${SCRIPTS_DIR}/gen_resources_qrc.py
+  WORKING_DIRECTORY ${APP_SRC_DIR})
+set(QML_RESOURCES ${APP_SRC_DIR}/resources.qrc)
 
 if (APPLE)
   include(FetchContent)
@@ -148,16 +163,6 @@ if (APPLE)
   include_directories(${libqrencode_SOURCE_DIR})
 endif()
 
-# Resource auto-gen
-# check files in the resources directory and force a reconfigure if it
-# changes
-file(GLOB_RECURSE
-  RES_FILES CONFIGURE_DEPENDS
-  ${PROJECT_SOURCE_DIR}/resources/*)
-execute_process(
-  COMMAND ${PYTHON_EXEC} ${SCRIPTS_DIR}/gen_resources_qrc.py
-  WORKING_DIRECTORY ${APP_SRC_DIR})
-
 # library compatibility (boost, libnotify, etc.)
 add_definitions(-DQT_NO_KEYWORDS)
 
diff --git a/extras/scripts/gen-qrc-without-webengine.py b/extras/scripts/gen-qrc-without-webengine.py
deleted file mode 100755
index 329b3911e..000000000
--- a/extras/scripts/gen-qrc-without-webengine.py
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env python3
-
-# Copyright (C) 2022 Savoir-faire Linux Inc.
-#
-# Author: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
-# Author: Amin Bandali <amin.bandali@savoirfairelinux.com>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
-
-with open('qml_without_webengine.qrc', 'w') as outfile:
-  with open('qml.qrc', 'r') as infile:
-    line = infile.readline()
-    while line:
-      if 'EmojiPicker.qml' in line:
-        outfile.write('\t<file>nowebengine/EmojiPicker.qml</file>\n')
-      elif 'MediaPreviewBase.qml' in line:
-        outfile.write('\t<file>nowebengine/MediaPreviewBase.qml</file>\n')
-      else:
-        outfile.write(line)
-      line = infile.readline()
diff --git a/extras/scripts/gen_qml_qrc.py b/extras/scripts/gen_qml_qrc.py
new file mode 100644
index 000000000..05c01dd97
--- /dev/null
+++ b/extras/scripts/gen_qml_qrc.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2022 Savoir-faire Linux Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
+# USA.
+
+"""
+Generate qrc file for qml and related code files recursively within the source
+directory.
+"""
+
+import os
+
+# These paths should be relative to the working directory of the
+# script as set in the project CMakeLists, which should in turn be
+# where the resources.qrc will be located (currently 'src/app').
+app_src_dir = os.path.join('..', '..', 'src', 'app')
+resfile = os.path.join('qml.qrc')
+
+
+def path_contains_dir(filepath, dir_str):
+    """ Return True if the given filepath contains the given directory. """
+    # Split the filepath into its components
+    path_components = os.path.normpath(filepath).split(os.sep)
+    # Return True if the given directory is in the path
+    return dir_str in path_components
+
+
+def posix_path(path):
+    """
+    Force the use of POSIX path separators for the resource prefixes
+    and paths (useful only if versioning the qml.qrc file).
+    """
+    return path.replace(os.sep, '/')
+
+
+def gen_qml_qrc(with_webengine):
+    """ Generate the qml.qrc file. """
+    print("Generating qml.qrc file ...")
+    with open(resfile, 'w', encoding='utf-8') as qrc:
+        qrc.write('<RCC>\n')
+        for root, _, files in os.walk(app_src_dir):
+            # Skip the nowebengine directory if we can use webengine
+            if with_webengine and path_contains_dir(root, 'nowebengine'):
+                continue
+            # Skip the webengine directory if we can't use webengine
+            if not with_webengine and path_contains_dir(root, 'webengine'):
+                continue
+            filtered = [k for k in files if k.endswith('.qml') or
+                        k.endswith('.js') or k.endswith('.html') or
+                        k.endswith('.css') or k.endswith('.conf')]
+            # if there are no files of interest in this directory, skip it
+            if not filtered:
+                continue
+            # For now, get the relative resource prefix for this directory,
+            # remove the leading slash, and add it as a comment to the line.
+            # Ideally, we should use the actual resource prefix instead of /,
+            # but this will require some refactoring of the QML code.
+            prefix = root.split(app_src_dir)[-1][1:]
+            qrc.write(
+                f'\t<qresource prefix="/"> <!--{posix_path(prefix)}-->\n')
+            for file in filtered:
+                relpath = os.path.relpath(
+                    os.path.join(root, file), app_src_dir)
+                qrc.write(f'\t\t<file>{posix_path(relpath)}</file>\n')
+            qrc.write('\t</qresource>\n')
+        qrc.write('</RCC>')
+
+
+if __name__ == '__main__':
+    # We can't use webengine if we're building for macOS app store
+    import argparse
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--with-webengine', action='store_true',
+                        default=False, help='Include webengine resources')
+    args = parser.parse_args()
+    gen_qml_qrc(args.with_webengine)
diff --git a/src/app/commoncomponents/DataTransferMessageDelegate.qml b/src/app/commoncomponents/DataTransferMessageDelegate.qml
index b3a5b2acb..3912857ca 100644
--- a/src/app/commoncomponents/DataTransferMessageDelegate.qml
+++ b/src/app/commoncomponents/DataTransferMessageDelegate.qml
@@ -274,7 +274,9 @@ Loader {
                         id: avComp
                         Loader {
                             Component.onCompleted: {
-                                var qml = WITH_WEBENGINE ? "qrc:/commoncomponents/MediaPreviewBase.qml" : "qrc:/nowebengine/MediaPreviewBase.qml"
+                                var qml = WITH_WEBENGINE ?
+                                            "qrc:/webengine/MediaPreviewBase.qml" :
+                                            "qrc:/nowebengine/MediaPreviewBase.qml"
                                 setSource( qml, { isVideo: mediaInfo.isVideo, html:mediaInfo.html } )
                             }
                         }
diff --git a/src/app/mainview/components/ChatViewFooter.qml b/src/app/mainview/components/ChatViewFooter.qml
index ba754ba6a..beb8d56ee 100644
--- a/src/app/mainview/components/ChatViewFooter.qml
+++ b/src/app/mainview/components/ChatViewFooter.qml
@@ -104,14 +104,16 @@ Rectangle {
     }
 
     Loader {
-        id: empjiLoader
-        source: WITH_WEBENGINE ? "qrc:/commoncomponents/emojipicker/EmojiPicker.qml" : "qrc:/nowebengine/EmojiPicker.qml"
+        id: emojiPickerLoader
+        source: WITH_WEBENGINE ?
+                    "qrc:/webengine/emojipicker/EmojiPicker.qml" :
+                    "qrc:/nowebengine/EmojiPicker.qml"
 
         function openEmojiPicker() {
             item.openEmojiPicker()
         }
         Connections {
-            target: empjiLoader.item
+            target: emojiPickerLoader.item
             function onEmojiIsPicked(content) {
                 messageBar.textAreaObj.insertText(content)
             }
@@ -168,20 +170,20 @@ Rectangle {
             onEmojiButtonClicked: {
                 JamiQmlUtils.updateMessageBarButtonsPoints()
 
-                empjiLoader.parent = JamiQmlUtils.mainViewRectObj
+                emojiPickerLoader.parent = JamiQmlUtils.mainViewRectObj
 
-                empjiLoader.x = Qt.binding(function() {
+                emojiPickerLoader.x = Qt.binding(function() {
                     var buttonX = JamiQmlUtils.emojiPickerButtonInMainViewPoint.x +
                             JamiQmlUtils.emojiPickerButtonObj.width
-                    return buttonX - empjiLoader.width
+                    return buttonX - emojiPickerLoader.width
                 })
-                empjiLoader.y = Qt.binding(function() {
+                emojiPickerLoader.y = Qt.binding(function() {
                     var buttonY = JamiQmlUtils.audioRecordMessageButtonInMainViewPoint.y
-                    return buttonY - empjiLoader.height - messageBar.marginSize
+                    return buttonY - emojiPickerLoader.height - messageBar.marginSize
                             - JamiTheme.chatViewHairLineSize
                 })
 
-                empjiLoader.openEmojiPicker()
+                emojiPickerLoader.openEmojiPicker()
             }
             onSendFileButtonClicked: jamiFileDialog.open()
             onSendMessageButtonClicked: {
diff --git a/src/app/qml.qrc b/src/app/qml.qrc
deleted file mode 100644
index fd4cdc7d7..000000000
--- a/src/app/qml.qrc
+++ /dev/null
@@ -1,217 +0,0 @@
-<RCC>
-    <qresource prefix="/">
-        <file>MainApplicationWindow.qml</file>
-        <file>DaemonReconnectWindow.qml</file>
-        <file>constant/JamiQmlUtils.qml</file>
-        <file>constant/JamiStrings.qml</file>
-        <file>constant/JamiTheme.qml</file>
-        <file>commoncomponents/VideoView.qml</file>
-        <file>commoncomponents/LocalVideo.qml</file>
-        <file>commoncomponents/SettingParaCombobox.qml</file>
-        <file>commoncomponents/PreferenceItemDelegate.qml</file>
-        <file>commoncomponents/PasswordDialog.qml</file>
-        <file>commoncomponents/EditableLineEdit.qml</file>
-        <file>commoncomponents/MaterialLineEdit.qml</file>
-        <file>commoncomponents/PhotoboothView.qml</file>
-        <file>commoncomponents/JamiListView.qml</file>
-        <file>commoncomponents/DeleteAccountDialog.qml</file>
-        <file>commoncomponents/ConfirmDialog.qml</file>
-        <file>commoncomponents/CustomBorder.qml</file>
-        <file>commoncomponents/PushButton.qml</file>
-        <file>commoncomponents/JamiFileDialog.qml</file>
-        <file>commoncomponents/MaterialButton.qml</file>
-        <file>commoncomponents/ElidedTextLabel.qml</file>
-        <file>commoncomponents/SpinnerButton.qml</file>
-        <file>commoncomponents/UsernameLineEdit.qml</file>
-        <file>commoncomponents/Scaffold.qml</file>
-        <file>commoncomponents/LineEditContextMenu.qml</file>
-        <file>commoncomponents/BaseModalDialog.qml</file>
-        <file>commoncomponents/SimpleMessageDialog.qml</file>
-        <file>commoncomponents/ResponsiveImage.qml</file>
-        <file>commoncomponents/PresenceIndicator.qml</file>
-        <file>commoncomponents/DaemonReconnectPopup.qml</file>
-        <file>commoncomponents/SpinningAnimation.qml</file>
-        <file>commoncomponents/MediaPreviewBase.qml</file>
-        <file>settingsview/SettingsView.qml</file>
-        <file>settingsview/components/ChatviewSettings.qml</file>
-        <file>settingsview/components/FileTransferSettings.qml</file>
-        <file>settingsview/components/SettingsMenu.qml</file>
-        <file>settingsview/components/SettingsMenuButton.qml</file>
-        <file>settingsview/components/SettingsHeader.qml</file>
-        <file>settingsview/components/SystemSettings.qml</file>
-        <file>settingsview/components/RecordingSettings.qml</file>
-        <file>settingsview/components/UpdateSettings.qml</file>
-        <file>settingsview/components/AvSettingPage.qml</file>
-        <file>settingsview/components/AudioSettings.qml</file>
-        <file>settingsview/components/VideoSettings.qml</file>
-        <file>settingsview/components/GeneralSettingsPage.qml</file>
-        <file>settingsview/components/PluginSettingsPage.qml</file>
-        <file>settingsview/components/PluginListView.qml</file>
-        <file>settingsview/components/PluginPreferencesView.qml</file>
-        <file>settingsview/components/PluginPreferencesListView.qml</file>
-        <file>settingsview/components/CurrentAccountSettings.qml</file>
-        <file>settingsview/components/UserIdentity.qml</file>
-        <file>settingsview/components/JamiUserIdentity.qml</file>
-        <file>settingsview/components/SIPUserIdentity.qml</file>
-        <file>settingsview/components/AccountProfile.qml</file>
-        <file>settingsview/components/LinkedDevices.qml</file>
-        <file>settingsview/components/BannedContacts.qml</file>
-        <file>settingsview/components/AdvancedSettings.qml</file>
-        <file>settingsview/components/AdvancedJamiSecuritySettings.qml</file>
-        <file>settingsview/components/AdvancedSIPSecuritySettings.qml</file>
-        <file>settingsview/components/AdvancedMediaSettings.qml</file>
-        <file>settingsview/components/MediaSettings.qml</file>
-        <file>settingsview/components/AdvancedSDPSettings.qml</file>
-        <file>settingsview/components/AdvancedNameServerSettings.qml</file>
-        <file>settingsview/components/AdvancedVoiceMailSettings.qml</file>
-        <file>settingsview/components/AdvancedOpenDHTSettings.qml</file>
-        <file>settingsview/components/AdvancedPublicAddressSettings.qml</file>
-        <file>settingsview/components/AdvancedConnectivitySettings.qml</file>
-        <file>settingsview/components/AdvancedCallSettings.qml</file>
-        <file>settingsview/components/AdvancedChatSettings.qml</file>
-        <file>settingsview/components/SettingMaterialButton.qml</file>
-        <file>settingsview/components/ToggleSwitch.qml</file>
-        <file>settingsview/components/SettingSpinBox.qml</file>
-        <file>settingsview/components/SettingsComboBox.qml</file>
-        <file>settingsview/components/SettingsMaterialLineEdit.qml</file>
-        <file>settingsview/components/LevelMeter.qml</file>
-        <file>settingsview/components/DeviceItemDelegate.qml</file>
-        <file>settingsview/components/PluginItemDelegate.qml</file>
-        <file>settingsview/components/ContactItemDelegate.qml</file>
-        <file>settingsview/components/MediaCodecDelegate.qml</file>
-        <file>settingsview/components/NameRegistrationDialog.qml</file>
-        <file>settingsview/components/LinkDeviceDialog.qml</file>
-        <file>settingsview/components/RevokeDevicePasswordDialog.qml</file>
-        <file>wizardview/WizardView.qml</file>
-        <file>wizardview/components/WelcomePage.qml</file>
-        <file>wizardview/components/CreateAccountPage.qml</file>
-        <file>wizardview/components/CreateSIPAccountPage.qml</file>
-        <file>wizardview/components/ImportFromBackupPage.qml</file>
-        <file>wizardview/components/ImportFromDevicePage.qml</file>
-        <file>wizardview/components/ConnectToAccountManagerPage.qml</file>
-        <file>wizardview/components/ProfilePage.qml</file>
-        <file>wizardview/components/AccountCreationStepIndicator.qml</file>
-        <file>mainview/MainView.qml</file>
-        <file>mainview/components/PluginHandlerItemDelegate.qml</file>
-        <file>mainview/components/AboutPopUp.qml</file>
-        <file>mainview/components/SidePanel.qml</file>
-        <file>mainview/components/WelcomePage.qml</file>
-        <file>mainview/components/ChatView.qml</file>
-        <file>mainview/components/ConversationErrorsRow.qml</file>
-        <file>mainview/components/NewSwarmPage.qml</file>
-        <file>mainview/components/ChatViewHeader.qml</file>
-        <file>mainview/components/AccountComboBox.qml</file>
-        <file>mainview/components/CallStackView.qml</file>
-        <file>mainview/components/InitialCallPage.qml</file>
-        <file>mainview/components/CallOverlay.qml</file>
-        <file>mainview/components/ContactSearchBar.qml</file>
-        <file>mainview/components/OngoingCallPage.qml</file>
-        <file>mainview/components/ParticipantOverlay.qml</file>
-        <file>mainview/components/ProjectCreditsScrollView.qml</file>
-        <file>mainview/components/AccountComboBoxPopup.qml</file>
-        <file>mainview/components/SidePanelTabBar.qml</file>
-        <file>mainview/components/WelcomePageQrDialog.qml</file>
-        <file>mainview/components/ConversationSmartListContextMenu.qml</file>
-        <file>mainview/components/SwarmParticipantContextMenu.qml</file>
-        <file>mainview/components/CallViewContextMenu.qml</file>
-        <file>mainview/components/UserProfile.qml</file>
-        <file>mainview/components/SwarmDetailsPanel.qml</file>
-        <file>mainview/components/SwarmDetailsItem.qml</file>
-        <file>mainview/components/AddMemberPanel.qml</file>
-        <file>mainview/components/SelectScreen.qml</file>
-        <file>mainview/components/ScreenRubberBand.qml</file>
-        <file>mainview/components/ContactPicker.qml</file>
-        <file>mainview/components/PluginHandlerPicker.qml</file>
-        <file>mainview/components/ContactPickerItemDelegate.qml</file>
-        <file>mainview/components/RecordBox.qml</file>
-        <file>mainview/components/SipInputPanel.qml</file>
-        <file>mainview/components/ParticipantOverlayMenu.qml</file>
-        <file>mainview/js/selectscreenwindowcreation.js</file>
-        <file>mainview/js/screenrubberbandcreation.js</file>
-        <file>mainview/js/contactpickercreation.js</file>
-        <file>mainview/js/pluginhandlerpickercreation.js</file>
-        <file>mainview/components/FilterTabButton.qml</file>
-        <file>mainview/components/AccountItemDelegate.qml</file>
-        <file>mainview/components/ConversationListView.qml</file>
-        <file>mainview/components/SmartListItemDelegate.qml</file>
-        <file>mainview/components/BadgeNotifier.qml</file>
-        <file>mainview/components/ParticipantsLayer.qml</file>
-        <file>mainview/components/ParticipantsLayoutVertical.qml</file>
-        <file>mainview/components/ParticipantsLayoutHorizontal.qml</file>
-        <file>mainview/components/MainOverlay.qml</file>
-        <file>mainview/components/CallButtonDelegate.qml</file>
-        <file>mainview/components/CallActionBar.qml</file>
-        <file>commoncomponents/HalfPill.qml</file>
-        <file>commoncomponents/EditedPopup.qml</file>
-        <file>commoncomponents/MaterialToolTip.qml</file>
-        <file>mainview/components/ParticipantCallInStatusDelegate.qml</file>
-        <file>mainview/components/ParticipantCallInStatusView.qml</file>
-        <file>settingsview/components/TroubleshootSettings.qml</file>
-        <file>settingsview/components/LogsView.qml</file>
-        <file>commoncomponents/contextmenu/ContextMenuAutoLoader.qml</file>
-        <file>commoncomponents/contextmenu/BaseContextMenu.qml</file>
-        <file>commoncomponents/contextmenu/GeneralMenuItem.qml</file>
-        <file>commoncomponents/contextmenu/GeneralMenuSeparator.qml</file>
-        <file>mainview/components/ParticipantOverlayButton.qml</file>
-        <file>mainview/components/ParticipantControlLayout.qml</file>
-        <file>mainview/components/ChatViewFooter.qml</file>
-        <file>commoncomponents/emojipicker/EmojiPicker.qml</file>
-        <file>commoncomponents/emojipicker/emojiPickerLoader.js</file>
-        <file>commoncomponents/emojipicker/emojiPickerLoader.html</file>
-        <file>commoncomponents/emojipicker/emoji.js</file>
-        <file>mainview/components/MessageBarTextArea.qml</file>
-        <file>mainview/components/FilesToSendDelegate.qml</file>
-        <file>mainview/components/MessageBar.qml</file>
-        <file>mainview/components/FilesToSendContainer.qml</file>
-        <file>mainview/components/ReplyingContainer.qml</file>
-        <file>mainview/components/EditContainer.qml</file>
-        <file>commoncomponents/Avatar.qml</file>
-        <file>mainview/components/ConversationAvatar.qml</file>
-        <file>mainview/components/InvitationView.qml</file>
-        <file>commoncomponents/GeneralWebEngineView.qml</file>
-        <file>constant/JamiResources.qml</file>
-        <file>commoncomponents/BubbleLabel.qml</file>
-        <file>commoncomponents/BackButton.qml</file>
-        <file>commoncomponents/JamiSwitch.qml</file>
-        <file>mainview/components/UpdateToSwarm.qml</file>
-        <file>commoncomponents/TextMessageDelegate.qml</file>
-        <file>mainview/components/MessageListView.qml</file>
-        <file>commoncomponents/MessageBubble.qml</file>
-        <file>constant/MsgSeq.qml</file>
-        <file>commoncomponents/SBSContextMenu.qml</file>
-        <file>commoncomponents/SBSMessageBase.qml</file>
-        <file>commoncomponents/ReplyToRow.qml</file>
-        <file>commoncomponents/ReadStatus.qml</file>
-        <file>commoncomponents/GeneratedMessageDelegate.qml</file>
-        <file>commoncomponents/DataTransferMessageDelegate.qml</file>
-        <file>commoncomponents/ContactMessageDelegate.qml</file>
-        <file>mainview/components/ScrollToBottomButton.qml</file>
-        <file>commoncomponents/TypingDots.qml</file>
-        <file>commoncomponents/JamiScrollBar.qml</file>
-        <file>qtquickcontrols2.conf</file>
-        <file>commoncomponents/JamiFlickable.qml</file>
-        <file>AccountMigrationView.qml</file>
-        <file>settingsview/js/logviewwindowcreation.js</file>
-        <file>mainview/js/keyboardshortcuttablecreation.js</file>
-        <file>mainview/components/KeyboardShortcutTable.qml</file>
-        <file>mainview/components/KeyboardShortcutKeyDelegate.qml</file>
-        <file>mainview/components/KeyboardShortcutTabButton.qml</file>
-        <file>LayoutManager.qml</file>
-        <file>mainview/components/JamiIdentifier.qml</file>
-        <file>wizardview/components/NoUsernamePopup.qml</file>
-        <file>wizardview/components/AdvancedAccountSettings.qml</file>
-        <file>commoncomponents/InfoBox.qml</file>
-        <file>mainview/components/TipBox.qml</file>
-        <file>mainview/components/CustomizeTipBox.qml</file>
-        <file>mainview/components/BackupTipBox.qml</file>
-        <file>mainview/components/InformativeTipBox.qml</file>
-        <file>commoncomponents/TimestampInfo.qml</file>
-        <file>commoncomponents/MaterialTextField.qml</file>
-        <file>commoncomponents/ModalTextEdit.qml</file>
-        <file>commoncomponents/UsernameTextEdit.qml</file>
-        <file>mainview/components/DocumentsScrollview.qml</file>
-        <file>mainview/components/FilePreview.qml</file>
-        <file>mainview/components/MediaPreview.qml</file>
-	<file>mainview/components/CallInformationWindow.qml</file>
-    </qresource>
-</RCC>
diff --git a/src/app/commoncomponents/GeneralWebEngineView.qml b/src/app/webengine/GeneralWebEngineView.qml
similarity index 100%
rename from src/app/commoncomponents/GeneralWebEngineView.qml
rename to src/app/webengine/GeneralWebEngineView.qml
diff --git a/src/app/commoncomponents/MediaPreviewBase.qml b/src/app/webengine/MediaPreviewBase.qml
similarity index 98%
rename from src/app/commoncomponents/MediaPreviewBase.qml
rename to src/app/webengine/MediaPreviewBase.qml
index 1192638c6..eb06b93e7 100644
--- a/src/app/commoncomponents/MediaPreviewBase.qml
+++ b/src/app/webengine/MediaPreviewBase.qml
@@ -26,6 +26,8 @@ import net.jami.Models 1.1
 import net.jami.Constants 1.1
 import net.jami.Adapters 1.1
 
+import "../commoncomponents"
+
 WebEngineView {
     id: wev
     property bool isVideo
diff --git a/src/app/commoncomponents/emojipicker/EmojiPicker.qml b/src/app/webengine/emojipicker/EmojiPicker.qml
similarity index 91%
rename from src/app/commoncomponents/emojipicker/EmojiPicker.qml
rename to src/app/webengine/emojipicker/EmojiPicker.qml
index a9dda179f..eb8e0da93 100644
--- a/src/app/commoncomponents/emojipicker/EmojiPicker.qml
+++ b/src/app/webengine/emojipicker/EmojiPicker.qml
@@ -74,7 +74,7 @@ Rectangle {
 
         webChannel.registeredObjects: [jsBridgeObject]
 
-        onCompletedLoadHtml: ":/commoncomponents/emojipicker/emojiPickerLoader.html"
+        onCompletedLoadHtml: ":/webengine/emojipicker/emojiPickerLoader.html"
 
         onActiveFocusChanged: {
             if (visible) {
@@ -88,10 +88,10 @@ Rectangle {
                                                      ":qwebchannel.js"))
                 emojiPickerWebView.runJavaScript(
                             UtilsAdapter.qStringFromFile(
-                                ":/commoncomponents/emojipicker/emoji.js"))
+                                ":/webengine/emojipicker/emoji.js"))
                 emojiPickerWebView.runJavaScript(
                             UtilsAdapter.qStringFromFile(
-                                ":/commoncomponents/emojipicker/emojiPickerLoader.js"))
+                                ":/webengine/emojipicker/emojiPickerLoader.js"))
                 emojiPickerWebView.runJavaScript(
                             "init_emoji_picker(" + JamiTheme.darkTheme + ");")
             }
diff --git a/src/app/commoncomponents/emojipicker/emoji.js b/src/app/webengine/emojipicker/emoji.js
similarity index 100%
rename from src/app/commoncomponents/emojipicker/emoji.js
rename to src/app/webengine/emojipicker/emoji.js
diff --git a/src/app/commoncomponents/emojipicker/emojiPickerLoader.html b/src/app/webengine/emojipicker/emojiPickerLoader.html
similarity index 100%
rename from src/app/commoncomponents/emojipicker/emojiPickerLoader.html
rename to src/app/webengine/emojipicker/emojiPickerLoader.html
diff --git a/src/app/commoncomponents/emojipicker/emojiPickerLoader.js b/src/app/webengine/emojipicker/emojiPickerLoader.js
similarity index 100%
rename from src/app/commoncomponents/emojipicker/emojiPickerLoader.js
rename to src/app/webengine/emojipicker/emojiPickerLoader.js
-- 
GitLab