feat: opera media debug info

This commit is contained in:
rhunk
2023-09-30 17:19:51 +02:00
parent 1e2c71403e
commit 5e63f8fae7
4 changed files with 65 additions and 15 deletions

View File

@ -1,6 +1,7 @@
package me.rhunk.snapenhance package me.rhunk.snapenhance
import android.app.Activity import android.app.Activity
import android.content.ClipData
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.res.Resources import android.content.res.Resources
@ -138,4 +139,8 @@ class ModContext {
fun getConfigLocale(): String { fun getConfigLocale(): String {
return _config.locale return _config.locale
} }
fun copyToClipboard(data: String, label: String = "Copied Text") {
androidContext.getSystemService(android.content.ClipboardManager::class.java).setPrimaryClip(ClipData.newPlainText(label, data))
}
} }

View File

@ -4,8 +4,10 @@ import android.annotation.SuppressLint
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.net.Uri import android.net.Uri
import android.text.InputType
import android.view.Gravity import android.view.Gravity
import android.view.ViewGroup.MarginLayoutParams import android.view.ViewGroup.MarginLayoutParams
import android.widget.EditText
import android.widget.ImageView import android.widget.ImageView
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.ProgressBar import android.widget.ProgressBar
@ -13,16 +15,12 @@ import android.widget.TextView
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.async import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import me.rhunk.snapenhance.SnapEnhance
import me.rhunk.snapenhance.bridge.DownloadCallback import me.rhunk.snapenhance.bridge.DownloadCallback
import me.rhunk.snapenhance.core.database.objects.ConversationMessage import me.rhunk.snapenhance.core.database.objects.ConversationMessage
import me.rhunk.snapenhance.core.database.objects.FriendInfo import me.rhunk.snapenhance.core.database.objects.FriendInfo
import me.rhunk.snapenhance.core.download.DownloadManagerClient import me.rhunk.snapenhance.core.download.DownloadManagerClient
import me.rhunk.snapenhance.core.download.data.DownloadMediaType import me.rhunk.snapenhance.core.download.data.*
import me.rhunk.snapenhance.core.download.data.DownloadMetadata
import me.rhunk.snapenhance.core.download.data.InputMedia
import me.rhunk.snapenhance.core.download.data.MediaDownloadSource
import me.rhunk.snapenhance.core.download.data.SplitMediaAssetType
import me.rhunk.snapenhance.core.download.data.toKeyPair
import me.rhunk.snapenhance.core.messaging.MessagingRuleType import me.rhunk.snapenhance.core.messaging.MessagingRuleType
import me.rhunk.snapenhance.core.util.download.RemoteMediaResolver import me.rhunk.snapenhance.core.util.download.RemoteMediaResolver
import me.rhunk.snapenhance.core.util.ktx.getObjectField import me.rhunk.snapenhance.core.util.ktx.getObjectField
@ -31,6 +29,7 @@ import me.rhunk.snapenhance.core.util.snap.BitmojiSelfie
import me.rhunk.snapenhance.core.util.snap.MediaDownloaderHelper import me.rhunk.snapenhance.core.util.snap.MediaDownloaderHelper
import me.rhunk.snapenhance.core.util.snap.PreviewUtils import me.rhunk.snapenhance.core.util.snap.PreviewUtils
import me.rhunk.snapenhance.data.FileType import me.rhunk.snapenhance.data.FileType
import me.rhunk.snapenhance.data.wrapper.impl.SnapUUID
import me.rhunk.snapenhance.data.wrapper.impl.media.MediaInfo import me.rhunk.snapenhance.data.wrapper.impl.media.MediaInfo
import me.rhunk.snapenhance.data.wrapper.impl.media.dash.LongformVideoPlaylistItem import me.rhunk.snapenhance.data.wrapper.impl.media.dash.LongformVideoPlaylistItem
import me.rhunk.snapenhance.data.wrapper.impl.media.dash.SnapPlaylistItem import me.rhunk.snapenhance.data.wrapper.impl.media.dash.SnapPlaylistItem
@ -179,6 +178,42 @@ class MediaDownloader : MessagingRuleFeature("MediaDownloader", MessagingRuleTyp
} }
} }
fun showLastOperaDebugMediaInfo() {
if (lastSeenMapParams == null || lastSeenMediaInfoMap == null) return
context.runOnUiThread {
val mediaInfoText = lastSeenMapParams?.concurrentHashMap?.map { (key, value) ->
val transformedValue = value.let {
if (it::class.java == SnapEnhance.classCache.snapUUID) {
SnapUUID(it).toString()
}
it
}
"- $key: $transformedValue"
}?.joinToString("\n") ?: "No media info found"
ViewAppearanceHelper.newAlertDialogBuilder(context.mainActivity!!).apply {
setTitle("Debug Media Info")
setView(EditText(context).apply {
inputType = InputType.TYPE_NULL
setTextIsSelectable(true)
isSingleLine = false
textSize = 12f
setPadding(20, 20, 20, 20)
setText(mediaInfoText)
setTextColor(context.resources.getColor(android.R.color.white, context.theme))
})
setNeutralButton("Copy") { _, _ ->
this@MediaDownloader.context.copyToClipboard(mediaInfoText)
}
setPositiveButton("Download") { _, _ ->
downloadLastOperaMediaAsync()
}
setNegativeButton("Cancel") { dialog, _ -> dialog.dismiss() }
}.show()
}
}
private fun handleLocalReferences(path: String) = runBlocking { private fun handleLocalReferences(path: String) = runBlocking {
Uri.parse(path).let { uri -> Uri.parse(path).let { uri ->
if (uri.scheme == "file") { if (uri.scheme == "file") {

View File

@ -78,8 +78,7 @@ class ChatActionMenu : AbstractMenu() {
setMessage(text) setMessage(text)
setPositiveButton("OK") { dialog, _ -> dialog.dismiss() } setPositiveButton("OK") { dialog, _ -> dialog.dismiss() }
setNegativeButton("Copy") { _, _ -> setNegativeButton("Copy") { _, _ ->
val clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as android.content.ClipboardManager this@ChatActionMenu.context.copyToClipboard(text, title)
clipboardManager.setPrimaryClip(android.content.ClipData.newPlainText("debug", text))
} }
}.show() }.show()
} }
@ -173,8 +172,7 @@ class ChatActionMenu : AbstractMenu() {
val debugText = StringBuilder() val debugText = StringBuilder()
setOnClickListener { setOnClickListener {
val clipboardManager = context.getSystemService(android.content.Context.CLIPBOARD_SERVICE) as android.content.ClipboardManager this@ChatActionMenu.context.copyToClipboard(debugText.toString(), "debug")
clipboardManager.setPrimaryClip(android.content.ClipData.newPlainText("debug", debugText.toString()))
} }
addView(TextView(viewGroup.context).apply { addView(TextView(viewGroup.context).apply {

View File

@ -68,11 +68,23 @@ class OperaContextActionMenu : AbstractMenu() {
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT ViewGroup.LayoutParams.MATCH_PARENT
) )
val button = Button(childView.getContext()) val translation = context.translation
button.text = context.translation["opera_context_menu.download"] val mediaDownloader = context.feature(MediaDownloader::class)
button.setOnClickListener { context.feature(MediaDownloader::class).downloadLastOperaMediaAsync() }
button.applyTheme(isAmoled = false) linearLayout.addView(Button(childView.getContext()).apply {
linearLayout.addView(button) text = translation["opera_context_menu.download"]
setOnClickListener { mediaDownloader.downloadLastOperaMediaAsync() }
applyTheme(isAmoled = false)
})
if (context.isDeveloper) {
linearLayout.addView(Button(childView.getContext()).apply {
text = "Show debug info"
setOnClickListener { mediaDownloader.showLastOperaDebugMediaInfo() }
applyTheme(isAmoled = false)
})
}
(childView as ViewGroup).addView(linearLayout, 0) (childView as ViewGroup).addView(linearLayout, 0)
} catch (e: Throwable) { } catch (e: Throwable) {
context.log.error("Error while injecting OperaContextActionMenu", e) context.log.error("Error while injecting OperaContextActionMenu", e)