commit 283f0266d9f4588d5242c719172e21cbef6eede8
parent 9ff818b546a398052e1a9e1183d507713f433354
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Sun,  4 Feb 2024 00:07:37 +0100

feat(core): disable permission requests

Diffstat:
Mcommon/src/main/assets/lang/en_US.json | 15+++++++++++++++
Mcommon/src/main/kotlin/me/rhunk/snapenhance/common/config/impl/Global.kt | 15+++++++++++++++
Acore/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/tweaks/DisablePermissionRequests.kt | 25+++++++++++++++++++++++++
Mcore/src/main/kotlin/me/rhunk/snapenhance/core/manager/impl/FeatureManager.kt | 2++
4 files changed, 57 insertions(+), 0 deletions(-)

diff --git a/common/src/main/assets/lang/en_US.json b/common/src/main/assets/lang/en_US.json @@ -502,6 +502,10 @@ "name": "Block Ads", "description": "Prevents Advertisements from being displayed" }, + "disable_permission_requests": { + "name": "Disable Permission Requests", + "description": "Prevents Snapchat from asking for specific permissions" + }, "disable_memories_snap_feed": { "name": "Disable Memories Snap Feed", "description": "Prevents Snapchat from showing recent memories when you swipe up in camera" @@ -878,6 +882,17 @@ "disable_cameras":{ "front": "Front Camera", "back": "Back Camera" + }, + "disable_permission_requests": { + "notifications": "Notifications", + "read_media_images": "Read Media Images", + "read_media_video": "Read Media Video", + "camera": "Camera", + "microphone": "Microphone", + "location": "Location", + "read_contacts": "Read Contacts", + "nearby_devices": "Nearby Devices", + "phone_calls": "Phone Calls" } } }, diff --git a/common/src/main/kotlin/me/rhunk/snapenhance/common/config/impl/Global.kt b/common/src/main/kotlin/me/rhunk/snapenhance/common/config/impl/Global.kt @@ -4,6 +4,20 @@ import me.rhunk.snapenhance.common.config.ConfigContainer import me.rhunk.snapenhance.common.config.FeatureNotice class Global : ConfigContainer() { + companion object { + val permissionMap = mapOf( + "android.permission.POST_NOTIFICATIONS" to "notifications", + "android.permission.READ_MEDIA_IMAGES" to "read_media_images", + "android.permission.READ_MEDIA_VIDEO" to "read_media_video", + "android.permission.CAMERA" to "camera", + "android.permission.ACCESS_FINE_LOCATION" to "location", + "android.permission.RECORD_AUDIO" to "microphone", + "android.permission.READ_CONTACTS" to "read_contacts", + "android.permission.BLUETOOTH_CONNECT" to "nearby_devices", + "android.permission.READ_PHONE_STATE" to "phone_calls", + ) + } + inner class SpoofLocation : ConfigContainer(hasGlobalState = true) { val coordinates = mapCoordinates("coordinates", 0.0 to 0.0) { requireRestart()} // lat, long } @@ -14,6 +28,7 @@ class Global : ConfigContainer() { val disableMetrics = boolean("disable_metrics") { requireRestart() } val disableStorySections = multiple("disable_story_sections", "friends", "following", "discover") { requireRestart(); requireCleanCache() } val blockAds = boolean("block_ads") + val disablePermissionRequests = multiple("disable_permission_requests", *permissionMap.values.toTypedArray()) { requireRestart(); addNotices(FeatureNotice.UNSTABLE) } val disableMemoriesSnapFeed = boolean("disable_memories_snap_feed") val spotlightCommentsUsername = boolean("spotlight_comments_username") { requireRestart() } val bypassVideoLengthRestriction = unique("bypass_video_length_restriction", "split", "single") { addNotices( diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/tweaks/DisablePermissionRequests.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/tweaks/DisablePermissionRequests.kt @@ -0,0 +1,24 @@ +package me.rhunk.snapenhance.core.features.impl.tweaks + +import android.content.ContextWrapper +import android.content.pm.PackageManager +import me.rhunk.snapenhance.common.config.impl.Global +import me.rhunk.snapenhance.core.features.Feature +import me.rhunk.snapenhance.core.features.FeatureLoadParams +import me.rhunk.snapenhance.core.util.hook.HookStage +import me.rhunk.snapenhance.core.util.hook.hook + +class DisablePermissionRequests : Feature("Disable Permission Requests", loadParams = FeatureLoadParams.INIT_SYNC) { + override fun init() { + val deniedPermissions by context.config.global.disablePermissionRequests + if (deniedPermissions.isEmpty()) return + + ContextWrapper::class.java.hook("checkPermission", HookStage.BEFORE) { param -> + val permission = param.arg<String>(0) + val permissionKey = Global.permissionMap[permission] ?: return@hook + if (deniedPermissions.contains(permissionKey)) { + param.setResult(PackageManager.PERMISSION_GRANTED) + } + } + } +}+ \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/manager/impl/FeatureManager.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/manager/impl/FeatureManager.kt @@ -19,6 +19,7 @@ import me.rhunk.snapenhance.core.features.impl.messaging.* import me.rhunk.snapenhance.core.features.impl.spying.* import me.rhunk.snapenhance.core.features.impl.tweaks.BypassScreenshotDetection import me.rhunk.snapenhance.core.features.impl.tweaks.CameraTweaks +import me.rhunk.snapenhance.core.features.impl.tweaks.DisablePermissionRequests import me.rhunk.snapenhance.core.features.impl.tweaks.PreventMessageListAutoScroll import me.rhunk.snapenhance.core.features.impl.tweaks.UnsaveableMessages import me.rhunk.snapenhance.core.features.impl.ui.* @@ -117,6 +118,7 @@ class FeatureManager( SpotlightCommentsUsername(), OperaViewerParamsOverride(), StealthModeIndicator(), + DisablePermissionRequests(), ) initializeFeatures()