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 618014f0..dee8c579 100644 --- a/app/src/main/java/com/coderGtm/yantra/activities/SettingsActivity.kt +++ b/app/src/main/java/com/coderGtm/yantra/activities/SettingsActivity.kt @@ -80,6 +80,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 @@ -158,6 +159,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) @@ -362,6 +364,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/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() 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 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") { 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" /> + + + + + + + Muy insalubre Peligrosa Desconocida + 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 9d2ca581..cd1156b1 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -522,8 +522,8 @@ I token usati in totale per questa conversazione sono: %1$s La cronologia messaggi dell\'IA è stata eliminata! Temperatura percepita: %1$.1f°C (%2$.1f°F)]]> - => Possibilità che piova: %1$d%% - => Possibilità che nevichi: %1$d%% + Possibilità che piova: %1$d%%]]> + Possibilità che nevichi: %1$d%%]]> Cancellare la lista init? Sei sicuro di voler cancellare il tuo script init? backup [-i] @@ -710,4 +710,5 @@ Troppe località nella richiesta Errore interno del servizio meteorologico Errore sconosciuto del servizio meteorologico + 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 904b4b98..dad73164 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -704,4 +704,5 @@ Слишком много местоположений в запросе Внутренняя ошибка службы погоды Неизвестная ошибка службы погоды + Автозапуск первого совпадения с командой LAUNCH diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index f87d0885..888844c7 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -704,4 +704,5 @@ Превише локација у захтеву Унутрашња грешка временске службе Непозната грешка временске службе + Аутоматско покретање првог подударања са LAUNCH командом diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index a0db15d8..bbb9f405 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -704,4 +704,5 @@ Занадто багато місцезнаходжень у запиті Внутрішня помилка служби погоди Невідома помилка служби погоди + Автозапуск першого збігу з командою LAUNCH diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4922a2ce..87ab1d2f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,6 +10,7 @@ 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