diff --git a/app/src/main/java/org/mozilla/fenix/home/recentvisits/controller/RecentVisitsController.kt b/app/src/main/java/org/mozilla/fenix/home/recentvisits/controller/RecentVisitsController.kt index ecd324068..338f2ac4c 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentvisits/controller/RecentVisitsController.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentvisits/controller/RecentVisitsController.kt @@ -60,6 +60,11 @@ interface RecentVisitsController { * @param highlightUrl Url of the [RecentHistoryHighlight] to remove. */ fun handleRemoveRecentHistoryHighlight(highlightUrl: String) + + /** + * Callback for when the user long clicks on a recent visit. + */ + fun handleRecentVisitLongClicked() } /** @@ -140,6 +145,13 @@ class DefaultRecentVisitsController( } } + /** + * Dismiss the search dialog if displayed. + */ + override fun handleRecentVisitLongClicked() { + dismissSearchDialogIfDisplayed() + } + @VisibleForTesting(otherwise = PRIVATE) fun dismissSearchDialogIfDisplayed() { if (navController.currentDestination?.id == R.id.searchDialogFragment) { diff --git a/app/src/main/java/org/mozilla/fenix/home/recentvisits/interactor/RecentVisitsInteractor.kt b/app/src/main/java/org/mozilla/fenix/home/recentvisits/interactor/RecentVisitsInteractor.kt index f6f1b10df..ff6d6d2e3 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentvisits/interactor/RecentVisitsInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentvisits/interactor/RecentVisitsInteractor.kt @@ -44,4 +44,9 @@ interface RecentVisitsInteractor { * @param highlightUrl [RecentHistoryHighlight.url] of the item to remove. */ fun onRemoveRecentHistoryHighlight(highlightUrl: String) + + /** + * Called when opening the dropdown menu on a recent visit by long press. + */ + fun onRecentVisitLongClicked() } diff --git a/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt b/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt index 33e853a07..c1cdc9bbb 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt @@ -64,12 +64,14 @@ private const val VISITS_PER_COLUMN = 3 * @param recentVisits List of [RecentlyVisitedItem] to display. * @param menuItems List of [RecentVisitMenuItem] shown long clicking a [RecentlyVisitedItem]. * @param onRecentVisitClick Invoked when the user clicks on a recent visit. + * @param onRecentVisitLongClick Invoked when the user long clicks on a recent visit. */ @Composable fun RecentlyVisited( recentVisits: List, menuItems: List, onRecentVisitClick: (RecentlyVisitedItem, Int) -> Unit = { _, _ -> }, + onRecentVisitLongClick: () -> Unit = {}, ) { Card( modifier = Modifier.fillMaxWidth(), @@ -102,6 +104,7 @@ fun RecentlyVisited( onRecentVisitClick = { onRecentVisitClick(it, pageIndex + 1) }, + onRecentVisitLongClick = { onRecentVisitLongClick() }, ) is RecentHistoryGroup -> RecentlyVisitedHistoryGroup( recentVisit = recentVisit, @@ -111,6 +114,7 @@ fun RecentlyVisited( onRecentVisitClick = { onRecentVisitClick(it, pageIndex + 1) }, + onRecentVisitLongClick = { onRecentVisitLongClick() }, ) } } @@ -128,8 +132,10 @@ fun RecentlyVisited( * @param clickableEnabled Whether click actions should be invoked or not. * @param showDividerLine Whether to show a divider line at the bottom. * @param onRecentVisitClick Invoked when the user clicks on a recent visit. + * @param onRecentVisitClick Invoked when the user long clicks on a recently visited group. */ @OptIn(ExperimentalFoundationApi::class) +@Suppress("LongParameterList") @Composable private fun RecentlyVisitedHistoryGroup( recentVisit: RecentHistoryGroup, @@ -137,6 +143,7 @@ private fun RecentlyVisitedHistoryGroup( clickableEnabled: Boolean, showDividerLine: Boolean, onRecentVisitClick: (RecentHistoryGroup) -> Unit = { _ -> }, + onRecentVisitLongClick: () -> Unit = {}, ) { var isMenuExpanded by remember { mutableStateOf(false) } @@ -145,7 +152,10 @@ private fun RecentlyVisitedHistoryGroup( .combinedClickable( enabled = clickableEnabled, onClick = { onRecentVisitClick(recentVisit) }, - onLongClick = { isMenuExpanded = true }, + onLongClick = { + onRecentVisitLongClick() + isMenuExpanded = true + }, ) .size(268.dp, 56.dp), verticalAlignment = Alignment.CenterVertically, @@ -195,8 +205,10 @@ private fun RecentlyVisitedHistoryGroup( * @param clickableEnabled Whether click actions should be invoked or not. * @param showDividerLine Whether to show a divider line at the bottom. * @param onRecentVisitClick Invoked when the user clicks on a recent visit. + * @param onRecentVisitLongClick Invoked when the user long clicks on a recent visit highlight. */ @OptIn(ExperimentalFoundationApi::class) +@Suppress("LongParameterList") @Composable private fun RecentlyVisitedHistoryHighlight( recentVisit: RecentHistoryHighlight, @@ -204,6 +216,7 @@ private fun RecentlyVisitedHistoryHighlight( clickableEnabled: Boolean, showDividerLine: Boolean, onRecentVisitClick: (RecentHistoryHighlight) -> Unit = { _ -> }, + onRecentVisitLongClick: () -> Unit = {}, ) { var isMenuExpanded by remember { mutableStateOf(false) } @@ -212,7 +225,10 @@ private fun RecentlyVisitedHistoryHighlight( .combinedClickable( enabled = clickableEnabled, onClick = { onRecentVisitClick(recentVisit) }, - onLongClick = { isMenuExpanded = true }, + onLongClick = { + onRecentVisitLongClick() + isMenuExpanded = true + }, ) .size(268.dp, 56.dp), verticalAlignment = Alignment.CenterVertically, diff --git a/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisitedViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisitedViewHolder.kt index c43dc27b2..6a7a66932 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisitedViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisitedViewHolder.kt @@ -76,6 +76,7 @@ class RecentlyVisitedViewHolder( } } }, + onRecentVisitLongClick = { interactor.onRecentVisitLongClicked() }, ) } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt index 0b50937c7..fb44b2c3f 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt @@ -434,6 +434,10 @@ class SessionControlInteractor( recentVisitsController.handleRemoveRecentHistoryHighlight(highlightUrl) } + override fun onRecentVisitLongClicked() { + recentVisitsController.handleRecentVisitLongClicked() + } + override fun openCustomizeHomePage() { controller.handleCustomizeHomeTapped() } diff --git a/app/src/test/java/org/mozilla/fenix/home/recentvisits/controller/RecentVisitsControllerTest.kt b/app/src/test/java/org/mozilla/fenix/home/recentvisits/controller/RecentVisitsControllerTest.kt index 59a6e6899..9927657bf 100644 --- a/app/src/test/java/org/mozilla/fenix/home/recentvisits/controller/RecentVisitsControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/recentvisits/controller/RecentVisitsControllerTest.kt @@ -181,4 +181,18 @@ class RecentVisitsControllerTest { } } } + + @Test + fun `WHEN long clicking a recent visit THEN search dialog should be dismissed `() = runTestOnMain { + every { navController.currentDestination } returns mockk { + every { id } returns R.id.searchDialogFragment + } + + controller.handleRecentVisitLongClicked() + + verify { + controller.dismissSearchDialogIfDisplayed() + navController.navigateUp() + } + } } diff --git a/app/src/test/java/org/mozilla/fenix/home/recentvisits/interactor/RecentVisitsInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/home/recentvisits/interactor/RecentVisitsInteractorTest.kt index 6522bcdee..8f10ffb12 100644 --- a/app/src/test/java/org/mozilla/fenix/home/recentvisits/interactor/RecentVisitsInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/recentvisits/interactor/RecentVisitsInteractorTest.kt @@ -120,4 +120,11 @@ class RecentVisitsInteractorTest { verify { recentVisitsController.handleRemoveRecentHistoryHighlight("url") } } + + @Test + fun onRecentVisitLongClicked() { + interactor.onRecentVisitLongClicked() + + verify { recentVisitsController.handleRecentVisitLongClicked() } + } }