FusionAds-iOS/FusionAds/Classes/fusion/engine/AdModels.swift

221 lines
6.7 KiB
Swift

// AdModels.swift
// Defines core ad models for the FusionAds SDK
// Corresponds to AdModels.kt in Android implementation
import Foundation
import UIKit
// MARK: - AdPlatform
public class AdPlatform: Hashable, CustomStringConvertible, Codable {
public let name: String
private init(_ name: String) {
self.name = name
}
required public init(from decoder: any Decoder) throws {
let container = try decoder.singleValueContainer()
self.name = try container.decode(String.self)
}
public func encode(to encoder: any Encoder) throws {
var container = encoder.singleValueContainer()
try container.encode(self.name)
}
public static let adMob = AdPlatform("ADMOB")
public static let amazon = AdPlatform("AMZ")
public static let facebook = AdPlatform("FB")
public static let ironSource = AdPlatform("ULP")
public static let max = AdPlatform("MAX")
public static let tradPlus = AdPlatform("TP")
public static let pangle = AdPlatform("PG")
public static let invalid = AdPlatform("INVALID")
public static let fusion = AdPlatform("FUSION")
public static let test = AdPlatform("TEST")
public static func fromName(_ name: String) -> AdPlatform {
let upperName = name.uppercased()
switch upperName {
case AdPlatform.adMob.name:
return AdPlatform.adMob
case AdPlatform.amazon.name:
return AdPlatform.amazon
case AdPlatform.facebook.name:
return AdPlatform.facebook
case AdPlatform.ironSource.name:
return AdPlatform.ironSource
case AdPlatform.max.name:
return AdPlatform.max
case AdPlatform.test.name:
return AdPlatform.test
default:
fatalError("Invalid Ad Platform name")
}
}
public static func == (lhs: AdPlatform, rhs: AdPlatform) -> Bool {
return lhs.name == rhs.name
}
public func hash(into hasher: inout Hasher) {
hasher.combine(name)
}
public var description: String {
return name
}
}
// MARK: - AdType
/**
* Ad format or type of an ad unit,
* [name] mainly for display scenario
* [label] for more formal scenario, like stats
*/
public class AdType: Equatable, Hashable, CustomStringConvertible {
public let name: String
public let label: String
private init(_ name: String, label: String) {
self.name = name
self.label = label
}
public static let Interstitial = AdType("Interstitial", label: "INTER")
public static let Rewarded = AdType("Rewarded", label: "REWARDED")
public static let Banner = AdType("Banner", label: "BANNER")
public static let MRec = AdType("MRec", label: "MREC")
public static func fromName(_ name: String) -> AdType {
switch name {
case AdType.Interstitial.name:
return AdType.Interstitial
case AdType.Rewarded.name:
return AdType.Rewarded
case AdType.Banner.name:
return AdType.Banner
case AdType.MRec.name:
return AdType.MRec
default:
fatalError("Invalid Ad Type name")
}
}
public static func == (lhs: AdType, rhs: AdType) -> Bool {
return lhs.name == rhs.name
}
public func hash(into hasher: inout Hasher) {
hasher.combine(name)
}
public var description: String {
return name
}
}
// MARK: - BannerPosition
public enum BannerPosition: String {
case top
case bottom
case start
case end
}
// MARK: - ScreenOrientation
public enum ScreenOrientation: Int {
case portrait = 0
case landscape = 1
}
public class LoadAdTimeoutError: FusionError {
public var errorCode: Int { return -100001 }
public var message: String { return "Load ad timeout" }
public var cause: Error? { return nil }
public var info: String? { return nil }
public var waterfallName: String? { return nil }
}
public class LoadAdRequestError: FusionError {
public var errorCode: Int { return -100002 }
public let message: String
public var cause: Error? { return nil }
public var info: String? { return nil }
public var waterfallName: String? { return nil }
init(message: String = "Load Ad Request Error") {
self.message = message
}
}
public class ShowAdTimeoutError: FusionError {
public var errorCode: Int { return -100003 }
public var message: String { return "Show Ad Timeout Error" }
public var cause: Error? { return nil }
public var info: String? { return nil }
public var waterfallName: String? { return nil }
}
public class ShowAdRequestError: FusionError {
public var errorCode: Int { return -100004 }
public let message: String
public var cause: Error? { return nil }
public var info: String? { return nil }
public var waterfallName: String? { return nil }
init(message: String = "Show Ad Request Error") {
self.message = message
}
}
public class LoadAdNotAvailableError: FusionError {
public var errorCode: Int { return -100005 }
public let message: String
public var cause: Error? { return nil }
public var info: String? { return nil }
public var waterfallName: String? { return nil }
init(message: String = "Load Ad Not Avaialable Error") {
self.message = message
}
}
// MARK: - InvalidFusionAd
public class InvalidFusionAd: FusionAd {
public override var adPlatform: AdPlatform { return AdPlatform.invalid }
public override var adUnitId: String? { return "" }
public override var revenue: Double { return 0.0 }
public override var waterfallName: String? { return "" }
public override var placement: String? { return "" }
public override var networkName: String? { return "" }
public override var networkPlacement: String? { return "" }
public override var creativeId: String? { return "" }
public override var adReviewCreativeId: String? { return "" }
private override init(engineId: Int, adType: AdType) {
super.init(engineId: engineId, adType: adType)
}
public static func banner(engineId: Int) -> InvalidFusionAd {
return InvalidFusionAd(engineId: engineId, adType: AdType.Banner)
}
public static func interstitial(engineId: Int) -> InvalidFusionAd {
return InvalidFusionAd(engineId: engineId, adType: AdType.Interstitial)
}
public static func rewarded(engineId: Int) -> InvalidFusionAd {
return InvalidFusionAd(engineId: engineId, adType: AdType.Rewarded)
}
public static func mRec(engineId: Int) -> InvalidFusionAd {
return InvalidFusionAd(engineId: engineId, adType: AdType.MRec)
}
}