diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/data/model/AdLoadParams.java b/app/src/main/java/com/d4rk/androidtutorials/java/data/model/AdLoadParams.java deleted file mode 100644 index 04c20adc..00000000 --- a/app/src/main/java/com/d4rk/androidtutorials/java/data/model/AdLoadParams.java +++ /dev/null @@ -1,24 +0,0 @@ -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; - } -} - diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/DefaultSupportRepository.java b/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/DefaultSupportRepository.java index e4d7d1f1..10049f98 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/DefaultSupportRepository.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/DefaultSupportRepository.java @@ -11,7 +11,6 @@ import com.android.billingclient.api.PendingPurchasesParams; import com.android.billingclient.api.ProductDetails; import com.android.billingclient.api.QueryProductDetailsParams; -import com.d4rk.androidtutorials.java.data.model.AdLoadParams; import com.d4rk.androidtutorials.java.data.repository.SupportRepository.BillingFlowLauncher; import com.d4rk.androidtutorials.java.data.repository.SupportRepository.OnProductDetailsListener; import com.google.android.gms.ads.AdRequest; @@ -121,23 +120,20 @@ public void queryProductDetails(List productIds, OnProductDetailsListene /** * Launch the billing flow for a particular product. */ - public void initiatePurchase(String productId, BillingFlowLauncher launcher) { + public BillingFlowLauncher initiatePurchase(String productId) { ProductDetails details = productDetailsMap.get(productId); - 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() + if (details != null && billingClient != null) { String offerToken = ""; if (details.getOneTimePurchaseOfferDetails() != null) { offerToken = details.getOneTimePurchaseOfferDetails().getOfferToken(); } - assert offerToken != null; + String finalOfferToken = offerToken; List productDetailsParamsList = Collections.singletonList( BillingFlowParams.ProductDetailsParams.newBuilder() .setProductDetails(details) - .setOfferToken(offerToken) + .setOfferToken(finalOfferToken) .build() ); @@ -145,8 +141,9 @@ public void initiatePurchase(String productId, BillingFlowLauncher launcher) { .setProductDetailsParamsList(productDetailsParamsList) .build(); - launcher.launch(billingClient, flowParams); + return activity -> billingClient.launchBillingFlow(activity, flowParams); } + return null; } @@ -154,11 +151,9 @@ public void initiatePurchase(String productId, BillingFlowLauncher launcher) { * Initialize Mobile Ads (usually done once in your app, but * can be done here if needed for the support screen). */ - public void initMobileAds(AdLoadParams params) { + public AdRequest initMobileAds() { MobileAds.initialize(context); - if (params != null && params.getAdLoader() != null) { - params.getAdLoader().load(new AdRequest.Builder().build()); - } + return new AdRequest.Builder().build(); } } \ No newline at end of file diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/SupportRepository.java b/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/SupportRepository.java index 3db5bef9..079d3be4 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/SupportRepository.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/data/repository/SupportRepository.java @@ -1,22 +1,21 @@ package com.d4rk.androidtutorials.java.data.repository; -import com.android.billingclient.api.BillingClient; -import com.android.billingclient.api.BillingFlowParams; +import android.app.Activity; +import com.google.android.gms.ads.AdRequest; import com.android.billingclient.api.ProductDetails; -import com.d4rk.androidtutorials.java.data.model.AdLoadParams; import java.util.List; public interface SupportRepository { void initBillingClient(Runnable onConnected); void queryProductDetails(List productIds, OnProductDetailsListener listener); - void initiatePurchase(String productId, BillingFlowLauncher launcher); - void initMobileAds(AdLoadParams params); + BillingFlowLauncher initiatePurchase(String productId); + AdRequest initMobileAds(); interface OnProductDetailsListener { void onProductDetailsRetrieved(List productDetailsList); } interface BillingFlowLauncher { - void launch(BillingClient billingClient, BillingFlowParams params); + void launch(Activity activity); } } diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/domain/support/InitMobileAdsUseCase.java b/app/src/main/java/com/d4rk/androidtutorials/java/domain/support/InitMobileAdsUseCase.java index 135b5ed7..86d91d4a 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/domain/support/InitMobileAdsUseCase.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/domain/support/InitMobileAdsUseCase.java @@ -1,7 +1,7 @@ package com.d4rk.androidtutorials.java.domain.support; -import com.d4rk.androidtutorials.java.data.model.AdLoadParams; import com.d4rk.androidtutorials.java.data.repository.SupportRepository; +import com.google.android.gms.ads.AdRequest; /** Initializes Google Mobile Ads. */ public class InitMobileAdsUseCase { @@ -11,7 +11,7 @@ public InitMobileAdsUseCase(SupportRepository repository) { this.repository = repository; } - public void invoke(AdLoadParams params) { - repository.initMobileAds(params); + public AdRequest invoke() { + return repository.initMobileAds(); } } diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/domain/support/InitiatePurchaseUseCase.java b/app/src/main/java/com/d4rk/androidtutorials/java/domain/support/InitiatePurchaseUseCase.java index 15070c5b..dd232b1f 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/domain/support/InitiatePurchaseUseCase.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/domain/support/InitiatePurchaseUseCase.java @@ -10,7 +10,7 @@ public InitiatePurchaseUseCase(SupportRepository repository) { this.repository = repository; } - public void invoke(String productId, SupportRepository.BillingFlowLauncher launcher) { - repository.initiatePurchase(productId, launcher); + public SupportRepository.BillingFlowLauncher invoke(String productId) { + return repository.initiatePurchase(productId); } } diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/SupportActivity.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/SupportActivity.java index 6de42255..7b868013 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/SupportActivity.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/SupportActivity.java @@ -11,9 +11,10 @@ import androidx.lifecycle.ViewModelProvider; import com.android.billingclient.api.ProductDetails; -import com.d4rk.androidtutorials.java.data.model.AdLoadParams; +import com.d4rk.androidtutorials.java.data.repository.SupportRepository; import com.d4rk.androidtutorials.java.databinding.ActivitySupportBinding; import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate; +import com.google.android.gms.ads.AdRequest; import java.util.List; @@ -42,7 +43,8 @@ protected void onCreate(Bundle savedInstanceState) { supportViewModel = new ViewModelProvider(this).get(SupportViewModel.class); - supportViewModel.initMobileAds(new AdLoadParams(adRequest -> binding.largeBannerAd.loadAd(adRequest))); + AdRequest adRequest = supportViewModel.initMobileAds(); + binding.largeBannerAd.loadAd(adRequest); binding.buttonWebAd.setOnClickListener(v -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://bit.ly/3p8bpjj")))); @@ -73,8 +75,10 @@ private void queryProductDetails() { } private void initiatePurchase(String productId) { - supportViewModel.initiatePurchase(productId, - (billingClient, params) -> billingClient.launchBillingFlow(this, params)); + SupportRepository.BillingFlowLauncher launcher = supportViewModel.initiatePurchase(productId); + if (launcher != null) { + launcher.launch(this); + } } @Override diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/SupportViewModel.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/SupportViewModel.java index 7d2e99f2..47854c38 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/SupportViewModel.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/SupportViewModel.java @@ -2,12 +2,12 @@ import androidx.lifecycle.ViewModel; -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.google.android.gms.ads.AdRequest; import dagger.hilt.android.lifecycle.HiltViewModel; import javax.inject.Inject; @@ -42,11 +42,11 @@ public void queryProductDetails(List productIds, queryProductDetailsUseCase.invoke(productIds, listener); } - public void initiatePurchase(String productId, SupportRepository.BillingFlowLauncher launcher) { - initiatePurchaseUseCase.invoke(productId, launcher); + public SupportRepository.BillingFlowLauncher initiatePurchase(String productId) { + return initiatePurchaseUseCase.invoke(productId); } - public void initMobileAds(AdLoadParams params) { - initMobileAdsUseCase.invoke(params); + public AdRequest initMobileAds() { + return initMobileAdsUseCase.invoke(); } } \ No newline at end of file