Skip to content

Commit c1b846a

Browse files
CC-6158: Pass in all visual media nodes when opening from cloud drive
1 parent 84e0cb5 commit c1b846a

File tree

10 files changed

+100
-48
lines changed

10 files changed

+100
-48
lines changed

iMEGA/Cloud drive/CloudDriveViewController+Additions.swift

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,15 @@ extension CloudDriveViewController {
3636
}
3737
}
3838

39+
private var sdk: MEGASdk {
40+
MEGASdk.shared
41+
}
42+
3943
@objc func createNodeInfoViewModel(withNode node: MEGANode) -> NodeInfoViewModel {
4044
NodeInfoViewModel(
4145
withNode: node,
4246
shareUseCase: ShareUseCase(repo: ShareRepository.newRepo),
43-
shouldDisplayContactVerificationInfo: MEGASdk.shared.isContactVerificationWarningEnabled
47+
shouldDisplayContactVerificationInfo: sdk.isContactVerificationWarningEnabled
4448
)
4549
}
4650

@@ -129,9 +133,9 @@ extension CloudDriveViewController {
129133

130134
private func shareType(for nodes: [MEGANode]) -> MEGAShareType {
131135
var currentNodeShareType: MEGAShareType = .accessUnknown
132-
136+
133137
nodes.forEach { node in
134-
currentNodeShareType = MEGASdk.shared.accessLevel(for: node)
138+
currentNodeShareType = sdk.accessLevel(for: node)
135139

136140
if currentNodeShareType == .accessRead && currentNodeShareType.rawValue < shareType.rawValue {
137141
return
@@ -155,7 +159,7 @@ extension CloudDriveViewController {
155159

156160
toolbarActions(for: shareType, isBackupNode: isBackupNode)
157161
}
158-
162+
159163
@objc func updateParentNodeIfNeeded(_ updatedNodeList: MEGANodeList) {
160164
guard let updatedParentNode = updatedParentNodeIfBelongs(updatedNodeList) else { return }
161165

@@ -230,7 +234,7 @@ extension CloudDriveViewController {
230234
navigationItem.title = navigationTitle
231235
setMenuCapableBackButtonWith(menuTitle: navigationTitle)
232236
}
233-
237+
234238
@objc func updateToolbarButtonsEnabled(_ enabled: Bool, selectedNodesArray: [MEGANode]) {
235239
let enableIfNotDisputed = !selectedNodesArray.contains(where: { $0.isTakenDown() }) && enabled
236240

@@ -241,7 +245,7 @@ extension CloudDriveViewController {
241245
deleteBarButtonItem?.isEnabled = enabled
242246
restoreBarButtonItem?.isEnabled = enableIfNotDisputed
243247
actionsBarButtonItem?.isEnabled = enabled
244-
248+
245249
if self.displayMode == DisplayMode.rubbishBin && enabled {
246250
for node in selectedNodesArray where !node.mnz_isRestorable() {
247251
restoreBarButtonItem?.isEnabled = false
@@ -324,7 +328,7 @@ extension CloudDriveViewController {
324328
return findItemIndexForFileNode(for: node, source: source)
325329
}
326330
}
327-
331+
328332
return 0
329333
}
330334

@@ -366,7 +370,7 @@ extension CloudDriveViewController {
366370
GetLinkRouter(presenter: self,
367371
nodes: nodes).start()
368372
}
369-
373+
370374
@objc func setupContactNotVerifiedBanner() {
371375
let hostingView = UIHostingController(
372376
rootView: WarningView(
@@ -387,11 +391,11 @@ extension CloudDriveViewController {
387391
hostingViewUIView.bottomAnchor.constraint(equalTo: contactNotVerifiedBannerView.bottomAnchor)
388392
])
389393
}
390-
394+
391395
@objc func showUpgradePlanView() {
392396
UpgradeAccountRouter().presentUpgradeTVC()
393397
}
394-
398+
395399
@objc func setUpInvokeCommands() {
396400
viewModel.invokeCommand = { [weak self] command in
397401

@@ -430,6 +434,37 @@ extension CloudDriveViewController {
430434
}
431435
}
432436

437+
private static func searchResultsNodes(from searchNodesArray: NSMutableArray?) -> [MEGANode] {
438+
var nodes = [MEGANode]()
439+
guard let searchNodesArray else {
440+
return nodes
441+
}
442+
for node in searchNodesArray {
443+
if let megaNode = node as? MEGANode {
444+
nodes.append(megaNode)
445+
}
446+
}
447+
return nodes
448+
}
449+
450+
// provide all currently displayed nodes
451+
// - used when showing image browser, to be able to scroll through visual media
452+
private var nodesToFilter: [MEGANode] {
453+
if let searchController,
454+
searchController.isActive,
455+
searchController.searchBar.text?.mnz_isEmpty() == false {
456+
Self.searchResultsNodes(from: self.searchNodesArray)
457+
} else {
458+
self.nodes?.mnz_nodesArrayFromNodeList() ?? []
459+
}
460+
}
461+
462+
private var allVisualMediaNodes: [MEGANode] {
463+
nodesToFilter.filter {
464+
$0.name?.fileExtensionGroup.isVisualMedia == true
465+
}
466+
}
467+
433468
@objc public func didSelectNode(_ node: MEGANode) {
434469
if node.isTakenDown() {
435470
showTakenDownAlert(isFolder: node.isFolder())
@@ -438,7 +473,11 @@ extension CloudDriveViewController {
438473
navController: navigationController,
439474
tracker: DIContainer.tracker
440475
)
441-
router.didTapNode(node.handle, displayMode: displayMode.carriedOverDisplayMode)
476+
router.didTapNode(
477+
nodeHandle: node.handle,
478+
allNodeHandles: allVisualMediaNodes.map { $0.handle },
479+
displayMode: sdk.accessLevel(for: node) == .accessOwner ? displayMode.carriedOverDisplayMode : .sharedItem
480+
)
442481
}
443482
}
444483

iMEGA/Cloud drive/CloudDriveViewController.m

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -604,21 +604,6 @@ - (void)showNodeInfo:(MEGANode *)node {
604604
[self presentViewController:nodeInfoNavigation animated:YES completion:nil];
605605
}
606606

607-
- (MEGAPhotoBrowserViewController *)photoBrowserForMediaNode:(MEGANode *)node {
608-
NSArray *nodesArray = (self.searchController.isActive && !self.searchController.searchBar.text.mnz_isEmpty) ? self.searchNodesArray : [self.nodes mnz_nodesArrayFromNodeList];
609-
NSMutableArray<MEGANode *> *mediaNodesArray = [[NSMutableArray alloc] initWithCapacity:nodesArray.count];
610-
for (MEGANode *n in nodesArray) {
611-
if ([FileExtensionGroupOCWrapper verifyIsVisualMedia:n.name]) {
612-
[mediaNodesArray addObject:n];
613-
}
614-
}
615-
616-
DisplayMode displayMode = [[MEGASdkManager sharedMEGASdk] accessLevelForNode:node] == MEGAShareTypeAccessOwner ? self.displayMode : DisplayModeSharedItem;
617-
MEGAPhotoBrowserViewController *photoBrowserVC = [MEGAPhotoBrowserViewController photoBrowserWithMediaNodes:mediaNodesArray api:[MEGASdkManager sharedMEGASdk] displayMode:displayMode presentingNode:node];
618-
619-
return photoBrowserVC;
620-
}
621-
622607
- (void)reloadList {
623608
if (self.viewModePreference_ObjC == ViewModePreferenceEntityList) {
624609
[self.cdTableView.tableView reloadData];

iMEGA/Cloud drive/CloudDriveViewControllerFactory.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,11 @@ struct CloudDriveViewControllerFactory {
183183
let bridge = SearchResultsBridge()
184184
let searchBridge = SearchBridge(
185185
selection: {
186-
router.didTapNode($0.id, displayMode: options.displayMode?.carriedOverDisplayMode)
186+
router.didTapNode(
187+
nodeHandle: $0.id,
188+
allNodeHandles: [], // photo browser does not work until we pass in this array here
189+
displayMode: options.displayMode?.carriedOverDisplayMode
190+
)
187191
},
188192
context: { result, button in
189193
router.didTapMoreAction(on: result.id, button: button)

iMEGA/Home/Scenes/FavouritesScene/FavouritesRouter.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ extension FavouritesRouter: FavouritesRouting {
3737

3838
func openNode(_ nodeHandle: HandleEntity) {
3939
let nodeOpener = NodeOpener(navigationController: navigationController)
40-
nodeOpener.openNode(nodeHandle)
40+
nodeOpener.openNode(nodeHandle: nodeHandle, allNodes: [])
4141
}
4242

4343
func openNodeActions(nodeHandle: HandleEntity, sender: Any) {

iMEGA/Home/Scenes/Home/Router/HomeRouter.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ final class HomeRouter: HomeRouterProtocol {
160160
func showNode(_ base64Handle: Base64HandleEntity) {
161161
navigationController?.popToRootViewController(animated: false)
162162
let handle = MEGASdk.handle(forBase64Handle: base64Handle)
163-
NodeOpener(navigationController: navigationController).openNode(handle)
163+
NodeOpener(navigationController: navigationController)
164+
.openNode(nodeHandle: handle)
164165
}
165166

166167
func showDownloadTransfer(node: MEGANode) {

iMEGA/Home/Scenes/Home/Router/NodeOpener.swift

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,31 @@ import MEGASDKRepo
44
final class NodeOpener {
55

66
private weak var navigationController: UINavigationController?
7-
7+
private var sdk = MEGASdk.sharedSdk
88
init(navigationController: UINavigationController?) {
99
self.navigationController = navigationController
1010
}
1111

12-
func openNode(_ nodeHandle: HandleEntity, config: CloudDriveViewControllerFactory.NodeBrowserConfig = .default) {
13-
guard let node = MEGASdk.sharedSdk.node(forHandle: nodeHandle) else { return }
14-
switch node.isFolder() {
15-
case true: openFolderNode(node, config: config)
16-
case false: openFileNode(node, allNodes: nil)
12+
/// navigation to folder or open a file
13+
/// when file is a media, media browser with scroll through nodes in the allNodes array
14+
func openNode(
15+
nodeHandle: HandleEntity,
16+
allNodes: [HandleEntity] = [],
17+
config: CloudDriveViewControllerFactory.NodeBrowserConfig = .default
18+
) {
19+
guard
20+
let megaNode = sdk.node(forHandle: nodeHandle)
21+
else { return }
22+
23+
let allMegaNodes = allNodes.compactMap { sdk.node(forHandle: $0) }
24+
25+
switch megaNode.isFolder() {
26+
case true: openFolderNode(megaNode, config: config)
27+
case false: openFileNode(megaNode, allNodes: allMegaNodes)
1728
}
1829
}
1930

20-
func openNode(_ node: MEGANode, allNodes: [MEGANode]?, config: CloudDriveViewControllerFactory.NodeBrowserConfig = .default) {
31+
func openNode(node: MEGANode, allNodes: [MEGANode]?, config: CloudDriveViewControllerFactory.NodeBrowserConfig = .default) {
2132
switch node.isFolder() {
2233
case true: openFolderNode(node, config: config)
2334
case false: openFileNode(node, allNodes: allNodes)
@@ -26,7 +37,7 @@ final class NodeOpener {
2637

2738
func openNodeActions(_ nodeHandle: HandleEntity, sender: Any) {
2839
guard let navigationController = navigationController else { return }
29-
guard let node = MEGASdk.sharedSdk.node(forHandle: nodeHandle) else { return }
40+
guard let node = sdk.node(forHandle: nodeHandle) else { return }
3041

3142
let backupsUC = BackupsUseCase(backupsRepository: BackupsRepository.newRepo, nodeRepository: NodeRepository.newRepo)
3243
let isBackupNode = backupsUC.isBackupNode(node.toNodeEntity())

iMEGA/Home/Scenes/HomeExplore/Router/FilesExplorerRouter.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ struct FilesExplorerRouter {
6060
}
6161

6262
func didSelect(node: MEGANode, allNodes: [MEGANode]) {
63-
NodeOpener(navigationController: navigationController).openNode(node, allNodes: allNodes)
63+
NodeOpener(navigationController: navigationController)
64+
.openNode(node: node, allNodes: allNodes)
6465
}
6566

6667
func showDownloadTransfer(node: MEGANode) {

iMEGA/Home/Scenes/HomeScreenFactory.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ final class HomeScreenFactory: NSObject {
236236
// MEGA app level delegates. Using simple closures to pass data back and forth
237237
let searchBridge = SearchBridge(
238238
selection: { [weak sdk] result in
239-
router.didTapNode(result.id)
239+
router.didTapNode(nodeHandle: result.id)
240240
// map from result id to a node to check if this is folder or a file
241241
if let node = sdk?.node(forHandle: result.id) {
242242
let event = SearchItemSelectedEvent(

iMEGA/Home/Scenes/HomeSearch/Router/HomeSearchResultRouter.swift

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@ protocol NodeRouting {
99
on node: HandleEntity,
1010
button: UIButton
1111
)
12-
func didTapNode(_ nodeHandle: HandleEntity, displayMode: DisplayMode?)
1312

14-
func didTapNode(_ nodeHandle: HandleEntity)
13+
func didTapNode(nodeHandle: HandleEntity, allNodeHandles: [HandleEntity], displayMode: DisplayMode?)
14+
15+
func didTapNode(nodeHandle: HandleEntity, allNodeHandles: [HandleEntity])
16+
17+
func didTapNode(nodeHandle: HandleEntity)
1518
}
1619

1720
final class HomeSearchResultRouter: NodeRouting {
18-
21+
1922
private weak var navigationController: UINavigationController?
2023

2124
private var nodeActionViewControllerDelegate: NodeActionViewControllerGenericDelegate
@@ -49,12 +52,20 @@ final class HomeSearchResultRouter: NodeRouting {
4952
) else { return }
5053
navigationController?.present(nodeActionViewController, animated: true, completion: nil)
5154
}
52-
53-
func didTapNode(_ nodeHandle: HandleEntity, displayMode: DisplayMode? = nil) {
54-
nodeOpener.openNode(nodeHandle, config: .withOptionalDisplayMode(displayMode))
55+
56+
func didTapNode(nodeHandle: HandleEntity, allNodeHandles: [HandleEntity], displayMode: DisplayMode?) {
57+
nodeOpener.openNode(
58+
nodeHandle: nodeHandle,
59+
allNodes: allNodeHandles,
60+
config: .withOptionalDisplayMode(displayMode)
61+
)
62+
}
63+
64+
func didTapNode(nodeHandle: HandleEntity, allNodeHandles: [HandleEntity]) {
65+
didTapNode(nodeHandle: nodeHandle, allNodeHandles: allNodeHandles, displayMode: nil)
5566
}
5667

57-
func didTapNode(_ nodeHandle: HandleEntity) {
58-
didTapNode(nodeHandle, displayMode: nil)
68+
func didTapNode(nodeHandle: HandleEntity) {
69+
didTapNode(nodeHandle: nodeHandle, allNodeHandles: [])
5970
}
6071
}

iMEGA/Home/Scenes/HomeSearch/ViewModel/HomeSearchResultViewModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ extension HomeSearchResultViewModel: HomeAccountSearchResultViewModelInputs {
155155
// MARK: - Did Select Node
156156

157157
func didSelectNode(_ nodeHandle: HandleEntity) {
158-
router.didTapNode(nodeHandle)
158+
router.didTapNode(nodeHandle: nodeHandle)
159159
if let node = sdk.node(forHandle: nodeHandle) {
160160
let event = SearchItemSelectedEvent(
161161
searchItemType: node.isFolder() ? .folder : .file

0 commit comments

Comments
 (0)