Skip to content

Commit c2b21cb

Browse files
lmarceaumergify[bot]
authored andcommitted
Bugfix FXIOS-12489 [Tab tray UI experiment] Disable swipe when drag and drop happens (#27225)
* Disable swipe when drag and drop happens * Adjust unit tests (cherry picked from commit fe1e53e) # Conflicts: # firefox-ios/Client.xcodeproj/project.pbxproj
1 parent 0f8ab5b commit c2b21cb

File tree

8 files changed

+76
-9
lines changed

8 files changed

+76
-9
lines changed

firefox-ios/Client.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -947,6 +947,7 @@
947947
8A6B799B2CDBCF3D003C3077 /* TopSitesManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A6B79992CDBCE2E003C3077 /* TopSitesManagerTests.swift */; };
948948
8A6B799D2CDBDAE4003C3077 /* MockContileProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A6B799C2CDBDAE4003C3077 /* MockContileProvider.swift */; };
949949
8A6B79A02CDBDB0C003C3077 /* MockGoogleTopSiteManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A6B799F2CDBDB0C003C3077 /* MockGoogleTopSiteManager.swift */; };
950+
8A6CDB472DF9E78400F11139 /* MockTabDisplayViewDragAndDropInteraction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A6CDB462DF9E78400F11139 /* MockTabDisplayViewDragAndDropInteraction.swift */; };
950951
8A6E13982A71BA4E00A88FA8 /* TabWebViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A6E13972A71BA4E00A88FA8 /* TabWebViewTests.swift */; };
951952
8A6E63C52D4946760040D355 /* JumpBackInCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A6E63C42D49466C0040D355 /* JumpBackInCell.swift */; };
952953
8A6E63C72D4946B90040D355 /* JumpBackInSectionState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A6E63C62D4946B40040D355 /* JumpBackInSectionState.swift */; };
@@ -8339,6 +8340,7 @@
83398340
8A6B79992CDBCE2E003C3077 /* TopSitesManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopSitesManagerTests.swift; sourceTree = "<group>"; };
83408341
8A6B799C2CDBDAE4003C3077 /* MockContileProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockContileProvider.swift; sourceTree = "<group>"; };
83418342
8A6B799F2CDBDB0C003C3077 /* MockGoogleTopSiteManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockGoogleTopSiteManager.swift; sourceTree = "<group>"; };
8343+
8A6CDB462DF9E78400F11139 /* MockTabDisplayViewDragAndDropInteraction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockTabDisplayViewDragAndDropInteraction.swift; sourceTree = "<group>"; };
83428344
8A6E13972A71BA4E00A88FA8 /* TabWebViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabWebViewTests.swift; sourceTree = "<group>"; };
83438345
8A6E63C42D49466C0040D355 /* JumpBackInCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JumpBackInCell.swift; sourceTree = "<group>"; };
83448346
8A6E63C62D4946B40040D355 /* JumpBackInSectionState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JumpBackInSectionState.swift; sourceTree = "<group>"; };
@@ -13859,6 +13861,11 @@
1385913861
C889D7D22858C85200121E1D /* Mocks */ = {
1386013862
isa = PBXGroup;
1386113863
children = (
13864+
<<<<<<< HEAD
13865+
=======
13866+
8A6CDB462DF9E78400F11139 /* MockTabDisplayViewDragAndDropInteraction.swift */,
13867+
8A01FE3F2DF0CE49002C483B /* MockDateProvider.swift */,
13868+
>>>>>>> fe1e53e90 (Bugfix FXIOS-12489 [Tab tray UI experiment] Disable swipe when drag and drop happens (#27225))
1386213869
8A9F4F042DC8F4ED004644B9 /* MockRemoteTabs.swift */,
1386313870
8A9F4F022DC8F4E6004644B9 /* MockPlaces.swift */,
1386413871
2199A1D32DB8389000DC84BD /* MockZoomStore.swift */,
@@ -18574,6 +18581,7 @@
1857418581
21FA8FB22AE856EB0013B815 /* MockTabTrayCoordinatorDelegate.swift in Sources */,
1857518582
8A87B4382CC1A92D003A9239 /* MockPocketManager.swift in Sources */,
1857618583
C8699152289177F5007ACC5C /* WallpaperNetworkingTests.swift in Sources */,
18584+
8A6CDB472DF9E78400F11139 /* MockTabDisplayViewDragAndDropInteraction.swift in Sources */,
1857718585
C818AD452A2100BA007F30BC /* OnboardingNotificationCardHelperTests.swift in Sources */,
1857818586
E1AEC178286E0CF500062E29 /* LegacyHomepageViewControllerTests.swift in Sources */,
1857918587
8A4EA0D42C01100200E4E4F1 /* MicrosurveySurfaceManagerTests.swift in Sources */,

firefox-ios/Client/Coordinators/TabTray/TabTrayCoordinator.swift

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class TabTrayCoordinator: BaseCoordinator,
4848
let tabTrayViewController = TabTrayViewController(panelType: panelType, windowUUID: tabManager.windowUUID)
4949
router.setRootViewController(tabTrayViewController)
5050
self.tabTrayViewController = tabTrayViewController
51-
tabTrayViewController.childPanelControllers = makeChildPanels()
51+
tabTrayViewController.childPanelControllers = makeChildPanels(dragAndDropDelegate: tabTrayViewController)
5252
tabTrayViewController.childPanelThemes = makeChildPanelThemes()
5353
tabTrayViewController.delegate = self
5454
tabTrayViewController.navigationHandler = self
@@ -58,10 +58,14 @@ class TabTrayCoordinator: BaseCoordinator,
5858
tabTrayViewController?.setupOpenPanel(panelType: tabTraySection)
5959
}
6060

61-
private func makeChildPanels() -> [UINavigationController] {
61+
private func makeChildPanels(dragAndDropDelegate: TabDisplayViewDragAndDropInteraction) -> [UINavigationController] {
6262
let windowUUID = tabManager.windowUUID
63-
let regularTabsPanel = TabDisplayPanelViewController(isPrivateMode: false, windowUUID: windowUUID)
64-
let privateTabsPanel = TabDisplayPanelViewController(isPrivateMode: true, windowUUID: windowUUID)
63+
let regularTabsPanel = TabDisplayPanelViewController(isPrivateMode: false,
64+
windowUUID: windowUUID,
65+
dragAndDropDelegate: dragAndDropDelegate)
66+
let privateTabsPanel = TabDisplayPanelViewController(isPrivateMode: true,
67+
windowUUID: windowUUID,
68+
dragAndDropDelegate: dragAndDropDelegate)
6569
let syncTabs = RemoteTabsPanel(windowUUID: windowUUID)
6670

6771
let panels: [UIViewController]

firefox-ios/Client/Frontend/Browser/Tabs/Views/TabDisplayPanelViewController.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,15 @@ class TabDisplayPanelViewController: UIViewController,
7676
init(isPrivateMode: Bool,
7777
windowUUID: WindowUUID,
7878
notificationCenter: NotificationProtocol = NotificationCenter.default,
79-
themeManager: ThemeManager = AppContainer.shared.resolve()) {
79+
themeManager: ThemeManager = AppContainer.shared.resolve(),
80+
dragAndDropDelegate: TabDisplayViewDragAndDropInteraction) {
8081
self.panelType = isPrivateMode ? .privateTabs : .tabs
8182
self.tabsState = TabsPanelState(windowUUID: windowUUID, isPrivateMode: isPrivateMode)
8283
self.notificationCenter = notificationCenter
8384
self.themeManager = themeManager
8485
self.windowUUID = windowUUID
8586
super.init(nibName: nil, bundle: nil)
87+
tabDisplayView.dragAndDropDelegate = dragAndDropDelegate
8688
}
8789

8890
required init?(coder: NSCoder) {

firefox-ios/Client/Frontend/Browser/Tabs/Views/TabDisplayView.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ import Common
66
import Redux
77
import UIKit
88

9+
protocol TabDisplayViewDragAndDropInteraction: AnyObject {
10+
func dragAndDropStarted()
11+
func dragAndDropEnded()
12+
}
13+
914
class TabDisplayView: UIView,
1015
ThemeApplicable,
1116
UICollectionViewDelegate,
@@ -26,6 +31,7 @@ class TabDisplayView: UIView,
2631
private let windowUUID: WindowUUID
2732
private let inactiveTabsTelemetry = InactiveTabsTelemetry()
2833
var theme: Theme?
34+
weak var dragAndDropDelegate: TabDisplayViewDragAndDropInteraction?
2935

3036
lazy var dataSource =
3137
TabDisplayDiffableDataSource(
@@ -457,4 +463,12 @@ extension TabDisplayView: UICollectionViewDragDelegate, UICollectionViewDropDele
457463

458464
store.dispatch(action)
459465
}
466+
467+
func collectionView(_ collectionView: UICollectionView, dragSessionWillBegin session: UIDragSession) {
468+
dragAndDropDelegate?.dragAndDropStarted()
469+
}
470+
471+
func collectionView(_ collectionView: UICollectionView, dragSessionDidEnd session: UIDragSession) {
472+
dragAndDropDelegate?.dragAndDropEnded()
473+
}
460474
}

firefox-ios/Client/Frontend/Browser/Tabs/Views/TabTrayViewController.swift

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ class TabTrayViewController: UIViewController,
3030
StoreSubscriber,
3131
FeatureFlaggable,
3232
TabTraySelectorDelegate,
33-
TabTrayAnimationDelegate {
33+
TabTrayAnimationDelegate,
34+
TabDisplayViewDragAndDropInteraction {
3435
typealias SubscriberStateType = TabTrayState
3536
private struct UX {
3637
struct NavigationMenu {
@@ -64,6 +65,7 @@ class TabTrayViewController: UIViewController,
6465

6566
private lazy var panelContainer: UIView = .build { _ in }
6667
private var pageViewController: UIPageViewController?
68+
private weak var pageScrollView: UIScrollView?
6769
private var swipeFromIndex: Int?
6870
private lazy var themeAnimator = TabTrayThemeAnimator()
6971

@@ -718,6 +720,7 @@ class TabTrayViewController: UIViewController,
718720

719721
if let scrollView = pageVC.view.subviews.first(where: { $0 is UIScrollView }) as? UIScrollView {
720722
scrollView.delegate = self
723+
self.pageScrollView = scrollView
721724
}
722725

723726
self.pageViewController = pageVC
@@ -992,4 +995,14 @@ class TabTrayViewController: UIViewController,
992995
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
993996
swipeFromIndex = nil
994997
}
998+
999+
// MARK: TabDisplayViewDragAndDropInteraction
1000+
1001+
func dragAndDropStarted() {
1002+
pageScrollView?.isScrollEnabled = false
1003+
}
1004+
1005+
func dragAndDropEnded() {
1006+
pageScrollView?.isScrollEnabled = true
1007+
}
9951008
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// This Source Code Form is subject to the terms of the Mozilla Public
2+
// License, v. 2.0. If a copy of the MPL was not distributed with this
3+
// file, You can obtain one at http://mozilla.org/MPL/2.0/
4+
5+
@testable import Client
6+
7+
class MockTabDisplayViewDragAndDropInteraction: TabDisplayViewDragAndDropInteraction {
8+
var dragAndDropStartedCalled = 0
9+
var dragAndDropEndedCalled = 0
10+
11+
func dragAndDropStarted() {
12+
dragAndDropStartedCalled += 1
13+
}
14+
15+
func dragAndDropEnded() {
16+
dragAndDropEndedCalled += 1
17+
}
18+
}

firefox-ios/firefox-ios-tests/Tests/ClientTests/TabTray/TabDisplayPanelTests.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,10 @@ final class TabDisplayPanelTests: XCTestCase {
5050
let subjectState = createSubjectState(isPrivateMode: isPrivateMode,
5151
emptyTabs: emptyTabs,
5252
emptyInactiveTabs: emptyInactiveTabs)
53-
let subject = TabDisplayPanelViewController(isPrivateMode: isPrivateMode, windowUUID: .XCTestDefaultUUID)
53+
let delegate = MockTabDisplayViewDragAndDropInteraction()
54+
let subject = TabDisplayPanelViewController(isPrivateMode: isPrivateMode,
55+
windowUUID: .XCTestDefaultUUID,
56+
dragAndDropDelegate: delegate)
5457
subject.newState(state: subjectState)
5558

5659
trackForMemoryLeaks(subject, file: file, line: line)

firefox-ios/firefox-ios-tests/Tests/ClientTests/TabTray/TabTrayViewControllerTests.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,13 @@ final class TabTrayViewControllerTests: XCTestCase {
145145
}
146146

147147
private func makeChildPanels() -> [UINavigationController] {
148-
let regularTabsPanel = TabDisplayPanelViewController(isPrivateMode: false, windowUUID: .XCTestDefaultUUID)
149-
let privateTabsPanel = TabDisplayPanelViewController(isPrivateMode: true, windowUUID: .XCTestDefaultUUID)
148+
let delegate = MockTabDisplayViewDragAndDropInteraction()
149+
let regularTabsPanel = TabDisplayPanelViewController(isPrivateMode: false,
150+
windowUUID: .XCTestDefaultUUID,
151+
dragAndDropDelegate: delegate)
152+
let privateTabsPanel = TabDisplayPanelViewController(isPrivateMode: true,
153+
windowUUID: .XCTestDefaultUUID,
154+
dragAndDropDelegate: delegate)
150155
let syncTabs = RemoteTabsPanel(windowUUID: .XCTestDefaultUUID)
151156
return [
152157
ThemedNavigationController(rootViewController: regularTabsPanel, windowUUID: windowUUID),

0 commit comments

Comments
 (0)