From 335124b8102441b196b65e318c0615d72746dc71 Mon Sep 17 00:00:00 2001 From: tobianoapps Date: Sat, 13 Sep 2025 22:21:15 -0600 Subject: [PATCH 1/7] feat: add settings toggle for launch-first-match feature --- .../yantra/activities/SettingsActivity.kt | 8 ++++++++ app/src/main/res/layout/activity_settings.xml | 20 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 29 insertions(+) diff --git a/app/src/main/java/com/coderGtm/yantra/activities/SettingsActivity.kt b/app/src/main/java/com/coderGtm/yantra/activities/SettingsActivity.kt index b593c76b..8e99f669 100644 --- a/app/src/main/java/com/coderGtm/yantra/activities/SettingsActivity.kt +++ b/app/src/main/java/com/coderGtm/yantra/activities/SettingsActivity.kt @@ -78,6 +78,7 @@ class SettingsActivity : AppCompatActivity() { private var showCurrentFolderInPrompt = false private var oneTapKeyboardActivation = true private var hideKeyboardOnEnter = true + private var launchFirstMatch = false private var actOnSuggestionTap = false private var actOnLastSecondarySuggestion = false private var initCmdLog = false @@ -152,6 +153,7 @@ class SettingsActivity : AppCompatActivity() { showCurrentFolderInPrompt = preferenceObject.getBoolean("showCurrentFolderInPrompt", false) oneTapKeyboardActivation = preferenceObject.getBoolean("oneTapKeyboardActivation",true) hideKeyboardOnEnter = preferenceObject.getBoolean("hideKeyboardOnEnter", true) + launchFirstMatch = preferenceObject.getBoolean("launchFirstMatch", false) actOnSuggestionTap = preferenceObject.getBoolean("actOnSuggestionTap", false) actOnLastSecondarySuggestion = preferenceObject.getBoolean("actOnLastSecondarySuggestion", false) initCmdLog = preferenceObject.getBoolean("initCmdLog", false) @@ -356,6 +358,12 @@ class SettingsActivity : AppCompatActivity() { preferenceEditObject.putBoolean("hideKeyboardOnEnter",isChecked).apply() changedSettingsCallback(this@SettingsActivity) } + binding.launchFirstMatchSwitch.isChecked = launchFirstMatch + binding.launchFirstMatchSwitch.setOnCheckedChangeListener { _, isChecked -> + launchFirstMatch = isChecked + preferenceEditObject.putBoolean("launchFirstMatch",isChecked).apply() + changedSettingsCallback(this@SettingsActivity) + } binding.actOnSuggestionTapSwitch.isChecked = actOnSuggestionTap binding.actOnSuggestionTapSwitch.setOnCheckedChangeListener { _, isChecked -> actOnSuggestionTap = isChecked diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index b2b933b8..6f90d52f 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -224,6 +224,26 @@ android:text="@string/hide_keyboard_on_command_enter" /> + + + + + + + Show Current Folder in Prompt Tap anywhere to open Keyboard Hide Keyboard on Command Enter + Auto-launch First Match with LAUNCH command Auto Execute command when Secondary Suggestion is Selected Log commands in the \'init\' script Change Double-Tap Command From e5e1aeac2e48d8895a84b9223ed70dcb571fbc70 Mon Sep 17 00:00:00 2001 From: tobianoapps Date: Sat, 13 Sep 2025 22:21:21 -0600 Subject: [PATCH 2/7] refactor: extract getLaunchSuggestions with result data class --- .../com/coderGtm/yantra/terminal/Helper.kt | 61 +++++++++++-------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/coderGtm/yantra/terminal/Helper.kt b/app/src/main/java/com/coderGtm/yantra/terminal/Helper.kt index 596c4582..efff1fce 100644 --- a/app/src/main/java/com/coderGtm/yantra/terminal/Helper.kt +++ b/app/src/main/java/com/coderGtm/yantra/terminal/Helper.kt @@ -28,6 +28,39 @@ import com.coderGtm.yantra.setSystemWallpaper import java.util.Locale import java.util.regex.Pattern +data class LaunchSuggestionsResult( + val suggestions: List, + val overrideLastWord: Boolean +) + +fun getLaunchSuggestions(query: String, terminal: Terminal): LaunchSuggestionsResult { + val suggestions = mutableListOf() + val candidates = terminal.appList.map { it.appName }.toMutableList() + candidates.add(0, "-s") + candidates.add(0, "-p") + + if (query.isNotEmpty()) { + val regex = Regex(Pattern.quote(query), RegexOption.IGNORE_CASE) + for (app in candidates) { + if (regex.containsMatchIn(app) && !suggestions.contains(app)) { + if (app.substring(0, query.length).lowercase() == query) { + suggestions.add(0, app) + continue + } + suggestions.add(app) + } + } + return LaunchSuggestionsResult(suggestions, true) + } else { + for (app in candidates) { + if (!suggestions.contains(app)) { + suggestions.add(app) + } + } + return LaunchSuggestionsResult(suggestions, false) + } +} + fun showSuggestions( rawInput: String, getPrimarySuggestions: Boolean, @@ -72,31 +105,9 @@ fun showSuggestions( if (!terminal.appListFetched) { return@Thread } - val candidates = terminal.appList.map { it.appName }.toMutableList() - candidates.add(0, "-s") - candidates.add(0, "-p") - if (args.size>1) { - //search using regex - overrideLastWord = true - - val regex = Regex(Pattern.quote(reg), RegexOption.IGNORE_CASE) - for (app in candidates) { - if (regex.containsMatchIn(app) && !suggestions.contains(app)) { - if (app.substring(0, reg.length).lowercase() == reg && reg.isNotEmpty()){ - suggestions.add(0, app) - continue - } - suggestions.add(app) - } - } - } - else { - for (app in candidates) { - if (!suggestions.contains(app)) { - suggestions.add(app) - } - } - } + val launchSuggestions = getLaunchSuggestions(reg, terminal) + suggestions.addAll(launchSuggestions.suggestions) + overrideLastWord = launchSuggestions.overrideLastWord isPrimary = false } else if (effectivePrimaryCmd == "open") { From a82569007173ec6a6774615c159e0d8fb3453e5b Mon Sep 17 00:00:00 2001 From: tobianoapps Date: Sat, 13 Sep 2025 22:21:26 -0600 Subject: [PATCH 3/7] feat: add findFirstMatchingApp function --- .../com/coderGtm/yantra/commands/launch/Helper.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/src/main/java/com/coderGtm/yantra/commands/launch/Helper.kt b/app/src/main/java/com/coderGtm/yantra/commands/launch/Helper.kt index 28cbe784..d75fef1e 100644 --- a/app/src/main/java/com/coderGtm/yantra/commands/launch/Helper.kt +++ b/app/src/main/java/com/coderGtm/yantra/commands/launch/Helper.kt @@ -8,6 +8,8 @@ import android.os.UserManager import com.coderGtm.yantra.R import com.coderGtm.yantra.models.AppBlock import com.coderGtm.yantra.models.ShortcutBlock +import com.coderGtm.yantra.terminal.Terminal +import com.coderGtm.yantra.terminal.getLaunchSuggestions fun launchApp(command: Command, app: AppBlock) { val launcher = command.terminal.activity.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps @@ -37,4 +39,17 @@ fun launchShortcut(command: Command, shortcut: ShortcutBlock) { fun isDefaultUser(user: UserHandle, command: Command): Boolean { val userManager = command.terminal.activity.getSystemService(Context.USER_SERVICE) as UserManager return user == userManager.userProfiles[0] +} + +fun findFirstMatchingApp(query: String, terminal: Terminal): AppBlock? { + if (query.isEmpty()) return null + + val launchSuggestions = getLaunchSuggestions(query, terminal) + + val firstAppSuggestion = launchSuggestions.suggestions.firstOrNull { it != "-p" && it != "-s" } + ?: return null + + return terminal.appList.find { + it.appName == firstAppSuggestion && it.packageName != terminal.activity.packageName + } } \ No newline at end of file From 2ed7b1610fa3471f13bf5a51eb9150113d8d36fb Mon Sep 17 00:00:00 2001 From: tobianoapps Date: Sat, 13 Sep 2025 22:21:32 -0600 Subject: [PATCH 4/7] feat: implement launch-first-match in LAUNCH command --- .../com/coderGtm/yantra/commands/launch/Command.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/src/main/java/com/coderGtm/yantra/commands/launch/Command.kt b/app/src/main/java/com/coderGtm/yantra/commands/launch/Command.kt index eedbeb01..2d8c184f 100644 --- a/app/src/main/java/com/coderGtm/yantra/commands/launch/Command.kt +++ b/app/src/main/java/com/coderGtm/yantra/commands/launch/Command.kt @@ -95,6 +95,20 @@ class Command(terminal: Terminal) : BaseCommand(terminal) { val name = command.removePrefix(args[0]).trim().lowercase() + val launchFirstMatch = terminal.preferenceObject.getBoolean("launchFirstMatch", false) + if (launchFirstMatch) { + val firstMatch = findFirstMatchingApp(name, terminal) + if (firstMatch != null) { + output(terminal.activity.getString(R.string.launching_app, firstMatch.appName, firstMatch.packageName), terminal.theme.successTextColor) + launchApp(this@Command, firstMatch) + if (terminal.preferenceObject.getInt("appSortMode", AppSortMode.A_TO_Z.value) == AppSortMode.RECENT.value) { + terminal.appList.remove(firstMatch) + terminal.appList.add(0, firstMatch) + } + return + } + } + output(terminal.activity.getString(R.string.locating_app, name), terminal.theme.resultTextColor, Typeface.ITALIC) val candidates = mutableListOf() From 346c6c00b3ba87ee0309891a7314ad54a083cc53 Mon Sep 17 00:00:00 2001 From: tobianoapps Date: Sat, 13 Sep 2025 22:32:05 -0600 Subject: [PATCH 5/7] fix: remove typo preventing successful build --- app/src/main/res/values-it/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 713b9d8b..83a97d19 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -582,7 +582,7 @@ Modello dell\'IA aggiornato! Non è possibile cambiare lo stato del Bluetooth in questa versione d Android a causa di restrizioni del sistema. Aggiornamento dello script fallito! - Seleziona un'opzione per modificare %1$s + Seleziona un\'opzione per modificare %1$s Launcher\'s editor Editor di testo esterno Nessun editor di testo disponibile From 55f64ec0f6552dcab4dabcb7da250fd5b500f58f Mon Sep 17 00:00:00 2001 From: tobianoapps Date: Sat, 13 Sep 2025 22:45:06 -0600 Subject: [PATCH 6/7] i18n: add translations for launch-first-match setting --- app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sr/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + 5 files changed, 5 insertions(+) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 98f91479..531435c2 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -602,4 +602,5 @@ Importado: %1$s Selecciona un tema para eliminar El tema %1$s se eliminó correctamente. + Auto-ejecutar primera coincidencia con comando LAUNCH diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 83a97d19..1e3eb415 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -602,4 +602,5 @@ %1$s importato Seleziona un tema da cancellare Tema %1$s rimosso con successo. + Auto-avvia prima corrispondenza con il comando LAUNCH diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c8def914..edf1c3c7 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -602,4 +602,5 @@ Импортировано: %1$s Выберите тему для удаления Тема %1$s успешно удалена. + Автозапуск первого совпадения с командой LAUNCH diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index a6fb0ea6..96d18d37 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -602,4 +602,5 @@ Увезено %1$s Изаберите тему за брисање Тема %1$s је успешно уклоњена. + Аутоматско покретање првог подударања са LAUNCH командом diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 235d1beb..27956148 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -602,4 +602,5 @@ Імпортовано: %1$s Виберіть тему для видалення Тему %1$s успішно видалено. + Автозапуск першого збігу з командою LAUNCH From 7f1c1b29c114583114ab2a21ff71936511650293 Mon Sep 17 00:00:00 2001 From: tobianoapps Date: Sat, 4 Oct 2025 14:50:50 -0600 Subject: [PATCH 7/7] fix: fix string res names --- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sr/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 1a0c0997..e0d92a02 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -702,5 +702,5 @@ Muy insalubre Peligrosa Desconocida - Auto-ejecutar primera coincidencia con comando LAUNCH + Auto-ejecutar primera coincidencia con comando LAUNCH diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index ef63227b..cd1156b1 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -710,5 +710,5 @@ Troppe località nella richiesta Errore interno del servizio meteorologico Errore sconosciuto del servizio meteorologico - Auto-avvia prima corrispondenza con il comando LAUNCH + Auto-avvia prima corrispondenza con il comando LAUNCH diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f07ff605..dad73164 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -704,5 +704,5 @@ Слишком много местоположений в запросе Внутренняя ошибка службы погоды Неизвестная ошибка службы погоды - Автозапуск первого совпадения с командой LAUNCH + Автозапуск первого совпадения с командой LAUNCH diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index be4e5bc4..888844c7 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -704,5 +704,5 @@ Превише локација у захтеву Унутрашња грешка временске службе Непозната грешка временске службе - Аутоматско покретање првог подударања са LAUNCH командом + Аутоматско покретање првог подударања са LAUNCH командом diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 43617103..bbb9f405 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -704,5 +704,5 @@ Занадто багато місцезнаходжень у запиті Внутрішня помилка служби погоди Невідома помилка служби погоди - Автозапуск першого збігу з командою LAUNCH + Автозапуск першого збігу з командою LAUNCH