diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt index e7e50b9d..449b3c8c 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt @@ -2,9 +2,6 @@ package com.lagradost.cloudstream3.ui.result import android.annotation.SuppressLint import android.app.Dialog -import android.content.ClipData -import android.content.ClipboardManager -import android.content.Context import android.content.Intent import android.content.res.ColorStateList 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.updateHasTrailers import com.lagradost.cloudstream3.CommonActivity -import com.lagradost.cloudstream3.CommonActivity.showToast import com.lagradost.cloudstream3.DubStatus import com.lagradost.cloudstream3.LoadResponse 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.showDialog 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.dismissSafe import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard @@ -757,14 +754,15 @@ open class ResultFragmentPhone : FullScreenPlayer() { resultReloadConnectionOpenInBrowser.isVisible = data is Resource.Failure resultTitle.setOnLongClickListener { - val titleToCopy = resultTitle.text - val clipboardManager = - activity?.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager? - clipboardManager?.setPrimaryClip(ClipData.newPlainText("Title", titleToCopy)) - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) { - showToast(R.string.copyTitle, Toast.LENGTH_SHORT) - } - return@setOnLongClickListener true + val titleString = activity?.getString(R.string.title) as String + clipboardHelper(titleString, resultTitle.text) + true + } + + resultDescription.setOnLongClickListener { + val synopsisString = activity?.getString(R.string.torrent_plot) as String + clipboardHelper(synopsisString, resultDescription.text) + true } } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt index c24efe56..879dc8d3 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt @@ -79,12 +79,12 @@ import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultWatchState import com.lagradost.cloudstream3.utils.DataStoreHelper.setSubscribedData import com.lagradost.cloudstream3.utils.DataStoreHelper.setVideoWatchState import com.lagradost.cloudstream3.utils.DataStoreHelper.updateSubscribedData +import com.lagradost.cloudstream3.utils.UIHelper.clipboardHelper import com.lagradost.cloudstream3.utils.UIHelper.navigate import kotlinx.coroutines.* import java.io.File import java.util.concurrent.TimeUnit - /** This starts at 1 */ data class EpisodeRange( // used to index data @@ -1692,14 +1692,9 @@ class ResultViewModel2 : ViewModel() { LoadType.ExternalApp, txt(R.string.episode_action_copy_link) ) { (result, index) -> - val act = activity ?: return@acquireSingleLink - val serviceClipboard = - (act.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager?) - ?: return@acquireSingleLink val link = result.links[index] - val clip = ClipData.newPlainText(link.name, link.url) - serviceClipboard.setPrimaryClip(clip) - showToast(R.string.copy_link_toast, Toast.LENGTH_SHORT) + val clip = "${link.name} , ${link.url}" + clipboardHelper(link.name, clip ) } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt index 37c71134..2e61d5c4 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt @@ -19,6 +19,7 @@ import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceManager import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.MaterialToolbar +import com.lagradost.cloudstream3.AcraApplication.Companion.context import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.databinding.MainSettingsBinding import com.lagradost.cloudstream3.mvvm.logError @@ -155,6 +156,12 @@ class SettingsFragment : Fragment() { return getLayoutInt() == 2 } + // phone exclusive + fun isTruePhone(): Boolean { + return !isTrueTvSettings() && !isTvSettings() && context?.isEmulatorSettings() != true + && context?.isAutoTv() != true && !isTrueTv && !isTv + } + private fun Context.isAutoTv(): Boolean { val uiModeManager = getSystemService(Context.UI_MODE_SERVICE) as UiModeManager? // AFT = Fire TV diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUpdates.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUpdates.kt index 9f72c1d5..ac71cf5c 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUpdates.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUpdates.kt @@ -1,8 +1,7 @@ package com.lagradost.cloudstream3.ui.settings -import android.content.ClipData -import android.content.ClipboardManager -import android.content.Context +import android.content.Intent +import android.net.Uri import android.os.Bundle import android.os.TransactionTooLargeException import android.view.View @@ -21,6 +20,7 @@ import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.network.initClient import com.lagradost.cloudstream3.services.BackupWorkManager 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.setToolBarScrollFlags 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.SingleSelectionHelper.showBottomDialog 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.hideKeyboard import com.lagradost.cloudstream3.utils.VideoDownloadManager @@ -114,25 +115,30 @@ class SettingsUpdates : PreferenceFragmentCompat() { } val text = log.toString() + val lagraAppsSupportUri = "https://discord.com/channels/737724143126052974/737725084881387652" binding.text1.text = text binding.copyBtt.setOnClickListener { // Can crash on too much text try { - val serviceClipboard = - (activity?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?) - ?: return@setOnClickListener - val clip = ClipData.newPlainText("logcat", text) - serviceClipboard.setPrimaryClip(clip) + clipboardHelper("Logcat", text) + // copy log and open support channel of Lagra apps server + if (isTruePhone()) + { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(lagraAppsSupportUri))) + } + dialog.dismissSafe(activity) } catch (e: TransactionTooLargeException) { showToast(R.string.clipboard_too_large) } } + binding.clearBtt.setOnClickListener { Runtime.getRuntime().exec("logcat -c") dialog.dismissSafe(activity) } + binding.saveBtt.setOnClickListener { var fileStream: OutputStream? = null try { @@ -153,9 +159,11 @@ class SettingsUpdates : PreferenceFragmentCompat() { fileStream?.closeQuietly() } } + binding.closeBtt.setOnClickListener { dialog.dismissSafe(activity) } + return@setOnPreferenceClickListener true } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/RepoAdapter.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/RepoAdapter.kt index 7ac7cbb2..c46ffeec 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/RepoAdapter.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/RepoAdapter.kt @@ -1,22 +1,17 @@ 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.ViewGroup -import android.widget.Toast import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import androidx.viewbinding.ViewBinding import com.lagradost.cloudstream3.CommonActivity.activity -import com.lagradost.cloudstream3.CommonActivity.showToast import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.databinding.RepositoryItemBinding import com.lagradost.cloudstream3.databinding.RepositoryItemTvBinding import com.lagradost.cloudstream3.plugins.RepositoryManager.PREBUILT_REPOSITORIES import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings +import com.lagradost.cloudstream3.utils.UIHelper.clipboardHelper class RepoAdapter( val isSetup: Boolean, @@ -121,13 +116,11 @@ class RepoAdapter( } repositoryItemRoot.setOnLongClickListener { - val clipboardManager = - activity?.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager? - clipboardManager?.setPrimaryClip(ClipData.newPlainText("RepoUrl", repositoryData.url)) - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) { - showToast(R.string.copyRepoUrl, Toast.LENGTH_SHORT) - } - return@setOnLongClickListener true + val shareableRepoData = "${repositoryData.name} : \n ${repositoryData.url}" + val copyLabel = activity?.getString(R.string.repo_copy_label) as String + + clipboardHelper(copyLabel, shareableRepoData) + true } mainText.text = repositoryData.name diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt index 76142f72..11b2cc64 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt @@ -5,6 +5,8 @@ import android.annotation.SuppressLint import android.app.Activity import android.app.AppOpsManager import android.app.Dialog +import android.content.ClipData +import android.content.ClipboardManager import android.content.Context import android.content.pm.PackageManager import android.content.res.Configuration @@ -14,12 +16,14 @@ import android.graphics.Color import android.graphics.drawable.Drawable import android.os.Build import android.os.Bundle +import android.util.Log import android.view.* import android.view.ViewGroup.MarginLayoutParams import android.view.inputmethod.InputMethodManager import android.widget.ImageView import android.widget.ListAdapter import android.widget.ListView +import android.widget.Toast import androidx.annotation.AttrRes import androidx.annotation.ColorInt import androidx.annotation.DrawableRes @@ -30,14 +34,12 @@ import androidx.appcompat.view.menu.MenuBuilder import androidx.appcompat.widget.PopupMenu import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat +import androidx.core.content.getSystemService import androidx.core.graphics.alpha import androidx.core.graphics.blue import androidx.core.graphics.drawable.toBitmapOrNull import androidx.core.graphics.green 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.marginLeft 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.ChipDrawable 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.showToast import com.lagradost.cloudstream3.MainActivity import com.lagradost.cloudstream3.R 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()!!.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. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 14bb9552..f46688e9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -173,8 +173,8 @@ Close Clear Save - Title copied! - Repo URL copied! + Repository name and URL + copied! New episode notification Search in other extensions Show recommendations