mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
Add webview fallback for TV
This commit is contained in:
parent
309c2b828c
commit
ef165ad4cb
8 changed files with 149 additions and 37 deletions
|
@ -3,6 +3,7 @@ package com.lagradost.cloudstream3
|
|||
import android.app.Application
|
||||
import android.content.Context
|
||||
import android.widget.Toast
|
||||
import androidx.fragment.app.Fragment
|
||||
import com.google.auto.service.AutoService
|
||||
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
||||
import com.lagradost.cloudstream3.mvvm.suspendSafeApiCall
|
||||
|
@ -135,8 +136,11 @@ class AcraApplication : Application() {
|
|||
context?.removeKey(path)
|
||||
}
|
||||
|
||||
fun openBrowser(url: String) {
|
||||
context?.openBrowser(url)
|
||||
/**
|
||||
* If fallbackWebview is true and a fragment is supplied then it will open a webview with the url if the browser fails.
|
||||
* */
|
||||
fun openBrowser(url: String, fallbackWebview: Boolean = false, fragment: Fragment? = null) {
|
||||
context?.openBrowser(url, fallbackWebview, fragment)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -82,11 +82,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.syncproviders.AccountManager.Companion.appStringRepo
|
||||
import com.lagradost.cloudstream3.ui.settings.extensions.RepositoryData
|
||||
import com.lagradost.cloudstream3.ui.setup.SetupFragmentExtensions
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.main
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.loadRepository
|
||||
import com.lagradost.cloudstream3.utils.Event
|
||||
|
||||
|
||||
|
@ -332,26 +330,6 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
|
|||
super.onNewIntent(intent)
|
||||
}
|
||||
|
||||
private fun loadRepo(url: String) {
|
||||
ioSafe {
|
||||
val repo = RepositoryManager.parseRepository(url) ?: return@ioSafe
|
||||
RepositoryManager.addRepository(
|
||||
RepositoryData(
|
||||
repo.name,
|
||||
url
|
||||
)
|
||||
)
|
||||
main {
|
||||
showToast(
|
||||
this@MainActivity,
|
||||
getString(R.string.player_loaded_subtitles, repo.name),
|
||||
Toast.LENGTH_LONG
|
||||
)
|
||||
}
|
||||
afterRepositoryLoadedEvent.invoke(true)
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleAppIntent(intent: Intent?) {
|
||||
if (intent == null) return
|
||||
val str = intent.dataString
|
||||
|
@ -360,7 +338,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
|
|||
if (str.startsWith("https://cs.repo")) {
|
||||
val realUrl = "https://" + str.substringAfter("?")
|
||||
println("Repository url: $realUrl")
|
||||
loadRepo(realUrl)
|
||||
loadRepository(realUrl)
|
||||
} else if (str.contains(appString)) {
|
||||
for (api in OAuth2Apis) {
|
||||
if (str.contains("/${api.redirectUrl}")) {
|
||||
|
@ -392,7 +370,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
|
|||
}
|
||||
} else if (str.contains(appStringRepo)) {
|
||||
val url = str.replaceFirst(appStringRepo, "https")
|
||||
loadRepo(url)
|
||||
loadRepository(url)
|
||||
} else {
|
||||
if (str.startsWith(DOWNLOAD_NAVIGATE_TO)) {
|
||||
this.navigate(R.id.navigation_downloads)
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
package com.lagradost.cloudstream3.ui
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.fragment.app.Fragment
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.webkit.WebResourceRequest
|
||||
import android.webkit.WebView
|
||||
import android.webkit.WebViewClient
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.USER_AGENT
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.loadRepository
|
||||
import kotlinx.android.synthetic.main.fragment_webview.*
|
||||
|
||||
class WebviewFragment : Fragment() {
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
val url = arguments?.getString(WEBVIEW_URL) ?: "".also {
|
||||
findNavController().popBackStack()
|
||||
}
|
||||
|
||||
web_view.webViewClient = object : WebViewClient() {
|
||||
override fun shouldOverrideUrlLoading(
|
||||
view: WebView?,
|
||||
request: WebResourceRequest?
|
||||
): Boolean {
|
||||
val requestUrl = request?.url.toString()
|
||||
if (requestUrl.startsWith("https://cs.repo")) {
|
||||
val realUrl = "https://" + requestUrl.substringAfter("?")
|
||||
println("Repository url: $realUrl :::: $requestUrl")
|
||||
activity?.loadRepository(realUrl)
|
||||
findNavController().popBackStack()
|
||||
return true
|
||||
}
|
||||
|
||||
return super.shouldOverrideUrlLoading(view, request)
|
||||
}
|
||||
}
|
||||
web_view.settings.javaScriptEnabled = true
|
||||
web_view.settings.domStorageEnabled = true
|
||||
web_view.settings.userAgentString = USER_AGENT
|
||||
web_view.loadUrl(url)
|
||||
}
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
// Inflate the layout for this fragment
|
||||
return inflater.inflate(R.layout.fragment_webview, container, false)
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val WEBVIEW_URL = "webview_url"
|
||||
fun newInstance(webViewUrl: String) =
|
||||
Bundle().apply {
|
||||
putString(WEBVIEW_URL, webViewUrl)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -119,10 +119,12 @@ class ExtensionsFragment : Fragment() {
|
|||
}
|
||||
|
||||
list_repositories?.setOnClickListener {
|
||||
openBrowser(PUBLIC_REPOSITORIES_LIST)
|
||||
// Open webview on tv if browser fails
|
||||
val isTv = it.context.isTvSettings()
|
||||
openBrowser(PUBLIC_REPOSITORIES_LIST, isTv, this)
|
||||
|
||||
// Set clipboard on TV because the browser might not exist or work properly
|
||||
if (it.context.isTvSettings()) {
|
||||
if (isTv) {
|
||||
val serviceClipboard =
|
||||
(activity?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?)
|
||||
?: return@setOnClickListener
|
||||
|
@ -189,7 +191,9 @@ class ExtensionsFragment : Fragment() {
|
|||
}
|
||||
|
||||
dialog.list_repositories?.setOnClickListener {
|
||||
openBrowser(PUBLIC_REPOSITORIES_LIST)
|
||||
// Open webview on tv if browser fails
|
||||
val isTv = it.context.isTvSettings()
|
||||
openBrowser(PUBLIC_REPOSITORIES_LIST, isTv, this)
|
||||
}
|
||||
|
||||
// dialog.text2?.text = provider.name
|
||||
|
|
|
@ -12,6 +12,7 @@ import com.lagradost.cloudstream3.MainActivity.Companion.afterRepositoryLoadedEv
|
|||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.plugins.RepositoryManager
|
||||
import com.lagradost.cloudstream3.plugins.RepositoryManager.PREBUILT_REPOSITORIES
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
|
||||
import com.lagradost.cloudstream3.ui.settings.extensions.PUBLIC_REPOSITORIES_LIST
|
||||
import com.lagradost.cloudstream3.ui.settings.extensions.PluginsViewModel
|
||||
import com.lagradost.cloudstream3.ui.settings.extensions.RepoAdapter
|
||||
|
@ -65,7 +66,9 @@ class SetupFragmentExtensions : Fragment() {
|
|||
}).apply { updateList(repositories) }
|
||||
} else {
|
||||
list_repositories?.setOnClickListener {
|
||||
openBrowser(PUBLIC_REPOSITORIES_LIST)
|
||||
// Open webview on tv if browser fails
|
||||
val isTv = it.context.isTvSettings()
|
||||
openBrowser(PUBLIC_REPOSITORIES_LIST, isTv, this)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -87,7 +90,6 @@ class SetupFragmentExtensions : Fragment() {
|
|||
|
||||
next_btt?.setOnClickListener {
|
||||
// Continue setup
|
||||
println("ISSETUP $isSetup")
|
||||
if (isSetup)
|
||||
findNavController().navigate(R.id.action_navigation_setup_extensions_to_navigation_setup_provider_languages)
|
||||
else
|
||||
|
|
|
@ -20,12 +20,15 @@ import android.os.ParcelFileDescriptor
|
|||
import android.provider.MediaStore
|
||||
import android.text.Spanned
|
||||
import android.util.Log
|
||||
import android.widget.Toast
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.annotation.WorkerThread
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.text.HtmlCompat
|
||||
import androidx.core.text.toSpanned
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.tvprovider.media.tv.PreviewChannelHelper
|
||||
|
@ -38,16 +41,20 @@ import com.google.android.gms.cast.framework.CastState
|
|||
import com.google.android.gms.common.ConnectionResult
|
||||
import com.google.android.gms.common.GoogleApiAvailability
|
||||
import com.google.android.gms.common.wrappers.Wrappers
|
||||
import com.lagradost.cloudstream3.CommonActivity.showToast
|
||||
import com.lagradost.cloudstream3.MainActivity.Companion.afterRepositoryLoadedEvent
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.SearchResponse
|
||||
import com.lagradost.cloudstream3.isMovieType
|
||||
import com.lagradost.cloudstream3.mapper
|
||||
import com.lagradost.cloudstream3.mvvm.logError
|
||||
import com.lagradost.cloudstream3.plugins.RepositoryManager
|
||||
import com.lagradost.cloudstream3.ui.WebviewFragment
|
||||
import com.lagradost.cloudstream3.ui.result.ResultFragment
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.loadResult
|
||||
import com.lagradost.cloudstream3.ui.settings.extensions.RepositoryData
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.main
|
||||
import com.lagradost.cloudstream3.utils.FillerEpisodeCheck.toClassDir
|
||||
import com.lagradost.cloudstream3.utils.JsUnpacker.Companion.load
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.navigate
|
||||
|
@ -232,8 +239,35 @@ object AppUtils {
|
|||
)
|
||||
}
|
||||
}
|
||||
fun Activity.loadRepository(url: String) {
|
||||
ioSafe {
|
||||
val repo = RepositoryManager.parseRepository(url) ?: return@ioSafe
|
||||
RepositoryManager.addRepository(
|
||||
RepositoryData(
|
||||
repo.name,
|
||||
url
|
||||
)
|
||||
)
|
||||
main {
|
||||
showToast(
|
||||
this@loadRepository,
|
||||
getString(R.string.player_loaded_subtitles, repo.name),
|
||||
Toast.LENGTH_LONG
|
||||
)
|
||||
}
|
||||
afterRepositoryLoadedEvent.invoke(true)
|
||||
}
|
||||
}
|
||||
|
||||
fun Context.openBrowser(url: String) {
|
||||
|
||||
/**
|
||||
* If fallbackWebview is true and a fragment is supplied then it will open a webview with the url if the browser fails.
|
||||
* */
|
||||
fun Context.openBrowser(
|
||||
url: String,
|
||||
fallbackWebview: Boolean = false,
|
||||
fragment: Fragment? = null
|
||||
) {
|
||||
try {
|
||||
val intent = Intent(Intent.ACTION_VIEW)
|
||||
intent.data = Uri.parse(url)
|
||||
|
@ -241,6 +275,15 @@ object AppUtils {
|
|||
ContextCompat.startActivity(this, intent, null)
|
||||
} catch (e: Exception) {
|
||||
logError(e)
|
||||
if (fallbackWebview) {
|
||||
try {
|
||||
fragment
|
||||
?.findNavController()
|
||||
?.navigate(R.id.navigation_webview, WebviewFragment.newInstance(url))
|
||||
} catch (e: Exception) {
|
||||
logError(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -316,8 +359,8 @@ object AppUtils {
|
|||
|
||||
//private val viewModel: ResultViewModel by activityViewModels()
|
||||
|
||||
private fun getResultsId(context: Context) : Int {
|
||||
return if(context.isTrueTvSettings()) {
|
||||
private fun getResultsId(context: Context): Int {
|
||||
return if (context.isTrueTvSettings()) {
|
||||
R.id.global_to_navigation_results_tv
|
||||
} else {
|
||||
R.id.global_to_navigation_results_phone
|
||||
|
|
9
app/src/main/res/layout/fragment_webview.xml
Normal file
9
app/src/main/res/layout/fragment_webview.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/web_view"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".ui.WebviewFragment">
|
||||
|
||||
</WebView>
|
|
@ -194,6 +194,16 @@
|
|||
app:popExitAnim="@anim/exit_anim"
|
||||
tools:layout="@layout/fragment_plugins" />
|
||||
|
||||
<fragment
|
||||
android:id="@+id/navigation_webview"
|
||||
android:name="com.lagradost.cloudstream3.ui.WebviewFragment"
|
||||
android:label="@string/title_settings"
|
||||
app:enterAnim="@anim/enter_anim"
|
||||
app:exitAnim="@anim/exit_anim"
|
||||
app:popEnterAnim="@anim/enter_anim"
|
||||
app:popExitAnim="@anim/exit_anim"
|
||||
tools:layout="@layout/fragment_webview" />
|
||||
|
||||
<fragment
|
||||
android:id="@+id/navigation_settings_lang"
|
||||
android:name="com.lagradost.cloudstream3.ui.settings.SettingsLang"
|
||||
|
|
Loading…
Reference in a new issue