refactor: common submodule

- organize import
- remove unused xml
This commit is contained in:
rhunk 2023-10-11 01:25:27 +02:00
parent 00a33b9ce6
commit 13d6ae7554
238 changed files with 1016 additions and 1075 deletions

View File

@ -127,6 +127,7 @@ dependencies {
} }
implementation(project(":core")) implementation(project(":core"))
implementation(project(":common"))
implementation(libs.androidx.documentfile) implementation(libs.androidx.documentfile)
implementation(libs.gson) implementation(libs.gson)
implementation(libs.ffmpeg.kit) implementation(libs.ffmpeg.kit)

View File

@ -28,7 +28,7 @@
android:value="93" /> android:value="93" />
<meta-data <meta-data
android:name="xposedscope" android:name="xposedscope"
android:resource="@array/xposed_scope" /> android:value="com.snapchat.android" />
<service <service
android:name=".bridge.BridgeService" android:name=".bridge.BridgeService"

View File

@ -3,9 +3,9 @@ package me.rhunk.snapenhance
import android.content.SharedPreferences import android.content.SharedPreferences
import android.util.Log import android.util.Log
import com.google.gson.GsonBuilder import com.google.gson.GsonBuilder
import me.rhunk.snapenhance.core.logger.AbstractLogger import me.rhunk.snapenhance.common.logger.AbstractLogger
import me.rhunk.snapenhance.core.logger.LogChannel import me.rhunk.snapenhance.common.logger.LogChannel
import me.rhunk.snapenhance.core.logger.LogLevel import me.rhunk.snapenhance.common.logger.LogLevel
import java.io.File import java.io.File
import java.io.OutputStream import java.io.OutputStream
import java.io.RandomAccessFile import java.io.RandomAccessFile

View File

@ -17,10 +17,10 @@ import coil.memory.MemoryCache
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import me.rhunk.snapenhance.bridge.BridgeService import me.rhunk.snapenhance.bridge.BridgeService
import me.rhunk.snapenhance.core.BuildConfig import me.rhunk.snapenhance.common.BuildConfig
import me.rhunk.snapenhance.core.bridge.wrapper.LocaleWrapper import me.rhunk.snapenhance.common.bridge.wrapper.LocaleWrapper
import me.rhunk.snapenhance.core.bridge.wrapper.MappingsWrapper import me.rhunk.snapenhance.common.bridge.wrapper.MappingsWrapper
import me.rhunk.snapenhance.core.config.ModConfig import me.rhunk.snapenhance.common.config.ModConfig
import me.rhunk.snapenhance.download.DownloadTaskManager import me.rhunk.snapenhance.download.DownloadTaskManager
import me.rhunk.snapenhance.e2ee.E2EEImplementation import me.rhunk.snapenhance.e2ee.E2EEImplementation
import me.rhunk.snapenhance.messaging.ModDatabase import me.rhunk.snapenhance.messaging.ModDatabase

View File

@ -5,16 +5,16 @@ import android.content.Intent
import android.os.IBinder import android.os.IBinder
import me.rhunk.snapenhance.RemoteSideContext import me.rhunk.snapenhance.RemoteSideContext
import me.rhunk.snapenhance.SharedContextHolder import me.rhunk.snapenhance.SharedContextHolder
import me.rhunk.snapenhance.core.bridge.types.BridgeFileType import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
import me.rhunk.snapenhance.core.bridge.types.FileActionType import me.rhunk.snapenhance.common.bridge.types.FileActionType
import me.rhunk.snapenhance.core.bridge.wrapper.LocaleWrapper import me.rhunk.snapenhance.common.bridge.wrapper.LocaleWrapper
import me.rhunk.snapenhance.core.bridge.wrapper.MessageLoggerWrapper import me.rhunk.snapenhance.common.bridge.wrapper.MessageLoggerWrapper
import me.rhunk.snapenhance.core.database.objects.FriendInfo import me.rhunk.snapenhance.common.data.MessagingFriendInfo
import me.rhunk.snapenhance.core.logger.LogLevel import me.rhunk.snapenhance.common.data.MessagingGroupInfo
import me.rhunk.snapenhance.core.messaging.MessagingFriendInfo import me.rhunk.snapenhance.common.data.SocialScope
import me.rhunk.snapenhance.core.messaging.MessagingGroupInfo import me.rhunk.snapenhance.common.database.impl.FriendInfo
import me.rhunk.snapenhance.core.messaging.SocialScope import me.rhunk.snapenhance.common.logger.LogLevel
import me.rhunk.snapenhance.core.util.SerializableDataObject import me.rhunk.snapenhance.common.util.SerializableDataObject
import me.rhunk.snapenhance.download.DownloadProcessor import me.rhunk.snapenhance.download.DownloadProcessor
import kotlin.system.measureTimeMillis import kotlin.system.measureTimeMillis

View File

@ -3,8 +3,8 @@ package me.rhunk.snapenhance.bridge
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import me.rhunk.snapenhance.Constants
import me.rhunk.snapenhance.SharedContextHolder import me.rhunk.snapenhance.SharedContextHolder
import me.rhunk.snapenhance.common.Constants
class ForceStartActivity : Activity() { class ForceStartActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {

View File

@ -1,8 +1,8 @@
package me.rhunk.snapenhance.download package me.rhunk.snapenhance.download
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import me.rhunk.snapenhance.core.download.data.DownloadMetadata import me.rhunk.snapenhance.common.data.download.DownloadMetadata
import me.rhunk.snapenhance.core.download.data.DownloadStage import me.rhunk.snapenhance.common.data.download.DownloadStage
data class DownloadObject( data class DownloadObject(
var downloadId: Int = 0, var downloadId: Int = 0,

View File

@ -13,14 +13,14 @@ import kotlinx.coroutines.job
import kotlinx.coroutines.joinAll import kotlinx.coroutines.joinAll
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import me.rhunk.snapenhance.Constants
import me.rhunk.snapenhance.RemoteSideContext import me.rhunk.snapenhance.RemoteSideContext
import me.rhunk.snapenhance.bridge.DownloadCallback import me.rhunk.snapenhance.bridge.DownloadCallback
import me.rhunk.snapenhance.core.download.DownloadManagerClient import me.rhunk.snapenhance.common.Constants
import me.rhunk.snapenhance.core.download.data.* import me.rhunk.snapenhance.common.ReceiversConfig
import me.rhunk.snapenhance.core.util.download.RemoteMediaResolver import me.rhunk.snapenhance.common.data.FileType
import me.rhunk.snapenhance.core.util.snap.MediaDownloaderHelper import me.rhunk.snapenhance.common.data.download.*
import me.rhunk.snapenhance.data.FileType import me.rhunk.snapenhance.common.util.snap.MediaDownloaderHelper
import me.rhunk.snapenhance.common.util.snap.RemoteMediaResolver
import java.io.File import java.io.File
import java.io.InputStream import java.io.InputStream
import java.net.HttpURLConnection import java.net.HttpURLConnection
@ -296,8 +296,8 @@ class DownloadProcessor (
fun onReceive(intent: Intent) { fun onReceive(intent: Intent) {
remoteSideContext.coroutineScope.launch { remoteSideContext.coroutineScope.launch {
val downloadMetadata = gson.fromJson(intent.getStringExtra(DownloadManagerClient.DOWNLOAD_METADATA_EXTRA)!!, DownloadMetadata::class.java) val downloadMetadata = gson.fromJson(intent.getStringExtra(ReceiversConfig.DOWNLOAD_METADATA_EXTRA)!!, DownloadMetadata::class.java)
val downloadRequest = gson.fromJson(intent.getStringExtra(DownloadManagerClient.DOWNLOAD_REQUEST_EXTRA)!!, DownloadRequest::class.java) val downloadRequest = gson.fromJson(intent.getStringExtra(ReceiversConfig.DOWNLOAD_REQUEST_EXTRA)!!, DownloadRequest::class.java)
remoteSideContext.downloadTaskManager.canDownloadMedia(downloadMetadata.mediaIdentifier)?.let { downloadStage -> remoteSideContext.downloadTaskManager.canDownloadMedia(downloadMetadata.mediaIdentifier)?.let { downloadStage ->
translation[if (downloadStage.isFinalStage) { translation[if (downloadStage.isFinalStage) {

View File

@ -3,12 +3,12 @@ package me.rhunk.snapenhance.download
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase
import me.rhunk.snapenhance.core.download.data.DownloadMetadata import me.rhunk.snapenhance.common.data.download.DownloadMetadata
import me.rhunk.snapenhance.core.download.data.DownloadStage import me.rhunk.snapenhance.common.data.download.DownloadStage
import me.rhunk.snapenhance.core.download.data.MediaDownloadSource import me.rhunk.snapenhance.common.data.download.MediaDownloadSource
import me.rhunk.snapenhance.core.util.SQLiteDatabaseHelper import me.rhunk.snapenhance.common.util.SQLiteDatabaseHelper
import me.rhunk.snapenhance.core.util.ktx.getIntOrNull import me.rhunk.snapenhance.common.util.ktx.getIntOrNull
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull import me.rhunk.snapenhance.common.util.ktx.getStringOrNull
import java.util.concurrent.Executors import java.util.concurrent.Executors
class DownloadTaskManager { class DownloadTaskManager {
@ -162,7 +162,8 @@ class DownloadTaskManager {
metadata = DownloadMetadata( metadata = DownloadMetadata(
outputPath = cursor.getStringOrNull("outputPath")!!, outputPath = cursor.getStringOrNull("outputPath")!!,
mediaIdentifier = cursor.getStringOrNull("hash"), mediaIdentifier = cursor.getStringOrNull("hash"),
downloadSource = cursor.getStringOrNull("downloadSource") ?: MediaDownloadSource.NONE.key, downloadSource = cursor.getStringOrNull("downloadSource")
?: MediaDownloadSource.NONE.key,
mediaAuthor = cursor.getStringOrNull("mediaAuthor"), mediaAuthor = cursor.getStringOrNull("mediaAuthor"),
iconUrl = cursor.getStringOrNull("iconUrl") iconUrl = cursor.getStringOrNull("iconUrl")
) )

View File

@ -5,9 +5,8 @@ import com.arthenica.ffmpegkit.FFmpegSession
import com.arthenica.ffmpegkit.Level import com.arthenica.ffmpegkit.Level
import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.suspendCancellableCoroutine
import me.rhunk.snapenhance.LogManager import me.rhunk.snapenhance.LogManager
import me.rhunk.snapenhance.core.Logger import me.rhunk.snapenhance.common.config.impl.DownloaderConfig
import me.rhunk.snapenhance.core.config.impl.DownloaderConfig import me.rhunk.snapenhance.common.logger.LogLevel
import me.rhunk.snapenhance.core.logger.LogLevel
import java.io.File import java.io.File
import java.util.concurrent.Executors import java.util.concurrent.Executors
@ -71,7 +70,7 @@ class FFMpegProcessor(
} }
} }
Logger.directDebug("arguments: $stringBuilder", "FFMpegProcessor") logManager.debug("arguments: $stringBuilder", "FFMpegProcessor")
FFmpegKit.executeAsync(stringBuilder.toString(), FFmpegKit.executeAsync(stringBuilder.toString(),
{ session -> { session ->

View File

@ -2,16 +2,16 @@ package me.rhunk.snapenhance.messaging
import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase
import me.rhunk.snapenhance.RemoteSideContext import me.rhunk.snapenhance.RemoteSideContext
import me.rhunk.snapenhance.core.database.objects.FriendInfo import me.rhunk.snapenhance.common.data.FriendStreaks
import me.rhunk.snapenhance.core.messaging.FriendStreaks import me.rhunk.snapenhance.common.data.MessagingFriendInfo
import me.rhunk.snapenhance.core.messaging.MessagingFriendInfo import me.rhunk.snapenhance.common.data.MessagingGroupInfo
import me.rhunk.snapenhance.core.messaging.MessagingGroupInfo import me.rhunk.snapenhance.common.data.MessagingRuleType
import me.rhunk.snapenhance.core.messaging.MessagingRuleType import me.rhunk.snapenhance.common.database.impl.FriendInfo
import me.rhunk.snapenhance.core.util.SQLiteDatabaseHelper import me.rhunk.snapenhance.common.scripting.type.ModuleInfo
import me.rhunk.snapenhance.core.util.ktx.getInteger import me.rhunk.snapenhance.common.util.SQLiteDatabaseHelper
import me.rhunk.snapenhance.core.util.ktx.getLongOrNull import me.rhunk.snapenhance.common.util.ktx.getInteger
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull import me.rhunk.snapenhance.common.util.ktx.getLongOrNull
import me.rhunk.snapenhance.scripting.type.ModuleInfo import me.rhunk.snapenhance.common.util.ktx.getStringOrNull
import java.util.concurrent.Executors import java.util.concurrent.Executors
@ -75,11 +75,13 @@ class ModDatabase(
return database.rawQuery("SELECT * FROM groups", null).use { cursor -> return database.rawQuery("SELECT * FROM groups", null).use { cursor ->
val groups = mutableListOf<MessagingGroupInfo>() val groups = mutableListOf<MessagingGroupInfo>()
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
groups.add(MessagingGroupInfo( groups.add(
MessagingGroupInfo(
conversationId = cursor.getStringOrNull("conversationId")!!, conversationId = cursor.getStringOrNull("conversationId")!!,
name = cursor.getStringOrNull("name")!!, name = cursor.getStringOrNull("name")!!,
participantsCount = cursor.getInteger("participantsCount") participantsCount = cursor.getInteger("participantsCount")
)) )
)
} }
groups groups
} }
@ -90,13 +92,15 @@ class ModDatabase(
val friends = mutableListOf<MessagingFriendInfo>() val friends = mutableListOf<MessagingFriendInfo>()
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
runCatching { runCatching {
friends.add(MessagingFriendInfo( friends.add(
MessagingFriendInfo(
userId = cursor.getStringOrNull("userId")!!, userId = cursor.getStringOrNull("userId")!!,
displayName = cursor.getStringOrNull("displayName"), displayName = cursor.getStringOrNull("displayName"),
mutableUsername = cursor.getStringOrNull("mutableUsername")!!, mutableUsername = cursor.getStringOrNull("mutableUsername")!!,
bitmojiId = cursor.getStringOrNull("bitmojiId"), bitmojiId = cursor.getStringOrNull("bitmojiId"),
selfieId = cursor.getStringOrNull("selfieId") selfieId = cursor.getStringOrNull("selfieId")
)) )
)
}.onFailure { }.onFailure {
context.log.error("Failed to parse friend", it) context.log.error("Failed to parse friend", it)
} }

View File

@ -14,7 +14,7 @@ import me.rhunk.snapenhance.R
import me.rhunk.snapenhance.RemoteSideContext import me.rhunk.snapenhance.RemoteSideContext
import me.rhunk.snapenhance.SharedContextHolder import me.rhunk.snapenhance.SharedContextHolder
import me.rhunk.snapenhance.bridge.ForceStartActivity import me.rhunk.snapenhance.bridge.ForceStartActivity
import me.rhunk.snapenhance.core.util.snap.BitmojiSelfie import me.rhunk.snapenhance.common.util.snap.BitmojiSelfie
import me.rhunk.snapenhance.ui.util.ImageRequestHelper import me.rhunk.snapenhance.ui.util.ImageRequestHelper
class StreaksReminder( class StreaksReminder(

View File

@ -5,11 +5,12 @@ import androidx.documentfile.provider.DocumentFile
import me.rhunk.snapenhance.RemoteSideContext import me.rhunk.snapenhance.RemoteSideContext
import me.rhunk.snapenhance.bridge.scripting.IPCListener import me.rhunk.snapenhance.bridge.scripting.IPCListener
import me.rhunk.snapenhance.bridge.scripting.IScripting import me.rhunk.snapenhance.bridge.scripting.IScripting
import me.rhunk.snapenhance.common.scripting.ScriptRuntime
import me.rhunk.snapenhance.common.scripting.type.ModuleInfo
import me.rhunk.snapenhance.scripting.impl.IPCListeners import me.rhunk.snapenhance.scripting.impl.IPCListeners
import me.rhunk.snapenhance.scripting.impl.RemoteManagerIPC
import me.rhunk.snapenhance.scripting.impl.ui.InterfaceBuilder import me.rhunk.snapenhance.scripting.impl.ui.InterfaceBuilder
import me.rhunk.snapenhance.scripting.impl.ui.InterfaceManager import me.rhunk.snapenhance.scripting.impl.ui.InterfaceManager
import me.rhunk.snapenhance.scripting.impl.RemoteManagerIPC
import me.rhunk.snapenhance.scripting.type.ModuleInfo
import java.io.InputStream import java.io.InputStream
class RemoteScriptManager( class RemoteScriptManager(

View File

@ -2,10 +2,10 @@ package me.rhunk.snapenhance.scripting.impl
import android.os.DeadObjectException import android.os.DeadObjectException
import me.rhunk.snapenhance.bridge.scripting.IPCListener import me.rhunk.snapenhance.bridge.scripting.IPCListener
import me.rhunk.snapenhance.core.logger.AbstractLogger import me.rhunk.snapenhance.common.logger.AbstractLogger
import me.rhunk.snapenhance.scripting.IPCInterface import me.rhunk.snapenhance.common.scripting.IPCInterface
import me.rhunk.snapenhance.scripting.Listener import me.rhunk.snapenhance.common.scripting.Listener
import me.rhunk.snapenhance.scripting.type.ModuleInfo import me.rhunk.snapenhance.common.scripting.type.ModuleInfo
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
typealias IPCListeners = ConcurrentHashMap<String, MutableMap<String, MutableSet<IPCListener>>> // channel, eventName -> listeners typealias IPCListeners = ConcurrentHashMap<String, MutableMap<String, MutableSet<IPCListener>>> // channel, eventName -> listeners

View File

@ -1,10 +1,10 @@
package me.rhunk.snapenhance.scripting.impl.ui package me.rhunk.snapenhance.scripting.impl.ui
import me.rhunk.snapenhance.core.logger.AbstractLogger import me.rhunk.snapenhance.common.logger.AbstractLogger
import me.rhunk.snapenhance.common.scripting.type.ModuleInfo
import me.rhunk.snapenhance.scripting.impl.ui.components.Node import me.rhunk.snapenhance.scripting.impl.ui.components.Node
import me.rhunk.snapenhance.scripting.impl.ui.components.NodeType import me.rhunk.snapenhance.scripting.impl.ui.components.NodeType
import me.rhunk.snapenhance.scripting.impl.ui.components.impl.RowColumnNode import me.rhunk.snapenhance.scripting.impl.ui.components.impl.RowColumnNode
import me.rhunk.snapenhance.scripting.type.ModuleInfo
import org.mozilla.javascript.Context import org.mozilla.javascript.Context
import org.mozilla.javascript.Function import org.mozilla.javascript.Function
import org.mozilla.javascript.annotations.JSFunction import org.mozilla.javascript.annotations.JSFunction

View File

@ -8,7 +8,7 @@ import android.os.Bundle
import android.view.MotionEvent import android.view.MotionEvent
import android.widget.Button import android.widget.Button
import android.widget.EditText import android.widget.EditText
import me.rhunk.snapenhance.core.R import me.rhunk.snapenhance.R
import org.osmdroid.config.Configuration import org.osmdroid.config.Configuration
import org.osmdroid.tileprovider.tilesource.TileSourceFactory import org.osmdroid.tileprovider.tilesource.TileSourceFactory
import org.osmdroid.util.GeoPoint import org.osmdroid.util.GeoPoint

View File

@ -1,7 +1,7 @@
package me.rhunk.snapenhance.ui.manager.data package me.rhunk.snapenhance.ui.manager.data
import com.google.gson.JsonParser import com.google.gson.JsonParser
import me.rhunk.snapenhance.core.BuildConfig import me.rhunk.snapenhance.common.BuildConfig
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request

View File

@ -28,8 +28,8 @@ import coil.compose.rememberAsyncImagePainter
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.future.asCompletableFuture import kotlinx.coroutines.future.asCompletableFuture
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import me.rhunk.snapenhance.core.download.data.MediaDownloadSource import me.rhunk.snapenhance.common.data.FileType
import me.rhunk.snapenhance.data.FileType import me.rhunk.snapenhance.common.data.download.MediaDownloadSource
import me.rhunk.snapenhance.download.DownloadObject import me.rhunk.snapenhance.download.DownloadObject
import me.rhunk.snapenhance.ui.manager.Section import me.rhunk.snapenhance.ui.manager.Section
import me.rhunk.snapenhance.ui.util.BitmojiImage import me.rhunk.snapenhance.ui.util.BitmojiImage

View File

@ -37,7 +37,7 @@ import androidx.navigation.navigation
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import me.rhunk.snapenhance.core.config.* import me.rhunk.snapenhance.common.config.*
import me.rhunk.snapenhance.ui.manager.MainActivity import me.rhunk.snapenhance.ui.manager.MainActivity
import me.rhunk.snapenhance.ui.manager.Section import me.rhunk.snapenhance.ui.manager.Section
import me.rhunk.snapenhance.ui.util.* import me.rhunk.snapenhance.ui.util.*

View File

@ -33,8 +33,8 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import me.rhunk.snapenhance.LogReader import me.rhunk.snapenhance.LogReader
import me.rhunk.snapenhance.RemoteSideContext import me.rhunk.snapenhance.RemoteSideContext
import me.rhunk.snapenhance.core.logger.LogChannel import me.rhunk.snapenhance.common.logger.LogChannel
import me.rhunk.snapenhance.core.logger.LogLevel import me.rhunk.snapenhance.common.logger.LogLevel
class HomeSubSection( class HomeSubSection(
private val context: RemoteSideContext private val context: RemoteSideContext

View File

@ -20,10 +20,9 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import me.rhunk.snapenhance.Constants import me.rhunk.snapenhance.common.Constants
import me.rhunk.snapenhance.action.EnumAction import me.rhunk.snapenhance.common.action.EnumAction
import me.rhunk.snapenhance.core.bridge.types.BridgeFileType import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
import me.rhunk.snapenhance.manager.impl.ActionManager
import me.rhunk.snapenhance.ui.manager.Section import me.rhunk.snapenhance.ui.manager.Section
import me.rhunk.snapenhance.ui.util.AlertDialogs import me.rhunk.snapenhance.ui.util.AlertDialogs
@ -83,7 +82,7 @@ class SettingsSection : Section() {
private fun launchActionIntent(action: EnumAction) { private fun launchActionIntent(action: EnumAction) {
val intent = context.androidContext.packageManager.getLaunchIntentForPackage(Constants.SNAPCHAT_PACKAGE_NAME) val intent = context.androidContext.packageManager.getLaunchIntentForPackage(Constants.SNAPCHAT_PACKAGE_NAME)
intent?.putExtra(ActionManager.ACTION_PARAMETER, action.key) intent?.putExtra(EnumAction.ACTION_PARAMETER, action.key)
context.androidContext.startActivity(intent) context.androidContext.startActivity(intent)
} }

View File

@ -12,7 +12,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import me.rhunk.snapenhance.core.Logger import me.rhunk.snapenhance.common.logger.AbstractLogger
import me.rhunk.snapenhance.scripting.impl.ui.InterfaceBuilder import me.rhunk.snapenhance.scripting.impl.ui.InterfaceBuilder
import me.rhunk.snapenhance.scripting.impl.ui.components.Node import me.rhunk.snapenhance.scripting.impl.ui.components.Node
import me.rhunk.snapenhance.scripting.impl.ui.components.NodeType import me.rhunk.snapenhance.scripting.impl.ui.components.NodeType
@ -54,7 +54,7 @@ private fun DrawNode(node: Node) {
runCatching { runCatching {
callback() callback()
}.onFailure { }.onFailure {
Logger.directError("Error running callback", it) AbstractLogger.directError("Error running callback", it)
} }
} }

View File

@ -13,7 +13,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import me.rhunk.snapenhance.scripting.type.ModuleInfo import me.rhunk.snapenhance.common.scripting.type.ModuleInfo
import me.rhunk.snapenhance.ui.manager.Section import me.rhunk.snapenhance.ui.manager.Section
import me.rhunk.snapenhance.ui.util.pullrefresh.PullRefreshIndicator import me.rhunk.snapenhance.ui.util.pullrefresh.PullRefreshIndicator
import me.rhunk.snapenhance.ui.util.pullrefresh.pullRefresh import me.rhunk.snapenhance.ui.util.pullrefresh.pullRefresh

View File

@ -24,11 +24,11 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import me.rhunk.snapenhance.RemoteSideContext import me.rhunk.snapenhance.RemoteSideContext
import me.rhunk.snapenhance.core.bridge.BridgeClient import me.rhunk.snapenhance.common.ReceiversConfig
import me.rhunk.snapenhance.core.messaging.MessagingFriendInfo import me.rhunk.snapenhance.common.data.MessagingFriendInfo
import me.rhunk.snapenhance.core.messaging.MessagingGroupInfo import me.rhunk.snapenhance.common.data.MessagingGroupInfo
import me.rhunk.snapenhance.core.messaging.SocialScope import me.rhunk.snapenhance.common.data.SocialScope
import me.rhunk.snapenhance.core.util.snap.SnapWidgetBroadcastReceiverHelper import me.rhunk.snapenhance.common.util.snap.SnapWidgetBroadcastReceiverHelper
class AddFriendDialog( class AddFriendDialog(
private val context: RemoteSideContext, private val context: RemoteSideContext,
@ -128,7 +128,7 @@ class AddFriendDialog(
timeoutJob?.cancel() timeoutJob?.cancel()
hasFetchError = false hasFetchError = false
} }
SnapWidgetBroadcastReceiverHelper.create(BridgeClient.BRIDGE_SYNC_ACTION) {}.also { SnapWidgetBroadcastReceiverHelper.create(ReceiversConfig.BRIDGE_SYNC_ACTION) {}.also {
runCatching { runCatching {
context.androidContext.sendBroadcast(it) context.androidContext.sendBroadcast(it)
}.onFailure { }.onFailure {

View File

@ -22,9 +22,9 @@ import androidx.navigation.NavController
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import me.rhunk.snapenhance.RemoteSideContext import me.rhunk.snapenhance.RemoteSideContext
import me.rhunk.snapenhance.core.messaging.MessagingRuleType import me.rhunk.snapenhance.common.data.MessagingRuleType
import me.rhunk.snapenhance.core.messaging.SocialScope import me.rhunk.snapenhance.common.data.SocialScope
import me.rhunk.snapenhance.core.util.snap.BitmojiSelfie import me.rhunk.snapenhance.common.util.snap.BitmojiSelfie
import me.rhunk.snapenhance.ui.util.AlertDialogs import me.rhunk.snapenhance.ui.util.AlertDialogs
import me.rhunk.snapenhance.ui.util.BitmojiImage import me.rhunk.snapenhance.ui.util.BitmojiImage
import me.rhunk.snapenhance.ui.util.Dialog import me.rhunk.snapenhance.ui.util.Dialog

View File

@ -27,10 +27,10 @@ import androidx.navigation.compose.composable
import androidx.navigation.navigation import androidx.navigation.navigation
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import me.rhunk.snapenhance.R import me.rhunk.snapenhance.R
import me.rhunk.snapenhance.core.messaging.MessagingFriendInfo import me.rhunk.snapenhance.common.data.MessagingFriendInfo
import me.rhunk.snapenhance.core.messaging.MessagingGroupInfo import me.rhunk.snapenhance.common.data.MessagingGroupInfo
import me.rhunk.snapenhance.core.messaging.SocialScope import me.rhunk.snapenhance.common.data.SocialScope
import me.rhunk.snapenhance.core.util.snap.BitmojiSelfie import me.rhunk.snapenhance.common.util.snap.BitmojiSelfie
import me.rhunk.snapenhance.ui.manager.Section import me.rhunk.snapenhance.ui.manager.Section
import me.rhunk.snapenhance.ui.util.AlertDialogs import me.rhunk.snapenhance.ui.util.AlertDialogs
import me.rhunk.snapenhance.ui.util.BitmojiImage import me.rhunk.snapenhance.ui.util.BitmojiImage

View File

@ -14,14 +14,18 @@ import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.* import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import me.rhunk.snapenhance.core.bridge.wrapper.LocaleWrapper import me.rhunk.snapenhance.common.bridge.wrapper.LocaleWrapper
import me.rhunk.snapenhance.ui.setup.screens.SetupScreen import me.rhunk.snapenhance.ui.setup.screens.SetupScreen
import me.rhunk.snapenhance.ui.util.ObservableMutableState import me.rhunk.snapenhance.ui.util.ObservableMutableState
import java.util.Locale import java.util.Locale

View File

@ -4,7 +4,7 @@ import android.content.Intent
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import me.rhunk.snapenhance.core.Logger import me.rhunk.snapenhance.common.logger.AbstractLogger
typealias ActivityLauncherCallback = (resultCode: Int, intent: Intent?) -> Unit typealias ActivityLauncherCallback = (resultCode: Int, intent: Intent?) -> Unit
@ -17,7 +17,7 @@ class ActivityLauncherHelper(
runCatching { runCatching {
callback?.let { it(if (result) ComponentActivity.RESULT_OK else ComponentActivity.RESULT_CANCELED, null) } callback?.let { it(if (result) ComponentActivity.RESULT_OK else ComponentActivity.RESULT_CANCELED, null) }
}.onFailure { }.onFailure {
Logger.directError("Failed to process activity result", it) AbstractLogger.directError("Failed to process activity result", it)
} }
callback = null callback = null
} }
@ -27,7 +27,7 @@ class ActivityLauncherHelper(
runCatching { runCatching {
callback?.let { it(result.resultCode, result.data) } callback?.let { it(result.resultCode, result.data) }
}.onFailure { }.onFailure {
Logger.directError("Failed to process activity result", it) AbstractLogger.directError("Failed to process activity result", it)
} }
callback = null callback = null
} }

View File

@ -22,9 +22,9 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import me.rhunk.snapenhance.core.bridge.wrapper.LocaleWrapper import me.rhunk.snapenhance.common.bridge.wrapper.LocaleWrapper
import me.rhunk.snapenhance.core.config.DataProcessors import me.rhunk.snapenhance.common.config.DataProcessors
import me.rhunk.snapenhance.core.config.PropertyPair import me.rhunk.snapenhance.common.config.PropertyPair
class AlertDialogs( class AlertDialogs(

View File

@ -12,3 +12,10 @@ rootProject.ext.set("appVersionName", versionName)
rootProject.ext.set("appVersionCode", versionCode) rootProject.ext.set("appVersionCode", versionCode)
rootProject.ext.set("applicationId", "me.rhunk.snapenhance") rootProject.ext.set("applicationId", "me.rhunk.snapenhance")
rootProject.ext.set("nativeName", properties["custom_native_name"] ?: java.security.SecureRandom().nextLong(1000000000, 99999999999).toString(16)) rootProject.ext.set("nativeName", properties["custom_native_name"] ?: java.security.SecureRandom().nextLong(1000000000, 99999999999).toString(16))
tasks.register("getVersion") {
doLast {
val versionFile = File("app/build/version.txt")
versionFile.writeText(versionName)
}
}

1
common/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

37
common/build.gradle.kts Normal file
View File

@ -0,0 +1,37 @@
plugins {
alias(libs.plugins.androidLibrary)
alias(libs.plugins.kotlinAndroid)
}
android {
namespace = rootProject.ext["applicationId"].toString() + ".common"
compileSdk = 34
buildFeatures {
aidl = true
buildConfig = true
}
defaultConfig {
minSdk = 28
buildConfigField("String", "VERSION_NAME", "\"${rootProject.ext["appVersionName"]}\"")
buildConfigField("int", "VERSION_CODE", "${rootProject.ext["appVersionCode"]}")
buildConfigField("String", "APPLICATION_ID", "\"${rootProject.ext["applicationId"]}\"")
buildConfigField("int", "BUILD_DATE", "${System.currentTimeMillis() / 1000}")
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
implementation(libs.coroutines)
implementation(libs.gson)
implementation(libs.okhttp)
implementation(libs.androidx.documentfile)
implementation(libs.rhino)
implementation(project(":stub"))
implementation(project(":mapper"))
}

View File

@ -1,4 +1,4 @@
package me.rhunk.snapenhance package me.rhunk.snapenhance.common
object Constants { object Constants {
const val SNAPCHAT_PACKAGE_NAME = "com.snapchat.android" const val SNAPCHAT_PACKAGE_NAME = "com.snapchat.android"

View File

@ -0,0 +1,7 @@
package me.rhunk.snapenhance.common
object ReceiversConfig {
const val BRIDGE_SYNC_ACTION = BuildConfig.APPLICATION_ID + ".core.bridge.SYNC"
const val DOWNLOAD_REQUEST_EXTRA = "request"
const val DOWNLOAD_METADATA_EXTRA = "metadata"
}

View File

@ -0,0 +1,17 @@
package me.rhunk.snapenhance.common.action
enum class EnumAction(
val key: String,
val exitOnFinish: Boolean = false,
val isCritical: Boolean = false,
) {
CLEAN_CACHE("clean_snapchat_cache", exitOnFinish = true),
EXPORT_CHAT_MESSAGES("export_chat_messages"),
OPEN_MAP("open_map");
companion object {
const val ACTION_PARAMETER = "se_action"
}
}

View File

@ -1,11 +1,11 @@
package me.rhunk.snapenhance.core.bridge package me.rhunk.snapenhance.common.bridge
import android.content.Context import android.content.Context
import me.rhunk.snapenhance.core.bridge.types.BridgeFileType import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
open class FileLoaderWrapper( open class FileLoaderWrapper(
private val fileType: BridgeFileType, val fileType: BridgeFileType,
private val defaultContent: ByteArray val defaultContent: ByteArray
) { ) {
lateinit var isFileExists: () -> Boolean lateinit var isFileExists: () -> Boolean
lateinit var write: (ByteArray) -> Unit lateinit var write: (ByteArray) -> Unit
@ -26,10 +26,4 @@ open class FileLoaderWrapper(
delete = { file.delete() } delete = { file.delete() }
} }
fun loadFromBridge(bridgeClient: BridgeClient) {
isFileExists = { bridgeClient.isFileExists(fileType) }
read = { bridgeClient.createAndReadFile(fileType, defaultContent) }
write = { bridgeClient.writeFile(fileType, it) }
delete = { bridgeClient.deleteFile(fileType) }
}
} }

View File

@ -1,4 +1,4 @@
package me.rhunk.snapenhance.core.bridge.types package me.rhunk.snapenhance.common.bridge.types
import android.content.Context import android.content.Context
import java.io.File import java.io.File

View File

@ -1,4 +1,4 @@
package me.rhunk.snapenhance.core.bridge.types package me.rhunk.snapenhance.common.bridge.types
enum class FileActionType { enum class FileActionType {
CREATE_AND_READ, READ, WRITE, DELETE, EXISTS CREATE_AND_READ, READ, WRITE, DELETE, EXISTS

View File

@ -0,0 +1,6 @@
package me.rhunk.snapenhance.common.bridge.types
data class LocalePair(
val locale: String,
val content: String
)

View File

@ -1,11 +1,10 @@
package me.rhunk.snapenhance.core.bridge.wrapper package me.rhunk.snapenhance.common.bridge.wrapper
import android.content.Context import android.content.Context
import com.google.gson.JsonObject import com.google.gson.JsonObject
import com.google.gson.JsonParser import com.google.gson.JsonParser
import me.rhunk.snapenhance.core.Logger import me.rhunk.snapenhance.common.bridge.types.LocalePair
import me.rhunk.snapenhance.core.bridge.BridgeClient import me.rhunk.snapenhance.common.logger.AbstractLogger
import me.rhunk.snapenhance.data.LocalePair
import java.util.Locale import java.util.Locale
@ -62,8 +61,8 @@ class LocaleWrapper {
scanObject(translations) scanObject(translations)
} }
fun loadFromBridge(bridgeClient: BridgeClient) { fun loadFromCallback(callback: (String) -> List<LocalePair>) {
bridgeClient.fetchLocales(userLocale).forEach { callback(userLocale).forEach {
load(it) load(it)
} }
} }
@ -80,7 +79,7 @@ class LocaleWrapper {
loadFromContext(context) loadFromContext(context)
} }
operator fun get(key: String) = translationMap[key] ?: key.also { Logger.directDebug("Missing translation for $key") } operator fun get(key: String) = translationMap[key] ?: key.also { AbstractLogger.directDebug("Missing translation for $key") }
fun format(key: String, vararg args: Pair<String, String>): String { fun format(key: String, vararg args: Pair<String, String>): String {
return args.fold(get(key)) { acc, pair -> return args.fold(get(key)) { acc, pair ->

View File

@ -1,13 +1,12 @@
package me.rhunk.snapenhance.core.bridge.wrapper package me.rhunk.snapenhance.common.bridge.wrapper
import android.content.Context import android.content.Context
import com.google.gson.GsonBuilder import com.google.gson.GsonBuilder
import com.google.gson.JsonElement import com.google.gson.JsonElement
import com.google.gson.JsonParser import com.google.gson.JsonParser
import me.rhunk.snapenhance.Constants import me.rhunk.snapenhance.common.Constants
import me.rhunk.snapenhance.core.Logger import me.rhunk.snapenhance.common.bridge.FileLoaderWrapper
import me.rhunk.snapenhance.core.bridge.FileLoaderWrapper import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
import me.rhunk.snapenhance.core.bridge.types.BridgeFileType
import me.rhunk.snapenhance.mapper.Mapper import me.rhunk.snapenhance.mapper.Mapper
import me.rhunk.snapenhance.mapper.impl.* import me.rhunk.snapenhance.mapper.impl.*
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
@ -107,8 +106,6 @@ class MappingsWrapper : FileLoaderWrapper(BridgeFileType.MAPPINGS, "{}".toByteAr
addProperty("snap_build_number", snapBuildNumber) addProperty("snap_build_number", snapBuildNumber)
} }
write(result.toString().toByteArray()) write(result.toString().toByteArray())
}.also {
Logger.directDebug("Generated mappings in $it ms")
} }
} }

View File

@ -1,9 +1,9 @@
package me.rhunk.snapenhance.core.bridge.wrapper package me.rhunk.snapenhance.common.bridge.wrapper
import android.content.ContentValues import android.content.ContentValues
import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase
import me.rhunk.snapenhance.bridge.MessageLoggerInterface import me.rhunk.snapenhance.bridge.MessageLoggerInterface
import me.rhunk.snapenhance.core.util.SQLiteDatabaseHelper import me.rhunk.snapenhance.common.util.SQLiteDatabaseHelper
import java.io.File import java.io.File
import java.util.UUID import java.util.UUID

View File

@ -1,4 +1,4 @@
package me.rhunk.snapenhance.core.config package me.rhunk.snapenhance.common.config
import com.google.gson.JsonObject import com.google.gson.JsonObject
import kotlin.reflect.KProperty import kotlin.reflect.KProperty

View File

@ -1,6 +1,6 @@
package me.rhunk.snapenhance.core.config package me.rhunk.snapenhance.common.config
import me.rhunk.snapenhance.core.bridge.wrapper.LocaleWrapper import me.rhunk.snapenhance.common.bridge.wrapper.LocaleWrapper
import kotlin.reflect.KProperty import kotlin.reflect.KProperty
data class PropertyPair<T>( data class PropertyPair<T>(

View File

@ -1,4 +1,4 @@
package me.rhunk.snapenhance.core.config package me.rhunk.snapenhance.common.config
import com.google.gson.JsonArray import com.google.gson.JsonArray
import com.google.gson.JsonElement import com.google.gson.JsonElement

View File

@ -1,16 +1,15 @@
package me.rhunk.snapenhance.core.config package me.rhunk.snapenhance.common.config
import android.content.Context import android.content.Context
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.GsonBuilder import com.google.gson.GsonBuilder
import com.google.gson.JsonObject import com.google.gson.JsonObject
import me.rhunk.snapenhance.bridge.ConfigStateListener import me.rhunk.snapenhance.bridge.ConfigStateListener
import me.rhunk.snapenhance.core.Logger import me.rhunk.snapenhance.common.bridge.FileLoaderWrapper
import me.rhunk.snapenhance.core.bridge.BridgeClient import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
import me.rhunk.snapenhance.core.bridge.FileLoaderWrapper import me.rhunk.snapenhance.common.bridge.wrapper.LocaleWrapper
import me.rhunk.snapenhance.core.bridge.types.BridgeFileType import me.rhunk.snapenhance.common.config.impl.RootConfig
import me.rhunk.snapenhance.core.bridge.wrapper.LocaleWrapper import me.rhunk.snapenhance.common.logger.AbstractLogger
import me.rhunk.snapenhance.core.config.impl.RootConfig
import kotlin.properties.Delegates import kotlin.properties.Delegates
class ModConfig { class ModConfig {
@ -106,7 +105,7 @@ class ModConfig {
else if (shouldRestart) it.onRestartRequired() else if (shouldRestart) it.onRestartRequired()
} }
}.onFailure { }.onFailure {
Logger.directError("Error while calling config state listener", it, "ConfigStateListener") AbstractLogger.directError("Error while calling config state listener", it, "ConfigStateListener")
} }
} }
@ -125,8 +124,8 @@ class ModConfig {
load() load()
} }
fun loadFromBridge(bridgeClient: BridgeClient) { fun loadFromCallback(callback: (FileLoaderWrapper) -> Unit) {
file.loadFromBridge(bridgeClient) callback(file)
load() load()
} }
} }

View File

@ -0,0 +1,22 @@
package me.rhunk.snapenhance.common.config.impl
import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.common.config.ConfigFlag
import me.rhunk.snapenhance.common.config.FeatureNotice
class Camera : ConfigContainer() {
companion object {
val resolutions = listOf("3264x2448", "3264x1840", "3264x1504", "2688x1512", "2560x1920", "2448x2448", "2340x1080", "2160x1080", "1920x1440", "1920x1080", "1600x1200", "1600x960", "1600x900", "1600x736", "1600x720", "1560x720", "1520x720", "1440x1080", "1440x720", "1280x720", "1080x1080", "1080x720", "960x720", "720x720", "720x480", "640x480", "352x288", "320x240", "176x144").toTypedArray()
}
val disable = boolean("disable_camera")
val immersiveCameraPreview = boolean("immersive_camera_preview") { addNotices(FeatureNotice.UNSTABLE) }
val overridePreviewResolution = unique("override_preview_resolution", *resolutions)
{ addFlags(ConfigFlag.NO_TRANSLATE) }
val overridePictureResolution = unique("override_picture_resolution", *resolutions)
{ addFlags(ConfigFlag.NO_TRANSLATE) }
val customFrameRate = unique("custom_frame_rate",
"5", "10", "20", "25", "30", "48", "60", "90", "120"
) { addNotices(FeatureNotice.UNSTABLE); addFlags(ConfigFlag.NO_TRANSLATE) }
val forceCameraSourceEncoding = boolean("force_camera_source_encoding")
}

View File

@ -1,8 +1,8 @@
package me.rhunk.snapenhance.core.config.impl package me.rhunk.snapenhance.common.config.impl
import me.rhunk.snapenhance.core.config.ConfigContainer import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.core.config.ConfigFlag import me.rhunk.snapenhance.common.config.ConfigFlag
import me.rhunk.snapenhance.core.config.FeatureNotice import me.rhunk.snapenhance.common.config.FeatureNotice
class DownloaderConfig : ConfigContainer() { class DownloaderConfig : ConfigContainer() {
inner class FFMpegOptions : ConfigContainer() { inner class FFMpegOptions : ConfigContainer() {

View File

@ -1,6 +1,6 @@
package me.rhunk.snapenhance.core.config.impl package me.rhunk.snapenhance.common.config.impl
import me.rhunk.snapenhance.core.config.ConfigContainer import me.rhunk.snapenhance.common.config.ConfigContainer
class E2EEConfig : ConfigContainer(hasGlobalState = true) { class E2EEConfig : ConfigContainer(hasGlobalState = true) {
val encryptedMessageIndicator = boolean("encrypted_message_indicator") val encryptedMessageIndicator = boolean("encrypted_message_indicator")

View File

@ -1,7 +1,7 @@
package me.rhunk.snapenhance.core.config.impl package me.rhunk.snapenhance.common.config.impl
import me.rhunk.snapenhance.core.config.ConfigContainer import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.core.config.FeatureNotice import me.rhunk.snapenhance.common.config.FeatureNotice
class Experimental : ConfigContainer() { class Experimental : ConfigContainer() {
val nativeHooks = container("native_hooks", NativeHooks()) { icon = "Memory"; requireRestart() } val nativeHooks = container("native_hooks", NativeHooks()) { icon = "Memory"; requireRestart() }

View File

@ -1,13 +1,14 @@
package me.rhunk.snapenhance.core.config.impl package me.rhunk.snapenhance.common.config.impl
import me.rhunk.snapenhance.core.config.ConfigContainer import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.core.config.FeatureNotice import me.rhunk.snapenhance.common.config.FeatureNotice
class Global : ConfigContainer() { class Global : ConfigContainer() {
val snapchatPlus = boolean("snapchat_plus") { addNotices(FeatureNotice.BAN_RISK); requireRestart() } val snapchatPlus = boolean("snapchat_plus") { addNotices(FeatureNotice.BAN_RISK); requireRestart() }
val disableMetrics = boolean("disable_metrics") val disableMetrics = boolean("disable_metrics")
val blockAds = boolean("block_ads") val blockAds = boolean("block_ads")
val bypassVideoLengthRestriction = unique("bypass_video_length_restriction", "split", "single") { addNotices(FeatureNotice.BAN_RISK); requireRestart() } val bypassVideoLengthRestriction = unique("bypass_video_length_restriction", "split", "single") { addNotices(
FeatureNotice.BAN_RISK); requireRestart() }
val disableGooglePlayDialogs = boolean("disable_google_play_dialogs") { requireRestart() } val disableGooglePlayDialogs = boolean("disable_google_play_dialogs") { requireRestart() }
val forceMediaSourceQuality = boolean("force_media_source_quality") val forceMediaSourceQuality = boolean("force_media_source_quality")
val disableSnapSplitting = boolean("disable_snap_splitting") { addNotices(FeatureNotice.INTERNAL_BEHAVIOR) } val disableSnapSplitting = boolean("disable_snap_splitting") { addNotices(FeatureNotice.INTERNAL_BEHAVIOR) }

View File

@ -1,8 +1,8 @@
package me.rhunk.snapenhance.core.config.impl package me.rhunk.snapenhance.common.config.impl
import me.rhunk.snapenhance.core.config.ConfigContainer import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.core.config.FeatureNotice import me.rhunk.snapenhance.common.config.FeatureNotice
import me.rhunk.snapenhance.data.NotificationType import me.rhunk.snapenhance.common.data.NotificationType
class MessagingTweaks : ConfigContainer() { class MessagingTweaks : ConfigContainer() {
val anonymousStoryViewing = boolean("anonymous_story_viewing") val anonymousStoryViewing = boolean("anonymous_story_viewing")

View File

@ -1,6 +1,6 @@
package me.rhunk.snapenhance.core.config.impl package me.rhunk.snapenhance.common.config.impl
import me.rhunk.snapenhance.core.config.ConfigContainer import me.rhunk.snapenhance.common.config.ConfigContainer
class NativeHooks: ConfigContainer(hasGlobalState = true) { class NativeHooks: ConfigContainer(hasGlobalState = true) {
val disableBitmoji = boolean("disable_bitmoji") val disableBitmoji = boolean("disable_bitmoji")

View File

@ -1,7 +1,7 @@
package me.rhunk.snapenhance.core.config.impl package me.rhunk.snapenhance.common.config.impl
import me.rhunk.snapenhance.core.config.ConfigContainer import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.core.config.FeatureNotice import me.rhunk.snapenhance.common.config.FeatureNotice
class RootConfig : ConfigContainer() { class RootConfig : ConfigContainer() {
val downloader = container("downloader", DownloaderConfig()) { icon = "Download"} val downloader = container("downloader", DownloaderConfig()) { icon = "Download"}

View File

@ -1,9 +1,9 @@
package me.rhunk.snapenhance.core.config.impl package me.rhunk.snapenhance.common.config.impl
import me.rhunk.snapenhance.core.config.ConfigContainer import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.core.config.PropertyValue import me.rhunk.snapenhance.common.config.PropertyValue
import me.rhunk.snapenhance.core.messaging.MessagingRuleType import me.rhunk.snapenhance.common.data.MessagingRuleType
import me.rhunk.snapenhance.core.messaging.RuleState import me.rhunk.snapenhance.common.data.RuleState
class Rules : ConfigContainer() { class Rules : ConfigContainer() {

View File

@ -1,7 +1,7 @@
package me.rhunk.snapenhance.core.config.impl package me.rhunk.snapenhance.common.config.impl
import me.rhunk.snapenhance.core.config.ConfigContainer import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.core.config.ConfigFlag import me.rhunk.snapenhance.common.config.ConfigFlag
class Scripting : ConfigContainer() { class Scripting : ConfigContainer() {
val developerMode = boolean("developer_mode", false) { requireRestart() } val developerMode = boolean("developer_mode", false) { requireRestart() }

View File

@ -1,7 +1,7 @@
package me.rhunk.snapenhance.core.config.impl package me.rhunk.snapenhance.common.config.impl
import me.rhunk.snapenhance.core.config.ConfigContainer import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.core.config.FeatureNotice import me.rhunk.snapenhance.common.config.FeatureNotice
class Spoof : ConfigContainer() { class Spoof : ConfigContainer() {
inner class Location : ConfigContainer(hasGlobalState = true) { inner class Location : ConfigContainer(hasGlobalState = true) {

View File

@ -1,6 +1,6 @@
package me.rhunk.snapenhance.core.config.impl package me.rhunk.snapenhance.common.config.impl
import me.rhunk.snapenhance.core.config.ConfigContainer import me.rhunk.snapenhance.common.config.ConfigContainer
class StreaksReminderConfig : ConfigContainer(hasGlobalState = true) { class StreaksReminderConfig : ConfigContainer(hasGlobalState = true) {
val interval = integer("interval", 2) val interval = integer("interval", 2)

View File

@ -1,14 +1,17 @@
package me.rhunk.snapenhance.core.config.impl package me.rhunk.snapenhance.common.config.impl
import me.rhunk.snapenhance.core.config.ConfigContainer import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.core.config.FeatureNotice import me.rhunk.snapenhance.common.config.FeatureNotice
import me.rhunk.snapenhance.core.messaging.MessagingRuleType import me.rhunk.snapenhance.common.data.MessagingRuleType
import me.rhunk.snapenhance.features.impl.ui.ClientBootstrapOverride
class UserInterfaceTweaks : ConfigContainer() { class UserInterfaceTweaks : ConfigContainer() {
inner class BootstrapOverride : ConfigContainer() { class BootstrapOverride : ConfigContainer() {
companion object {
val tabs = arrayOf("map", "chat", "camera", "discover", "spotlight")
}
val appAppearance = unique("app_appearance", "always_light", "always_dark") val appAppearance = unique("app_appearance", "always_light", "always_dark")
val homeTab = unique("home_tab", *ClientBootstrapOverride.tabs) { addNotices(FeatureNotice.UNSTABLE) } val homeTab = unique("home_tab", *tabs) { addNotices(FeatureNotice.UNSTABLE) }
} }
inner class FriendFeedMessagePreview : ConfigContainer(hasGlobalState = true) { inner class FriendFeedMessagePreview : ConfigContainer(hasGlobalState = true) {

View File

@ -1,6 +1,5 @@
package me.rhunk.snapenhance.data package me.rhunk.snapenhance.common.data
import me.rhunk.snapenhance.core.Logger
import java.io.File import java.io.File
import java.io.InputStream import java.io.InputStream
@ -61,9 +60,7 @@ enum class FileType(
val headerBytes = ByteArray(16) val headerBytes = ByteArray(16)
System.arraycopy(array, 0, headerBytes, 0, 16) System.arraycopy(array, 0, headerBytes, 0, 16)
val hex = bytesToHex(headerBytes) val hex = bytesToHex(headerBytes)
return fileSignatures.entries.firstOrNull { hex.startsWith(it.key) }?.value ?: UNKNOWN.also { return fileSignatures.entries.firstOrNull { hex.startsWith(it.key) }?.value ?: UNKNOWN
Logger.directDebug("unknown file type, header: $hex", "FileType")
}
} }
fun fromInputStream(inputStream: InputStream): FileType { fun fromInputStream(inputStream: InputStream): FileType {

View File

@ -1,6 +1,6 @@
package me.rhunk.snapenhance.core.messaging package me.rhunk.snapenhance.common.data
import me.rhunk.snapenhance.core.util.SerializableDataObject import me.rhunk.snapenhance.common.util.SerializableDataObject
enum class RuleState( enum class RuleState(

View File

@ -1,6 +1,6 @@
package me.rhunk.snapenhance.data package me.rhunk.snapenhance.common.data
import me.rhunk.snapenhance.core.util.protobuf.ProtoReader import me.rhunk.snapenhance.common.util.protobuf.ProtoReader
enum class MessageState { enum class MessageState {
PREPARING, SENDING, COMMITTED, FAILED, CANCELING PREPARING, SENDING, COMMITTED, FAILED, CANCELING

View File

@ -1,4 +1,4 @@
package me.rhunk.snapenhance.core.download.data package me.rhunk.snapenhance.common.data.download
import android.net.Uri import android.net.Uri

View File

@ -1,4 +1,4 @@
package me.rhunk.snapenhance.core.download.data package me.rhunk.snapenhance.common.data.download
data class DownloadMetadata( data class DownloadMetadata(
val mediaIdentifier: String?, val mediaIdentifier: String?,

View File

@ -1,4 +1,4 @@
package me.rhunk.snapenhance.core.download.data package me.rhunk.snapenhance.common.data.download
data class DashOptions(val offsetTime: Long, val duration: Long?) data class DashOptions(val offsetTime: Long, val duration: Long?)

View File

@ -1,4 +1,4 @@
package me.rhunk.snapenhance.core.download.data package me.rhunk.snapenhance.common.data.download
enum class DownloadStage( enum class DownloadStage(
val isFinalStage: Boolean = false, val isFinalStage: Boolean = false,

View File

@ -1,4 +1,4 @@
package me.rhunk.snapenhance.core.download.data package me.rhunk.snapenhance.common.data.download
enum class MediaDownloadSource( enum class MediaDownloadSource(
val key: String, val key: String,

View File

@ -1,8 +1,7 @@
@file:OptIn(ExperimentalEncodingApi::class) @file:OptIn(ExperimentalEncodingApi::class)
package me.rhunk.snapenhance.core.download.data package me.rhunk.snapenhance.common.data.download
import me.rhunk.snapenhance.data.wrapper.impl.media.EncryptionWrapper
import java.io.InputStream import java.io.InputStream
import javax.crypto.Cipher import javax.crypto.Cipher
import javax.crypto.CipherInputStream import javax.crypto.CipherInputStream
@ -25,6 +24,3 @@ data class MediaEncryptionKeyPair(
fun Pair<ByteArray, ByteArray>.toKeyPair() fun Pair<ByteArray, ByteArray>.toKeyPair()
= MediaEncryptionKeyPair(Base64.UrlSafe.encode(this.first), Base64.UrlSafe.encode(this.second)) = MediaEncryptionKeyPair(Base64.UrlSafe.encode(this.first), Base64.UrlSafe.encode(this.second))
fun EncryptionWrapper.toKeyPair()
= MediaEncryptionKeyPair(Base64.UrlSafe.encode(this.keySpec), Base64.UrlSafe.encode(this.ivKeyParameterSpec))

View File

@ -1,4 +1,4 @@
package me.rhunk.snapenhance.core.download.data package me.rhunk.snapenhance.common.data.download
enum class SplitMediaAssetType { enum class SplitMediaAssetType {
ORIGINAL, OVERLAY ORIGINAL, OVERLAY

View File

@ -1,4 +1,4 @@
package me.rhunk.snapenhance.core.database package me.rhunk.snapenhance.common.database
import android.database.Cursor import android.database.Cursor

View File

@ -1,15 +1,12 @@
package me.rhunk.snapenhance.core.database.objects package me.rhunk.snapenhance.common.database.impl
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.database.Cursor import android.database.Cursor
import me.rhunk.snapenhance.Constants import me.rhunk.snapenhance.common.database.DatabaseObject
import me.rhunk.snapenhance.core.database.DatabaseObject import me.rhunk.snapenhance.common.util.ktx.getBlobOrNull
import me.rhunk.snapenhance.core.util.ktx.getBlobOrNull import me.rhunk.snapenhance.common.util.ktx.getInteger
import me.rhunk.snapenhance.core.util.ktx.getInteger import me.rhunk.snapenhance.common.util.ktx.getLong
import me.rhunk.snapenhance.core.util.ktx.getLong import me.rhunk.snapenhance.common.util.ktx.getStringOrNull
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull
import me.rhunk.snapenhance.core.util.protobuf.ProtoReader
import me.rhunk.snapenhance.data.ContentType
@Suppress("ArrayInDataClass") @Suppress("ArrayInDataClass")
data class ConversationMessage( data class ConversationMessage(

View File

@ -1,12 +1,12 @@
package me.rhunk.snapenhance.core.database.objects package me.rhunk.snapenhance.common.database.impl
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.database.Cursor import android.database.Cursor
import me.rhunk.snapenhance.core.database.DatabaseObject import me.rhunk.snapenhance.common.database.DatabaseObject
import me.rhunk.snapenhance.core.util.ktx.getIntOrNull import me.rhunk.snapenhance.common.util.ktx.getIntOrNull
import me.rhunk.snapenhance.core.util.ktx.getInteger import me.rhunk.snapenhance.common.util.ktx.getInteger
import me.rhunk.snapenhance.core.util.ktx.getLong import me.rhunk.snapenhance.common.util.ktx.getLong
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull import me.rhunk.snapenhance.common.util.ktx.getStringOrNull
data class FriendFeedEntry( data class FriendFeedEntry(
var id: Int = 0, var id: Int = 0,

View File

@ -1,12 +1,12 @@
package me.rhunk.snapenhance.core.database.objects package me.rhunk.snapenhance.common.database.impl
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.database.Cursor import android.database.Cursor
import me.rhunk.snapenhance.core.database.DatabaseObject import me.rhunk.snapenhance.common.database.DatabaseObject
import me.rhunk.snapenhance.core.util.SerializableDataObject import me.rhunk.snapenhance.common.util.SerializableDataObject
import me.rhunk.snapenhance.core.util.ktx.getInteger import me.rhunk.snapenhance.common.util.ktx.getInteger
import me.rhunk.snapenhance.core.util.ktx.getLong import me.rhunk.snapenhance.common.util.ktx.getLong
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull import me.rhunk.snapenhance.common.util.ktx.getStringOrNull
data class FriendInfo( data class FriendInfo(
var id: Int = 0, var id: Int = 0,

View File

@ -1,10 +1,10 @@
package me.rhunk.snapenhance.core.database.objects package me.rhunk.snapenhance.common.database.impl
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.database.Cursor import android.database.Cursor
import me.rhunk.snapenhance.core.database.DatabaseObject import me.rhunk.snapenhance.common.database.DatabaseObject
import me.rhunk.snapenhance.core.util.ktx.getInteger import me.rhunk.snapenhance.common.util.ktx.getInteger
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull import me.rhunk.snapenhance.common.util.ktx.getStringOrNull
data class StoryEntry( data class StoryEntry(
var id: Int = 0, var id: Int = 0,

View File

@ -1,10 +1,10 @@
package me.rhunk.snapenhance.core.database.objects package me.rhunk.snapenhance.common.database.impl
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.database.Cursor import android.database.Cursor
import me.rhunk.snapenhance.core.database.DatabaseObject import me.rhunk.snapenhance.common.database.DatabaseObject
import me.rhunk.snapenhance.core.util.ktx.getInteger import me.rhunk.snapenhance.common.util.ktx.getInteger
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull import me.rhunk.snapenhance.common.util.ktx.getStringOrNull
class UserConversationLink( class UserConversationLink(
var userId: String? = null, var userId: String? = null,

View File

@ -1,10 +1,26 @@
package me.rhunk.snapenhance.core.logger package me.rhunk.snapenhance.common.logger
import android.util.Log
abstract class AbstractLogger( abstract class AbstractLogger(
logChannel: LogChannel, logChannel: LogChannel,
) { ) {
private val TAG = logChannel.shortName private val TAG = logChannel.shortName
companion object {
private const val TAG = "SnapEnhanceCommon"
fun directDebug(message: Any?, tag: String = TAG) {
Log.println(Log.DEBUG, tag, message.toString())
}
fun directError(message: Any?, throwable: Throwable, tag: String = TAG) {
Log.println(Log.ERROR, tag, message.toString())
Log.println(Log.ERROR, tag, throwable.toString())
}
}
open fun debug(message: Any?, tag: String = TAG) {} open fun debug(message: Any?, tag: String = TAG) {}

Some files were not shown because too many files have changed in this diff Show More