From 9635c95efe289e99abe6601c4d6f52afe2ab40ea Mon Sep 17 00:00:00 2001 From: Kelvin Date: Thu, 29 May 2025 13:05:00 +0200 Subject: [PATCH] WIP article --- app/src/main/assets/scripts/source.js | 14 +- .../platformplayer/activities/MainActivity.kt | 5 + .../media/platforms/js/models/JSArticle.kt | 2 +- .../main/ArticleDetailFragment.kt | 50 +++++-- .../mainactivity/main/ContentFeedView.kt | 5 + .../feedtypes/PreviewContentListAdapter.kt | 1 + .../res/layout/fragview_article_detail.xml | 125 +++++++++--------- 7 files changed, 123 insertions(+), 79 deletions(-) diff --git a/app/src/main/assets/scripts/source.js b/app/src/main/assets/scripts/source.js index 0aa817af..73e8eb56 100644 --- a/app/src/main/assets/scripts/source.js +++ b/app/src/main/assets/scripts/source.js @@ -291,15 +291,23 @@ class PlatformPostDetails extends PlatformPost { } } -class PlatformArticleDetails extends PlatformContent { +class PlatformArticle extends PlatformContent { + constructor(obj) { + super(obj, 3); + obj = obj ?? {}; + this.plugin_type = "PlatformArticle"; + this.rating = obj.rating ?? new RatingLikes(-1); + this.summary = obj.summary ?? ""; + this.thumbnails = obj.thumbnails ?? new Thumbnails([]); + } +} +class PlatformArticleDetails extends PlatformArticle { constructor(obj) { super(obj, 3); obj = obj ?? {}; this.plugin_type = "PlatformArticleDetails"; this.rating = obj.rating ?? new RatingLikes(-1); - this.summary = obj.summary ?? ""; this.segments = obj.segments ?? []; - this.thumbnails = obj.thumbnails ?? new Thumbnails([]); } } class ArticleSegment { 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 ef99642d..28c5484e 100644 --- a/app/src/main/java/com/futo/platformplayer/activities/MainActivity.kt +++ b/app/src/main/java/com/futo/platformplayer/activities/MainActivity.kt @@ -43,6 +43,7 @@ import com.futo.platformplayer.casting.StateCasting import com.futo.platformplayer.constructs.Event1 import com.futo.platformplayer.dp import com.futo.platformplayer.fragment.mainactivity.bottombar.MenuBottomBarFragment +import com.futo.platformplayer.fragment.mainactivity.main.ArticleDetailFragment import com.futo.platformplayer.fragment.mainactivity.main.BrowserFragment import com.futo.platformplayer.fragment.mainactivity.main.BuyFragment import com.futo.platformplayer.fragment.mainactivity.main.ChannelFragment @@ -151,6 +152,7 @@ class MainActivity : AppCompatActivity, IWithResultLauncher { //Frags Main lateinit var _fragMainHome: HomeFragment; lateinit var _fragPostDetail: PostDetailFragment; + lateinit var _fragArticleDetail: ArticleDetailFragment; lateinit var _fragWebDetail: WebDetailFragment; lateinit var _fragMainVideoSearchResults: ContentSearchResultsFragment; lateinit var _fragMainCreatorSearchResults: CreatorSearchResultsFragment; @@ -326,6 +328,7 @@ class MainActivity : AppCompatActivity, IWithResultLauncher { _fragMainPlaylist = PlaylistFragment.newInstance(); _fragMainRemotePlaylist = RemotePlaylistFragment.newInstance(); _fragPostDetail = PostDetailFragment.newInstance(); + _fragArticleDetail = ArticleDetailFragment.newInstance(); _fragWebDetail = WebDetailFragment.newInstance(); _fragWatchlist = WatchLaterFragment.newInstance(); _fragHistory = HistoryFragment.newInstance(); @@ -1221,6 +1224,8 @@ class MainActivity : AppCompatActivity, IWithResultLauncher { PlaylistFragment::class -> _fragMainPlaylist as T; RemotePlaylistFragment::class -> _fragMainRemotePlaylist as T; PostDetailFragment::class -> _fragPostDetail as T; + ArticleDetailFragment::class -> _fragArticleDetail as T; + WebDetailFragment::class -> _fragWebDetail as T; WatchLaterFragment::class -> _fragWatchlist as T; HistoryFragment::class -> _fragHistory as T; SourceDetailFragment::class -> _fragSourceDetail as T; diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSArticle.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSArticle.kt index 679de602..d1fb658e 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSArticle.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSArticle.kt @@ -24,7 +24,7 @@ import com.futo.platformplayer.getOrThrowNullableList import com.futo.platformplayer.states.StateDeveloper open class JSArticle : JSContent, IPlatformArticle, IPluginSourced { - final override val contentType: ContentType get() = ContentType.POST; + final override val contentType: ContentType get() = ContentType.ARTICLE; override val summary: String; override val thumbnails: Thumbnails?; diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/ArticleDetailFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/ArticleDetailFragment.kt index c27bbe0c..ae098afa 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/ArticleDetailFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/ArticleDetailFragment.kt @@ -32,6 +32,9 @@ import com.futo.platformplayer.api.media.models.ratings.IRating import com.futo.platformplayer.api.media.models.ratings.RatingLikeDislikes import com.futo.platformplayer.api.media.models.ratings.RatingLikes import com.futo.platformplayer.api.media.platforms.js.models.JSArticleDetails +import com.futo.platformplayer.api.media.platforms.js.models.JSImagesSegment +import com.futo.platformplayer.api.media.platforms.js.models.JSTextSegment +import com.futo.platformplayer.api.media.platforms.js.models.SegmentType import com.futo.platformplayer.constructs.TaskHandler import com.futo.platformplayer.dp import com.futo.platformplayer.fixHtmlWhitespace @@ -73,7 +76,7 @@ class ArticleDetailFragment : MainFragment { override val isTab: Boolean = true; override val hasBottomBar: Boolean get() = true; - private var _viewDetail: PostDetailView? = null; + private var _viewDetail: ArticleDetailView? = null; constructor() : super() { } @@ -82,7 +85,7 @@ class ArticleDetailFragment : MainFragment { } override fun onCreateMainView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { - val view = PostDetailView(inflater.context).applyFragment(this); + val view = ArticleDetailView(inflater.context).applyFragment(this); _viewDetail = view; return view; } @@ -106,7 +109,7 @@ class ArticleDetailFragment : MainFragment { } } - private class PostDetailView : ConstraintLayout { + private class ArticleDetailView : ConstraintLayout { private lateinit var _fragment: ArticleDetailFragment; private var _url: String? = null; private var _isLoading = false; @@ -124,7 +127,6 @@ class ArticleDetailFragment : MainFragment { private val _textTitle: TextView; private val _textMeta: TextView; private val _containerSegments: LinearLayout; - private val _textContent: TextView; private val _platformIndicator: PlatformIndicator; private val _buttonShare: ImageButton; @@ -141,9 +143,6 @@ class ArticleDetailFragment : MainFragment { private val _layoutLoadingOverlay: FrameLayout; private val _imageLoader: ImageView; - private val _imageActive: ImageView; - private val _layoutThumbnails: FlexboxLayout; - private val _repliesOverlay: RepliesOverlay; private val _commentsList: CommentsList; @@ -207,16 +206,12 @@ class ArticleDetailFragment : MainFragment { _layoutLoadingOverlay = findViewById(R.id.layout_loading_overlay); _imageLoader = findViewById(R.id.image_loader); - _imageActive = findViewById(R.id.image_active); - _layoutThumbnails = findViewById(R.id.layout_thumbnails); _repliesOverlay = findViewById(R.id.replies_overlay); _buttonPolycentric = findViewById(R.id.button_polycentric) _buttonPlatform = findViewById(R.id.button_platform) - _textContent.setPlatformPlayerLinkMovementMethod(context); - _buttonSubscribe.onSubscribed.subscribe { //TODO: add overlay to layout //UISlideOverlays.showSubscriptionOptionsOverlay(it, _overlayContainer); @@ -410,7 +405,7 @@ class ArticleDetailFragment : MainFragment { } } - fun applyFragment(frag: ArticleDetailFragment): PostDetailView { + fun applyFragment(frag: ArticleDetailFragment): ArticleDetailView { _fragment = frag; return this; } @@ -431,13 +426,14 @@ class ArticleDetailFragment : MainFragment { setChannelMeta(null); _textTitle.text = ""; _textMeta.text = ""; - _textContent.text = ""; setPlatformRating(null); _polycentricProfile = null; _rating.visibility = View.GONE; updatePolycentricRating(); setRepliesOverlayVisible(isVisible = false, animate = false); + _containerSegments.removeAllViews(); + _addCommentView.setContext(null, null); _platformIndicator.clearPlatform(); } @@ -457,6 +453,22 @@ class ArticleDetailFragment : MainFragment { _platformIndicator.setPlatformFromClientID(value.id.pluginId); setPlatformRating(value.rating); + for(seg in value.segments) { + when(seg.type) { + SegmentType.TEXT -> { + if(seg is JSTextSegment) { + + } + } + SegmentType.IMAGES -> { + if(seg is JSImagesSegment) { + + } + } + else ->{} + } + } + //Fetch only when not already called in setPostOverview if (_articleOverview == null) { fetchPolycentricProfile(); @@ -647,6 +659,18 @@ class ArticleDetailFragment : MainFragment { } } + class ArticleTextBlock : View { + constructor(context: Context?) : super(context){ + + } + } + class ArticleImageBlock: View { + constructor(context: Context?) : super(context){ + + } + } + + companion object { const val TAG = "PostDetailFragment" } 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 76103d4a..84c5a929 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 @@ -10,6 +10,7 @@ import com.futo.platformplayer.R import com.futo.platformplayer.Settings import com.futo.platformplayer.UIDialogs import com.futo.platformplayer.UISlideOverlays +import com.futo.platformplayer.api.media.models.article.IPlatformArticle import com.futo.platformplayer.api.media.models.contents.ContentType import com.futo.platformplayer.api.media.models.contents.IPlatformContent import com.futo.platformplayer.api.media.models.playlists.IPlatformPlaylist @@ -196,7 +197,11 @@ abstract class ContentFeedView : FeedView(content); } else if (content is IPlatformPost) { fragment.navigate(content); + } else if(content is IPlatformArticle) { + fragment.navigate(content); } + else + UIDialogs.appToast("Unknown content type [" + content.contentType.name + "]"); } protected open fun onContentUrlClicked(url: String, contentType: ContentType) { when(contentType) { 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 35dd2d7b..84ad2761 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 @@ -79,6 +79,7 @@ class PreviewContentListAdapter : InsertedViewAdapterWithLoader createPlaceholderViewHolder(viewGroup); ContentType.MEDIA -> createVideoPreviewViewHolder(viewGroup); + ContentType.ARTICLE -> createPostViewHolder(viewGroup); ContentType.POST -> createPostViewHolder(viewGroup); ContentType.PLAYLIST -> createPlaylistViewHolder(viewGroup); ContentType.NESTED_VIDEO -> createNestedViewHolder(viewGroup); diff --git a/app/src/main/res/layout/fragview_article_detail.xml b/app/src/main/res/layout/fragview_article_detail.xml index 16bade8d..c98f5daf 100644 --- a/app/src/main/res/layout/fragview_article_detail.xml +++ b/app/src/main/res/layout/fragview_article_detail.xml @@ -16,68 +16,6 @@ android:layout_height="wrap_content" android:orientation="vertical"> - - - - - - - - - - - - - - + + + + + + + + + + + + + +