From c4ecf286e0172e7bfab3317aaee4afe46ad9dbf8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Burak=20Han=C3=A7erli?= <burak.hancerli@qt.io>
Date: Wed, 7 Feb 2024 12:27:16 +0000
Subject: [PATCH] QDS-11911 Project list dropdown update issues

---
 android/AndroidManifest.xml |  2 +-
 src/backend.cpp             | 52 ++++++++++++-------------------------
 src/backend.h               | 19 +++++++++-----
 ui/HomePage.qml             | 29 +++++++++------------
 4 files changed, 43 insertions(+), 59 deletions(-)

diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
index 1251571..509e762 100644
--- a/android/AndroidManifest.xml
+++ b/android/AndroidManifest.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="io.qt.qtdesignviewer"
-    android:installLocation="auto" android:versionCode="24" android:versionName="1.2">
+    android:installLocation="auto" android:versionCode="25" android:versionName="1.2">
     <!-- %%INSERT_PERMISSIONS -->
     <!-- %%INSERT_FEATURES -->
     <supports-screens android:anyDensity="true" android:largeScreens="true"
diff --git a/src/backend.cpp b/src/backend.cpp
index bc6d794..78ce526 100644
--- a/src/backend.cpp
+++ b/src/backend.cpp
@@ -92,7 +92,9 @@ void Backend::initialize()
         updateUserProjectList();
     }
 
-    // Check if updateInBackground is enabled
+    // Initialize background update
+    connect(&m_backgroundTimer, &QTimer::timeout, this, &Backend::updateUserProjectList);
+    m_backgroundTimer.setInterval(1000 * 10);
     enableBackgroundUpdate(updateInBackground());
     qDebug() << "Initialization complete";
 }
@@ -100,26 +102,6 @@ void Backend::initialize()
 void Backend::enableBackgroundUpdate(const bool &enabled)
 {
     if (enabled) {
-        m_backgroundTimer.setInterval(1000 * 10);
-
-        connect(&m_backgroundTimer, &QTimer::timeout, this, [&] {
-            qDebug() << "Checking for updates in background";
-
-            const QString userHash = Backend::userHash();
-            if (userHash.isEmpty())
-                return;
-
-            QJsonArray projectList = m_serviceConnector.fetchUserProjectList(userHash);
-            if (projectList.isEmpty()) {
-                qWarning() << "Could not fetch project list. Please check your internet "
-                              "connection and try again";
-                return;
-            }
-
-            qDebug() << "New projects available. Updating project list";
-            updateUserProjectList();
-        });
-
         m_backgroundTimer.start();
     } else {
         m_backgroundTimer.stop();
@@ -150,7 +132,7 @@ void Backend::setAutoScaleProject(const bool &enabled)
 void Backend::setUserHash(const QString &userHash)
 {
     QSettings().setValue("user/hash", userHash);
-    emit userRegistered();
+    emit userHashChanged();
 }
 
 bool Backend::updateInBackground()
@@ -504,23 +486,23 @@ void Backend::updateUserProjectList()
     qDebug() << "Fetching available project list for user:" << userHash;
     QJsonArray projectList = m_serviceConnector.fetchUserProjectList(userHash);
 
-    if (projectList.isEmpty()) {
-        qCritical("Could not fetch available project list");
-        return;
-    }
-
     if (projectList == m_projectList) {
-        qDebug("No new projects available");
-        return;
+        qDebug("No new projects are available");
+    } else if (projectList.isEmpty()) {
+        qWarning("Could not fetch project list. Either there are no projects or there is a "
+                 "network issue");
+    } else {
+        qDebug("List of available projects fetched:");
+        for (const auto &project : projectList) {
+            const QString projectName{project.toObject().value("appName").toString()};
+            qDebug() << "--" << projectName;
+        }
     }
 
+    // we need to set m_projectList even if it is empty
+    // because this triggers the onModelChanged function in the QML
+    // in order to update the UI
     m_projectList = projectList;
-    qDebug("List of available projects fetched:");
-    for (const auto &project : projectList) {
-        const QString projectName{project.toObject().value("appName").toString()};
-        qDebug() << "--" << projectName;
-    }
-
     emit projectListChanged();
 }
 
diff --git a/src/backend.h b/src/backend.h
index 980bd63..68198b7 100644
--- a/src/backend.h
+++ b/src/backend.h
@@ -89,23 +89,29 @@ private:
     QTimer m_backgroundTimer;
 
     // member functions
-    void updateUserProjectList();
     void updatePopup(const QString &text, bool indeterminate = true);
 
 signals:
-    // UI signals
+    // UI signals - Home page
+    void projectListChanged();
+    void urlUpdated(QString);
+    void userHashChanged();
+
+    // UI signals - Logs page
     void logsChanged(QString);
+
+    // UI signals - About page
     void buildInfoChanged(QString);
+
+    // UI signals - Popup
     void downloadProgress(float);
-    void projectListChanged();
     void popupProgressIndeterminateChanged(bool indeterminate);
     void popupTextChanged(QString text);
     void popupOpen();
     void popupClose();
-    void userRegistered();
+
+    // UI signals - Network page
     void networkUpdated(QString);
-    void urlUpdated(QString);
-    void userHashChanged(QString);
 
 public slots:
     void scanQrCode();
@@ -133,6 +139,7 @@ public slots:
 private slots:
     void initializeProjectManager();
     void enableBackgroundUpdate(const bool &enabled);
+    void updateUserProjectList();
 };
 
 #endif // DV_ANDROID_H
diff --git a/ui/HomePage.qml b/ui/HomePage.qml
index 520a60e..923d045 100644
--- a/ui/HomePage.qml
+++ b/ui/HomePage.qml
@@ -27,7 +27,7 @@ Item {
             Layout.fillWidth: true
             Connections {
                 target: backend
-                function onUserRegistered(){
+                function onUserHashChanged(){
                     qrCodeStatus.text = "User registration is completed.\nScan a new QR code to access the shared project from a different user.";
                     qrCodeInstructions.text = "";
                 }
@@ -67,11 +67,19 @@ Item {
                 id: projectList
                 Layout.fillWidth: true
                 enabled: true
-                onCurrentIndexChanged: {
-                    displayText = textAt(currentIndex)
-                }
                 textRole: "appName"
                 model: backend.projectList
+                onModelChanged: {
+                    if (backend.projectList.length > 0) {
+                        projectList.displayText = backend.projectList[0].appName;
+                        projectList.enabled = true;
+                        downloadUserProject.enabled = true;
+                    } else {
+                        projectList.displayText = "No projects are available";
+                        projectList.enabled = false;
+                        downloadUserProject.enabled = false;
+                    }
+                }
                 displayText: "Scan QR code to access your projects";
                 currentIndex: -1
                 Layout.preferredHeight: 50
@@ -85,19 +93,6 @@ Item {
                 Layout.fillWidth: true
                 Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
             }
-
-            Connections {
-                    target: backend
-                    function onUserRegistered(){
-                        projectList.displayText = "No projects available for the user";
-                        projectList.enabled = false;
-                        downloadUserProject.enabled = false;
-                    }
-                    function onProjectListChanged(){
-                        projectList.enabled = true;
-                        downloadUserProject.enabled = true;
-                    }
-                }
         }
 
         Item {
-- 
GitLab