make description copyable , simplify clipboard helper

This commit is contained in:
IndusAryan 2024-02-20 21:42:42 +05:30
parent 93d81ea038
commit b52f341e3c
7 changed files with 65 additions and 46 deletions

View file

@ -2,9 +2,6 @@ package com.lagradost.cloudstream3.ui.result
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Dialog import android.app.Dialog
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.graphics.Rect import android.graphics.Rect
@ -34,7 +31,6 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
import com.lagradost.cloudstream3.APIHolder import com.lagradost.cloudstream3.APIHolder
import com.lagradost.cloudstream3.APIHolder.updateHasTrailers import com.lagradost.cloudstream3.APIHolder.updateHasTrailers
import com.lagradost.cloudstream3.CommonActivity import com.lagradost.cloudstream3.CommonActivity
import com.lagradost.cloudstream3.CommonActivity.showToast
import com.lagradost.cloudstream3.DubStatus import com.lagradost.cloudstream3.DubStatus
import com.lagradost.cloudstream3.LoadResponse import com.lagradost.cloudstream3.LoadResponse
import com.lagradost.cloudstream3.MainActivity.Companion.afterPluginsLoadedEvent import com.lagradost.cloudstream3.MainActivity.Companion.afterPluginsLoadedEvent
@ -72,6 +68,7 @@ import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialogIn
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialogText import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialogText
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog
import com.lagradost.cloudstream3.utils.UIHelper import com.lagradost.cloudstream3.utils.UIHelper
import com.lagradost.cloudstream3.utils.UIHelper.clipboardHelper
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
@ -757,14 +754,15 @@ open class ResultFragmentPhone : FullScreenPlayer() {
resultReloadConnectionOpenInBrowser.isVisible = data is Resource.Failure resultReloadConnectionOpenInBrowser.isVisible = data is Resource.Failure
resultTitle.setOnLongClickListener { resultTitle.setOnLongClickListener {
val titleToCopy = resultTitle.text val titleString = activity?.getString(R.string.title) as String
val clipboardManager = clipboardHelper(titleString, resultTitle.text)
activity?.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager? true
clipboardManager?.setPrimaryClip(ClipData.newPlainText("Title", titleToCopy)) }
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) {
showToast(R.string.copyTitle, Toast.LENGTH_SHORT) resultDescription.setOnLongClickListener {
} val synopsisString = activity?.getString(R.string.torrent_plot) as String
return@setOnLongClickListener true clipboardHelper(synopsisString, resultDescription.text)
true
} }
} }
} }

View file

@ -79,12 +79,12 @@ import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultWatchState
import com.lagradost.cloudstream3.utils.DataStoreHelper.setSubscribedData import com.lagradost.cloudstream3.utils.DataStoreHelper.setSubscribedData
import com.lagradost.cloudstream3.utils.DataStoreHelper.setVideoWatchState import com.lagradost.cloudstream3.utils.DataStoreHelper.setVideoWatchState
import com.lagradost.cloudstream3.utils.DataStoreHelper.updateSubscribedData import com.lagradost.cloudstream3.utils.DataStoreHelper.updateSubscribedData
import com.lagradost.cloudstream3.utils.UIHelper.clipboardHelper
import com.lagradost.cloudstream3.utils.UIHelper.navigate import com.lagradost.cloudstream3.utils.UIHelper.navigate
import kotlinx.coroutines.* import kotlinx.coroutines.*
import java.io.File import java.io.File
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
/** This starts at 1 */ /** This starts at 1 */
data class EpisodeRange( data class EpisodeRange(
// used to index data // used to index data
@ -1692,14 +1692,9 @@ class ResultViewModel2 : ViewModel() {
LoadType.ExternalApp, LoadType.ExternalApp,
txt(R.string.episode_action_copy_link) txt(R.string.episode_action_copy_link)
) { (result, index) -> ) { (result, index) ->
val act = activity ?: return@acquireSingleLink
val serviceClipboard =
(act.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager?)
?: return@acquireSingleLink
val link = result.links[index] val link = result.links[index]
val clip = ClipData.newPlainText(link.name, link.url) val clip = "${link.name} , ${link.url}"
serviceClipboard.setPrimaryClip(clip) clipboardHelper(link.name, clip )
showToast(R.string.copy_link_toast, Toast.LENGTH_SHORT)
} }
} }

View file

@ -19,6 +19,7 @@ import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.appbar.MaterialToolbar
import com.lagradost.cloudstream3.AcraApplication.Companion.context
import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.databinding.MainSettingsBinding import com.lagradost.cloudstream3.databinding.MainSettingsBinding
import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.mvvm.logError
@ -155,6 +156,12 @@ class SettingsFragment : Fragment() {
return getLayoutInt() == 2 return getLayoutInt() == 2
} }
// phone exclusive
fun isTruePhone(): Boolean {
return !isTrueTvSettings() && !isTvSettings() && context?.isEmulatorSettings() != true
&& context?.isAutoTv() != true && !isTrueTv && !isTv
}
private fun Context.isAutoTv(): Boolean { private fun Context.isAutoTv(): Boolean {
val uiModeManager = getSystemService(Context.UI_MODE_SERVICE) as UiModeManager? val uiModeManager = getSystemService(Context.UI_MODE_SERVICE) as UiModeManager?
// AFT = Fire TV // AFT = Fire TV

View file

@ -1,8 +1,7 @@
package com.lagradost.cloudstream3.ui.settings package com.lagradost.cloudstream3.ui.settings
import android.content.ClipData import android.content.Intent
import android.content.ClipboardManager import android.net.Uri
import android.content.Context
import android.os.Bundle import android.os.Bundle
import android.os.TransactionTooLargeException import android.os.TransactionTooLargeException
import android.view.View import android.view.View
@ -21,6 +20,7 @@ import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.network.initClient import com.lagradost.cloudstream3.network.initClient
import com.lagradost.cloudstream3.services.BackupWorkManager import com.lagradost.cloudstream3.services.BackupWorkManager
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTruePhone
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
@ -30,6 +30,7 @@ import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
import com.lagradost.cloudstream3.utils.InAppUpdater.Companion.runAutoUpdate import com.lagradost.cloudstream3.utils.InAppUpdater.Companion.runAutoUpdate
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog
import com.lagradost.cloudstream3.utils.UIHelper.clipboardHelper
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
import com.lagradost.cloudstream3.utils.VideoDownloadManager import com.lagradost.cloudstream3.utils.VideoDownloadManager
@ -114,25 +115,30 @@ class SettingsUpdates : PreferenceFragmentCompat() {
} }
val text = log.toString() val text = log.toString()
val lagraAppsSupportUri = "https://discord.com/channels/737724143126052974/737725084881387652"
binding.text1.text = text binding.text1.text = text
binding.copyBtt.setOnClickListener { binding.copyBtt.setOnClickListener {
// Can crash on too much text // Can crash on too much text
try { try {
val serviceClipboard = clipboardHelper("Logcat", text)
(activity?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?) // copy log and open support channel of Lagra apps server
?: return@setOnClickListener if (isTruePhone())
val clip = ClipData.newPlainText("logcat", text) {
serviceClipboard.setPrimaryClip(clip) startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(lagraAppsSupportUri)))
}
dialog.dismissSafe(activity) dialog.dismissSafe(activity)
} catch (e: TransactionTooLargeException) { } catch (e: TransactionTooLargeException) {
showToast(R.string.clipboard_too_large) showToast(R.string.clipboard_too_large)
} }
} }
binding.clearBtt.setOnClickListener { binding.clearBtt.setOnClickListener {
Runtime.getRuntime().exec("logcat -c") Runtime.getRuntime().exec("logcat -c")
dialog.dismissSafe(activity) dialog.dismissSafe(activity)
} }
binding.saveBtt.setOnClickListener { binding.saveBtt.setOnClickListener {
var fileStream: OutputStream? = null var fileStream: OutputStream? = null
try { try {
@ -153,9 +159,11 @@ class SettingsUpdates : PreferenceFragmentCompat() {
fileStream?.closeQuietly() fileStream?.closeQuietly()
} }
} }
binding.closeBtt.setOnClickListener { binding.closeBtt.setOnClickListener {
dialog.dismissSafe(activity) dialog.dismissSafe(activity)
} }
return@setOnPreferenceClickListener true return@setOnPreferenceClickListener true
} }

View file

@ -1,22 +1,17 @@
package com.lagradost.cloudstream3.ui.settings.extensions package com.lagradost.cloudstream3.ui.settings.extensions
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.os.Build
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding import androidx.viewbinding.ViewBinding
import com.lagradost.cloudstream3.CommonActivity.activity import com.lagradost.cloudstream3.CommonActivity.activity
import com.lagradost.cloudstream3.CommonActivity.showToast
import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.databinding.RepositoryItemBinding import com.lagradost.cloudstream3.databinding.RepositoryItemBinding
import com.lagradost.cloudstream3.databinding.RepositoryItemTvBinding import com.lagradost.cloudstream3.databinding.RepositoryItemTvBinding
import com.lagradost.cloudstream3.plugins.RepositoryManager.PREBUILT_REPOSITORIES import com.lagradost.cloudstream3.plugins.RepositoryManager.PREBUILT_REPOSITORIES
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings
import com.lagradost.cloudstream3.utils.UIHelper.clipboardHelper
class RepoAdapter( class RepoAdapter(
val isSetup: Boolean, val isSetup: Boolean,
@ -121,13 +116,11 @@ class RepoAdapter(
} }
repositoryItemRoot.setOnLongClickListener { repositoryItemRoot.setOnLongClickListener {
val clipboardManager = val shareableRepoData = "${repositoryData.name} : \n ${repositoryData.url}"
activity?.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager? val copyLabel = activity?.getString(R.string.repo_copy_label) as String
clipboardManager?.setPrimaryClip(ClipData.newPlainText("RepoUrl", repositoryData.url))
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) { clipboardHelper(copyLabel, shareableRepoData)
showToast(R.string.copyRepoUrl, Toast.LENGTH_SHORT) true
}
return@setOnLongClickListener true
} }
mainText.text = repositoryData.name mainText.text = repositoryData.name

View file

@ -5,6 +5,8 @@ import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.app.AppOpsManager import android.app.AppOpsManager
import android.app.Dialog import android.app.Dialog
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context import android.content.Context
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.content.res.Configuration import android.content.res.Configuration
@ -14,12 +16,14 @@ import android.graphics.Color
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.* import android.view.*
import android.view.ViewGroup.MarginLayoutParams import android.view.ViewGroup.MarginLayoutParams
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import android.widget.ImageView import android.widget.ImageView
import android.widget.ListAdapter import android.widget.ListAdapter
import android.widget.ListView import android.widget.ListView
import android.widget.Toast
import androidx.annotation.AttrRes import androidx.annotation.AttrRes
import androidx.annotation.ColorInt import androidx.annotation.ColorInt
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
@ -30,14 +34,12 @@ import androidx.appcompat.view.menu.MenuBuilder
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.getSystemService
import androidx.core.graphics.alpha import androidx.core.graphics.alpha
import androidx.core.graphics.blue import androidx.core.graphics.blue
import androidx.core.graphics.drawable.toBitmapOrNull import androidx.core.graphics.drawable.toBitmapOrNull
import androidx.core.graphics.green import androidx.core.graphics.green
import androidx.core.graphics.red import androidx.core.graphics.red
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import androidx.core.view.marginBottom import androidx.core.view.marginBottom
import androidx.core.view.marginLeft import androidx.core.view.marginLeft
import androidx.core.view.marginRight import androidx.core.view.marginRight
@ -58,7 +60,9 @@ import com.bumptech.glide.request.target.Target
import com.google.android.material.chip.Chip import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipDrawable import com.google.android.material.chip.ChipDrawable
import com.google.android.material.chip.ChipGroup import com.google.android.material.chip.ChipGroup
import com.lagradost.cloudstream3.AcraApplication.Companion.context
import com.lagradost.cloudstream3.CommonActivity.activity import com.lagradost.cloudstream3.CommonActivity.activity
import com.lagradost.cloudstream3.CommonActivity.showToast
import com.lagradost.cloudstream3.MainActivity import com.lagradost.cloudstream3.MainActivity
import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.mvvm.logError
@ -123,6 +127,20 @@ object UIHelper {
) )
} }
fun clipboardHelper(label: String, text: CharSequence) {
try {
val clip = ClipData.newPlainText(label, text)
val labelSuffix = activity?.getString(R.string.toast_copied) as String
context?.getSystemService<ClipboardManager>()!!.setPrimaryClip(clip)
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) {
showToast("$label $labelSuffix", Toast.LENGTH_SHORT)
}
} catch (e: Exception) {
showToast(R.string.clipboard_too_large)
}
}
/** /**
* Sets ListView height dynamically based on the height of the items. * Sets ListView height dynamically based on the height of the items.

View file

@ -173,8 +173,8 @@
<string name="sort_close">Close</string> <string name="sort_close">Close</string>
<string name="sort_clear">Clear</string> <string name="sort_clear">Clear</string>
<string name="sort_save">Save</string> <string name="sort_save">Save</string>
<string name="copyTitle">Title copied!</string> <string name="repo_copy_label">Repository name and URL</string>
<string name="copyRepoUrl">Repo URL copied!</string> <string name="toast_copied">copied!</string>
<string name="subscribe_tooltip">New episode notification</string> <string name="subscribe_tooltip">New episode notification</string>
<string name="result_search_tooltip">Search in other extensions</string> <string name="result_search_tooltip">Search in other extensions</string>
<string name="recommendations_tooltip">Show recommendations</string> <string name="recommendations_tooltip">Show recommendations</string>