diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt index a8fa4d56ce..fe8af18a80 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt @@ -1,14 +1,11 @@ package eu.kanade.tachiyomi.ui.manga.info -import android.content.ClipData -import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.text.TextUtils import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Toast import androidx.core.content.ContextCompat import com.bumptech.glide.load.engine.DiskCacheStrategy import eu.kanade.tachiyomi.R @@ -33,7 +30,7 @@ import eu.kanade.tachiyomi.ui.recent.updates.UpdatesController import eu.kanade.tachiyomi.ui.source.browse.BrowseSourceController import eu.kanade.tachiyomi.ui.source.globalsearch.GlobalSearchController import eu.kanade.tachiyomi.ui.webview.WebViewActivity -import eu.kanade.tachiyomi.util.lang.truncateCenter +import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.view.gone import eu.kanade.tachiyomi.util.view.setChips @@ -107,7 +104,7 @@ class MangaInfoController(private val fromSource: Boolean = false) : binding.mangaFullTitle.longClicks() .onEach { - copyToClipboard(view.context.getString(R.string.title), binding.mangaFullTitle.text.toString()) + activity?.copyToClipboard(view.context.getString(R.string.title), binding.mangaFullTitle.text.toString()) } .launchIn(scope) @@ -119,7 +116,7 @@ class MangaInfoController(private val fromSource: Boolean = false) : binding.mangaArtist.longClicks() .onEach { - copyToClipboard(binding.mangaArtistLabel.text.toString(), binding.mangaArtist.text.toString()) + activity?.copyToClipboard(binding.mangaArtistLabel.text.toString(), binding.mangaArtist.text.toString()) } .launchIn(scope) @@ -131,7 +128,7 @@ class MangaInfoController(private val fromSource: Boolean = false) : binding.mangaAuthor.longClicks() .onEach { - copyToClipboard(binding.mangaAuthor.text.toString(), binding.mangaAuthor.text.toString()) + activity?.copyToClipboard(binding.mangaAuthor.text.toString(), binding.mangaAuthor.text.toString()) } .launchIn(scope) @@ -143,13 +140,13 @@ class MangaInfoController(private val fromSource: Boolean = false) : binding.mangaSummary.longClicks() .onEach { - copyToClipboard(view.context.getString(R.string.description), binding.mangaSummary.text.toString()) + activity?.copyToClipboard(view.context.getString(R.string.description), binding.mangaSummary.text.toString()) } .launchIn(scope) binding.mangaCover.longClicks() .onEach { - copyToClipboard(view.context.getString(R.string.title), presenter.manga.title) + activity?.copyToClipboard(view.context.getString(R.string.title), presenter.manga.title) } .launchIn(scope) } @@ -482,27 +479,6 @@ class MangaInfoController(private val fromSource: Boolean = false) : presenter.moveMangaToCategories(manga, categories) } - /** - * Copies a string to clipboard - * - * @param label Label to show to the user describing the content - * @param content the actual text to copy to the board - */ - private fun copyToClipboard(label: String, content: String) { - if (content.isBlank()) return - - val activity = activity ?: return - val view = view ?: return - - val clipboard = activity.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - clipboard.setPrimaryClip(ClipData.newPlainText(label, content)) - - activity.toast( - view.context.getString(R.string.copied_to_clipboard, content.truncateCenter(20)), - Toast.LENGTH_SHORT - ) - } - /** * Perform a global search using the provided query. * diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutController.kt index 4a5faa941e..40da897b6e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutController.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.ui.more import android.app.Dialog import android.content.Intent import android.net.Uri +import android.os.Build import android.os.Bundle import androidx.preference.PreferenceScreen import com.afollestad.materialdialogs.MaterialDialog @@ -23,6 +24,7 @@ import eu.kanade.tachiyomi.util.preference.onClick import eu.kanade.tachiyomi.util.preference.preference import eu.kanade.tachiyomi.util.preference.preferenceCategory import eu.kanade.tachiyomi.util.preference.titleRes +import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.toast import java.text.DateFormat import java.text.ParseException @@ -55,6 +57,8 @@ class AboutController : SettingsController() { } else { "Stable ${BuildConfig.VERSION_NAME}" } + + onClick { copyDebugInfo() } } preference { titleRes = R.string.build_time @@ -186,6 +190,22 @@ class AboutController : SettingsController() { } } + private fun copyDebugInfo() { + val deviceInfo = + """ + App version: ${BuildConfig.VERSION_NAME} (${BuildConfig.FLAVOR}, ${BuildConfig.COMMIT_SHA}, ${BuildConfig.VERSION_CODE}) + Android version: ${Build.VERSION.RELEASE} (SDK ${Build.VERSION.SDK_INT}) + Android build ID: ${Build.DISPLAY} + Device brand: ${Build.BRAND} + Device manufacturer: ${Build.MANUFACTURER} + Device name: ${Build.DEVICE} + Device model: ${Build.MODEL} + Device product name: ${Build.PRODUCT} + """.trimIndent() + + activity?.copyToClipboard("Debug information", deviceInfo) + } + private fun getFormattedBuildTime(): String { return try { val inputDf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'", Locale.US) diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/ActivityExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/ActivityExtensions.kt new file mode 100644 index 0000000000..04ef89d004 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/ActivityExtensions.kt @@ -0,0 +1,23 @@ +package eu.kanade.tachiyomi.util.system + +import android.app.Activity +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.util.lang.truncateCenter + +/** + * Copies a string to clipboard + * + * @param label Label to show to the user describing the content + * @param content the actual text to copy to the board + */ +fun Activity.copyToClipboard(label: String, content: String) { + if (content.isBlank()) return + + val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + clipboard.setPrimaryClip(ClipData.newPlainText(label, content)) + + toast(getString(R.string.copied_to_clipboard, content.truncateCenter(50))) +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 46105064b3..f6f5d28339 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -428,7 +428,7 @@ Show more info Show less info Delete downloaded chapters? - %1$s copied to clipboard + Copied to clipboard:\n%1$s Source not installed: %1$s Add manga to library?