From 0be4ea5fdf6c9cb8ca507dc605c1a589f20d4284 Mon Sep 17 00:00:00 2001 From: Nozomi-Hijikata Date: Fri, 4 Sep 2026 17:33:49 +0900 Subject: [PATCH] fix: restore default Android SDK discovery Recover when onboarding completes without persisting androidHome by validating the default SDK path at startup and saving it only when Android support is enabled and available. Preserve custom SDK paths and iOS-only setups, and cover the fallback behavior with unit tests. --- MiniSim/MiniSim.swift | 5 +++++ MiniSim/Service/Adb.swift | 16 ++++++++++++++++ MiniSimTests/ADBTests.swift | 25 +++++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/MiniSim/MiniSim.swift b/MiniSim/MiniSim.swift index 961a420..8dbdaf7 100644 --- a/MiniSim/MiniSim.swift +++ b/MiniSim/MiniSim.swift @@ -80,6 +80,11 @@ class MiniSim: NSObject { onboarding.show() return } + + if UserDefaults.standard.enableAndroidEmulators { + _ = try? ADB.configureDefaultAndroidHomeIfNeeded() + } + menu = Menu() statusItem.menu = menu setMenuImage() diff --git a/MiniSim/Service/Adb.swift b/MiniSim/Service/Adb.swift index aa9eb30..e2cb832 100644 --- a/MiniSim/Service/Adb.swift +++ b/MiniSim/Service/Adb.swift @@ -57,6 +57,22 @@ final class ADB: ADBProtocol { return path + Paths.home.rawValue } + /** + Persists the default Android SDK path when a valid SDK exists and no path was saved during onboarding. + */ + @discardableResult static func configureDefaultAndroidHomeIfNeeded( + fileManager: FileManager = .default + ) throws -> Bool { + guard UserDefaults.standard.androidHome == nil else { + return false + } + + let androidHome = try getAndroidHome() + try checkAndroidHome(path: androidHome, fileManager: fileManager) + UserDefaults.standard.androidHome = androidHome + return true + } + static func getAdbPath() throws -> String { try getAndroidHome() + Paths.adb.rawValue } diff --git a/MiniSimTests/ADBTests.swift b/MiniSimTests/ADBTests.swift index 6cde317..8158507 100644 --- a/MiniSimTests/ADBTests.swift +++ b/MiniSimTests/ADBTests.swift @@ -48,6 +48,31 @@ final class ADBTests: XCTestCase { ) } + func testConfigureDefaultAndroidHomeIfNeeded() throws { + XCTAssertTrue( + try ADB.configureDefaultAndroidHomeIfNeeded(fileManager: FileManagerStub()) + ) + XCTAssertEqual(UserDefaults.standard.androidHome, defaultHomePath) + XCTAssertEqual(shellStub.lastExecutedCommand, defaultHomePath + "/emulator/emulator") + XCTAssertEqual(shellStub.lastPassedArguments, ["-list-avds"]) + } + + func testConfigureDefaultAndroidHomeIfNeededDoesNotOverrideSavedPath() throws { + UserDefaults.standard.androidHome = "customAndroidHome" + + XCTAssertFalse( + try ADB.configureDefaultAndroidHomeIfNeeded(fileManager: FileManagerStub()) + ) + XCTAssertEqual(UserDefaults.standard.androidHome, "customAndroidHome") + } + + func testConfigureDefaultAndroidHomeIfNeededRequiresValidSDK() { + XCTAssertThrowsError( + try ADB.configureDefaultAndroidHomeIfNeeded(fileManager: FileManagerEmptyStub()) + ) + XCTAssertNil(UserDefaults.standard.androidHome) + } + func testCheckAndroidHome() throws { let output = try ADB.checkAndroidHome( path: defaultHomePath,