package com.mopub.mobileads; import android.content.Context; import android.os.Handler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.View; import com.mopub.common.AdReport; import com.mopub.common.Preconditions; import com.mopub.common.logging.MoPubLog; import com.mopub.mobileads.CustomEventBanner.CustomEventBannerListener; import com.mopub.mobileads.factories.CustomEventBannerFactory; import java.util.Map; import java.util.TreeMap; import static com.mopub.common.DataKeys.AD_REPORT_KEY; import static com.mopub.common.DataKeys.BROADCAST_IDENTIFIER_KEY; import static com.mopub.mobileads.MoPubErrorCode.ADAPTER_NOT_FOUND; import static com.mopub.mobileads.MoPubErrorCode.NETWORK_TIMEOUT; import static com.mopub.mobileads.MoPubErrorCode.UNSPECIFIED; public class CustomEventBannerAdapter implements CustomEventBannerListener { public static final int DEFAULT_BANNER_TIMEOUT_DELAY = 10000; private boolean mInvalidated; private MoPubView mMoPubView; private Context mContext; private CustomEventBanner mCustomEventBanner; private Map<String, Object> mLocalExtras; private Map<String, String> mServerExtras; private final Handler mHandler; private final Runnable mTimeout; private boolean mStoredAutorefresh; public CustomEventBannerAdapter(@NonNull MoPubView moPubView, @NonNull String className, @NonNull Map<String, String> serverExtras, long broadcastIdentifier, @Nullable AdReport adReport) { Preconditions.checkNotNull(serverExtras); mHandler = new Handler(); mMoPubView = moPubView; mContext = moPubView.getContext(); mTimeout = new Runnable() { @Override public void run() { MoPubLog.d("Third-party network timed out."); onBannerFailed(NETWORK_TIMEOUT); invalidate(); } }; MoPubLog.d("Attempting to invoke custom event: " + className); try { mCustomEventBanner = CustomEventBannerFactory.create(className); } catch (Exception exception) { MoPubLog.d("Couldn't locate or instantiate custom event: " + className + "."); mMoPubView.loadFailUrl(ADAPTER_NOT_FOUND); return; } // Attempt to load the JSON extras into mServerExtras. mServerExtras = new TreeMap<String,String>(serverExtras); mLocalExtras = mMoPubView.getLocalExtras(); if (mMoPubView.getLocation() != null) { mLocalExtras.put("location", mMoPubView.getLocation()); } mLocalExtras.put(BROADCAST_IDENTIFIER_KEY, broadcastIdentifier); mLocalExtras.put(AD_REPORT_KEY, adReport); } void loadAd() { if (isInvalidated() || mCustomEventBanner == null) { return; } if (getTimeoutDelayMilliseconds() > 0) { mHandler.postDelayed(mTimeout, getTimeoutDelayMilliseconds()); } mCustomEventBanner.loadBanner(mContext, this, mLocalExtras, mServerExtras); } void invalidate() { if (mCustomEventBanner != null) mCustomEventBanner.onInvalidate(); mContext = null; mCustomEventBanner = null; mLocalExtras = null; mServerExtras = null; mInvalidated = true; } boolean isInvalidated() { return mInvalidated; } private void cancelTimeout() { mHandler.removeCallbacks(mTimeout); } private int getTimeoutDelayMilliseconds() { if (mMoPubView == null || mMoPubView.getAdTimeoutDelay() == null || mMoPubView.getAdTimeoutDelay() < 0) { return DEFAULT_BANNER_TIMEOUT_DELAY; } return mMoPubView.getAdTimeoutDelay() * 1000; } /* * CustomEventBanner.Listener implementation */ @Override public void onBannerLoaded(View bannerView) { if (isInvalidated()) { return; } cancelTimeout(); if (mMoPubView != null) { mMoPubView.nativeAdLoaded(); mMoPubView.setAdContentView(bannerView); if (!(bannerView instanceof HtmlBannerWebView)) { mMoPubView.trackNativeImpression(); } } } @Override public void onBannerFailed(MoPubErrorCode errorCode) { if (isInvalidated()) return; if (mMoPubView != null) { if (errorCode == null) { errorCode = UNSPECIFIED; } cancelTimeout(); mMoPubView.loadFailUrl(errorCode); } } @Override public void onBannerExpanded() { if (isInvalidated()) return; mStoredAutorefresh = mMoPubView.getAutorefreshEnabled(); mMoPubView.setAutorefreshEnabled(false); mMoPubView.adPresentedOverlay(); } @Override public void onBannerCollapsed() { if (isInvalidated()) return; mMoPubView.setAutorefreshEnabled(mStoredAutorefresh); mMoPubView.adClosed(); } @Override public void onBannerClicked() { if (isInvalidated()) return; if (mMoPubView != null) mMoPubView.registerClick(); } @Override public void onLeaveApplication() { onBannerClicked(); } }