Skip to content

Commit 5cfe96f

Browse files
authored
CMM-1011 reader blog page logged out subscribe (#22378)
* Making the subscribe CTA to follow the same approach as in other reader cards and pages * Fixing snackbar usage * Using a bottomsheet to login * Using the bottomsheet in all the scenarios * Navigating to Me instead of login to follow the same approach as in other reader cases
1 parent 2be71e4 commit 5cfe96f

11 files changed

Lines changed: 115 additions & 46 deletions

WordPress/src/main/java/org/wordpress/android/ui/ActivityLauncher.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1415,6 +1415,14 @@ public static void newBlogForResult(Activity activity, SiteCreationSource source
14151415
activity.startActivityForResult(intent, RequestCodes.CREATE_SITE);
14161416
}
14171417

1418+
public static void showMainActivityAndMeScreen(Context context) {
1419+
Intent intent = new Intent(context, WPMainActivity.class);
1420+
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
1421+
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
1422+
intent.putExtra(WPMainActivity.ARG_OPEN_PAGE, WPMainActivity.ARG_ME);
1423+
context.startActivity(intent);
1424+
}
1425+
14181426
public static void showMainActivityAndSiteCreationActivity(Activity activity, SiteCreationSource source) {
14191427
// If we just wanted to have WPMainActivity in the back stack after starting SiteCreationActivity, we could have
14201428
// used a TaskStackBuilder to do so. However, since we want to handle the SiteCreationActivity result in

WordPress/src/main/java/org/wordpress/android/ui/main/WPMainActivity.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ public class WPMainActivity extends BaseAppCompatActivity implements
247247
public static final String ARG_IS_CHANGING_CONFIGURATION = "IS_CHANGING_CONFIGURATION";
248248
public static final String ARG_BYPASS_MIGRATION = "bypass_migration";
249249
public static final String ARG_MEDIA = "show_media";
250+
public static final String ARG_ME = "show_me";
250251
public static final String ARG_OPEN_PAGE_MESSAGE = "open_page_message";
251252
private boolean mIsChangingConfiguration = false;
252253
private WPMainNavigationView mBottomNav;
@@ -956,6 +957,9 @@ private void handleOpenPageIntent(@NonNull Intent intent) {
956957
}
957958
mActivityNavigator.viewCurrentBlogMedia(this, getSelectedSite());
958959
break;
960+
case ARG_ME:
961+
if (mBottomNav != null) mBottomNav.setCurrentSelectedPage(PageType.ME);
962+
break;
959963
}
960964
} else {
961965
AppLog.e(T.MAIN, "WPMainActivity.handleOpenIntent called with an invalid argument.");

WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderInterfaces.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public interface OnFollowListener {
3535
void onFollowTapped(View view, String blogName, long blogId, long feedId);
3636

3737
void onFollowingTapped();
38+
39+
void onFollowTappedWhenLoggedOut();
3840
}
3941

4042
/*
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package org.wordpress.android.ui.reader
2+
3+
import android.os.Bundle
4+
import android.view.LayoutInflater
5+
import android.view.View
6+
import android.view.ViewGroup
7+
import android.widget.Button
8+
import android.widget.LinearLayout
9+
import androidx.recyclerview.widget.RecyclerView
10+
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
11+
import org.wordpress.android.R
12+
import org.wordpress.android.ui.ActivityLauncher
13+
import org.wordpress.android.widgets.WPTextView
14+
15+
/**
16+
* A bottom sheet that prompts the user to log in to WordPress.com.
17+
* Used when a logged-out user tries to perform actions that require authentication,
18+
* such as subscribing to a blog.
19+
*
20+
* This fragment reuses the same layout as [SubfilterPageFragment] to maintain visual consistency
21+
* with the empty state shown in the subfilter bottom sheet.
22+
*/
23+
class ReaderLoginRequiredBottomSheetFragment : BottomSheetDialogFragment() {
24+
companion object {
25+
const val TAG = "ReaderLoginRequiredBottomSheetFragment"
26+
27+
fun newInstance(): ReaderLoginRequiredBottomSheetFragment {
28+
return ReaderLoginRequiredBottomSheetFragment()
29+
}
30+
}
31+
32+
override fun onCreateView(
33+
inflater: LayoutInflater,
34+
container: ViewGroup?,
35+
savedInstanceState: Bundle?
36+
): View? {
37+
return inflater.inflate(R.layout.subfilter_page_fragment, container, false)
38+
}
39+
40+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
41+
super.onViewCreated(view, savedInstanceState)
42+
43+
// Hide the recycler view since we only want to show the empty state
44+
view.findViewById<RecyclerView>(R.id.content_recycler_view).visibility = View.GONE
45+
46+
// Show and configure the empty state container
47+
val emptyStateContainer = view.findViewById<LinearLayout>(R.id.empty_state_container)
48+
emptyStateContainer.visibility = View.VISIBLE
49+
50+
// Hide title (matching the logged-out empty state behavior)
51+
view.findViewById<WPTextView>(R.id.title).visibility = View.GONE
52+
53+
// Set the text for logged-out users
54+
view.findViewById<WPTextView>(R.id.text).setText(
55+
R.string.reader_filter_self_hosted_empty_blogs_list
56+
)
57+
58+
// Configure primary button for login
59+
val primaryButton = view.findViewById<Button>(R.id.action_button_primary)
60+
primaryButton.visibility = View.VISIBLE
61+
primaryButton.setText(R.string.reader_filter_self_hosted_empty_sites_tags_action)
62+
primaryButton.setOnClickListener {
63+
dismiss()
64+
ActivityLauncher.showMainActivityAndMeScreen(requireContext())
65+
}
66+
67+
// Hide secondary button (not needed for login-only scenario)
68+
view.findViewById<Button>(R.id.action_button_secondary).visibility = View.GONE
69+
}
70+
}

WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ import dagger.hilt.android.AndroidEntryPoint
5757
import org.greenrobot.eventbus.EventBus
5858
import org.greenrobot.eventbus.Subscribe
5959
import org.greenrobot.eventbus.ThreadMode
60-
import org.wordpress.android.BuildConfig
6160
import org.wordpress.android.R
6261
import org.wordpress.android.WordPress
6362
import org.wordpress.android.analytics.AnalyticsTracker
@@ -936,16 +935,13 @@ class ReaderPostDetailFragment : ViewPagerFragment(),
936935
is ReaderNavigationEvents.ShowPostDetail,
937936
is ReaderNavigationEvents.ShowVideoViewer,
938937
is ReaderNavigationEvents.ShowReaderSubs -> Unit // Do Nothing
939-
is ReaderNavigationEvents.ShowSignIn -> navigateToLogin()
938+
is ReaderNavigationEvents.ShowLoginRequiredBottomSheet -> showLoginRequiredBottomSheet()
940939
}
941940
}
942941

943-
private fun navigateToLogin() {
944-
if (BuildConfig.IS_JETPACK_APP) {
945-
ActivityLauncher.showSignInForResultJetpackOnly(requireActivity())
946-
} else {
947-
ActivityLauncher.showSignInForResultWpComOnly(requireActivity())
948-
}
942+
private fun showLoginRequiredBottomSheet() {
943+
ReaderLoginRequiredBottomSheetFragment.newInstance()
944+
.show(childFragmentManager, ReaderLoginRequiredBottomSheetFragment.TAG)
949945
}
950946

951947
private fun updateFeaturedImage(

WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2819,6 +2819,11 @@ class ReaderPostListFragment : ViewPagerFragment(), OnPostSelectedListener, OnFo
28192819
dispatcher.dispatch(AccountActionBuilder.newFetchSubscriptionsAction())
28202820
}
28212821

2822+
override fun onFollowTappedWhenLoggedOut() {
2823+
ReaderLoginRequiredBottomSheetFragment.newInstance()
2824+
.show(childFragmentManager, ReaderLoginRequiredBottomSheetFragment.TAG)
2825+
}
2826+
28222827
@Suppress("unused")
28232828
@Subscribe(threadMode = ThreadMode.MAIN)
28242829
fun onSubscriptionUpdated(event: OnSubscriptionUpdated) {

WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverFragment.kt

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import android.content.Intent
55
import android.os.Bundle
66
import android.view.View
77
import androidx.appcompat.app.AlertDialog
8-
import org.wordpress.android.BuildConfig
98
import androidx.core.content.ContextCompat
109
import androidx.lifecycle.ViewModelProvider
1110
import androidx.recyclerview.widget.LinearLayoutManager
@@ -24,6 +23,7 @@ import org.wordpress.android.ui.mysite.SelectedSiteRepository
2423
import org.wordpress.android.ui.pages.SnackbarMessageHolder
2524
import org.wordpress.android.ui.reader.ReaderActivityLauncher
2625
import org.wordpress.android.ui.reader.ReaderActivityLauncher.OpenUrlType
26+
import org.wordpress.android.ui.reader.ReaderLoginRequiredBottomSheetFragment
2727
import org.wordpress.android.ui.reader.ReaderPostWebViewCachingFragment
2828
import org.wordpress.android.ui.reader.comments.ThreadedCommentsActionSource.READER_POST_CARD
2929
import org.wordpress.android.ui.reader.discover.ReaderDiscoverViewModel.DiscoverUiState
@@ -40,7 +40,7 @@ import org.wordpress.android.ui.reader.discover.ReaderNavigationEvents.ShowReade
4040
import org.wordpress.android.ui.reader.discover.ReaderNavigationEvents.ShowReaderSubs
4141
import org.wordpress.android.ui.reader.discover.ReaderNavigationEvents.ShowReportPost
4242
import org.wordpress.android.ui.reader.discover.ReaderNavigationEvents.ShowReportUser
43-
import org.wordpress.android.ui.reader.discover.ReaderNavigationEvents.ShowSignIn
43+
import org.wordpress.android.ui.reader.discover.ReaderNavigationEvents.ShowLoginRequiredBottomSheet
4444
import org.wordpress.android.ui.reader.discover.ReaderNavigationEvents.ShowSitePickerForResult
4545
import org.wordpress.android.ui.reader.discover.ReaderNavigationEvents.ShowVideoViewer
4646
import org.wordpress.android.ui.reader.tracker.ReaderTracker
@@ -222,16 +222,13 @@ class ReaderDiscoverFragment : ViewPagerFragment(R.layout.reader_discover_fragme
222222
OpenUrlType.INTERNAL
223223
)
224224
is ShowReaderSubs -> ReaderActivityLauncher.showReaderSubs(requireActivity())
225-
is ShowSignIn -> navigateToLogin()
225+
is ShowLoginRequiredBottomSheet -> showLoginRequiredBottomSheet()
226226
else -> Unit // Do Nothing
227227
}
228228

229-
private fun navigateToLogin() {
230-
if (BuildConfig.IS_JETPACK_APP) {
231-
ActivityLauncher.showSignInForResultJetpackOnly(requireActivity())
232-
} else {
233-
ActivityLauncher.showSignInForResultWpComOnly(requireActivity())
234-
}
229+
private fun showLoginRequiredBottomSheet() {
230+
ReaderLoginRequiredBottomSheetFragment.newInstance()
231+
.show(childFragmentManager, ReaderLoginRequiredBottomSheetFragment.TAG)
235232
}
236233

237234
private fun showBookmarkSavedLocallyDialog(bookmarkDialog: ShowBookmarkedSavedOnlyLocallyDialog) {

WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderNavigationEvents.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,5 +69,5 @@ sealed class ReaderNavigationEvents {
6969
) : ReaderNavigationEvents()
7070

7171
data object ShowReadingPreferences : ReaderNavigationEvents()
72-
data object ShowSignIn : ReaderNavigationEvents()
72+
data object ShowLoginRequiredBottomSheet : ReaderNavigationEvents()
7373
}

WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderPostCardActionsHandler.kt

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -331,17 +331,7 @@ class ReaderPostCardActionsHandler @Inject constructor(
331331
}
332332

333333
private fun showSignInPrompt() {
334-
_snackbarEvents.postValue(
335-
Event(
336-
SnackbarMessageHolder(
337-
UiStringRes(R.string.reader_snackbar_err_cannot_follow_logged_out),
338-
UiStringRes(R.string.reader_snackbar_err_cannot_follow_logged_out_action),
339-
buttonAction = {
340-
_navigationEvents.postValue(Event(ReaderNavigationEvents.ShowSignIn))
341-
}
342-
)
343-
)
344-
)
334+
_navigationEvents.postValue(Event(ReaderNavigationEvents.ShowLoginRequiredBottomSheet))
345335
}
346336

347337
private suspend fun followSite(

WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailsHeaderViewUiStateBuilder.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.wordpress.android.ui.reader.views
22

33
import dagger.Reusable
4-
import org.wordpress.android.fluxc.store.AccountStore
54
import org.wordpress.android.models.ReaderPost
65
import org.wordpress.android.ui.reader.discover.ReaderPostTagsUiStateBuilder
76
import org.wordpress.android.ui.reader.discover.ReaderPostUiStateBuilder
@@ -16,7 +15,6 @@ import javax.inject.Inject
1615

1716
@Reusable
1817
class ReaderPostDetailsHeaderViewUiStateBuilder @Inject constructor(
19-
private val accountStore: AccountStore,
2018
private val postUiStateBuilder: ReaderPostUiStateBuilder,
2119
private val readerPostTagsUiStateBuilder: ReaderPostTagsUiStateBuilder,
2220
private val dateTimeUtilsWrapper: DateTimeUtilsWrapper,
@@ -25,7 +23,6 @@ class ReaderPostDetailsHeaderViewUiStateBuilder @Inject constructor(
2523
post: ReaderPost,
2624
onHeaderAction: (ReaderPostDetailsHeaderAction) -> Unit,
2725
): ReaderPostDetailsHeaderUiState {
28-
val hasAccessToken = accountStore.hasAccessToken()
2926
val textTitle = post
3027
.takeIf { post.hasTitle() }
3128
?.title?.let { UiStringText(it) }
@@ -44,7 +41,6 @@ class ReaderPostDetailsHeaderViewUiStateBuilder @Inject constructor(
4441
),
4542
followButtonUiState = buildFollowButtonUiState(
4643
post,
47-
hasAccessToken,
4844
onFollowClicked = { onHeaderAction(ReaderPostDetailsHeaderAction.FollowClicked) }
4945
),
5046
dateLine = buildDateLine(post),
@@ -68,14 +64,13 @@ class ReaderPostDetailsHeaderViewUiStateBuilder @Inject constructor(
6864

6965
private fun buildFollowButtonUiState(
7066
post: ReaderPost,
71-
hasAccessToken: Boolean,
7267
onFollowClicked: () -> Unit
7368
): FollowButtonUiState {
7469
return FollowButtonUiState(
7570
onFollowButtonClicked = onFollowClicked,
7671
isFollowed = post.isFollowedByCurrentUser,
77-
isEnabled = hasAccessToken,
78-
isVisible = hasAccessToken
72+
isEnabled = true,
73+
isVisible = true
7974
)
8075
}
8176

0 commit comments

Comments
 (0)