fix: 启动时恢复已保存的 Android 设备 (#26)

This commit is contained in:
chengma
2026-08-07 14:53:28 +08:00
parent e40ce5a13c
commit dc9b000a36
4 changed files with 253 additions and 14 deletions
+57 -10
View File
@@ -6,7 +6,14 @@
from typing import Optional
from PyQt5.QtCore import QCoreApplication, QObject, QThread, pyqtSignal, pyqtSlot
from PyQt5.QtCore import (
QCoreApplication,
QObject,
QThread,
QTimer,
pyqtSignal,
pyqtSlot,
)
from .android_device_service import (
AndroidDeviceConversionCancelled,
@@ -97,15 +104,20 @@ class CurrentClientSaveWorker(QObject):
class AndroidDeviceSearchWorker(QObject):
"""在后台线程查询 ADB,结果只通过信号返回主线程。"""
"""在后台搜索设备,也可先恢复一台已保存设备。"""
succeeded = pyqtSignal(object)
failed = pyqtSignal(str)
completed = pyqtSignal()
def __init__(self, service: AndroidDeviceService):
def __init__(
self,
service: AndroidDeviceService,
restore_serial: str = "",
):
super().__init__()
self._service = service
self._restore_serial = restore_serial
self._cancelled = False
def cancel(self) -> None:
@@ -117,7 +129,13 @@ class AndroidDeviceSearchWorker(QObject):
def run(self) -> None:
try:
try:
devices = self._service.search(lambda: self._cancelled)
if self._restore_serial:
devices = self._service.restore_saved_device(
self._restore_serial,
lambda: self._cancelled,
)
else:
devices = self._service.search(lambda: self._cancelled)
except AndroidDeviceSearchError as exc:
if not self._cancelled:
self.failed.emit(str(exc))
@@ -247,6 +265,7 @@ class SettingsPageEventBinder(QObject):
self._thread: Optional[QThread] = None
self._worker: Optional[CurrentClientSaveWorker] = None
self._search_busy = False
self._search_restore_serial = ""
self._search_thread: Optional[QThread] = None
self._search_worker: Optional[AndroidDeviceSearchWorker] = None
self._wifi_conversion_busy = False
@@ -306,6 +325,8 @@ class SettingsPageEventBinder(QObject):
self._load_current_client()
self._load_selected_android_device()
self._sync_button_state()
if self._saved_android_serial:
QTimer.singleShot(0, self._request_restore_saved_android_device)
@pyqtSlot()
def _request_save_current_device(self) -> None:
@@ -385,6 +406,15 @@ class SettingsPageEventBinder(QObject):
@pyqtSlot()
def _start_search(self) -> None:
self._start_search_worker()
@pyqtSlot()
def _request_restore_saved_android_device(self) -> None:
if not self._saved_android_serial:
return
self._start_search_worker(self._saved_android_serial)
def _start_search_worker(self, restore_serial: str = "") -> None:
if (
self._closing
or self._busy
@@ -396,11 +426,20 @@ class SettingsPageEventBinder(QObject):
return
self._search_busy = True
self._search_restore_serial = restore_serial
self._sync_button_state()
self._page.deviceStatusLabel.setText("正在搜索 Android 设备…")
status = (
f"正在恢复已保存设备:{restore_serial}…"
if restore_serial
else "正在搜索 Android 设备…"
)
self._page.deviceStatusLabel.setText(status)
thread = QThread(self)
worker = AndroidDeviceSearchWorker(self._android_device_service)
worker = AndroidDeviceSearchWorker(
self._android_device_service,
restore_serial,
)
worker.moveToThread(thread)
thread.started.connect(worker.run)
@@ -687,8 +726,9 @@ class SettingsPageEventBinder(QObject):
self._page.deviceTableModel.set_checked_serial(
self._saved_android_serial
)
action = "恢复完成" if self._search_restore_serial else "搜索完成"
self._page.deviceStatusLabel.setText(
f"搜索完成:找到 {len(rows)} 台 Android 设备;"
f"{action}:找到 {len(rows)} 台 Android 设备;"
"已自动选择当前使用设备"
)
elif self._saved_android_serial:
@@ -709,15 +749,22 @@ class SettingsPageEventBinder(QObject):
def _on_search_failed(self, message: str) -> None:
if self._closing:
return
self._page.deviceStatusLabel.setText(
f"搜索失败:{message};设备列表和已保存配置未更改"
)
if self._search_restore_serial:
self._page.deviceStatusLabel.setText(
f"自动恢复失败:{message};已保存配置未更改,"
"可点击搜索重试"
)
else:
self._page.deviceStatusLabel.setText(
f"搜索失败:{message};设备列表和已保存配置未更改"
)
@pyqtSlot()
def _on_search_thread_finished(self) -> None:
self._search_worker = None
self._search_thread = None
self._search_busy = False
self._search_restore_serial = ""
if not self._closing:
self._sync_button_state()