diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dfeae5af..24b65174 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -178,6 +178,7 @@ + diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt index 9b73f2f2..49504efd 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt @@ -10,6 +10,7 @@ import android.view.KeyEvent import android.view.Menu import android.view.MenuItem import android.view.WindowManager +import android.widget.Toast import androidx.annotation.IdRes import androidx.appcompat.app.AppCompatActivity import androidx.core.view.isVisible @@ -79,6 +80,9 @@ import java.io.File import kotlin.concurrent.thread import kotlin.reflect.KClass import com.lagradost.cloudstream3.plugins.PluginManager +import com.lagradost.cloudstream3.plugins.RepositoryManager +import com.lagradost.cloudstream3.ui.settings.extensions.RepositoryData +import com.lagradost.cloudstream3.utils.Coroutines.main const val VLC_PACKAGE = "org.videolan.vlc" @@ -320,7 +324,26 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { val str = intent.dataString loadCache() if (str != null) { - if (str.contains(appString)) { + if (str.startsWith("https://cs.repo")) { + val realUrl = "https://" + str.substringAfter("?") + println("Repository url: $realUrl") + ioSafe { + val repo = RepositoryManager.parseRepository(realUrl) ?: return@ioSafe + RepositoryManager.addRepository( + RepositoryData( + repo.name, + realUrl + ) + ) + main { + showToast( + this, + this.getString(R.string.player_loaded_subtitles, repo.name), + Toast.LENGTH_LONG + ) + } + } + } else if (str.contains(appString)) { for (api in OAuth2Apis) { if (str.contains("/${api.redirectUrl}")) { ioSafe { diff --git a/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt b/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt index a1e6da60..9aed690a 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt @@ -85,7 +85,7 @@ object PluginManager { var loadedLocalPlugins = false private val gson = Gson() - fun maybeLoadPlugin(context: Context, file: File) { + private fun maybeLoadPlugin(context: Context, file: File) { val name = file.name if (file.extension == "zip" || file.extension == "cs3") { loadPlugin(context, file, PluginData(name, null, false, file.absolutePath)) diff --git a/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt b/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt index cff52871..5bc38f39 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt @@ -44,19 +44,19 @@ data class SitePlugin( object RepositoryManager { const val ONLINE_PLUGINS_FOLDER = "Extensions" - private suspend fun parseRepository(url: String): Repository? { + suspend fun parseRepository(url: String): Repository? { return suspendSafeApiCall { // Take manifestVersion and such into account later app.get(url).parsedSafe() } } - private suspend fun parsePlugins(pluginUrls: String): ArrayList? { + private suspend fun parsePlugins(pluginUrls: String): List { // Take manifestVersion and such into account later val response = app.get(pluginUrls) // Normal parsed function not working? // return response.parsedSafe() - return tryParseJson>(response.text) + return tryParseJson>(response.text)?.toList() ?: emptyList() } suspend fun getRepoPlugins(repositoryUrl: String): List? { @@ -85,10 +85,21 @@ object RepositoryManager { // Don't want to read before we write in another thread private val repoLock = Mutex() suspend fun addRepository(repository: RepositoryData) { - repoLock.withLock { - val currentRepos = getKey>(REPOSITORIES_KEY) ?: emptyList() - setKey(REPOSITORIES_KEY, currentRepos + repository) - } + repoLock.withLock { + val currentRepos = getKey>(REPOSITORIES_KEY) ?: emptyArray() + // No duplicates + if (currentRepos.any { it.url == repository.url }) return + setKey(REPOSITORIES_KEY, currentRepos + repository) + } + } + + suspend fun removeRepository(repository: RepositoryData) { + repoLock.withLock { + val currentRepos = getKey>(REPOSITORIES_KEY) ?: emptyArray() + // No duplicates + val newRepos = currentRepos.filter { it.url != repository.url } + setKey(REPOSITORIES_KEY, newRepos) + } } private fun write(stream: InputStream, output: OutputStream) { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt index d91a2a44..b7f00e73 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt @@ -39,16 +39,23 @@ class ExtensionsFragment : Fragment() { super.onViewCreated(view, savedInstanceState) context?.fixPaddingStatusbar(extensions_root) - observe(extensionViewModel.repositories) { - // Kinda cheap to do this instead of updates - repo_recycler_view?.adapter = RepoAdapter(it) { - findNavController().navigate( - R.id.navigation_settings_extensions_to_navigation_settings_plugins, - Bundle().apply { - putString(PLUGINS_BUNDLE_NAME, it.name) - putString(PLUGINS_BUNDLE_URL, it.url) - }) + repo_recycler_view?.adapter = RepoAdapter(emptyArray(), { + findNavController().navigate( + R.id.navigation_settings_extensions_to_navigation_settings_plugins, + Bundle().apply { + putString(PLUGINS_BUNDLE_NAME, it.name) + putString(PLUGINS_BUNDLE_URL, it.url) + }) + }, { repo -> + ioSafe { + RepositoryManager.removeRepository(repo) + extensionViewModel.loadRepositories() } + }) + + observe(extensionViewModel.repositories) { + (repo_recycler_view?.adapter as? RepoAdapter)?.repositories = it + (repo_recycler_view?.adapter as? RepoAdapter)?.notifyDataSetChanged() } add_repo_button?.setOnClickListener { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginAdapter.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginAdapter.kt index 2a862498..61ad2601 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginAdapter.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginAdapter.kt @@ -46,8 +46,6 @@ class PluginAdapter( plugin: SitePlugin ) { val isDownloaded = storedPlugins.any { it.url == plugin.url } -println("ISOWNLOADED $isDownloaded ${storedPlugins.map { it.url }} ||||| ${plugin.url}") - val drawableInt = if (isDownloaded) R.drawable.ic_baseline_delete_outline_24 diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt index 452fd4b0..2367b515 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt @@ -43,7 +43,6 @@ class PluginsFragment : Fragment() { ioSafe { val plugins = extensionViewModel.getPlugins(url) - println("GET PLUGINS $plugins") main { repo_recycler_view?.adapter = PluginAdapter(plugins) { plugin, isDownloaded -> ioSafe { 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 92c2e4d1..f71aec81 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 @@ -9,8 +9,9 @@ import com.lagradost.cloudstream3.ui.settings.AccountClickCallback import kotlinx.android.synthetic.main.repository_item.view.* class RepoAdapter( - private val repositories: Array, - val clickCallback: (RepositoryData) -> Unit + var repositories: Array, + val clickCallback: RepoAdapter.(RepositoryData) -> Unit, + val imageClickCallback: RepoAdapter.(RepositoryData) -> Unit ) : RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { @@ -36,6 +37,11 @@ class RepoAdapter( fun bind( repositoryData: RepositoryData ) { + itemView.action_button?.setImageResource(R.drawable.ic_baseline_delete_outline_24) + itemView.action_button?.setOnClickListener { + imageClickCallback(repositoryData) + } + itemView.setOnClickListener { clickCallback(repositoryData) }