Merge pull request #4 from imCrest/imCrest/add-customizable-purchase-date-feature-di5qqb

Add Snapchat Plus purchase date setting and chat-hold kill actions (UI + core)
This commit is contained in:
imCrest
2026-04-14 17:12:25 +00:00
parent 4e3ef029a1
commit 2913cfe794
8 changed files with 175 additions and 3 deletions

View File

@@ -8,9 +8,11 @@ import me.eternal.purrfectsnap.core.util.hook.HookStage
import me.eternal.purrfectsnap.core.util.hook.hook
import me.eternal.purrfectsnap.core.util.hook.hookConstructor
import me.eternal.purrfectsnap.mapper.impl.PlusSubscriptionMapper
import java.time.LocalDate
import java.time.ZoneId
import java.time.format.DateTimeFormatter
class SnapchatPlus: Feature("SnapchatPlus") {
private val originalSubscriptionTime = (System.currentTimeMillis() - 7776000000L)
private val expirationTimeMillis = (System.currentTimeMillis() + 15552000000L)
override fun init() {
@@ -40,7 +42,24 @@ class SnapchatPlus: Feature("SnapchatPlus") {
//subscription status
set(statusField.getAsString()!!, 2)
set(originalSubscriptionTimeMillisField.getAsString()!!, originalSubscriptionTime)
val fallbackOriginalSubscriptionTime = System.currentTimeMillis() - 7776000000L
val customPurchaseDate = context.config.global.snapchatPlusPurchaseDate.get().trim()
val customPurchaseDateMillis = if (customPurchaseDate.isNotEmpty()) {
runCatching {
LocalDate
.parse(customPurchaseDate, DateTimeFormatter.ISO_LOCAL_DATE)
.atStartOfDay(ZoneId.systemDefault())
.toInstant()
.toEpochMilli()
}.getOrNull()
} else {
null
}
set(
originalSubscriptionTimeMillisField.getAsString()!!,
customPurchaseDateMillis ?: fallbackOriginalSubscriptionTime
)
set(expirationTimeMillisField.getAsString()!!, expirationTimeMillis)
}
}

View File

@@ -1,9 +1,12 @@
package me.eternal.purrfectsnap.core.ui.menu.impl
import android.app.ActivityManager
import android.os.Process
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.ImageView
import me.eternal.purrfectsnap.common.Constants
import me.eternal.purrfectsnap.common.ui.OverlayType
import me.eternal.purrfectsnap.core.event.events.impl.AddViewEvent
import me.eternal.purrfectsnap.core.ui.menu.AbstractMenu
@@ -47,6 +50,9 @@ class SettingsGearInjector : AbstractMenu() {
this@SettingsGearInjector.context.log.info("Gear icon clicked.", logTag)
this@SettingsGearInjector.context.bridgeClient.openOverlay(OverlayType.SETTINGS)
}
setOnLongClickListener {
this@SettingsGearInjector.handleChatHoldKillAction()
}
}
val layoutParams = FrameLayout.LayoutParams(
@@ -88,4 +94,24 @@ class SettingsGearInjector : AbstractMenu() {
}
}
}
private fun handleChatHoldKillAction(): Boolean {
val selectedActions = context.config.userInterface.chatHoldKillActions.get()
if (selectedActions.isEmpty()) return false
context.mainActivity?.vibrateLongPress()
if (selectedActions.contains("kill_purrfectsnap")) {
runCatching {
val activityManager = context.androidContext.getSystemService(ActivityManager::class.java)
activityManager?.killBackgroundProcesses(Constants.MODULE_PACKAGE_NAME)
}
}
if (selectedActions.contains("kill_snapchat")) {
Process.killProcess(Process.myPid())
}
return true
}
}

View File

@@ -1,7 +1,10 @@
package me.eternal.purrfectsnap.core.ui.menu.impl
import android.app.ActivityManager
import android.os.Process
import android.view.View
import android.widget.FrameLayout
import me.eternal.purrfectsnap.common.Constants
import me.eternal.purrfectsnap.common.ui.OverlayType
import me.eternal.purrfectsnap.core.ui.menu.AbstractMenu
import me.eternal.purrfectsnap.core.util.hook.HookStage
@@ -22,8 +25,31 @@ class SettingsMenu : AbstractMenu() {
view.setOnClickListener {
context.bridgeClient.openOverlay(OverlayType.SETTINGS)
}
view.setOnLongClickListener {
handleChatHoldKillAction()
}
}
}
}
}
private fun handleChatHoldKillAction(): Boolean {
val selectedActions = context.config.userInterface.chatHoldKillActions.get()
if (selectedActions.isEmpty()) return false
context.mainActivity?.vibrateLongPress()
if (selectedActions.contains("kill_purrfectsnap")) {
runCatching {
val activityManager = context.androidContext.getSystemService(ActivityManager::class.java)
activityManager?.killBackgroundProcesses(Constants.MODULE_PACKAGE_NAME)
}
}
if (selectedActions.contains("kill_snapchat")) {
Process.killProcess(Process.myPid())
}
return true
}
}