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(":common"))
implementation(libs.androidx.documentfile)
implementation(libs.gson)
implementation(libs.ffmpeg.kit)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -5,9 +5,8 @@ import com.arthenica.ffmpegkit.FFmpegSession
import com.arthenica.ffmpegkit.Level
import kotlinx.coroutines.suspendCancellableCoroutine
import me.rhunk.snapenhance.LogManager
import me.rhunk.snapenhance.core.Logger
import me.rhunk.snapenhance.core.config.impl.DownloaderConfig
import me.rhunk.snapenhance.core.logger.LogLevel
import me.rhunk.snapenhance.common.config.impl.DownloaderConfig
import me.rhunk.snapenhance.common.logger.LogLevel
import java.io.File
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(),
{ session ->

View File

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

View File

@ -5,11 +5,12 @@ import androidx.documentfile.provider.DocumentFile
import me.rhunk.snapenhance.RemoteSideContext
import me.rhunk.snapenhance.bridge.scripting.IPCListener
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.RemoteManagerIPC
import me.rhunk.snapenhance.scripting.impl.ui.InterfaceBuilder
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
class RemoteScriptManager(

View File

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

View File

@ -1,10 +1,10 @@
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.NodeType
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.Function
import org.mozilla.javascript.annotations.JSFunction

View File

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

View File

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

View File

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

View File

@ -37,7 +37,7 @@ import androidx.navigation.navigation
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
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.Section
import me.rhunk.snapenhance.ui.util.*

View File

@ -33,8 +33,8 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import me.rhunk.snapenhance.LogReader
import me.rhunk.snapenhance.RemoteSideContext
import me.rhunk.snapenhance.core.logger.LogChannel
import me.rhunk.snapenhance.core.logger.LogLevel
import me.rhunk.snapenhance.common.logger.LogChannel
import me.rhunk.snapenhance.common.logger.LogLevel
class HomeSubSection(
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.sp
import androidx.compose.ui.window.Dialog
import me.rhunk.snapenhance.Constants
import me.rhunk.snapenhance.action.EnumAction
import me.rhunk.snapenhance.core.bridge.types.BridgeFileType
import me.rhunk.snapenhance.manager.impl.ActionManager
import me.rhunk.snapenhance.common.Constants
import me.rhunk.snapenhance.common.action.EnumAction
import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
import me.rhunk.snapenhance.ui.manager.Section
import me.rhunk.snapenhance.ui.util.AlertDialogs
@ -83,7 +82,7 @@ class SettingsSection : Section() {
private fun launchActionIntent(action: EnumAction) {
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)
}

View File

@ -12,7 +12,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
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.components.Node
import me.rhunk.snapenhance.scripting.impl.ui.components.NodeType
@ -54,7 +54,7 @@ private fun DrawNode(node: Node) {
runCatching {
callback()
}.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 kotlinx.coroutines.delay
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.util.pullrefresh.PullRefreshIndicator
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.withContext
import me.rhunk.snapenhance.RemoteSideContext
import me.rhunk.snapenhance.core.bridge.BridgeClient
import me.rhunk.snapenhance.core.messaging.MessagingFriendInfo
import me.rhunk.snapenhance.core.messaging.MessagingGroupInfo
import me.rhunk.snapenhance.core.messaging.SocialScope
import me.rhunk.snapenhance.core.util.snap.SnapWidgetBroadcastReceiverHelper
import me.rhunk.snapenhance.common.ReceiversConfig
import me.rhunk.snapenhance.common.data.MessagingFriendInfo
import me.rhunk.snapenhance.common.data.MessagingGroupInfo
import me.rhunk.snapenhance.common.data.SocialScope
import me.rhunk.snapenhance.common.util.snap.SnapWidgetBroadcastReceiverHelper
class AddFriendDialog(
private val context: RemoteSideContext,
@ -128,7 +128,7 @@ class AddFriendDialog(
timeoutJob?.cancel()
hasFetchError = false
}
SnapWidgetBroadcastReceiverHelper.create(BridgeClient.BRIDGE_SYNC_ACTION) {}.also {
SnapWidgetBroadcastReceiverHelper.create(ReceiversConfig.BRIDGE_SYNC_ACTION) {}.also {
runCatching {
context.androidContext.sendBroadcast(it)
}.onFailure {

View File

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

View File

@ -27,10 +27,10 @@ import androidx.navigation.compose.composable
import androidx.navigation.navigation
import kotlinx.coroutines.launch
import me.rhunk.snapenhance.R
import me.rhunk.snapenhance.core.messaging.MessagingFriendInfo
import me.rhunk.snapenhance.core.messaging.MessagingGroupInfo
import me.rhunk.snapenhance.core.messaging.SocialScope
import me.rhunk.snapenhance.core.util.snap.BitmojiSelfie
import me.rhunk.snapenhance.common.data.MessagingFriendInfo
import me.rhunk.snapenhance.common.data.MessagingGroupInfo
import me.rhunk.snapenhance.common.data.SocialScope
import me.rhunk.snapenhance.common.util.snap.BitmojiSelfie
import me.rhunk.snapenhance.ui.manager.Section
import me.rhunk.snapenhance.ui.util.AlertDialogs
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.Surface
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.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
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.util.ObservableMutableState
import java.util.Locale

View File

@ -4,7 +4,7 @@ import android.content.Intent
import androidx.activity.ComponentActivity
import androidx.activity.result.ActivityResultLauncher
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
@ -17,7 +17,7 @@ class ActivityLauncherHelper(
runCatching {
callback?.let { it(if (result) ComponentActivity.RESULT_OK else ComponentActivity.RESULT_CANCELED, null) }
}.onFailure {
Logger.directError("Failed to process activity result", it)
AbstractLogger.directError("Failed to process activity result", it)
}
callback = null
}
@ -27,7 +27,7 @@ class ActivityLauncherHelper(
runCatching {
callback?.let { it(result.resultCode, result.data) }
}.onFailure {
Logger.directError("Failed to process activity result", it)
AbstractLogger.directError("Failed to process activity result", it)
}
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.unit.dp
import androidx.compose.ui.unit.sp
import me.rhunk.snapenhance.core.bridge.wrapper.LocaleWrapper
import me.rhunk.snapenhance.core.config.DataProcessors
import me.rhunk.snapenhance.core.config.PropertyPair
import me.rhunk.snapenhance.common.bridge.wrapper.LocaleWrapper
import me.rhunk.snapenhance.common.config.DataProcessors
import me.rhunk.snapenhance.common.config.PropertyPair
class AlertDialogs(

View File

@ -12,3 +12,10 @@ rootProject.ext.set("appVersionName", versionName)
rootProject.ext.set("appVersionCode", versionCode)
rootProject.ext.set("applicationId", "me.rhunk.snapenhance")
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 {
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 me.rhunk.snapenhance.core.bridge.types.BridgeFileType
import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
open class FileLoaderWrapper(
private val fileType: BridgeFileType,
private val defaultContent: ByteArray
val fileType: BridgeFileType,
val defaultContent: ByteArray
) {
lateinit var isFileExists: () -> Boolean
lateinit var write: (ByteArray) -> Unit
@ -26,10 +26,4 @@ open class FileLoaderWrapper(
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 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 {
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 com.google.gson.JsonObject
import com.google.gson.JsonParser
import me.rhunk.snapenhance.core.Logger
import me.rhunk.snapenhance.core.bridge.BridgeClient
import me.rhunk.snapenhance.data.LocalePair
import me.rhunk.snapenhance.common.bridge.types.LocalePair
import me.rhunk.snapenhance.common.logger.AbstractLogger
import java.util.Locale
@ -62,8 +61,8 @@ class LocaleWrapper {
scanObject(translations)
}
fun loadFromBridge(bridgeClient: BridgeClient) {
bridgeClient.fetchLocales(userLocale).forEach {
fun loadFromCallback(callback: (String) -> List<LocalePair>) {
callback(userLocale).forEach {
load(it)
}
}
@ -80,7 +79,7 @@ class LocaleWrapper {
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 {
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 com.google.gson.GsonBuilder
import com.google.gson.JsonElement
import com.google.gson.JsonParser
import me.rhunk.snapenhance.Constants
import me.rhunk.snapenhance.core.Logger
import me.rhunk.snapenhance.core.bridge.FileLoaderWrapper
import me.rhunk.snapenhance.core.bridge.types.BridgeFileType
import me.rhunk.snapenhance.common.Constants
import me.rhunk.snapenhance.common.bridge.FileLoaderWrapper
import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
import me.rhunk.snapenhance.mapper.Mapper
import me.rhunk.snapenhance.mapper.impl.*
import java.util.concurrent.ConcurrentHashMap
@ -107,8 +106,6 @@ class MappingsWrapper : FileLoaderWrapper(BridgeFileType.MAPPINGS, "{}".toByteAr
addProperty("snap_build_number", snapBuildNumber)
}
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.database.sqlite.SQLiteDatabase
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.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 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
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.JsonElement

View File

@ -1,16 +1,15 @@
package me.rhunk.snapenhance.core.config
package me.rhunk.snapenhance.common.config
import android.content.Context
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.JsonObject
import me.rhunk.snapenhance.bridge.ConfigStateListener
import me.rhunk.snapenhance.core.Logger
import me.rhunk.snapenhance.core.bridge.BridgeClient
import me.rhunk.snapenhance.core.bridge.FileLoaderWrapper
import me.rhunk.snapenhance.core.bridge.types.BridgeFileType
import me.rhunk.snapenhance.core.bridge.wrapper.LocaleWrapper
import me.rhunk.snapenhance.core.config.impl.RootConfig
import me.rhunk.snapenhance.common.bridge.FileLoaderWrapper
import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
import me.rhunk.snapenhance.common.bridge.wrapper.LocaleWrapper
import me.rhunk.snapenhance.common.config.impl.RootConfig
import me.rhunk.snapenhance.common.logger.AbstractLogger
import kotlin.properties.Delegates
class ModConfig {
@ -106,7 +105,7 @@ class ModConfig {
else if (shouldRestart) it.onRestartRequired()
}
}.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()
}
fun loadFromBridge(bridgeClient: BridgeClient) {
file.loadFromBridge(bridgeClient)
fun loadFromCallback(callback: (FileLoaderWrapper) -> Unit) {
callback(file)
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.core.config.ConfigFlag
import me.rhunk.snapenhance.core.config.FeatureNotice
import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.common.config.ConfigFlag
import me.rhunk.snapenhance.common.config.FeatureNotice
class DownloaderConfig : 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) {
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.core.config.FeatureNotice
import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.common.config.FeatureNotice
class Experimental : ConfigContainer() {
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.core.config.FeatureNotice
import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.common.config.FeatureNotice
class Global : ConfigContainer() {
val snapchatPlus = boolean("snapchat_plus") { addNotices(FeatureNotice.BAN_RISK); requireRestart() }
val disableMetrics = boolean("disable_metrics")
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 forceMediaSourceQuality = boolean("force_media_source_quality")
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.core.config.FeatureNotice
import me.rhunk.snapenhance.data.NotificationType
import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.common.config.FeatureNotice
import me.rhunk.snapenhance.common.data.NotificationType
class MessagingTweaks : ConfigContainer() {
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) {
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.core.config.FeatureNotice
import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.common.config.FeatureNotice
class RootConfig : ConfigContainer() {
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.core.config.PropertyValue
import me.rhunk.snapenhance.core.messaging.MessagingRuleType
import me.rhunk.snapenhance.core.messaging.RuleState
import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.common.config.PropertyValue
import me.rhunk.snapenhance.common.data.MessagingRuleType
import me.rhunk.snapenhance.common.data.RuleState
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.core.config.ConfigFlag
import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.common.config.ConfigFlag
class Scripting : ConfigContainer() {
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.core.config.FeatureNotice
import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.common.config.FeatureNotice
class Spoof : ConfigContainer() {
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) {
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.core.config.FeatureNotice
import me.rhunk.snapenhance.core.messaging.MessagingRuleType
import me.rhunk.snapenhance.features.impl.ui.ClientBootstrapOverride
import me.rhunk.snapenhance.common.config.ConfigContainer
import me.rhunk.snapenhance.common.config.FeatureNotice
import me.rhunk.snapenhance.common.data.MessagingRuleType
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 homeTab = unique("home_tab", *ClientBootstrapOverride.tabs) { addNotices(FeatureNotice.UNSTABLE) }
val homeTab = unique("home_tab", *tabs) { addNotices(FeatureNotice.UNSTABLE) }
}
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.InputStream
@ -61,9 +60,7 @@ enum class FileType(
val headerBytes = ByteArray(16)
System.arraycopy(array, 0, headerBytes, 0, 16)
val hex = bytesToHex(headerBytes)
return fileSignatures.entries.firstOrNull { hex.startsWith(it.key) }?.value ?: UNKNOWN.also {
Logger.directDebug("unknown file type, header: $hex", "FileType")
}
return fileSignatures.entries.firstOrNull { hex.startsWith(it.key) }?.value ?: UNKNOWN
}
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(

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 {
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

View File

@ -1,4 +1,4 @@
package me.rhunk.snapenhance.core.download.data
package me.rhunk.snapenhance.common.data.download
data class DownloadMetadata(
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?)

View File

@ -1,4 +1,4 @@
package me.rhunk.snapenhance.core.download.data
package me.rhunk.snapenhance.common.data.download
enum class DownloadStage(
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(
val key: String,

View File

@ -1,8 +1,7 @@
@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 javax.crypto.Cipher
import javax.crypto.CipherInputStream
@ -25,6 +24,3 @@ data class MediaEncryptionKeyPair(
fun Pair<ByteArray, ByteArray>.toKeyPair()
= 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 {
ORIGINAL, OVERLAY

View File

@ -1,4 +1,4 @@
package me.rhunk.snapenhance.core.database
package me.rhunk.snapenhance.common.database
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.database.Cursor
import me.rhunk.snapenhance.Constants
import me.rhunk.snapenhance.core.database.DatabaseObject
import me.rhunk.snapenhance.core.util.ktx.getBlobOrNull
import me.rhunk.snapenhance.core.util.ktx.getInteger
import me.rhunk.snapenhance.core.util.ktx.getLong
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull
import me.rhunk.snapenhance.core.util.protobuf.ProtoReader
import me.rhunk.snapenhance.data.ContentType
import me.rhunk.snapenhance.common.database.DatabaseObject
import me.rhunk.snapenhance.common.util.ktx.getBlobOrNull
import me.rhunk.snapenhance.common.util.ktx.getInteger
import me.rhunk.snapenhance.common.util.ktx.getLong
import me.rhunk.snapenhance.common.util.ktx.getStringOrNull
@Suppress("ArrayInDataClass")
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.database.Cursor
import me.rhunk.snapenhance.core.database.DatabaseObject
import me.rhunk.snapenhance.core.util.ktx.getIntOrNull
import me.rhunk.snapenhance.core.util.ktx.getInteger
import me.rhunk.snapenhance.core.util.ktx.getLong
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull
import me.rhunk.snapenhance.common.database.DatabaseObject
import me.rhunk.snapenhance.common.util.ktx.getIntOrNull
import me.rhunk.snapenhance.common.util.ktx.getInteger
import me.rhunk.snapenhance.common.util.ktx.getLong
import me.rhunk.snapenhance.common.util.ktx.getStringOrNull
data class FriendFeedEntry(
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.database.Cursor
import me.rhunk.snapenhance.core.database.DatabaseObject
import me.rhunk.snapenhance.core.util.SerializableDataObject
import me.rhunk.snapenhance.core.util.ktx.getInteger
import me.rhunk.snapenhance.core.util.ktx.getLong
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull
import me.rhunk.snapenhance.common.database.DatabaseObject
import me.rhunk.snapenhance.common.util.SerializableDataObject
import me.rhunk.snapenhance.common.util.ktx.getInteger
import me.rhunk.snapenhance.common.util.ktx.getLong
import me.rhunk.snapenhance.common.util.ktx.getStringOrNull
data class FriendInfo(
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.database.Cursor
import me.rhunk.snapenhance.core.database.DatabaseObject
import me.rhunk.snapenhance.core.util.ktx.getInteger
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull
import me.rhunk.snapenhance.common.database.DatabaseObject
import me.rhunk.snapenhance.common.util.ktx.getInteger
import me.rhunk.snapenhance.common.util.ktx.getStringOrNull
data class StoryEntry(
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.database.Cursor
import me.rhunk.snapenhance.core.database.DatabaseObject
import me.rhunk.snapenhance.core.util.ktx.getInteger
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull
import me.rhunk.snapenhance.common.database.DatabaseObject
import me.rhunk.snapenhance.common.util.ktx.getInteger
import me.rhunk.snapenhance.common.util.ktx.getStringOrNull
class UserConversationLink(
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(
logChannel: LogChannel,
) {
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) {}

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