commit 5e63f8fae7e44c4fd17856d33893ee3b80589938
parent 1e2c71403e2535db4293a9cb4686fc4bf63de09f
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Sat, 30 Sep 2023 17:19:51 +0200

feat: opera media debug info

Diffstat:
Mcore/src/main/kotlin/me/rhunk/snapenhance/ModContext.kt | 5+++++
Mcore/src/main/kotlin/me/rhunk/snapenhance/features/impl/downloader/MediaDownloader.kt | 47+++++++++++++++++++++++++++++++++++++++++------
Mcore/src/main/kotlin/me/rhunk/snapenhance/ui/menu/impl/ChatActionMenu.kt | 6++----
Mcore/src/main/kotlin/me/rhunk/snapenhance/ui/menu/impl/OperaContextActionMenu.kt | 22+++++++++++++++++-----
4 files changed, 65 insertions(+), 15 deletions(-)

diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/ModContext.kt b/core/src/main/kotlin/me/rhunk/snapenhance/ModContext.kt @@ -1,6 +1,7 @@ package me.rhunk.snapenhance import android.app.Activity +import android.content.ClipData import android.content.Context import android.content.Intent import android.content.res.Resources @@ -138,4 +139,8 @@ class ModContext { fun getConfigLocale(): String { return _config.locale } + + fun copyToClipboard(data: String, label: String = "Copied Text") { + androidContext.getSystemService(android.content.ClipboardManager::class.java).setPrimaryClip(ClipData.newPlainText(label, data)) + } } \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/downloader/MediaDownloader.kt b/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/downloader/MediaDownloader.kt @@ -4,8 +4,10 @@ import android.annotation.SuppressLint import android.graphics.Bitmap import android.graphics.BitmapFactory import android.net.Uri +import android.text.InputType import android.view.Gravity import android.view.ViewGroup.MarginLayoutParams +import android.widget.EditText import android.widget.ImageView import android.widget.LinearLayout import android.widget.ProgressBar @@ -13,16 +15,12 @@ import android.widget.TextView import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.async import kotlinx.coroutines.runBlocking +import me.rhunk.snapenhance.SnapEnhance import me.rhunk.snapenhance.bridge.DownloadCallback import me.rhunk.snapenhance.core.database.objects.ConversationMessage import me.rhunk.snapenhance.core.database.objects.FriendInfo import me.rhunk.snapenhance.core.download.DownloadManagerClient -import me.rhunk.snapenhance.core.download.data.DownloadMediaType -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.download.data.* import me.rhunk.snapenhance.core.messaging.MessagingRuleType import me.rhunk.snapenhance.core.util.download.RemoteMediaResolver 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.PreviewUtils 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.dash.LongformVideoPlaylistItem 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 { Uri.parse(path).let { uri -> if (uri.scheme == "file") { diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/ui/menu/impl/ChatActionMenu.kt b/core/src/main/kotlin/me/rhunk/snapenhance/ui/menu/impl/ChatActionMenu.kt @@ -78,8 +78,7 @@ class ChatActionMenu : AbstractMenu() { setMessage(text) setPositiveButton("OK") { dialog, _ -> dialog.dismiss() } setNegativeButton("Copy") { _, _ -> - val clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as android.content.ClipboardManager - clipboardManager.setPrimaryClip(android.content.ClipData.newPlainText("debug", text)) + this@ChatActionMenu.context.copyToClipboard(text, title) } }.show() } @@ -173,8 +172,7 @@ class ChatActionMenu : AbstractMenu() { val debugText = StringBuilder() setOnClickListener { - val clipboardManager = context.getSystemService(android.content.Context.CLIPBOARD_SERVICE) as android.content.ClipboardManager - clipboardManager.setPrimaryClip(android.content.ClipData.newPlainText("debug", debugText.toString())) + this@ChatActionMenu.context.copyToClipboard(debugText.toString(), "debug") } addView(TextView(viewGroup.context).apply { diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/ui/menu/impl/OperaContextActionMenu.kt b/core/src/main/kotlin/me/rhunk/snapenhance/ui/menu/impl/OperaContextActionMenu.kt @@ -68,11 +68,23 @@ class OperaContextActionMenu : AbstractMenu() { ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) - val button = Button(childView.getContext()) - button.text = context.translation["opera_context_menu.download"] - button.setOnClickListener { context.feature(MediaDownloader::class).downloadLastOperaMediaAsync() } - button.applyTheme(isAmoled = false) - linearLayout.addView(button) + val translation = context.translation + val mediaDownloader = context.feature(MediaDownloader::class) + + linearLayout.addView(Button(childView.getContext()).apply { + 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) } catch (e: Throwable) { context.log.error("Error while injecting OperaContextActionMenu", e)