Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,7 @@ class ReaderPostDetailFragment : ViewPagerFragment(),
initRelatedPostsView(view)
initLayoutFooter(view)
initSignInButton(view)
initOpenInBrowserButton(view)
initProgressView(view)

return view
Expand Down Expand Up @@ -499,6 +500,16 @@ class ReaderPostDetailFragment : ViewPagerFragment(),
signInButton.setOnClickListener(mSignInClickListener)
}

private fun initOpenInBrowserButton(view: View) {
view.findViewById<View>(R.id.open_in_browser_button).setOnClickListener {
viewModel.interceptedUri?.let { uri ->
readerTracker.trackUri(AnalyticsTracker.Stat.DEEP_LINKED_FALLBACK, uri)
ReaderActivityLauncher.openUrl(requireActivity(), uri, OpenUrlType.EXTERNAL)
requireActivity().finish()
}
}
}

private fun initProgressView(view: View) {
val progress = view.findViewById<ProgressBar>(R.id.progress_loading)
if (postSlugsResolutionUnderway) {
Expand Down Expand Up @@ -578,8 +589,10 @@ class ReaderPostDetailFragment : ViewPagerFragment(),
is ReaderPostDetailsUiState -> renderUiState(it, binding)
is ErrorUiState -> {
uiHelpers.updateVisibility(signInButton, it.signInButtonVisibility)
uiHelpers.updateVisibility(binding.openInBrowserButton, it.openInBrowserButtonVisibility)
val message = it.message?.let { msg -> uiHelpers.getTextOfUiString(requireContext(), msg) }
showError(message?.toString())
hideMenu(toolBar.menu)
}
}
}
Expand Down Expand Up @@ -1088,6 +1101,16 @@ class ReaderPostDetailFragment : ViewPagerFragment(),
// reading preferences require the feature flag to be on
val menuReadingPreferences = menu.findItem(R.id.menu_reading_preferences)
menuReadingPreferences?.isVisible = readingPreferencesFeatureConfig.isEnabled()
// show more menu
val menuMore = menu.findItem(R.id.menu_more)
menuMore?.isVisible = true
}

private fun hideMenu(menu: Menu) {
menu.findItem(R.id.menu_browse)?.isVisible = false
menu.findItem(R.id.menu_share)?.isVisible = false
menu.findItem(R.id.menu_reading_preferences)?.isVisible = false
menu.findItem(R.id.menu_more)?.isVisible = false
}

private fun handleMenuItemSelected(menuItem: MenuItem) = when (menuItem.itemId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -713,7 +713,8 @@ class ReaderPostDetailViewModel @Inject constructor(

_uiState.value = ErrorUiState(
message = UiStringRes(getNotAuthorisedErrorMessageRes()),
signInButtonVisibility = shouldOfferSignIn
signInButtonVisibility = shouldOfferSignIn,
openInBrowserButtonVisibility = interceptedUri != null
)
}

Expand Down Expand Up @@ -892,7 +893,8 @@ class ReaderPostDetailViewModel @Inject constructor(

data class ErrorUiState(
val message: UiString?,
val signInButtonVisibility: Boolean = false
val signInButtonVisibility: Boolean = false,
val openInBrowserButtonVisibility: Boolean = false
) : UiState(errorVisible = true)

data class ReaderPostDetailsUiState(
Expand Down
15 changes: 15 additions & 0 deletions WordPress/src/main/res/layout/reader_fragment_post_detail.xml
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,21 @@
android:layout_marginEnd="@dimen/reader_detail_margin"
android:layout_marginStart="@dimen/reader_detail_margin"/>

<org.wordpress.android.widgets.WPTextView
android:id="@+id/open_in_browser_button"
style="@style/WordPress.NUXPrimaryButton"
android:layout_width="match_parent"
android:layout_marginTop="@dimen/margin_extra_large"
android:layout_below="@+id/text_error"
android:clickable="true"
android:focusable="true"
android:gravity="center"
android:text="@string/reader_open_in_browser"
android:visibility="gone"
android:layout_marginEnd="@dimen/reader_detail_margin"
android:layout_marginStart="@dimen/reader_detail_margin"
tools:visibility="visible"/>

</RelativeLayout>

<ViewStub
Expand Down
5 changes: 3 additions & 2 deletions WordPress/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2382,9 +2382,10 @@
<!-- failure messages when retrieving a single reader post -->
<string name="reader_err_get_post_generic">Unable to retrieve this post</string>
<string name="reader_err_get_post_not_authorized">You\'re not authorized to view this post</string>
<string name="reader_err_get_post_not_authorized_fallback">You\'re not authorized to view this post. Use the top action button to try a browser instead.</string>
<string name="reader_err_get_post_not_authorized_fallback">You\'re not authorized to view this post</string>
<string name="reader_err_get_post_not_authorized_signin">You\'re not authorized to view this post. Try signing in to WordPress.com first.</string>
<string name="reader_err_get_post_not_authorized_signin_fallback">You\'re not authorized to view this post. Try signing in to WordPress.com first or use the top action button to open a browser instead.</string>
<string name="reader_err_get_post_not_authorized_signin_fallback">You\'re not authorized to view this post. Try signing in to WordPress.com first.</string>
<string name="reader_open_in_browser">Open in browser</string>
<string name="reader_err_get_post_not_found">This post no longer exists</string>

<!-- empty list/grid text -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -579,6 +579,34 @@ class ReaderPostDetailViewModelTest : BaseUnitTest() {
.isEqualTo(UiStringRes(R.string.reader_err_get_post_not_authorized_signin_fallback))
}

@Test
fun `given unauthorised with intercept uri, when error ui shown, then open in browser button is visible`() =
testWithoutLocalPost {
whenever(readerFetchPostUseCase.fetchPost(readerPost.blogId, readerPost.postId, viewModel.isFeed))
.thenReturn(FetchReaderPostState.Success)
val observers = init(offerSignIn = false, interceptedUrPresent = true)
whenever(readerFetchPostUseCase.fetchPost(anyLong(), anyLong(), anyBoolean()))
.thenReturn(Failed.NotAuthorised)

viewModel.onShowPost(blogId = readerPost.blogId, postId = readerPost.postId)

assertThat((observers.uiStates.last() as ErrorUiState).openInBrowserButtonVisibility).isTrue
}

@Test
fun `given unauthorised without intercept uri, when error ui shown, then open in browser button is not visible`() =
testWithoutLocalPost {
whenever(readerFetchPostUseCase.fetchPost(readerPost.blogId, readerPost.postId, viewModel.isFeed))
.thenReturn(FetchReaderPostState.Success)
val observers = init(offerSignIn = false, interceptedUrPresent = false)
whenever(readerFetchPostUseCase.fetchPost(anyLong(), anyLong(), anyBoolean()))
.thenReturn(Failed.NotAuthorised)

viewModel.onShowPost(blogId = readerPost.blogId, postId = readerPost.postId)

assertThat((observers.uiStates.last() as ErrorUiState).openInBrowserButtonVisibility).isFalse
}

/* UPDATE POST */
@Test
fun `when post is updated, then ui is updated`() = test {
Expand Down