Skip to content

Commit 6f5377d

Browse files
jnavarrommega-bl
authored andcommitted
T20838501: do not remove delegates when viewWillDissapear
1 parent 36139d5 commit 6f5377d

File tree

3 files changed

+25
-18
lines changed

3 files changed

+25
-18
lines changed

MEGAUnitTests/AudioPlayer/ViewModel/AudioPlayerViewModelTests.swift

+10-10
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ final class AudioPlayerViewModelTests: XCTestCase {
5959
await test(viewModel: onlineSUT, action: .onRepeatPressed, expectedCommands: [.updateRepeat(status: .none)])
6060
XCTAssertEqual(playerHandler.onRepeatDisabled_calledTimes, 1)
6161

62-
await test(viewModel: onlineSUT, action: .viewDidDissapear(reason: .userInitiatedDismissal), expectedCommands: [])
62+
await test(viewModel: onlineSUT, action: .viewDidDisappear, expectedCommands: [])
6363
XCTAssertEqual(playerHandler.removePlayerListener_calledTimes, 1)
6464

6565
await test(viewModel: onlineSUT, action: .onChangeSpeedModePressed, expectedCommands: [.updateSpeed(mode: .oneAndAHalf)])
@@ -86,10 +86,10 @@ final class AudioPlayerViewModelTests: XCTestCase {
8686
await test(viewModel: onlineSUT, action: .showPlaylist, expectedCommands: [])
8787
XCTAssertEqual(onlineRouter.goToPlaylist_calledTimes, 1)
8888

89-
await test(viewModel: onlineSUT, action: .viewDidDissapear(reason: .userInitiatedDismissal), expectedCommands: [])
89+
await test(viewModel: onlineSUT, action: .viewWillDisappear(reason: .userInitiatedDismissal), expectedCommands: [])
9090
XCTAssertEqual(onlineRouter.showMiniPlayer_calledTimes, 1)
9191

92-
await test(viewModel: offlineSUT, action: .viewDidDissapear(reason: .userInitiatedDismissal), expectedCommands: [])
92+
await test(viewModel: offlineSUT, action: .viewWillDisappear(reason: .userInitiatedDismissal), expectedCommands: [])
9393
XCTAssertEqual(offlineRouter.showMiniPlayer_calledTimes, 1)
9494

9595
await test(viewModel: onlineSUT, action: .initMiniPlayer, expectedCommands: [])
@@ -219,24 +219,24 @@ final class AudioPlayerViewModelTests: XCTestCase {
219219
)
220220
}
221221

222-
// MARK: - viewDidDissapear
222+
// MARK: - viewWillDisappear
223223

224224
@MainActor
225-
func testViewDidDissapear_whenLoggedInAndDisappearReasonUserInitiatedDismissal_initMiniPlayer() {
225+
func testViewWillDisappear_whenLoggedInAndDisappearReasonUserInitiatedDismissal_initMiniPlayer() {
226226
let loggedInAccountUseCase = MockAccountUseCase(isLoggedIn: true)
227227
let defaultConfigEntity = audioPlayerConfigEntity(node: anyAudioNode)
228228
let (sut, _, router) = makeSUT(
229229
configEntity: defaultConfigEntity,
230230
accountUseCase: loggedInAccountUseCase
231231
)
232232

233-
sut.dispatch(.viewDidDissapear(reason: .userInitiatedDismissal))
233+
sut.dispatch(.viewWillDisappear(reason: .userInitiatedDismissal))
234234

235235
XCTAssertEqual(router.showNodesMiniPlayer_calledTimes, 1)
236236
}
237237

238238
@MainActor
239-
func testViewDidDissapear_whenNotLoggedInAndDisappearReasonUserInitiatedDismissal_stopsPlayer() {
239+
func testViewWillDisappear_whenNotLoggedInAndDisappearReasonUserInitiatedDismissal_stopsPlayer() {
240240
let loggedInAccountUseCase = MockAccountUseCase(isLoggedIn: false)
241241
let streamingInfoUseCase = MockStreamingInfoUseCase()
242242
let defaultConfigEntity = audioPlayerConfigEntity(node: anyAudioNode)
@@ -247,7 +247,7 @@ final class AudioPlayerViewModelTests: XCTestCase {
247247
)
248248
sut.dispatch(.onViewDidLoad)
249249

250-
sut.dispatch(.viewDidDissapear(reason: .userInitiatedDismissal))
250+
sut.dispatch(.viewWillDisappear(reason: .userInitiatedDismissal))
251251

252252
guard let playerHandler = defaultConfigEntity.playerHandler as? MockAudioPlayerHandler else {
253253
XCTFail("Expect to have mock audio player handler type: \(type(of: MockAudioPlayerHandler.self)), but got different type.")
@@ -259,7 +259,7 @@ final class AudioPlayerViewModelTests: XCTestCase {
259259
}
260260

261261
@MainActor
262-
func testViewDidDissapear_whenNotLoggedInAndDisappearReasonSystemPushedAnotherView_shouldNotStopsPlayer() {
262+
func testViewWillDisappear_whenNotLoggedInAndDisappearReasonSystemPushedAnotherView_shouldNotStopsPlayer() {
263263
let loggedInAccountUseCase = MockAccountUseCase(isLoggedIn: false)
264264
let streamingInfoUseCase = MockStreamingInfoUseCase()
265265
let defaultConfigEntity = audioPlayerConfigEntity(node: anyAudioNode)
@@ -270,7 +270,7 @@ final class AudioPlayerViewModelTests: XCTestCase {
270270
)
271271
sut.dispatch(.onViewDidLoad)
272272

273-
sut.dispatch(.viewDidDissapear(reason: .systemPushedAnotherView))
273+
sut.dispatch(.viewWillDisappear(reason: .systemPushedAnotherView))
274274

275275
guard let playerHandler = defaultConfigEntity.playerHandler as? MockAudioPlayerHandler else {
276276
XCTFail("Expect to have mock audio player handler type: \(type(of: MockAudioPlayerHandler.self)), but got different type.")

iMEGA/AudioPlayer/Scenes/AudioPlayerScene/AudioPlayerViewController.swift

+9-4
Original file line numberDiff line numberDiff line change
@@ -72,21 +72,26 @@ class AudioPlayerViewController: UIViewController, AudioPlayerViewControllerNode
7272
override func viewWillDisappear(_ animated: Bool) {
7373
super.viewWillDisappear(animated)
7474
if isMovingFromParent || isBeingDismissed || presentingViewController?.isBeingDismissed == true {
75-
viewModel.dispatch(.viewDidDissapear(reason: .userInitiatedDismissal))
75+
viewModel.dispatch(.viewWillDisappear(reason: .userInitiatedDismissal))
7676
} else {
7777
if let selectedNodeActionTypeEntity, isSelectingSupportedNodeActionType(selectedNodeActionTypeEntity) {
78-
viewModel.dispatch(.viewDidDissapear(reason: .systemPushedAnotherView))
78+
viewModel.dispatch(.viewWillDisappear(reason: .systemPushedAnotherView))
7979
} else {
80-
viewModel.dispatch(.viewDidDissapear(reason: .userInitiatedDismissal))
80+
viewModel.dispatch(.viewWillDisappear(reason: .userInitiatedDismissal))
8181
}
8282
selectedNodeActionTypeEntity = nil
8383
}
8484
}
8585

86+
override func viewDidDisappear(_ animated: Bool) {
87+
super.viewDidDisappear(animated)
88+
viewModel.dispatch(.viewDidDisappear)
89+
}
90+
8691
/// Overriding dismiss function to detect dismissal of current view controller triggered from navigation controller's dismissal
8792
override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
8893
super.dismiss(animated: flag, completion: completion)
89-
viewModel.dispatch(.viewDidDissapear(reason: .userInitiatedDismissal))
94+
viewModel.dispatch(.viewWillDisappear(reason: .userInitiatedDismissal))
9095
}
9196

9297
deinit {

iMEGA/AudioPlayer/Scenes/AudioPlayerScene/AudioPlayerViewModel.swift

+6-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import MEGAPresentation
88
enum AudioPlayerAction: ActionType {
99

1010
/// Enum to represent the reasons for the dissapearance of a view.
11-
enum ViewDisappearReason {
11+
enum ViewWillDisappearReason {
1212
/// User dismissal means the user initiated the dismissal of the screen (e.g., tapping the close button or swiping down to close the audio player view).
1313
case userInitiatedDismissal
1414

@@ -17,7 +17,8 @@ enum AudioPlayerAction: ActionType {
1717
}
1818

1919
case onViewDidLoad
20-
case viewDidDissapear(reason: ViewDisappearReason)
20+
case viewWillDisappear(reason: ViewWillDisappearReason)
21+
case viewDidDisappear
2122
case initMiniPlayer
2223
case updateCurrentTime(percentage: Float)
2324
case progressDragEventBegan
@@ -465,14 +466,15 @@ final class AudioPlayerViewModel: ViewModelType {
465466
case .onTermsOfServiceViolationAlertDismissAction:
466467
configEntity.playerHandler.closePlayer()
467468
router.dismiss()
468-
case .viewDidDissapear(let reason):
469-
removeDelegates()
469+
case .viewWillDisappear(let reason):
470470
switch reason {
471471
case .userInitiatedDismissal:
472472
accountUseCase.isLoggedIn() ? initMiniPlayer() : requestStopAudioPlayerSession()
473473
case .systemPushedAnotherView:
474474
break
475475
}
476+
case .viewDidDisappear:
477+
removeDelegates()
476478
case .initMiniPlayer:
477479
initMiniPlayer()
478480
}

0 commit comments

Comments
 (0)