- made theme 2 banner dynamic, if ad loads then only it will be shown

- made radio ad dynamic, now ad will show up only if ad is received
- added a retry count to fm, it will try 4 times to connect to the server if not then showing the reload btn
This commit is contained in:
Bilal
2024-09-19 01:22:04 +05:30
parent 3a499281c2
commit dcbbfc3417
11 changed files with 306 additions and 172 deletions

View File

@@ -31,6 +31,7 @@ class WokaFMVC: UIViewController {
vm.player?.pause()
NotificationCenter.default.removeObserver(self,name: UIApplication.didEnterBackgroundNotification, object: nil)
NotificationCenter.default.removeObserver(self,name: UIApplication.willEnterForegroundNotification, object: nil)
// Deactivate the audio session if needed
do {
@@ -45,11 +46,14 @@ class WokaFMVC: UIViewController {
vm.vc = self
vm.initView()
NotificationCenter.default.addObserver(self,selector: #selector(appDidEnterBackground),name: UIApplication.didEnterBackgroundNotification,object: nil)
NotificationCenter.default.addObserver(self,selector: #selector(appWillEnterForeground),name: UIApplication.willEnterForegroundNotification,object: nil)
}
// MARK: - App LifeCycle HAndler
@objc func appDidEnterBackground() {
vm.setupNowPlayingInfo()
vm.setupRemoteCommandCenter()
if let postID = AuthFunc.shareInstance.staticURLs?.liveFmData?.id {
let duration = DateFormatterLib.dateDifferenceINT(date1: vm.startTimeStamp, date2: Date())
AuthFunc.shareInstance.userVideoView(postID: postID, postType: PostType.FM.rawValue, duration: duration, catID: 0) { [weak self] isDone in
@@ -61,6 +65,10 @@ class WokaFMVC: UIViewController {
}
}
@objc func appWillEnterForeground(){
vm.stopMPNowPlayin()
}
@IBAction func playBtnTapped(_ sender: UIButton) {
PersistentStorage.shared.addRadioCount()
if sender == playBtn{
@@ -151,6 +159,12 @@ class WokaFMVC: UIViewController {
print("FM is ready to play")
vm.player.play()
} else if vm.playerItem.status == .failed {
if vm.retryCount < 4{
vm.retryCount += 1
vm.retryConnect()
print("retry fm connect :-", vm.retryCount)
return
}
print("FM failed to load")
activityIndicator.stopAnimating()
playBtn.setImage(UIImage(named: "Reload"), for: .normal)
@@ -225,9 +239,10 @@ extension UIButton {
extension WokaFMVC : GADBannerViewDelegate{
func bannerViewDidReceiveAd(_ bannerView: GADBannerView) {
print("bannerViewDidReceiveAd")
adView.isHidden = false
bannerView.alpha = 0
bannerView.backgroundColor = #colorLiteral(red: 0.01960784314, green: 0, blue: 0.2196078431, alpha: 1)
UIView.animate(withDuration: 0.3, animations: {
UIView.animate(withDuration: 0.2, animations: {
bannerView.alpha = 1
})
}

View File

@@ -8,6 +8,7 @@
import UIKit
import AVFoundation
import GoogleMobileAds
import MediaPlayer
class WokaFMVM{
@@ -18,7 +19,10 @@ class WokaFMVM{
var startTimeStamp = Date()
var bottomBannerView = GADBannerView()
// if retry count is 4 reset it to 0
var retryCount = 0
func initView(){
startTimeStamp = Date()
vc.mainView.roundCorners(radius: 10, corners: [.topLeft, .topRight])
@@ -43,18 +47,94 @@ class WokaFMVM{
}
self.vc.dismiss(animated: true)
}
setGoogleAd()
// updateNowPlayingInfo()
}
// MARK: - SetupAd
func stopMPNowPlayin(){
MPNowPlayingInfoCenter.default().nowPlayingInfo = nil
}
func setupNowPlayingInfo() {
let nowPlayingInfoCenter = MPNowPlayingInfoCenter.default()
var nowPlayingInfo: [String: Any] = [:]
// Set the media title, artist, and album name
nowPlayingInfo[MPMediaItemPropertyTitle] = "Live FM"
nowPlayingInfo[MPMediaItemPropertyArtist] = "WOKA"
nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = "Album Name"
// Optional: Set the artwork
if let artworkImage = UIImage(named: "WokaLogo") {
let artwork = MPMediaItemArtwork(boundsSize: artworkImage.size) { size in
return artworkImage
}
nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork
}
// Set the duration and current playback position
if let currentItem = player.currentItem {
nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = currentItem.asset.duration.seconds
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = player.currentTime().seconds
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate
}
// Assign the nowPlayingInfo to the center
nowPlayingInfoCenter.nowPlayingInfo = nowPlayingInfo
}
func setupRemoteCommandCenter() {
let commandCenter = MPRemoteCommandCenter.shared()
// Enable play command
commandCenter.playCommand.addTarget { [unowned self] event in
if player.rate == 0.0 {
player.play()
return .success
}
return .commandFailed
}
// Enable pause command
commandCenter.pauseCommand.addTarget { [unowned self] event in
if player.rate == 1.0 {
player.pause()
return .success
}
return .commandFailed
}
// Enable next and previous track commands if needed
commandCenter.nextTrackCommand.isEnabled = false
commandCenter.previousTrackCommand.isEnabled = false
}
func updateNowPlayingInfo() {
if let currentItem = player.currentItem {
var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo ?? [:]
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = player.currentTime().seconds
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate
MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
}
}
func setGoogleAd(){
/*
Show google ads with dispatch queue.
*/
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2, execute: { [weak self] in
DispatchQueue.main.asyncAfter(deadline: .now() + 0.8, execute: { [weak self] in
guard let self else{return}
AdReusable.sharedInstance.setupBannerAd(bannerView: self.bottomBannerView, in: vc.adView, adUnitID: K.GoogleAdIDs.themeTwo, viewController: self.vc)
vc.adView.isHidden = false
// vc.adView.isHidden = false
})
}
// MARK: - Setup AV & Player
func setupAudioSession() {
@@ -79,6 +159,7 @@ class WokaFMVM{
playerItem = AVPlayerItem(url: url)
player = AVPlayer(playerItem: playerItem)
player.play()
// setGoogleAd()
}
func retryConnect(){

View File

@@ -1,11 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="23094" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_12" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23084"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
@@ -22,7 +21,7 @@
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</view>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="tru-CU-GHH">
<rect key="frame" x="358" y="437" width="30" height="30"/>
<rect key="frame" x="358" y="527" width="30" height="30"/>
<constraints>
<constraint firstAttribute="width" secondItem="tru-CU-GHH" secondAttribute="height" multiplier="1:1" id="oBL-JT-l4l"/>
</constraints>
@@ -33,150 +32,158 @@
<action selector="closeBtnTapped:" destination="Y6W-OH-hqX" eventType="touchUpInside" id="qEj-0u-joR"/>
</connections>
</button>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5fM-ca-UBK">
<rect key="frame" x="0.0" y="472" width="393" height="380"/>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="BackgroundCloud" translatesAutoresizingMaskIntoConstraints="NO" id="jzM-eu-OKw">
<rect key="frame" x="0.0" y="562" width="393" height="290"/>
</imageView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="WMk-dN-J34">
<rect key="frame" x="0.0" y="562" width="393" height="290"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="BackgroundCloud" translatesAutoresizingMaskIntoConstraints="NO" id="jzM-eu-OKw">
<rect key="frame" x="0.0" y="0.0" width="393" height="380"/>
</imageView>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="MasilaLogo" translatesAutoresizingMaskIntoConstraints="NO" id="zge-fr-Eo7">
<rect key="frame" x="0.0" y="0.0" width="393" height="60"/>
<constraints>
<constraint firstAttribute="height" constant="60" id="zkY-tp-WGf"/>
</constraints>
</imageView>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="MasilaCharacter" translatesAutoresizingMaskIntoConstraints="NO" id="erp-13-s4m">
<rect key="frame" x="0.0" y="30" width="393" height="150"/>
<constraints>
<constraint firstAttribute="height" constant="150" id="1Ot-Jr-tNF"/>
</constraints>
</imageView>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" verticalCompressionResistancePriority="751" image="ComingSoonMasila" translatesAutoresizingMaskIntoConstraints="NO" id="RH0-xQ-zUi">
<rect key="frame" x="0.0" y="240" width="393" height="30"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="2Gp-Xz-ex4"/>
</constraints>
</imageView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hI6-1V-MUR">
<rect key="frame" x="0.0" y="180" width="393" height="50"/>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5fM-ca-UBK">
<rect key="frame" x="0.0" y="0.0" width="393" height="290"/>
<subviews>
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="V0i-Kx-TXO">
<rect key="frame" x="100" y="0.0" width="193" height="50"/>
<color key="backgroundColor" red="0.36862745099999999" green="0.1215686275" blue="0.76862745099999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="MasilaLogo" translatesAutoresizingMaskIntoConstraints="NO" id="zge-fr-Eo7">
<rect key="frame" x="0.0" y="0.0" width="393" height="60"/>
<constraints>
<constraint firstAttribute="height" constant="60" id="zkY-tp-WGf"/>
</constraints>
</imageView>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="MasilaCharacter" translatesAutoresizingMaskIntoConstraints="NO" id="erp-13-s4m">
<rect key="frame" x="0.0" y="30" width="393" height="150"/>
<constraints>
<constraint firstAttribute="height" constant="150" id="1Ot-Jr-tNF"/>
</constraints>
</imageView>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" verticalCompressionResistancePriority="751" image="ComingSoonMasila" translatesAutoresizingMaskIntoConstraints="NO" id="RH0-xQ-zUi">
<rect key="frame" x="0.0" y="240" width="393" height="30"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="2Gp-Xz-ex4"/>
</constraints>
</imageView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hI6-1V-MUR">
<rect key="frame" x="0.0" y="180" width="393" height="50"/>
<subviews>
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="V0i-Kx-TXO">
<rect key="frame" x="100" y="0.0" width="193" height="50"/>
<color key="backgroundColor" red="0.36862745099999999" green="0.1215686275" blue="0.76862745099999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="sGT-62-neK" userLabel="Vol-">
<rect key="frame" x="110.00000000000001" y="4" width="50.666666666666671" height="42"/>
<constraints>
<constraint firstAttribute="width" secondItem="sGT-62-neK" secondAttribute="height" multiplier="1.2:1" id="mCV-bc-UnD"/>
</constraints>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" image="speaker.wave.1.fill" catalog="system"/>
<connections>
<action selector="volumeBtnTapped:" destination="Y6W-OH-hqX" eventType="touchUpInside" id="bZA-9P-p0X"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="QCY-ib-bFw" userLabel="Vol+">
<rect key="frame" x="232.66666666666666" y="4" width="50.333333333333343" height="42"/>
<constraints>
<constraint firstAttribute="width" secondItem="QCY-ib-bFw" secondAttribute="height" multiplier="1.2:1" id="OCb-nI-KkI"/>
</constraints>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" image="speaker.wave.3.fill" catalog="system"/>
<connections>
<action selector="volumeBtnTapped:" destination="Y6W-OH-hqX" eventType="touchUpInside" id="Eyb-hO-aXs"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="JBl-cN-PnX">
<rect key="frame" x="165.66666666666666" y="-6" width="62" height="62"/>
<color key="backgroundColor" red="0.36862745098039218" green="0.12156862745098039" blue="0.76862745098039209" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="width" secondItem="JBl-cN-PnX" secondAttribute="height" multiplier="1:1" id="OiK-qQ-wk0"/>
</constraints>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" image="PlayButton"/>
<connections>
<action selector="playBtnTapped:" destination="Y6W-OH-hqX" eventType="touchUpInside" id="4u5-dB-Ief"/>
</connections>
</button>
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" animating="YES" style="medium" translatesAutoresizingMaskIntoConstraints="NO" id="cnz-PV-85Z">
<rect key="frame" x="186.66666666666666" y="-6" width="20" height="62"/>
<color key="color" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</activityIndicatorView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="QCY-ib-bFw" firstAttribute="leading" secondItem="JBl-cN-PnX" secondAttribute="trailing" constant="5" id="1q3-uP-XFR"/>
<constraint firstAttribute="bottom" secondItem="QCY-ib-bFw" secondAttribute="bottom" constant="4" id="3na-Jl-Mir"/>
<constraint firstAttribute="bottom" secondItem="JBl-cN-PnX" secondAttribute="bottom" constant="-6" id="CAg-4X-ZEf"/>
<constraint firstItem="V0i-Kx-TXO" firstAttribute="trailing" secondItem="QCY-ib-bFw" secondAttribute="trailing" constant="10" id="DFl-LC-YaF"/>
<constraint firstItem="V0i-Kx-TXO" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="top" id="DIF-bB-nkc"/>
<constraint firstItem="V0i-Kx-TXO" firstAttribute="leading" secondItem="sGT-62-neK" secondAttribute="leading" constant="-10" id="DuH-FP-2PQ"/>
<constraint firstItem="cnz-PV-85Z" firstAttribute="height" secondItem="JBl-cN-PnX" secondAttribute="height" id="QZw-Xw-8iF"/>
<constraint firstAttribute="bottom" secondItem="V0i-Kx-TXO" secondAttribute="bottom" id="Syc-Zc-u10"/>
<constraint firstItem="JBl-cN-PnX" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="top" constant="-6" id="WOi-6K-hbI"/>
<constraint firstItem="cnz-PV-85Z" firstAttribute="centerY" secondItem="JBl-cN-PnX" secondAttribute="centerY" id="a7t-X2-Rmc"/>
<constraint firstAttribute="bottom" secondItem="sGT-62-neK" secondAttribute="bottom" constant="4" id="as0-w3-1mC"/>
<constraint firstItem="cnz-PV-85Z" firstAttribute="centerX" secondItem="JBl-cN-PnX" secondAttribute="centerX" id="b1V-dm-PVx"/>
<constraint firstItem="cnz-PV-85Z" firstAttribute="width" secondItem="JBl-cN-PnX" secondAttribute="width" multiplier="0.322581" id="fEs-qd-SsB"/>
<constraint firstItem="sGT-62-neK" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="top" constant="4" id="i92-so-DwA"/>
<constraint firstItem="JBl-cN-PnX" firstAttribute="centerX" secondItem="hI6-1V-MUR" secondAttribute="centerX" id="nKc-hb-aUI"/>
<constraint firstItem="JBl-cN-PnX" firstAttribute="leading" secondItem="sGT-62-neK" secondAttribute="trailing" constant="5" id="ugE-e5-LuP"/>
<constraint firstAttribute="height" constant="50" id="w5o-m1-tFn"/>
<constraint firstItem="QCY-ib-bFw" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="top" constant="4" id="xPq-57-EFe"/>
</constraints>
</view>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="sGT-62-neK" userLabel="Vol-">
<rect key="frame" x="110.00000000000001" y="4" width="50.666666666666671" height="42"/>
<constraints>
<constraint firstAttribute="width" secondItem="sGT-62-neK" secondAttribute="height" multiplier="1.2:1" id="mCV-bc-UnD"/>
</constraints>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" image="speaker.wave.1.fill" catalog="system"/>
<connections>
<action selector="volumeBtnTapped:" destination="Y6W-OH-hqX" eventType="touchUpInside" id="bZA-9P-p0X"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="QCY-ib-bFw" userLabel="Vol+">
<rect key="frame" x="232.66666666666666" y="4" width="50.333333333333343" height="42"/>
<constraints>
<constraint firstAttribute="width" secondItem="QCY-ib-bFw" secondAttribute="height" multiplier="1.2:1" id="OCb-nI-KkI"/>
</constraints>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" image="speaker.wave.3.fill" catalog="system"/>
<connections>
<action selector="volumeBtnTapped:" destination="Y6W-OH-hqX" eventType="touchUpInside" id="Eyb-hO-aXs"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="JBl-cN-PnX">
<rect key="frame" x="165.66666666666666" y="-6" width="62" height="62"/>
<color key="backgroundColor" red="0.36862745098039218" green="0.12156862745098039" blue="0.76862745098039209" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="width" secondItem="JBl-cN-PnX" secondAttribute="height" multiplier="1:1" id="OiK-qQ-wk0"/>
</constraints>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" image="PlayButton"/>
<connections>
<action selector="playBtnTapped:" destination="Y6W-OH-hqX" eventType="touchUpInside" id="4u5-dB-Ief"/>
</connections>
</button>
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" animating="YES" style="medium" translatesAutoresizingMaskIntoConstraints="NO" id="cnz-PV-85Z">
<rect key="frame" x="186.66666666666666" y="-6" width="20" height="62"/>
<color key="color" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</activityIndicatorView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="QCY-ib-bFw" firstAttribute="leading" secondItem="JBl-cN-PnX" secondAttribute="trailing" constant="5" id="1q3-uP-XFR"/>
<constraint firstAttribute="bottom" secondItem="QCY-ib-bFw" secondAttribute="bottom" constant="4" id="3na-Jl-Mir"/>
<constraint firstAttribute="bottom" secondItem="JBl-cN-PnX" secondAttribute="bottom" constant="-6" id="CAg-4X-ZEf"/>
<constraint firstItem="V0i-Kx-TXO" firstAttribute="trailing" secondItem="QCY-ib-bFw" secondAttribute="trailing" constant="10" id="DFl-LC-YaF"/>
<constraint firstItem="V0i-Kx-TXO" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="top" id="DIF-bB-nkc"/>
<constraint firstItem="V0i-Kx-TXO" firstAttribute="leading" secondItem="sGT-62-neK" secondAttribute="leading" constant="-10" id="DuH-FP-2PQ"/>
<constraint firstItem="cnz-PV-85Z" firstAttribute="height" secondItem="JBl-cN-PnX" secondAttribute="height" id="QZw-Xw-8iF"/>
<constraint firstAttribute="bottom" secondItem="V0i-Kx-TXO" secondAttribute="bottom" id="Syc-Zc-u10"/>
<constraint firstItem="JBl-cN-PnX" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="top" constant="-6" id="WOi-6K-hbI"/>
<constraint firstItem="cnz-PV-85Z" firstAttribute="centerY" secondItem="JBl-cN-PnX" secondAttribute="centerY" id="a7t-X2-Rmc"/>
<constraint firstAttribute="bottom" secondItem="sGT-62-neK" secondAttribute="bottom" constant="4" id="as0-w3-1mC"/>
<constraint firstItem="cnz-PV-85Z" firstAttribute="centerX" secondItem="JBl-cN-PnX" secondAttribute="centerX" id="b1V-dm-PVx"/>
<constraint firstItem="cnz-PV-85Z" firstAttribute="width" secondItem="JBl-cN-PnX" secondAttribute="width" multiplier="0.322581" id="fEs-qd-SsB"/>
<constraint firstItem="sGT-62-neK" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="top" constant="4" id="i92-so-DwA"/>
<constraint firstItem="JBl-cN-PnX" firstAttribute="centerX" secondItem="hI6-1V-MUR" secondAttribute="centerX" id="nKc-hb-aUI"/>
<constraint firstItem="JBl-cN-PnX" firstAttribute="leading" secondItem="sGT-62-neK" secondAttribute="trailing" constant="5" id="ugE-e5-LuP"/>
<constraint firstAttribute="height" constant="50" id="w5o-m1-tFn"/>
<constraint firstItem="QCY-ib-bFw" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="top" constant="4" id="xPq-57-EFe"/>
<constraint firstAttribute="trailing" secondItem="hI6-1V-MUR" secondAttribute="trailing" id="0HY-Ut-7vJ"/>
<constraint firstItem="RH0-xQ-zUi" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="2OQ-XF-dHi"/>
<constraint firstItem="erp-13-s4m" firstAttribute="top" secondItem="zge-fr-Eo7" secondAttribute="bottom" constant="-30" id="49c-35-bOB"/>
<constraint firstItem="erp-13-s4m" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="6Ef-fm-os1"/>
<constraint firstItem="hI6-1V-MUR" firstAttribute="top" secondItem="erp-13-s4m" secondAttribute="bottom" id="92j-Yc-yFG"/>
<constraint firstItem="zge-fr-Eo7" firstAttribute="top" secondItem="5fM-ca-UBK" secondAttribute="top" id="QJQ-cF-Mdz"/>
<constraint firstItem="hI6-1V-MUR" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="TDX-uI-H7Y"/>
<constraint firstAttribute="bottom" secondItem="RH0-xQ-zUi" secondAttribute="bottom" constant="20" id="TSS-a7-w9J"/>
<constraint firstItem="zge-fr-Eo7" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="U2h-lQ-CVw"/>
<constraint firstItem="RH0-xQ-zUi" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="bottom" constant="10" id="Xyg-xc-QO3"/>
<constraint firstAttribute="trailing" secondItem="erp-13-s4m" secondAttribute="trailing" id="shc-vX-eeD"/>
<constraint firstAttribute="trailing" secondItem="zge-fr-Eo7" secondAttribute="trailing" id="vn4-mh-GIN"/>
<constraint firstAttribute="trailing" secondItem="RH0-xQ-zUi" secondAttribute="trailing" id="xbH-kE-W5r"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="IEh-tF-XpP">
<rect key="frame" x="0.0" y="280" width="393" height="100"/>
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="IEh-tF-XpP">
<rect key="frame" x="0.0" y="0.0" width="393" height="100"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="100" id="qDR-Bj-46Y"/>
<constraint firstAttribute="height" constant="100" id="e7j-5I-ing"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="hI6-1V-MUR" secondAttribute="trailing" id="0HY-Ut-7vJ"/>
<constraint firstItem="RH0-xQ-zUi" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="2OQ-XF-dHi"/>
<constraint firstItem="erp-13-s4m" firstAttribute="top" secondItem="zge-fr-Eo7" secondAttribute="bottom" constant="-30" id="49c-35-bOB"/>
<constraint firstAttribute="trailing" secondItem="jzM-eu-OKw" secondAttribute="trailing" id="4bH-FA-5z2"/>
<constraint firstItem="jzM-eu-OKw" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="5cU-9F-DUz"/>
<constraint firstItem="erp-13-s4m" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="6Ef-fm-os1"/>
<constraint firstItem="hI6-1V-MUR" firstAttribute="top" secondItem="erp-13-s4m" secondAttribute="bottom" id="92j-Yc-yFG"/>
<constraint firstAttribute="bottom" secondItem="IEh-tF-XpP" secondAttribute="bottom" id="JW7-KE-JzZ"/>
<constraint firstAttribute="trailing" secondItem="IEh-tF-XpP" secondAttribute="trailing" id="NEl-Op-BxQ"/>
<constraint firstItem="zge-fr-Eo7" firstAttribute="top" secondItem="5fM-ca-UBK" secondAttribute="top" id="QJQ-cF-Mdz"/>
<constraint firstItem="jzM-eu-OKw" firstAttribute="top" secondItem="5fM-ca-UBK" secondAttribute="top" id="SIn-TI-JeI"/>
<constraint firstItem="hI6-1V-MUR" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="TDX-uI-H7Y"/>
<constraint firstItem="zge-fr-Eo7" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="U2h-lQ-CVw"/>
<constraint firstItem="RH0-xQ-zUi" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="bottom" constant="10" id="Xyg-xc-QO3"/>
<constraint firstItem="IEh-tF-XpP" firstAttribute="top" secondItem="RH0-xQ-zUi" secondAttribute="bottom" constant="10" id="gak-Wd-ty2"/>
<constraint firstItem="IEh-tF-XpP" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="nww-1h-oRH"/>
<constraint firstAttribute="trailing" secondItem="erp-13-s4m" secondAttribute="trailing" id="shc-vX-eeD"/>
<constraint firstAttribute="trailing" secondItem="zge-fr-Eo7" secondAttribute="trailing" id="vn4-mh-GIN"/>
<constraint firstAttribute="bottom" secondItem="jzM-eu-OKw" secondAttribute="bottom" id="xHg-ht-8vd"/>
<constraint firstAttribute="trailing" secondItem="RH0-xQ-zUi" secondAttribute="trailing" id="xbH-kE-W5r"/>
<constraint firstAttribute="trailing" secondItem="5fM-ca-UBK" secondAttribute="trailing" id="FgH-U0-3Jj"/>
<constraint firstItem="5fM-ca-UBK" firstAttribute="top" secondItem="WMk-dN-J34" secondAttribute="top" id="L5i-Iv-1Ti"/>
<constraint firstItem="5fM-ca-UBK" firstAttribute="leading" secondItem="WMk-dN-J34" secondAttribute="leading" id="g1i-a3-Q43"/>
</constraints>
</view>
</stackView>
</subviews>
<viewLayoutGuide key="safeArea" id="vDu-zF-Fre"/>
<constraints>
<constraint firstItem="5fM-ca-UBK" firstAttribute="trailing" secondItem="vDu-zF-Fre" secondAttribute="trailing" id="2Bi-iH-QlI"/>
<constraint firstItem="jzM-eu-OKw" firstAttribute="leading" secondItem="WMk-dN-J34" secondAttribute="leading" id="55P-RC-j6r"/>
<constraint firstItem="WMk-dN-J34" firstAttribute="leading" secondItem="vDu-zF-Fre" secondAttribute="leading" id="A1e-R2-ShV"/>
<constraint firstItem="jzM-eu-OKw" firstAttribute="bottom" secondItem="WMk-dN-J34" secondAttribute="bottom" id="BGX-WH-oJv"/>
<constraint firstItem="WMk-dN-J34" firstAttribute="top" secondItem="tru-CU-GHH" secondAttribute="bottom" constant="5" id="Hjg-vR-dHY"/>
<constraint firstItem="ezz-dQ-HXQ" firstAttribute="leading" secondItem="vDu-zF-Fre" secondAttribute="leading" id="Kbz-3U-DoA"/>
<constraint firstItem="5fM-ca-UBK" firstAttribute="top" secondItem="tru-CU-GHH" secondAttribute="bottom" constant="5" id="Ni3-dV-zLu"/>
<constraint firstAttribute="trailing" secondItem="WMk-dN-J34" secondAttribute="trailing" id="Vb9-s1-Cff"/>
<constraint firstAttribute="bottom" secondItem="ezz-dQ-HXQ" secondAttribute="bottom" id="YUf-EY-nOr"/>
<constraint firstItem="jzM-eu-OKw" firstAttribute="top" secondItem="WMk-dN-J34" secondAttribute="top" id="ayN-LM-SJi"/>
<constraint firstItem="ezz-dQ-HXQ" firstAttribute="top" secondItem="5EZ-qb-Rvc" secondAttribute="top" id="bP0-hF-9jU"/>
<constraint firstItem="5fM-ca-UBK" firstAttribute="leading" secondItem="vDu-zF-Fre" secondAttribute="leading" id="coi-Hy-zVY"/>
<constraint firstAttribute="bottom" secondItem="5fM-ca-UBK" secondAttribute="bottom" id="dGM-e4-c0F"/>
<constraint firstAttribute="bottom" secondItem="WMk-dN-J34" secondAttribute="bottom" id="cHL-cD-Fge"/>
<constraint firstItem="vDu-zF-Fre" firstAttribute="trailing" secondItem="tru-CU-GHH" secondAttribute="trailing" constant="5" id="k10-NI-GMP"/>
<constraint firstItem="vDu-zF-Fre" firstAttribute="trailing" secondItem="ezz-dQ-HXQ" secondAttribute="trailing" id="rIn-7I-mUP"/>
<constraint firstItem="jzM-eu-OKw" firstAttribute="trailing" secondItem="WMk-dN-J34" secondAttribute="trailing" id="zcH-Le-X3T"/>
</constraints>
</view>
<connections>
@@ -204,8 +211,5 @@
<image name="PlayButton" width="42.666667938232422" height="42.666667938232422"/>
<image name="speaker.wave.1.fill" catalog="system" width="128" height="104"/>
<image name="speaker.wave.3.fill" catalog="system" width="128" height="84"/>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
</resources>
</document>