From 6c51d3ee6570ef0623dc4e84102110f6cc8d12d0 Mon Sep 17 00:00:00 2001 From: Sumanth Nadigadda Date: Fri, 21 May 2021 16:37:23 +0530 Subject: [PATCH] Enabling downloading option for voicemails --- MVMCoreUI/Behaviors/PlayAudioBehavior.swift | 114 ++++++++++++++++++-- 1 file changed, 103 insertions(+), 11 deletions(-) diff --git a/MVMCoreUI/Behaviors/PlayAudioBehavior.swift b/MVMCoreUI/Behaviors/PlayAudioBehavior.swift index 572fac0b..4ba7aa9f 100644 --- a/MVMCoreUI/Behaviors/PlayAudioBehavior.swift +++ b/MVMCoreUI/Behaviors/PlayAudioBehavior.swift @@ -61,7 +61,7 @@ public class PagePlayAudioBehavior: PageCustomActionHandlerBehavior { } else { // Download binary - downloadAudioFile { url in + downloadAudioFile(information: information) { url in // TODO: Actually pause/play Self.activeAudioPlayerDelegate?.audioFileURL = url @@ -84,18 +84,110 @@ public class PagePlayAudioBehavior: PageCustomActionHandlerBehavior { // MARK: - Download Audio File //-------------------------------------------------- - func downloadAudioFile(_ completion: @escaping (URL) -> ()) { + func downloadAudioFile(information:[AnyHashable: Any]?,_ completion: @escaping (URL) -> ()) { + + guard let extraparams = information?["extraParameters"] as? [AnyHashable:Any] else {return} + guard let requestParams = MVMCoreRequestParameters.init(pageType: "getVoiceMailMessage", extraParameters: extraparams) else { return } - // TODO: Check cache. Return if available -// let audioData = MVMCoreCache.shared()?.getCachedData(withName: PagePlayAudioBehavior.activeAudioPlayerDelegate!.messageID!) - - guard let soundFileURL = Bundle.main.url(forResource: "sampleAudio", withExtension: "wav") else { return } - - // TODO: Store audio file in cache using some key (messageID???) to store it. -// MVMCoreCache.shared()?.addData(toCache: soundFileURL.dataRepresentation, withName: PagePlayAudioBehavior.activeAudioPlayerDelegate!.messageID!) - completion(soundFileURL) -// return soundFileURL + if let voicemailID = extraparams["messageID"] as? String, checkIfFileExists(voicemailID: voicemailID) { + let vmURL = self.constructVoicemailFilePathWithID(voicemailID: voicemailID) + completion(vmURL) + } else { + MVMCoreLoadHandler.sharedGlobal()?.sendRequest(requestParams, locationForError: "PlayAudioRequest", requestFinished: { response, error in + guard let voicemailJSON = response as? [String:AnyHashable] else { return } + guard let voicemail = voicemailJSON["bin"] as? String, let voicemailID = voicemailJSON["vmMessageId"] as? String else { return } + let audioURL = self.saveVoicemailToDocumentDirectory(voicemail: voicemail, voicemailID: voicemailID) + completion(audioURL) + }) + } } + + func checkIfFileExists(voicemailID:String) -> Bool { + var cachePath = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first + cachePath?.appendPathComponent("FiOS.FDV.Voicemails", isDirectory: false) + let fileName = cachePath?.appendingPathComponent("VM_\(voicemailID).wmv") + return FileManager.default.fileExists(atPath: fileName?.path ?? "") + } + + func constructVoicemailFilePathWithID(voicemailID:String) -> URL { + let voicemailUrl = URL(string: "fileNotFound")! + ///Setting Voicemail Path + var cachePath = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first + cachePath?.appendPathComponent("FiOS.FDV.Voicemails", isDirectory: false) + if let path = cachePath?.path, !FileManager.default.fileExists(atPath: path) { + do{ + try FileManager.default.createDirectory(atPath: path, withIntermediateDirectories: false, attributes: nil) + } catch let error as NSError { + MVMCoreLoggingHandler.logDebugMessage(withDelegate: error.debugDescription) + } + } + let fileName = cachePath?.appendingPathComponent("VM_\(voicemailID).wmv") + return fileName ?? voicemailUrl + } + + func saveVoicemailToDocumentDirectory(voicemail:String, voicemailID:String) -> URL { + let voicemailUrl = URL(string: "fileNotFound")! + let fileName = self.constructVoicemailFilePathWithID(voicemailID: voicemailID) + let voicemailData = Data(base64Encoded: voicemail) + do{ + try voicemailData?.write(to: fileName, options: .completeFileProtection) + return fileName + } catch let error as NSError { + MVMCoreLoggingHandler.logDebugMessage(withDelegate: error.debugDescription) + } + return voicemailUrl + } + +// func saveVoicemailToDocumentDirectory(voicemail:String) -> URL { +// let voicemailUrl = URL(string: "fileNotFound")! +// ///Setting Voicemail Path +// +// let cacheDirectory = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first as NSString? +// +// if let cachePath = cacheDirectory?.appendingPathComponent("fdv.voicemails"), !FileManager.default.fileExists(atPath: cachePath) { +// do{ +// try FileManager.default.createDirectory(atPath: cachePath, withIntermediateDirectories: false, attributes: nil) +// } catch let error as NSError { +// MVMCoreLoggingHandler.logDebugMessage(withDelegate: error.debugDescription) +// } +// } +// let fileName = cacheDirectory?.appendingPathComponent("fdv.voicemails").appending("/VM_1.wmv") +//#warning("Pending task to check if we can protect the voicemail data") +// +// let voicemailData = Data(base64Encoded: voicemail) +// do{ +// if let _fileName = fileName, let fileUrl = URL(string: _fileName) { +// try voicemailData?.write(to: fileUrl, options: .completeFileProtection) +// return fileUrl +// } +// } catch let error as NSError { +// MVMCoreLoggingHandler.logDebugMessage(withDelegate: error.debugDescription) +// } +// return voicemailUrl +// } + + +// NSDictionary *completeProtection = [NSDictionary dictionaryWithObject:NSFileProtectionComplete forKey:NSFileProtectionKey]; +// [[NSFileManager defaultManager] setAttributes:completeProtection ofItemAtPath:appFile error:nil]; +// return ([data writeToFile:appFile atomically:YES]); + + +// func downloadVoicemail(url: URL?) { +// +// let downloadTask = URLSession.shared.downloadTask(with: url!) { url, response, error in +// guard error == nil, let fileURL = url else { return } +// do { +// let documentsURL = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) +// let savedURL = documentsURL.appendingPathComponent(fileURL.lastPathComponent) +// try FileManager.default.moveItem(at: fileURL, to: savedURL) +// +// } catch let error as NSError { +// MVMCoreLoggingHandler.logDebugMessage(withDelegate: error.debugDescription) +// } +// } +// downloadTask.resume() +// } + /* // https://oneconfluence.verizon.com/pages/viewpage.action?spaceKey=EIM&title=FDV+API