From dad1db1a4e25727e658fb0a4b26226320b296c64 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 7 Feb 2024 14:37:13 -0500 Subject: [PATCH 1/5] An initial stab. --- .../wikipedia/categories/CategoryActivity.kt | 5 ++- .../descriptions/DescriptionEditActivity.kt | 12 +++--- .../diff/ArticleEditDetailsFragment.kt | 7 +++- .../edit/SyntaxHighlightViewAdapter.kt | 12 ++---- .../org/wikipedia/gallery/GalleryActivity.kt | 6 ++- .../java/org/wikipedia/page/PageActivity.kt | 4 -- .../java/org/wikipedia/page/PageFragment.kt | 5 ++- .../page/linkpreview/LinkPreviewDialog.kt | 42 ++++++++++++------- .../org/wikipedia/places/PlacesFragment.kt | 6 ++- .../org/wikipedia/talk/UserTalkPopupHelper.kt | 6 ++- .../main/res/layout/dialog_link_preview.xml | 17 +++++++- 11 files changed, 77 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/org/wikipedia/categories/CategoryActivity.kt b/app/src/main/java/org/wikipedia/categories/CategoryActivity.kt index e4043e88a1a..39c641394e1 100644 --- a/app/src/main/java/org/wikipedia/categories/CategoryActivity.kt +++ b/app/src/main/java/org/wikipedia/categories/CategoryActivity.kt @@ -11,6 +11,7 @@ import android.widget.TextView import androidx.activity.viewModels import androidx.annotation.StringRes import androidx.core.view.isVisible +import androidx.fragment.app.commit import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle @@ -139,7 +140,9 @@ class CategoryActivity : BaseActivity() { startActivity(newIntent(this, title)) } else { val entry = HistoryEntry(title, HistoryEntry.SOURCE_CATEGORY) - ExclusiveBottomSheetPresenter.show(supportFragmentManager, LinkPreviewDialog.newInstance(entry)) + supportFragmentManager.commit { + add(LinkPreviewDialog.newInstance(entry), "foo") + } } } diff --git a/app/src/main/java/org/wikipedia/descriptions/DescriptionEditActivity.kt b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditActivity.kt index be16f86d193..793a7bc5ec6 100644 --- a/app/src/main/java/org/wikipedia/descriptions/DescriptionEditActivity.kt +++ b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditActivity.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.Intent import android.os.Bundle import androidx.annotation.ColorInt +import androidx.fragment.app.commit import org.wikipedia.Constants import org.wikipedia.Constants.InvokeSource import org.wikipedia.activity.SingleFragmentActivity @@ -78,11 +79,12 @@ class DescriptionEditActivity : SingleFragmentActivity( ExclusiveBottomSheetPresenter.show(supportFragmentManager, ImagePreviewDialog.newInstance(summary, action)) } else { - ExclusiveBottomSheetPresenter.show(supportFragmentManager, - LinkPreviewDialog.newInstance(HistoryEntry(summary.pageTitle, - if (intent.hasExtra(Constants.INTENT_EXTRA_INVOKE_SOURCE) && intent.getSerializableExtra - (Constants.INTENT_EXTRA_INVOKE_SOURCE) === InvokeSource.PAGE_ACTIVITY) - HistoryEntry.SOURCE_EDIT_DESCRIPTION else HistoryEntry.SOURCE_SUGGESTED_EDITS))) + supportFragmentManager.commit { + add(LinkPreviewDialog.newInstance(HistoryEntry(summary.pageTitle, + if (intent.hasExtra(Constants.INTENT_EXTRA_INVOKE_SOURCE) && intent.getSerializableExtra + (Constants.INTENT_EXTRA_INVOKE_SOURCE) === InvokeSource.PAGE_ACTIVITY) + HistoryEntry.SOURCE_EDIT_DESCRIPTION else HistoryEntry.SOURCE_SUGGESTED_EDITS)), "foo") + } } } diff --git a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt index 95f7d5ce224..b168db322b9 100644 --- a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt +++ b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt @@ -21,6 +21,7 @@ import androidx.core.view.MenuProvider import androidx.core.view.isVisible import androidx.core.widget.ImageViewCompat import androidx.fragment.app.Fragment +import androidx.fragment.app.commit import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.recyclerview.widget.LinearLayoutManager @@ -274,8 +275,10 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M } else if (viewModel.pageTitle.namespace() == Namespace.FILE) { startActivity(FilePageActivity.newIntent(requireContext(), viewModel.pageTitle)) } else { - ExclusiveBottomSheetPresenter.show(childFragmentManager, LinkPreviewDialog.newInstance( - HistoryEntry(viewModel.pageTitle, HistoryEntry.SOURCE_EDIT_DIFF_DETAILS))) + childFragmentManager.commit { + add(LinkPreviewDialog.newInstance( + HistoryEntry(viewModel.pageTitle, HistoryEntry.SOURCE_EDIT_DIFF_DETAILS)), "foo") + } } } binding.newerIdButton.setOnClickListener { diff --git a/app/src/main/java/org/wikipedia/edit/SyntaxHighlightViewAdapter.kt b/app/src/main/java/org/wikipedia/edit/SyntaxHighlightViewAdapter.kt index 675508a74a3..0db427bc47c 100644 --- a/app/src/main/java/org/wikipedia/edit/SyntaxHighlightViewAdapter.kt +++ b/app/src/main/java/org/wikipedia/edit/SyntaxHighlightViewAdapter.kt @@ -6,6 +6,7 @@ import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.view.isVisible +import androidx.fragment.app.commit import org.wikipedia.Constants import org.wikipedia.edit.insertmedia.InsertMediaActivity import org.wikipedia.extensions.parcelableExtra @@ -63,15 +64,8 @@ class SyntaxHighlightViewAdapter( override fun onPreviewLink(title: String) { val dialog = LinkPreviewDialog.newInstance(HistoryEntry(PageTitle(title, pageTitle.wikiSite), HistoryEntry.SOURCE_INTERNAL_LINK)) - ExclusiveBottomSheetPresenter.show(activity.supportFragmentManager, dialog) - editText.post { - dialog.dialog?.setOnDismissListener { - if (!activity.isDestroyed) { - editText.postDelayed({ - DeviceUtil.showSoftKeyboard(editText) - }, 200) - } - } + activity.supportFragmentManager.commit { + add(dialog, "foo") } } diff --git a/app/src/main/java/org/wikipedia/gallery/GalleryActivity.kt b/app/src/main/java/org/wikipedia/gallery/GalleryActivity.kt index 2aee2defa84..544969509b0 100644 --- a/app/src/main/java/org/wikipedia/gallery/GalleryActivity.kt +++ b/app/src/main/java/org/wikipedia/gallery/GalleryActivity.kt @@ -15,6 +15,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment +import androidx.fragment.app.commit import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback import com.google.android.material.dialog.MaterialAlertDialogBuilder import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers @@ -399,8 +400,9 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall } private fun showLinkPreview(title: PageTitle) { - ExclusiveBottomSheetPresenter.show(supportFragmentManager, - LinkPreviewDialog.newInstance(HistoryEntry(title, HistoryEntry.SOURCE_GALLERY))) + supportFragmentManager.commit { + add(LinkPreviewDialog.newInstance(HistoryEntry(title, HistoryEntry.SOURCE_GALLERY)), "foo") + } } fun setViewPagerEnabled(enabled: Boolean) { diff --git a/app/src/main/java/org/wikipedia/page/PageActivity.kt b/app/src/main/java/org/wikipedia/page/PageActivity.kt index e2ea4c183ef..36961a51bbe 100644 --- a/app/src/main/java/org/wikipedia/page/PageActivity.kt +++ b/app/src/main/java/org/wikipedia/page/PageActivity.kt @@ -378,10 +378,6 @@ class PageActivity : BaseActivity(), PageFragment.Callback, LinkPreviewDialog.Lo loadPage(title, entry, TabPosition.CURRENT_TAB) } - override fun onPageShowLinkPreview(entry: HistoryEntry) { - ExclusiveBottomSheetPresenter.show(supportFragmentManager, LinkPreviewDialog.newInstance(entry)) - } - override fun onPageLoadMainPageInForegroundTab() { loadMainPage(TabPosition.EXISTING_TAB) } diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.kt b/app/src/main/java/org/wikipedia/page/PageFragment.kt index e9e1b766728..555205f2d0b 100644 --- a/app/src/main/java/org/wikipedia/page/PageFragment.kt +++ b/app/src/main/java/org/wikipedia/page/PageFragment.kt @@ -27,6 +27,7 @@ import androidx.core.graphics.Insets import androidx.core.view.forEach import androidx.core.widget.TextViewCompat import androidx.fragment.app.Fragment +import androidx.fragment.app.commit import androidx.lifecycle.lifecycleScope import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener import com.google.android.material.bottomsheet.BottomSheetDialogFragment @@ -89,6 +90,7 @@ import org.wikipedia.page.campaign.CampaignDialog import org.wikipedia.page.edithistory.EditHistoryListActivity import org.wikipedia.page.issues.PageIssuesDialog import org.wikipedia.page.leadimages.LeadImagesHandler +import org.wikipedia.page.linkpreview.LinkPreviewDialog import org.wikipedia.page.references.PageReferences import org.wikipedia.page.references.ReferenceDialog import org.wikipedia.page.shareafact.ShareHandler @@ -126,7 +128,6 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi fun onPageLoadComplete() fun onPageLoadPage(title: PageTitle, entry: HistoryEntry) fun onPageInitWebView(v: ObservableWebView) - fun onPageShowLinkPreview(entry: HistoryEntry) fun onPageLoadMainPageInForegroundTab() fun onPageUpdateProgressBar(visible: Boolean) fun onPageStartSupportActionMode(callback: ActionMode.Callback) @@ -486,7 +487,7 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi if (title.namespace() !== Namespace.MAIN || !Prefs.isLinkPreviewEnabled) { loadPage(title, historyEntry) } else { - callback()?.onPageShowLinkPreview(historyEntry) + LinkPreviewDialog.show(childFragmentManager, R.id.page_contents_container, historyEntry) } } diff --git a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt index 0fd12ec2f11..9631b56f29e 100644 --- a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt +++ b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt @@ -8,11 +8,15 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.LayoutRes import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.PopupMenu import androidx.core.app.ActivityOptionsCompat import androidx.core.os.bundleOf import androidx.core.view.isVisible +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.commit import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope @@ -53,7 +57,7 @@ import org.wikipedia.watchlist.WatchlistExpiry import org.wikipedia.watchlist.WatchlistExpiryDialog import java.util.Locale -class LinkPreviewDialog : ExtendedBottomSheetDialogFragment(), LinkPreviewErrorView.Callback, DialogInterface.OnDismissListener { +class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { interface LoadPageCallback { fun onLinkPreviewLoadPage(title: PageTitle, entry: HistoryEntry, inNewTab: Boolean) } @@ -153,7 +157,7 @@ class LinkPreviewDialog : ExtendedBottomSheetDialogFragment(), LinkPreviewErrorV } L10nUtil.setConditionalLayoutDirection(binding.root, viewModel.pageTitle.wikiSite.languageCode) - lifecycleScope.launch { + viewLifecycleOwner.lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.CREATED) { viewModel.uiState.collect { when (it) { @@ -183,6 +187,14 @@ class LinkPreviewDialog : ExtendedBottomSheetDialogFragment(), LinkPreviewErrorV return binding.root } + private fun dismiss() { + dismissCallback?.onLinkPreviewDismiss() + if (!navigateSuccess) { + articleLinkPreviewInteractionEvent?.logCancel() + linkPreviewInteraction?.logCancel() + } + } + private fun setupOverflowMenu() { val popupMenu = PopupMenu(requireActivity(), binding.linkPreviewOverflowButton) popupMenu.inflate(R.menu.menu_link_preview) @@ -240,7 +252,8 @@ class LinkPreviewDialog : ExtendedBottomSheetDialogFragment(), LinkPreviewErrorV override fun onResume() { super.onResume() - val containerView = requireDialog().findViewById(R.id.container) + // TODO + val containerView = binding.root.findViewById(R.id.container) if (overlayView == null && containerView != null) { LinkPreviewOverlayView(requireContext()).let { overlayView = it @@ -284,15 +297,6 @@ class LinkPreviewDialog : ExtendedBottomSheetDialogFragment(), LinkPreviewErrorV super.onDestroyView() } - override fun onDismiss(dialogInterface: DialogInterface) { - super.onDismiss(dialogInterface) - dismissCallback?.onLinkPreviewDismiss() - if (!navigateSuccess) { - articleLinkPreviewInteractionEvent?.logCancel() - linkPreviewInteraction?.logCancel() - } - } - override fun onAddToList() { doAddToList() } @@ -318,7 +322,7 @@ class LinkPreviewDialog : ExtendedBottomSheetDialogFragment(), LinkPreviewErrorV private fun doAddToList() { ReadingListBehaviorsUtil.addToDefaultList(requireActivity(), viewModel.pageTitle, true, Constants.InvokeSource.LINK_PREVIEW_MENU) - dialog?.dismiss() + dismiss() } private fun showReadingListPopupMenu(anchorView: View) { @@ -416,7 +420,7 @@ class LinkPreviewDialog : ExtendedBottomSheetDialogFragment(), LinkPreviewErrorV navigateSuccess = true articleLinkPreviewInteractionEvent?.logNavigate() linkPreviewInteraction?.logNavigate() - dialog?.dismiss() + dismiss() loadPage(viewModel.pageTitle, viewModel.historyEntry, inNewTab) } @@ -467,6 +471,7 @@ class LinkPreviewDialog : ExtendedBottomSheetDialogFragment(), LinkPreviewErrorV } companion object { + const val FRAGMENT_TAG = "linkPreviewDialog" const val ARG_ENTRY = "entry" const val ARG_LOCATION = "location" const val ARG_LAST_KNOWN_LOCATION = "lastKnownLocation" @@ -480,5 +485,14 @@ class LinkPreviewDialog : ExtendedBottomSheetDialogFragment(), LinkPreviewErrorV ) } } + + fun show(fragmentManager: FragmentManager, resId: Int, entry: HistoryEntry, location: Location? = null, lastKnownLocation: Location? = null) { + fragmentManager.commit { + fragmentManager.findFragmentByTag(FRAGMENT_TAG)?.let { + remove(it) + } + add(resId, newInstance(entry, location, lastKnownLocation), FRAGMENT_TAG) + } + } } } diff --git a/app/src/main/java/org/wikipedia/places/PlacesFragment.kt b/app/src/main/java/org/wikipedia/places/PlacesFragment.kt index 0f5012cd4cd..9d84c2b3263 100644 --- a/app/src/main/java/org/wikipedia/places/PlacesFragment.kt +++ b/app/src/main/java/org/wikipedia/places/PlacesFragment.kt @@ -32,6 +32,7 @@ import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.isVisible import androidx.fragment.app.Fragment +import androidx.fragment.app.commit import androidx.fragment.app.viewModels import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -414,8 +415,9 @@ class PlacesFragment : Fragment(), LinkPreviewDialog.LoadPageCallback, LinkPrevi PlacesEvent.logImpression("detail_view") val entry = HistoryEntry(pageTitle, HistoryEntry.SOURCE_PLACES) updateSearchText(pageTitle.displayText) - ExclusiveBottomSheetPresenter.show(childFragmentManager, - LinkPreviewDialog.newInstance(entry, location, lastKnownLocation = mapboxMap?.locationComponent?.lastKnownLocation)) + childFragmentManager.commit { + add(LinkPreviewDialog.newInstance(entry, location, lastKnownLocation = mapboxMap?.locationComponent?.lastKnownLocation), "foo") + } } private fun resetMagnifiedSymbol() { diff --git a/app/src/main/java/org/wikipedia/talk/UserTalkPopupHelper.kt b/app/src/main/java/org/wikipedia/talk/UserTalkPopupHelper.kt index 8c27754fc13..f91b244044f 100644 --- a/app/src/main/java/org/wikipedia/talk/UserTalkPopupHelper.kt +++ b/app/src/main/java/org/wikipedia/talk/UserTalkPopupHelper.kt @@ -9,6 +9,7 @@ import android.widget.FrameLayout import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.menu.MenuBuilder import androidx.appcompat.view.menu.MenuPopupHelper +import androidx.fragment.app.commit import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineScope @@ -71,8 +72,9 @@ object UserTalkPopupHelper { helper.show() } else { - ExclusiveBottomSheetPresenter.show(activity.supportFragmentManager, - LinkPreviewDialog.newInstance(HistoryEntry(title, historySource))) + activity.supportFragmentManager.commit { + add(LinkPreviewDialog.newInstance(HistoryEntry(title, historySource)), "foo") + } } } diff --git a/app/src/main/res/layout/dialog_link_preview.xml b/app/src/main/res/layout/dialog_link_preview.xml index 1e0f4973ce2..10c66b92023 100755 --- a/app/src/main/res/layout/dialog_link_preview.xml +++ b/app/src/main/res/layout/dialog_link_preview.xml @@ -1,11 +1,22 @@ - + android:clipChildren="false" + android:clipToPadding="false" + app:behavior_hideable="true" + app:behavior_peekHeight="@dimen/bottomSheetPeekHeight" + app:layout_behavior="@string/bottom_sheet_behavior"> + + + + From 9d6b048cdce22d3c9dbd93e1f7de4505d963a7aa Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 7 Feb 2024 15:01:12 -0500 Subject: [PATCH 2/5] Wire up dismissal. --- .../page/linkpreview/LinkPreviewDialog.kt | 17 +++++++++++++++++ app/src/main/res/layout/dialog_link_preview.xml | 5 +++++ 2 files changed, 22 insertions(+) diff --git a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt index 9631b56f29e..3a5dd982ad0 100644 --- a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt +++ b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt @@ -11,6 +11,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.LayoutRes import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.PopupMenu +import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.app.ActivityOptionsCompat import androidx.core.os.bundleOf import androidx.core.view.isVisible @@ -21,6 +22,7 @@ import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle +import com.google.android.material.bottomsheet.BottomSheetBehavior import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.R @@ -184,10 +186,25 @@ class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { } } } + + ((binding.bottomSheetCoordinatorLayout.layoutParams as? CoordinatorLayout.LayoutParams)?.behavior as? BottomSheetBehavior)?.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() { + override fun onStateChanged(bottomSheet: View, newState: Int) { + if (newState == BottomSheetBehavior.STATE_HIDDEN) { + dismiss() + } + } + + override fun onSlide(bottomSheet: View, slideOffset: Float) { + } + }) + return binding.root } private fun dismiss() { + parentFragmentManager.commit { + remove(this@LinkPreviewDialog) + } dismissCallback?.onLinkPreviewDismiss() if (!navigateSuccess) { articleLinkPreviewInteractionEvent?.logCancel() diff --git a/app/src/main/res/layout/dialog_link_preview.xml b/app/src/main/res/layout/dialog_link_preview.xml index 10c66b92023..2db867aa76a 100755 --- a/app/src/main/res/layout/dialog_link_preview.xml +++ b/app/src/main/res/layout/dialog_link_preview.xml @@ -152,6 +152,11 @@ android:layout_height="wrap_content" android:layout_gravity="center" /> + + Date: Wed, 7 Feb 2024 16:20:07 -0500 Subject: [PATCH 3/5] Ok... --- .../java/org/wikipedia/page/PageFragment.kt | 9 ++ .../page/linkpreview/LinkPreviewDialog.kt | 152 +++++++++--------- .../page/linkpreview/LinkPreviewViewModel.kt | 14 +- .../main/res/layout/dialog_link_preview.xml | 32 ++-- 4 files changed, 122 insertions(+), 85 deletions(-) diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.kt b/app/src/main/java/org/wikipedia/page/PageFragment.kt index 555205f2d0b..6a5226dae01 100644 --- a/app/src/main/java/org/wikipedia/page/PageFragment.kt +++ b/app/src/main/java/org/wikipedia/page/PageFragment.kt @@ -380,6 +380,15 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi app.appSessionEvent.touchSession() } webView.addOnContentHeightChangedListener(scrollTriggerListener) + + + + webView.addOnScrollChangeListener({ oldScrollY, scrollY, isHumanScroll -> + LinkPreviewDialog.hide(childFragmentManager) + }) + + + webView.webViewClient = object : OkHttpWebViewClient() { override val model get() = this@PageFragment.model diff --git a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt index 3a5dd982ad0..8f5d572092a 100644 --- a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt +++ b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt @@ -1,6 +1,5 @@ package org.wikipedia.page.linkpreview -import android.content.DialogInterface import android.graphics.Color import android.location.Location import android.os.Bundle @@ -8,7 +7,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.activity.result.contract.ActivityResultContracts -import androidx.annotation.LayoutRes import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.PopupMenu import androidx.coordinatorlayout.widget.CoordinatorLayout @@ -38,7 +36,6 @@ import org.wikipedia.gallery.GalleryActivity import org.wikipedia.gallery.GalleryThumbnailScrollView.GalleryViewListener import org.wikipedia.history.HistoryEntry import org.wikipedia.page.ExclusiveBottomSheetPresenter -import org.wikipedia.page.ExtendedBottomSheetDialogFragment import org.wikipedia.page.Namespace import org.wikipedia.page.PageActivity import org.wikipedia.page.PageTitle @@ -76,7 +73,6 @@ class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { private var articleLinkPreviewInteractionEvent: ArticleLinkPreviewInteractionEvent? = null private var linkPreviewInteraction: ArticleLinkPreviewInteraction? = null - private var overlayView: LinkPreviewOverlayView? = null private var navigateSuccess = false private var revision: Long = 0 private val viewModel: LinkPreviewViewModel by viewModels { LinkPreviewViewModel.Factory(requireArguments()) } @@ -105,7 +101,7 @@ class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { sendPlacesEvent("copy_link_click", "detail_overflow_menu") ClipboardUtil.setPlainText(requireActivity(), text = viewModel.pageTitle.uri) FeedbackUtil.showMessage(requireActivity(), R.string.address_copied) - dismiss() + hide() true } R.id.menu_link_preview_view_on_map -> { @@ -113,7 +109,7 @@ class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { viewModel.location?.let { startActivity(PlacesActivity.newIntent(requireContext(), viewModel.pageTitle, it)) } - dismiss() + hide() true } R.id.menu_link_preview_get_directions -> { @@ -164,15 +160,18 @@ class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { viewModel.uiState.collect { when (it) { is LinkPreviewViewState.Loading -> { - binding.linkPreviewProgress.visibility = View.VISIBLE + binding.linkPreviewProgress.isVisible = true } is LinkPreviewViewState.Error -> { + binding.linkPreviewProgress.isVisible = false renderErrorState(it.throwable) } is LinkPreviewViewState.Content -> { + binding.linkPreviewProgress.isVisible = false renderContentState(it.data) } is LinkPreviewViewState.Gallery -> { + binding.linkPreviewProgress.isVisible = false renderGalleryState(it) } is LinkPreviewViewState.Watch -> { @@ -180,7 +179,6 @@ class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { dismiss() } is LinkPreviewViewState.Completed -> { - binding.linkPreviewProgress.visibility = View.GONE } } } @@ -201,6 +199,20 @@ class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { return binding.root } + private fun reloadContent(historyEntry: HistoryEntry) { + viewModel.reloadContent(historyEntry) + } + + private fun hide() { + L.d(">>>> setting state") + ((binding.bottomSheetCoordinatorLayout.layoutParams as? CoordinatorLayout.LayoutParams)?.behavior as? BottomSheetBehavior)?.let { + if (it.state != BottomSheetBehavior.STATE_HIDDEN && it.state != BottomSheetBehavior.STATE_SETTLING) { + L.d(">>>> for real") + it.state = BottomSheetBehavior.STATE_HIDDEN + } + } + } + private fun dismiss() { parentFragmentManager.commit { remove(this@LinkPreviewDialog) @@ -264,41 +276,34 @@ class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { private fun renderErrorState(throwable: Throwable) { L.e(throwable) binding.linkPreviewTitle.text = StringUtil.fromHtml(viewModel.pageTitle.displayText) + binding.linkPreviewThumbnail.isVisible = false showError(throwable) } override fun onResume() { super.onResume() - // TODO - val containerView = binding.root.findViewById(R.id.container) - if (overlayView == null && containerView != null) { - LinkPreviewOverlayView(requireContext()).let { - overlayView = it - if (viewModel.fromPlaces) { - it.callback = OverlayViewPlacesCallback() - it.setPrimaryButtonText( - L10nUtil.getStringForArticleLanguage(viewModel.pageTitle, R.string.link_preview_dialog_share_button) - ) - it.setSecondaryButtonText( - L10nUtil.getStringForArticleLanguage(viewModel.pageTitle, R.string.link_preview_dialog_save_button) - ) - it.setTertiaryButtonText( - L10nUtil.getStringForArticleLanguage(viewModel.pageTitle, R.string.link_preview_dialog_read_button) - ) - } else { - it.callback = OverlayViewCallback() - it.setPrimaryButtonText( - L10nUtil.getStringForArticleLanguage(viewModel.pageTitle, - if (viewModel.pageTitle.namespace() === Namespace.TALK || viewModel.pageTitle.namespace() === Namespace.USER_TALK) R.string.button_continue_to_talk_page else R.string.button_continue_to_article - ) - ) - it.setSecondaryButtonText( - L10nUtil.getStringForArticleLanguage(viewModel.pageTitle, R.string.menu_long_press_open_in_new_tab) - ) - it.showTertiaryButton(false) - } - containerView.addView(it) - } + if (viewModel.fromPlaces) { + binding.overlayView.callback = OverlayViewPlacesCallback() + binding.overlayView.setPrimaryButtonText( + L10nUtil.getStringForArticleLanguage(viewModel.pageTitle, R.string.link_preview_dialog_share_button) + ) + binding.overlayView.setSecondaryButtonText( + L10nUtil.getStringForArticleLanguage(viewModel.pageTitle, R.string.link_preview_dialog_save_button) + ) + binding.overlayView.setTertiaryButtonText( + L10nUtil.getStringForArticleLanguage(viewModel.pageTitle, R.string.link_preview_dialog_read_button) + ) + } else { + binding.overlayView.callback = OverlayViewCallback() + binding.overlayView.setPrimaryButtonText( + L10nUtil.getStringForArticleLanguage(viewModel.pageTitle, + if (viewModel.pageTitle.namespace() === Namespace.TALK || viewModel.pageTitle.namespace() === Namespace.USER_TALK) R.string.button_continue_to_talk_page else R.string.button_continue_to_article + ) + ) + binding.overlayView.setSecondaryButtonText( + L10nUtil.getStringForArticleLanguage(viewModel.pageTitle, R.string.menu_long_press_open_in_new_tab) + ) + binding.overlayView.showTertiaryButton(false) } } @@ -306,10 +311,7 @@ class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { binding.linkPreviewThumbnailGallery.listener = null binding.linkPreviewToolbar.setOnClickListener(null) binding.linkPreviewOverflowButton.setOnClickListener(null) - overlayView?.let { - it.callback = null - overlayView = null - } + binding.overlayView.callback = null _binding = null super.onDestroyView() } @@ -381,15 +383,13 @@ class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { binding.dialogLinkPreviewErrorContainer.callback = this binding.dialogLinkPreviewErrorContainer.setError(caught, viewModel.pageTitle) LinkPreviewErrorType[caught, viewModel.pageTitle].run { - overlayView?.let { - it.showSecondaryButton(false) - it.showTertiaryButton(false) - it.setPrimaryButtonText(resources.getString(buttonText)) - it.callback = buttonAction(binding.dialogLinkPreviewErrorContainer) - if (this !== LinkPreviewErrorType.OFFLINE) { - binding.linkPreviewToolbar.setOnClickListener(null) - binding.linkPreviewOverflowButton.visibility = View.GONE - } + binding.overlayView.showSecondaryButton(false) + binding.overlayView.showTertiaryButton(false) + binding.overlayView.setPrimaryButtonText(resources.getString(buttonText)) + binding.overlayView.callback = buttonAction(binding.dialogLinkPreviewErrorContainer) + if (this !== LinkPreviewErrorType.OFFLINE) { + binding.linkPreviewToolbar.setOnClickListener(null) + binding.linkPreviewOverflowButton.visibility = View.GONE } } } @@ -412,24 +412,24 @@ class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { null ) } - contents.title.thumbUrl?.let { + if (contents.title.thumbUrl.isNullOrEmpty()) { + binding.linkPreviewThumbnail.visibility = View.GONE + } else { binding.linkPreviewThumbnail.visibility = View.VISIBLE - ViewUtil.loadImage(binding.linkPreviewThumbnail, it) + ViewUtil.loadImage(binding.linkPreviewThumbnail, contents.title.thumbUrl) } - overlayView?.run { - if (!viewModel.fromPlaces) { - setPrimaryButtonText( - L10nUtil.getStringForArticleLanguage( - viewModel.pageTitle, - if (contents.isDisambiguation) R.string.button_continue_to_disambiguation - else if (viewModel.pageTitle.namespace() === Namespace.TALK || viewModel.pageTitle.namespace() === Namespace.USER_TALK) R.string.button_continue_to_talk_page - else R.string.button_continue_to_article - ) + if (!viewModel.fromPlaces) { + binding.overlayView.setPrimaryButtonText( + L10nUtil.getStringForArticleLanguage( + viewModel.pageTitle, + if (contents.isDisambiguation) R.string.button_continue_to_disambiguation + else if (viewModel.pageTitle.namespace() === Namespace.TALK || viewModel.pageTitle.namespace() === Namespace.USER_TALK) R.string.button_continue_to_talk_page + else R.string.button_continue_to_article ) - } else if (viewModel.fromPlaces) { - setSecondaryButtonText(L10nUtil.getStringForArticleLanguage(viewModel.pageTitle, - if (viewModel.isInReadingList) R.string.link_preview_dialog_saved_button else R.string.link_preview_dialog_save_button)) - } + ) + } else if (viewModel.fromPlaces) { + binding.overlayView.setSecondaryButtonText(L10nUtil.getStringForArticleLanguage(viewModel.pageTitle, + if (viewModel.isInReadingList) R.string.link_preview_dialog_saved_button else R.string.link_preview_dialog_save_button)) } } @@ -475,10 +475,8 @@ class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { } override fun onSecondaryClick() { - overlayView?.let { - sendPlacesEvent("save_click", "detail_toolbar") - showReadingListPopupMenu(it.secondaryButtonView) - } + sendPlacesEvent("save_click", "detail_toolbar") + showReadingListPopupMenu(binding.overlayView.secondaryButtonView) } override fun onTertiaryClick() { @@ -504,12 +502,20 @@ class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { } fun show(fragmentManager: FragmentManager, resId: Int, entry: HistoryEntry, location: Location? = null, lastKnownLocation: Location? = null) { + val existing = fragmentManager.findFragmentByTag(FRAGMENT_TAG) as? LinkPreviewDialog + if (existing != null) { + existing.reloadContent(entry) + return + } + fragmentManager.commit { - fragmentManager.findFragmentByTag(FRAGMENT_TAG)?.let { - remove(it) - } add(resId, newInstance(entry, location, lastKnownLocation), FRAGMENT_TAG) } } + + fun hide(fragmentManager: FragmentManager) { + val existing = fragmentManager.findFragmentByTag(FRAGMENT_TAG) as? LinkPreviewDialog + existing?.hide() + } } } diff --git a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewViewModel.kt b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewViewModel.kt index 3905051b106..7264a2ded18 100644 --- a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewViewModel.kt +++ b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewViewModel.kt @@ -22,7 +22,8 @@ import org.wikipedia.watchlist.WatchlistExpiry class LinkPreviewViewModel(bundle: Bundle) : ViewModel() { private val _uiState = MutableStateFlow(LinkPreviewViewState.Loading) val uiState = _uiState.asStateFlow() - val historyEntry = bundle.parcelable(LinkPreviewDialog.ARG_ENTRY)!! + + var historyEntry = bundle.parcelable(LinkPreviewDialog.ARG_ENTRY)!! var pageTitle = historyEntry.title var location = bundle.parcelable(LinkPreviewDialog.ARG_LOCATION) val fromPlaces = historyEntry.source == HistoryEntry.SOURCE_PLACES @@ -36,10 +37,17 @@ class LinkPreviewViewModel(bundle: Bundle) : ViewModel() { loadContent() } + fun reloadContent(historyEntry: HistoryEntry) { + this.historyEntry = historyEntry + pageTitle = historyEntry.title + loadContent() + } + private fun loadContent() { viewModelScope.launch(CoroutineExceptionHandler { _, throwable -> _uiState.value = LinkPreviewViewState.Error(throwable) }) { + _uiState.value = LinkPreviewViewState.Loading val response = ServiceFactory.getRest(pageTitle.wikiSite) .getSummaryResponseSuspend(pageTitle.prefixedText, null, null, null, null, null) @@ -129,10 +137,10 @@ class LinkPreviewViewModel(bundle: Bundle) : ViewModel() { } } - class Factory(private val bunble: Bundle) : ViewModelProvider.Factory { + class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T { - return LinkPreviewViewModel(bunble) as T + return LinkPreviewViewModel(bundle) as T } } } diff --git a/app/src/main/res/layout/dialog_link_preview.xml b/app/src/main/res/layout/dialog_link_preview.xml index 2db867aa76a..fc23a943e5e 100755 --- a/app/src/main/res/layout/dialog_link_preview.xml +++ b/app/src/main/res/layout/dialog_link_preview.xml @@ -4,11 +4,17 @@ 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" + android:id="@+id/bottomSheetOverlayHolder" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + @@ -16,7 +22,8 @@ + android:background="?attr/paper_color" + android:elevation="12dp"> + android:contentDescription="@null" /> - - + + + + + + \ No newline at end of file From 2802089ed71c5f9c1f9d6c55f0c67a3d0f9a6958 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Thu, 8 Feb 2024 13:36:59 -0500 Subject: [PATCH 4/5] Further experimenting. --- .../org/wikipedia/places/PlacesFragment.kt | 33 +++++++++++------ app/src/main/res/layout/activity_page.xml | 2 ++ app/src/main/res/layout/fragment_places.xml | 35 +++++++++++-------- 3 files changed, 45 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/wikipedia/places/PlacesFragment.kt b/app/src/main/java/org/wikipedia/places/PlacesFragment.kt index 9d84c2b3263..6381c2e85a9 100644 --- a/app/src/main/java/org/wikipedia/places/PlacesFragment.kt +++ b/app/src/main/java/org/wikipedia/places/PlacesFragment.kt @@ -39,6 +39,7 @@ import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.transition.Transition +import com.mapbox.android.gestures.MoveGestureDetector import com.mapbox.mapboxsdk.Mapbox import com.mapbox.mapboxsdk.camera.CameraPosition import com.mapbox.mapboxsdk.camera.CameraUpdateFactory @@ -192,18 +193,12 @@ class PlacesFragment : Fragment(), LinkPreviewDialog.LoadPageCallback, LinkPrevi val newStatusBarInsets = insetsCompat.getInsets(WindowInsetsCompat.Type.statusBars()) val newNavBarInsets = insetsCompat.getInsets(WindowInsetsCompat.Type.navigationBars()) - var params = binding.controlsContainer.layoutParams as ViewGroup.MarginLayoutParams + val params = binding.coordinatorView.layoutParams as ViewGroup.MarginLayoutParams params.topMargin = newStatusBarInsets.top + newNavBarInsets.top params.leftMargin = newStatusBarInsets.left + newNavBarInsets.left params.rightMargin = newStatusBarInsets.right + newNavBarInsets.right params.bottomMargin = newStatusBarInsets.bottom + newNavBarInsets.bottom - params = binding.myLocationButton.layoutParams as ViewGroup.MarginLayoutParams - params.bottomMargin = newNavBarInsets.bottom + DimenUtil.roundedDpToPx(16f) - params.leftMargin = newStatusBarInsets.left + newNavBarInsets.left + DimenUtil.roundedDpToPx(16f) - params.rightMargin = newStatusBarInsets.right + newNavBarInsets.right + DimenUtil.roundedDpToPx(16f) - binding.myLocationButton.layoutParams = params - statusBarInsets = newStatusBarInsets navBarInsets = newNavBarInsets WindowInsetsCompat.Builder() @@ -261,6 +256,8 @@ class PlacesFragment : Fragment(), LinkPreviewDialog.LoadPageCallback, LinkPrevi val mapViewChecked = checkedId == R.id.mapViewButton updateToggleViews(mapViewChecked) + LinkPreviewDialog.hide(childFragmentManager) + val progressColor = ResourceUtil.getThemedColorStateList(requireContext(), R.attr.progressive_color) val additionColor = ResourceUtil.getThemedColorStateList(requireContext(), R.attr.addition_color) val placeholderColor = ResourceUtil.getThemedColorStateList(requireContext(), R.attr.placeholder_color) @@ -298,6 +295,7 @@ class PlacesFragment : Fragment(), LinkPreviewDialog.LoadPageCallback, LinkPrevi binding.searchTextView.text = getString(R.string.places_search_hint) binding.searchCloseBtn.isVisible = false resetMagnifiedSymbol() + //LinkPreviewDialog.hide(childFragmentManager) } else { binding.searchCloseBtn.isVisible = true binding.searchTextView.text = StringUtil.fromHtml(searchText) @@ -351,6 +349,17 @@ class PlacesFragment : Fragment(), LinkPreviewDialog.LoadPageCallback, LinkPrevi } map.addOnMapClickListener(this) + map.addOnMoveListener(object : MapboxMap.OnMoveListener { + override fun onMoveBegin(detector: MoveGestureDetector) { + } + + override fun onMove(detector: MoveGestureDetector) { + //LinkPreviewDialog.hide(childFragmentManager) + } + + override fun onMoveEnd(detector: MoveGestureDetector) { + } + }) setUpSymbolManagerWithClustering(map, style) @@ -415,9 +424,8 @@ class PlacesFragment : Fragment(), LinkPreviewDialog.LoadPageCallback, LinkPrevi PlacesEvent.logImpression("detail_view") val entry = HistoryEntry(pageTitle, HistoryEntry.SOURCE_PLACES) updateSearchText(pageTitle.displayText) - childFragmentManager.commit { - add(LinkPreviewDialog.newInstance(entry, location, lastKnownLocation = mapboxMap?.locationComponent?.lastKnownLocation), "foo") - } + LinkPreviewDialog.show(childFragmentManager, R.id.coordinatorView, entry, location, + lastKnownLocation = mapboxMap?.locationComponent?.lastKnownLocation) } private fun resetMagnifiedSymbol() { @@ -586,6 +594,8 @@ class PlacesFragment : Fragment(), LinkPreviewDialog.LoadPageCallback, LinkPrevi lastLocationQueried = lastLocation lastZoomQueried = lastZoom + LinkPreviewDialog.hide(childFragmentManager) + L.d(">>> requesting update: " + latLng.latitude + ", " + latLng.longitude + ", " + mapboxMap?.cameraPosition?.zoom) viewModel.fetchNearbyPages(latLng.latitude, latLng.longitude, searchRadius, ITEMS_PER_REQUEST) } @@ -738,7 +748,8 @@ class PlacesFragment : Fragment(), LinkPreviewDialog.LoadPageCallback, LinkPrevi val screenPoint = it.projection.toScreenLocation(point) val rect = RectF(screenPoint.x - 10, screenPoint.y - 10, screenPoint.x + 10, screenPoint.y + 10) - updateSearchText() + //updateSearchText() + // Zoom-in 2 levels on click of a cluster circle. Do not handle other click events val featureList = it.queryRenderedFeatures(rect, CLUSTER_CIRCLE_LAYER_ID) if (featureList.isNotEmpty()) { diff --git a/app/src/main/res/layout/activity_page.xml b/app/src/main/res/layout/activity_page.xml index 9d2430f1ed9..35019e8abcf 100644 --- a/app/src/main/res/layout/activity_page.xml +++ b/app/src/main/res/layout/activity_page.xml @@ -50,6 +50,8 @@ android:drawablePadding="8dp" android:paddingStart="12dp" android:layout_marginEnd="4dp" + android:maxLines="1" + android:ellipsize="end" app:drawableTint="?attr/placeholder_color" app:drawableStartCompat="@drawable/ic_search_white_24dp"/> diff --git a/app/src/main/res/layout/fragment_places.xml b/app/src/main/res/layout/fragment_places.xml index f3fea48b13e..ab6e0849ded 100644 --- a/app/src/main/res/layout/fragment_places.xml +++ b/app/src/main/res/layout/fragment_places.xml @@ -12,6 +12,11 @@ android:layout_height="match_parent" app:maplibre_foregroundLoadColor="?attr/paper_color"/> + + - + + + \ No newline at end of file From 3646440e2509a6a4264adce6ede6fa7cdfe4b8f9 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 2 Jul 2024 14:40:48 -0400 Subject: [PATCH 5/5] Wire up Back behavior. --- .../main/java/org/wikipedia/page/PageFragment.kt | 10 ++++++++-- .../page/linkpreview/LinkPreviewDialog.kt | 14 +++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.kt b/app/src/main/java/org/wikipedia/page/PageFragment.kt index 38bbe89248e..f7302e6ea7a 100644 --- a/app/src/main/java/org/wikipedia/page/PageFragment.kt +++ b/app/src/main/java/org/wikipedia/page/PageFragment.kt @@ -315,6 +315,12 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi override fun onBackPressed(): Boolean { articleInteractionEvent?.logBackClick() metricsPlatformArticleEventToolbarInteraction.logBackClick() + + if (LinkPreviewDialog.isShowing(childFragmentManager)) { + LinkPreviewDialog.hide(childFragmentManager) + return true + } + if (sidePanelHandler.isVisible) { sidePanelHandler.hide() return true @@ -386,9 +392,9 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi - webView.addOnScrollChangeListener({ oldScrollY, scrollY, isHumanScroll -> + webView.addOnScrollChangeListener { oldScrollY, scrollY, isHumanScroll -> LinkPreviewDialog.hide(childFragmentManager) - }) + } diff --git a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt index a59c4a6c069..14f08cbe043 100644 --- a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt +++ b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt @@ -151,10 +151,8 @@ class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { private val requestStubArticleEditLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { if (it.resultCode == EditHandler.RESULT_REFRESH_PAGE) { - overlayView?.let { overlay -> - FeedbackUtil.makeSnackbar(overlay.rootView, getString(R.string.stub_article_edit_saved_successfully)) - .setAnchorView(overlay.secondaryButtonView).show() - } + FeedbackUtil.makeSnackbar(binding.overlayView.rootView, getString(R.string.stub_article_edit_saved_successfully)) + .setAnchorView(binding.overlayView.secondaryButtonView).show() } } @@ -430,8 +428,8 @@ class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { "UTF-8", null ) + binding.linkPreviewThumbnail.isVisible = contents.title.thumbUrl != null contents.title.thumbUrl?.let { - binding.linkPreviewThumbnail.visibility = View.VISIBLE ViewUtil.loadImage(binding.linkPreviewThumbnail, contents.title.thumbUrl) } if (!viewModel.fromPlaces) { @@ -533,5 +531,11 @@ class LinkPreviewDialog : Fragment(), LinkPreviewErrorView.Callback { val existing = fragmentManager.findFragmentByTag(FRAGMENT_TAG) as? LinkPreviewDialog existing?.hide() } + + fun isShowing(fragmentManager: FragmentManager): Boolean { + val existing = fragmentManager.findFragmentByTag(FRAGMENT_TAG) as? LinkPreviewDialog + ?: return false + return existing.isVisible + } } }