diff --git a/WOKA.xcodeproj/project.pbxproj b/WOKA.xcodeproj/project.pbxproj
index 120b794..d446b77 100644
--- a/WOKA.xcodeproj/project.pbxproj
+++ b/WOKA.xcodeproj/project.pbxproj
@@ -3022,8 +3022,8 @@
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/jwplayer/JWPlayerKit-package.git";
requirement = {
- kind = exactVersion;
- version = 4.19.1;
+ kind = upToNextMajorVersion;
+ minimumVersion = 4.19.1;
};
};
528F26EC2C6B7BD1003E4D99 /* XCRemoteSwiftPackageReference "OneSignal-XCFramework" */ = {
diff --git a/WOKA/Cart/Cart.storyboard b/WOKA/Cart/Cart.storyboard
index 68725e6..ca5d79e 100644
--- a/WOKA/Cart/Cart.storyboard
+++ b/WOKA/Cart/Cart.storyboard
@@ -388,7 +388,7 @@
-
+
diff --git a/WOKA/OnBoarding Module/Controller/SplashVC.swift b/WOKA/OnBoarding Module/Controller/SplashVC.swift
index 385ec55..f350734 100644
--- a/WOKA/OnBoarding Module/Controller/SplashVC.swift
+++ b/WOKA/OnBoarding Module/Controller/SplashVC.swift
@@ -71,7 +71,7 @@ class SplashVC: UIViewController {
self.wokaLogo.transform = CGAffineTransform(scaleX: 1.8, y: 1.8)
}, completion: nil)
- let newConstant = wokaOriginY.constant - 50
+// let newConstant = wokaOriginY.constant - 50
Timer.scheduledTimer(withTimeInterval: 6, repeats: false) { [weak self] _ in
guard let self else{return}
diff --git a/WOKA/Theme/Base.lproj/Theme.storyboard b/WOKA/Theme/Base.lproj/Theme.storyboard
index 59e653d..822ccab 100644
--- a/WOKA/Theme/Base.lproj/Theme.storyboard
+++ b/WOKA/Theme/Base.lproj/Theme.storyboard
@@ -1,6 +1,6 @@
-
+
@@ -23,43 +23,43 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -67,7 +67,7 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -144,23 +144,23 @@
-
+
-
+
-
+
-
+
-
+
@@ -184,7 +184,7 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -485,6 +485,7 @@
+
@@ -520,21 +521,21 @@
-
+
-
+
-
+
-
+
-
+
@@ -560,19 +561,19 @@
-
+
-
+
-
+
@@ -583,7 +584,7 @@
-
+
-
+
@@ -657,16 +658,16 @@
-
+
-
+
@@ -703,15 +704,15 @@
-
+
-
+
-
+
@@ -768,14 +769,14 @@
-
+
-
+
-
+
@@ -787,7 +788,7 @@
-
+
@@ -795,7 +796,7 @@
-
+
-
+
@@ -839,7 +840,7 @@
-
+
@@ -871,22 +872,22 @@
-
+
-
+
-
+
-
+
@@ -900,19 +901,19 @@
-
+
-
+
-
+
@@ -923,7 +924,7 @@
-
+
@@ -1036,11 +1037,11 @@
-
+
-
+
-
+
-
+
@@ -1234,13 +1235,13 @@
-
+
-
+
-
+
diff --git a/WOKA/Theme/Controller/PlayerVC.swift b/WOKA/Theme/Controller/PlayerVC.swift
index 6e47ab4..168794e 100644
--- a/WOKA/Theme/Controller/PlayerVC.swift
+++ b/WOKA/Theme/Controller/PlayerVC.swift
@@ -9,7 +9,7 @@ import UIKit
import JWPlayerKit
import AVKit
-class PlayerVC: JWPlayerViewController, JWPlayerViewControllerDelegate{
+class PlayerVC: JWPlayerViewController, JWPlayerViewControllerUIDelegate{
@IBOutlet weak var backButton: UIButton!
var previousScale: CGFloat = 1.0
@@ -20,6 +20,7 @@ class PlayerVC: JWPlayerViewController, JWPlayerViewControllerDelegate{
var dismissTapped: (() -> Void)?
var videoIndex : Int?
+ var errorCount = 0
var isFullScreenBtn = false
@@ -57,18 +58,18 @@ class PlayerVC: JWPlayerViewController, JWPlayerViewControllerDelegate{
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
-// DispatchQueue.main.async { [weak self] in
-// guard let self else{return}
- appDelegate.deviceOrientation = .landscapeRight
- let value = UIInterfaceOrientation.landscapeRight.rawValue
- UIDevice.current.setValue(value, forKey: "orientation")
- player.configurePlayer(with: config)
-
- self.delegate = self
- //Disable Picture in Picture
- playerView.allowsPictureInPicturePlayback = false
- playerView.captionStyle = .none
-// }
+ // DispatchQueue.main.async { [weak self] in
+ // guard let self else{return}
+ appDelegate.deviceOrientation = .landscapeRight
+ let value = UIInterfaceOrientation.landscapeRight.rawValue
+ UIDevice.current.setValue(value, forKey: "orientation")
+ player.configurePlayer(with: config)
+
+ self.uiDelegate = self
+ //Disable Picture in Picture
+ playerView.allowsPictureInPicturePlayback = false
+ playerView.captionStyle = .none
+ // }
}
override func viewWillDisappear(_ animated: Bool) {
@@ -214,10 +215,16 @@ class PlayerVC: JWPlayerViewController, JWPlayerViewControllerDelegate{
print("PlayList Over", vm.currentPlayingIndex)
}
+ override func jwplayer(_ player: any JWPlayer, didLoadPlaylist playlist: [JWPlayerItem]) {
+ super.jwplayer(player, didLoadPlaylist: playlist)
+ print("Playlist loaded")
+ }
+
// this will give index
override func jwplayer(_ player: any JWPlayer, didLoadPlaylistItem item: JWPlayerItem, at index: UInt) {
super.jwplayer(player, didLoadPlaylistItem: item, at: index)
print("didLoadPlaylistItem ", index)
+
if vm.currentPlayingIndex != -1 && vm.currentPlayingIndex != index{
// so update the loaded index and increase the current playing index
vm.updateUserView()
@@ -272,14 +279,23 @@ class PlayerVC: JWPlayerViewController, JWPlayerViewControllerDelegate{
override func jwplayer(_ player: JWPlayer, failedWithError code: UInt, message: String) {
super.jwplayer(player, failedWithError: code, message: message)
-
print("Error: \(code) - \(message)")
+
+ // try reconnect 3 times else show retry
+ if errorCount < 4{
+ errorCount += 1
+ self.player.configurePlayer(with: config)
+ self.player.play()
+ return
+ }
DispatchQueue.main.async {
Utilities.alertWithBtnCancelCompletion(title: "Error", msgBody: message, okBtnStr: "Connect", vc: self) { [weak self] isDone in
guard let self else{
self?.vm.handleBackAction()
return
}
+ errorCount = 0
+
if isDone{
self.player.configurePlayer(with: config)
self.player.play()
diff --git a/WOKA/Theme/Controller/ThemeOneVC.swift b/WOKA/Theme/Controller/ThemeOneVC.swift
index 6fa1fac..c36177c 100644
--- a/WOKA/Theme/Controller/ThemeOneVC.swift
+++ b/WOKA/Theme/Controller/ThemeOneVC.swift
@@ -34,6 +34,7 @@ class ThemeOneVC: UIViewController {
@IBOutlet weak var gamesView: UIView!
@IBOutlet weak var karaokeView: UIView!
@IBOutlet weak var shopView: UIView!
+ @IBOutlet weak var allIconView: UIView!
@IBOutlet weak var liveTVActivityIndicator: UIActivityIndicatorView!
@@ -62,6 +63,8 @@ class ThemeOneVC: UIViewController {
avPlayer.removeObserver(self, forKeyPath: "timeControlStatus")
avPlayer.pause()
}
+
+ NotificationCenter.default.removeObserver(self, name: AVAudioSession.routeChangeNotification, object: nil)
}
override var preferredStatusBarStyle: UIStatusBarStyle {
@@ -76,6 +79,7 @@ class ThemeOneVC: UIViewController {
if MyListDataTemp.shareInstance.favListingData?.showData == nil {
MyListDataTemp.shareInstance.favListingData = FavouriteListingDM.ResultData(totalRecords: nil, showData: FavouriteListingDM.ResultData.ShowData(hindi: [],english: []),videoData: [],gameData: [],singKaraokeData: [],audioData: [])
}
+
// connectedToNetwork()
// PersistentStorage.shared.deleteData()
@@ -174,6 +178,7 @@ extension ThemeOneVC{
// Observe the player's time control status
vm.avPlayer.addObserver(self, forKeyPath: "timeControlStatus", options: [.new, .old], context: nil)
+
// Observe buffering status
// vm.playerItem.addObserver(self, forKeyPath: "isPlaybackBufferEmpty", options: [.new, .old], context: nil)
// vm.playerItem.addObserver(self, forKeyPath: "isPlaybackLikelyToKeepUp", options: [.new, .old], context: nil)
diff --git a/WOKA/Theme/Controller/ThemeTwoVC.swift b/WOKA/Theme/Controller/ThemeTwoVC.swift
index 40698af..62d3ea6 100644
--- a/WOKA/Theme/Controller/ThemeTwoVC.swift
+++ b/WOKA/Theme/Controller/ThemeTwoVC.swift
@@ -37,6 +37,8 @@ class ThemeTwoVC: UIViewController {
avPlayer.removeObserver(self, forKeyPath: "timeControlStatus")
avPlayer.pause()
}
+
+ NotificationCenter.default.removeObserver(self, name: AVAudioSession.routeChangeNotification, object: nil)
}
override var preferredStatusBarStyle: UIStatusBarStyle {
diff --git a/WOKA/Theme/ViewModel/ThemeOneVM.swift b/WOKA/Theme/ViewModel/ThemeOneVM.swift
index 833e234..6c00959 100644
--- a/WOKA/Theme/ViewModel/ThemeOneVM.swift
+++ b/WOKA/Theme/ViewModel/ThemeOneVM.swift
@@ -38,6 +38,16 @@ class ThemeOneVM{
vc.nameLabel.setContentCompressionResistancePriority(.fittingSizeLevel, for: .horizontal)
handleBackground()
+
+ // Set initial small scale in viewDidLoad
+ self.vc.allIconView.transform = CGAffineTransform(scaleX: 0.5, y: 0.5) // Set initial scale to 50% of original size
+
+ // Perform the animation after the view has been laid out
+ DispatchQueue.main.async {
+ UIView.animate(withDuration: 0.7, delay: 0, options: [], animations: {
+ self.vc.allIconView.transform = CGAffineTransform.identity // Reset the transform to original size
+ }, completion: nil)
+ }
}
private func handleNotificationCenter(){
@@ -45,6 +55,30 @@ class ThemeOneVM{
NotificationCenter.default.addObserver(self, selector: #selector(appWillEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.themeOnePush(notification:)), name: NSNotification.Name(rawValue: K.NotificationCenterReloads.themeOnePush), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.reloadTheme), name: NSNotification.Name(rawValue: K.NotificationCenterReloads.reloadTheme), object: nil)
+
+ NotificationCenter.default.addObserver(self, selector: #selector(handleRouteChange(_:)), name: AVAudioSession.routeChangeNotification, object: nil)
+
+ }
+
+ @objc func handleRouteChange(_ notification: Notification) {
+ guard let userInfo = notification.userInfo,
+ let reasonValue = userInfo[AVAudioSessionRouteChangeReasonKey] as? UInt,
+ let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue) else {
+ return
+ }
+
+ switch reason {
+ case .oldDeviceUnavailable:
+ // Headphones unplugged, avoid pausing if desired
+ avPlayer?.play() // Resume playing if paused
+
+ case .newDeviceAvailable:
+ // Headphones plugged in, you may want to take specific actions if needed
+ avPlayer?.play() // Resume playing if paused
+
+ default:
+ break
+ }
}
// MARK: - start stop activity Indicator
@@ -425,7 +459,7 @@ class ThemeOneVM{
vc.modalTransitionStyle = .crossDissolve
// Present the PlayerVC
- self.vc.present(vc, animated: false) { [weak self] in
+ self.vc.present(vc, animated: true) { [weak self] in
guard let self else{return}
stopLiveStream()
}
diff --git a/WOKA/Theme/ViewModel/ThemeTwoVM.swift b/WOKA/Theme/ViewModel/ThemeTwoVM.swift
index 8b7b95b..6185a7a 100644
--- a/WOKA/Theme/ViewModel/ThemeTwoVM.swift
+++ b/WOKA/Theme/ViewModel/ThemeTwoVM.swift
@@ -51,10 +51,12 @@ class ThemeTwoVM{
NotificationCenter.default.addObserver(self, selector: #selector(appDidEnterBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(appWillEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.viewPush(notification:)), name: NSNotification.Name(rawValue: K.NotificationCenterReloads.themeTwoPush), object: nil)
+ NotificationCenter.default.addObserver(self, selector: #selector(handleRouteChange(_:)), name: AVAudioSession.routeChangeNotification, object: nil)
+
}
// MARK: - This will handle all clicks for modules
-
+
// This comes from Explore WOKA CLicks
@objc func viewPush(notification: Notification){
if let userInfo = notification.userInfo, let action = userInfo["action"] as? TopViewPush {
@@ -118,6 +120,27 @@ class ThemeTwoVM{
self.avPlayer.play()
}
+ @objc func handleRouteChange(_ notification: Notification) {
+ guard let userInfo = notification.userInfo,
+ let reasonValue = userInfo[AVAudioSessionRouteChangeReasonKey] as? UInt,
+ let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue) else {
+ return
+ }
+
+ switch reason {
+ case .oldDeviceUnavailable:
+ // Headphones unplugged, avoid pausing if desired
+ avPlayer?.play() // Resume playing if paused
+
+ case .newDeviceAvailable:
+ // Headphones plugged in, you may want to take specific actions if needed
+ avPlayer?.play() // Resume playing if paused
+
+ default:
+ break
+ }
+ }
+
// MARK: - Live TV
func playLiveTV(){
@@ -178,7 +201,7 @@ class ThemeTwoVM{
vc.modalTransitionStyle = .crossDissolve
// Present the PlayerVC
- self.vc.present(vc, animated: false) { [weak self] in
+ self.vc.present(vc, animated: true) { [weak self] in
guard let self else{return}
stopLiveStream()
}