adding play audio action. current implementation.

This commit is contained in:
Kevin G Christiano 2021-04-15 16:54:34 -04:00
parent 6b61063811
commit 4fea0eb473
2 changed files with 139 additions and 11 deletions

View File

@ -50,5 +50,4 @@ extension MoleculeTreeTraversalProtocol {
return accumulator
}
}
}

View File

@ -8,9 +8,11 @@
public protocol PagePlayAudioBehaviorConsumerProtocol {
func playPause()
func togglePlayPause()
func play()
func pause()
func stop()
func isPlaying()
var isPlaying: Bool { get }
}
public class PagePlayAudioBehaviorModel: PageBehaviorModelProtocol {
@ -21,6 +23,12 @@ public class PagePlayAudioBehaviorModel: PageBehaviorModelProtocol {
}
public class PagePlayAudioBehavior: PageCustomActionHandlerBehavior {
//--------------------------------------------------
// MARK: - Active Model
//--------------------------------------------------
public static var activeAudioPlayer: PagePlayAudioBehaviorConsumerProtocol?
//--------------------------------------------------
// MARK: - Delegate
//--------------------------------------------------
@ -39,20 +47,33 @@ public class PagePlayAudioBehavior: PageCustomActionHandlerBehavior {
// MARK: - Custom Action
//--------------------------------------------------
// Either play or pause
public func handleAction(type actionType: String?, information: [AnyHashable: Any]?, additionalData: [AnyHashable: Any]?) -> Bool {
let templateModel = (delegate?.moleculeDelegate as? PageProtocol)?.pageModel as? TemplateModelProtocol
// TODO: Has to grab the specific model that is active (expanded). Identify model holder of this action.
let consumers: [PagePlayAudioBehaviorConsumerProtocol] = templateModel!.allMoleculesOfType()
for consumer in consumers {
consumer.playPause()
}
// TODO: Update the model. play -> pause OR pause -> play
// TODO: Download binary
// TODO: Store audio file in cache using some key (messageID???) to store it.
// TODO: Actually pause/play
// TODO: Tell Template to update this cell (needs to be built). Currently it updates all cells.
// let templateModel = (delegate?.moleculeDelegate as? PageProtocol)?.pageModel as? TemplateModelProtocol
Self.activeAudioPlayer?.play()
// let consumers: [PagePlayAudioBehaviorConsumerProtocol] = templateModel!.allMoleculesOfType()
// for consumer in consumers {
// consumer.playPause()
// }
// Tell template to update.
MVMCoreDispatchUtility.performBlock(onMainThread: { [weak self] in
// MVMCoreDispatchUtility.performBlock(onMainThread: { [weak self] in
// TODO: move to protocol function instead
(self?.delegate?.moleculeDelegate as? ViewController)?.handleNewData()
})
// (self?.delegate?.moleculeDelegate as? ViewController)?.handleNewData()
// })
return true
}
@ -60,4 +81,112 @@ public class PagePlayAudioBehavior: PageCustomActionHandlerBehavior {
public func onPageHidden(_ delegateObject: MVMCoreUIDelegateObject?) {
// TODO: Stop player
}
//--------------------------------------------------
// MARK: - Download Audio File
//--------------------------------------------------
/*
// https://oneconfluence.verizon.com/pages/viewpage.action?spaceKey=EIM&title=FDV+API
/// The directory to store all downloaded voicemails.
func voicemailDirectory() -> URL? {
guard let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return nil }
return documentsURL.appendingPathComponent("fios_vm")
}
func voicemailListQuery(accountId: String, sourceIP: String, mdn: String, mailBoxNo: String, timeZone: String) {
let url = URL(string: "")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
let task = URLSession.shared.dataTask(with: request) { data, response, error in
// do something with the result
// print(data)
// if let data = data {
// TODO: Receive List of MDNs
// if let data = data, let dataString = String(data: data, encoding: .utf8) {
// print("Response data string:\n \(dataString)")
// }
// print(String(data: data, encoding: .utf8))
// } else {
// print("no data")
// }
}
task.resume()
}
func fetchVoicemail(accountId: String, sourceIP: String, mdn: String, mailBoxNo: String) {
// guard let messageID = messageID else { return }
let url = URL(string: "")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
let task = URLSession.shared.dataTask(with: request) { data, response, error in
// do something with the result
// print(data)
// if let data = data {
//body/VoiceMailMessages/Stream/TN/VMID/Audio/bin
// TODO: Receive List of MDNs
// if let data = data, let dataString = String(data: data, encoding: .utf8) {
// print("Response data string:\n \(dataString)")
// }
// print(String(data: data, encoding: .utf8))
// } else {
// print("no data")
// }
}
task.resume()
// TODO: Fetch Audio file.
}
func downloadVoicemail(url: URL?) {
let downloadTask = URLSession.shared.downloadTask(with: url!) { [weak self] url, response, error in
guard error == nil,
let fileURL = url
else { return }
do {
// "data/user/0/com.verizon.myfios/files/VM_INBOX-8711.wav"
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)
self?.audioFilePath = savedURL
} catch let error as NSError {
MVMCoreLoggingHandler.logDebugMessage(withDelegate: error.debugDescription)
}
}
downloadTask.resume()
}
func fetchAudioFilePath() {
guard let messageID = messageID, // "INBOX-8711"
let cleanMDN = cleanMDN, // "4124712342"
let destinationURL = voicemailDirectory()
else { return }
let uri = "com.verizon.fios.voice2/downloadvm?VM_DOWNLOAD_URI_DATA_MESSAGE_ID=\(messageID)&VM_DOWNLOAD_URI_DATA_TN=\(cleanMDN)"
let url = URL(string: uri)
// TODO: First check to see if the file is stored on disk, if not, then downloaded.
createDirectoryIfNeeded(url: destinationURL)
if FileManager.default.fileExists(atPath: destinationURL.path) {
audioFilePath = destinationURL
} else {
downloadVoicemail(url: url)
}
}
*/
}