Skip to content

Commit 8ff397b

Browse files
feat: replace banner ads with native ads
1 parent 9320c77 commit 8ff397b

27 files changed

+197
-94
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.d4rk.androidtutorials.java.ads.managers;
2+
3+
import android.content.Context;
4+
import android.view.LayoutInflater;
5+
import android.view.View;
6+
import android.view.ViewGroup;
7+
import android.widget.Button;
8+
import android.widget.ImageView;
9+
import android.widget.TextView;
10+
11+
import androidx.annotation.NonNull;
12+
13+
import com.d4rk.androidtutorials.java.R;
14+
import com.google.android.gms.ads.AdLoader;
15+
import com.google.android.gms.ads.AdRequest;
16+
import com.google.android.gms.ads.nativead.MediaView;
17+
import com.google.android.gms.ads.nativead.NativeAd;
18+
import com.google.android.gms.ads.nativead.NativeAdView;
19+
20+
/**
21+
* Helper class to load AdMob native ads into a container.
22+
*/
23+
public class NativeAdLoader {
24+
25+
public static void load(@NonNull Context context, @NonNull ViewGroup container) {
26+
AdLoader adLoader = new AdLoader.Builder(context, context.getString(R.string.ad_banner_unit_id))
27+
.forNativeAd(nativeAd -> {
28+
LayoutInflater inflater = LayoutInflater.from(context);
29+
NativeAdView adView = (NativeAdView) inflater.inflate(R.layout.native_ad, container, false);
30+
populateNativeAdView(nativeAd, adView);
31+
container.removeAllViews();
32+
container.addView(adView);
33+
})
34+
.build();
35+
adLoader.loadAd(new AdRequest.Builder().build());
36+
}
37+
38+
private static void populateNativeAdView(@NonNull NativeAd nativeAd, @NonNull NativeAdView adView) {
39+
adView.setMediaView((MediaView) adView.findViewById(R.id.ad_media));
40+
adView.setHeadlineView(adView.findViewById(R.id.ad_headline));
41+
adView.setBodyView(adView.findViewById(R.id.ad_body));
42+
adView.setCallToActionView(adView.findViewById(R.id.ad_call_to_action));
43+
adView.setIconView(adView.findViewById(R.id.ad_app_icon));
44+
45+
((TextView) adView.getHeadlineView()).setText(nativeAd.getHeadline());
46+
47+
if (nativeAd.getBody() == null) {
48+
adView.getBodyView().setVisibility(View.GONE);
49+
} else {
50+
adView.getBodyView().setVisibility(View.VISIBLE);
51+
((TextView) adView.getBodyView()).setText(nativeAd.getBody());
52+
}
53+
54+
if (nativeAd.getCallToAction() == null) {
55+
adView.getCallToActionView().setVisibility(View.GONE);
56+
} else {
57+
adView.getCallToActionView().setVisibility(View.VISIBLE);
58+
((Button) adView.getCallToActionView()).setText(nativeAd.getCallToAction());
59+
}
60+
61+
if (nativeAd.getIcon() == null) {
62+
adView.getIconView().setVisibility(View.GONE);
63+
} else {
64+
((ImageView) adView.getIconView()).setImageDrawable(nativeAd.getIcon().getDrawable());
65+
adView.getIconView().setVisibility(View.VISIBLE);
66+
}
67+
68+
adView.setNativeAd(nativeAd);
69+
}
70+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.d4rk.androidtutorials.java.ads.views;
2+
3+
import android.content.Context;
4+
import android.util.AttributeSet;
5+
import android.widget.FrameLayout;
6+
7+
import androidx.annotation.NonNull;
8+
import androidx.annotation.Nullable;
9+
10+
import com.google.android.gms.ads.AdRequest;
11+
import com.d4rk.androidtutorials.java.ads.managers.NativeAdLoader;
12+
13+
/**
14+
* Custom view that acts as a drop-in replacement for AdView and loads
15+
* a native ad using {@link NativeAdLoader} when {@link #loadAd(AdRequest)} is called.
16+
*/
17+
public class NativeAdBannerView extends FrameLayout {
18+
19+
public NativeAdBannerView(@NonNull Context context) {
20+
super(context);
21+
}
22+
23+
public NativeAdBannerView(@NonNull Context context, @Nullable AttributeSet attrs) {
24+
super(context, attrs);
25+
}
26+
27+
public NativeAdBannerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
28+
super(context, attrs, defStyleAttr);
29+
}
30+
31+
public void loadAd(AdRequest adRequest) {
32+
NativeAdLoader.load(getContext(), this);
33+
}
34+
}

app/src/main/res/layout/activity_android_history.xml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,11 @@
3030
app:layout_constraintTop_toBottomOf="@id/text_view_history"
3131
tools:ignore="VisualLintLongText" />
3232

33-
<com.google.android.gms.ads.AdView
33+
<com.d4rk.androidtutorials.java.ads.views.NativeAdBannerView
3434
android:id="@+id/ad_view"
3535
android:layout_width="match_parent"
3636
android:layout_height="wrap_content"
3737
android:layout_margin="24dp"
38-
app:adSize="MEDIUM_RECTANGLE"
39-
app:adUnitId="@string/ad_banner_unit_id"
4038
app:layout_constraintTop_toBottomOf="@id/text_view_android_history" />
4139

4240
<com.google.android.material.textview.MaterialTextView
@@ -59,13 +57,11 @@
5957
app:layout_constraintTop_toBottomOf="@id/text_view_features"
6058
tools:ignore="VisualLintLongText" />
6159

62-
<com.google.android.gms.ads.AdView
60+
<com.d4rk.androidtutorials.java.ads.views.NativeAdBannerView
6361
android:id="@+id/ad_view_bottom"
6462
android:layout_width="match_parent"
6563
android:layout_height="wrap_content"
6664
android:layout_margin="24dp"
67-
app:adSize="FULL_BANNER"
68-
app:adUnitId="@string/ad_banner_unit_id"
6965
app:layout_constraintEnd_toEndOf="parent"
7066
app:layout_constraintStart_toStartOf="parent"
7167
app:layout_constraintTop_toBottomOf="@id/text_view_android_features" />

app/src/main/res/layout/activity_android_sdk.xml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,11 @@
2222
app:layout_constraintTop_toTopOf="parent"
2323
tools:ignore="VisualLintLongText" />
2424

25-
<com.google.android.gms.ads.AdView
25+
<com.d4rk.androidtutorials.java.ads.views.NativeAdBannerView
2626
android:id="@+id/ad_view"
2727
android:layout_width="match_parent"
2828
android:layout_height="wrap_content"
2929
android:layout_marginTop="24dp"
30-
app:adSize="MEDIUM_RECTANGLE"
31-
app:adUnitId="@string/ad_banner_unit_id"
3230
app:layout_constraintTop_toBottomOf="@id/text_view_android_sdks_summary" />
3331

3432
<com.google.android.material.textview.MaterialTextView
@@ -62,13 +60,11 @@
6260
android:stretchColumns="0,1,2,3,4" />
6361
</com.google.android.material.card.MaterialCardView>
6462

65-
<com.google.android.gms.ads.AdView
63+
<com.d4rk.androidtutorials.java.ads.views.NativeAdBannerView
6664
android:id="@+id/ad_view_bottom"
6765
android:layout_width="match_parent"
6866
android:layout_height="wrap_content"
6967
android:layout_marginTop="24dp"
70-
app:adSize="FULL_BANNER"
71-
app:adUnitId="@string/ad_banner_unit_id"
7268
app:layout_constraintTop_toBottomOf="@id/card_view_table_layout" />
7369
</androidx.constraintlayout.widget.ConstraintLayout>
7470
</me.zhanghai.android.fastscroll.FastScrollScrollView>

app/src/main/res/layout/activity_android_start_project.xml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,11 @@
6969
android:contentDescription="@string/im_step1_desc" />
7070
</com.google.android.material.card.MaterialCardView>
7171

72-
<com.google.android.gms.ads.AdView
72+
<com.d4rk.androidtutorials.java.ads.views.NativeAdBannerView
7373
android:id="@+id/ad_view"
7474
android:layout_width="match_parent"
7575
android:layout_height="wrap_content"
7676
android:layout_marginTop="24dp"
77-
app:adSize="MEDIUM_RECTANGLE"
78-
app:adUnitId="@string/ad_banner_unit_id"
7977
app:layout_constraintTop_toBottomOf="@id/card_view_first_step" />
8078

8179
<com.google.android.material.textview.MaterialTextView
@@ -168,13 +166,11 @@
168166
app:lottie_rawRes="@raw/anim_programmer"
169167
app:lottie_speed="0.5" />
170168

171-
<com.google.android.gms.ads.AdView
169+
<com.d4rk.androidtutorials.java.ads.views.NativeAdBannerView
172170
android:id="@+id/ad_view_bottom"
173171
android:layout_width="match_parent"
174172
android:layout_height="wrap_content"
175173
android:layout_margin="24dp"
176-
app:adSize="FULL_BANNER"
177-
app:adUnitId="@string/ad_banner_unit_id"
178174
app:layout_constraintTop_toBottomOf="@id/lottie_animation" />
179175
</androidx.constraintlayout.widget.ConstraintLayout>
180176
</me.zhanghai.android.fastscroll.FastScrollScrollView>

app/src/main/res/layout/activity_main.xml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
android:id="@+id/nav_rail"
2525
android:layout_width="wrap_content"
2626
android:layout_height="0dp"
27-
android:visibility="gone"
2827
app:layout_constraintStart_toStartOf="parent"
2928
app:layout_constraintTop_toBottomOf="@id/app_bar_layout"
3029
app:layout_constraintBottom_toTopOf="@+id/ad_container"
@@ -54,13 +53,11 @@
5453
android:layout_height="match_parent"
5554
android:background="@android:color/darker_gray" />
5655

57-
<com.google.android.gms.ads.AdView
56+
<com.d4rk.androidtutorials.java.ads.views.NativeAdBannerView
5857
android:id="@+id/ad_view"
5958
android:layout_width="match_parent"
6059
android:layout_height="match_parent"
61-
android:visibility="gone"
62-
app:adSize="FULL_BANNER"
63-
app:adUnitId="@string/ad_banner_unit_id" />
60+
/>
6461
</FrameLayout>
6562

6663
<com.google.android.material.bottomnavigation.BottomNavigationView
@@ -75,7 +72,6 @@
7572
android:id="@+id/progress_bar"
7673
android:layout_width="wrap_content"
7774
android:layout_height="wrap_content"
78-
android:visibility="gone"
7975
app:layout_constraintTop_toTopOf="parent"
8076
app:layout_constraintBottom_toBottomOf="parent"
8177
app:layout_constraintStart_toStartOf="parent"

app/src/main/res/layout/activity_permissions_tutorial.xml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,11 @@
1818
android:text="@string/summary_permissions"
1919
app:layout_constraintTop_toTopOf="parent" />
2020

21-
<com.google.android.gms.ads.AdView
21+
<com.d4rk.androidtutorials.java.ads.views.NativeAdBannerView
2222
android:id="@+id/ad_view_large"
2323
android:layout_width="match_parent"
2424
android:layout_height="wrap_content"
2525
android:layout_margin="24dp"
26-
app:adSize="MEDIUM_RECTANGLE"
27-
app:adUnitId="@string/ad_banner_unit_id"
2826
app:layout_constraintTop_toBottomOf="@id/text_view_permissions_beginning" />
2927

3028
<com.google.android.material.textview.MaterialTextView
@@ -74,13 +72,11 @@
7472
app:layout_constraintTop_toBottomOf="@id/card_view_lottie_animation"
7573
tools:targetApi="26" />
7674

77-
<com.google.android.gms.ads.AdView
75+
<com.d4rk.androidtutorials.java.ads.views.NativeAdBannerView
7876
android:id="@+id/ad_view_bottom"
7977
android:layout_width="match_parent"
8078
android:layout_height="wrap_content"
8179
android:layout_margin="24dp"
82-
app:adSize="FULL_BANNER"
83-
app:adUnitId="@string/ad_banner_unit_id"
8480
app:layout_constraintTop_toBottomOf="@id/button_more" />
8581
</androidx.constraintlayout.widget.ConstraintLayout>
8682
</me.zhanghai.android.fastscroll.FastScrollScrollView>

app/src/main/res/layout/activity_shortcuts.xml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,10 @@
2828
app:layout_constraintStart_toStartOf="parent"
2929
tools:targetApi="26" />
3030

31-
<com.google.android.gms.ads.AdView
31+
<com.d4rk.androidtutorials.java.ads.views.NativeAdBannerView
3232
android:id="@+id/ad_view_bottom"
3333
android:layout_width="match_parent"
3434
android:layout_height="wrap_content"
3535
android:layout_margin="24dp"
36-
app:adSize="FULL_BANNER"
37-
app:adUnitId="@string/ad_banner_unit_id"
3836
app:layout_constraintBottom_toBottomOf="parent" />
3937
</androidx.constraintlayout.widget.ConstraintLayout>

app/src/main/res/layout/activity_shortcuts_build.xml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,11 @@
114114
</androidx.constraintlayout.widget.ConstraintLayout>
115115
</me.zhanghai.android.fastscroll.FastScrollScrollView>
116116

117-
<com.google.android.gms.ads.AdView
117+
<com.d4rk.androidtutorials.java.ads.views.NativeAdBannerView
118118
android:id="@+id/ad_view"
119119
android:layout_width="match_parent"
120120
android:layout_height="wrap_content"
121121
android:layout_margin="24dp"
122-
app:adSize="FULL_BANNER"
123-
app:adUnitId="@string/ad_banner_unit_id"
124122
app:layout_constraintBottom_toBottomOf="parent"
125123
app:layout_constraintEnd_toEndOf="parent"
126124
app:layout_constraintStart_toStartOf="parent" />

app/src/main/res/layout/activity_shortcuts_code.xml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -273,13 +273,11 @@
273273
</androidx.constraintlayout.widget.ConstraintLayout>
274274
</me.zhanghai.android.fastscroll.FastScrollScrollView>
275275

276-
<com.google.android.gms.ads.AdView
276+
<com.d4rk.androidtutorials.java.ads.views.NativeAdBannerView
277277
android:id="@+id/ad_view"
278278
android:layout_width="match_parent"
279279
android:layout_height="wrap_content"
280280
android:layout_margin="24dp"
281-
app:adSize="FULL_BANNER"
282-
app:adUnitId="@string/ad_banner_unit_id"
283281
app:layout_constraintBottom_toBottomOf="parent"
284282
app:layout_constraintEnd_toEndOf="parent"
285283
app:layout_constraintStart_toStartOf="parent" />

0 commit comments

Comments
 (0)