mirror of
https://github.com/rhunk/SnapEnhance.git
synced 2025-05-29 13:00:17 +02:00
feat: amoled dark mode (#58)
This commit is contained in:
parent
2fdb51dff6
commit
8caf2b6d90
@ -67,7 +67,8 @@
|
|||||||
"preview_resolution": "Override Preview Resolution",
|
"preview_resolution": "Override Preview Resolution",
|
||||||
"picture_resolution": "Override Picture Resolution",
|
"picture_resolution": "Override Picture Resolution",
|
||||||
"force_highest_frame_rate": "Force Highest Frame Rate",
|
"force_highest_frame_rate": "Force Highest Frame Rate",
|
||||||
"force_camera_source_encoding": "Force Camera Source Encoding"
|
"force_camera_source_encoding": "Force Camera Source Encoding",
|
||||||
|
"amoled_dark_mode": "AMOLED Dark Mode"
|
||||||
},
|
},
|
||||||
|
|
||||||
"option": {
|
"option": {
|
||||||
|
@ -346,6 +346,12 @@ enum class ConfigProperty(
|
|||||||
"description.meo_passcode_bypass",
|
"description.meo_passcode_bypass",
|
||||||
ConfigCategory.EXPERIMENTAL_DEBUGGING,
|
ConfigCategory.EXPERIMENTAL_DEBUGGING,
|
||||||
ConfigStateValue(false)
|
ConfigStateValue(false)
|
||||||
|
),
|
||||||
|
AMOLED_DARK_MODE(
|
||||||
|
"property.amoled_dark_mode",
|
||||||
|
"description.amoled_dark_mode",
|
||||||
|
ConfigCategory.EXPERIMENTAL_DEBUGGING,
|
||||||
|
ConfigStateValue(false)
|
||||||
);
|
);
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
@ -0,0 +1,49 @@
|
|||||||
|
package me.rhunk.snapenhance.features.impl.experiments
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.res.TypedArray
|
||||||
|
import android.graphics.drawable.ColorDrawable
|
||||||
|
import me.rhunk.snapenhance.Constants
|
||||||
|
import me.rhunk.snapenhance.config.ConfigProperty
|
||||||
|
import me.rhunk.snapenhance.features.Feature
|
||||||
|
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||||
|
import me.rhunk.snapenhance.hook.HookStage
|
||||||
|
import me.rhunk.snapenhance.hook.Hooker
|
||||||
|
import me.rhunk.snapenhance.hook.hook
|
||||||
|
|
||||||
|
class AmoledDarkMode : Feature("Amoled Dark Mode", loadParams = FeatureLoadParams.ACTIVITY_CREATE_SYNC) {
|
||||||
|
@SuppressLint("DiscouragedApi")
|
||||||
|
override fun onActivityCreate() {
|
||||||
|
if (!context.config.bool(ConfigProperty.AMOLED_DARK_MODE)) return
|
||||||
|
val attributeCache = mutableMapOf<String, Int>()
|
||||||
|
|
||||||
|
fun getAttribute(name: String): Int {
|
||||||
|
if (attributeCache.containsKey(name)) return attributeCache[name]!!
|
||||||
|
return context.resources.getIdentifier(name, "attr", Constants.SNAPCHAT_PACKAGE_NAME).also { attributeCache[name] = it }
|
||||||
|
}
|
||||||
|
|
||||||
|
context.androidContext.theme.javaClass.getMethod("obtainStyledAttributes", IntArray::class.java).hook(HookStage.AFTER) { param ->
|
||||||
|
val array = param.arg<IntArray>(0)
|
||||||
|
val result = param.getResult() as TypedArray
|
||||||
|
|
||||||
|
fun ephemeralHook(methodName: String, content: Any) {
|
||||||
|
Hooker.ephemeralHookObjectMethod(result::class.java, result, methodName, HookStage.BEFORE) {
|
||||||
|
it.setResult(content)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
when (array[0]) {
|
||||||
|
getAttribute("sigColorTextPrimary") -> {
|
||||||
|
ephemeralHook("getColor", 0xFFFFFFFF.toInt())
|
||||||
|
}
|
||||||
|
getAttribute("sigColorBackgroundMain") -> {
|
||||||
|
ephemeralHook("getColor", 0xFF000000.toInt())
|
||||||
|
}
|
||||||
|
getAttribute("actionSheetBackgroundDrawable"),
|
||||||
|
getAttribute("actionSheetRoundedBackgroundDrawable") -> {
|
||||||
|
ephemeralHook("getDrawable", ColorDrawable(0xFF000000.toInt()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -16,19 +16,17 @@ object ViewAppearanceHelper {
|
|||||||
)
|
)
|
||||||
fun applyTheme(viewModel: View, view: TextView) {
|
fun applyTheme(viewModel: View, view: TextView) {
|
||||||
val sigColorTextPrimary = viewModel.context.theme.obtainStyledAttributes(
|
val sigColorTextPrimary = viewModel.context.theme.obtainStyledAttributes(
|
||||||
intArrayOf(
|
intArrayOf(viewModel.resources.getIdentifier("sigColorTextPrimary", "attr", Constants.SNAPCHAT_PACKAGE_NAME))
|
||||||
viewModel.resources.getIdentifier(
|
).getColor(0, 0)
|
||||||
"sigColorTextPrimary",
|
|
||||||
"attr",
|
val sigColorBackgroundMain = viewModel.context.theme.obtainStyledAttributes(
|
||||||
Constants.SNAPCHAT_PACKAGE_NAME
|
intArrayOf(viewModel.resources.getIdentifier("sigColorBackgroundMain", "attr", Constants.SNAPCHAT_PACKAGE_NAME))
|
||||||
)
|
).getColor(0, 0)
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
val snapchatFontResId = view.context.resources.getIdentifier("avenir_next_medium", "font", "com.snapchat.android")
|
val snapchatFontResId = view.context.resources.getIdentifier("avenir_next_medium", "font", "com.snapchat.android")
|
||||||
//remove the shadow
|
//remove the shadow
|
||||||
view.setBackgroundColor(0x00000000)
|
view.setBackgroundColor(sigColorBackgroundMain)
|
||||||
view.setTextColor(sigColorTextPrimary.getColor(0, 0))
|
view.setTextColor(sigColorTextPrimary)
|
||||||
view.setShadowLayer(0F, 0F, 0F, 0)
|
view.setShadowLayer(0F, 0F, 0F, 0)
|
||||||
view.outlineProvider = null
|
view.outlineProvider = null
|
||||||
view.gravity = Gravity.LEFT or Gravity.CENTER_VERTICAL
|
view.gravity = Gravity.LEFT or Gravity.CENTER_VERTICAL
|
||||||
@ -49,7 +47,7 @@ object ViewAppearanceHelper {
|
|||||||
view.setBackgroundColor(0x5395026)
|
view.setBackgroundColor(0x5395026)
|
||||||
}
|
}
|
||||||
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
|
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
|
||||||
view.setBackgroundColor(0x00000000)
|
view.setBackgroundColor(sigColorBackgroundMain)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
false
|
false
|
||||||
|
@ -9,6 +9,7 @@ import me.rhunk.snapenhance.features.impl.ConfigEnumKeys
|
|||||||
import me.rhunk.snapenhance.features.impl.Messaging
|
import me.rhunk.snapenhance.features.impl.Messaging
|
||||||
import me.rhunk.snapenhance.features.impl.downloader.AntiAutoDownload
|
import me.rhunk.snapenhance.features.impl.downloader.AntiAutoDownload
|
||||||
import me.rhunk.snapenhance.features.impl.downloader.MediaDownloader
|
import me.rhunk.snapenhance.features.impl.downloader.MediaDownloader
|
||||||
|
import me.rhunk.snapenhance.features.impl.experiments.AmoledDarkMode
|
||||||
import me.rhunk.snapenhance.features.impl.experiments.AppPasscode
|
import me.rhunk.snapenhance.features.impl.experiments.AppPasscode
|
||||||
import me.rhunk.snapenhance.features.impl.experiments.InfiniteStoryBoost
|
import me.rhunk.snapenhance.features.impl.experiments.InfiniteStoryBoost
|
||||||
import me.rhunk.snapenhance.features.impl.experiments.MeoPasscodeBypass
|
import me.rhunk.snapenhance.features.impl.experiments.MeoPasscodeBypass
|
||||||
@ -81,6 +82,7 @@ class FeatureManager(private val context: ModContext) : Manager {
|
|||||||
register(AutoUpdater::class)
|
register(AutoUpdater::class)
|
||||||
register(CameraTweaks::class)
|
register(CameraTweaks::class)
|
||||||
register(InfiniteStoryBoost::class)
|
register(InfiniteStoryBoost::class)
|
||||||
|
register(AmoledDarkMode::class)
|
||||||
|
|
||||||
initializeFeatures()
|
initializeFeatures()
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user