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

View File

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

View File

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

View File

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

View File

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