FBNativeAdAdapter
FBNativeAdAdapter copied to clipboard
Update it into androudx
Update this into Androidx.. please
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.IdRes;
import androidx.annotation.LayoutRes;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.facebook.ads.AbstractAdListener;
import com.facebook.ads.Ad;
import com.facebook.ads.AdChoicesView;
import com.facebook.ads.AdError;
import com.facebook.ads.AdOptionsView;
import com.facebook.ads.MediaView;
import com.facebook.ads.NativeAd;
import com.facebook.ads.NativeAdLayout;
import com.facebook.ads.NativeAdListener;
import com.nine_to_five_pp.takecontrol_appusage_analysis_control.R;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
public class FBNativeAdAdapter extends RecyclerViewAdapterWrapper {
public static final int TYPE_FB_NATIVE_ADS = 900;
public static final int DEFAULT_AD_ITEM_INTERVAL = 10;
private final Param mParam;
private FBNativeAdAdapter(Param param) {
super(param.adapter);
this.mParam = param;
assertConfig();
setSpanAds();
}
private void assertConfig() {
if (mParam.gridLayoutManager != null) {
//if user set span ads
int nCol = mParam.gridLayoutManager.getSpanCount();
if (mParam.adItemInterval % nCol != 0) {
throw new IllegalArgumentException(String.format("The adItemInterval (%d) is not divisible by number of columns in GridLayoutManager (%d)", mParam.adItemInterval, nCol));
}
}
}
private int convertAdPosition2OrgPosition(int position) {
return position - (position + 1) / (mParam.adItemInterval + 1);
}
@Override
public int getItemCount() {
int realCount = super.getItemCount();
return realCount + realCount / mParam.adItemInterval;
}
@Override
public int getItemViewType(int position) {
if (isAdPosition(position)) {
return TYPE_FB_NATIVE_ADS;
}
return super.getItemViewType(convertAdPosition2OrgPosition(position));
}
private boolean isAdPosition(int position) {
return (position + 1) % (mParam.adItemInterval + 1) == 0;
}
public void onBindAdViewHolder(final RecyclerView.ViewHolder holder) {
final AdViewHolder adHolder = (AdViewHolder) holder;
if (mParam.forceReloadAdOnBind || !adHolder.loaded) {
final NativeAd nativeAd = new NativeAd(adHolder.getContext(), mParam.facebookPlacementId);
nativeAd.setAdListener(new NativeAdListener() {
@Override
public void onMediaDownloaded(Ad ad) {
}
@Override
public void onAdLoaded(Ad ad) {
if (ad != nativeAd) {
return;
}
adHolder.nativeAdContainer.setVisibility(View.VISIBLE);
// Add the AdOptionsView
/*AdOptionsView adOptionsView = new AdOptionsView(adHolder.getContext(), nativeAd, (NativeAdLayout) adHolder.nativeAdContainer);
adHolder.adChoicesContainer.removeAllViews();
adHolder.adChoicesContainer.addView(adOptionsView, 0);*/
// Set the Text.
adHolder.nativeAdTitle.setText(nativeAd.getAdvertiserName());
adHolder.nativeAdSocialContext.setText(nativeAd.getAdSocialContext());
adHolder.nativeAdBody.setText(nativeAd.getAdBodyText());
adHolder.nativeAdCallToAction.setVisibility(nativeAd.hasCallToAction() ? View.VISIBLE : View.INVISIBLE);
adHolder.nativeAdCallToAction.setText(nativeAd.getAdCallToAction());
adHolder.nativeSponsoredLabel.setText(nativeAd.getSponsoredTranslation());
// Download and display the ad icon.
// Download and display the cover image.
// Add the AdChoices icon
AdChoicesView adChoicesView = new AdChoicesView(adHolder.getContext(), nativeAd, true);
adHolder.adChoicesContainer.removeAllViews();
adHolder.adChoicesContainer.addView(adChoicesView);
// Register the Title and CTA button to listen for clicks.
List<View> clickableViews = new ArrayList<>();
clickableViews.add(adHolder.nativeAdTitle);
clickableViews.add(adHolder.nativeAdCallToAction);
nativeAd.registerViewForInteraction(
adHolder.nativeAdContainer,
adHolder.nativeAdMedia,
adHolder.nativeAdIcon,
clickableViews);
adHolder.loaded = true;
}
@Override
public void onAdClicked(Ad ad) {
}
@Override
public void onLoggingImpression(Ad ad) {
}
@Override
public void onError(Ad ad, AdError adError) {
adHolder.nativeAdContainer.setVisibility(View.GONE);
}
});
nativeAd.loadAd();
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (getItemViewType(position) == TYPE_FB_NATIVE_ADS) {
onBindAdViewHolder(holder);
} else {
super.onBindViewHolder(holder, convertAdPosition2OrgPosition(position));
}
}
public RecyclerView.ViewHolder onCreateAdViewHolder(ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View adLayoutOutline = inflater
.inflate(mParam.itemContainerLayoutRes, parent, false);
ViewGroup vg = (ViewGroup) adLayoutOutline.findViewById(mParam.itemContainerId);
LinearLayout adLayoutContent = (LinearLayout) inflater
.inflate(R.layout.facebook_native_ad_item, parent, false);
vg.addView(adLayoutContent);
return new AdViewHolder(adLayoutOutline);
}
@NotNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_FB_NATIVE_ADS) {
return onCreateAdViewHolder(parent);
}
return super.onCreateViewHolder(parent, viewType);
}
private void setSpanAds() {
if (mParam.gridLayoutManager == null) {
return ;
}
final GridLayoutManager.SpanSizeLookup spl = mParam.gridLayoutManager.getSpanSizeLookup();
mParam.gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (isAdPosition(position)){
return spl.getSpanSize(convertAdPosition2OrgPosition(position));
}
return 1;
}
});
}
private static class Param {
String facebookPlacementId;
RecyclerView.Adapter adapter;
int adItemInterval;
boolean forceReloadAdOnBind;
@LayoutRes
int itemContainerLayoutRes;
@IdRes
int itemContainerId;
GridLayoutManager gridLayoutManager;
}
public static class Builder {
private final Param mParam;
private Builder(Param param) {
mParam = param;
}
public static Builder with(String placementId, RecyclerView.Adapter wrapped) {
Param param = new Param();
param.facebookPlacementId = placementId;
param.adapter = wrapped;
//default value
param.adItemInterval = DEFAULT_AD_ITEM_INTERVAL;
param.itemContainerLayoutRes = R.layout.item_facebook_native_ad_outline;
param.itemContainerId = R.id.ad_container;
param.forceReloadAdOnBind = true;
return new FBNativeAdAdapter.Builder(param);
}
public Builder adItemIterval(int interval) {
mParam.adItemInterval = interval;
return this;
}
public Builder adLayout(@LayoutRes int layoutContainerRes, @IdRes int itemContainerId) {
mParam.itemContainerLayoutRes = layoutContainerRes;
mParam.itemContainerId = itemContainerId;
return this;
}
public FBNativeAdAdapter build() {
return new FBNativeAdAdapter(mParam);
}
public Builder enableSpanRow(GridLayoutManager layoutManager) {
mParam.gridLayoutManager = layoutManager;
return this;
}
public Builder forceReloadAdOnBind(boolean forced) {
mParam.forceReloadAdOnBind = forced;
return this;
}
}
private static class AdViewHolder extends RecyclerView.ViewHolder {
MediaView nativeAdIcon;
TextView nativeAdTitle;
MediaView nativeAdMedia;
TextView nativeAdSocialContext;
TextView nativeAdBody;
Button nativeAdCallToAction;
LinearLayout adChoicesContainer;
LinearLayout nativeAdContainer;
TextView nativeSponsoredLabel;
boolean loaded;
AdViewHolder(View view) {
super(view);
nativeAdContainer = (LinearLayout) view.findViewById(R.id.fb_native_ad_container);
nativeAdIcon = (MediaView) view.findViewById(R.id.native_ad_icon);
nativeAdTitle = (TextView) view.findViewById(R.id.native_ad_title);
nativeAdMedia = (MediaView) view.findViewById(R.id.native_ad_media);
nativeAdSocialContext = (TextView) view.findViewById(R.id.native_ad_social_context);
nativeAdBody = (TextView) view.findViewById(R.id.native_ad_body);
nativeAdCallToAction = (Button) view.findViewById(R.id.native_ad_call_to_action);
adChoicesContainer = (LinearLayout) view.findViewById(R.id.ad_choices_container);
nativeSponsoredLabel = (TextView) view.findViewById(R.id.sponsored_label);
loaded = false;
}
public Context getContext() {
return nativeAdContainer.getContext();
}
}
}