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 return accumulator
} }
} }
} }

View File

@ -8,9 +8,11 @@
public protocol PagePlayAudioBehaviorConsumerProtocol { public protocol PagePlayAudioBehaviorConsumerProtocol {
func playPause() func togglePlayPause()
func play()
func pause()
func stop() func stop()
func isPlaying() var isPlaying: Bool { get }
} }
public class PagePlayAudioBehaviorModel: PageBehaviorModelProtocol { public class PagePlayAudioBehaviorModel: PageBehaviorModelProtocol {
@ -21,6 +23,12 @@ public class PagePlayAudioBehaviorModel: PageBehaviorModelProtocol {
} }
public class PagePlayAudioBehavior: PageCustomActionHandlerBehavior { public class PagePlayAudioBehavior: PageCustomActionHandlerBehavior {
//--------------------------------------------------
// MARK: - Active Model
//--------------------------------------------------
public static var activeAudioPlayer: PagePlayAudioBehaviorConsumerProtocol?
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Delegate // MARK: - Delegate
//-------------------------------------------------- //--------------------------------------------------
@ -39,20 +47,33 @@ public class PagePlayAudioBehavior: PageCustomActionHandlerBehavior {
// MARK: - Custom Action // MARK: - Custom Action
//-------------------------------------------------- //--------------------------------------------------
// Either play or pause
public func handleAction(type actionType: String?, information: [AnyHashable: Any]?, additionalData: [AnyHashable: Any]?) -> Bool { 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() // TODO: Update the model. play -> pause OR pause -> play
for consumer in consumers {
consumer.playPause() // 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. // Tell template to update.
MVMCoreDispatchUtility.performBlock(onMainThread: { [weak self] in // MVMCoreDispatchUtility.performBlock(onMainThread: { [weak self] in
// TODO: move to protocol function instead // TODO: move to protocol function instead
(self?.delegate?.moleculeDelegate as? ViewController)?.handleNewData() // (self?.delegate?.moleculeDelegate as? ViewController)?.handleNewData()
}) // })
return true return true
} }
@ -60,4 +81,112 @@ public class PagePlayAudioBehavior: PageCustomActionHandlerBehavior {
public func onPageHidden(_ delegateObject: MVMCoreUIDelegateObject?) { public func onPageHidden(_ delegateObject: MVMCoreUIDelegateObject?) {
// TODO: Stop player // 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)
}
}
*/
} }