Skip to content

Commit 7f128d4

Browse files
feat: refine native ads and promote randomized ad
1 parent 9c97d37 commit 7f128d4

File tree

4 files changed

+101
-6
lines changed

4 files changed

+101
-6
lines changed

app/src/main/java/com/d4rk/androidtutorials/java/ads/managers/NativeAdLoader.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import android.widget.TextView;
1010

1111
import androidx.annotation.NonNull;
12+
import androidx.annotation.LayoutRes;
1213

1314
import com.d4rk.androidtutorials.java.R;
1415
import com.google.android.gms.ads.AdLoader;
@@ -23,10 +24,20 @@
2324
public class NativeAdLoader {
2425

2526
public static void load(@NonNull Context context, @NonNull ViewGroup container) {
27+
load(context, container, R.layout.native_ad);
28+
}
29+
30+
public static void load(@NonNull Context context, @NonNull ViewGroup container, @LayoutRes int layoutRes) {
2631
AdLoader adLoader = new AdLoader.Builder(context, context.getString(R.string.native_ad_banner_unit_id))
2732
.forNativeAd(nativeAd -> {
2833
LayoutInflater inflater = LayoutInflater.from(context);
29-
NativeAdView adView = (NativeAdView) inflater.inflate(R.layout.native_ad, container, false);
34+
NativeAdView adView = (NativeAdView) inflater.inflate(layoutRes, container, false);
35+
adView.setLayoutParams(new ViewGroup.LayoutParams(
36+
ViewGroup.LayoutParams.MATCH_PARENT,
37+
ViewGroup.LayoutParams.WRAP_CONTENT));
38+
adView.setPadding(container.getPaddingLeft(), container.getPaddingTop(),
39+
container.getPaddingRight(), container.getPaddingBottom());
40+
container.setPadding(0, 0, 0, 0);
3041
populateNativeAdView(nativeAd, adView);
3142
container.removeAllViews();
3243
container.addView(adView);

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/home/HomeFragment.java

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import androidx.lifecycle.ViewModelProvider;
1212

1313
import com.d4rk.androidtutorials.java.databinding.FragmentHomeBinding;
14+
import com.d4rk.androidtutorials.java.ads.managers.NativeAdLoader;
1415
import com.google.android.gms.ads.AdRequest;
1516
import com.google.android.gms.ads.MobileAds;
1617

@@ -51,16 +52,24 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
5152
binding.scrollView.clearFocus();
5253
promotedContainer.clearFocus();
5354
promotedContainer.removeAllViews();
54-
for (com.d4rk.androidtutorials.java.data.model.PromotedApp app : state.promotedApps()) {
55+
java.util.List<com.d4rk.androidtutorials.java.data.model.PromotedApp> apps = state.promotedApps();
56+
int adPosition = new java.util.Random().nextInt(apps.size() + 1);
57+
for (int i = 0; i < apps.size(); i++) {
58+
if (i == adPosition) {
59+
addPromotedAd(promotedContainer);
60+
}
5561
com.d4rk.androidtutorials.java.databinding.PromotedAppItemBinding itemBinding =
5662
com.d4rk.androidtutorials.java.databinding.PromotedAppItemBinding.inflate(inflater, promotedContainer, false);
57-
loadImage(app.iconUrl(), itemBinding.appIcon);
58-
itemBinding.appName.setText(app.name());
63+
loadImage(apps.get(i).iconUrl(), itemBinding.appIcon);
64+
itemBinding.appName.setText(apps.get(i).name());
5965
itemBinding.appDescription.setVisibility(android.view.View.GONE);
60-
itemBinding.appButton.setOnClickListener(v -> startActivity(homeViewModel.getPromotedAppIntent(app.packageName())));
61-
itemBinding.shareButton.setOnClickListener(v -> shareApp(app));
66+
itemBinding.appButton.setOnClickListener(v -> startActivity(homeViewModel.getPromotedAppIntent(apps.get(i).packageName())));
67+
itemBinding.shareButton.setOnClickListener(v -> shareApp(apps.get(i)));
6268
promotedContainer.addView(itemBinding.getRoot());
6369
}
70+
if (adPosition == apps.size()) {
71+
addPromotedAd(promotedContainer);
72+
}
6473
});
6574
new FastScrollerBuilder(binding.scrollView)
6675
.useMd2Style()
@@ -109,4 +118,17 @@ private void loadImage(String url, android.widget.ImageView imageView) {
109118
.centerInside()
110119
.into(imageView);
111120
}
121+
122+
private void addPromotedAd(ViewGroup container) {
123+
android.widget.FrameLayout adContainer = new android.widget.FrameLayout(requireContext());
124+
ViewGroup.MarginLayoutParams params = new ViewGroup.MarginLayoutParams(dpToPx(160), dpToPx(180));
125+
params.setMarginEnd(dpToPx(8));
126+
adContainer.setLayoutParams(params);
127+
NativeAdLoader.load(requireContext(), adContainer, com.d4rk.androidtutorials.java.R.layout.promoted_native_ad);
128+
container.addView(adContainer);
129+
}
130+
131+
private int dpToPx(int dp) {
132+
return Math.round(dp * requireContext().getResources().getDisplayMetrics().density);
133+
}
112134
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
<com.google.android.material.card.MaterialCardView
88
android:layout_width="match_parent"
99
android:layout_height="wrap_content"
10+
android:layout_margin="16dp"
11+
style="@style/Widget.Material3.CardView.Filled"
1012
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.CardView">
1113

1214
<LinearLayout
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<com.google.android.gms.ads.nativead.NativeAdView xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
android:layout_width="160dp"
5+
android:layout_height="180dp"
6+
android:layout_marginEnd="8dp">
7+
8+
<com.google.android.material.card.MaterialCardView
9+
style="@style/Widget.Material3.CardView.Filled"
10+
android:layout_width="match_parent"
11+
android:layout_height="match_parent"
12+
app:cardCornerRadius="24dp">
13+
14+
<androidx.constraintlayout.widget.ConstraintLayout
15+
android:layout_width="match_parent"
16+
android:layout_height="match_parent"
17+
android:padding="8dp">
18+
19+
<androidx.appcompat.widget.AppCompatImageView
20+
android:id="@+id/ad_app_icon"
21+
android:layout_width="48dp"
22+
android:layout_height="48dp"
23+
app:layout_constraintTop_toTopOf="parent"
24+
app:layout_constraintStart_toStartOf="parent"
25+
app:layout_constraintEnd_toEndOf="parent" />
26+
27+
<com.google.android.material.textview.MaterialTextView
28+
android:id="@+id/ad_headline"
29+
android:layout_width="0dp"
30+
android:layout_height="wrap_content"
31+
android:layout_marginTop="8dp"
32+
android:maxLines="2"
33+
android:ellipsize="end"
34+
android:textAppearance="@style/TextAppearance.Material3.BodyMedium"
35+
app:layout_constraintTop_toBottomOf="@id/ad_app_icon"
36+
app:layout_constraintStart_toStartOf="parent"
37+
app:layout_constraintEnd_toEndOf="parent" />
38+
39+
<com.google.android.material.textview.MaterialTextView
40+
android:id="@+id/ad_body"
41+
android:layout_width="0dp"
42+
android:layout_height="wrap_content"
43+
android:textAppearance="@style/TextAppearance.Material3.BodySmall"
44+
app:layout_constraintTop_toBottomOf="@id/ad_headline"
45+
app:layout_constraintStart_toStartOf="parent"
46+
app:layout_constraintEnd_toEndOf="parent" />
47+
48+
<com.google.android.material.button.MaterialButton
49+
android:id="@+id/ad_call_to_action"
50+
style="@style/Widget.Material3.Button"
51+
android:layout_width="wrap_content"
52+
android:layout_height="wrap_content"
53+
android:layout_marginTop="8dp"
54+
app:layout_constraintTop_toBottomOf="@id/ad_body"
55+
app:layout_constraintStart_toStartOf="parent"
56+
app:layout_constraintEnd_toEndOf="parent"
57+
app:layout_constraintBottom_toBottomOf="parent" />
58+
</androidx.constraintlayout.widget.ConstraintLayout>
59+
</com.google.android.material.card.MaterialCardView>
60+
</com.google.android.gms.ads.nativead.NativeAdView>

0 commit comments

Comments
 (0)