From 9c226d1bb9110e15ce8a22e13841780bd34cda2c Mon Sep 17 00:00:00 2001 From: imCrest <217463890+imCrest@users.noreply.github.com> Date: Fri, 17 Apr 2026 14:03:43 +0000 Subject: [PATCH] Sync: Update from upstream --- .../core/features/impl/ui/UITweaks.kt | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/core/src/main/kotlin/me/eternal/purrfectsnap/core/features/impl/ui/UITweaks.kt b/core/src/main/kotlin/me/eternal/purrfectsnap/core/features/impl/ui/UITweaks.kt index 7cb52d54..49f26605 100644 --- a/core/src/main/kotlin/me/eternal/purrfectsnap/core/features/impl/ui/UITweaks.kt +++ b/core/src/main/kotlin/me/eternal/purrfectsnap/core/features/impl/ui/UITweaks.kt @@ -156,6 +156,66 @@ class UITweaks : Feature("UITweaks") { return viewChain.firstOrNull(::isExactMatch)?.view } + private fun findSpotlightHeaderTabsTarget(view: View): View? { + fun collectTextLabels(current: View, depth: Int = 0, maxDepth: Int = 2): List { + if (depth > maxDepth) return emptyList() + + val ownText = listOfNotNull( + current.contentDescription?.toString(), + (current as? TextView)?.text?.toString() + ).filter { it.isNotBlank() } + + if (current !is ViewGroup) return ownText + + return ownText + current.children().flatMap { child -> + collectTextLabels(child, depth + 1, maxDepth) + } + } + + fun isHeaderMarkerText(value: String): Boolean { + return value.contains("spotlight", ignoreCase = true) || + value.contains("discover", ignoreCase = true) || + value.contains("following", ignoreCase = true) + } + + val candidateChain = buildList { + var current: View? = view + repeat(6) { + current ?: return@repeat + add(current!!) + current = current?.parent as? View + } + } + + candidateChain.forEach { candidate -> + val group = candidate as? ViewGroup ?: return@forEach + if (group.childCount !in 2..4) return@forEach + + val directMarkedChildren = group.children().count { child -> + collectTextLabels(child).any(::isHeaderMarkerText) + } + + if (directMarkedChildren < 2) return@forEach + + val texts = collectTextLabels(group) + .map { it.trim() } + .filter { it.isNotBlank() } + .distinct() + + val hasSpotlightOrDiscover = texts.any { + it.contains("spotlight", ignoreCase = true) || + it.contains("discover", ignoreCase = true) + } + val hasFollowing = texts.any { it.contains("following", ignoreCase = true) } + + if (hasSpotlightOrDiscover && hasFollowing) { + return group + } + } + + return null + } + private fun onActivityCreate() { val blockAds by context.config.global.blockAds val hiddenElements by context.config.userInterface.hideUiComponents @@ -225,6 +285,10 @@ class UITweaks : Feature("UITweaks") { } } + context.event.subscribe(BindViewEvent::class, { disableSpotlight }) { event -> + findSpotlightHeaderTabsTarget(event.view)?.hideViewCompletely() + } + context.event.subscribe(AddViewEvent::class) { event -> val viewId = event.view.id val view = event.view