240 lines
8.5 KiB
Swift
240 lines
8.5 KiB
Swift
// GuruMaxMRecAd.swift
|
|
// Implementation for MAX MREC ads
|
|
// Corresponds to GuruMaxMRecAd.kt in Android implementation
|
|
|
|
import Foundation
|
|
import UIKit
|
|
import AppLovinSDK
|
|
|
|
public class GuruMaxMRecAd: GuruMRecAd, MAAdViewAdDelegate, MAAdRevenueDelegate {
|
|
|
|
private let viewController: UIViewController
|
|
private let adConfig: AdConfig
|
|
private var mrecAd: MAAdView?
|
|
private var contentView: UIView?
|
|
private var currentUid2Token: String = ""
|
|
private var horizontalOffset: CGFloat = 0.0
|
|
private var verticalOffset: CGFloat = 0.0
|
|
private var orientation: ScreenOrientation = .portrait
|
|
|
|
private var contentId: Int {
|
|
return self.adConfig.engineId
|
|
}
|
|
|
|
public init(viewController: UIViewController, adConfig: AdConfig) {
|
|
self.viewController = viewController
|
|
self.adConfig = adConfig
|
|
super.init(engineId: adConfig.engineId, adUnitId: adConfig.adUnitId, adPlatform: AdPlatform.max)
|
|
}
|
|
|
|
public override func logDebug(_ message: String) {
|
|
Logger.d(tag: "MaxMRecAd[\(adConfig.adUnitId)]", message: message)
|
|
}
|
|
|
|
public override func logInfo(_ message: String) {
|
|
Logger.i(tag: "MaxMRecAd[\(adConfig.adUnitId)]", message: message)
|
|
}
|
|
|
|
public override func logWarn(_ message: String) {
|
|
Logger.w(tag: "MaxMRecAd[\(adConfig.adUnitId)]", message: message)
|
|
}
|
|
|
|
public override func load() -> Bool {
|
|
mrecAd = MAAdView(adUnitIdentifier: adConfig.adUnitId, adFormat: MAAdFormat.mrec)
|
|
|
|
guard let mrecAd = mrecAd else { return false }
|
|
|
|
mrecAd.delegate = self
|
|
mrecAd.revenueDelegate = self
|
|
mrecAd.setExtraParameterForKey("allow_pause_auto_refresh_immediately", value: "true")
|
|
|
|
if let uid2Token = AdsHelper.getUid2Token() {
|
|
mrecAd.setExtraParameterForKey("uid2_token", value: uid2Token)
|
|
currentUid2Token = uid2Token
|
|
}
|
|
|
|
mrecAd.stopAutoRefresh()
|
|
|
|
if let amazonSlotId = adConfig.adAmazonSlotId, !amazonSlotId.isEmpty {
|
|
// In a real implementation, you would load Amazon ads here
|
|
logDebug("Would load Amazon MREC ad with slot ID: \(amazonSlotId)")
|
|
|
|
// Simulate direct load for now
|
|
mrecAd.loadAd()
|
|
} else {
|
|
mrecAd.loadAd()
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
public override func show(request: MRecShowRequest? = nil) -> Bool {
|
|
let placement = request?.placement
|
|
let newHorizontalOffset = request?.horizontalOffset
|
|
let newVerticalOffset = request?.verticalOffset
|
|
|
|
var shouldReattach = false
|
|
|
|
// Check if position or offset has changed
|
|
if let offset = newVerticalOffset, offset != Float(verticalOffset) {
|
|
verticalOffset = CGFloat(offset)
|
|
shouldReattach = true
|
|
}
|
|
|
|
if let offset = newHorizontalOffset, offset != Float(horizontalOffset) {
|
|
horizontalOffset = CGFloat(offset)
|
|
shouldReattach = true
|
|
}
|
|
|
|
// If we already have a view and parameters changed, remove it
|
|
if let contentView = contentView, shouldReattach {
|
|
logInfo("Parameters changed! Re-attaching view!")
|
|
contentView.removeFromSuperview()
|
|
self.contentView = nil
|
|
}
|
|
|
|
// Create new content view if needed
|
|
if contentView == nil {
|
|
let container = UIView()
|
|
container.tag = contentId
|
|
|
|
viewController.view.addSubview(container)
|
|
container.translatesAutoresizingMaskIntoConstraints = false
|
|
NSLayoutConstraint.activate([
|
|
container.leadingAnchor.constraint(equalTo: viewController.view.leadingAnchor),
|
|
container.trailingAnchor.constraint(equalTo: viewController.view.trailingAnchor),
|
|
container.topAnchor.constraint(equalTo: viewController.view.topAnchor),
|
|
container.bottomAnchor.constraint(equalTo: viewController.view.bottomAnchor)
|
|
])
|
|
|
|
contentView = container
|
|
|
|
guard let mrecAd = mrecAd else { return false }
|
|
|
|
// Standard MREC size is 300x250
|
|
let mrecWidth: CGFloat = 300
|
|
let mrecHeight: CGFloat = 250
|
|
|
|
mrecAd.translatesAutoresizingMaskIntoConstraints = false
|
|
container.addSubview(mrecAd)
|
|
|
|
NSLayoutConstraint.activate([
|
|
mrecAd.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: horizontalOffset),
|
|
mrecAd.topAnchor.constraint(equalTo: container.topAnchor, constant: verticalOffset),
|
|
mrecAd.widthAnchor.constraint(equalToConstant: mrecWidth),
|
|
mrecAd.heightAnchor.constraint(equalToConstant: mrecHeight)
|
|
])
|
|
|
|
mrecAd.isHidden = false
|
|
mrecAd.startAutoRefresh()
|
|
} else {
|
|
mrecAd?.startAutoRefresh()
|
|
mrecAd?.isHidden = false
|
|
}
|
|
|
|
// Update UID2 token if needed
|
|
if let uid2Token = AdsHelper.getUid2Token(), !uid2Token.isEmpty, uid2Token != currentUid2Token {
|
|
mrecAd?.setExtraParameterForKey("uid2_token", value: uid2Token)
|
|
currentUid2Token = uid2Token
|
|
logInfo("MRec refresh uid2_token \(currentUid2Token)")
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
public override func hide() -> Bool {
|
|
guard let _ = viewController.view.viewWithTag(contentId) else {
|
|
return true
|
|
}
|
|
|
|
if let mrecAd = mrecAd, !mrecAd.isHidden {
|
|
mrecAd.setExtraParameterForKey("allow_pause_auto_refresh_immediately", value: "true")
|
|
mrecAd.stopAutoRefresh()
|
|
mrecAd.isHidden = true
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
override public func destroy() -> Bool{
|
|
mrecAd?.delegate = nil
|
|
mrecAd?.revenueDelegate = nil
|
|
mrecAd?.removeFromSuperview()
|
|
mrecAd = nil
|
|
|
|
contentView?.removeFromSuperview()
|
|
contentView = nil
|
|
return true
|
|
}
|
|
|
|
override public func updateOrientation(orientation: ScreenOrientation) -> Bool {
|
|
if let _ = viewController.view.viewWithTag(contentId), self.orientation != orientation {
|
|
let isVisible = !(mrecAd?.isHidden ?? true)
|
|
|
|
mrecAd?.setExtraParameterForKey("allow_pause_auto_refresh_immediately", value: "true")
|
|
mrecAd?.stopAutoRefresh()
|
|
mrecAd?.isHidden = true
|
|
|
|
contentView?.removeFromSuperview()
|
|
contentView = nil
|
|
|
|
if isVisible {
|
|
return show()
|
|
}
|
|
}
|
|
|
|
self.orientation = orientation
|
|
return true
|
|
}
|
|
|
|
// MARK: - MAAdViewAdDelegate methods
|
|
|
|
public func didLoad(_ ad: MAAd) {
|
|
listener?.onAdLoaded(ad: MaxFusionAd(engineId: engineId, adType: AdType.MRec, ad: ad))
|
|
}
|
|
|
|
public func didFailToLoadAd(forAdUnitIdentifier adUnitIdentifier: String, withError error: MAError) {
|
|
let loadFailedInfo = LoadFailedInfo(
|
|
engineId: engineId,
|
|
adPlatform: AdPlatform.max,
|
|
adType: AdType.MRec,
|
|
adUnitId: adUnitIdentifier,
|
|
error: MaxFusionError(error)
|
|
)
|
|
listener?.onAdLoadFailed(loadFailedInfo: loadFailedInfo)
|
|
}
|
|
|
|
public func didDisplay(_ ad: MAAd) {
|
|
listener?.onAdDisplayed(ad: MaxFusionAd(engineId: engineId, adType: AdType.MRec, ad: ad))
|
|
}
|
|
|
|
public func didHide(_ ad: MAAd) {
|
|
listener?.onAdHidden(ad: MaxFusionAd(engineId: engineId, adType: AdType.MRec, ad: ad))
|
|
}
|
|
|
|
public func didClick(_ ad: MAAd) {
|
|
listener?.onAdClicked(ad: MaxFusionAd(engineId: engineId, adType: AdType.MRec, ad: ad))
|
|
}
|
|
|
|
public func didFail(toDisplay ad: MAAd, withError error: MAError) {
|
|
listener?.onAdDisplayFailed(
|
|
ad: MaxFusionAd(engineId: engineId, adType: AdType.MRec, ad: ad),
|
|
error: MaxFusionError(error)
|
|
)
|
|
}
|
|
|
|
public func didExpand(_ ad: MAAd) {
|
|
// In a real implementation, you would call adBannerExpanded
|
|
}
|
|
|
|
public func didCollapse(_ ad: MAAd) {
|
|
// In a real implementation, you would call adBannerCollapsed
|
|
}
|
|
|
|
// MARK: - MAAdRevenueDelegate methods
|
|
|
|
public func didPayRevenue(for ad: MAAd) {
|
|
listener?.onAdRevenuePaid(ad: MaxFusionAd(engineId: engineId, adType: AdType.MRec, ad: ad))
|
|
}
|
|
}
|