commit 249569468ce871173a3f60c53a7aadc7f89e3cf8
parent 01476ad820e745930f7656b9678d00834d10ab2c
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Sat,  9 Sep 2023 10:22:52 +0200

feat: bootstrap override
- home tab
- persistent app appearance

Diffstat:
Mcore/src/main/assets/lang/en_US.json | 32++++++++++++++++++++++++--------
Mcore/src/main/kotlin/me/rhunk/snapenhance/core/config/impl/UserInterfaceTweaks.kt | 18++++++++----------
Mcore/src/main/kotlin/me/rhunk/snapenhance/features/impl/ConfigurationOverride.kt | 1-
Acore/src/main/kotlin/me/rhunk/snapenhance/features/impl/ui/ClientBootstrapOverride.kt | 35+++++++++++++++++++++++++++++++++++
Dcore/src/main/kotlin/me/rhunk/snapenhance/features/impl/ui/StartupPageOverride.kt | 55-------------------------------------------------------
Mcore/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt | 4++--
6 files changed, 69 insertions(+), 76 deletions(-)

diff --git a/core/src/main/assets/lang/en_US.json b/core/src/main/assets/lang/en_US.json @@ -213,6 +213,20 @@ "name": "AMOLED Dark Mode", "description": "Enables AMOLED dark mode\nMake sure Snapchats Dark mode is enabled" }, + "bootstrap_override": { + "name": "Bootstrap Override", + "description": "Overrides user interface bootstrap settings", + "properties": { + "app_appearance": { + "name": "App Appearance", + "description": "Sets a persistent App Appearance" + }, + "home_tab": { + "name": "Home Tab", + "description": "Overrides the startup tab when opening Snapchat" + } + } + }, "map_friend_nametags": { "name": "Enhanced Friend Map Nametags", "description": "Improves the Nametags of friends on the Snapmap" @@ -507,6 +521,10 @@ } }, "options": { + "app_appearance": { + "always_light": "Always Light", + "always_dark": "Always Dark" + }, "better_notifications": { "chat": "Show chat messages", "snap": "Show media", @@ -585,14 +603,12 @@ "hide_following": "Hide following section", "hide_for_you": "Hide For You section" }, - "startup_tab": { - "OFF": "Off", - "ngs_map_icon_container": "Map", - "ngs_chat_icon_container": "Chat", - "ngs_camera_icon_container": "Camera", - "ngs_community_icon_container": "Community / Stories", - "ngs_spotlight_icon_container": "Spotlight", - "ngs_search_icon_container": "Search" + "home_tab": { + "map": "Map", + "chat": "Chat", + "camera": "Camera", + "discover": "Discover", + "spotlight": "Spotlight" }, "add_friend_source_spoof": { "added_by_username": "By Username", diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/config/impl/UserInterfaceTweaks.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/config/impl/UserInterfaceTweaks.kt @@ -3,9 +3,14 @@ package me.rhunk.snapenhance.core.config.impl import me.rhunk.snapenhance.core.config.ConfigContainer import me.rhunk.snapenhance.core.config.FeatureNotice import me.rhunk.snapenhance.core.messaging.MessagingRuleType +import me.rhunk.snapenhance.features.impl.ui.ClientBootstrapOverride class UserInterfaceTweaks : ConfigContainer() { - val enableAppAppearance = boolean("enable_app_appearance") + inner class BootstrapOverride : ConfigContainer() { + val appAppearance = unique("app_appearance", "always_light", "always_dark") + val homeTab = unique("home_tab", *ClientBootstrapOverride.tabs) { addNotices(FeatureNotice.UNSTABLE) } + } + val friendFeedMenuButtons = multiple( "friend_feed_menu_buttons","conversation_info", *MessagingRuleType.values().toList().filter { it.listMode }.map { it.key }.toTypedArray() ).apply { @@ -13,6 +18,7 @@ class UserInterfaceTweaks : ConfigContainer() { } val friendFeedMenuPosition = integer("friend_feed_menu_position", defaultValue = 1) val amoledDarkMode = boolean("amoled_dark_mode") { addNotices(FeatureNotice.UNSTABLE) } + val bootstrapOverride = container("bootstrap_override", BootstrapOverride()) val mapFriendNameTags = boolean("map_friend_nametags") val streakExpirationInfo = boolean("streak_expiration_info") val hideStorySections = multiple("hide_story_sections", @@ -26,13 +32,5 @@ class UserInterfaceTweaks : ConfigContainer() { ) val ddBitmojiSelfie = boolean("2d_bitmoji_selfie") val disableSpotlight = boolean("disable_spotlight") - val startupTab = unique("startup_tab", - "ngs_map_icon_container", - "ngs_chat_icon_container", - "ngs_camera_icon_container", - "ngs_community_icon_container", - "ngs_spotlight_icon_container", - "ngs_search_icon_container" - ) { addNotices(FeatureNotice.INTERNAL_BEHAVIOR) } - val storyViewerOverride = unique("story_viewer_override", "DISCOVER_PLAYBACK_SEEKBAR", "VERTICAL_STORY_VIEWER") { addNotices(FeatureNotice.UNSTABLE) } + val storyViewerOverride = unique("story_viewer_override", "DISCOVER_PLAYBACK_SEEKBAR", "VERTICAL_STORY_VIEWER") } diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/ConfigurationOverride.kt b/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/ConfigurationOverride.kt @@ -26,7 +26,6 @@ class ConfigurationOverride : Feature("Configuration Override", loadParams = Fea overrideProperty("DF_VOPERA_FOR_STORIES", { state == "VERTICAL_STORY_VIEWER" }, true) } - overrideProperty("SIG_APP_APPEARANCE_SETTING", { context.config.userInterface.enableAppAppearance.get() }, true) overrideProperty("SPOTLIGHT_5TH_TAB_ENABLED", { context.config.userInterface.disableSpotlight.get() }, false) overrideProperty("BYPASS_AD_FEATURE_GATE", { context.config.global.blockAds.get() }, true) diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/ui/ClientBootstrapOverride.kt b/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/ui/ClientBootstrapOverride.kt @@ -0,0 +1,34 @@ +package me.rhunk.snapenhance.features.impl.ui + +import me.rhunk.snapenhance.features.Feature +import me.rhunk.snapenhance.features.FeatureLoadParams +import java.io.File + + +class ClientBootstrapOverride : Feature("ClientBootstrapOverride", loadParams = FeatureLoadParams.ACTIVITY_CREATE_SYNC) { + companion object { + val tabs = arrayOf("map", "chat", "camera", "discover", "spotlight") + } + + private val clientBootstrapFolder by lazy { File(context.androidContext.filesDir, "client-bootstrap") } + + private val appearanceStartupConfigFile by lazy { File(clientBootstrapFolder, "appearancestartupconfig") } + private val plusFile by lazy { File(clientBootstrapFolder, "plus") } + + override fun onActivityCreate() { + val bootstrapOverrideConfig = context.config.userInterface.bootstrapOverride + + bootstrapOverrideConfig.appAppearance.getNullable()?.also { appearance -> + val state = when (appearance) { + "always_light" -> 0 + "always_dark" -> 1 + else -> return@also + }.toByte() + appearanceStartupConfigFile.writeBytes(byteArrayOf(0, 0, 0, state)) + } + + bootstrapOverrideConfig.homeTab.getNullable()?.also { currentTab -> + plusFile.writeBytes(byteArrayOf(8, (tabs.indexOf(currentTab) + 1).toByte())) + } + } +}+ \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/ui/StartupPageOverride.kt b/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/ui/StartupPageOverride.kt @@ -1,54 +0,0 @@ -package me.rhunk.snapenhance.features.impl.ui - -import android.annotation.SuppressLint -import android.os.Handler -import android.view.View -import android.widget.LinearLayout -import me.rhunk.snapenhance.Constants -import me.rhunk.snapenhance.core.eventbus.events.impl.AddViewEvent -import me.rhunk.snapenhance.features.Feature -import me.rhunk.snapenhance.features.FeatureLoadParams -import me.rhunk.snapenhance.hook.HookStage -import me.rhunk.snapenhance.hook.hook - -@SuppressLint("DiscouragedApi") -class StartupPageOverride : Feature("StartupPageOverride", loadParams = FeatureLoadParams.ACTIVITY_CREATE_SYNC) { - private var ngsIcon: View? = null - /* - navbar icons: - ngs_map_icon_container - ngs_chat_icon_container - ngs_camera_icon_container - ngs_community_icon_container - ngs_spotlight_icon_container - ngs_search_icon_container - */ - - private fun clickNgsIcon() { - Handler(context.androidContext.mainLooper).postDelayed({ - ngsIcon?.callOnClick() - }, 300) - } - - override fun onActivityCreate() { - val ngsIconName = context.config.userInterface.startupTab.getNullable() ?: return - - context.androidContext.classLoader.loadClass("com.snap.mushroom.MainActivity").apply { - hook("onResume", HookStage.AFTER) { clickNgsIcon() } - } - - val ngsIconId = context.androidContext.resources.getIdentifier(ngsIconName, "id", Constants.SNAPCHAT_PACKAGE_NAME) - - lateinit var unhook: () -> Unit - - context.event.subscribe(AddViewEvent::class) { event -> - if (event.parent !is LinearLayout) return@subscribe - with(event.view) { - if (id == ngsIconId) { - ngsIcon = this - unhook() - } - } - }.also { unhook = it } - } -}- \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt b/core/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt @@ -35,7 +35,7 @@ import me.rhunk.snapenhance.features.impl.tweaks.SendOverride import me.rhunk.snapenhance.features.impl.tweaks.SnapchatPlus import me.rhunk.snapenhance.features.impl.tweaks.UnlimitedSnapViewTime import me.rhunk.snapenhance.features.impl.ui.PinConversations -import me.rhunk.snapenhance.features.impl.ui.StartupPageOverride +import me.rhunk.snapenhance.features.impl.ui.ClientBootstrapOverride import me.rhunk.snapenhance.features.impl.ui.UITweaks import me.rhunk.snapenhance.manager.Manager import me.rhunk.snapenhance.ui.menu.impl.MenuViewInjector @@ -90,7 +90,7 @@ class FeatureManager(private val context: ModContext) : Manager { register(PinConversations::class) register(UnlimitedMultiSnap::class) register(DeviceSpooferHook::class) - register(StartupPageOverride::class) + register(ClientBootstrapOverride::class) register(GooglePlayServicesDialogs::class) register(NoFriendScoreDelay::class) register(ProfilePictureDownloader::class)