From 4d84995e5d5f91bdf5bea0641b3ec88d90ae58ce Mon Sep 17 00:00:00 2001 From: Evan Sarkar Date: Sun, 29 Mar 2026 12:46:32 +0530 Subject: [PATCH] Add aggressive activity fallback for apps missing Leanback intent Some third-party apps (e.g. telecom/provider apps) omit the standard CATEGORY_LEANBACK_LAUNCHER intent, causing QuickBars to fail with "no launchable activity". This adds a new fallback step that queries PackageManager for all declared activities and picks the best entry point by scanning for common names like main, splash, tv, or launcher. Fixes #31 --- .../dev/trooped/tvquickbars/utils/AppUtils.kt | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/dev/trooped/tvquickbars/utils/AppUtils.kt b/app/src/main/java/dev/trooped/tvquickbars/utils/AppUtils.kt index 25bfdce..60563ad 100644 --- a/app/src/main/java/dev/trooped/tvquickbars/utils/AppUtils.kt +++ b/app/src/main/java/dev/trooped/tvquickbars/utils/AppUtils.kt @@ -100,7 +100,36 @@ fun Context.getBestLaunchIntent(packageName: String): Intent? { } } - // 4. Special case: Amazon Prime Video + // 4. Aggressive fallback: scan all declared activities for a likely entry point + try { + val packageInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + pm.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(PackageManager.GET_ACTIVITIES.toLong())) + } else { + @Suppress("DEPRECATION") + pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES) + } + + val activities = packageInfo.activities + if (activities != null && activities.isNotEmpty()) { + val entryPointKeywords = listOf("main", "splash", "tv", "leanback", "launcher", "home") + + val exported = activities.filter { it.exported } + val candidates = exported.ifEmpty { activities.toList() } + + val bestMatch = candidates.firstOrNull { activity -> + val name = activity.name.lowercase() + entryPointKeywords.any { keyword -> name.contains(keyword) } + } ?: candidates[0] + + return Intent(Intent.ACTION_MAIN).apply { + component = ComponentName(packageName, bestMatch.name) + } + } + } catch (_: PackageManager.NameNotFoundException) { + // Package not installed, fall through + } + + // 5. Special case: Amazon Prime Video if (packageName == "com.amazon.amazonvideo.livingroom") { val knownActivities = listOf( "com.amazon.ignition.IgnitionActivity",