package com.mopub.nativeads;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.mopub.common.VisibleForTesting;
import java.util.WeakHashMap;
import static android.view.View.VISIBLE;
/**
* An implementation of {@link com.mopub.nativeads.MoPubAdRenderer} for rendering native ads.
*/
public class MoPubNativeAdRenderer implements MoPubAdRenderer<NativeResponse> {
@NonNull private final ViewBinder mViewBinder;
// This is used instead of View.setTag, which causes a memory leak in 2.3
// and earlier: https://code.google.com/p/android/issues/detail?id=18273
@VisibleForTesting @NonNull final WeakHashMap<View, NativeViewHolder> mViewHolderMap;
/**
* Constructs a native ad renderer with a view binder.
*
* @param viewBinder The view binder to use when inflating and rendering an ad.
*/
public MoPubNativeAdRenderer(@NonNull final ViewBinder viewBinder) {
mViewBinder = viewBinder;
mViewHolderMap = new WeakHashMap<View, NativeViewHolder>();
}
@Override
@NonNull
public View createAdView(@NonNull final Context context, @Nullable final ViewGroup parent) {
return LayoutInflater
.from(context)
.inflate(mViewBinder.layoutId, parent, false);
}
@Override
public void renderAdView(@NonNull final View view,
@NonNull final NativeResponse nativeResponse) {
NativeViewHolder nativeViewHolder = mViewHolderMap.get(view);
if (nativeViewHolder == null) {
nativeViewHolder = NativeViewHolder.fromViewBinder(view, mViewBinder);
mViewHolderMap.put(view, nativeViewHolder);
}
nativeViewHolder.update(nativeResponse);
nativeViewHolder.updateExtras(view, nativeResponse, mViewBinder);
view.setVisibility(VISIBLE);
}
}