From 5bb3466ffee4158b81ca3141725e8200e9f00ecc Mon Sep 17 00:00:00 2001 From: Kelvin Date: Thu, 29 May 2025 18:02:55 +0200 Subject: [PATCH] Web support, additional article support --- app/src/main/assets/scripts/source.js | 16 +++++++++ .../platformplayer/activities/MainActivity.kt | 2 ++ .../platforms/js/models/IJSContentDetails.kt | 1 + .../api/media/platforms/js/models/JSWeb.kt | 2 +- .../mainactivity/main/ContentFeedView.kt | 4 +++ .../mainactivity/main/WebDetailFragment.kt | 36 +++++++++++++++++++ .../feedtypes/PreviewContentListAdapter.kt | 1 + .../adapters/feedtypes/PreviewPostView.kt | 6 ++++ 8 files changed, 67 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/scripts/source.js b/app/src/main/assets/scripts/source.js index 01dcde6a..0e48d174 100644 --- a/app/src/main/assets/scripts/source.js +++ b/app/src/main/assets/scripts/source.js @@ -292,6 +292,22 @@ class PlatformPostDetails extends PlatformPost { } } +class PlatformWeb extends PlatformContent { + constructor(obj) { + super(obj, 7); + obj = obj ?? {}; + this.plugin_type = "PlatformWeb"; + } +} +class PlatformWebDetails extends PlatformWeb { + constructor(obj) { + super(obj, 7); + obj = obj ?? {}; + this.plugin_type = "PlatformWebDetails"; + this.html = obj.html; + } +} + class PlatformArticle extends PlatformContent { constructor(obj) { super(obj, 3); diff --git a/app/src/main/java/com/futo/platformplayer/activities/MainActivity.kt b/app/src/main/java/com/futo/platformplayer/activities/MainActivity.kt index b24fa419..bf7d238a 100644 --- a/app/src/main/java/com/futo/platformplayer/activities/MainActivity.kt +++ b/app/src/main/java/com/futo/platformplayer/activities/MainActivity.kt @@ -455,6 +455,8 @@ class MainActivity : AppCompatActivity, IWithResultLauncher { _fragMainPlaylist.topBar = _fragTopBarNavigation; _fragMainRemotePlaylist.topBar = _fragTopBarNavigation; _fragPostDetail.topBar = _fragTopBarNavigation; + _fragArticleDetail.topBar = _fragTopBarNavigation; + _fragWebDetail.topBar = _fragTopBarNavigation; _fragWatchlist.topBar = _fragTopBarNavigation; _fragHistory.topBar = _fragTopBarNavigation; _fragSourceDetail.topBar = _fragTopBarNavigation; diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/IJSContentDetails.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/IJSContentDetails.kt index 04382057..21b475ff 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/IJSContentDetails.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/IJSContentDetails.kt @@ -17,6 +17,7 @@ interface IJSContentDetails: IPlatformContent { ContentType.MEDIA -> JSVideoDetails(plugin, obj); ContentType.POST -> JSPostDetails(plugin.config, obj); ContentType.ARTICLE -> JSArticleDetails(plugin, obj); + ContentType.WEB -> JSWebDetails(plugin, obj); else -> throw NotImplementedError("Unknown content type ${type}"); } } diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSWeb.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSWeb.kt index 9f68293f..49f6fbeb 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSWeb.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSWeb.kt @@ -23,7 +23,7 @@ import com.futo.platformplayer.getOrThrowNullableList import com.futo.platformplayer.states.StateDeveloper open class JSWeb : JSContent, IPluginSourced { - final override val contentType: ContentType get() = ContentType.POST; + final override val contentType: ContentType get() = ContentType.WEB; constructor(config: SourcePluginConfig, obj: V8ValueObject): super(config, obj) { val contextName = "PlatformWeb"; diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/ContentFeedView.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/ContentFeedView.kt index 84c5a929..cc528a2b 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/ContentFeedView.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/ContentFeedView.kt @@ -17,6 +17,7 @@ import com.futo.platformplayer.api.media.models.playlists.IPlatformPlaylist import com.futo.platformplayer.api.media.models.post.IPlatformPost import com.futo.platformplayer.api.media.models.video.IPlatformVideo import com.futo.platformplayer.api.media.models.video.SerializedPlatformVideo +import com.futo.platformplayer.api.media.platforms.js.models.JSWeb import com.futo.platformplayer.api.media.structures.IPager import com.futo.platformplayer.logging.Logger import com.futo.platformplayer.states.StateMeta @@ -200,6 +201,9 @@ abstract class ContentFeedView : FeedView(content); } + else if(content is JSWeb) { + fragment.navigate(content); + } else UIDialogs.appToast("Unknown content type [" + content.contentType.name + "]"); } diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/WebDetailFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/WebDetailFragment.kt index a3dd1dba..8aa1eec2 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/WebDetailFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/WebDetailFragment.kt @@ -26,6 +26,7 @@ import com.futo.platformplayer.Settings import com.futo.platformplayer.UIDialogs import com.futo.platformplayer.api.media.PlatformID import com.futo.platformplayer.api.media.models.Thumbnails +import com.futo.platformplayer.api.media.models.article.IPlatformArticleDetails import com.futo.platformplayer.api.media.models.comments.PolycentricPlatformComment import com.futo.platformplayer.api.media.models.post.IPlatformPost import com.futo.platformplayer.api.media.models.post.IPlatformPostDetails @@ -99,6 +100,10 @@ class WebDetailFragment : MainFragment { override fun onShownWithView(parameter: Any?, isBack: Boolean) { super.onShownWithView(parameter, isBack); + if (parameter is JSWeb) { + _viewDetail?.clear(); + _viewDetail?.setWeb(parameter); + } if (parameter is JSWebDetails) { _viewDetail?.clear(); _viewDetail?.setWebDetails(parameter); @@ -116,6 +121,20 @@ class WebDetailFragment : MainFragment { private val _webview: WebView; + private val _taskLoadPost = if(!isInEditMode) TaskHandler( + StateApp.instance.scopeGetter, + { + val result = StatePlatform.instance.getContentDetails(it).await(); + if(result !is JSWebDetails) + throw IllegalStateException(context.getString(R.string.expected_media_content_found) + " ${result.contentType}"); + return@TaskHandler result; + }) + .success { setWebDetails(it) } + .exception { + Logger.w(ChannelFragment.TAG, context.getString(R.string.failed_to_load_post), it); + UIDialogs.showGeneralRetryErrorDialog(context, context.getString(R.string.failed_to_load_post), it, ::fetchPost, null, _fragment); + } else TaskHandler(IPlatformPostDetails::class.java) { _fragment.lifecycleScope }; + constructor(context: Context) : super(context) { inflate(context, R.layout.fragview_web_detail, this); @@ -145,6 +164,12 @@ class WebDetailFragment : MainFragment { _webview.loadUrl("about:blank"); } + fun setWeb(value: JSWeb) { + _url = value.url; + setLoading(true); + clear(); + fetchPost(); + } fun setWebDetails(value: JSWebDetails) { _web = value; setLoading(true); @@ -155,6 +180,17 @@ class WebDetailFragment : MainFragment { _webview.loadUrl(value.url ?: "about:blank"); } + private fun fetchPost() { + Logger.i(WebDetailView.TAG, "fetchWeb") + _web = null; + + val url = _url; + if (!url.isNullOrBlank()) { + setLoading(true); + _taskLoadPost.run(url); + } + } + fun onDestroy() { _webview.loadUrl("about:blank"); } diff --git a/app/src/main/java/com/futo/platformplayer/views/adapters/feedtypes/PreviewContentListAdapter.kt b/app/src/main/java/com/futo/platformplayer/views/adapters/feedtypes/PreviewContentListAdapter.kt index 84ad2761..327497fb 100644 --- a/app/src/main/java/com/futo/platformplayer/views/adapters/feedtypes/PreviewContentListAdapter.kt +++ b/app/src/main/java/com/futo/platformplayer/views/adapters/feedtypes/PreviewContentListAdapter.kt @@ -80,6 +80,7 @@ class PreviewContentListAdapter : InsertedViewAdapterWithLoader createPlaceholderViewHolder(viewGroup); ContentType.MEDIA -> createVideoPreviewViewHolder(viewGroup); ContentType.ARTICLE -> createPostViewHolder(viewGroup); + ContentType.WEB -> createPostViewHolder(viewGroup); ContentType.POST -> createPostViewHolder(viewGroup); ContentType.PLAYLIST -> createPlaylistViewHolder(viewGroup); ContentType.NESTED_VIDEO -> createNestedViewHolder(viewGroup); diff --git a/app/src/main/java/com/futo/platformplayer/views/adapters/feedtypes/PreviewPostView.kt b/app/src/main/java/com/futo/platformplayer/views/adapters/feedtypes/PreviewPostView.kt index 4422a5c8..6c2b09cf 100644 --- a/app/src/main/java/com/futo/platformplayer/views/adapters/feedtypes/PreviewPostView.kt +++ b/app/src/main/java/com/futo/platformplayer/views/adapters/feedtypes/PreviewPostView.kt @@ -25,6 +25,7 @@ import com.futo.platformplayer.api.media.models.article.IPlatformArticle import com.futo.platformplayer.api.media.models.contents.IPlatformContent import com.futo.platformplayer.api.media.models.post.IPlatformPost import com.futo.platformplayer.api.media.models.post.IPlatformPostDetails +import com.futo.platformplayer.api.media.platforms.js.models.JSWeb import com.futo.platformplayer.constructs.Event1 import com.futo.platformplayer.constructs.TaskHandler import com.futo.platformplayer.dp @@ -147,6 +148,11 @@ class PreviewPostView : LinearLayout { content.summary ?: "" else "" + } else if(content is JSWeb) { + if(!content.url.isNullOrEmpty()) + "WEB:" + content.url + else + "" } else ""; if (content.name.isNullOrEmpty()) {