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 8c429595ebd4..6268292e6c7c 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 @@ -381,6 +381,7 @@ class ReaderPostDetailFragment : ViewPagerFragment(), initRelatedPostsView(view) initLayoutFooter(view) initSignInButton(view) + initOpenInBrowserButton(view) initProgressView(view) return view @@ -499,6 +500,16 @@ class ReaderPostDetailFragment : ViewPagerFragment(), signInButton.setOnClickListener(mSignInClickListener) } + private fun initOpenInBrowserButton(view: View) { + view.findViewById(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(R.id.progress_loading) if (postSlugsResolutionUnderway) { @@ -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) } } } @@ -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) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/ReaderPostDetailViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/ReaderPostDetailViewModel.kt index fa0b738bd4e6..c4bdcf16a6c4 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/ReaderPostDetailViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/ReaderPostDetailViewModel.kt @@ -713,7 +713,8 @@ class ReaderPostDetailViewModel @Inject constructor( _uiState.value = ErrorUiState( message = UiStringRes(getNotAuthorisedErrorMessageRes()), - signInButtonVisibility = shouldOfferSignIn + signInButtonVisibility = shouldOfferSignIn, + openInBrowserButtonVisibility = interceptedUri != null ) } @@ -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( 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 9423149afb78..85d256f9335b 100644 --- a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml +++ b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml @@ -155,6 +155,21 @@ android:layout_marginEnd="@dimen/reader_detail_margin" android:layout_marginStart="@dimen/reader_detail_margin"/> + + Unable to retrieve this post You\'re not authorized to view this post - You\'re not authorized to view this post. Use the top action button to try a browser instead. + You\'re not authorized to view this post You\'re not authorized to view this post. Try signing in to WordPress.com first. - 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. + You\'re not authorized to view this post. Try signing in to WordPress.com first. + Open in browser This post no longer exists diff --git a/WordPress/src/test/java/org/wordpress/android/ui/reader/viewmodels/ReaderPostDetailViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/reader/viewmodels/ReaderPostDetailViewModelTest.kt index bca19a8668c7..ec0e556447f2 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/reader/viewmodels/ReaderPostDetailViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/reader/viewmodels/ReaderPostDetailViewModelTest.kt @@ -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 {