Created
August 6, 2019 12:42
-
-
Save rana01645/7e9424a40ae0573d0c571bbce4e36c4f to your computer and use it in GitHub Desktop.
Native Template Androidx support
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Copyright 2019 Google LLC | |
// | |
// Licensed under the Apache License, Version 2.0 (the "License"); | |
// you may not use this file except in compliance with the License. | |
// You may obtain a copy of the License at | |
// | |
// http://www.apache.org/licenses/LICENSE-2.0 | |
// | |
// Unless required by applicable law or agreed to in writing, software | |
// distributed under the License is distributed on an "AS IS" BASIS, | |
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
// See the License for the specific language governing permissions and | |
// limitations under the License. | |
package com.google.android.ads.nativetemplates; | |
import android.content.Context; | |
import android.content.res.TypedArray; | |
import android.graphics.Typeface; | |
import android.graphics.drawable.Drawable; | |
import android.os.Build; | |
import android.text.TextUtils; | |
import android.util.AttributeSet; | |
import android.view.LayoutInflater; | |
import android.widget.Button; | |
import android.widget.FrameLayout; | |
import android.widget.ImageView; | |
import android.widget.RatingBar; | |
import android.widget.TextView; | |
import androidx.annotation.Nullable; | |
import androidx.annotation.RequiresApi; | |
import androidx.constraintlayout.widget.ConstraintLayout; | |
import com.google.android.gms.ads.formats.MediaView; | |
import com.google.android.gms.ads.formats.NativeAd.Image; | |
import com.google.android.gms.ads.formats.UnifiedNativeAd; | |
import com.google.android.gms.ads.formats.UnifiedNativeAdView; | |
/** Base class for a template view. * */ | |
public class TemplateView extends FrameLayout { | |
private int templateType; | |
private NativeTemplateStyle styles; | |
private UnifiedNativeAd nativeAd; | |
private UnifiedNativeAdView nativeAdView; | |
private TextView primaryView; | |
private TextView secondaryView; | |
private RatingBar ratingBar; | |
private TextView tertiaryView; | |
private ImageView iconView; | |
private MediaView mediaView; | |
private Button callToActionView; | |
private ConstraintLayout background; | |
private static final String MEDIUM_TEMPLATE = "medium_template"; | |
private static final String SMALL_TEMPLATE = "small_template"; | |
public TemplateView(Context context) { | |
super(context); | |
} | |
public TemplateView(Context context, @Nullable AttributeSet attrs) { | |
super(context, attrs); | |
initView(context, attrs); | |
} | |
public TemplateView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { | |
super(context, attrs, defStyleAttr); | |
initView(context, attrs); | |
} | |
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) | |
public TemplateView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { | |
super(context, attrs, defStyleAttr, defStyleRes); | |
initView(context, attrs); | |
} | |
public void setStyles(NativeTemplateStyle styles) { | |
this.styles = styles; | |
this.applyStyles(); | |
} | |
public UnifiedNativeAdView getNativeAdView() { | |
return nativeAdView; | |
} | |
private void applyStyles() { | |
Drawable mainBackground = styles.getMainBackgroundColor(); | |
if (mainBackground != null) { | |
background.setBackground(mainBackground); | |
if (primaryView != null) { | |
primaryView.setBackground(mainBackground); | |
} | |
if (secondaryView != null) { | |
secondaryView.setBackground(mainBackground); | |
} | |
if (tertiaryView != null) { | |
tertiaryView.setBackground(mainBackground); | |
} | |
} | |
Typeface primary = styles.getPrimaryTextTypeface(); | |
if (primary != null && primaryView != null) { | |
primaryView.setTypeface(primary); | |
} | |
Typeface secondary = styles.getSecondaryTextTypeface(); | |
if (secondary != null && secondaryView != null) { | |
secondaryView.setTypeface(secondary); | |
} | |
Typeface tertiary = styles.getTertiaryTextTypeface(); | |
if (tertiary != null && tertiaryView != null) { | |
tertiaryView.setTypeface(tertiary); | |
} | |
Typeface ctaTypeface = styles.getCallToActionTextTypeface(); | |
if (ctaTypeface != null && callToActionView != null) { | |
callToActionView.setTypeface(ctaTypeface); | |
} | |
int primaryTypefaceColor = styles.getPrimaryTextTypefaceColor(); | |
if (primaryTypefaceColor > 0 && primaryView != null) { | |
primaryView.setTextColor(primaryTypefaceColor); | |
} | |
int secondaryTypefaceColor = styles.getSecondaryTextTypefaceColor(); | |
if (secondaryTypefaceColor > 0 && secondaryView != null) { | |
secondaryView.setTextColor(secondaryTypefaceColor); | |
} | |
int tertiaryTypefaceColor = styles.getTertiaryTextTypefaceColor(); | |
if (tertiaryTypefaceColor > 0 && tertiaryView != null) { | |
tertiaryView.setTextColor(tertiaryTypefaceColor); | |
} | |
int ctaTypefaceColor = styles.getCallToActionTypefaceColor(); | |
if (ctaTypefaceColor > 0 && callToActionView != null) { | |
callToActionView.setTextColor(ctaTypefaceColor); | |
} | |
float ctaTextSize = styles.getCallToActionTextSize(); | |
if (ctaTextSize > 0 && callToActionView != null) { | |
callToActionView.setTextSize(ctaTextSize); | |
} | |
float primaryTextSize = styles.getPrimaryTextSize(); | |
if (primaryTextSize > 0 && primaryView != null) { | |
primaryView.setTextSize(primaryTextSize); | |
} | |
float secondaryTextSize = styles.getSecondaryTextSize(); | |
if (secondaryTextSize > 0 && secondaryView != null) { | |
secondaryView.setTextSize(secondaryTextSize); | |
} | |
float tertiaryTextSize = styles.getTertiaryTextSize(); | |
if (tertiaryTextSize > 0 && tertiaryView != null) { | |
tertiaryView.setTextSize(tertiaryTextSize); | |
} | |
Drawable ctaBackground = styles.getCallToActionBackgroundColor(); | |
if (ctaBackground != null && callToActionView != null) { | |
callToActionView.setBackground(ctaBackground); | |
} | |
Drawable primaryBackground = styles.getPrimaryTextBackgroundColor(); | |
if (primaryBackground != null && primaryView != null) { | |
primaryView.setBackground(primaryBackground); | |
} | |
Drawable secondaryBackground = styles.getSecondaryTextBackgroundColor(); | |
if (secondaryBackground != null && secondaryView != null) { | |
secondaryView.setBackground(secondaryBackground); | |
} | |
Drawable tertiaryBackground = styles.getTertiaryTextBackgroundColor(); | |
if (tertiaryBackground != null && tertiaryView != null) { | |
tertiaryView.setBackground(tertiaryBackground); | |
} | |
invalidate(); | |
requestLayout(); | |
} | |
private boolean adHasOnlyStore(UnifiedNativeAd nativeAd) { | |
String store = nativeAd.getStore(); | |
String advertiser = nativeAd.getAdvertiser(); | |
return !TextUtils.isEmpty(store) && TextUtils.isEmpty(advertiser); | |
} | |
public void setNativeAd(UnifiedNativeAd nativeAd) { | |
this.nativeAd = nativeAd; | |
String store = nativeAd.getStore(); | |
String advertiser = nativeAd.getAdvertiser(); | |
String headline = nativeAd.getHeadline(); | |
String body = nativeAd.getBody(); | |
String cta = nativeAd.getCallToAction(); | |
Double starRating = nativeAd.getStarRating(); | |
Image icon = nativeAd.getIcon(); | |
String secondaryText; | |
nativeAdView.setCallToActionView(callToActionView); | |
nativeAdView.setHeadlineView(primaryView); | |
nativeAdView.setMediaView(mediaView); | |
secondaryView.setVisibility(VISIBLE); | |
if (adHasOnlyStore(nativeAd)) { | |
nativeAdView.setStoreView(secondaryView); | |
secondaryText = store; | |
} else if (!TextUtils.isEmpty(advertiser)) { | |
nativeAdView.setAdvertiserView(secondaryView); | |
secondaryText = advertiser; | |
} else { | |
secondaryText = ""; | |
} | |
primaryView.setText(headline); | |
callToActionView.setText(cta); | |
// Set the secondary view to be the star rating if available. | |
if (starRating != null && starRating > 0) { | |
secondaryView.setVisibility(GONE); | |
ratingBar.setVisibility(VISIBLE); | |
ratingBar.setMax(5); | |
nativeAdView.setStarRatingView(ratingBar); | |
} else { | |
secondaryView.setText(secondaryText); | |
secondaryView.setVisibility(VISIBLE); | |
ratingBar.setVisibility(GONE); | |
} | |
if (icon != null) { | |
iconView.setVisibility(VISIBLE); | |
iconView.setImageDrawable(icon.getDrawable()); | |
} else { | |
iconView.setVisibility(GONE); | |
} | |
if (tertiaryView != null) { | |
tertiaryView.setText(body); | |
nativeAdView.setBodyView(tertiaryView); | |
} | |
nativeAdView.setNativeAd(nativeAd); | |
} | |
/** | |
* To prevent memory leaks, make sure to destroy your ad when you don't need it anymore. This | |
* method does not destroy the template view. | |
* https://developers.google.com/admob/android/native-unified#destroy_ad | |
*/ | |
public void destroyNativeAd() { | |
nativeAd.destroy(); | |
} | |
public String getTemplateTypeName() { | |
if (templateType == R.layout.gnt_medium_template_view) { | |
return MEDIUM_TEMPLATE; | |
} else if (templateType == R.layout.gnt_small_template_view) { | |
return SMALL_TEMPLATE; | |
} | |
return ""; | |
} | |
private void initView(Context context, AttributeSet attributeSet) { | |
TypedArray attributes = | |
context.getTheme().obtainStyledAttributes(attributeSet, R.styleable.TemplateView, 0, 0); | |
try { | |
templateType = | |
attributes.getResourceId( | |
R.styleable.TemplateView_gnt_template_type, R.layout.gnt_medium_template_view); | |
} finally { | |
attributes.recycle(); | |
} | |
LayoutInflater inflater = | |
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); | |
inflater.inflate(templateType, this); | |
} | |
@Override | |
public void onFinishInflate() { | |
super.onFinishInflate(); | |
nativeAdView = (UnifiedNativeAdView) findViewById(R.id.native_ad_view); | |
primaryView = (TextView) findViewById(R.id.primary); | |
secondaryView = (TextView) findViewById(R.id.secondary); | |
tertiaryView = (TextView) findViewById(R.id.body); | |
ratingBar = (RatingBar) findViewById(R.id.rating_bar); | |
ratingBar.setEnabled(false); | |
callToActionView = (Button) findViewById(R.id.cta); | |
iconView = (ImageView) findViewById(R.id.icon); | |
mediaView = (MediaView) findViewById(R.id.media_view); | |
background = (ConstraintLayout) findViewById(R.id.background); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment