mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-04-26 14:23:09 +00:00
waydroid: Use KAuth progressStep
This commit is contained in:
parent
4450031dee
commit
a2b9e98801
5 changed files with 119 additions and 3 deletions
|
|
@ -15,11 +15,16 @@
|
|||
#include <QLoggingCategory>
|
||||
#include <QObject>
|
||||
#include <QProcess>
|
||||
#include <QRegularExpression>
|
||||
|
||||
using namespace Qt::StringLiterals;
|
||||
|
||||
#define WAYDROID_COMMAND "waydroid"
|
||||
|
||||
// Extract current downloaded size, total_size and speed.
|
||||
// Example of log: "[Downloading] 62.19 MB/1197.24 MB 96740.75 kbps(approx.)"
|
||||
static const QRegularExpression downloadingStatusRegExp(R"(\[Downloading]\s*(\d+\.\d+)\s*MB/(\d+\.\d+)\s*MB\s*(\d+\.\d+)\s*kbps\(approx\.\))");
|
||||
|
||||
class WaydroidHelper : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
|
@ -41,7 +46,42 @@ KAuth::ActionReply WaydroidHelper::initialize(const QVariantMap &args)
|
|||
|
||||
QProcess *process = new QProcess(this);
|
||||
process->start(WAYDROID_COMMAND, arguments);
|
||||
process->waitForFinished();
|
||||
|
||||
connect(process, &QProcess::readyReadStandardOutput, this, [process]() {
|
||||
const QByteArray output = process->readAllStandardOutput();
|
||||
const QByteArray lastLine = output.split('\r').last();
|
||||
|
||||
QVariantMap informations = {{u"log"_s, lastLine.constData()}};
|
||||
|
||||
QRegularExpressionMatch match = downloadingStatusRegExp.match(lastLine);
|
||||
if (!match.hasMatch()) {
|
||||
KAuth::HelperSupport::progressStep(informations);
|
||||
return;
|
||||
}
|
||||
|
||||
const QString downloadMatch = match.captured(1);
|
||||
const QString totalMatch = match.captured(2);
|
||||
const QString speedMatch = match.captured(3);
|
||||
if (downloadMatch.isEmpty() || totalMatch.isEmpty() || speedMatch.isEmpty()) {
|
||||
KAuth::HelperSupport::progressStep(informations);
|
||||
return;
|
||||
}
|
||||
|
||||
bool downloadCastOk, totalCastOk, speedCastOk;
|
||||
float downloadedMB = downloadMatch.toFloat(&downloadCastOk);
|
||||
float totalMB = totalMatch.toFloat(&totalCastOk);
|
||||
float speedKbps = speedMatch.toFloat(&speedCastOk);
|
||||
|
||||
if (downloadCastOk && totalCastOk && speedCastOk) {
|
||||
informations.insert(u"downloaded"_s, downloadedMB);
|
||||
informations.insert(u"total"_s, totalMB);
|
||||
informations.insert(u"speed"_s, speedKbps);
|
||||
}
|
||||
|
||||
KAuth::HelperSupport::progressStep(informations);
|
||||
});
|
||||
|
||||
process->waitForFinished(-1);
|
||||
|
||||
if (process->exitCode() == 0) {
|
||||
return KAuth::ActionReply::SuccessReply();
|
||||
|
|
|
|||
|
|
@ -220,6 +220,16 @@ void WaydroidState::initialize(const SystemType systemType, const RomType romTyp
|
|||
KAuth::ExecuteJob *job = writeAction.execute();
|
||||
job->start();
|
||||
|
||||
connect(job, &KAuth::ExecuteJob::newData, this, [this](const QVariantMap &data) {
|
||||
QString log = data.value("log", "").toString();
|
||||
float downloaded = data.value("downloaded", 0.0).toFloat();
|
||||
float total = data.value("total", 0.0).toFloat();
|
||||
float speed = data.value("speed", 0.0).toFloat();
|
||||
|
||||
qCDebug(WAYDROIDINTEGRATIONPLUGIN) << "log: " << log;
|
||||
Q_EMIT downloadStatusChanged(downloaded, total, speed);
|
||||
});
|
||||
|
||||
connect(job, &KAuth::ExecuteJob::finished, this, [this](KJob *job, auto) {
|
||||
if (job->error() == 0) {
|
||||
m_status = Initialized;
|
||||
|
|
|
|||
|
|
@ -118,6 +118,8 @@ public:
|
|||
|
||||
Q_SIGNALS:
|
||||
void statusChanged();
|
||||
// download and total is in MB and speed in Kbps
|
||||
void downloadStatusChanged(float downloaded, float total, float speed);
|
||||
void sessionStatusChanged();
|
||||
void systemTypeChanged();
|
||||
void ipAddressChanged();
|
||||
|
|
|
|||
53
kcms/waydroidintegration/ui/WaydroidDownloadStatus.qml
Normal file
53
kcms/waydroidintegration/ui/WaydroidDownloadStatus.qml
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* SPDX-FileCopyrightText: 2025 Florian RICHER <florian.richer@protonmail.com>
|
||||
* SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
*/
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Layouts 1.15
|
||||
import QtQuick.Controls 2.15 as QQC2
|
||||
|
||||
import org.kde.kirigami 2.19 as Kirigami
|
||||
import org.kde.plasma.components 3.0 as PC3
|
||||
|
||||
ColumnLayout {
|
||||
id: root
|
||||
property string text
|
||||
property real downloaded: 0.0
|
||||
property real total: 0.0
|
||||
property real speed: 0.0
|
||||
|
||||
anchors.centerIn: parent
|
||||
spacing: Kirigami.Units.largeSpacing
|
||||
|
||||
QQC2.Label {
|
||||
text: root.text
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
}
|
||||
|
||||
QQC2.ProgressBar {
|
||||
from: 0
|
||||
value: downloaded
|
||||
to: total
|
||||
indeterminate: total <= 0.0
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
}
|
||||
|
||||
QQC2.Label {
|
||||
visible: total > 0.0
|
||||
text: i18n("Downloading %1MB/%2MB Speed %3", downloaded.toFixed(2), total.toFixed(2), formatSpeed())
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
font.pixelSize: Kirigami.Theme.smallFont.pixelSize
|
||||
}
|
||||
|
||||
function formatSpeed(): string {
|
||||
if (speed > 1024) {
|
||||
return i18n("%1Mb/s", (speed / 1024).toFixed(0))
|
||||
} else {
|
||||
return i18n("%1Kb/s", speed.toFixed(0))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -46,9 +46,20 @@ KCM.SimpleKCM {
|
|||
visible: AIP.WaydroidState.errorTitle === "" && AIP.WaydroidState.status == AIP.WaydroidState.NotInitialized
|
||||
}
|
||||
|
||||
WaydroidLoader {
|
||||
WaydroidDownloadStatus {
|
||||
id: downloadStatus
|
||||
visible: AIP.WaydroidState.errorTitle === "" && AIP.WaydroidState.status == AIP.WaydroidState.Initializing
|
||||
text: i18n("Waydroid is initializing.\nIt can take a few minutes.")
|
||||
text: i18n("Downloading Android and vendor images.\nIt can take a few minutes.")
|
||||
|
||||
Connections {
|
||||
target: AIP.WaydroidState
|
||||
|
||||
function onDownloadStatusChanged(downloaded, total, speed) {
|
||||
downloadStatus.downloaded = downloaded
|
||||
downloadStatus.total = total
|
||||
downloadStatus.speed = speed
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
|
|
|
|||
Loading…
Reference in a new issue