refactor: debug properties

This commit is contained in:
rhunk
2024-03-10 12:37:11 +01:00
parent 4ecf5f8177
commit 97806d693e
13 changed files with 74 additions and 39 deletions

View File

@ -198,7 +198,7 @@ class RemoteSideContext(
}
}
if (mappings.isMappingsOutdated() || !mappings.isMappingsLoaded) {
if (!sharedPreferences.getBoolean("debug_disable_mapper", false) && (mappings.isMappingsOutdated() || !mappings.isMappingsLoaded)) {
requirements = requirements or Requirements.MAPPINGS
}

View File

@ -202,5 +202,9 @@ class BridgeService : Service() {
override fun registerConfigStateListener(listener: ConfigStateListener) {
remoteSideContext.config.configStateListener = listener
}
override fun getDebugProp(key: String, defaultValue: String?): String? {
return remoteSideContext.sharedPreferences.all["debug_$key"]?.toString() ?: defaultValue
}
}
}

View File

@ -1,5 +1,6 @@
package me.rhunk.snapenhance.ui.manager.pages.home
import android.content.SharedPreferences
import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
@ -40,6 +41,30 @@ class HomeSettings : Routes.Route() {
Text(text = title, modifier = Modifier.padding(16.dp), fontSize = 20.sp, fontWeight = FontWeight.Bold)
}
@Composable
private fun PreferenceToggle(sharedPreferences: SharedPreferences, key: String, text: String) {
val realKey = "debug_$key"
var value by remember { mutableStateOf(sharedPreferences.getBoolean(realKey, false)) }
Row(
modifier = Modifier
.fillMaxWidth()
.height(55.dp)
.clickable {
value = !value
sharedPreferences.edit().putBoolean(realKey, value).apply()
},
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Text(text = text)
Switch(checked = value, onCheckedChange = {
value = it
sharedPreferences.edit().putBoolean(realKey, it).apply()
}, modifier = Modifier.padding(end = 26.dp))
}
}
@Composable
private fun RowAction(title: String, requireConfirmation: Boolean = false, action: () -> Unit) {
var confirmationDialog by remember {
@ -184,7 +209,9 @@ class HomeSettings : Routes.Route() {
}
}
OutlinedButton(
modifier = Modifier.fillMaxWidth().padding(5.dp),
modifier = Modifier
.fillMaxWidth()
.padding(5.dp),
onClick = {
routes.loggerHistory.navigate()
}
@ -194,7 +221,7 @@ class HomeSettings : Routes.Route() {
}
}
RowTitle(title = "Clear App Files")
RowTitle(title = "Debug")
Row(
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
@ -210,7 +237,7 @@ class HomeSettings : Routes.Route() {
ExposedDropdownMenuBox(
expanded = expanded,
onExpandedChange = { expanded = it },
modifier = Modifier.fillMaxWidth(0.8f)
modifier = Modifier.fillMaxWidth(0.7f)
) {
TextField(
value = selectedFileType.displayName,
@ -241,7 +268,16 @@ class HomeSettings : Routes.Route() {
context.shortToast("Done!")
}
}) {
Text(text = "Clear")
Text(text = "Clear File")
}
}
ShiftedRow {
Column(
verticalArrangement = Arrangement.spacedBy(4.dp),
) {
PreferenceToggle(context.sharedPreferences, key = "disable_feature_loading", text = "Disable Feature Loading")
PreferenceToggle(context.sharedPreferences, key = "disable_mapper", text = "Disable Auto Mapper")
PreferenceToggle(context.sharedPreferences, key = "force_native_load", text = "Force Native Load")
}
}
Spacer(modifier = Modifier.height(50.dp))

View File

@ -94,4 +94,6 @@ interface BridgeInterface {
oneway void closeSettingsOverlay();
oneway void registerConfigStateListener(in ConfigStateListener listener);
@nullable String getDebugProp(String key, @nullable String defaultValue);
}

View File

@ -59,7 +59,7 @@ data class FriendInfo(
serverDisplayName = getStringOrNull("serverDisplayName")
streakLength = getInteger("streakLength")
streakExpirationTimestamp = getLong("streakExpiration")
reverseBestFriendRanking = getInteger("reverseBestFriendRanking")
reverseBestFriendRanking = getIntOrNull("reverseBestFriendRanking") ?: 0
usernameForSorting = getStringOrNull("usernameForSorting")
friendLinkType = getInteger("friendLinkType")
postViewEmoji = getStringOrNull("postViewEmoji")
@ -68,5 +68,4 @@ data class FriendInfo(
plusBadgeVisibility = getIntOrNull("plusBadgeVisibility") ?: 0
}
}
}

View File

@ -24,8 +24,8 @@ import me.rhunk.snapenhance.core.event.EventBus
import me.rhunk.snapenhance.core.event.EventDispatcher
import me.rhunk.snapenhance.core.features.Feature
import me.rhunk.snapenhance.core.logger.CoreLogger
import me.rhunk.snapenhance.core.manager.impl.ActionManager
import me.rhunk.snapenhance.core.manager.impl.FeatureManager
import me.rhunk.snapenhance.core.action.ActionManager
import me.rhunk.snapenhance.core.features.FeatureManager
import me.rhunk.snapenhance.core.messaging.CoreMessagingBridge
import me.rhunk.snapenhance.core.messaging.MessageSender
import me.rhunk.snapenhance.core.scripting.CoreScriptRuntime

View File

@ -132,7 +132,6 @@ class SnapEnhance {
}
reloadConfig()
actionManager.init()
initConfigListener()
initWidgetListener()
initNative()
@ -175,7 +174,10 @@ class SnapEnhance {
private fun initNative() {
// don't initialize native when not logged in
if (appContext.androidContext.getSharedPreferences("user_session_shared_pref", 0).getString("key_user_id", null) == null) return
if (
appContext.androidContext.getSharedPreferences("user_session_shared_pref", 0).getString("key_user_id", null) == null &&
appContext.bridgeClient.getDebugProp("force_native_load", null) != "true"
) return
if (appContext.config.experimental.nativeHooks.globalState != true) return
lateinit var unhook: () -> Unit

View File

@ -1,4 +1,4 @@
package me.rhunk.snapenhance.core.manager.impl
package me.rhunk.snapenhance.core.action
import android.content.Intent
import me.rhunk.snapenhance.common.action.EnumAction
@ -7,11 +7,10 @@ import me.rhunk.snapenhance.core.action.impl.BulkMessagingAction
import me.rhunk.snapenhance.core.action.impl.CleanCache
import me.rhunk.snapenhance.core.action.impl.ExportChatMessages
import me.rhunk.snapenhance.core.action.impl.ExportMemories
import me.rhunk.snapenhance.core.manager.Manager
class ActionManager(
private val modContext: ModContext,
) : Manager {
) {
private val actions by lazy {
mapOf(
@ -26,9 +25,6 @@ class ActionManager(
}.toMap().toMutableMap()
}
override fun init() {
}
fun onNewIntent(intent: Intent?) {
val action = intent?.getStringExtra(EnumAction.ACTION_PARAMETER) ?: return
intent.removeExtra(EnumAction.ACTION_PARAMETER)

View File

@ -209,4 +209,6 @@ class BridgeClient(
fun closeSettingsOverlay() = safeServiceCall { service.closeSettingsOverlay() }
fun registerConfigStateListener(listener: ConfigStateListener) = safeServiceCall { service.registerConfigStateListener(listener) }
fun getDebugProp(name: String, defaultValue: String? = null) = safeServiceCall { service.getDebugProp(name, defaultValue) }
}

View File

@ -17,7 +17,6 @@ import me.rhunk.snapenhance.common.util.ktx.getInteger
import me.rhunk.snapenhance.common.util.ktx.getStringOrNull
import me.rhunk.snapenhance.common.util.protobuf.ProtoReader
import me.rhunk.snapenhance.core.ModContext
import me.rhunk.snapenhance.core.manager.Manager
import me.rhunk.snapenhance.nativelib.NativeLib
@ -30,7 +29,7 @@ enum class DatabaseType(
class DatabaseAccess(
private val context: ModContext
) : Manager {
) {
private val openedDatabases = mutableMapOf<DatabaseType, SQLiteDatabase>()
private fun useDatabase(database: DatabaseType, writeMode: Boolean = false): SQLiteDatabase? {
@ -118,7 +117,7 @@ class DatabaseAccess(
fun hasMain(): Boolean = useDatabase(DatabaseType.MAIN)?.isOpen == true
fun hasArroyo(): Boolean = useDatabase(DatabaseType.ARROYO)?.isOpen == true
override fun init() {
fun init() {
// perform integrity check on databases
DatabaseType.entries.forEach { type ->
useDatabase(type, writeMode = true)?.apply {

View File

@ -7,7 +7,6 @@ import android.view.ViewGroup.LayoutParams
import me.rhunk.snapenhance.common.util.snap.SnapWidgetBroadcastReceiverHelper
import me.rhunk.snapenhance.core.ModContext
import me.rhunk.snapenhance.core.event.events.impl.*
import me.rhunk.snapenhance.core.manager.Manager
import me.rhunk.snapenhance.core.util.hook.HookStage
import me.rhunk.snapenhance.core.util.hook.Hooker
import me.rhunk.snapenhance.core.util.hook.hook
@ -23,7 +22,7 @@ import java.nio.ByteBuffer
class EventDispatcher(
private val context: ModContext
) : Manager {
) {
private fun hookViewBinder() {
context.mappings.useMapper(ViewBinderMapper::class) {
val cachedHooks = mutableListOf<String>()
@ -60,8 +59,7 @@ class EventDispatcher(
}
override fun init() {
fun init() {
context.classCache.conversationManager.hook("sendMessageWithContent", HookStage.BEFORE) { param ->
context.event.post(SendMessageWithContentEvent(
destinations = MessageDestinations(param.arg(0)),

View File

@ -1,12 +1,9 @@
package me.rhunk.snapenhance.core.manager.impl
package me.rhunk.snapenhance.core.features
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import me.rhunk.snapenhance.core.ModContext
import me.rhunk.snapenhance.core.features.Feature
import me.rhunk.snapenhance.core.features.FeatureLoadParams
import me.rhunk.snapenhance.core.features.MessagingRuleFeature
import me.rhunk.snapenhance.core.features.impl.ConfigurationOverride
import me.rhunk.snapenhance.core.features.impl.MixerStories
import me.rhunk.snapenhance.core.features.impl.OperaViewerParamsOverride
@ -16,7 +13,9 @@ import me.rhunk.snapenhance.core.features.impl.downloader.ProfilePictureDownload
import me.rhunk.snapenhance.core.features.impl.experiments.*
import me.rhunk.snapenhance.core.features.impl.global.*
import me.rhunk.snapenhance.core.features.impl.messaging.*
import me.rhunk.snapenhance.core.features.impl.spying.*
import me.rhunk.snapenhance.core.features.impl.spying.HalfSwipeNotifier
import me.rhunk.snapenhance.core.features.impl.spying.MessageLogger
import me.rhunk.snapenhance.core.features.impl.spying.StealthMode
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
@ -24,17 +23,21 @@ import me.rhunk.snapenhance.core.features.impl.tweaks.PreventMessageListAutoScro
import me.rhunk.snapenhance.core.features.impl.tweaks.UnsaveableMessages
import me.rhunk.snapenhance.core.features.impl.ui.*
import me.rhunk.snapenhance.core.logger.CoreLogger
import me.rhunk.snapenhance.core.manager.Manager
import me.rhunk.snapenhance.core.ui.menu.MenuViewInjector
import kotlin.reflect.KClass
import kotlin.system.measureTimeMillis
class FeatureManager(
private val context: ModContext
) : Manager {
) {
private val features = mutableMapOf<KClass<out Feature>, Feature>()
private fun register(vararg featureList: Feature) {
if (context.bridgeClient.getDebugProp("disable_feature_loading") == "true") {
context.log.warn("Feature loading is disabled")
return
}
runBlocking {
featureList.forEach { feature ->
launch(Dispatchers.IO) {
@ -58,7 +61,7 @@ class FeatureManager(
fun getRuleFeatures() = features.values.filterIsInstance<MessagingRuleFeature>().sortedBy { it.ruleType.ordinal }
override fun init() {
fun init() {
register(
EndToEndEncryption(),
ScopeSync(),
@ -174,7 +177,7 @@ class FeatureManager(
}
}
override fun onActivityCreate() {
fun onActivityCreate() {
measureTimeMillis {
initFeatures(
FeatureLoadParams.ACTIVITY_CREATE_SYNC,

View File

@ -1,6 +0,0 @@
package me.rhunk.snapenhance.core.manager
interface Manager {
fun init() {}
fun onActivityCreate() {}
}