From d041298c5cb89bf07bd064f2aba1b8528da881ed Mon Sep 17 00:00:00 2001 From: Kyle Bolen Date: Sun, 2 Aug 2026 18:29:35 +0000 Subject: [PATCH] Fix adb path resolution: lazy eval instead of default param ExternalTools.resolve() called as default constructor param was evaluated at class load time, before the filesystem was checked. Use lazy delegation instead so adb path is resolved on first use. --- .../bolenpad/photophetch/device/AndroidConnector.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/com/bolenpad/photophetch/device/AndroidConnector.kt b/src/main/kotlin/com/bolenpad/photophetch/device/AndroidConnector.kt index 48ca4bf..96645ad 100644 --- a/src/main/kotlin/com/bolenpad/photophetch/device/AndroidConnector.kt +++ b/src/main/kotlin/com/bolenpad/photophetch/device/AndroidConnector.kt @@ -19,11 +19,17 @@ import kotlin.io.path.absolutePathString * Install via: brew install android-platform-tools */ class AndroidConnector( - private val adbBin: String = com.bolenpad.photophetch.util.ExternalTools.resolve("adb"), + private val adbBin: String = "adb", ) : DeviceConnector { private val log = LoggerFactory.getLogger(AndroidConnector::class.java) + // Resolve adb path lazily — ExternalTools searches Homebrew paths + // so the packaged .app finds adb even without shell PATH + private val resolvedAdb: String by lazy { + com.bolenpad.photophetch.util.ExternalTools.resolve(adbBin) + } + // Directories on Android that contain camera-roll originals. // Used as fallback if dynamic DCIM discovery finds nothing. private val fallbackCameraDirs = listOf( @@ -213,7 +219,7 @@ class AndroidConnector( private fun runAdb(serial: String?, vararg args: String): String { val cmd = buildList { - add(adbBin) + add(resolvedAdb) if (serial != null) { add("-s") add(serial)