commit 6fed85b4a6334a776569372fba14392f4c452ddc parent fffe441f68e1805a11bad87805ae4a9125490d54 Author: rhunk <101876869+rhunk@users.noreply.github.com> Date: Tue, 29 Oct 2024 21:19:50 +0100 feat(core): hide quick add suggestions Diffstat:
9 files changed, 35 insertions(+), 70 deletions(-)
diff --git a/common/src/main/assets/lang/en_US.json b/common/src/main/assets/lang/en_US.json @@ -500,9 +500,9 @@ "name": "Hide Streak Restore", "description": "Hides the Restore button in the friend feed" }, - "hide_quick_add_friend_feed": { - "name": "Hide Quick Add in Friend Feed", - "description": "Hides the Quick Add section in the friend feed" + "hide_quick_add_suggestions": { + "name": "Hide Quick Add Suggestions", + "description": "Removes quick add friend suggestions" }, "hide_story_suggestions": { "name": "Hide Story Suggestions", @@ -1264,7 +1264,6 @@ "hide_map_reactions": "Remove Map Reactions" }, "hide_story_suggestions": { - "hide_friend_suggestions": "Hide friend suggestions", "hide_suggested_friend_stories": "Hide suggested friend stories", "hide_my_stories": "Hide My Stories" }, diff --git a/common/src/main/kotlin/me/rhunk/snapenhance/common/config/impl/UserInterfaceTweaks.kt b/common/src/main/kotlin/me/rhunk/snapenhance/common/config/impl/UserInterfaceTweaks.kt @@ -40,8 +40,8 @@ class UserInterfaceTweaks : ConfigContainer() { val streakExpirationInfo = boolean("streak_expiration_info") { requireRestart() } val hideFriendFeedEntry = boolean("hide_friend_feed_entry") { requireRestart() } val hideStreakRestore = boolean("hide_streak_restore") { requireRestart() } - val hideQuickAddFriendFeed = boolean("hide_quick_add_friend_feed") { requireRestart() } - val hideStorySuggestions = multiple("hide_story_suggestions", "hide_friend_suggestions", "hide_suggested_friend_stories", "hide_my_stories") { requireRestart() } + val hideQuickAddSuggestions = boolean("hide_quick_add_suggestions") { requireRestart() } + val hideStorySuggestions = multiple("hide_story_suggestions", "hide_suggested_friend_stories", "hide_my_stories") { requireRestart() } val hideUiComponents = multiple("hide_ui_components", "hide_voice_record_button", "hide_stickers_button", diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/FeatureManager.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/FeatureManager.kt @@ -102,7 +102,7 @@ class FeatureManager( FriendFeedMessagePreview(), HideStreakRestore(), HideFriendFeedEntry(), - HideQuickAddFriendFeed(), + HideQuickAddSuggestions(), CallButtonsOverride(), SnapPreview(), BypassScreenshotDetection(), diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/ui/HideQuickAddFriendFeed.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/ui/HideQuickAddFriendFeed.kt @@ -1,24 +0,0 @@ -package me.rhunk.snapenhance.core.features.impl.ui - -import me.rhunk.snapenhance.core.features.Feature -import me.rhunk.snapenhance.core.util.hook.HookStage -import me.rhunk.snapenhance.core.util.hook.hookConstructor -import me.rhunk.snapenhance.core.util.ktx.setObjectField -import me.rhunk.snapenhance.mapper.impl.FriendingDataSourcesMapper - -class HideQuickAddFriendFeed : Feature("HideQuickAddFriendFeed") { - override fun init() { - if (!context.config.userInterface.hideQuickAddFriendFeed.get()) return - - onNextActivityCreate { - context.mappings.useMapper(FriendingDataSourcesMapper::class) { - classReference.getAsClass()?.hookConstructor(HookStage.AFTER) { param -> - param.thisObject<Any>().setObjectField( - quickAddSourceListField.get()!!, - arrayListOf<Any>() - ) - } - } - } - } -}- \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/ui/HideQuickAddSuggestions.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/ui/HideQuickAddSuggestions.kt @@ -0,0 +1,27 @@ +package me.rhunk.snapenhance.core.features.impl.ui + +import me.rhunk.snapenhance.core.features.Feature +import me.rhunk.snapenhance.core.util.hook.HookStage +import me.rhunk.snapenhance.core.util.hook.hook + +class HideQuickAddSuggestions : Feature("Hide Quick Add Suggestions") { + override fun init() { + if (!context.config.userInterface.hideQuickAddSuggestions.get()) return + + context.androidContext.classLoader.loadClass("io.requery.android.database.sqlite.SQLiteDatabase") + .hook("rawQueryWithFactory", HookStage.BEFORE) { param -> + var sqlRequest = param.arg<String>(1) + + fun patchRequest() { + sqlRequest.lastIndexOf("WHERE").takeIf { it != -1 }?.let { + sqlRequest = sqlRequest.substring(0, it + 5) + " 0 = 1 AND " + sqlRequest.substring(it + 5) + param.setArg(1, sqlRequest) + } + } + + if (sqlRequest.contains("SuggestedFriendPlacement")) { + patchRequest() + } + } + } +}+ \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/ui/UITweaks.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/ui/UITweaks.kt @@ -98,13 +98,8 @@ class UITweaks : Feature("UITweaks") { } val viewModelString = event.prevModel.toString() - val isSuggestedFriend by lazy { viewModelString.startsWith("DFFriendSuggestionCardViewModel") } val isMyStory by lazy { viewModelString.let { it.startsWith("CircularItemViewModel") && it.contains("storyId=")} } - if (hideStorySuggestions.contains("hide_friend_suggestions") && isSuggestedFriend) { - removeView() - return@subscribe - } if (hideStorySuggestions.contains("hide_my_stories") && isMyStory) { removeView() return@subscribe diff --git a/mapper/src/main/kotlin/me/rhunk/snapenhance/mapper/ClassMapper.kt b/mapper/src/main/kotlin/me/rhunk/snapenhance/mapper/ClassMapper.kt @@ -33,7 +33,6 @@ class ClassMapper( ScoreUpdateMapper(), FriendRelationshipChangerMapper(), ViewBinderMapper(), - FriendingDataSourcesMapper(), OperaViewerParamsMapper(), MemoriesPresenterMapper(), StreaksExpirationMapper(), diff --git a/mapper/src/main/kotlin/me/rhunk/snapenhance/mapper/impl/FriendingDataSourcesMapper.kt b/mapper/src/main/kotlin/me/rhunk/snapenhance/mapper/impl/FriendingDataSourcesMapper.kt @@ -1,30 +0,0 @@ -package me.rhunk.snapenhance.mapper.impl - -import me.rhunk.snapenhance.mapper.AbstractClassMapper -import me.rhunk.snapenhance.mapper.ext.findConstString -import me.rhunk.snapenhance.mapper.ext.getClassName -import me.rhunk.snapenhance.mapper.ext.searchNextFieldReference - -class FriendingDataSourcesMapper: AbstractClassMapper("FriendingDataSources") { - val classReference = classReference("class") - val quickAddSourceListField = string("quickAddSourceListField") - - init { - mapper { - for (classDef in classes) { - val constructor = classDef.methods.firstOrNull { it.name == "<init>" } ?: continue - if (constructor.parameterTypes.size < 4 || (0..3).any { constructor.parameterTypes[it] != "Ljava/util/List;" }) continue - - val toStringMethod = classDef.methods.firstOrNull { it.name == "toString" } ?: continue - if (toStringMethod.implementation?.findConstString("quickaddSource", contains = true) != true) continue - - val quickAddSourceListDexField = toStringMethod.implementation?.searchNextFieldReference("quickaddSource", contains = true) - ?: continue - - classReference.set(classDef.getClassName()) - quickAddSourceListField.set(quickAddSourceListDexField.name) - return@mapper - } - } - } -}- \ No newline at end of file diff --git a/native/src/main/kotlin/me/rhunk/snapenhance/nativelib/NativeRequestData.kt b/native/src/main/kotlin/me/rhunk/snapenhance/nativelib/NativeRequestData.kt @@ -1,6 +1,6 @@ package me.rhunk.snapenhance.nativelib -data class NativeRequestData( +class NativeRequestData( val uri: String, var buffer: ByteArray, var canceled: Boolean = false,