Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.d4rk.androidtutorials.java.data.model;

import com.google.android.gms.ads.AdRequest;

/** Parameters used to load an ad without exposing view bindings. */
public class AdLoadParams {

/** Callback to handle ad loading without exposing view bindings. */
@FunctionalInterface
public interface AdLoader {
void load(AdRequest request);
}

private final AdLoader adLoader;

public AdLoadParams(AdLoader adLoader) {
this.adLoader = adLoader;
}

public AdLoader getAdLoader() {
return adLoader;
}
}

Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
package com.d4rk.androidtutorials.java.data.repository;

import android.app.Activity;
import com.android.billingclient.api.BillingClient;
import com.android.billingclient.api.BillingFlowParams;
import com.android.billingclient.api.ProductDetails;
import com.d4rk.androidtutorials.java.databinding.ActivitySupportBinding;
import com.d4rk.androidtutorials.java.data.model.AdLoadParams;
import java.util.List;

public interface SupportRepository {
void initBillingClient(Runnable onConnected);
void queryProductDetails(List<String> productIds, OnProductDetailsListener listener);
void initiatePurchase(Activity activity, String productId);
void initMobileAds(ActivitySupportBinding binding);
void initiatePurchase(String productId, BillingFlowLauncher launcher);
void initMobileAds(AdLoadParams params);

interface OnProductDetailsListener {
void onProductDetailsRetrieved(List<ProductDetails> productDetailsList);
}

interface BillingFlowLauncher {
void launch(BillingClient billingClient, BillingFlowParams params);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.d4rk.androidtutorials.java.domain.support;

import com.d4rk.androidtutorials.java.databinding.ActivitySupportBinding;
import com.d4rk.androidtutorials.java.data.model.AdLoadParams;
import com.d4rk.androidtutorials.java.data.repository.SupportRepository;

/** Initializes Google Mobile Ads. */
Expand All @@ -11,7 +11,7 @@ public InitMobileAdsUseCase(SupportRepository repository) {
this.repository = repository;
}

public void invoke(ActivitySupportBinding binding) {
repository.initMobileAds(binding);
public void invoke(AdLoadParams params) {
repository.initMobileAds(params);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.d4rk.androidtutorials.java.domain.support;

import android.app.Activity;
import com.d4rk.androidtutorials.java.data.repository.SupportRepository;

/** Launches billing flow for a product. */
Expand All @@ -11,7 +10,7 @@ public InitiatePurchaseUseCase(SupportRepository repository) {
this.repository = repository;
}

public void invoke(Activity activity, String productId) {
repository.initiatePurchase(activity, productId);
public void invoke(String productId, SupportRepository.BillingFlowLauncher launcher) {
repository.initiatePurchase(productId, launcher);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import androidx.lifecycle.ViewModelProvider;

import com.android.billingclient.api.ProductDetails;
import com.d4rk.androidtutorials.java.data.model.AdLoadParams;
import com.d4rk.androidtutorials.java.databinding.ActivitySupportBinding;
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;

Expand Down Expand Up @@ -41,7 +42,7 @@ protected void onCreate(Bundle savedInstanceState) {

supportViewModel = new ViewModelProvider(this).get(SupportViewModel.class);

supportViewModel.initMobileAds(binding);
supportViewModel.initMobileAds(new AdLoadParams(adRequest -> binding.largeBannerAd.loadAd(adRequest)));

binding.buttonWebAd.setOnClickListener(v ->
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://bit.ly/3p8bpjj"))));
Expand Down Expand Up @@ -72,7 +73,8 @@ private void queryProductDetails() {
}

private void initiatePurchase(String productId) {
supportViewModel.initiatePurchase(this, productId);
supportViewModel.initiatePurchase(productId,
(billingClient, params) -> billingClient.launchBillingFlow(this, params));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package com.d4rk.androidtutorials.java.ui.screens.support;

import android.app.Activity;

import androidx.lifecycle.ViewModel;

import com.d4rk.androidtutorials.java.databinding.ActivitySupportBinding;
import com.d4rk.androidtutorials.java.data.model.AdLoadParams;
import com.d4rk.androidtutorials.java.data.repository.SupportRepository;
import com.d4rk.androidtutorials.java.domain.support.InitBillingClientUseCase;
import com.d4rk.androidtutorials.java.domain.support.QueryProductDetailsUseCase;
import com.d4rk.androidtutorials.java.domain.support.InitiatePurchaseUseCase;
import com.d4rk.androidtutorials.java.domain.support.InitMobileAdsUseCase;
import com.d4rk.androidtutorials.java.ui.screens.support.repository.SupportRepository;

import dagger.hilt.android.lifecycle.HiltViewModel;
import javax.inject.Inject;
Expand Down Expand Up @@ -44,11 +42,11 @@ public void queryProductDetails(List<String> productIds,
queryProductDetailsUseCase.invoke(productIds, listener);
}

public void initiatePurchase(Activity activity, String productId) {
initiatePurchaseUseCase.invoke(activity, productId);
public void initiatePurchase(String productId, SupportRepository.BillingFlowLauncher launcher) {
initiatePurchaseUseCase.invoke(productId, launcher);
}

public void initMobileAds(ActivitySupportBinding binding) {
initMobileAdsUseCase.invoke(binding);
public void initMobileAds(AdLoadParams params) {
initMobileAdsUseCase.invoke(params);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.d4rk.androidtutorials.java.ui.screens.support.repository;

import android.app.Activity;
import android.content.Context;

import androidx.annotation.NonNull;
Expand All @@ -12,7 +11,7 @@
import com.android.billingclient.api.PendingPurchasesParams;
import com.android.billingclient.api.ProductDetails;
import com.android.billingclient.api.QueryProductDetailsParams;
import com.d4rk.androidtutorials.java.databinding.ActivitySupportBinding;
import com.d4rk.androidtutorials.java.data.model.AdLoadParams;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.MobileAds;

Expand Down Expand Up @@ -120,9 +119,9 @@ public void queryProductDetails(List<String> productIds, com.d4rk.androidtutoria
/**
* Launch the billing flow for a particular product.
*/
public void initiatePurchase(Activity activity, String productId) {
public void initiatePurchase(String productId, com.d4rk.androidtutorials.java.data.repository.SupportRepository.BillingFlowLauncher launcher) {
ProductDetails details = productDetailsMap.get(productId);
if (details != null) {
if (details != null && billingClient != null && launcher != null) {
// Note: In a real app, you would select a specific offer. For simplicity,
// we're assuming there's only one or we're using the base plan.
// For subscriptions, this would be ProductDetails.getSubscriptionOfferDetails()
Expand All @@ -144,7 +143,7 @@ public void initiatePurchase(Activity activity, String productId) {
.setProductDetailsParamsList(productDetailsParamsList)
.build();

billingClient.launchBillingFlow(activity, flowParams);
launcher.launch(billingClient, flowParams);
}
}

Expand All @@ -153,9 +152,11 @@ public void initiatePurchase(Activity activity, String productId) {
* Initialize Mobile Ads (usually done once in your app, but
* can be done here if needed for the support screen).
*/
public void initMobileAds(ActivitySupportBinding binding) {
public void initMobileAds(AdLoadParams params) {
MobileAds.initialize(context);
binding.largeBannerAd.loadAd(new AdRequest.Builder().build());
if (params != null && params.getAdLoader() != null) {
params.getAdLoader().load(new AdRequest.Builder().build());
}
}

}