More do-release-upgrade progress
This commit is contained in:
		
							parent
							
								
									1821373141
								
							
						
					
					
						commit
						d71a36f0ef
					
				| @ -38,6 +38,9 @@ set(PROJECT_SOURCES | ||||
|         src/conffilehandlerdialog.ui | ||||
|         src/ipcfilewatcher.h | ||||
|         src/ipcfilewatcher.cpp | ||||
|         src/releaseupgradewindow.h | ||||
|         src/releaseupgradewindow.cpp | ||||
|         src/releaseupgradewindow.ui | ||||
|         ${TS_FILES} | ||||
| ) | ||||
| 
 | ||||
|  | ||||
| @ -20,6 +20,11 @@ It is highly recommended that you use a Lubuntu virtual machine for testing and | ||||
| 
 | ||||
| Qt Creator is recommended for editing the code. It is present in Ubuntu's official repos and can be installed using `sudo apt install qtcreator`. | ||||
| 
 | ||||
| ## Config file format: | ||||
| There's only one field here: | ||||
| 
 | ||||
| * nextDoReleaseUpgradeNotify=123456789 - Value is number of seconds since the UNIX epoch. Used to determine when to offer the user an upgrade. | ||||
| 
 | ||||
| ## Missing features | ||||
| 
 | ||||
| * Double-clicking on a package doesn't show detailed information for it yet. | ||||
|  | ||||
| @ -144,7 +144,7 @@ void AptManager::handleUpdateProcessBuffer() | ||||
|                     conffileList.append(confLine); | ||||
|                 } | ||||
|             } | ||||
|         } else if (line == "Lubuntu Update !!! NEW LTS RELEASE") { | ||||
|         } else if (line == "Lubuntu Update !!! NEW RELEASE") { | ||||
|             // Same busy-wait technique, but here we're just getting one extra line, the model code.
 | ||||
|             while (!aptProcess->canReadLine()) { | ||||
|                 QThread::msleep(20); | ||||
| @ -152,14 +152,6 @@ void AptManager::handleUpdateProcessBuffer() | ||||
|             aptProcess->readLine(lineBuf, 2048); | ||||
|             QString ltsReleaseCode = QString(lineBuf); | ||||
|             emit newLtsRelease(ltsReleaseCode); | ||||
|         } else if (line == "Lubuntu Update !!! NEW STABLE RELEASE") { | ||||
|             // Ditto
 | ||||
|             while (!aptProcess->canReadLine()) { | ||||
|                 QThread::msleep(20); | ||||
|             } | ||||
|             aptProcess->readLine(lineBuf, 2048); | ||||
|             QString stableReleaseCode = QString(lineBuf); | ||||
|             emit newStableRelease(stableReleaseCode); | ||||
|         } | ||||
| 
 | ||||
|         double percentageDone = (static_cast<double>(internalUpdateProgress) / (((internalUpdateInfo[0].count() + internalUpdateInfo[1].count()) * 4) + internalUpdateInfo[2].count())) * 100; | ||||
|  | ||||
| @ -152,14 +152,14 @@ elif [ "$1" = 'doupdate' ]; then | ||||
| 
 | ||||
| 	if [ -n "$nextLTSReleaseYear" ]; then | ||||
| 		if isReleaseSupported "$nextLTSReleaseYear" "$nextLTSReleaseMonth" "$metaReleaseData"; then | ||||
| 			echo 'Lubuntu Update !!! NEW LTS RELEASE'; | ||||
| 			echo 'Lubuntu Update !!! NEW RELEASE'; | ||||
| 			echo "$nextLTSReleaseYear.$nextLTSReleaseMonth"; | ||||
| 		fi | ||||
| 	fi | ||||
| 
 | ||||
| 	if ! (((nextReleaseYear == nextLTSReleaseYear) && (nextReleaseMonth == nextLTSReleaseMonth))); then | ||||
| 		if isReleaseSupported "$nextReleaseYear" "$nextReleaseMonth" "$metaReleaseData"; then | ||||
| 			echo 'Lubuntu Update !!! NEW STABLE RELEASE'; | ||||
| 			echo 'Lubuntu Update !!! NEW RELEASE'; | ||||
| 			echo "$nextReleaseYear.$nextReleaseMonth"; | ||||
| 		fi | ||||
| 	fi | ||||
|  | ||||
| @ -25,8 +25,7 @@ MainWindow::MainWindow(QWidget *parent) | ||||
|     connect(aptManager, &AptManager::progressUpdated, this, &MainWindow::onProgressUpdate); | ||||
|     connect(aptManager, &AptManager::logLineReady, this, &MainWindow::onLogLineReady); | ||||
|     connect(aptManager, &AptManager::conffileListReady, this, &MainWindow::onConffileListReady); | ||||
|     connect(aptManager, &AptManager::newLtsRelease, this, &MainWindow::onNewLtsRelease); | ||||
|     connect(aptManager, &AptManager::newStableRelease, this, &MainWindow::onNewStableRelease); | ||||
|     connect(aptManager, &AptManager::newLtsRelease, this, &MainWindow::onNewRelease); | ||||
| } | ||||
| 
 | ||||
| MainWindow::~MainWindow() | ||||
| @ -179,19 +178,13 @@ void MainWindow::onConffileListReady(QStringList conffileList) | ||||
|     aptManager->doneWithConffiles(); | ||||
| } | ||||
| 
 | ||||
| void MainWindow::onNewLtsRelease(QString code) | ||||
| void MainWindow::onNewRelease(QString code) | ||||
| { | ||||
|     newLtsReleaseAvailable = true; | ||||
| } | ||||
| 
 | ||||
| void MainWindow::onNewStableRelease(QString code) | ||||
| { | ||||
|     newStableReleaseAvailable = true; | ||||
|     releaseCodes.append(code); | ||||
| } | ||||
| 
 | ||||
| void MainWindow::handleNewReleases() | ||||
| { | ||||
|     // TODO: Write code that informs the user when a new release is available here
 | ||||
|     newLtsReleaseAvailable = false; | ||||
|     newStableReleaseAvailable = false; | ||||
|     emit newReleaseAvailable(releaseCodes); | ||||
|     releaseCodes.clear(); | ||||
| } | ||||
|  | ||||
| @ -26,6 +26,7 @@ public: | ||||
| signals: | ||||
|     void updatesInstalled(); | ||||
|     void updatesRefreshed(); | ||||
|     void newReleaseAvailable(QStringList releaseCodes); | ||||
| 
 | ||||
| protected slots: | ||||
|     void closeEvent(QCloseEvent *event) override; | ||||
| @ -39,14 +40,12 @@ private slots: | ||||
|     void onProgressUpdate(int progress); | ||||
|     void onLogLineReady(QString logLine); | ||||
|     void onConffileListReady(QStringList conffileList); | ||||
|     void onNewLtsRelease(QString code); | ||||
|     void onNewStableRelease(QString code); | ||||
|     void onNewRelease(QString code); | ||||
| 
 | ||||
| private: | ||||
|     Ui::MainWindow *ui; | ||||
|     AptManager *aptManager; | ||||
|     bool newLtsReleaseAvailable = false; | ||||
|     bool newStableReleaseAvailable = false; | ||||
|     QStringList releaseCodes; | ||||
| 
 | ||||
|     void handleNewReleases(); | ||||
| }; | ||||
|  | ||||
| @ -2,6 +2,9 @@ | ||||
| #include "mainwindow.h" | ||||
| #include "aptmanager.h" | ||||
| 
 | ||||
| #include <QDebug> | ||||
| #include <QDir> | ||||
| #include <QFile> | ||||
| #include <QIcon> | ||||
| #include <QSystemTrayIcon> | ||||
| #include <QTimer> | ||||
| @ -12,6 +15,32 @@ Orchestrator::Orchestrator(QObject *parent) | ||||
|     checkTimer = new QTimer(); // every time this triggers, the apt database is checked for new updates
 | ||||
|     trayIcon = new QSystemTrayIcon(); // this is shown to the user to offer updates
 | ||||
| 
 | ||||
|     /*
 | ||||
|      * Parse the Lubuntu Update config file. It contains two critical pieces | ||||
|      * of info - when the system last offered the user a release upgrade, | ||||
|      * and whether the user has disabled release upgrade notifications. | ||||
|      */ | ||||
|     QFile configFile(QDir::homePath() + "/.config/lubuntu-update.conf"); | ||||
|     bool success = configFile.open(QFile::ReadOnly); | ||||
|     if (success) { | ||||
|         char lineBuf[2048]; | ||||
|         while (configFile.canReadLine()) { | ||||
|             configFile.readLine(lineBuf, 2048); | ||||
|             QString line(lineBuf); | ||||
|             line = line.trimmed(); | ||||
|             QStringList lineParts = line.split("="); | ||||
|             if (lineParts.count() == 2) { | ||||
|                 if (lineParts[0] == "nextDoReleaseUpgradeNotify") { | ||||
|                     nextUpgradeCheck = QDateTime::fromSecsSinceEpoch(lineParts[1].toLongLong()); | ||||
|                 } else { | ||||
|                     qWarning() << "Unrecognized config line: " << line; | ||||
|                 } | ||||
|             } else { | ||||
|                 qWarning() << "Wrong number of fields in line: " << line; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     connect(checkTimer, &QTimer::timeout, this, &Orchestrator::checkForUpdates); | ||||
|     connect(trayIcon, &QSystemTrayIcon::activated, this, &Orchestrator::displayUpdater); | ||||
|     connect(&updaterWindow, &MainWindow::updatesInstalled, this, &Orchestrator::handleUpdatesInstalled); | ||||
| @ -65,3 +94,46 @@ void Orchestrator::handleUpdatesRefreshed() | ||||
|     checkForUpdates(); | ||||
|     displayUpdater(); | ||||
| } | ||||
| 
 | ||||
| void Orchestrator::onNewReleaseAvailable(QStringList releaseCodes) | ||||
| { | ||||
|     // First, determine what kinds of releases the user wants to see.
 | ||||
|     QFile druTypeFile("/etc/update-manager/release-upgrades"); | ||||
|     bool success = druTypeFile.open(QFile::ReadOnly); | ||||
|     QString druType; | ||||
|     if (success) { | ||||
|         char lineBuf[2048]; | ||||
|         while (druTypeFile.canReadLine()) { | ||||
|             druTypeFile.readLine(lineBuf, 2048); | ||||
|             QString line(lineBuf); | ||||
|             line = line.trimmed(); | ||||
|             if (line == "Prompt=lts") { | ||||
|                 druType="lts"; | ||||
|                 druTypeFile.close(); | ||||
|                 break; | ||||
|             } else if (line == "Prompt=none") { | ||||
|                 // The user has disabled all upgrade prompts.
 | ||||
|                 druTypeFile.close(); | ||||
|                 return; | ||||
|             } else if (line == "Prompt=normal") { | ||||
|                 druType="normal"; | ||||
|                 druTypeFile.close(); | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     for (int i = 0;i < releaseCodes.count();i++) { | ||||
|         QStringList releaseCodeParts = releaseCodes[i].split('.'); | ||||
|         if (releaseCodeParts.count() >= 2) { | ||||
|             int releaseYear = releaseCodeParts[0].toInt(); | ||||
|             int releaseMonth = releaseCodeParts[1].toInt(); | ||||
|             if (((releaseYear % 2 == 0) && (releaseMonth == 4)) || druType == "normal") { | ||||
|                 QDateTime now = QDateTime::currentDateTime(); | ||||
|                 if (nextUpgradeCheck < now) { | ||||
|                     // TODO: attempt to show window here
 | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -3,6 +3,7 @@ | ||||
| 
 | ||||
| #include "mainwindow.h" | ||||
| 
 | ||||
| #include <QDateTime> | ||||
| #include <QObject> | ||||
| #include <QStringList> | ||||
| 
 | ||||
| @ -22,12 +23,14 @@ private slots: | ||||
|     void checkForUpdates(); | ||||
|     void handleUpdatesInstalled(); | ||||
|     void handleUpdatesRefreshed(); | ||||
|     void onNewReleaseAvailable(QStringList releaseCodes); | ||||
| 
 | ||||
| private: | ||||
|     QTimer *checkTimer; | ||||
|     QSystemTrayIcon *trayIcon; | ||||
|     QList<QStringList> updateInfo; | ||||
|     MainWindow updaterWindow; | ||||
|     QDateTime nextUpgradeCheck; | ||||
| }; | ||||
| 
 | ||||
| #endif // ORCHESTRATOR_H
 | ||||
|  | ||||
							
								
								
									
										33
									
								
								src/releaseupgradewindow.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/releaseupgradewindow.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| #include "releaseupgradewindow.h" | ||||
| #include "ui_releaseupgradewindow.h" | ||||
| 
 | ||||
| ReleaseUpgradeWindow::ReleaseUpgradeWindow(QString releaseCode, QWidget *parent) : | ||||
|     QDialog(parent), | ||||
|     ui(new Ui::ReleaseUpgradeWindow) | ||||
| { | ||||
|     ui->setupUi(this); | ||||
|     ui->upgradeLabel->setText(tr("An upgrade to Lubuntu %1 is available! Would you like to install this upgrade now?").arg(releaseCode)); | ||||
|     connect(ui->upgradeButton, &QPushButton::clicked, this, &ReleaseUpgradeWindow::onUpgradeClicked); | ||||
|     connect(ui->remindButton, &QPushButton::clicked, this, &ReleaseUpgradeWindow::onRemindClicked); | ||||
|     connect(ui->declineButton, &QPushButton::clicked, this, &ReleaseUpgradeWindow::onDeclineClicked); | ||||
| } | ||||
| 
 | ||||
| ReleaseUpgradeWindow::~ReleaseUpgradeWindow() | ||||
| { | ||||
|     delete ui; | ||||
| } | ||||
| 
 | ||||
| void ReleaseUpgradeWindow::onUpgradeClicked() | ||||
| { | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| void ReleaseUpgradeWindow::onRemindClicked() | ||||
| { | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| void ReleaseUpgradeWindow::onDeclineClicked() | ||||
| { | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										27
									
								
								src/releaseupgradewindow.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/releaseupgradewindow.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | ||||
| #ifndef RELEASEUPGRADEWINDOW_H | ||||
| #define RELEASEUPGRADEWINDOW_H | ||||
| 
 | ||||
| #include <QDialog> | ||||
| 
 | ||||
| namespace Ui { | ||||
| class ReleaseUpgradeWindow; | ||||
| } | ||||
| 
 | ||||
| class ReleaseUpgradeWindow : public QDialog | ||||
| { | ||||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit ReleaseUpgradeWindow(QString releaseCode, QWidget *parent = nullptr); | ||||
|     ~ReleaseUpgradeWindow(); | ||||
| 
 | ||||
| private slots: | ||||
|     void onUpgradeClicked(); | ||||
|     void onRemindClicked(); | ||||
|     void onDeclineClicked(); | ||||
| 
 | ||||
| private: | ||||
|     Ui::ReleaseUpgradeWindow *ui; | ||||
| }; | ||||
| 
 | ||||
| #endif // RELEASEUPGRADEWINDOW_H
 | ||||
							
								
								
									
										66
									
								
								src/releaseupgradewindow.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								src/releaseupgradewindow.ui
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,66 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>ReleaseUpgradeWindow</class> | ||||
|  <widget class="QDialog" name="ReleaseUpgradeWindow"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>393</width> | ||||
|     <height>74</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>Dialog</string> | ||||
|   </property> | ||||
|   <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|    <item> | ||||
|     <widget class="QLabel" name="upgradeLabel"> | ||||
|      <property name="text"> | ||||
|       <string>upgrade available</string> | ||||
|      </property> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item> | ||||
|     <spacer name="verticalSpacer"> | ||||
|      <property name="orientation"> | ||||
|       <enum>Qt::Vertical</enum> | ||||
|      </property> | ||||
|      <property name="sizeHint" stdset="0"> | ||||
|       <size> | ||||
|        <width>20</width> | ||||
|        <height>6</height> | ||||
|       </size> | ||||
|      </property> | ||||
|     </spacer> | ||||
|    </item> | ||||
|    <item> | ||||
|     <layout class="QHBoxLayout" name="horizontalLayout"> | ||||
|      <item> | ||||
|       <widget class="QPushButton" name="upgradeButton"> | ||||
|        <property name="text"> | ||||
|         <string>Upgrade Now</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QPushButton" name="remindButton"> | ||||
|        <property name="text"> | ||||
|         <string>Remind me later</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QPushButton" name="declineButton"> | ||||
|        <property name="text"> | ||||
|         <string>Decline Upgrade</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|     </layout> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources/> | ||||
|  <connections/> | ||||
| </ui> | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user