diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/config/ConfigProperty.kt b/app/src/main/kotlin/me/rhunk/snapenhance/config/ConfigProperty.kt index af244cc5..8a48d98f 100644 --- a/app/src/main/kotlin/me/rhunk/snapenhance/config/ConfigProperty.kt +++ b/app/src/main/kotlin/me/rhunk/snapenhance/config/ConfigProperty.kt @@ -173,6 +173,12 @@ enum class ConfigProperty( ConfigCategory.TWEAKS, ConfigStateValue(false) ), + DISABLE_VIDEO_LENGTH_RESTRICTION( + "property.disable_video_length_restriction", + "description.disable_video_length_restriction", + ConfigCategory.TWEAKS, + ConfigStateValue(false) + ), BLOCK_ADS("property.block_ads", "description.block_ads", ConfigCategory.TWEAKS, ConfigStateValue(false)), STREAK_EXPIRATION_INFO( "property.streak_expiration_info", diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/features/impl/extras/DisableVideoLengthRestriction.kt b/app/src/main/kotlin/me/rhunk/snapenhance/features/impl/extras/DisableVideoLengthRestriction.kt new file mode 100644 index 00000000..b8b91fb5 --- /dev/null +++ b/app/src/main/kotlin/me/rhunk/snapenhance/features/impl/extras/DisableVideoLengthRestriction.kt @@ -0,0 +1,25 @@ +package me.rhunk.snapenhance.features.impl.extras + +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.util.getObjectField +import me.rhunk.snapenhance.util.setObjectField + +class DisableVideoLengthRestriction : Feature("DisableVideoLengthRestriction", loadParams = FeatureLoadParams.ACTIVITY_CREATE_ASYNC) { + override fun asyncOnActivityCreate() { + val gridMediaItem = context.mappings.getMappedClass("GridMediaItem") + val gridMediaItemDurationFieldName = context.mappings.getMappedValue("GridMediaItemDurationField") + + Hooker.hookConstructor(gridMediaItem, HookStage.AFTER, { + context.config.bool(ConfigProperty.DISABLE_VIDEO_LENGTH_RESTRICTION) + }) {param -> + val durationMs = param.thisObject().getObjectField(gridMediaItemDurationFieldName) as Double + if (durationMs > 60000) { + param.thisObject().setObjectField(gridMediaItemDurationFieldName, 60000) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt index c2c75bd8..a9a84a8a 100644 --- a/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt +++ b/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt @@ -10,6 +10,7 @@ import me.rhunk.snapenhance.features.impl.downloader.AntiAutoDownload import me.rhunk.snapenhance.features.impl.downloader.MediaDownloader import me.rhunk.snapenhance.features.impl.extras.AntiAutoSave import me.rhunk.snapenhance.features.impl.extras.AutoSave +import me.rhunk.snapenhance.features.impl.extras.DisableVideoLengthRestriction import me.rhunk.snapenhance.features.impl.extras.ExternalMediaAsSnap import me.rhunk.snapenhance.features.impl.extras.Notifications import me.rhunk.snapenhance.features.impl.extras.SnapchatPlus @@ -66,6 +67,7 @@ class FeatureManager(private val context: ModContext) : Manager { register(ExternalMediaAsSnap::class) register(AntiAutoSave::class) register(UnlimitedSnapViewTime::class) + register(DisableVideoLengthRestriction::class) initializeFeatures() } diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt index bd9fdfbc..84b97e35 100644 --- a/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt +++ b/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt @@ -14,6 +14,7 @@ import me.rhunk.snapenhance.manager.Manager import me.rhunk.snapenhance.mapping.Mapper import me.rhunk.snapenhance.mapping.impl.CallbackMapper import me.rhunk.snapenhance.mapping.impl.EnumMapper +import me.rhunk.snapenhance.mapping.impl.GridMediaItemMapper import me.rhunk.snapenhance.mapping.impl.OperaPageViewControllerMapper import me.rhunk.snapenhance.mapping.impl.PlusSubscriptionMapper import me.rhunk.snapenhance.util.getObjectField @@ -27,6 +28,7 @@ class MappingManager(private val context: ModContext) : Manager { add(EnumMapper()) add(OperaPageViewControllerMapper()) add(PlusSubscriptionMapper()) + add(GridMediaItemMapper()) } private val mappings = ConcurrentHashMap() diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/mapping/impl/GridMediaItemMapper.kt b/app/src/main/kotlin/me/rhunk/snapenhance/mapping/impl/GridMediaItemMapper.kt new file mode 100644 index 00000000..ab4b4aff --- /dev/null +++ b/app/src/main/kotlin/me/rhunk/snapenhance/mapping/impl/GridMediaItemMapper.kt @@ -0,0 +1,27 @@ +package me.rhunk.snapenhance.mapping.impl + +import me.rhunk.snapenhance.Logger +import me.rhunk.snapenhance.mapping.Mapper + +class GridMediaItemMapper : Mapper() { + override fun useClasses( + classLoader: ClassLoader, + classes: List>, + mappings: MutableMap + ) { + for (clazz in classes) { + if (clazz.annotations.isEmpty()) continue + if (!clazz.annotations[0].toString().contains("typeReferences")) continue + clazz.declaredFields.firstOrNull { + it.annotations.isNotEmpty() && it.annotations[0].toString().contains("cameraRollSource") + }?.let { + mappings["GridMediaItem"] = clazz.name + mappings["GridMediaItemDurationField"] = clazz.declaredFields.first { + it.annotations.isNotEmpty() && it.annotations[0].toString().contains("durationMs") + }.name + + Logger.debug("Found GridMediaItem: ${clazz.name}, durationMs: ${mappings["GridMediaItemDurationField"]}") + } + } + } +} \ No newline at end of file