fix: 修复跨端协同设备列表数量显示不对的问题。

1.原有获取设备数错误,已修复。
2.修改设备列表以设备uuid为标识一台设备方案,改为使用MachinePath,避免服务挂掉重启后,设备列表不更新导致设备连接异常。
3.增加页面显示判断后端服务valid,如果invalid,则清空设备列表数据。
4.去掉自动扫描功能,后端已提供定时发送扫描的全量设备。

Log: 修复跨端协同设备列表数量显示不对的问题。
Bug: https://pms.uniontech.com/task-view-203831.html
Influence: 跨端协同设备数量,及设备协同连接。
Change-Id: I3a2cb2f5f77f36df89db53e135838c79df8498ed
This commit is contained in:
zhaoyingzhen 2022-10-17 14:08:46 +08:00
parent 480f621fbf
commit 7ffb1e0188
5 changed files with 61 additions and 74 deletions

View File

@ -39,7 +39,6 @@ static const QString ColPropertiesInterface = "org.freedesktop.DBus.Properties";
CollaborationDevModel::CollaborationDevModel(QObject *parent)
: QObject(parent)
, m_timer(new QTimer(this))
, m_colDbusInter(new QDBusInterface(CollaborationService, CollaborationPath, CollaborationInterface, QDBusConnection::sessionBus(), this))
{
if (m_colDbusInter->isValid()) {
@ -56,21 +55,18 @@ CollaborationDevModel::CollaborationDevModel(QObject *parent)
}
m_colDbusInter->connection().connect(CollaborationService, CollaborationPath, ColPropertiesInterface,
"PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(QDBusMessage)));
connect(m_timer, &QTimer::timeout, this, &CollaborationDevModel::callScanMethod);
"PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(QDBusMessage)));
}
void CollaborationDevModel::scanDevice()
void CollaborationDevModel::checkServiceValid()
{
callScanMethod();
m_timer->start(30 * 1000); // 30s
}
void CollaborationDevModel::stopScanDevice()
{
if (m_timer->isActive())
m_timer->stop();
if (!m_colDbusInter->isValid()) {
for (CollaborationDevice *device : m_devices) {
device->deleteLater();
}
m_devices.clear();
Q_EMIT devicesChanged();
}
}
QList<CollaborationDevice *> CollaborationDevModel::devices() const
@ -90,17 +86,15 @@ void CollaborationDevModel::onPropertyChanged(const QDBusMessage &msg)
QVariantMap changedProps = qdbus_cast<QVariantMap>(arguments.at(1).value<QDBusArgument>());
if (changedProps.contains("Machines")) {
QStringList devPaths = changedProps.value("Machines").toStringList();
QList<QDBusObjectPath> paths = m_colDbusInter->property("Machines").value<QList<QDBusObjectPath>>();
QStringList devPaths;
for (const QDBusObjectPath& path : paths) {
devPaths << path.path();
}
updateDevice(devPaths);
}
}
void CollaborationDevModel::callScanMethod()
{
// TODO 该功能目前不可用
// m_dbusInter->asyncCall("Scan");
}
void CollaborationDevModel::updateDevice(const QStringList &devPaths)
{
if (devPaths.isEmpty()) {
@ -132,16 +126,9 @@ void CollaborationDevModel::updateDevice(const QStringList &devPaths)
emit devicesChanged();
}
const CollaborationDevice *CollaborationDevModel::getDevice(const QString &uuid)
const CollaborationDevice *CollaborationDevModel::getDevice(const QString &machinePath)
{
QList<CollaborationDevice *> devices = m_devices.values();
for (const CollaborationDevice *device : devices) {
if (device->uuid() == uuid) {
return device;
}
}
return nullptr;
return m_devices.value(machinePath, nullptr);
}
CollaborationDevice::CollaborationDevice(const QString &devPath, QObject *parent)
@ -184,6 +171,11 @@ QString CollaborationDevice::uuid() const
return m_uuid;
}
QString CollaborationDevice::machinePath() const
{
return m_path;
}
QString CollaborationDevice::deviceIcon() const
{
switch (m_OS) {

View File

@ -43,20 +43,18 @@ signals:
void devicesChanged();
public:
void scanDevice();
void stopScanDevice();
void checkServiceValid();
QList<CollaborationDevice *> devices() const;
const CollaborationDevice *getDevice(const QString &uuid);
const CollaborationDevice *getDevice(const QString &machinePath);
private slots:
void onPropertyChanged(const QDBusMessage &msg);
private:
void callScanMethod();
void updateDevice(const QStringList &devPaths);
private:
QTimer *m_timer; // 定时扫描设备
QDBusInterface *m_colDbusInter;
// machine path : device object
QMap<QString, CollaborationDevice *> m_devices;
@ -84,6 +82,7 @@ public:
QString name() const;
QString uuid() const;
QString machinePath() const;
QString deviceIcon() const;
bool isPaired() const;
bool isCooperated() const;

View File

@ -54,18 +54,11 @@ DevCollaborationWidget::DevCollaborationWidget(QWidget *parent)
void DevCollaborationWidget::showEvent(QShowEvent *event)
{
m_deviceModel->scanDevice();
m_deviceModel->checkServiceValid();
QWidget::showEvent(event);
}
void DevCollaborationWidget::hideEvent(QHideEvent *event)
{
m_deviceModel->stopScanDevice();
QWidget::hideEvent(event);
}
void DevCollaborationWidget::initUI()
{
m_deviceListView->setModel(m_viewItemModel);
@ -133,12 +126,12 @@ void DevCollaborationWidget::addItem(const CollaborationDevice *device)
int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None;
item->setData(QVariant::fromValue(data), DevItemDelegate::StaticDataRole);
item->setData(device->uuid(), DevItemDelegate::UUIDDataRole);
item->setData(device->machinePath(), DevItemDelegate::MachinePathDataRole);
item->setData(0, DevItemDelegate::DegreeDataRole);
item->setData(resultState, DevItemDelegate::ResultDataRole);
m_viewItemModel->appendRow(item);
m_uuidItemMap[device->uuid()] = item;
m_deviceItemMap[device->machinePath()] = item;
connect(device, &CollaborationDevice::pairedStateChanged, this, &DevCollaborationWidget::itemStatusChanged);
}
@ -157,24 +150,24 @@ void DevCollaborationWidget::updateDeviceListView()
if (!item)
continue;
QString uuid = item->data(DevItemDelegate::UUIDDataRole).toString();
if (m_deviceModel->getDevice(uuid))
QString machinePath = item->data(DevItemDelegate::MachinePathDataRole).toString();
if (m_deviceModel->getDevice(machinePath))
continue;
m_deviceListView->removeItem(row);
if (m_uuidItemMap.contains(uuid)) {
m_uuidItemMap.remove(uuid);
if (m_deviceItemMap.contains(machinePath)) {
m_deviceItemMap.remove(machinePath);
}
if (m_connectingDevices.contains(uuid)) {
m_connectingDevices.removeAll(uuid);
if (m_connectingDevices.contains(machinePath)) {
m_connectingDevices.removeAll(machinePath);
}
}
// 处理新增
for (CollaborationDevice *device : devices) {
if (!m_uuidItemMap.contains(device->uuid())) {
if (!m_deviceItemMap.contains(device->machinePath())) {
addItem(device);
}
}
@ -189,19 +182,23 @@ void DevCollaborationWidget::resetWidgetSize()
void DevCollaborationWidget::itemClicked(const QModelIndex &index)
{
QString uuid = index.data(DevItemDelegate::UUIDDataRole).toString();
const CollaborationDevice *device = m_deviceModel->getDevice(uuid);
QString machinePath = index.data(DevItemDelegate::MachinePathDataRole).toString();
const CollaborationDevice *device = m_deviceModel->getDevice(machinePath);
if (!device)
return;
if (!device->isPaired()) {
device->pair();
m_connectingDevices.append(uuid);
if (!m_connectingDevices.contains(machinePath))
m_connectingDevices.append(machinePath);
} else if (!device->isCooperated()) {
device->requestCooperate();
m_connectingDevices.append(uuid);
if (!m_connectingDevices.contains(machinePath))
m_connectingDevices.append(machinePath);
} else if (device->isCooperated()) {
device->disconnectDevice();
if (m_connectingDevices.contains(machinePath))
m_connectingDevices.removeOne(machinePath);
}
if (!m_connectingDevices.isEmpty() && !m_refreshTimer->isActive())
@ -214,18 +211,18 @@ void DevCollaborationWidget::itemStatusChanged()
if (!device)
return;
QString uuid = device->uuid();
if (m_uuidItemMap.contains(uuid) && m_uuidItemMap[uuid]) {
QString machinePath = device->machinePath();
if (m_deviceItemMap.contains(machinePath) && m_deviceItemMap[machinePath]) {
// 更新item的连接状态
int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None;
m_uuidItemMap[uuid]->setData(resultState, DevItemDelegate::ResultDataRole);
m_deviceItemMap[machinePath]->setData(resultState, DevItemDelegate::ResultDataRole);
if (device->isCooperated())
m_uuidItemMap[uuid]->setData(0, DevItemDelegate::DegreeDataRole);
m_deviceItemMap[machinePath]->setData(0, DevItemDelegate::DegreeDataRole);
m_deviceListView->update(m_uuidItemMap[uuid]->index());
m_deviceListView->update(m_deviceItemMap[machinePath]->index());
if (resultState == DevItemDelegate::Connected && m_connectingDevices.contains(uuid)) {
m_connectingDevices.removeAll(uuid);
if (resultState == DevItemDelegate::Connected && m_connectingDevices.contains(machinePath)) {
m_connectingDevices.removeAll(machinePath);
}
}
}
@ -237,13 +234,13 @@ void DevCollaborationWidget::refreshViewItem()
return;
}
for (const QString &uuid : m_connectingDevices) {
if (m_uuidItemMap.contains(uuid) && m_uuidItemMap[uuid]) {
int degree = m_uuidItemMap[uuid]->data(DevItemDelegate::DegreeDataRole).toInt();
for (const QString &machinePath : m_connectingDevices) {
if (m_deviceItemMap.contains(machinePath) && m_deviceItemMap[machinePath]) {
int degree = m_deviceItemMap[machinePath]->data(DevItemDelegate::DegreeDataRole).toInt();
degree += PER_DEGREE; // 递进值
m_uuidItemMap[uuid]->setData(DevItemDelegate::Connecting, DevItemDelegate::ResultDataRole);
m_uuidItemMap[uuid]->setData(degree, DevItemDelegate::DegreeDataRole);
m_deviceListView->update(m_uuidItemMap[uuid]->index());
m_deviceItemMap[machinePath]->setData(DevItemDelegate::Connecting, DevItemDelegate::ResultDataRole);
m_deviceItemMap[machinePath]->setData(degree, DevItemDelegate::DegreeDataRole);
m_deviceListView->update(m_deviceItemMap[machinePath]->index());
}
}
}

View File

@ -41,7 +41,6 @@ public:
protected:
void showEvent(QShowEvent *event) override;
void hideEvent(QHideEvent *event) override;
private slots:
void loadDevice();
@ -60,7 +59,7 @@ private:
CollaborationDevModel *m_deviceModel;
DListView *m_deviceListView;
QStandardItemModel *m_viewItemModel;
QMap<QString, QStandardItem *> m_uuidItemMap;
QMap<QString, QStandardItem *> m_deviceItemMap;
QStringList m_connectingDevices;
QTimer *m_refreshTimer;

View File

@ -31,10 +31,10 @@ class DevItemDelegate : public QStyledItemDelegate
Q_OBJECT
public:
enum DevItemDataRole {
StaticDataRole = Qt::UserRole + 1, // 静态信息
UUIDDataRole = Qt::UserRole + 2, // uuid, 可唯一代表一个设备
DegreeDataRole = Qt::UserRole + 3, // degree 绘制waiting使用的参数
ResultDataRole = Qt::UserRole + 4 // 连接结果
StaticDataRole = Qt::UserRole + 1, // 静态信息
MachinePathDataRole = Qt::UserRole + 2, // machinePath, 可唯一代表一个设备
DegreeDataRole = Qt::UserRole + 3, // degree 绘制waiting使用的参数
ResultDataRole = Qt::UserRole + 4 // 连接结果
};
enum ResultState {