diff --git a/WordPress/build.gradle b/WordPress/build.gradle index fd7eb641d383..bca68ced51e8 100644 --- a/WordPress/build.gradle +++ b/WordPress/build.gradle @@ -190,7 +190,6 @@ android { buildConfigField "boolean", "CONTACT_SUPPORT_CHATBOT", "false" buildConfigField "boolean", "ENABLE_DOMAIN_MANAGEMENT_FEATURE", "false" buildConfigField "boolean", "PLANS_IN_SITE_CREATION", "false" - buildConfigField "boolean", "READER_IMPROVEMENTS", "false" buildConfigField "boolean", "BLOGANUARY_DASHBOARD_NUDGE", "false" buildConfigField "boolean", "DYNAMIC_DASHBOARD_CARDS", "false" buildConfigField "boolean", "STATS_TRAFFIC_SUBSCRIBERS_TABS", "false" diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt index 12898f1f38de..47c381deb1a1 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt @@ -53,7 +53,6 @@ import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.CollapsingToolbarLayout import com.google.android.material.behavior.HideBottomViewOnScrollBehavior import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.google.android.material.elevation.ElevationOverlayProvider import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import org.greenrobot.eventbus.EventBus @@ -64,7 +63,6 @@ import org.wordpress.android.WordPress import org.wordpress.android.analytics.AnalyticsTracker import org.wordpress.android.databinding.ReaderFragmentPostDetailBinding import org.wordpress.android.databinding.ReaderIncludePostDetailFooterBinding -import org.wordpress.android.databinding.ReaderIncludePostDetailFooterNewBinding import org.wordpress.android.datasets.ReaderPostTable import org.wordpress.android.fluxc.Dispatcher import org.wordpress.android.fluxc.generated.SiteActionBuilder @@ -145,7 +143,6 @@ import org.wordpress.android.util.WPPermissionUtils.READER_FILE_DOWNLOAD_PERMISS import org.wordpress.android.util.WPSwipeToRefreshHelper.buildSwipeToRefreshHelper import org.wordpress.android.util.config.CommentsSnippetFeatureConfig import org.wordpress.android.util.config.LikesEnhancementsFeatureConfig -import org.wordpress.android.util.config.ReaderImprovementsFeatureConfig import org.wordpress.android.util.config.ReaderReadingPreferencesFeatureConfig import org.wordpress.android.util.extensions.getColorFromAttribute import org.wordpress.android.util.extensions.getParcelableCompat @@ -283,9 +280,6 @@ class ReaderPostDetailFragment : ViewPagerFragment(), @Inject lateinit var jetpackBrandingUtils: JetpackBrandingUtils - @Inject - lateinit var readerImprovementsFeatureConfig: ReaderImprovementsFeatureConfig - @Inject lateinit var readingPreferencesFeatureConfig: ReaderReadingPreferencesFeatureConfig @@ -484,31 +478,15 @@ class ReaderPostDetailFragment : ViewPagerFragment(), } private fun initLayoutFooter(view: View) { - val isReaderImprovementsEnabled = readerImprovementsFeatureConfig.isEnabled() view.findViewById(R.id.layout_post_detail_footer).apply { - layoutResource = if (isReaderImprovementsEnabled) { - R.layout.reader_include_post_detail_footer_new - } else { - R.layout.reader_include_post_detail_footer - } + layoutResource = R.layout.reader_include_post_detail_footer setOnInflateListener { _, inflated -> - layoutFooterBinding = if (isReaderImprovementsEnabled) { - ReaderIncludePostDetailFooterNewBinding.bind(inflated).mapBinding().apply { + layoutFooterBinding = ReaderIncludePostDetailFooterBinding.bind(inflated).mapBinding().apply { // the new bar should hide on scroll val params = root.layoutParams as CoordinatorLayout.LayoutParams params.behavior = HideBottomViewOnScrollBehavior() } - } else { - ReaderIncludePostDetailFooterBinding.bind(inflated).mapBinding().apply { - // the old bar should have the elevated surface color background - val elevationOverlayProvider = ElevationOverlayProvider(root.context) - val appbarElevation = resources.getDimension(R.dimen.appbar_elevation) - val elevatedSurfaceColor = elevationOverlayProvider - .compositeOverlayWithThemeSurfaceColorIfNeeded(appbarElevation) - root.setBackgroundColor(elevatedSurfaceColor) - } - } layoutFooterBinding.root.isInvisible = true } }.also { stub -> @@ -1891,15 +1869,6 @@ class ReaderPostDetailFragment : ViewPagerFragment(), ) private fun ReaderIncludePostDetailFooterBinding.mapBinding(): PostDetailFooterBarBinding = - PostDetailFooterBarBinding( - root, - bookmark, - reblog, - countComments, - countLikes, - ) - - private fun ReaderIncludePostDetailFooterNewBinding.mapBinding(): PostDetailFooterBarBinding = PostDetailFooterBarBinding( root, bookmark, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.java index d909695c455f..2553203b9a16 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.java @@ -137,7 +137,6 @@ import org.wordpress.android.util.StringUtils; import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.WPActivityUtils; -import org.wordpress.android.util.config.ReaderImprovementsFeatureConfig; import org.wordpress.android.util.config.SeenUnseenWithCounterFeatureConfig; import org.wordpress.android.util.image.ImageManager; import org.wordpress.android.widgets.AppReviewManager; @@ -186,7 +185,6 @@ public class ReaderPostListFragment extends ViewPagerFragment @Inject ReaderTracker mReaderTracker; @Inject SnackbarSequencer mSnackbarSequencer; @Inject DisplayUtilsWrapper mDisplayUtilsWrapper; - @Inject ReaderImprovementsFeatureConfig mReaderImprovementsFeatureConfig; private ReaderPostAdapter mPostAdapter; private ReaderSiteSearchAdapter mSiteSearchAdapter; private ReaderSearchSuggestionAdapter mSearchSuggestionAdapter; @@ -1067,27 +1065,20 @@ public void onShowCustomEmptyView(EmptyViewMessageType emptyViewMsgType) { } }); - // set the background color as we have different colors for the new and legacy designs that are not easy to - // change via styles, because of the FeatureConfig logic - int backgroundColor = mReaderImprovementsFeatureConfig.isEnabled() - ? R.color.reader_post_list_background_new - : R.color.reader_post_list_background; - mRecyclerView.setBackgroundColor(ContextCompat.getColor(requireContext(), backgroundColor)); + mRecyclerView.setBackgroundColor(ContextCompat.getColor( + requireContext(), R.color.reader_post_list_background) + ); // add the item decoration (dividers) to the recycler, skipping the first item if the first // item is the tag toolbar (shown when viewing posts in followed tags) - this is to avoid // having the tag toolbar take up more vertical space than necessary - int spacingVerticalRes = mReaderImprovementsFeatureConfig.isEnabled() - ? R.dimen.reader_card_gutters_new - : R.dimen.reader_card_gutters; + int spacingVerticalRes = R.dimen.reader_card_gutters; int spacingHorizontal = getResources().getDimensionPixelSize(R.dimen.reader_card_margin); int spacingVertical = getResources().getDimensionPixelSize(spacingVerticalRes); mRecyclerView.addItemDecoration(new RecyclerItemDecoration(spacingHorizontal, spacingVertical, false)); - // add a proper item divider to the RecyclerView when Reader Improvements are enabled - if (mReaderImprovementsFeatureConfig.isEnabled()) { - mRecyclerView.addItemDivider(R.drawable.default_list_divider); - } + // add a proper item divider to the RecyclerView + mRecyclerView.addItemDivider(R.drawable.default_list_divider); mRecyclerView.setToolbarBackgroundColor(0); mRecyclerView.setToolbarSpinnerDrawable(R.drawable.ic_dropdown_primary_30_24dp); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java index cb54da2c3dde..5f17855b93e5 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java @@ -40,13 +40,11 @@ import org.wordpress.android.ui.reader.actions.ReaderActions; import org.wordpress.android.ui.reader.actions.ReaderTagActions; import org.wordpress.android.ui.reader.discover.ReaderCardUiState; -import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderPostNewUiState; import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderPostUiState; import org.wordpress.android.ui.reader.discover.ReaderPostCardActionType; import org.wordpress.android.ui.reader.discover.ReaderPostMoreButtonUiStateBuilder; import org.wordpress.android.ui.reader.discover.ReaderPostUiStateBuilder; import org.wordpress.android.ui.reader.discover.viewholders.ReaderPostNewViewHolder; -import org.wordpress.android.ui.reader.discover.viewholders.ReaderPostViewHolder; import org.wordpress.android.ui.reader.models.ReaderBlogIdPostId; import org.wordpress.android.ui.reader.utils.ReaderAnnouncementHelper; import org.wordpress.android.ui.reader.tracker.ReaderTab; @@ -68,7 +66,6 @@ import org.wordpress.android.util.NetworkUtilsWrapper; import org.wordpress.android.util.SiteUtils; import org.wordpress.android.util.ToastUtils; -import org.wordpress.android.util.config.ReaderImprovementsFeatureConfig; import org.wordpress.android.util.extensions.ContextExtensionsKt; import org.wordpress.android.util.image.BlavatarShape; import org.wordpress.android.util.image.ImageManager; @@ -136,7 +133,6 @@ public class ReaderPostAdapter extends RecyclerView.Adapter onButtonClicked = - (postId, blogId, type) -> { - mOnPostListItemButtonListener.onButtonClicked(post, type); - renderPost(position, holder, false); - return Unit.INSTANCE; - }; - Function2 onItemClicked = (postId, blogId) -> { - if (mPostSelectedListener != null) { - mPostSelectedListener.onPostSelected(post); - } - return Unit.INSTANCE; - }; - Function1 onItemRendered = (item) -> { - checkLoadMore(position); - - // if we haven't already rendered this post and it has a "railcar" attached to it, add it - // to the rendered list and record the TrainTracks render event - if (post.hasRailcar() && !mRenderedIds.contains(post.getPseudoId())) { - mRenderedIds.add(post.getPseudoId()); - mReaderTracker.trackRailcar(post.getRailcarJson()); - } - return Unit.INSTANCE; - }; - Function2 onDiscoverSectionClicked = (postId, blogId) -> { - ReaderPostDiscoverData discoverData = post.getDiscoverData(); - switch (discoverData.getDiscoverType()) { - case EDITOR_PICK: - if (mPostSelectedListener != null) { - mPostSelectedListener.onPostSelected(post); - } - break; - case SITE_PICK: - if (discoverData.getBlogId() != 0) { - ReaderActivityLauncher.showReaderBlogPreview( - ctx, - discoverData.getBlogId(), - post.isFollowedByCurrentUser, - mSource, - mReaderTracker - ); - } else if (discoverData.hasBlogUrl()) { - ReaderActivityLauncher.openUrl(ctx, discoverData.getBlogUrl()); - } - break; - case OTHER: - // noop - break; - } - return Unit.INSTANCE; - }; - Function1 onMoreButtonClicked = (uiState) -> { - renderPost(position, holder, true); - return Unit.INSTANCE; - }; - - Function1 onMoreDismissed = (uiState) -> { - renderPost(position, holder, false); - return Unit.INSTANCE; - }; - - Function2 onVideoOverlayClicked = (postId, blogId) -> { - ReaderActivityLauncher.showReaderVideoViewer(ctx, post.getFeaturedVideo()); - return Unit.INSTANCE; - }; - - Function0 onPostHeaderClicked = () -> { - ReaderActivityLauncher.showReaderBlogPreview( - ctx, - post, - mSource, - mReaderTracker - ); - return Unit.INSTANCE; - }; - - Function1 onTagItemClicked = (tagSlug) -> { - // noop - return Unit.INSTANCE; - }; - - ReaderPostUiState uiState = mReaderPostUiStateBuilder - .mapPostToUiStateBlocking( - mSource, - post, - false, - mPhotonWidth, - mPhotonHeight, - postListType, - onButtonClicked, - onItemClicked, - onItemRendered, - onDiscoverSectionClicked, - onMoreButtonClicked, - onMoreDismissed, - onVideoOverlayClicked, - onPostHeaderClicked, - onTagItemClicked, - showMoreMenu ? mReaderPostMoreButtonUiStateBuilder - .buildMoreMenuItemsBlocking(post, false, false, onButtonClicked) : null - ); - holder.onBind(uiState); - } - // TODO update the viewholder to the new one private void renderPostNew(final int position, final ReaderPostNewViewHolder holder, boolean showMoreMenu) { final ReaderPost post = getItem(position); @@ -626,12 +507,12 @@ private void renderPostNew(final int position, final ReaderPostNewViewHolder hol } return Unit.INSTANCE; }; - Function1 onMoreButtonClicked = (uiState) -> { + Function1 onMoreButtonClicked = (uiState) -> { renderPostNew(position, holder, true); return Unit.INSTANCE; }; - Function1 onMoreDismissed = (uiState) -> { + Function1 onMoreDismissed = (uiState) -> { renderPostNew(position, holder, false); return Unit.INSTANCE; }; @@ -651,8 +532,8 @@ private void renderPostNew(final int position, final ReaderPostNewViewHolder hol return Unit.INSTANCE; }; - ReaderPostNewUiState uiState = mReaderPostUiStateBuilder - .mapPostToNewUiStateBlocking( + ReaderPostUiState uiState = mReaderPostUiStateBuilder + .mapPostToUiStateBlocking( mSource, post, mPhotonWidth, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderCardUiState.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderCardUiState.kt index 6549e88cfe85..a8a9084605cd 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderCardUiState.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderCardUiState.kt @@ -1,16 +1,13 @@ package org.wordpress.android.ui.reader.discover -import android.text.Spanned import androidx.annotation.AttrRes import androidx.annotation.ColorRes import androidx.annotation.DrawableRes import org.wordpress.android.R import org.wordpress.android.ui.reader.discover.ReaderPostCardAction.PrimaryAction import org.wordpress.android.ui.reader.discover.ReaderPostCardActionType.SPACER_NO_ACTION -import org.wordpress.android.ui.reader.discover.interests.TagUiState import org.wordpress.android.ui.reader.models.ReaderImageList import org.wordpress.android.ui.reader.views.compose.ReaderAnnouncementCardItemData -import org.wordpress.android.ui.reader.views.uistates.ReaderBlogSectionUiState import org.wordpress.android.ui.utils.UiDimen import org.wordpress.android.ui.utils.UiString import org.wordpress.android.ui.utils.UiString.UiStringRes @@ -18,51 +15,6 @@ import org.wordpress.android.util.image.ImageType sealed class ReaderCardUiState { data class ReaderPostUiState( - val source: String, - val postId: Long, - val blogId: Long, - val feedId: Long, - val isFollowed: Boolean, - val blogSection: ReaderBlogSectionUiState, - val title: UiString?, - val excerpt: String?, // mTxtText - val tagItems: List, - val photoTitle: String?, - val featuredImageUrl: String?, - val featuredImageCornerRadius: UiDimen, - val fullVideoUrl: String?, - val thumbnailStripSection: GalleryThumbnailStripData?, - val discoverSection: DiscoverLayoutUiState?, - val expandableTagsViewVisibility: Boolean, - val videoOverlayVisibility: Boolean, - val featuredImageVisibility: Boolean, - val moreMenuVisibility: Boolean, - val bookmarkAction: PrimaryAction, - val likeAction: PrimaryAction, - val reblogAction: PrimaryAction, - val commentsAction: PrimaryAction, - val moreMenuItems: List? = null, - val onItemClicked: (Long, Long) -> Unit, - val onItemRendered: (ReaderCardUiState) -> Unit, - val onMoreButtonClicked: (ReaderPostUiState) -> Unit, - val onMoreDismissed: (ReaderPostUiState) -> Unit, - val onVideoOverlayClicked: (Long, Long) -> Unit - ) : ReaderCardUiState() { - data class GalleryThumbnailStripData( - val images: ReaderImageList, - val isPrivate: Boolean, - val content: String // needs to be here as it's required by ReaderThumbnailStrip - ) - - data class DiscoverLayoutUiState( - val discoverText: Spanned, - val discoverAvatarUrl: String, - val imageType: ImageType, - val onDiscoverClicked: ((Long, Long) -> Unit) - ) - } - - data class ReaderPostNewUiState( val source: String, val postId: Long, val blogId: Long, @@ -75,7 +27,7 @@ sealed class ReaderCardUiState { val featuredImageUrl: String?, val featuredImageCornerRadius: UiDimen, val fullVideoUrl: String?, - val thumbnailStripSection: ReaderPostUiState.GalleryThumbnailStripData?, + val thumbnailStripSection: GalleryThumbnailStripData?, val videoOverlayVisibility: Boolean, val featuredImageVisibility: Boolean, val moreMenuVisibility: Boolean, @@ -84,9 +36,9 @@ sealed class ReaderCardUiState { val commentsAction: PrimaryAction, val moreMenuItems: List? = null, val onItemClicked: (Long, Long) -> Unit, - val onItemRendered: (ReaderPostNewUiState) -> Unit, - val onMoreButtonClicked: (ReaderPostNewUiState) -> Unit, - val onMoreDismissed: (ReaderPostNewUiState) -> Unit, + val onItemRendered: (ReaderPostUiState) -> Unit, + val onMoreButtonClicked: (ReaderPostUiState) -> Unit, + val onMoreDismissed: (ReaderPostUiState) -> Unit, val onVideoOverlayClicked: (Long, Long) -> Unit, ) : ReaderCardUiState() { data class CompactBlogSectionData( @@ -105,6 +57,12 @@ sealed class ReaderCardUiState { val likeCount: Int, val commentCount: Int, ) + + data class GalleryThumbnailStripData( + val images: ReaderImageList, + val isPrivate: Boolean, + val content: String // needs to be here as it's required by ReaderThumbnailStrip + ) } data class ReaderInterestsCardUiState(val interest: List) : ReaderCardUiState() { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverAdapter.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverAdapter.kt index c6a5f2d409ec..3bd85c385421 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverAdapter.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverAdapter.kt @@ -5,16 +5,12 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView.Adapter import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderAnnouncementCardUiState import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderInterestsCardUiState -import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderPostNewUiState import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderPostUiState import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderRecommendedBlogsCardUiState import org.wordpress.android.ui.reader.discover.viewholders.ReaderAnnouncementCardViewHolder -import org.wordpress.android.ui.reader.discover.viewholders.ReaderInterestsCardNewViewHolder import org.wordpress.android.ui.reader.discover.viewholders.ReaderInterestsCardViewHolder import org.wordpress.android.ui.reader.discover.viewholders.ReaderPostNewViewHolder -import org.wordpress.android.ui.reader.discover.viewholders.ReaderPostViewHolder import org.wordpress.android.ui.reader.discover.viewholders.ReaderRecommendedBlogsCardNewViewHolder -import org.wordpress.android.ui.reader.discover.viewholders.ReaderRecommendedBlogsCardViewHolder import org.wordpress.android.ui.reader.discover.viewholders.ReaderViewHolder import org.wordpress.android.ui.reader.tracker.ReaderTracker import org.wordpress.android.ui.utils.HideItemDivider @@ -22,7 +18,6 @@ import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.NetworkUtilsWrapper import org.wordpress.android.util.image.ImageManager -private const val POST_VIEW_TYPE: Int = 1 private const val INTEREST_VIEW_TYPE: Int = 2 private const val RECOMMENDED_BLOGS_VIEW_TYPE: Int = 3 private const val POST_NEW_VIEW_TYPE: Int = 4 @@ -33,12 +28,10 @@ class ReaderDiscoverAdapter( private val imageManager: ImageManager, private val readerTracker: ReaderTracker, private val networkUtilsWrapper: NetworkUtilsWrapper, - private val isReaderImprovementsEnabled: Boolean, ) : Adapter>() { private val items = mutableListOf() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ReaderViewHolder<*> { return when (viewType) { - POST_VIEW_TYPE -> ReaderPostViewHolder(uiHelpers, imageManager, readerTracker, parent) POST_NEW_VIEW_TYPE -> ReaderPostNewViewHolder( uiHelpers, imageManager, @@ -47,24 +40,9 @@ class ReaderDiscoverAdapter( parent ) - INTEREST_VIEW_TYPE -> { - if (isReaderImprovementsEnabled) { - ReaderInterestsCardNewViewHolder(uiHelpers, parent) - } else { - ReaderInterestsCardViewHolder(uiHelpers, parent) - } - } + INTEREST_VIEW_TYPE -> ReaderInterestsCardViewHolder(uiHelpers, parent) - RECOMMENDED_BLOGS_VIEW_TYPE -> - if (isReaderImprovementsEnabled) { - ReaderRecommendedBlogsCardNewViewHolder( - parent, imageManager - ) - } else { - ReaderRecommendedBlogsCardViewHolder( - parent, imageManager, uiHelpers - ) - } + RECOMMENDED_BLOGS_VIEW_TYPE -> ReaderRecommendedBlogsCardNewViewHolder(parent, imageManager) READER_ANNOUNCEMENT_TYPE -> ReaderAnnouncementCardViewHolder(parent) @@ -75,15 +53,13 @@ class ReaderDiscoverAdapter( override fun getItemCount(): Int = items.size override fun onBindViewHolder(holder: ReaderViewHolder<*>, position: Int) { - if (isReaderImprovementsEnabled) { - // hide the item divider by setting the HideItemDivider object as view tag, which is used by the - // DividerItemDecorator to skip drawing the bottom divider for the item. It should be hidden for any - // recommendation cards and cards above them. - val nextPosition = position + 1 - val shouldHideDivider = isRecommendationCard(position) || - (nextPosition < itemCount && isRecommendationCard(nextPosition)) - holder.itemView.tag = HideItemDivider.takeIf { shouldHideDivider } - } + // hide the item divider by setting the HideItemDivider object as view tag, which is used by the + // DividerItemDecorator to skip drawing the bottom divider for the item. It should be hidden for any + // recommendation cards and cards above them. + val nextPosition = position + 1 + val shouldHideDivider = isRecommendationCard(position) || + (nextPosition < itemCount && isRecommendationCard(nextPosition)) + holder.itemView.tag = HideItemDivider.takeIf { shouldHideDivider } holder.onBind(items[position]) } @@ -97,8 +73,7 @@ class ReaderDiscoverAdapter( override fun getItemViewType(position: Int): Int { return when (items[position]) { - is ReaderPostUiState -> POST_VIEW_TYPE - is ReaderPostNewUiState -> POST_NEW_VIEW_TYPE + is ReaderPostUiState -> POST_NEW_VIEW_TYPE is ReaderInterestsCardUiState -> INTEREST_VIEW_TYPE is ReaderRecommendedBlogsCardUiState -> RECOMMENDED_BLOGS_VIEW_TYPE is ReaderAnnouncementCardUiState -> READER_ANNOUNCEMENT_TYPE @@ -125,10 +100,6 @@ class ReaderDiscoverAdapter( oldItem.postId == (newItem as ReaderPostUiState).postId && oldItem.blogId == newItem.blogId } - is ReaderPostNewUiState -> { - oldItem.postId == (newItem as ReaderPostNewUiState).postId && oldItem.blogId == newItem.blogId - } - is ReaderRecommendedBlogsCardUiState -> { val newItemState = newItem as? ReaderRecommendedBlogsCardUiState oldItem.blogs.map { it.blogId to it.feedId } == newItemState?.blogs?.map { it.blogId to it.feedId } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverFragment.kt index 6bc60f163672..cb2d69a87876 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverFragment.kt @@ -49,7 +49,6 @@ import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.ui.utils.addItemDivider import org.wordpress.android.util.NetworkUtilsWrapper import org.wordpress.android.util.WPSwipeToRefreshHelper -import org.wordpress.android.util.config.ReaderImprovementsFeatureConfig import org.wordpress.android.util.image.ImageManager import org.wordpress.android.viewmodel.observeEvent import org.wordpress.android.widgets.RecyclerItemDecoration @@ -80,9 +79,6 @@ class ReaderDiscoverFragment : ViewPagerFragment(R.layout.reader_discover_fragme private lateinit var parentViewModel: ReaderViewModel - @Inject - lateinit var readerImprovementsFeatureConfig: ReaderImprovementsFeatureConfig - private var binding: ReaderDiscoverFragmentLayoutBinding? = null override fun onCreate(savedInstanceState: Bundle?) { @@ -100,31 +96,20 @@ class ReaderDiscoverFragment : ViewPagerFragment(R.layout.reader_discover_fragme imageManager, readerTracker, networkUtilsWrapper, - readerImprovementsFeatureConfig.isEnabled() ) // set the background color as we have different colors for the new and legacy designs that are not easy to // change via styles, because of the FeatureConfig logic - val backgroundColor = if (readerImprovementsFeatureConfig.isEnabled()) { - R.color.reader_post_list_background_new - } else { - R.color.reader_post_list_background - } + val backgroundColor = R.color.reader_post_list_background recyclerView.setBackgroundColor(ContextCompat.getColor(requireContext(), backgroundColor)) - val spacingVerticalRes = if (readerImprovementsFeatureConfig.isEnabled()) { - R.dimen.reader_card_gutters_new - } else { - R.dimen.reader_card_gutters - } + val spacingVerticalRes = R.dimen.reader_card_gutters val spacingHorizontal = resources.getDimensionPixelSize(R.dimen.reader_card_margin) val spacingVertical = resources.getDimensionPixelSize(spacingVerticalRes) recyclerView.addItemDecoration(RecyclerItemDecoration(spacingHorizontal, spacingVertical, false)) // add a proper item divider to the RecyclerView when Reader Improvements are enabled - if (readerImprovementsFeatureConfig.isEnabled()) { - recyclerView.addItemDivider(R.drawable.default_list_divider) - } + recyclerView.addItemDivider(R.drawable.default_list_divider) WPSwipeToRefreshHelper.buildSwipeToRefreshHelper(ptrLayout) { viewModel.swipeToRefresh() } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverViewModel.kt index 7408e7f23735..4fb2ccc2417b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverViewModel.kt @@ -19,7 +19,6 @@ import org.wordpress.android.modules.UI_THREAD import org.wordpress.android.ui.bloggingprompts.BloggingPromptsPostTagProvider.Companion.BLOGGING_PROMPT_TAG import org.wordpress.android.ui.pages.SnackbarMessageHolder import org.wordpress.android.ui.reader.ReaderTypes.ReaderPostListType.TAG_FOLLOWED -import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderPostNewUiState import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderPostUiState import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderRecommendedBlogsCardUiState.ReaderRecommendedBlogUiState import org.wordpress.android.ui.reader.discover.ReaderNavigationEvents.ShowBlogPreview @@ -42,7 +41,6 @@ import org.wordpress.android.ui.reader.utils.ReaderUtilsWrapper import org.wordpress.android.ui.reader.viewmodels.ReaderViewModel import org.wordpress.android.ui.utils.UiString.UiStringRes import org.wordpress.android.util.DisplayUtilsWrapper -import org.wordpress.android.util.config.ReaderImprovementsFeatureConfig import org.wordpress.android.viewmodel.Event import org.wordpress.android.viewmodel.ScopedViewModel import javax.inject.Inject @@ -62,7 +60,6 @@ class ReaderDiscoverViewModel @Inject constructor( private val readerTracker: ReaderTracker, displayUtilsWrapper: DisplayUtilsWrapper, private val getFollowedTagsUseCase: GetFollowedTagsUseCase, - private val readerImprovementsFeatureConfig: ReaderImprovementsFeatureConfig, private val readerAnnouncementHelper: ReaderAnnouncementHelper, @Named(UI_THREAD) private val mainDispatcher: CoroutineDispatcher, @Named(IO_THREAD) private val ioDispatcher: CoroutineDispatcher @@ -236,40 +233,20 @@ class ReaderDiscoverViewModel @Inject constructor( private suspend fun convertCardsToUiStates(posts: ReaderDiscoverCards): List { return posts.cards.map { card -> when (card) { - is ReaderPostCard -> if (readerImprovementsFeatureConfig.isEnabled()) { - postUiStateBuilder.mapPostToNewUiState( - source = ReaderTracker.SOURCE_DISCOVER, - post = card.post, - photonWidth = photonWidth, - photonHeight = photonHeight, - postListType = TAG_FOLLOWED, - onButtonClicked = this@ReaderDiscoverViewModel::onButtonClicked, - onItemClicked = this@ReaderDiscoverViewModel::onPostItemClicked, - onItemRendered = this@ReaderDiscoverViewModel::onItemRendered, - onMoreButtonClicked = this@ReaderDiscoverViewModel::onMoreButtonClickedNew, - onMoreDismissed = this@ReaderDiscoverViewModel::onMoreMenuDismissedNew, - onVideoOverlayClicked = this@ReaderDiscoverViewModel::onVideoOverlayClicked, - onPostHeaderViewClicked = this@ReaderDiscoverViewModel::onPostHeaderClicked, - ) - } else { - postUiStateBuilder.mapPostToUiState( - source = ReaderTracker.SOURCE_DISCOVER, - post = card.post, - isDiscover = true, - photonWidth = photonWidth, - photonHeight = photonHeight, - onButtonClicked = this@ReaderDiscoverViewModel::onButtonClicked, - onItemClicked = this@ReaderDiscoverViewModel::onPostItemClicked, - onItemRendered = this@ReaderDiscoverViewModel::onItemRendered, - onDiscoverSectionClicked = this@ReaderDiscoverViewModel::onDiscoverClicked, - onMoreButtonClicked = this@ReaderDiscoverViewModel::onMoreButtonClicked, - onMoreDismissed = this@ReaderDiscoverViewModel::onMoreMenuDismissed, - onVideoOverlayClicked = this@ReaderDiscoverViewModel::onVideoOverlayClicked, - onPostHeaderViewClicked = { onPostHeaderClicked(card.post.postId, card.post.blogId) }, - onTagItemClicked = this@ReaderDiscoverViewModel::onTagItemClicked, - postListType = TAG_FOLLOWED - ) - } + is ReaderPostCard -> postUiStateBuilder.mapPostToUiState( + source = ReaderTracker.SOURCE_DISCOVER, + post = card.post, + photonWidth = photonWidth, + photonHeight = photonHeight, + postListType = TAG_FOLLOWED, + onButtonClicked = this@ReaderDiscoverViewModel::onButtonClicked, + onItemClicked = this@ReaderDiscoverViewModel::onPostItemClicked, + onItemRendered = this@ReaderDiscoverViewModel::onItemRendered, + onMoreButtonClicked = this@ReaderDiscoverViewModel::onMoreButtonClicked, + onMoreDismissed = this@ReaderDiscoverViewModel::onMoreMenuDismissed, + onVideoOverlayClicked = this@ReaderDiscoverViewModel::onVideoOverlayClicked, + onPostHeaderViewClicked = this@ReaderDiscoverViewModel::onPostHeaderClicked, + ) is InterestsYouMayLikeCard -> { postUiStateBuilder.mapTagListToReaderInterestUiState( card.interests, @@ -385,13 +362,6 @@ class ReaderDiscoverViewModel @Inject constructor( } } - private fun onTagItemClicked(tagSlug: String) { - launch(ioDispatcher) { - val readerTag = readerUtilsWrapper.getTagFromTagName(tagSlug, FOLLOWED) - _navigationEvents.postValue(Event(ShowPostsByTag(readerTag))) - } - } - private fun onPostItemClicked(postId: Long, blogId: Long) { launch { findPost(postId, blogId)?.let { @@ -452,11 +422,6 @@ class ReaderDiscoverViewModel @Inject constructor( } } - @Suppress("unused", "UNUSED_PARAMETER") - private fun onDiscoverClicked(postId: Long, blogId: Long) { - // TODO malinjir: add on discover clicked listener - } - private fun onMoreButtonClicked(postUiState: ReaderPostUiState) { changeMoreMenuVisibility(postUiState, true) } @@ -466,30 +431,6 @@ class ReaderDiscoverViewModel @Inject constructor( } private fun changeMoreMenuVisibility(currentUiState: ReaderPostUiState, show: Boolean) { - launch { - findPost(currentUiState.postId, currentUiState.blogId)?.let { post -> - val moreMenuItems = if (show) { - readerPostMoreButtonUiStateBuilder.buildMoreMenuItems( - post, false, this@ReaderDiscoverViewModel::onButtonClicked - ) - } else { - null - } - - replaceUiStateItem(currentUiState, currentUiState.copy(moreMenuItems = moreMenuItems)) - } - } - } - - private fun onMoreButtonClickedNew(postUiState: ReaderPostNewUiState) { - changeMoreMenuVisibilityNew(postUiState, true) - } - - private fun onMoreMenuDismissedNew(postUiState: ReaderPostNewUiState) { - changeMoreMenuVisibilityNew(postUiState, false) - } - - private fun changeMoreMenuVisibilityNew(currentUiState: ReaderPostNewUiState, show: Boolean) { launch { findPost(currentUiState.postId, currentUiState.blogId)?.let { post -> val moreMenuItems = if (show) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderInterestNewAdapter.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderInterestNewAdapter.kt deleted file mode 100644 index 19e3d38519c2..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderInterestNewAdapter.kt +++ /dev/null @@ -1,52 +0,0 @@ -package org.wordpress.android.ui.reader.discover - -import android.view.ViewGroup -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.DiffUtil.Callback -import androidx.recyclerview.widget.RecyclerView.Adapter -import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderInterestsCardUiState.ReaderInterestUiState -import org.wordpress.android.ui.reader.discover.viewholders.ReaderInterestNewViewHolder -import org.wordpress.android.ui.utils.UiHelpers - -class ReaderInterestNewAdapter( - private val uiHelpers: UiHelpers -) : Adapter() { - private val items = mutableListOf() - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ReaderInterestNewViewHolder { - return ReaderInterestNewViewHolder(uiHelpers, parent) - } - - override fun getItemCount(): Int = items.size - - override fun onBindViewHolder(holder: ReaderInterestNewViewHolder, position: Int) { - holder.onBind(items[position]) - } - - fun update(newItems: List) { - val diffResult = DiffUtil.calculateDiff(InterestDiffUtil(items, newItems)) - items.clear() - items.addAll(newItems) - diffResult.dispatchUpdatesTo(this) - } - - class InterestDiffUtil( - private val oldList: List, - private val newList: List - ) : Callback() { - override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { - val newItem = newList[newItemPosition] - val oldItem = oldList[oldItemPosition] - - return (oldItem == newItem) - } - - override fun getOldListSize(): Int = oldList.size - - override fun getNewListSize(): Int = newList.size - - override fun areContentsTheSame( - oldItemPosition: Int, - newItemPosition: Int - ): Boolean = oldList[oldItemPosition] == newList[newItemPosition] - } -} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderPostUiStateBuilder.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderPostUiStateBuilder.kt index d9dfc8b418ba..579b4755f368 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderPostUiStateBuilder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderPostUiStateBuilder.kt @@ -11,10 +11,6 @@ import org.wordpress.android.models.ReaderCardType.GALLERY import org.wordpress.android.models.ReaderCardType.PHOTO import org.wordpress.android.models.ReaderCardType.VIDEO import org.wordpress.android.models.ReaderPost -import org.wordpress.android.models.ReaderPostDiscoverData -import org.wordpress.android.models.ReaderPostDiscoverData.DiscoverType.EDITOR_PICK -import org.wordpress.android.models.ReaderPostDiscoverData.DiscoverType.OTHER -import org.wordpress.android.models.ReaderPostDiscoverData.DiscoverType.SITE_PICK import org.wordpress.android.models.ReaderTag import org.wordpress.android.models.ReaderTagList import org.wordpress.android.modules.BG_THREAD @@ -28,11 +24,8 @@ import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderInterest import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderInterestsCardUiState.ChipStyle.ChipStylePurple import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderInterestsCardUiState.ChipStyle.ChipStyleYellow import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderInterestsCardUiState.ReaderInterestUiState -import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderPostNewUiState -import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderPostNewUiState.InteractionSectionData import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderPostUiState -import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderPostUiState.DiscoverLayoutUiState -import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderPostUiState.GalleryThumbnailStripData +import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderPostUiState.InteractionSectionData import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderRecommendedBlogsCardUiState import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderRecommendedBlogsCardUiState.ReaderRecommendedBlogUiState import org.wordpress.android.ui.reader.discover.ReaderPostCardAction.PrimaryAction @@ -54,7 +47,6 @@ import org.wordpress.android.util.WPAvatarUtilsWrapper import org.wordpress.android.util.SiteUtils import org.wordpress.android.util.UrlUtilsWrapper import org.wordpress.android.util.image.BlavatarShape.CIRCULAR -import org.wordpress.android.util.image.ImageType import javax.inject.Inject import javax.inject.Named import android.R as AndroidR @@ -70,46 +62,39 @@ class ReaderPostUiStateBuilder @Inject constructor( private val dateTimeUtilsWrapper: DateTimeUtilsWrapper, private val readerImageScannerProvider: ReaderImageScannerProvider, private val readerUtilsWrapper: ReaderUtilsWrapper, - private val readerPostTagsUiStateBuilder: ReaderPostTagsUiStateBuilder, @Named(BG_THREAD) private val bgDispatcher: CoroutineDispatcher ) { @Suppress("LongParameterList") suspend fun mapPostToUiState( source: String, post: ReaderPost, - isDiscover: Boolean = false, photonWidth: Int, photonHeight: Int, postListType: ReaderPostListType, onButtonClicked: (Long, Long, ReaderPostCardActionType) -> Unit, onItemClicked: (Long, Long) -> Unit, onItemRendered: (ReaderCardUiState) -> Unit, - onDiscoverSectionClicked: (Long, Long) -> Unit, onMoreButtonClicked: (ReaderPostUiState) -> Unit, onMoreDismissed: (ReaderPostUiState) -> Unit, onVideoOverlayClicked: (Long, Long) -> Unit, - onPostHeaderViewClicked: () -> Unit, - onTagItemClicked: (String) -> Unit, - moreMenuItems: List? = null + onPostHeaderViewClicked: (Long, Long) -> Unit, + moreMenuItems: List? = null, ): ReaderPostUiState { return withContext(bgDispatcher) { mapPostToUiStateBlocking( source, post, - isDiscover, photonWidth, photonHeight, postListType, onButtonClicked, onItemClicked, onItemRendered, - onDiscoverSectionClicked, onMoreButtonClicked, onMoreDismissed, onVideoOverlayClicked, onPostHeaderViewClicked, - onTagItemClicked, - moreMenuItems + moreMenuItems, ) } } @@ -118,106 +103,19 @@ class ReaderPostUiStateBuilder @Inject constructor( fun mapPostToUiStateBlocking( source: String, post: ReaderPost, - isDiscover: Boolean = false, photonWidth: Int, photonHeight: Int, postListType: ReaderPostListType, onButtonClicked: (Long, Long, ReaderPostCardActionType) -> Unit, onItemClicked: (Long, Long) -> Unit, onItemRendered: (ReaderCardUiState) -> Unit, - onDiscoverSectionClicked: (Long, Long) -> Unit, onMoreButtonClicked: (ReaderPostUiState) -> Unit, onMoreDismissed: (ReaderPostUiState) -> Unit, onVideoOverlayClicked: (Long, Long) -> Unit, - onPostHeaderViewClicked: () -> Unit, - onTagItemClicked: (String) -> Unit, - moreMenuItems: List? = null - ): ReaderPostUiState { - return ReaderPostUiState( - source = source, - postId = post.postId, - blogId = post.blogId, - feedId = post.feedId, - isFollowed = post.isFollowedByCurrentUser, - blogSection = buildBlogSection(post, onPostHeaderViewClicked, postListType, post.isP2orA8C), - excerpt = buildExcerpt(post), - title = buildTitle(post), - tagItems = buildTagItems(post, onTagItemClicked), - photoTitle = buildPhotoTitle(post), - featuredImageUrl = buildFeaturedImageUrl(post, photonWidth, photonHeight), - featuredImageCornerRadius = UIDimenRes(R.dimen.reader_featured_image_corner_radius), - thumbnailStripSection = buildThumbnailStripUrls(post), - expandableTagsViewVisibility = buildExpandedTagsViewVisibility(post, isDiscover), - videoOverlayVisibility = buildVideoOverlayVisibility(post), - featuredImageVisibility = buildFeaturedImageVisibility(post), - moreMenuVisibility = accountStore.hasAccessToken(), - moreMenuItems = moreMenuItems, - fullVideoUrl = buildFullVideoUrl(post), - discoverSection = buildDiscoverSection(post, onDiscoverSectionClicked), - bookmarkAction = buildBookmarkSection(post, onButtonClicked), - likeAction = buildLikeSection(post, onButtonClicked), - reblogAction = buildReblogSection(post, onButtonClicked), - commentsAction = buildCommentsSection(post, onButtonClicked), - onItemClicked = onItemClicked, - onItemRendered = onItemRendered, - onMoreButtonClicked = onMoreButtonClicked, - onMoreDismissed = onMoreDismissed, - onVideoOverlayClicked = onVideoOverlayClicked - ) - } - - @Suppress("LongParameterList") - suspend fun mapPostToNewUiState( - source: String, - post: ReaderPost, - photonWidth: Int, - photonHeight: Int, - postListType: ReaderPostListType, - onButtonClicked: (Long, Long, ReaderPostCardActionType) -> Unit, - onItemClicked: (Long, Long) -> Unit, - onItemRendered: (ReaderCardUiState) -> Unit, - onMoreButtonClicked: (ReaderPostNewUiState) -> Unit, - onMoreDismissed: (ReaderPostNewUiState) -> Unit, - onVideoOverlayClicked: (Long, Long) -> Unit, - onPostHeaderViewClicked: (Long, Long) -> Unit, - moreMenuItems: List? = null, - ): ReaderPostNewUiState { - return withContext(bgDispatcher) { - mapPostToNewUiStateBlocking( - source, - post, - photonWidth, - photonHeight, - postListType, - onButtonClicked, - onItemClicked, - onItemRendered, - onMoreButtonClicked, - onMoreDismissed, - onVideoOverlayClicked, - onPostHeaderViewClicked, - moreMenuItems, - ) - } - } - - @Suppress("LongParameterList") - fun mapPostToNewUiStateBlocking( - source: String, - post: ReaderPost, - photonWidth: Int, - photonHeight: Int, - postListType: ReaderPostListType, - onButtonClicked: (Long, Long, ReaderPostCardActionType) -> Unit, - onItemClicked: (Long, Long) -> Unit, - onItemRendered: (ReaderCardUiState) -> Unit, - onMoreButtonClicked: (ReaderPostNewUiState) -> Unit, - onMoreDismissed: (ReaderPostNewUiState) -> Unit, - onVideoOverlayClicked: (Long, Long) -> Unit, onPostHeaderViewClicked: (Long, Long) -> Unit, moreMenuItems: List? = null, - ): ReaderPostNewUiState { - return ReaderPostNewUiState( + ): ReaderPostUiState { + return ReaderPostUiState( source = source, postId = post.postId, blogId = post.blogId, @@ -225,8 +123,8 @@ class ReaderPostUiStateBuilder @Inject constructor( isFollowed = post.isFollowedByCurrentUser, blogSection = buildCompactBlogSection(post, postListType, onPostHeaderViewClicked, post.isP2orA8C), interactionSection = buildInteractionSection(post), - title = buildTitle(post, forceForPhoto = true, allowEmptyTitle = true), - excerpt = buildExcerpt(post, forceForPhoto = true), + title = buildTitle(post), + excerpt = buildExcerpt(post), featuredImageUrl = buildFeaturedImageUrl(post, photonWidth, photonHeight), featuredImageCornerRadius = UIDimenRes(R.dimen.reader_featured_image_corner_radius_new), fullVideoUrl = buildFullVideoUrl(post), @@ -248,10 +146,9 @@ class ReaderPostUiStateBuilder @Inject constructor( fun mapPostToBlogSectionUiState( post: ReaderPost, - isReaderImprovementsEnabled: Boolean, onBlogSectionClicked: () -> Unit ): ReaderBlogSectionUiState { - return buildBlogSection(post, onBlogSectionClicked, isReaderImprovementsEnabled = isReaderImprovementsEnabled) + return buildBlogSection(post, onBlogSectionClicked) } fun mapPostToActions( @@ -315,7 +212,6 @@ class ReaderPostUiStateBuilder @Inject constructor( onBlogSectionClicked: () -> Unit, postListType: ReaderPostListType? = null, isP2Post: Boolean = false, - isReaderImprovementsEnabled: Boolean = false, ): ReaderBlogSectionUiState { return ReaderBlogSectionUiState( postId = post.postId, @@ -324,7 +220,7 @@ class ReaderPostUiStateBuilder @Inject constructor( blogUrl = buildBlogUrl(post), dateLine = buildDateLine(post), avatarOrBlavatarUrl = buildAvatarOrBlavatarUrl(post), - isAuthorAvatarVisible = isP2Post || (isReaderImprovementsEnabled && post.hasBlogImageUrl()), + isAuthorAvatarVisible = isP2Post || post.hasBlogImageUrl(), blavatarType = SiteUtils.getSiteImageType(isP2Post, CIRCULAR), authorAvatarUrl = avatarUtilsWrapper.rewriteAvatarUrlWithResource( post.postAvatar, @@ -339,8 +235,8 @@ class ReaderPostUiStateBuilder @Inject constructor( postListType: ReaderPostListType, onBlogSectionClicked: (Long, Long) -> Unit, isP2Post: Boolean = false, - ): ReaderPostNewUiState.CompactBlogSectionData { - return ReaderPostNewUiState.CompactBlogSectionData( + ): ReaderPostUiState.CompactBlogSectionData { + return ReaderPostUiState.CompactBlogSectionData( postId = post.postId, blogId = post.blogId, blogName = buildBlogName(post, isP2Post), @@ -379,20 +275,10 @@ class ReaderPostUiStateBuilder @Inject constructor( ?.blogUrl ?.let { urlUtilsWrapper.removeScheme(it) } - private fun buildDiscoverSection(post: ReaderPost, onDiscoverSectionClicked: (Long, Long) -> Unit) = - post.takeIf { post.isDiscoverPost && post.discoverData.discoverType != OTHER } - ?.let { buildDiscoverSectionUiState(post.discoverData, onDiscoverSectionClicked) } - private fun buildFullVideoUrl(post: ReaderPost) = post.takeIf { post.cardType == VIDEO } ?.let { post.featuredVideo } - private fun buildExpandedTagsViewVisibility(post: ReaderPost, isDiscover: Boolean) = - post.tags.isNotEmpty() && isDiscover - - private fun buildTagItems(post: ReaderPost, onClicked: (String) -> Unit) = - readerPostTagsUiStateBuilder.mapPostTagsToTagUiStates(post, onClicked) - // TODO malinjir show overlay when buildFullVideoUrl != null private fun buildVideoOverlayVisibility(post: ReaderPost) = post.cardType == VIDEO @@ -410,24 +296,11 @@ class ReaderPostUiStateBuilder @Inject constructor( ?.getFeaturedImageForDisplay(photonWidth, photonHeight) } - private fun buildPhotoTitle(post: ReaderPost) = - post.takeIf { it.cardType == PHOTO && it.hasTitle() }?.title + private fun buildTitle(post: ReaderPost): UiString? = + post.takeIf { it.hasTitle() }?.title?.let { UiStringText(it) } - private fun buildTitle( - post: ReaderPost, - forceForPhoto: Boolean = false, - allowEmptyTitle: Boolean = false - ): UiString? { - return if (post.cardType != PHOTO || forceForPhoto) { - post.takeIf { it.hasTitle() }?.title?.let { UiStringText(it) } - ?: UiStringRes(R.string.untitled_in_parentheses).takeUnless { allowEmptyTitle } - } else { - null - } - } - - private fun buildExcerpt(post: ReaderPost, forceForPhoto: Boolean = false) = - post.takeIf { (post.cardType != PHOTO || forceForPhoto) && post.hasExcerpt() }?.excerpt + private fun buildExcerpt(post: ReaderPost) = + post.takeIf { post.hasExcerpt() }?.excerpt private fun buildBlogName(post: ReaderPost, isP2Post: Boolean = false): UiString { val blogName = post.takeIf { it.hasBlogName() }?.blogName?.let { UiStringText(it) } @@ -457,30 +330,11 @@ class ReaderPostUiStateBuilder @Inject constructor( private fun buildDateLine(post: ReaderPost) = dateTimeUtilsWrapper.javaDateToTimeSpan(post.getDisplayDate(dateTimeUtilsWrapper)) - @Suppress("UseCheckOrError") - private fun buildDiscoverSectionUiState( - discoverData: ReaderPostDiscoverData, - onDiscoverSectionClicked: (Long, Long) -> Unit - ): DiscoverLayoutUiState { - val discoverText = discoverData.attributionHtml - val discoverAvatarUrl = avatarUtilsWrapper.rewriteAvatarUrlWithResource( - discoverData.avatarUrl, - R.dimen.avatar_sz_small - ) - @Suppress("DEPRECATION") val discoverAvatarImageType = when (discoverData.discoverType) { - EDITOR_PICK -> ImageType.AVATAR - SITE_PICK -> ImageType.BLAVATAR - OTHER -> throw IllegalStateException("This could should be unreachable.") - else -> ImageType.AVATAR - } - return DiscoverLayoutUiState(discoverText, discoverAvatarUrl, discoverAvatarImageType, onDiscoverSectionClicked) - } - - private fun retrieveGalleryThumbnailUrls(post: ReaderPost): GalleryThumbnailStripData { + private fun retrieveGalleryThumbnailUrls(post: ReaderPost): ReaderPostUiState.GalleryThumbnailStripData { // scan post content for images suitable in a gallery val images = readerImageScannerProvider.createReaderImageScanner(post.text, post.isPrivate) .getImageList(ReaderConstants.THUMBNAIL_STRIP_IMG_COUNT, ReaderConstants.MIN_GALLERY_IMAGE_WIDTH) - return GalleryThumbnailStripData(images, post.isPrivate, post.text) + return ReaderPostUiState.GalleryThumbnailStripData(images, post.isPrivate, post.text) } private fun buildBookmarkSection( diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderRecommendedBlogsAdapter.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderRecommendedBlogsAdapter.kt index 5b46d6d80faf..ca49bbb27294 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderRecommendedBlogsAdapter.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderRecommendedBlogsAdapter.kt @@ -5,15 +5,13 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderRecommendedBlogsCardUiState.ReaderRecommendedBlogUiState import org.wordpress.android.ui.reader.discover.viewholders.ReaderRecommendedBlogViewHolder -import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.image.ImageManager class ReaderRecommendedBlogsAdapter( private val imageManager: ImageManager, - private val uiHelpers: UiHelpers, ) : ListAdapter(RecommendedBlogsDiffUtil()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ReaderRecommendedBlogViewHolder { - return ReaderRecommendedBlogViewHolder(parent, imageManager, uiHelpers) + return ReaderRecommendedBlogViewHolder(parent, imageManager) } override fun onBindViewHolder(holder: ReaderRecommendedBlogViewHolder, position: Int) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderRecommendedBlogsNewAdapter.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderRecommendedBlogsNewAdapter.kt deleted file mode 100644 index a46ce0a6b1e2..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderRecommendedBlogsNewAdapter.kt +++ /dev/null @@ -1,38 +0,0 @@ -package org.wordpress.android.ui.reader.discover - -import android.view.ViewGroup -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.ListAdapter -import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderRecommendedBlogsCardUiState.ReaderRecommendedBlogUiState -import org.wordpress.android.ui.reader.discover.viewholders.ReaderRecommendedBlogNewViewHolder -import org.wordpress.android.util.image.ImageManager - -class ReaderRecommendedBlogsNewAdapter( - private val imageManager: ImageManager, -) : ListAdapter(RecommendedBlogsDiffUtil()) { - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ReaderRecommendedBlogNewViewHolder { - return ReaderRecommendedBlogNewViewHolder(parent, imageManager) - } - - override fun onBindViewHolder(holder: ReaderRecommendedBlogNewViewHolder, position: Int) { - holder.onBind(getItem(position)) - } - - class RecommendedBlogsDiffUtil : DiffUtil.ItemCallback() { - override fun areItemsTheSame( - oldItem: ReaderRecommendedBlogUiState, - newItem: ReaderRecommendedBlogUiState - ): Boolean = oldItem.blogId == newItem.blogId && oldItem.feedId == newItem.feedId - - override fun areContentsTheSame( - oldItem: ReaderRecommendedBlogUiState, - newItem: ReaderRecommendedBlogUiState - ): Boolean = oldItem == newItem - - // Returning true suppresses the default item animation. - override fun getChangePayload( - oldItem: ReaderRecommendedBlogUiState, - newItem: ReaderRecommendedBlogUiState - ): Any? = true - } -} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestNewViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestNewViewHolder.kt deleted file mode 100644 index b671cdcdab5b..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestNewViewHolder.kt +++ /dev/null @@ -1,19 +0,0 @@ -package org.wordpress.android.ui.reader.discover.viewholders - -import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView -import org.wordpress.android.databinding.ReaderInterestItemNewBinding -import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderInterestsCardUiState.ReaderInterestUiState -import org.wordpress.android.ui.utils.UiHelpers -import org.wordpress.android.util.extensions.viewBinding - -class ReaderInterestNewViewHolder( - private val uiHelpers: UiHelpers, - parent: ViewGroup, - private val binding: ReaderInterestItemNewBinding = parent.viewBinding(ReaderInterestItemNewBinding::inflate) -) : RecyclerView.ViewHolder(binding.root) { - fun onBind(uiState: ReaderInterestUiState) = with(binding) { - uiHelpers.setTextOrHide(chip, uiState.interest) - chip.setOnClickListener { uiState.onClicked.invoke(uiState.interest) } - } -} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestViewHolder.kt index a9c76598b295..1f69cf313bf3 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestViewHolder.kt @@ -1,7 +1,6 @@ package org.wordpress.android.ui.reader.discover.viewholders import android.view.ViewGroup -import androidx.appcompat.content.res.AppCompatResources.getColorStateList import androidx.recyclerview.widget.RecyclerView import org.wordpress.android.databinding.ReaderInterestItemBinding import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderInterestsCardUiState.ReaderInterestUiState @@ -14,13 +13,7 @@ class ReaderInterestViewHolder( private val binding: ReaderInterestItemBinding = parent.viewBinding(ReaderInterestItemBinding::inflate) ) : RecyclerView.ViewHolder(binding.root) { fun onBind(uiState: ReaderInterestUiState) = with(binding) { - uiHelpers.setTextOrHide(interest, uiState.interest) - interest.setOnClickListener { uiState.onClicked.invoke(uiState.interest) } - - with(uiState.chipStyle) { - interest.setChipStrokeColorResource(chipStrokeColorResId) - interest.setChipBackgroundColorResource(chipFillColorResId) - interest.setTextColor(getColorStateList(interest.context, chipFontColorResId)) - } + uiHelpers.setTextOrHide(chip, uiState.interest) + chip.setOnClickListener { uiState.onClicked.invoke(uiState.interest) } } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestsCardNewViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestsCardNewViewHolder.kt deleted file mode 100644 index b5b255a497b9..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestsCardNewViewHolder.kt +++ /dev/null @@ -1,100 +0,0 @@ -package org.wordpress.android.ui.reader.discover.viewholders - -import android.graphics.Rect -import android.view.GestureDetector -import android.view.MotionEvent -import android.view.View -import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView -import com.google.android.flexbox.FlexDirection -import com.google.android.flexbox.FlexWrap -import com.google.android.flexbox.FlexboxLayoutManager -import org.wordpress.android.R -import org.wordpress.android.databinding.ReaderInterestCardNewBinding -import org.wordpress.android.ui.reader.discover.ReaderCardUiState -import org.wordpress.android.ui.reader.discover.ReaderInterestNewAdapter -import org.wordpress.android.ui.utils.UiHelpers -import org.wordpress.android.util.extensions.viewBinding -import org.wordpress.android.widgets.RecyclerItemDecoration - -private const val Y_BUFFER = 10 - -class ReaderInterestsCardNewViewHolder( - uiHelpers: UiHelpers, - parentView: ViewGroup -) : ReaderViewHolder(parentView.viewBinding(ReaderInterestCardNewBinding::inflate)) { - init { - with(binding.recommendedTags) { - if (adapter == null) { - layoutManager = FlexboxLayoutManager(context, FlexDirection.ROW, FlexWrap.WRAP) - val readerInterestAdapter = ReaderInterestNewAdapter(uiHelpers) - setItemSpacing() - adapter = readerInterestAdapter - } - } - } - - private fun RecyclerView.setItemSpacing() { - val spacingHorizontal = resources.getDimensionPixelSize(R.dimen.margin_small) - addItemDecoration(RecyclerItemDecoration(spacingHorizontal, 0, false)) - addItemDecoration(object : RecyclerView.ItemDecoration() { - override fun getItemOffsets( - outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State - ) { - val spacingVertical = resources.getDimensionPixelSize(R.dimen.margin_medium) - outRect.set(0, 0, 0, spacingVertical) - } - }) - } - - override fun onBind(uiState: ReaderCardUiState) = with(binding) { - uiState as ReaderCardUiState.ReaderInterestsCardUiState - setOnTouchItemListener() - (recommendedTags.adapter as ReaderInterestNewAdapter).update(uiState.interest) - } - - private fun setOnTouchItemListener() = with(binding) { - val gestureDetector = GestureDetector(recommendedTags.context, GestureListener()) - recommendedTags.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener { - override fun onInterceptTouchEvent(recyclerView: RecyclerView, e: MotionEvent): Boolean { - return gestureDetector.onTouchEvent(e) - } - - override fun onTouchEvent(recyclerView: RecyclerView, e: MotionEvent) { - // NO OP - } - - override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) { - // NO OP - } - }) - } - - private inner class GestureListener : GestureDetector.SimpleOnGestureListener() { - /** - * Capture the DOWN as soon as it's detected to prevent the viewPager from intercepting touch events - * We need to do this immediately, because if we don't, then the next move event could potentially - * trigger the viewPager to switch tabs - */ - override fun onDown(e: MotionEvent): Boolean = with(binding) { - recommendedTags.parent.requestDisallowInterceptTouchEvent(true) - return super.onDown(e) - } - - override fun onScroll( - e1: MotionEvent?, - e2: MotionEvent, - distanceX: Float, - distanceY: Float - ): Boolean = with(binding) { - if (kotlin.math.abs(distanceX) > kotlin.math.abs(distanceY)) { - // Detected a horizontal scroll, prevent the viewpager from switching tabs - recommendedTags.parent.requestDisallowInterceptTouchEvent(true) - } else if (kotlin.math.abs(distanceY) > Y_BUFFER) { - // Detected a vertical scroll allow the viewpager to switch tabs - recommendedTags.parent.requestDisallowInterceptTouchEvent(false) - } - return super.onScroll(e1, e2, distanceX, distanceY) - } - } -} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestsCardViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestsCardViewHolder.kt index a7af7f511a04..309d2ea991c2 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestsCardViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestsCardViewHolder.kt @@ -1,17 +1,21 @@ package org.wordpress.android.ui.reader.discover.viewholders +import android.graphics.Rect import android.view.GestureDetector import android.view.MotionEvent +import android.view.View import android.view.ViewGroup -import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import androidx.recyclerview.widget.RecyclerView.OnItemTouchListener +import com.google.android.flexbox.FlexDirection +import com.google.android.flexbox.FlexWrap +import com.google.android.flexbox.FlexboxLayoutManager +import org.wordpress.android.R import org.wordpress.android.databinding.ReaderInterestCardBinding import org.wordpress.android.ui.reader.discover.ReaderCardUiState -import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderInterestsCardUiState import org.wordpress.android.ui.reader.discover.ReaderInterestAdapter import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.extensions.viewBinding +import org.wordpress.android.widgets.RecyclerItemDecoration private const val Y_BUFFER = 10 @@ -20,24 +24,38 @@ class ReaderInterestsCardViewHolder( parentView: ViewGroup ) : ReaderViewHolder(parentView.viewBinding(ReaderInterestCardBinding::inflate)) { init { - with(binding.interestsList) { + with(binding.recommendedTags) { if (adapter == null) { - layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) + layoutManager = FlexboxLayoutManager(context, FlexDirection.ROW, FlexWrap.WRAP) val readerInterestAdapter = ReaderInterestAdapter(uiHelpers) + setItemSpacing() adapter = readerInterestAdapter } } } + private fun RecyclerView.setItemSpacing() { + val spacingHorizontal = resources.getDimensionPixelSize(R.dimen.margin_small) + addItemDecoration(RecyclerItemDecoration(spacingHorizontal, 0, false)) + addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State + ) { + val spacingVertical = resources.getDimensionPixelSize(R.dimen.margin_medium) + outRect.set(0, 0, 0, spacingVertical) + } + }) + } + override fun onBind(uiState: ReaderCardUiState) = with(binding) { - uiState as ReaderInterestsCardUiState + uiState as ReaderCardUiState.ReaderInterestsCardUiState setOnTouchItemListener() - (interestsList.adapter as ReaderInterestAdapter).update(uiState.interest) + (recommendedTags.adapter as ReaderInterestAdapter).update(uiState.interest) } private fun setOnTouchItemListener() = with(binding) { - val gestureDetector = GestureDetector(interestsList.context, GestureListener()) - interestsList.addOnItemTouchListener(object : OnItemTouchListener { + val gestureDetector = GestureDetector(recommendedTags.context, GestureListener()) + recommendedTags.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener { override fun onInterceptTouchEvent(recyclerView: RecyclerView, e: MotionEvent): Boolean { return gestureDetector.onTouchEvent(e) } @@ -59,7 +77,7 @@ class ReaderInterestsCardViewHolder( * trigger the viewPager to switch tabs */ override fun onDown(e: MotionEvent): Boolean = with(binding) { - interestsList.parent.requestDisallowInterceptTouchEvent(true) + recommendedTags.parent.requestDisallowInterceptTouchEvent(true) return super.onDown(e) } @@ -71,10 +89,10 @@ class ReaderInterestsCardViewHolder( ): Boolean = with(binding) { if (kotlin.math.abs(distanceX) > kotlin.math.abs(distanceY)) { // Detected a horizontal scroll, prevent the viewpager from switching tabs - interestsList.parent.requestDisallowInterceptTouchEvent(true) + recommendedTags.parent.requestDisallowInterceptTouchEvent(true) } else if (kotlin.math.abs(distanceY) > Y_BUFFER) { // Detected a vertical scroll allow the viewpager to switch tabs - interestsList.parent.requestDisallowInterceptTouchEvent(false) + recommendedTags.parent.requestDisallowInterceptTouchEvent(false) } return super.onScroll(e1, e2, distanceX, distanceY) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderPostNewViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderPostNewViewHolder.kt index 841e907881d0..4334fe3ba0dc 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderPostNewViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderPostNewViewHolder.kt @@ -12,7 +12,7 @@ import org.wordpress.android.databinding.ReaderCardviewPostNewBinding import org.wordpress.android.datasets.ReaderThumbnailTable import org.wordpress.android.ui.reader.adapters.ReaderMenuAdapter import org.wordpress.android.ui.reader.discover.ReaderCardUiState -import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderPostNewUiState +import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderPostUiState import org.wordpress.android.ui.reader.discover.ReaderPostCardAction import org.wordpress.android.ui.reader.discover.ReaderPostCardAction.PrimaryAction import org.wordpress.android.ui.reader.discover.ReaderPostCardActionType @@ -43,7 +43,7 @@ class ReaderPostNewViewHolder( } override fun onBind(uiState: ReaderCardUiState) = with(binding) { - val state = uiState as ReaderPostNewUiState + val state = uiState as ReaderPostUiState // Blog section updateBlogSection(state) @@ -91,7 +91,7 @@ class ReaderPostNewViewHolder( state.onItemRendered.invoke(uiState) } - private fun updateInteractionCountsSection(state: ReaderPostNewUiState) = with(binding) { + private fun updateInteractionCountsSection(state: ReaderPostUiState) = with(binding) { val likeCount = state.interactionSection.likeCount val commentCount = state.interactionSection.commentCount @@ -103,7 +103,7 @@ class ReaderPostNewViewHolder( readerCardDotSeparator.isVisible = likeLabel != null && commentLabel != null } - private fun updateBlogSection(state: ReaderPostNewUiState) = with(binding.layoutBlogSection) { + private fun updateBlogSection(state: ReaderPostUiState) = with(binding.layoutBlogSection) { updateAvatarOrBlavatar(state) uiHelpers.setTextOrHide(blogSectionTextBlogName, state.blogSection.blogName) uiHelpers.setTextOrHide(blogSectionTextDateline, state.blogSection.dateLine) @@ -118,7 +118,7 @@ class ReaderPostNewViewHolder( } } - private fun updateAvatarOrBlavatar(state: ReaderPostNewUiState) = with(binding.layoutBlogSection) { + private fun updateAvatarOrBlavatar(state: ReaderPostUiState) = with(binding.layoutBlogSection) { var isShowingAnyAvatar = false uiHelpers.updateVisibility(blogSectionImageBlogAvatar, state.blogSection.avatarOrBlavatarUrl != null) @@ -149,7 +149,7 @@ class ReaderPostNewViewHolder( blogSectionAvatarContainer.isVisible = isShowingAnyAvatar } - private fun updateFeaturedImage(state: ReaderPostNewUiState) = with(binding) { + private fun updateFeaturedImage(state: ReaderPostUiState) = with(binding) { uiHelpers.updateVisibility(imageFeatured, state.featuredImageVisibility) if (state.featuredImageUrl == null) { imageManager.cancelRequestAndClearImageView(imageFeatured) @@ -177,7 +177,7 @@ class ReaderPostNewViewHolder( } } - private fun loadVideoThumbnail(state: ReaderPostNewUiState) = with(binding) { + private fun loadVideoThumbnail(state: ReaderPostUiState) = with(binding) { /* TODO ideally, we'd be passing just a thumbnail url in the UiState. However, the code for retrieving thumbnail from full video URL needs to be fully refactored. */ state.fullVideoUrl?.let { videoUrl -> @@ -202,7 +202,7 @@ class ReaderPostNewViewHolder( } } - private fun renderMoreMenu(uiState: ReaderPostNewUiState, actions: List, v: View) { + private fun renderMoreMenu(uiState: ReaderPostUiState, actions: List, v: View) { readerTracker.track(AnalyticsTracker.Stat.POST_CARD_MORE_TAPPED) val listPopup = ListPopupWindow(v.context) listPopup.width = v.context.resources.getDimensionPixelSize(R.dimen.menu_item_width) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderPostViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderPostViewHolder.kt deleted file mode 100644 index 7bb3be5dca5d..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderPostViewHolder.kt +++ /dev/null @@ -1,225 +0,0 @@ -package org.wordpress.android.ui.reader.discover.viewholders - -import android.view.Gravity -import android.view.View -import android.view.ViewGroup -import androidx.appcompat.widget.ListPopupWindow -import org.wordpress.android.R -import org.wordpress.android.WordPress -import org.wordpress.android.analytics.AnalyticsTracker -import org.wordpress.android.databinding.ReaderCardviewPostBinding -import org.wordpress.android.datasets.ReaderThumbnailTable -import org.wordpress.android.ui.reader.adapters.ReaderMenuAdapter -import org.wordpress.android.ui.reader.discover.ReaderCardUiState -import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderPostUiState -import org.wordpress.android.ui.reader.discover.ReaderPostCardAction -import org.wordpress.android.ui.reader.discover.ReaderPostCardAction.PrimaryAction -import org.wordpress.android.ui.reader.tracker.ReaderTracker -import org.wordpress.android.ui.reader.utils.ReaderVideoUtils -import org.wordpress.android.ui.reader.utils.ReaderVideoUtils.VideoThumbnailUrlListener -import org.wordpress.android.ui.reader.views.ReaderIconCountView -import org.wordpress.android.ui.utils.UiHelpers -import org.wordpress.android.util.extensions.expandTouchTargetArea -import org.wordpress.android.util.extensions.getDrawableResIdFromAttribute -import org.wordpress.android.util.extensions.viewBinding -import org.wordpress.android.util.image.ImageManager -import org.wordpress.android.util.image.ImageType.BLAVATAR_CIRCULAR -import org.wordpress.android.util.image.ImageType.PHOTO_ROUNDED_CORNERS -import org.wordpress.android.util.image.ImageType.VIDEO - -class ReaderPostViewHolder( - private val uiHelpers: UiHelpers, - private val imageManager: ImageManager, - private val readerTracker: ReaderTracker, - parentView: ViewGroup -) : ReaderViewHolder(parentView.viewBinding(ReaderCardviewPostBinding::inflate)) { - init { - with(binding) { - layoutDiscover.expandTouchTargetArea(R.dimen.reader_discover_layout_extra_padding, true) - imageMore.expandTouchTargetArea(R.dimen.reader_more_image_extra_padding, false) - } - } - - override fun onBind(uiState: ReaderCardUiState) = with(binding) { - val state = uiState as ReaderPostUiState - - // Expandable tags section - uiHelpers.updateVisibility(expandableTagsView, state.expandableTagsViewVisibility) - expandableTagsView.updateUi(state.tagItems) - - // Blog section - updateBlogSection(state) - - // More menu - uiHelpers.updateVisibility(imageMore, state.moreMenuVisibility) - imageMore.setOnClickListener { uiState.onMoreButtonClicked.invoke(state) } - - // Featured image section - updateFeaturedImage(state) - uiHelpers.updateVisibility(imageVideoOverlay, state.videoOverlayVisibility) - uiHelpers.setTextOrHide(textPhotoTitle, state.photoTitle) - uiHelpers.updateVisibility(thumbnailStrip, state.thumbnailStripSection != null) - state.thumbnailStripSection?.let { - thumbnailStrip.loadThumbnails(it.images, it.isPrivate, it.content) - } - loadVideoThumbnail(state) - imageVideoOverlay.setOnClickListener { state.onVideoOverlayClicked(uiState.postId, uiState.blogId) } - - // Content section - uiHelpers.setTextOrHide(textTitle, state.title) - uiHelpers.setTextOrHide(textExcerpt, state.excerpt) - postContainer.setOnClickListener { - readerTracker.trackBlog( - AnalyticsTracker.Stat.READER_POST_CARD_TAPPED, - state.blogId, - state.feedId, - state.isFollowed, - state.source - ) - state.onItemClicked(uiState.postId, uiState.blogId) - } - - // Discover section - updateDiscoverSection(state) - - // Action buttons section - updateActionButton(uiState.postId, uiState.blogId, uiState.likeAction, countLikes) - updateActionButton(uiState.postId, uiState.blogId, uiState.reblogAction, reblog) - updateActionButton(uiState.postId, uiState.blogId, uiState.commentsAction, countComments) - updateActionButton(uiState.postId, uiState.blogId, uiState.bookmarkAction, bookmark) - - state.moreMenuItems?.let { - renderMoreMenu(state, state.moreMenuItems, imageMore) - } - - state.onItemRendered.invoke(uiState) - } - - private fun updateBlogSection(state: ReaderPostUiState) = with(binding.layoutBlogSection) { - updateAvatarOrBlavatar(state) - uiHelpers.setTextOrHide(textAuthorAndBlogName, state.blogSection.blogName) - uiHelpers.setTextOrHide(textBlogUrl, state.blogSection.blogUrl) - uiHelpers.updateVisibility(dotSeparator, state.blogSection.dotSeparatorVisibility) - uiHelpers.setTextOrHide(textDateline, state.blogSection.dateLine) - - root.setBackgroundResource( - root.context.getDrawableResIdFromAttribute( - state.blogSection.blogSectionClickData?.background ?: 0 - ) - ) - state.blogSection.blogSectionClickData?.onBlogSectionClicked?.let { - root.setOnClickListener { - state.blogSection.blogSectionClickData.onBlogSectionClicked.invoke() - } - } ?: run { - root.setOnClickListener(null) - root.isClickable = false - } - } - - private fun updateFeaturedImage(state: ReaderPostUiState) = with(binding) { - uiHelpers.updateVisibility(imageFeatured, state.featuredImageVisibility) - if (state.featuredImageUrl == null) { - imageManager.cancelRequestAndClearImageView(imageFeatured) - } else { - imageManager.loadImageWithCorners( - imageFeatured, - PHOTO_ROUNDED_CORNERS, - state.featuredImageUrl, - uiHelpers.getPxOfUiDimen(WordPress.getContext(), state.featuredImageCornerRadius) - ) - } - } - - private fun updateAvatarOrBlavatar(state: ReaderPostUiState) = with(binding.layoutBlogSection) { - uiHelpers.updateVisibility(imageAvatarOrBlavatar, state.blogSection.avatarOrBlavatarUrl != null) - if (state.blogSection.avatarOrBlavatarUrl == null) { - imageManager.cancelRequestAndClearImageView(imageAvatarOrBlavatar) - } else { - imageManager.loadIntoCircle( - imageAvatarOrBlavatar, - state.blogSection.blavatarType, state.blogSection.avatarOrBlavatarUrl - ) - } - - val canShowAuthorsAvatar = state.blogSection.authorAvatarUrl != null && state.blogSection.isAuthorAvatarVisible - uiHelpers.updateVisibility(authorsAvatar, canShowAuthorsAvatar) - - if (!canShowAuthorsAvatar) { - imageManager.cancelRequestAndClearImageView(authorsAvatar) - } else { - imageManager.loadIntoCircle(authorsAvatar, BLAVATAR_CIRCULAR, state.blogSection.authorAvatarUrl!!) - } - } - - private fun updateDiscoverSection(state: ReaderPostUiState) = with(binding) { - uiHelpers.updateVisibility(imageDiscoverAvatar, state.discoverSection?.discoverAvatarUrl != null) - uiHelpers.updateVisibility(layoutDiscover, state.discoverSection != null) - uiHelpers.setTextOrHide(textDiscover, state.discoverSection?.discoverText) - if (state.discoverSection?.discoverAvatarUrl == null) { - imageManager.cancelRequestAndClearImageView(imageDiscoverAvatar) - } else { - // TODO do we need to use `imagemanager.load` for blavatar? - imageManager.loadIntoCircle( - imageDiscoverAvatar, - state.discoverSection.imageType, - state.discoverSection.discoverAvatarUrl - ) - } - layoutDiscover.setOnClickListener { - state.discoverSection?.onDiscoverClicked?.invoke(state.postId, state.blogId) - } - } - - private fun updateActionButton(postId: Long, blogId: Long, state: PrimaryAction, view: View) { - if (view is ReaderIconCountView) { - view.setCount(state.count) - } - view.isEnabled = state.isEnabled - view.isSelected = state.isSelected - view.contentDescription = state.contentDescription?.let { uiHelpers.getTextOfUiString(view.context, it) } - view.setOnClickListener { state.onClicked?.invoke(postId, blogId, state.type) } - } - - private fun loadVideoThumbnail(state: ReaderPostUiState) = with(binding) { - /* TODO ideally, we'd be passing just a thumbnail url in the UiState. However, the code for retrieving - thumbnail from full video URL needs to be fully refactored. */ - state.fullVideoUrl?.let { videoUrl -> - ReaderVideoUtils.retrieveVideoThumbnailUrl(videoUrl, object : VideoThumbnailUrlListener { - override fun showThumbnail(thumbnailUrl: String) { - imageManager.loadImageWithCorners( - imageFeatured, - PHOTO_ROUNDED_CORNERS, - thumbnailUrl, - uiHelpers.getPxOfUiDimen(WordPress.getContext(), state.featuredImageCornerRadius) - ) - } - - override fun showPlaceholder() { - imageManager.load(imageFeatured, VIDEO) - } - - override fun cacheThumbnailUrl(thumbnailUrl: String) { - ReaderThumbnailTable.addThumbnail(state.postId, videoUrl, thumbnailUrl) - } - }) - } - } - - private fun renderMoreMenu(uiState: ReaderPostUiState, actions: List, v: View) { - readerTracker.track(AnalyticsTracker.Stat.POST_CARD_MORE_TAPPED) - val listPopup = ListPopupWindow(v.context) - listPopup.width = v.context.resources.getDimensionPixelSize(R.dimen.menu_item_width) - listPopup.setAdapter(ReaderMenuAdapter(v.context, uiHelpers, actions)) - listPopup.setDropDownGravity(Gravity.END) - listPopup.anchorView = v - listPopup.isModal = true - listPopup.setOnItemClickListener { _, _, position, _ -> - listPopup.dismiss() - val item = actions[position] - item.onClicked?.invoke(uiState.postId, uiState.blogId, item.type) - } - listPopup.setOnDismissListener { uiState.onMoreDismissed.invoke(uiState) } - listPopup.show() - } -} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderRecommendedBlogNewViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderRecommendedBlogNewViewHolder.kt deleted file mode 100644 index 71bf49520c0b..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderRecommendedBlogNewViewHolder.kt +++ /dev/null @@ -1,53 +0,0 @@ -package org.wordpress.android.ui.reader.discover.viewholders - -import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView -import org.wordpress.android.databinding.ReaderRecommendedBlogItemNewBinding -import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderRecommendedBlogsCardUiState.ReaderRecommendedBlogUiState -import org.wordpress.android.util.extensions.viewBinding -import org.wordpress.android.util.image.ImageManager -import org.wordpress.android.util.image.ImageType.BLAVATAR_CIRCULAR - -class ReaderRecommendedBlogNewViewHolder( - parent: ViewGroup, - private val imageManager: ImageManager, - private val binding: ReaderRecommendedBlogItemNewBinding = - parent.viewBinding(ReaderRecommendedBlogItemNewBinding::inflate) -) : RecyclerView.ViewHolder(binding.root) { - fun onBind(uiState: ReaderRecommendedBlogUiState) = - with(binding) { - siteName.text = uiState.name - siteUrl.text = uiState.url - updateSiteFollowButton(uiState, this) - updateBlogImage(uiState.iconUrl) - root.setOnClickListener { - uiState.onItemClicked(uiState.blogId, uiState.feedId, uiState.isFollowed) - } - } - - private fun updateSiteFollowButton( - uiState: ReaderRecommendedBlogUiState, - binding: ReaderRecommendedBlogItemNewBinding - ) { - with(binding.siteFollowButton) { - isEnabled = uiState.isFollowEnabled - setIsFollowed(uiState.isFollowed) - contentDescription = context.getString(uiState.followContentDescription.stringRes) - setOnClickListener { - uiState.onFollowClicked(uiState) - } - } - } - - private fun updateBlogImage(iconUrl: String?) = with(binding) { - if (iconUrl != null) { - imageManager.loadIntoCircle( - imageView = siteIcon, - imageType = BLAVATAR_CIRCULAR, - imgUrl = iconUrl - ) - } else { - imageManager.cancelRequestAndClearImageView(siteIcon) - } - } -} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderRecommendedBlogViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderRecommendedBlogViewHolder.kt index 6f0d75122667..4c39cbb75d39 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderRecommendedBlogViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderRecommendedBlogViewHolder.kt @@ -4,7 +4,6 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import org.wordpress.android.databinding.ReaderRecommendedBlogItemBinding import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderRecommendedBlogsCardUiState.ReaderRecommendedBlogUiState -import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.extensions.viewBinding import org.wordpress.android.util.image.ImageManager import org.wordpress.android.util.image.ImageType.BLAVATAR_CIRCULAR @@ -12,25 +11,30 @@ import org.wordpress.android.util.image.ImageType.BLAVATAR_CIRCULAR class ReaderRecommendedBlogViewHolder( parent: ViewGroup, private val imageManager: ImageManager, - private val uiHelpers: UiHelpers, private val binding: ReaderRecommendedBlogItemBinding = parent.viewBinding(ReaderRecommendedBlogItemBinding::inflate) ) : RecyclerView.ViewHolder(binding.root) { - fun onBind(uiState: ReaderRecommendedBlogUiState) = with(binding) { - with(uiState) { - siteName.text = name - siteUrl.text = url - uiHelpers.setTextOrHide(siteDescription, description) - siteFollowButton.apply { - setIsFollowed(isFollowed) - contentDescription = context.getString(followContentDescription.stringRes) - setOnClickListener { - onFollowClicked(uiState) - } - } - updateBlogImage(iconUrl) + fun onBind(uiState: ReaderRecommendedBlogUiState) = + with(binding) { + siteName.text = uiState.name + siteUrl.text = uiState.url + updateSiteFollowButton(uiState, this) + updateBlogImage(uiState.iconUrl) root.setOnClickListener { - onItemClicked(blogId, feedId, isFollowed) + uiState.onItemClicked(uiState.blogId, uiState.feedId, uiState.isFollowed) + } + } + + private fun updateSiteFollowButton( + uiState: ReaderRecommendedBlogUiState, + binding: ReaderRecommendedBlogItemBinding + ) { + with(binding.siteFollowButton) { + isEnabled = uiState.isFollowEnabled + setIsFollowed(uiState.isFollowed) + contentDescription = context.getString(uiState.followContentDescription.stringRes) + setOnClickListener { + uiState.onFollowClicked(uiState) } } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderRecommendedBlogsCardNewViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderRecommendedBlogsCardNewViewHolder.kt index b74d57be38c9..40bdc0da0ef7 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderRecommendedBlogsCardNewViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderRecommendedBlogsCardNewViewHolder.kt @@ -1,21 +1,21 @@ package org.wordpress.android.ui.reader.discover.viewholders import android.view.ViewGroup -import org.wordpress.android.databinding.ReaderRecommendedBlogsCardNewBinding +import org.wordpress.android.databinding.ReaderRecommendedBlogsCardBinding import org.wordpress.android.ui.reader.discover.ReaderCardUiState import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderRecommendedBlogsCardUiState -import org.wordpress.android.ui.reader.discover.ReaderRecommendedBlogsNewAdapter +import org.wordpress.android.ui.reader.discover.ReaderRecommendedBlogsAdapter import org.wordpress.android.util.extensions.viewBinding import org.wordpress.android.util.image.ImageManager class ReaderRecommendedBlogsCardNewViewHolder( parentView: ViewGroup, imageManager: ImageManager, -) : ReaderViewHolder( - parentView.viewBinding(ReaderRecommendedBlogsCardNewBinding::inflate) +) : ReaderViewHolder( + parentView.viewBinding(ReaderRecommendedBlogsCardBinding::inflate) ) { private val recommendedBlogsAdapter = - ReaderRecommendedBlogsNewAdapter(imageManager) + ReaderRecommendedBlogsAdapter(imageManager) init { with(binding) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderRecommendedBlogsCardViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderRecommendedBlogsCardViewHolder.kt deleted file mode 100644 index 1823d0c29913..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderRecommendedBlogsCardViewHolder.kt +++ /dev/null @@ -1,38 +0,0 @@ -package org.wordpress.android.ui.reader.discover.viewholders - -import android.view.ViewGroup -import org.wordpress.android.R -import org.wordpress.android.databinding.ReaderRecommendedBlogsCardBinding -import org.wordpress.android.ui.reader.discover.ReaderCardUiState -import org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderRecommendedBlogsCardUiState -import org.wordpress.android.ui.reader.discover.ReaderRecommendedBlogsAdapter -import org.wordpress.android.ui.utils.UiHelpers -import org.wordpress.android.ui.utils.addItemDivider -import org.wordpress.android.util.AppLog -import org.wordpress.android.util.extensions.viewBinding -import org.wordpress.android.util.image.ImageManager - -class ReaderRecommendedBlogsCardViewHolder( - parentView: ViewGroup, - imageManager: ImageManager, - uiHelpers: UiHelpers, -) : ReaderViewHolder( - parentView.viewBinding(ReaderRecommendedBlogsCardBinding::inflate) -) { - private val recommendedBlogsAdapter = - ReaderRecommendedBlogsAdapter(imageManager, uiHelpers) - - init { - with(binding) { - recommendedBlogs.adapter = recommendedBlogsAdapter - parentView.context.getDrawable(R.drawable.default_list_divider)?.let { - recommendedBlogs.addItemDivider(it) - } ?: AppLog.w(AppLog.T.READER, "Discover list divider null") - } - } - - override fun onBind(uiState: ReaderCardUiState) { - uiState as ReaderRecommendedBlogsCardUiState - recommendedBlogsAdapter.submitList(uiState.blogs) - } -} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/tagsfeed/ReaderTagsFeedViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/tagsfeed/ReaderTagsFeedViewModel.kt index 149db5634938..3f3edc1743f8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/tagsfeed/ReaderTagsFeedViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/tagsfeed/ReaderTagsFeedViewModel.kt @@ -511,7 +511,7 @@ class ReaderTagsFeedViewModel @Inject constructor( val photonHeight = (photonWidth * FEATURED_IMAGE_HEIGHT_WIDTH_RATION).toInt() _openMoreMenuEvents.postValue( MoreMenuUiState( - readerCardUiState = readerPostUiStateBuilder.mapPostToNewUiState( + readerCardUiState = readerPostUiStateBuilder.mapPostToUiState( source = ReaderTracker.SOURCE_TAGS_FEED, post = post, photonWidth = photonWidth, @@ -625,7 +625,7 @@ class ReaderTagsFeedViewModel @Inject constructor( } data class MoreMenuUiState( - val readerCardUiState: ReaderCardUiState.ReaderPostNewUiState, + val readerCardUiState: ReaderCardUiState.ReaderPostUiState, val readerPostCardActions: List, ) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderExpandableTagsView.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderExpandableTagsView.kt index 6ea2323c6ecc..122a77eedd8b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderExpandableTagsView.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderExpandableTagsView.kt @@ -19,7 +19,6 @@ import org.wordpress.android.ui.reader.models.ReaderReadingPreferences import org.wordpress.android.ui.reader.tracker.ReaderTracker import org.wordpress.android.ui.reader.utils.toTypeface import org.wordpress.android.ui.utils.UiHelpers -import org.wordpress.android.util.config.ReaderImprovementsFeatureConfig import javax.inject.Inject import android.R as AndroidR @@ -34,9 +33,6 @@ class ReaderExpandableTagsView @JvmOverloads constructor( @Inject lateinit var readerTracker: ReaderTracker - @Inject - lateinit var readerImprovementsFeatureConfig: ReaderImprovementsFeatureConfig - private var tagsUiState: List? = null private val tagChips @@ -57,8 +53,7 @@ class ReaderExpandableTagsView @JvmOverloads constructor( private val isOverflowIndicatorChipOutsideBounds get() = !isChipWithinBounds(overflowIndicatorChip) - private val chipStyle - get() = if (readerImprovementsFeatureConfig.isEnabled()) ChipStyle.New else ChipStyle.Legacy + private val chipStyle = ChipStyle() init { (context.applicationContext as WordPress).component().inject(this) @@ -166,10 +161,7 @@ class ReaderExpandableTagsView @JvmOverloads constructor( resources.getString(R.string.reader_expandable_tags_view_overflow_indicator_collapse_title) } - chipStyle.overflowBackgroundColorRes(isSingleLine)?.let { chipBackgroundColorRes -> - overflowIndicatorChip.setChipBackgroundColorResource(chipBackgroundColorRes) - } - chipStyle.overflowStrokeColorRes(isSingleLine)?.let { chipStrokeColorRes -> + chipStyle.overflowStrokeColorRes(isSingleLine).let { chipStrokeColorRes -> overflowIndicatorChip.setChipStrokeColorResource(chipStrokeColorRes) } } @@ -184,62 +176,25 @@ class ReaderExpandableTagsView @JvmOverloads constructor( }) } - private sealed interface ChipStyle { - @get:LayoutRes - val chipLayoutRes: Int + private class ChipStyle { @get:LayoutRes - val overflowChipLayoutRes: Int + val chipLayoutRes: Int = R.layout.reader_expandable_tags_view_chip - fun overflowChipText(resources: Resources, hiddenChipsCount: Int): String + @get:LayoutRes + val overflowChipLayoutRes: Int = R.layout.reader_expandable_tags_view_overflow_chip - @ColorRes - fun overflowBackgroundColorRes(isCollapsed: Boolean): Int? = null + fun overflowChipText(resources: Resources, hiddenChipsCount: Int): String = + String.format( + resources.getString(R.string.reader_expandable_tags_view_overflow_indicator_expand_title_new), + hiddenChipsCount.toString() + ) @ColorRes - fun overflowStrokeColorRes(isCollapsed: Boolean): Int? = null - - object Legacy : ChipStyle { - override val chipLayoutRes: Int - get() = R.layout.reader_expandable_tags_view_chip - override val overflowChipLayoutRes: Int - get() = R.layout.reader_expandable_tags_view_overflow_chip - - override fun overflowChipText(resources: Resources, hiddenChipsCount: Int): String { - return resources.getString( - R.string.reader_expandable_tags_view_overflow_indicator_expand_title, - hiddenChipsCount.toString() - ) - } - - override fun overflowBackgroundColorRes(isCollapsed: Boolean): Int { - return if (isCollapsed) { - R.color.on_surface_chip - } else { - AndroidR.color.transparent - } - } - } - - object New : ChipStyle { - override val chipLayoutRes: Int - get() = R.layout.reader_expandable_tags_view_chip_new - override val overflowChipLayoutRes: Int - get() = R.layout.reader_expandable_tags_view_overflow_chip_new - - override fun overflowChipText(resources: Resources, hiddenChipsCount: Int): String { - return resources.getString( - R.string.reader_expandable_tags_view_overflow_indicator_expand_title_new, - hiddenChipsCount.toString() - ) + fun overflowStrokeColorRes(isCollapsed: Boolean): Int = + if (isCollapsed) { + R.color.reader_chip_stroke_color + } else { + AndroidR.color.transparent } - - override fun overflowStrokeColorRes(isCollapsed: Boolean): Int { - return if (isCollapsed) { - R.color.reader_chip_stroke_color - } else { - AndroidR.color.transparent - } - } - } } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailHeaderView.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailHeaderView.kt index 40de09630823..611ac23f0e9c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailHeaderView.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailHeaderView.kt @@ -4,15 +4,11 @@ import android.content.Context import android.util.AttributeSet import android.util.TypedValue import android.view.LayoutInflater -import android.view.ViewGroup -import android.widget.ImageView import android.widget.LinearLayout import androidx.core.view.isVisible -import com.google.android.material.textview.MaterialTextView import org.wordpress.android.R import org.wordpress.android.WordPress import org.wordpress.android.databinding.ReaderPostDetailHeaderViewBinding -import org.wordpress.android.databinding.ReaderPostDetailHeaderViewNewBinding import org.wordpress.android.ui.reader.models.ReaderReadingPreferences import org.wordpress.android.ui.reader.utils.ReaderUtils import org.wordpress.android.ui.reader.utils.toTypeface @@ -22,7 +18,6 @@ import org.wordpress.android.ui.reader.views.uistates.ReaderBlogSectionUiState import org.wordpress.android.ui.reader.views.uistates.ReaderPostDetailsHeaderViewUiState.ReaderPostDetailsHeaderUiState import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.ui.utils.UiString -import org.wordpress.android.util.config.ReaderImprovementsFeatureConfig import org.wordpress.android.util.extensions.getDrawableResIdFromAttribute import org.wordpress.android.util.extensions.setVisible import org.wordpress.android.util.image.ImageManager @@ -37,7 +32,7 @@ class ReaderPostDetailHeaderView @JvmOverloads constructor( attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : LinearLayout(context, attrs, defStyleAttr) { - private val binding: ReaderPostDetailHeaderBinding + private val binding: ReaderPostDetailHeaderViewBinding @Inject lateinit var imageManager: ImageManager @@ -45,24 +40,9 @@ class ReaderPostDetailHeaderView @JvmOverloads constructor( @Inject lateinit var uiHelpers: UiHelpers - @Inject - lateinit var readerImprovementsFeatureConfig: ReaderImprovementsFeatureConfig - init { (context.applicationContext as WordPress).component().inject(this) - binding = if (readerImprovementsFeatureConfig.isEnabled()) { - val viewBinding = ReaderPostDetailHeaderViewNewBinding.inflate(LayoutInflater.from(context), this, true) - ReaderPostDetailHeaderBinding.ImprovementsEnabled( - viewBinding, - uiHelpers - ) - } else { - val viewBinding = ReaderPostDetailHeaderViewBinding.inflate(LayoutInflater.from(context), this, true) - ReaderPostDetailHeaderBinding.ImprovementsDisabled( - viewBinding, - uiHelpers - ) - } + binding = ReaderPostDetailHeaderViewBinding.inflate(LayoutInflater.from(context), this, true) } fun updatePost( @@ -76,10 +56,9 @@ class ReaderPostDetailHeaderView @JvmOverloads constructor( setAuthorAndDate(uiState.authorName, uiState.dateLine) - uiHelpers.setTextOrHide(blogNameText, uiState.blogSectionUiState.blogName) - blogUrlText?.let { uiHelpers.setTextOrHide(it, uiState.blogSectionUiState.blogUrl) } + uiHelpers.setTextOrHide(layoutBlogSection.blogSectionTextBlogName, uiState.blogSectionUiState.blogName) - followButton.update(uiState.followButtonUiState) + headerFollowButton.update(uiState.followButtonUiState) updateAvatars(uiState.blogSectionUiState) updateBlogSectionClick(uiState.blogSectionUiState) @@ -87,24 +66,24 @@ class ReaderPostDetailHeaderView @JvmOverloads constructor( updateInteractionSection(uiState.interactionSectionUiState, readingPreferences) } - private fun ReaderPostDetailHeaderBinding.updateTitle( + private fun ReaderPostDetailHeaderViewBinding.updateTitle( title: UiString?, readingPreferences: ReaderReadingPreferences? ) { - uiHelpers.setTextOrHide(titleText, title) + uiHelpers.setTextOrHide(textTitle, title) readingPreferences?.let { prefs -> // Using the base font from the Improved header Theme for now val fontSize = resources.getDimension(R.dimen.text_sz_double_extra_large) * prefs.fontSize.multiplier - titleText.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) - titleText.typeface = prefs.fontFamily.toTypeface() + textTitle.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) + textTitle.typeface = prefs.fontFamily.toTypeface() } } - private fun ReaderPostDetailHeaderBinding.updateBlogSectionClick( + private fun ReaderPostDetailHeaderViewBinding.updateBlogSectionClick( state: ReaderBlogSectionUiState ) { - blogSectionRoot.apply { + layoutBlogSection.root.apply { setBackgroundResource(context.getDrawableResIdFromAttribute(state.blogSectionClickData?.background ?: 0)) state.blogSectionClickData?.onBlogSectionClicked?.let { onClick -> setOnClickListener { onClick.invoke() } @@ -115,7 +94,8 @@ class ReaderPostDetailHeaderView @JvmOverloads constructor( } } - private fun ReaderPostDetailHeaderBinding.updateAvatars(state: ReaderBlogSectionUiState) { + private fun ReaderPostDetailHeaderViewBinding.updateAvatars(state: ReaderBlogSectionUiState) { + val blogAvatarImage = layoutBlogSection.blogSectionImageBlogAvatar uiHelpers.updateVisibility(blogAvatarImage, state.avatarOrBlavatarUrl != null) if (state.avatarOrBlavatarUrl == null) { imageManager.cancelRequestAndClearImageView(blogAvatarImage) @@ -123,6 +103,7 @@ class ReaderPostDetailHeaderView @JvmOverloads constructor( imageManager.loadIntoCircle(blogAvatarImage, state.blavatarType, state.avatarOrBlavatarUrl) } + val authorAvatarImage = layoutBlogSection.blogSectionImageAuthorAvatar val showAuthorsAvatar = state.authorAvatarUrl != null && state.isAuthorAvatarVisible uiHelpers.updateVisibility(authorAvatarImage, showAuthorsAvatar) if (!showAuthorsAvatar) { @@ -139,120 +120,46 @@ class ReaderPostDetailHeaderView @JvmOverloads constructor( setOnClickListener { followButtonUiState.onFollowButtonClicked?.invoke() } } - private interface ReaderPostDetailHeaderBinding { - val titleText: MaterialTextView - val blogNameText: MaterialTextView - val blogUrlText: MaterialTextView? - val expandableTagsView: ReaderExpandableTagsView - val blogAvatarImage: ImageView - val authorAvatarImage: ImageView - val followButton: ReaderFollowButton - val blogSectionRoot: ViewGroup - - fun setAuthorAndDate(authorName: String?, dateLine: String) - - fun updateInteractionSection(state: InteractionSectionUiState, readingPreferences: ReaderReadingPreferences?) - - class ImprovementsDisabled( - private val binding: ReaderPostDetailHeaderViewBinding, - private val uiHelpers: UiHelpers, - ) : ReaderPostDetailHeaderBinding { - override val titleText: MaterialTextView - get() = binding.textTitle - override val blogNameText: MaterialTextView - get() = binding.layoutBlogSection.textAuthorAndBlogName - override val blogUrlText: MaterialTextView - get() = binding.layoutBlogSection.textBlogUrl - override val expandableTagsView: ReaderExpandableTagsView - get() = binding.expandableTagsView - override val blogAvatarImage: ImageView - get() = binding.layoutBlogSection.imageAvatarOrBlavatar - override val authorAvatarImage: ImageView - get() = binding.layoutBlogSection.authorsAvatar - override val followButton: ReaderFollowButton - get() = binding.headerFollowButton - override val blogSectionRoot: ViewGroup - get() = binding.layoutBlogSection.root - - override fun setAuthorAndDate(authorName: String?, dateLine: String) = with(binding) { - uiHelpers.setTextOrHide(textAuthor, authorName) - uiHelpers.setTextOrHide(postDetailTextDateline, dateLine) - - textBy.setVisible(authorName != null) - postDetailDotSeparator.setVisible(authorName != null) - } - - override fun updateInteractionSection( - state: InteractionSectionUiState, - readingPreferences: ReaderReadingPreferences? - ) { - // do nothing - } - } + private fun setAuthorAndDate(authorName: String?, dateLine: String) = with(binding.layoutBlogSection) { + uiHelpers.setTextOrHide(blogSectionTextAuthor, authorName) + uiHelpers.setTextOrHide(blogSectionTextDateline, dateLine) - class ImprovementsEnabled( - private val binding: ReaderPostDetailHeaderViewNewBinding, - private val uiHelpers: UiHelpers, - ) : ReaderPostDetailHeaderBinding { - override val titleText: MaterialTextView - get() = binding.textTitle - override val blogNameText: MaterialTextView - get() = binding.layoutBlogSection.blogSectionTextBlogName - override val blogUrlText: MaterialTextView? - get() = null - override val expandableTagsView: ReaderExpandableTagsView - get() = binding.expandableTagsView - override val blogAvatarImage: ImageView - get() = binding.layoutBlogSection.blogSectionImageBlogAvatar - override val authorAvatarImage: ImageView - get() = binding.layoutBlogSection.blogSectionImageAuthorAvatar - override val followButton: ReaderFollowButton - get() = binding.headerFollowButton - override val blogSectionRoot: ViewGroup - get() = binding.layoutBlogSection.root - - override fun setAuthorAndDate(authorName: String?, dateLine: String) = with(binding.layoutBlogSection) { - uiHelpers.setTextOrHide(blogSectionTextAuthor, authorName) - uiHelpers.setTextOrHide(blogSectionTextDateline, dateLine) - - blogSectionDotSeparator.setVisible(authorName != null) - } - - override fun updateInteractionSection( - state: InteractionSectionUiState, - readingPreferences: ReaderReadingPreferences? - ) { - with(binding) { - val viewContext = root.context - - val likeCount = state.likeCount - val commentCount = state.commentCount - - val likeLabel = ReaderUtils.getShortLikeLabelText(viewContext, likeCount) - .takeIf { likeCount > 0 } - val commentLabel = ReaderUtils.getShortCommentLabelText(viewContext, commentCount) - .takeIf { commentCount > 0 } - - uiHelpers.setTextOrHide(headerLikeCount, likeLabel) - uiHelpers.setTextOrHide(headerCommentCount, commentLabel) - headerDotSeparator.isVisible = likeLabel != null && commentLabel != null - - headerLikeCount.setOnClickListener { state.onLikesClicked() } - headerCommentCount.setOnClickListener { state.onCommentsClicked() } - - readingPreferences?.let { prefs -> - // Ideally we should get from the view theme directly, but let's hardcode it for now - val baseFontSize = viewContext.resources.getDimension(R.dimen.text_sz_medium) - val fontSize = baseFontSize * prefs.fontSize.multiplier - headerLikeCount.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) - headerCommentCount.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) - headerDotSeparator.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) + blogSectionDotSeparator.setVisible(authorName != null) + } - headerLikeCount.typeface = prefs.fontFamily.toTypeface() - headerCommentCount.typeface = prefs.fontFamily.toTypeface() - headerDotSeparator.typeface = prefs.fontFamily.toTypeface() - } - } + private fun updateInteractionSection( + state: InteractionSectionUiState, + readingPreferences: ReaderReadingPreferences? + ) { + with(binding) { + val viewContext = root.context + + val likeCount = state.likeCount + val commentCount = state.commentCount + + val likeLabel = ReaderUtils.getShortLikeLabelText(viewContext, likeCount) + .takeIf { likeCount > 0 } + val commentLabel = ReaderUtils.getShortCommentLabelText(viewContext, commentCount) + .takeIf { commentCount > 0 } + + uiHelpers.setTextOrHide(headerLikeCount, likeLabel) + uiHelpers.setTextOrHide(headerCommentCount, commentLabel) + headerDotSeparator.isVisible = likeLabel != null && commentLabel != null + + headerLikeCount.setOnClickListener { state.onLikesClicked() } + headerCommentCount.setOnClickListener { state.onCommentsClicked() } + + readingPreferences?.let { prefs -> + // Ideally we should get from the view theme directly, but let's hardcode it for now + val baseFontSize = viewContext.resources.getDimension(R.dimen.text_sz_medium) + val fontSize = baseFontSize * prefs.fontSize.multiplier + headerLikeCount.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) + headerCommentCount.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) + headerDotSeparator.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) + + headerLikeCount.typeface = prefs.fontFamily.toTypeface() + headerCommentCount.typeface = prefs.fontFamily.toTypeface() + headerDotSeparator.typeface = prefs.fontFamily.toTypeface() } } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailsHeaderViewUiStateBuilder.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailsHeaderViewUiStateBuilder.kt index 6639bb584946..7872badb82e3 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailsHeaderViewUiStateBuilder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailsHeaderViewUiStateBuilder.kt @@ -1,7 +1,6 @@ package org.wordpress.android.ui.reader.views import dagger.Reusable -import org.wordpress.android.R import org.wordpress.android.fluxc.store.AccountStore import org.wordpress.android.models.ReaderPost import org.wordpress.android.ui.reader.discover.ReaderPostTagsUiStateBuilder @@ -11,10 +10,8 @@ import org.wordpress.android.ui.reader.views.uistates.InteractionSectionUiState import org.wordpress.android.ui.reader.views.uistates.ReaderBlogSectionUiState import org.wordpress.android.ui.reader.views.uistates.ReaderPostDetailsHeaderAction import org.wordpress.android.ui.reader.views.uistates.ReaderPostDetailsHeaderViewUiState.ReaderPostDetailsHeaderUiState -import org.wordpress.android.ui.utils.UiString.UiStringRes import org.wordpress.android.ui.utils.UiString.UiStringText import org.wordpress.android.util.DateTimeUtilsWrapper -import org.wordpress.android.util.config.ReaderImprovementsFeatureConfig import javax.inject.Inject @Reusable @@ -23,7 +20,6 @@ class ReaderPostDetailsHeaderViewUiStateBuilder @Inject constructor( private val postUiStateBuilder: ReaderPostUiStateBuilder, private val readerPostTagsUiStateBuilder: ReaderPostTagsUiStateBuilder, private val dateTimeUtilsWrapper: DateTimeUtilsWrapper, - private val readerImprovementsFeatureConfig: ReaderImprovementsFeatureConfig, ) { fun mapPostToUiState( post: ReaderPost, @@ -33,7 +29,6 @@ class ReaderPostDetailsHeaderViewUiStateBuilder @Inject constructor( val textTitle = post .takeIf { post.hasTitle() } ?.title?.let { UiStringText(it) } - ?: UiStringRes(R.string.reader_untitled_post).takeIf { !readerImprovementsFeatureConfig.isEnabled() } return ReaderPostDetailsHeaderUiState( title = textTitle, @@ -67,7 +62,6 @@ class ReaderPostDetailsHeaderViewUiStateBuilder @Inject constructor( ): ReaderBlogSectionUiState { return postUiStateBuilder.mapPostToBlogSectionUiState( post, - readerImprovementsFeatureConfig.isEnabled(), onBlogSectionClicked ) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderSiteHeaderView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderSiteHeaderView.java index 7516e164beae..5ef68491adea 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderSiteHeaderView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderSiteHeaderView.java @@ -29,7 +29,6 @@ import org.wordpress.android.util.SiteUtils; import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.UrlUtils; -import org.wordpress.android.util.config.ReaderImprovementsFeatureConfig; import org.wordpress.android.util.image.BlavatarShape; import org.wordpress.android.util.image.ImageManager; @@ -62,11 +61,10 @@ public interface OnBlogInfoLoadedListener { private final ExecutorService mExecutorService = Executors.newSingleThreadExecutor(); private final Handler mMainHandler = new Handler(Looper.getMainLooper()); - + @Inject AccountStore mAccountStore; @Inject ImageManager mImageManager; @Inject ReaderTracker mReaderTracker; - @Inject ReaderImprovementsFeatureConfig mReaderImprovementsFeatureConfig; public ReaderSiteHeaderView(Context context) { this(context, null); @@ -84,13 +82,7 @@ public ReaderSiteHeaderView(Context context, AttributeSet attrs, int defStyleAtt } private void initView(Context context) { - final int layoutRes; - if (mReaderImprovementsFeatureConfig.isEnabled()) { - layoutRes = R.layout.reader_site_header_view_new; - } else { - layoutRes = R.layout.reader_site_header_view; - } - final View view = inflate(context, layoutRes, this); + final View view = inflate(context, R.layout.reader_site_header_view, this); mFollowButton = view.findViewById(R.id.follow_button); view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); } @@ -188,15 +180,11 @@ private void showBlogInfo(ReaderBlog blogInfo, String source) { txtDescription.setVisibility(View.GONE); } - if (mReaderImprovementsFeatureConfig.isEnabled()) { - final String imageUrl = blogInfo.getImageUrl(); - if (imageUrl != null && !imageUrl.isEmpty()) { - showBlavatarImage(blogInfo, blavatarImg); - } else { - blavatarImg.setVisibility(View.GONE); - } - } else { + final String imageUrl = blogInfo.getImageUrl(); + if (imageUrl != null && !imageUrl.isEmpty()) { showBlavatarImage(blogInfo, blavatarImg); + } else { + blavatarImg.setVisibility(View.GONE); } loadFollowCount(blogInfo, txtFollowCount); @@ -224,35 +212,28 @@ public void onClick(View v) { } private void loadFollowCount(ReaderBlog blogInfo, TextView txtFollowCount) { - if (mReaderImprovementsFeatureConfig.isEnabled()) { - final CompactDecimalFormat compactDecimalFormat = - CompactDecimalFormat.getInstance(LocaleManager.getSafeLocale(getContext()), - CompactDecimalFormat.CompactStyle.SHORT); - - final int followersStringRes; - if (blogInfo.numSubscribers == 1) { - followersStringRes = R.string.reader_label_subscribers_count_single; - } else { - followersStringRes = R.string.reader_label_subscribers_count; - } + final CompactDecimalFormat compactDecimalFormat = + CompactDecimalFormat.getInstance(LocaleManager.getSafeLocale(getContext()), + CompactDecimalFormat.CompactStyle.SHORT); - final String formattedNumberSubscribers; - // Reference: pcdRpT-3BI-p2#comment-5978 - if (blogInfo.numSubscribers >= MINIMUM_NUMBER_FOLLOWERS_FORMAT) { - formattedNumberSubscribers = compactDecimalFormat.format(blogInfo.numSubscribers); - } else { - formattedNumberSubscribers = NumberFormat.getInstance().format(blogInfo.numSubscribers); - } - txtFollowCount.setText(String.format( - LocaleManager.getSafeLocale(getContext()), - getContext().getString(followersStringRes), formattedNumberSubscribers) - ); + final int followersStringRes; + if (blogInfo.numSubscribers == 1) { + followersStringRes = R.string.reader_label_subscribers_count_single; + } else { + followersStringRes = R.string.reader_label_subscribers_count; + } + + final String formattedNumberSubscribers; + // Reference: pcdRpT-3BI-p2#comment-5978 + if (blogInfo.numSubscribers >= MINIMUM_NUMBER_FOLLOWERS_FORMAT) { + formattedNumberSubscribers = compactDecimalFormat.format(blogInfo.numSubscribers); } else { - txtFollowCount.setText(String.format( - LocaleManager.getSafeLocale(getContext()), - getContext().getString(R.string.reader_label_subscribe_count), - blogInfo.numSubscribers)); + formattedNumberSubscribers = NumberFormat.getInstance().format(blogInfo.numSubscribers); } + txtFollowCount.setText(String.format( + LocaleManager.getSafeLocale(getContext()), + getContext().getString(followersStringRes), formattedNumberSubscribers) + ); } private void showBlavatarImage(ReaderBlog blogInfo, ImageView blavatarImg) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagHeaderView.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagHeaderView.kt index 9955cec53611..d1b3eb6f0f9d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagHeaderView.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagHeaderView.kt @@ -5,14 +5,11 @@ import android.util.AttributeSet import android.view.LayoutInflater import android.widget.RelativeLayout import androidx.core.view.isGone -import com.google.android.material.textview.MaterialTextView import org.wordpress.android.WordPress import org.wordpress.android.databinding.ReaderTagHeaderViewBinding -import org.wordpress.android.databinding.ReaderTagHeaderViewNewBinding import org.wordpress.android.ui.reader.views.ReaderTagHeaderViewUiState.ReaderTagHeaderUiState import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.LocaleProvider -import org.wordpress.android.util.config.ReaderImprovementsFeatureConfig import javax.inject.Inject /** @@ -23,14 +20,11 @@ class ReaderTagHeaderView @JvmOverloads constructor( attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : RelativeLayout(context, attrs, defStyleAttr) { - private var binding: ReaderTagBinding + private var binding: ReaderTagHeaderViewBinding @Inject lateinit var uiHelpers: UiHelpers - @Inject - lateinit var readerImprovementsFeatureConfig: ReaderImprovementsFeatureConfig - @Inject lateinit var localeProvider: LocaleProvider @@ -38,43 +32,13 @@ class ReaderTagHeaderView @JvmOverloads constructor( init { (context.applicationContext as WordPress).component().inject(this) - binding = if (readerImprovementsFeatureConfig.isEnabled()) { - val readerTagHeaderViewNewBinding = - ReaderTagHeaderViewNewBinding.inflate(LayoutInflater.from(context), this, true) - ReaderTagBinding.ImprovementsEnabled( - textTag = readerTagHeaderViewNewBinding.textTag, - followButton = readerTagHeaderViewNewBinding.followContainer.followButton, - textTagFollowCount = readerTagHeaderViewNewBinding.followContainer.textBlogFollowCount, - ) - } else { - val readerTagHeaderViewBinding = - ReaderTagHeaderViewBinding.inflate(LayoutInflater.from(context), this, true) - ReaderTagBinding.ImprovementsDisabled( - textTag = readerTagHeaderViewBinding.textTag, - followButton = readerTagHeaderViewBinding.followButton, - ) - } - binding.followButton.setOnClickListener { onFollowBtnClicked?.invoke() } - } - - abstract class ReaderTagBinding { - abstract val textTag: MaterialTextView - abstract val followButton: ReaderFollowButton - - data class ImprovementsDisabled( - override val textTag: MaterialTextView, - override val followButton: ReaderFollowButton - ) : ReaderTagBinding() - - data class ImprovementsEnabled( - override val textTag: MaterialTextView, - override val followButton: ReaderFollowButton, - val textTagFollowCount: MaterialTextView, - ) : ReaderTagBinding() + binding = + ReaderTagHeaderViewBinding.inflate(LayoutInflater.from(context), this, true) + binding.followContainer.followButton.setOnClickListener { onFollowBtnClicked?.invoke() } } fun updateUi(uiState: ReaderTagHeaderUiState) = with(binding) { - (binding as? ReaderTagBinding.ImprovementsEnabled)?.textTagFollowCount?.isGone = true + binding.followContainer.textBlogFollowCount.isGone = true // creative-writing -> Creative Writing textTag.text = uiState.title .split("-") @@ -82,6 +46,7 @@ class ReaderTagHeaderView @JvmOverloads constructor( it.replaceFirstChar { it.titlecase(localeProvider.getAppLocale()) } } with(uiState.followButtonUiState) { + val followButton = binding.followContainer.followButton followButton.setIsFollowed(isFollowed) followButton.isEnabled = isEnabled onFollowBtnClicked = onFollowButtonClicked diff --git a/WordPress/src/main/java/org/wordpress/android/util/config/ReaderImprovementsFeatureConfig.kt b/WordPress/src/main/java/org/wordpress/android/util/config/ReaderImprovementsFeatureConfig.kt deleted file mode 100644 index f913ece9e614..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/util/config/ReaderImprovementsFeatureConfig.kt +++ /dev/null @@ -1,16 +0,0 @@ -package org.wordpress.android.util.config - -import org.wordpress.android.BuildConfig -import org.wordpress.android.annotation.Feature -import javax.inject.Inject - -private const val READER_IMPROVEMENTS_REMOTE_FIELD = "reader_improvements" - -@Feature(remoteField = READER_IMPROVEMENTS_REMOTE_FIELD, defaultValue = true) -class ReaderImprovementsFeatureConfig @Inject constructor( - appConfig: AppConfig -) : FeatureConfig( - appConfig, - BuildConfig.READER_IMPROVEMENTS, - READER_IMPROVEMENTS_REMOTE_FIELD, -) diff --git a/WordPress/src/main/res/layout/reader_cardview_removed_post.xml b/WordPress/src/main/res/layout/reader_cardview_removed_post.xml index 25da2931ae9a..52ef9975ea90 100644 --- a/WordPress/src/main/res/layout/reader_cardview_removed_post.xml +++ b/WordPress/src/main/res/layout/reader_cardview_removed_post.xml @@ -3,7 +3,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" - style="@style/ReaderCardView" + style="@style/ReaderCardViewNew" android:id="@+id/post_container" android:layout_width="match_parent" android:layout_height="wrap_content"> @@ -18,7 +18,7 @@ - - - - - - - - - - - diff --git a/WordPress/src/main/res/layout/reader_cardview_xpost.xml b/WordPress/src/main/res/layout/reader_cardview_xpost.xml index 98e73bf8f94a..50eb58f04a30 100644 --- a/WordPress/src/main/res/layout/reader_cardview_xpost.xml +++ b/WordPress/src/main/res/layout/reader_cardview_xpost.xml @@ -3,7 +3,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" - style="@style/ReaderCardView" + style="@style/ReaderCardViewNew" android:id="@+id/post_container" android:layout_width="match_parent" android:layout_height="wrap_content"> @@ -13,49 +13,57 @@ android:layout_height="wrap_content" android:padding="@dimen/reader_card_content_padding"> - - - - - + app:layout_constraintTop_toTopOf="parent"> + + + + + + + + diff --git a/WordPress/src/main/res/layout/reader_cardview_xpost_new.xml b/WordPress/src/main/res/layout/reader_cardview_xpost_new.xml deleted file mode 100644 index 50eb58f04a30..000000000000 --- a/WordPress/src/main/res/layout/reader_cardview_xpost_new.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/WordPress/src/main/res/layout/reader_expandable_tags_view_chip_new.xml b/WordPress/src/main/res/layout/reader_expandable_tags_view_chip_new.xml deleted file mode 100644 index 333ff4dd5277..000000000000 --- a/WordPress/src/main/res/layout/reader_expandable_tags_view_chip_new.xml +++ /dev/null @@ -1,8 +0,0 @@ - - diff --git a/WordPress/src/main/res/layout/reader_expandable_tags_view_overflow_chip.xml b/WordPress/src/main/res/layout/reader_expandable_tags_view_overflow_chip.xml index 90754b506b61..43894b82f1ce 100644 --- a/WordPress/src/main/res/layout/reader_expandable_tags_view_overflow_chip.xml +++ b/WordPress/src/main/res/layout/reader_expandable_tags_view_overflow_chip.xml @@ -6,5 +6,4 @@ android:layout_height="wrap_content" android:checkable="true" android:text="@string/reader_expandable_tags_view_overflow_indicator_collapse_title" - app:rippleColor="@color/on_surface_disabled_transparent_selector" style="@style/ReaderExpandableTagsViewChip" /> diff --git a/WordPress/src/main/res/layout/reader_expandable_tags_view_overflow_chip_new.xml b/WordPress/src/main/res/layout/reader_expandable_tags_view_overflow_chip_new.xml deleted file mode 100644 index fb125ec1724d..000000000000 --- a/WordPress/src/main/res/layout/reader_expandable_tags_view_overflow_chip_new.xml +++ /dev/null @@ -1,9 +0,0 @@ - - diff --git a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml index 094d497c93e7..9423149afb78 100644 --- a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml +++ b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml @@ -162,7 +162,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" - tools:layout="@layout/reader_include_post_detail_footer_new" /> + tools:layout="@layout/reader_include_post_detail_footer" /> + android:layout_height="wrap_content" + android:background="?attr/colorSurface"> - + app:layout_constraintHorizontal_chainStyle="spread_inside" /> - + app:layout_constrainedWidth="true" /> - + app:layout_constrainedWidth="true" /> - + app:layout_constrainedWidth="true" /> diff --git a/WordPress/src/main/res/layout/reader_include_post_detail_footer_new.xml b/WordPress/src/main/res/layout/reader_include_post_detail_footer_new.xml deleted file mode 100644 index 1106421ec8aa..000000000000 --- a/WordPress/src/main/res/layout/reader_include_post_detail_footer_new.xml +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/WordPress/src/main/res/layout/reader_interest_card.xml b/WordPress/src/main/res/layout/reader_interest_card.xml index 3714b62b67a6..0c6671459880 100644 --- a/WordPress/src/main/res/layout/reader_interest_card.xml +++ b/WordPress/src/main/res/layout/reader_interest_card.xml @@ -1,36 +1,56 @@ - + android:layout_height="wrap_content" + android:background="?android:colorBackground"> - + android:layout_height="wrap_content" + android:layout_margin="@dimen/margin_large" + app:cardBackgroundColor="@color/reader_you_might_like_background" + app:cardCornerRadius="@dimen/margin_medium" + app:cardElevation="0dp"> - - - - - + android:paddingBottom="@dimen/margin_medium" + android:paddingTop="@dimen/margin_extra_large"> + + + + + + + + + + + diff --git a/WordPress/src/main/res/layout/reader_interest_card_new.xml b/WordPress/src/main/res/layout/reader_interest_card_new.xml deleted file mode 100644 index 0c6671459880..000000000000 --- a/WordPress/src/main/res/layout/reader_interest_card_new.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/WordPress/src/main/res/layout/reader_interest_item.xml b/WordPress/src/main/res/layout/reader_interest_item.xml index 95c3296904fb..0038b53a1d0e 100644 --- a/WordPress/src/main/res/layout/reader_interest_item.xml +++ b/WordPress/src/main/res/layout/reader_interest_item.xml @@ -1,23 +1,8 @@ - - - - + tools:text="A Text in a chip" /> diff --git a/WordPress/src/main/res/layout/reader_interest_item_new.xml b/WordPress/src/main/res/layout/reader_interest_item_new.xml deleted file mode 100644 index 628aa040c3c3..000000000000 --- a/WordPress/src/main/res/layout/reader_interest_item_new.xml +++ /dev/null @@ -1,8 +0,0 @@ - - diff --git a/WordPress/src/main/res/layout/reader_post_detail_header_view.xml b/WordPress/src/main/res/layout/reader_post_detail_header_view.xml index 90319c8161b8..a7e0c6f1d30e 100644 --- a/WordPress/src/main/res/layout/reader_post_detail_header_view.xml +++ b/WordPress/src/main/res/layout/reader_post_detail_header_view.xml @@ -7,30 +7,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - - - - - + app:layout_constraintTop_toTopOf="parent" /> + tools:text="Post Title: This could be a quite big title for this nice post" /> + + android:layout_marginTop="@dimen/margin_medium" + app:layout_constraintHorizontal_chainStyle="packed" + app:layout_constraintHorizontal_bias="0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toStartOf="@id/header_dot_separator" + app:layout_constraintTop_toBottomOf="@id/text_title" + app:layout_constrainedWidth="true" + tools:text="15 likes" /> + android:importantForAccessibility="no" + app:layout_constraintStart_toEndOf="@id/header_like_count" + app:layout_constraintEnd_toStartOf="@id/header_comment_count" + app:layout_constraintTop_toBottomOf="@id/text_title" + app:layout_constrainedWidth="true" /> + + + + + + + app:layout_constraintTop_toBottomOf="@id/reader_card_interactions_bottom_barrier" + tools:visibility="visible"/> diff --git a/WordPress/src/main/res/layout/reader_post_detail_header_view_new.xml b/WordPress/src/main/res/layout/reader_post_detail_header_view_new.xml deleted file mode 100644 index a7e0c6f1d30e..000000000000 --- a/WordPress/src/main/res/layout/reader_post_detail_header_view_new.xml +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WordPress/src/main/res/layout/reader_recommended_blog_item.xml b/WordPress/src/main/res/layout/reader_recommended_blog_item.xml index 4dcf2bcb37d8..54ed1bc6c9ae 100644 --- a/WordPress/src/main/res/layout/reader_recommended_blog_item.xml +++ b/WordPress/src/main/res/layout/reader_recommended_blog_item.xml @@ -4,102 +4,65 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?attr/selectableItemBackground"> + android:background="?attr/selectableItemBackground" + android:paddingBottom="@dimen/margin_medium_large" + android:paddingEnd="@dimen/margin_extra_large" + android:paddingStart="@dimen/margin_extra_large" + android:paddingTop="@dimen/margin_medium_large"> - - - - - - - - + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_chainStyle="packed" + tools:text="Site site Site site Site site Site site Site site Site site Site site " /> - - + tools:text="site.com site.com site.com site.com site.com site.com site.com site.com " /> + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> diff --git a/WordPress/src/main/res/layout/reader_recommended_blog_item_new.xml b/WordPress/src/main/res/layout/reader_recommended_blog_item_new.xml deleted file mode 100644 index 54ed1bc6c9ae..000000000000 --- a/WordPress/src/main/res/layout/reader_recommended_blog_item_new.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - diff --git a/WordPress/src/main/res/layout/reader_recommended_blogs_card.xml b/WordPress/src/main/res/layout/reader_recommended_blogs_card.xml index 0f73ecde117f..4897bd40c5c5 100644 --- a/WordPress/src/main/res/layout/reader_recommended_blogs_card.xml +++ b/WordPress/src/main/res/layout/reader_recommended_blogs_card.xml @@ -1,40 +1,54 @@ - + android:layout_height="wrap_content" + android:background="?android:colorBackground"> - + android:layout_height="wrap_content" + android:layout_margin="@dimen/margin_large" + app:cardElevation="0dp" + app:cardBackgroundColor="@color/reader_you_might_like_background" + app:cardCornerRadius="@dimen/margin_medium"> - + android:paddingBottom="@dimen/margin_extra_large" + android:paddingTop="@dimen/margin_extra_large"> - - - + + + + + + + + diff --git a/WordPress/src/main/res/layout/reader_recommended_blogs_card_new.xml b/WordPress/src/main/res/layout/reader_recommended_blogs_card_new.xml deleted file mode 100644 index 28e942f12f3b..000000000000 --- a/WordPress/src/main/res/layout/reader_recommended_blogs_card_new.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/WordPress/src/main/res/layout/reader_site_header_view.xml b/WordPress/src/main/res/layout/reader_site_header_view.xml index c9e2b2afb772..6717aa2076ef 100644 --- a/WordPress/src/main/res/layout/reader_site_header_view.xml +++ b/WordPress/src/main/res/layout/reader_site_header_view.xml @@ -1,89 +1,74 @@ - - - - - - - - - + android:layout_height="wrap_content" + android:padding="@dimen/margin_extra_large"> - + - - + + + + + diff --git a/WordPress/src/main/res/layout/reader_site_header_view_new.xml b/WordPress/src/main/res/layout/reader_site_header_view_new.xml deleted file mode 100644 index 53d76c79b907..000000000000 --- a/WordPress/src/main/res/layout/reader_site_header_view_new.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/WordPress/src/main/res/layout/reader_tag_header_view.xml b/WordPress/src/main/res/layout/reader_tag_header_view.xml index 9a1b91a6b0a2..01ed19db8532 100644 --- a/WordPress/src/main/res/layout/reader_tag_header_view.xml +++ b/WordPress/src/main/res/layout/reader_tag_header_view.xml @@ -1,10 +1,9 @@ - @@ -12,29 +11,25 @@ android:id="@+id/layout_tag_info" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingStart="@dimen/reader_tag_header_horizontal_padding" - android:paddingEnd="@dimen/reader_tag_header_horizontal_padding" - android:paddingTop="@dimen/reader_tag_header_vertical_padding" - android:paddingBottom="@dimen/reader_tag_header_vertical_padding"> + android:padding="@dimen/margin_extra_large"> + tools:text="Lorem ipsum dolor sit amet" /> - - - - - - - - - - - - - diff --git a/WordPress/src/main/res/values-night/colors.xml b/WordPress/src/main/res/values-night/colors.xml index 0c22d35eff0f..f338b5879b70 100644 --- a/WordPress/src/main/res/values-night/colors.xml +++ b/WordPress/src/main/res/values-night/colors.xml @@ -45,7 +45,6 @@ @color/background_dark - @color/background_dark @color/background_dark @color/white diff --git a/WordPress/src/main/res/values/colors.xml b/WordPress/src/main/res/values/colors.xml index 724347897179..9495d5e7b512 100644 --- a/WordPress/src/main/res/values/colors.xml +++ b/WordPress/src/main/res/values/colors.xml @@ -61,8 +61,7 @@ @color/background_default - @color/neutral_0 - @color/white + @color/white #ffededed diff --git a/WordPress/src/main/res/values/dimens.xml b/WordPress/src/main/res/values/dimens.xml index c9bebda681cf..18cac035775e 100644 --- a/WordPress/src/main/res/values/dimens.xml +++ b/WordPress/src/main/res/values/dimens.xml @@ -127,14 +127,11 @@ @dimen/reader_detail_margin_normal 96dp - 12dp 18dp - 6dp - 0dp + 0dp 0dp 0dp - 20dp 56dp @@ -143,10 +140,6 @@ 16dp - - 20dp - 40dp - 20dp 4dp @@ -230,15 +223,10 @@ 6dp - 16dp 12dp 8dp - 2dp - 1dp - - 4dp - 24dp + 1dp 5dp 1dp diff --git a/WordPress/src/main/res/values/reader_styles.xml b/WordPress/src/main/res/values/reader_styles.xml index f9aea6b3e587..d49ba7ba9aaf 100644 --- a/WordPress/src/main/res/values/reader_styles.xml +++ b/WordPress/src/main/res/values/reader_styles.xml @@ -47,22 +47,7 @@ 1 @dimen/material_emphasis_high_type - - - - - + - - - - - - - - - - - - - - - - - - - - - - - -