diff --git a/adb_controller.py b/adb_controller.py index f712ffe..b8be9af 100644 --- a/adb_controller.py +++ b/adb_controller.py @@ -13,21 +13,21 @@ os.environ["ADBUTILS_ADB_PATH"] = str(adb_bin_path) ADB_BIN_PATH = str(adb_bin_path) -def try_connect_device(addr: str, timeout: float=3.0) -> adbutils.AdbClient | None: - client = adbutils.AdbClient() +def start_adb_server() -> bool: + command = f"{ADB_BIN_PATH} start-server" try: - output = client.connect(addr, timeout) - assert len(client.device_list()) > 0 - LOGGER.write(LogType.Server, output) - except adbutils.AdbTimeout as e: - client.disconnect(addr) - LOGGER.write(LogType.Error, "Connect timeout: " + str(e)) - return None + process = subprocess.Popen( + command, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + ) + process.wait() + return True except Exception as e: - client.disconnect(addr) - LOGGER.write(LogType.Error, "Connect failed: " + str(e)) - return None - return client + process.terminate() + LOGGER.write(LogType.Error, "ADB server failed to start: " + str(e)) + return False def try_pairing(addr: str, pairing_code: str) -> bool: command = f"{ADB_BIN_PATH} pair {addr} {pairing_code}" @@ -38,12 +38,31 @@ def try_pairing(addr: str, pairing_code: str) -> bool: stderr=subprocess.PIPE, text=True, ) - process.wait() + process.wait(3) + _, stderr = process.communicate() + if stderr: raise Exception(stderr) return True except Exception as e: + process.terminate() LOGGER.write(LogType.Error, "ADB failed to pair: " + str(e)) return False +def try_connect_device(addr: str, timeout: float=3.0) -> adbutils.AdbClient | None: + client = adbutils.AdbClient() + try: + output = client.connect(addr, timeout) + assert len(client.device_list()) > 0 + LOGGER.write(LogType.Server, output) + except adbutils.AdbTimeout as e: + client.disconnect(addr) + LOGGER.write(LogType.Error, "Connect timeout: " + str(e)) + return None + except Exception as e: + client.disconnect(addr) + LOGGER.write(LogType.Error, "Connect failed: " + str(e)) + return None + return client + def get_display_size(adb_client: adbutils.AdbClient) -> tuple[int, int]: device = adb_client.device_list()[0] output = str(device.shell("dumpsys window displays")) diff --git a/main.py b/main.py index 6e58cfa..a8bf8e8 100644 --- a/main.py +++ b/main.py @@ -2,6 +2,7 @@ import sys import adbutils +from adb_controller import start_adb_server from multiprocessing import freeze_support from input.controller import main_loop from server import ADBConnectionError, InvalidDummyByteException, server_process_factory, try_connect_server @@ -50,6 +51,7 @@ def close_notification_resolver(errno: Exception | None): if __name__ == "__main__": freeze_support() + start_adb_server() open_connecting_window() server_process = server_process_factory() diff --git a/ui/connecting_window.py b/ui/connecting_window.py index 2ad9710..0a676dc 100644 --- a/ui/connecting_window.py +++ b/ui/connecting_window.py @@ -22,14 +22,15 @@ def pair_callback(): addr = addr_entry.get().strip() pairing_code = pairing_code_entry.get().strip() - if not is_valid_ip(addr): + if not is_valid_ip_port(addr): error_label.configure(text=I18N(["Invalid pairing address!", "配对地址无效!"])) return ret = try_pairing(addr, pairing_code) - if ret == False: + if not ret: error_label.configure(text=I18N(["Pairing Failed!", "配对失败!"])) return device_ip = get_ip_from_ip_port(addr) + connecting_addr_entry.delete(0, ctk.END) connecting_addr_entry.insert(0, device_ip) tabview.set(I18N(["Connecting", "连接"])) connecting_window.deiconify() @@ -131,7 +132,7 @@ def direct_connect(addr: str): nonlocal process_data_queue if not is_valid_ip(addr): process_data_queue.put( - ProcessError(I18N(["Invalid connecting address!", "配对地址无效!"]))) + ProcessError(I18N(["Invalid connecting address!", "连接地址无效!"]))) return ret = try_connect_device(addr) if ret is not None: