forked from recloudstream/cloudstream
only allow voting on installed extensions
This commit is contained in:
parent
9431cde2f9
commit
74e3af0dbe
7 changed files with 71 additions and 10 deletions
|
@ -339,9 +339,7 @@ object PluginManager {
|
||||||
}
|
}
|
||||||
plugins[filePath] = pluginInstance
|
plugins[filePath] = pluginInstance
|
||||||
classLoaders[loader] = pluginInstance
|
classLoaders[loader] = pluginInstance
|
||||||
if (data.url != null) { // TODO: make this cleaner
|
urlPlugins[data.url ?: filePath] = pluginInstance
|
||||||
urlPlugins[data.url] = pluginInstance
|
|
||||||
}
|
|
||||||
pluginInstance.load(activity)
|
pluginInstance.load(activity)
|
||||||
Log.i(TAG, "Loaded plugin ${data.internalName} successfully")
|
Log.i(TAG, "Loaded plugin ${data.internalName} successfully")
|
||||||
currentlyLoading = null
|
currentlyLoading = null
|
||||||
|
@ -382,6 +380,7 @@ object PluginManager {
|
||||||
classLoaders.values.removeIf { v -> v == plugin }
|
classLoaders.values.removeIf { v -> v == plugin }
|
||||||
|
|
||||||
plugins.remove(absolutePath)
|
plugins.remove(absolutePath)
|
||||||
|
urlPlugins.values.removeIf { v -> v == plugin }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,11 +1,15 @@
|
||||||
package com.lagradost.cloudstream3.plugins
|
package com.lagradost.cloudstream3.plugins
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import android.widget.Toast
|
||||||
|
import com.lagradost.cloudstream3.AcraApplication.Companion.context
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
|
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
|
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
|
||||||
|
import com.lagradost.cloudstream3.R
|
||||||
import java.security.MessageDigest
|
import java.security.MessageDigest
|
||||||
import com.lagradost.cloudstream3.app
|
import com.lagradost.cloudstream3.app
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||||
|
import com.lagradost.cloudstream3.utils.Coroutines.main
|
||||||
|
|
||||||
object VotingApi { // please do not cheat the votes lol
|
object VotingApi { // please do not cheat the votes lol
|
||||||
private const val LOGKEY = "VotingApi"
|
private const val LOGKEY = "VotingApi"
|
||||||
|
@ -33,10 +37,13 @@ object VotingApi { // please do not cheat the votes lol
|
||||||
}
|
}
|
||||||
|
|
||||||
fun SitePlugin.getVoteType(): VoteType {
|
fun SitePlugin.getVoteType(): VoteType {
|
||||||
if (repositoryUrl == null) return VoteType.NONE
|
|
||||||
return getVoteType(url)
|
return getVoteType(url)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun SitePlugin.canVote(): Boolean {
|
||||||
|
return canVote(this.url)
|
||||||
|
}
|
||||||
|
|
||||||
// Plugin url to Int
|
// Plugin url to Int
|
||||||
private val votesCache = mutableMapOf<String, Int>()
|
private val votesCache = mutableMapOf<String, Int>()
|
||||||
|
|
||||||
|
@ -62,7 +69,18 @@ object VotingApi { // please do not cheat the votes lol
|
||||||
app.get(url)
|
app.get(url)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun canVote(pluginUrl: String): Boolean {
|
||||||
|
if (!PluginManager.urlPlugins.contains(pluginUrl)) return false
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
suspend fun vote(pluginUrl: String, requestType: VoteType): Int {
|
suspend fun vote(pluginUrl: String, requestType: VoteType): Int {
|
||||||
|
if (!canVote(pluginUrl)) {
|
||||||
|
main {
|
||||||
|
Toast.makeText(context, R.string.extension_install_first, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
return getVotes(pluginUrl)
|
||||||
|
}
|
||||||
val savedType: VoteType = getKey("cs3-votes/${transformUrl(pluginUrl)}") ?: VoteType.NONE
|
val savedType: VoteType = getKey("cs3-votes/${transformUrl(pluginUrl)}") ?: VoteType.NONE
|
||||||
var newType: VoteType = requestType
|
var newType: VoteType = requestType
|
||||||
var changeValue = 0
|
var changeValue = 0
|
||||||
|
|
|
@ -183,7 +183,6 @@ class PluginAdapter(
|
||||||
}"
|
}"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
itemView.action_settings?.isVisible = false
|
itemView.action_settings?.isVisible = false
|
||||||
|
@ -217,10 +216,8 @@ class PluginAdapter(
|
||||||
itemView.lang_icon.text = "${getFlagFromIso(metadata.language)} ${fromTwoLettersToLanguage(metadata.language)}"
|
itemView.lang_icon.text = "${getFlagFromIso(metadata.language)} ${fromTwoLettersToLanguage(metadata.language)}"
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isLocal) {
|
itemView.ext_votes?.isVisible = false
|
||||||
itemView.ext_votes?.isVisible = false
|
if (!isLocal) {
|
||||||
} else {
|
|
||||||
itemView.ext_votes?.isVisible = false
|
|
||||||
ioSafe {
|
ioSafe {
|
||||||
metadata.getVotes().main {
|
metadata.getVotes().main {
|
||||||
itemView.ext_votes?.setText(txt(R.string.extension_rating, prettyCount(it)))
|
itemView.ext_votes?.setText(txt(R.string.extension_rating, prettyCount(it)))
|
||||||
|
|
|
@ -11,6 +11,8 @@ import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
||||||
import kotlinx.android.synthetic.main.fragment_plugin_details.*
|
import kotlinx.android.synthetic.main.fragment_plugin_details.*
|
||||||
import android.text.format.Formatter.formatFileSize
|
import android.text.format.Formatter.formatFileSize
|
||||||
|
import android.util.Log
|
||||||
|
import androidx.core.view.isVisible
|
||||||
import com.lagradost.cloudstream3.plugins.VotingApi
|
import com.lagradost.cloudstream3.plugins.VotingApi
|
||||||
import com.lagradost.cloudstream3.plugins.VotingApi.getVoteType
|
import com.lagradost.cloudstream3.plugins.VotingApi.getVoteType
|
||||||
import com.lagradost.cloudstream3.plugins.VotingApi.getVotes
|
import com.lagradost.cloudstream3.plugins.VotingApi.getVotes
|
||||||
|
@ -19,9 +21,11 @@ import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.main
|
import com.lagradost.cloudstream3.utils.Coroutines.main
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.openBrowser
|
import com.lagradost.cloudstream3.AcraApplication.Companion.openBrowser
|
||||||
import com.lagradost.cloudstream3.utils.SubtitleHelper
|
import com.lagradost.cloudstream3.plugins.PluginManager
|
||||||
|
import com.lagradost.cloudstream3.plugins.VotingApi.canVote
|
||||||
import com.lagradost.cloudstream3.utils.SubtitleHelper.fromTwoLettersToLanguage
|
import com.lagradost.cloudstream3.utils.SubtitleHelper.fromTwoLettersToLanguage
|
||||||
import com.lagradost.cloudstream3.utils.SubtitleHelper.getFlagFromIso
|
import com.lagradost.cloudstream3.utils.SubtitleHelper.getFlagFromIso
|
||||||
|
import kotlinx.android.synthetic.main.repository_item.view.*
|
||||||
|
|
||||||
|
|
||||||
class PluginDetailsFragment(val data: PluginViewData) : BottomSheetDialogFragment() {
|
class PluginDetailsFragment(val data: PluginViewData) : BottomSheetDialogFragment() {
|
||||||
|
@ -80,7 +84,35 @@ class PluginDetailsFragment(val data: PluginViewData) : BottomSheetDialogFragmen
|
||||||
if (metadata.repositoryUrl != null) {
|
if (metadata.repositoryUrl != null) {
|
||||||
openBrowser(metadata.repositoryUrl)
|
openBrowser(metadata.repositoryUrl)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!metadata.canVote()) {
|
||||||
|
downvote.alpha = .6f
|
||||||
|
upvote.alpha = .6f
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.isDownloaded) {
|
||||||
|
// On local plugins page the filepath is provided instead of url.
|
||||||
|
val plugin = PluginManager.urlPlugins[metadata.url] ?: PluginManager.plugins[metadata.url]
|
||||||
|
if (plugin?.openSettings != null && context != null) {
|
||||||
|
action_settings?.isVisible = true
|
||||||
|
action_settings.setOnClickListener {
|
||||||
|
try {
|
||||||
|
plugin.openSettings!!.invoke(requireContext())
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
Log.e(
|
||||||
|
"PluginAdapter",
|
||||||
|
"Failed to open ${metadata.name} settings: ${
|
||||||
|
Log.getStackTraceString(e)
|
||||||
|
}"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
action_settings?.isVisible = false
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
action_settings?.isVisible = false
|
||||||
}
|
}
|
||||||
|
|
||||||
upvote.setOnClickListener {
|
upvote.setOnClickListener {
|
||||||
|
|
|
@ -43,11 +43,24 @@
|
||||||
android:textStyle="normal"
|
android:textStyle="normal"
|
||||||
tools:text="Hello world" />
|
tools:text="Hello world" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/action_settings"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
|
android:contentDescription="@string/title_settings"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:srcCompat="@drawable/ic_baseline_tune_24"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/github_btn"
|
android:id="@+id/github_btn"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_vertical|end"
|
android:layout_gravity="center_vertical|end"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
android:background="?attr/selectableItemBackgroundBorderless"
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
android:src="@drawable/ic_github_logo" />
|
android:src="@drawable/ic_github_logo" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
|
@ -454,4 +454,5 @@
|
||||||
<string name="extension_authors">Autorzy</string>
|
<string name="extension_authors">Autorzy</string>
|
||||||
<string name="extension_types">Wspierane</string>
|
<string name="extension_types">Wspierane</string>
|
||||||
<string name="extension_language">Język</string>
|
<string name="extension_language">Język</string>
|
||||||
|
<string name="extension_install_first">Najpierw zainstaluj rozszerzenie</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -624,6 +624,7 @@
|
||||||
<string name="extension_authors">Authors</string>
|
<string name="extension_authors">Authors</string>
|
||||||
<string name="extension_types">Supported</string>
|
<string name="extension_types">Supported</string>
|
||||||
<string name="extension_language">Language</string>
|
<string name="extension_language">Language</string>
|
||||||
|
<string name="extension_install_first">Install the extension first</string>
|
||||||
|
|
||||||
<string name="hls_playlist">HLS Playlist</string>
|
<string name="hls_playlist">HLS Playlist</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Loading…
Reference in a new issue