Skip to content

Commit 8ad988e

Browse files
CC-6170: fix audio player not working in cloud drive, also fixes CC-5598
1 parent 84a72af commit 8ad988e

File tree

3 files changed

+59
-16
lines changed

3 files changed

+59
-16
lines changed

iMEGA/Cloud drive/CloudDriveViewController+Additions.swift

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,7 @@ extension CloudDriveViewController {
439439
guard let searchNodesArray else {
440440
return nodes
441441
}
442+
// this is done with for loop, as lightweight ObjC generics do not port to Swift when used on NSMutableArray
442443
for node in searchNodesArray {
443444
if let megaNode = node as? MEGANode {
444445
nodes.append(megaNode)
@@ -447,24 +448,34 @@ extension CloudDriveViewController {
447448
return nodes
448449
}
449450

451+
private func nodeIsVisualMedia(_ node: MEGANode) -> Bool {
452+
node.name?.fileExtensionGroup.isVisualMedia == true
453+
}
454+
450455
// provide all currently displayed nodes
451-
// - used when showing image browser, to be able to scroll through visual media
452-
private var nodesToFilter: [MEGANode] {
456+
// - used when showing image browser, to be able to scroll through visual media (this should pass in only search results when search active)
457+
// - used when showing audio player
458+
// no node filtering (based on type) should be done at this stage
459+
private func allNodesForOpening(node: MEGANode) -> [MEGANode] {
460+
if nodeIsVisualMedia(node) {
461+
return searchResultsAwareAllNodesForOpeningVisualMedia()
462+
}
463+
464+
return self.nodes?.mnz_nodesArrayFromNodeList() ?? []
465+
}
466+
467+
// when opening visual media (image browser), we are passing in
468+
// only nodes available in the list, respecting searching results
469+
func searchResultsAwareAllNodesForOpeningVisualMedia() -> [MEGANode] {
453470
if let searchController,
454471
searchController.isActive,
455472
searchController.searchBar.text?.mnz_isEmpty() == false {
456-
Self.searchResultsNodes(from: self.searchNodesArray)
473+
return Self.searchResultsNodes(from: self.searchNodesArray)
457474
} else {
458-
self.nodes?.mnz_nodesArrayFromNodeList() ?? []
475+
return self.nodes?.mnz_nodesArrayFromNodeList() ?? []
459476
}
460477
}
461-
462-
private var allVisualMediaNodes: [MEGANode] {
463-
nodesToFilter.filter {
464-
$0.name?.fileExtensionGroup.isVisualMedia == true
465-
}
466-
}
467-
478+
468479
@objc public func didSelectNode(_ node: MEGANode) {
469480
if node.isTakenDown() {
470481
showTakenDownAlert(isFolder: node.isFolder())
@@ -475,7 +486,7 @@ extension CloudDriveViewController {
475486
)
476487
router.didTapNode(
477488
nodeHandle: node.handle,
478-
allNodeHandles: allVisualMediaNodes.map { $0.handle },
489+
allNodeHandles: allNodesForOpening(node: node).map { $0.handle },
479490
displayMode: displayMode.carriedOverDisplayMode
480491
)
481492
}

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

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,36 @@ final class NodeOpener {
5252
}
5353

5454
// MARK: - Private
55-
56-
private func openFileNode(_ node: MEGANode, allNodes: [MEGANode]?, displayMode: DisplayMode?) {
55+
// CRITICAL SECTION OF THE CODE
56+
// allNodes has to have all siblings of the node
57+
// for the image and audio player work properly
58+
private func openFileNode(
59+
_ node: MEGANode,
60+
allNodes: [MEGANode]?,
61+
displayMode: DisplayMode?
62+
) {
63+
// if we do not have an image or video, we will jump deeper to see
64+
// if we have audio or other type of file
5765
guard node.name?.fileExtensionGroup.isVisualMedia == true else {
5866
node.mnz_open(in: navigationController, folderLink: false, fileLink: nil, messageId: nil, chatId: nil, allNodes: allNodes)
5967
return
6068
}
6169

62-
let nodes = allNodes ?? [node]
70+
// open MEGAPhotoBrowserViewController on the node and allow scrolling
71+
// through all visual media in the allNodes array
72+
openVisualMedia(node: node, allNodes: allNodes, displayMode: displayMode)
73+
}
74+
75+
private func openVisualMedia(
76+
node: MEGANode,
77+
allNodes: [MEGANode]?,
78+
displayMode: DisplayMode?
79+
) {
80+
// filter the visual media from allNodes so that photo browser displays only images and videos
81+
let allVisualMediaNodes: [MEGANode] = allNodes?.filter { node in
82+
node.name?.fileExtensionGroup.isVisualMedia == true
83+
} ?? []
84+
let nodes = allNodes != nil ? allVisualMediaNodes : [node]
6385
let index = nodes.firstIndex(where: { $0.handle == node.handle }) ?? 0
6486
let mediaNodes = NSMutableArray(array: nodes)
6587
let isOwner = sdk.accessLevel(for: node) == .accessOwner
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
extension MEGANode {
22
@objc func initFullScreenPlayer(node: MEGANode?, fileLink: String?, filePaths: [String]?, isFolderLink: Bool, presenter: UIViewController, messageId: NSNumber?, chatId: NSNumber?, allNodes: [MEGANode]?) {
3+
4+
// fixes [CC-5598] as we were passing in all nodes instead of just audio ones
5+
// this is the same check we do on a single node, when deciding if we can pass it to
6+
// audio player
7+
let allAudioNodes: [MEGANode]? = allNodes?.filter { node in
8+
node.name?.fileExtensionGroup.isMultiMedia == true &&
9+
node.name?.fileExtensionGroup.isVideo == false &&
10+
node.mnz_isPlayable()
11+
}
12+
313
AudioPlayerManager.shared.initFullScreenPlayer(
414
node: node,
515
fileLink: fileLink,
@@ -8,7 +18,7 @@ extension MEGANode {
818
presenter: presenter,
919
messageId: messageId?.uint64Value ?? .invalid,
1020
chatId: chatId?.uint64Value ?? .invalid,
11-
allNodes: allNodes
21+
allNodes: allAudioNodes
1222
)
1323
}
1424
}

0 commit comments

Comments
 (0)