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 b499dd9

Browse files
Merge pull request #133 from MihaiCristianCondrea/codex/modify-native-ads-to-match-layout
feat: refine native ads and promote randomized ad
2 parents 9c97d37 + 0cbfe19 commit b499dd9

File tree

4 files changed

+99
-2
lines changed

4 files changed

+99
-2
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: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@
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

1718
import me.zhanghai.android.fastscroll.FastScrollerBuilder;
1819

1920
import com.bumptech.glide.Glide;
2021
import dagger.hilt.android.AndroidEntryPoint;
22+
import com.d4rk.androidtutorials.java.data.model.PromotedApp;
2123

2224
@AndroidEntryPoint
2325
public class HomeFragment extends Fragment {
@@ -51,7 +53,13 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
5153
binding.scrollView.clearFocus();
5254
promotedContainer.clearFocus();
5355
promotedContainer.removeAllViews();
54-
for (com.d4rk.androidtutorials.java.data.model.PromotedApp app : state.promotedApps()) {
56+
java.util.List<PromotedApp> apps = state.promotedApps();
57+
int adPosition = new java.util.Random().nextInt(apps.size() + 1);
58+
for (int i = 0; i < apps.size(); i++) {
59+
if (i == adPosition) {
60+
addPromotedAd(promotedContainer);
61+
}
62+
PromotedApp app = apps.get(i);
5563
com.d4rk.androidtutorials.java.databinding.PromotedAppItemBinding itemBinding =
5664
com.d4rk.androidtutorials.java.databinding.PromotedAppItemBinding.inflate(inflater, promotedContainer, false);
5765
loadImage(app.iconUrl(), itemBinding.appIcon);
@@ -61,6 +69,9 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
6169
itemBinding.shareButton.setOnClickListener(v -> shareApp(app));
6270
promotedContainer.addView(itemBinding.getRoot());
6371
}
72+
if (adPosition == apps.size()) {
73+
addPromotedAd(promotedContainer);
74+
}
6475
});
6576
new FastScrollerBuilder(binding.scrollView)
6677
.useMd2Style()
@@ -109,4 +120,17 @@ private void loadImage(String url, android.widget.ImageView imageView) {
109120
.centerInside()
110121
.into(imageView);
111122
}
123+
124+
private void addPromotedAd(ViewGroup container) {
125+
android.widget.FrameLayout adContainer = new android.widget.FrameLayout(requireContext());
126+
ViewGroup.MarginLayoutParams params = new ViewGroup.MarginLayoutParams(dpToPx(160), dpToPx(180));
127+
params.setMarginEnd(dpToPx(8));
128+
adContainer.setLayoutParams(params);
129+
NativeAdLoader.load(requireContext(), adContainer, com.d4rk.androidtutorials.java.R.layout.promoted_native_ad);
130+
container.addView(adContainer);
131+
}
132+
133+
private int dpToPx(int dp) {
134+
return Math.round(dp * requireContext().getResources().getDisplayMetrics().density);
135+
}
112136
}

‎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 によって変換されたページ (->オリジナル) /