From 42264b8101f1a13534ca6db5f44a566ede748794 Mon Sep 17 00:00:00 2001 From: Mihai-Cristian Condrea Date: Tue, 16 Sep 2025 11:45:22 +0300 Subject: [PATCH] Resolve FIXMEs and wire startup, consent, and support utilities --- .../repository/DefaultSupportRepository.java | 14 ++++---- .../navigation/BottomSheetMenuFragment.java | 6 ++++ .../java/ui/screens/main/MainActivity.java | 14 ++++++-- .../java/ui/screens/main/MainViewModel.java | 4 +-- .../ui/screens/settings/SettingsActivity.java | 4 +++ .../ui/screens/settings/SettingsFragment.java | 13 ++++++++ .../screens/settings/SettingsViewModel.java | 2 +- .../ui/screens/support/SupportActivity.java | 7 ++-- .../ui/screens/support/SupportViewModel.java | 2 +- .../java/utils/ReviewHelper.java | 2 +- .../res/layout/dialog_bottom_sheet_menu.xml | 33 ++++++++++++++++++- 11 files changed, 83 insertions(+), 18 deletions(-) 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 2c9f240d..a29d7159 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 @@ -127,13 +127,15 @@ public BillingFlowLauncher initiatePurchase(String productId) { } String finalOfferToken = offerToken; + BillingFlowParams.ProductDetailsParams.Builder paramsBuilder = + BillingFlowParams.ProductDetailsParams.newBuilder() + .setProductDetails(details); + if (finalOfferToken != null && !finalOfferToken.isEmpty()) { + paramsBuilder.setOfferToken(finalOfferToken); + } + List productDetailsParamsList = - Collections.singletonList( - BillingFlowParams.ProductDetailsParams.newBuilder() - .setProductDetails(details) - .setOfferToken(finalOfferToken) // FIXME: Argument 'finalOfferToken' might be null - .build() - ); + Collections.singletonList(paramsBuilder.build()); BillingFlowParams flowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/components/navigation/BottomSheetMenuFragment.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/components/navigation/BottomSheetMenuFragment.java index 19b71450..fe5947d6 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/components/navigation/BottomSheetMenuFragment.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/components/navigation/BottomSheetMenuFragment.java @@ -13,6 +13,7 @@ import com.d4rk.androidtutorials.java.R; import com.d4rk.androidtutorials.java.databinding.DialogBottomSheetMenuBinding; import com.d4rk.androidtutorials.java.ui.screens.settings.SettingsActivity; +import com.d4rk.androidtutorials.java.utils.ReviewHelper; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; public class BottomSheetMenuFragment extends BottomSheetDialogFragment { @@ -52,6 +53,11 @@ public View onCreateView(@NonNull LayoutInflater inflater, dismiss(); }); + binding.menuRate.setOnClickListener(v -> { + ReviewHelper.forceLaunchInAppReview(requireActivity()); + dismiss(); + }); + binding.menuShare.setOnClickListener(v -> { Intent sharingIntent = new Intent(Intent.ACTION_SEND); sharingIntent.setType("text/plain"); diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java index fe40ae70..147b1dfe 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java @@ -104,19 +104,27 @@ protected void onCreate(Bundle savedInstanceState) { } } ); + mainViewModel = new ViewModelProvider(this).get(MainViewModel.class); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - if (!prefs.getBoolean(getString(R.string.key_onboarding_complete), false)) { + boolean onboardingComplete = prefs.getBoolean(getString(R.string.key_onboarding_complete), false); + boolean shouldShowStartup = mainViewModel.shouldShowStartupScreen(); + if (!onboardingComplete) { + if (shouldShowStartup) { + mainViewModel.markStartupScreenShown(); + } startActivity(new Intent(this, StartupActivity.class)); finish(); return; } + if (shouldShowStartup) { + mainViewModel.markStartupScreenShown(); + } mBinding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(mBinding.getRoot()); StartupInitializer.schedule(this); - mainViewModel = new ViewModelProvider(this).get(MainViewModel.class); - // Fallback: show the consent form again if required. ConsentInformation consentInformation = UserMessagingPlatform.getConsentInformation(this); if (consentInformation.getConsentStatus() == ConsentInformation.ConsentStatus.REQUIRED) { diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainViewModel.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainViewModel.java index 9e9d10f1..9a14bf8f 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainViewModel.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainViewModel.java @@ -99,14 +99,14 @@ public void applySettings(String[] themeValues, /** * Checks if we need to show the startup screen. */ - public boolean shouldShowStartupScreen() { // FIXME: Method 'shouldShowStartupScreen()' is never used + public boolean shouldShowStartupScreen() { return shouldShowStartupScreenUseCase.invoke(); } /** * Mark startup screen as shown. */ - public void markStartupScreenShown() { // FIXME: Method 'markStartupScreenShown()' is never used + public void markStartupScreenShown() { markStartupScreenShownUseCase.invoke(); } diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsActivity.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsActivity.java index 3002629d..f3c202f8 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsActivity.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsActivity.java @@ -65,6 +65,10 @@ public CharSequence provideSummary(ListPreference preference) { return null; } + public SettingsViewModel getSettingsViewModel() { + return settingsViewModel; + } + @Override protected void onDestroy() { super.onDestroy(); diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsFragment.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsFragment.java index 71d35214..e54b38ab 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsFragment.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsFragment.java @@ -14,6 +14,7 @@ import androidx.preference.ListPreference; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.SwitchPreferenceCompat; import com.d4rk.androidtutorials.java.BuildConfig; import com.d4rk.androidtutorials.java.R; @@ -25,6 +26,8 @@ public class SettingsFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences_settings, rootKey); + SettingsActivity activity = (SettingsActivity) requireActivity(); + SettingsViewModel settingsViewModel = activity.getSettingsViewModel(); ListPreference labelVisibilityMode = findPreference(getString(R.string.key_bottom_navigation_bar_labels)); if (labelVisibilityMode != null) { labelVisibilityMode.setOnPreferenceChangeListener((preference, newValue) -> { @@ -33,6 +36,16 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { return true; }); } + SwitchPreferenceCompat consentAnalyticsPreference = + findPreference(getString(R.string.key_consent_analytics)); + if (consentAnalyticsPreference != null) { + consentAnalyticsPreference.setOnPreferenceChangeListener((preference, newValue) -> { + if (newValue instanceof Boolean && settingsViewModel != null) { + settingsViewModel.setConsentAccepted((Boolean) newValue); + } + return true; + }); + } ListPreference defaultTab = findPreference(getString(R.string.key_default_tab)); if (defaultTab != null) { defaultTab.setOnPreferenceChangeListener((preference, newValue) -> { diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsViewModel.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsViewModel.java index d72f60c9..c450a98d 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsViewModel.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsViewModel.java @@ -70,7 +70,7 @@ public String getDarkMode() { return getDarkModeUseCase.invoke(); } - public void setConsentAccepted(boolean accepted) { // FIXME: Method 'setConsentAccepted(boolean)' is never used + public void setConsentAccepted(boolean accepted) { setConsentAcceptedUseCase.invoke(accepted); } } \ No newline at end of file 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 b3a88100..0de20f93 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 @@ -7,10 +7,10 @@ import androidx.lifecycle.ViewModelProvider; import com.android.billingclient.api.ProductDetails; -import com.d4rk.androidtutorials.java.ads.AdUtils; import com.d4rk.androidtutorials.java.data.repository.SupportRepository; import com.d4rk.androidtutorials.java.databinding.ActivitySupportBinding; import com.d4rk.androidtutorials.java.ui.components.navigation.BaseActivity; +import com.google.android.gms.ads.AdRequest; import java.util.List; @@ -30,8 +30,9 @@ protected void onCreate(Bundle savedInstanceState) { supportViewModel = new ViewModelProvider(this).get(SupportViewModel.class); - AdUtils.loadBanner(binding.supportNativeAd); - AdUtils.loadBanner(binding.bannerAdView); + AdRequest adRequest = supportViewModel.initMobileAds(); + binding.supportNativeAd.loadAd(adRequest); + binding.bannerAdView.loadAd(adRequest); binding.buttonWebAd.setOnClickListener(v -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://bit.ly/3p8bpjj")))); 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 da5b46d7..f13829d1 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 @@ -47,7 +47,7 @@ public SupportRepository.BillingFlowLauncher initiatePurchase(String productId) return initiatePurchaseUseCase.invoke(productId); } - public AdRequest initMobileAds() { // FIXME: Method 'initMobileAds()' is never used + public AdRequest initMobileAds() { return initMobileAdsUseCase.invoke(); } } \ No newline at end of file diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/utils/ReviewHelper.java b/app/src/main/java/com/d4rk/androidtutorials/java/utils/ReviewHelper.java index bafa9492..53036953 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/utils/ReviewHelper.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/utils/ReviewHelper.java @@ -25,7 +25,7 @@ public static void launchInAppReviewIfEligible(Activity activity, launchReview(activity, onReviewLaunched); } - public static void forceLaunchInAppReview(Activity activity) { // FIXME: Method 'forceLaunchInAppReview(android.app.Activity)' is never used + public static void forceLaunchInAppReview(Activity activity) { launchReview(activity, null); } diff --git a/app/src/main/res/layout/dialog_bottom_sheet_menu.xml b/app/src/main/res/layout/dialog_bottom_sheet_menu.xml index 96c5810a..ddf2841f 100644 --- a/app/src/main/res/layout/dialog_bottom_sheet_menu.xml +++ b/app/src/main/res/layout/dialog_bottom_sheet_menu.xml @@ -114,7 +114,38 @@ - + + + + + + + + + + + +