Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /