diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ads/managers/AppOpenAd.java b/app/src/main/java/com/d4rk/androidtutorials/java/ads/managers/AppOpenAd.java index 53edf4ee..3bd4effe 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ads/managers/AppOpenAd.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ads/managers/AppOpenAd.java @@ -5,7 +5,6 @@ import android.app.Application.ActivityLifecycleCallbacks; import android.content.Context; import android.os.Bundle; -import android.webkit.CookieManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -35,8 +34,6 @@ public class AppOpenAd extends Application implements ActivityLifecycleCallbacks public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(this); - AdUtils.initialize(this); - CookieManager.getInstance(); ProcessLifecycleOwner.get().getLifecycle().addObserver(this); appOpenAdManager = new AppOpenAdManager(this); } @@ -98,6 +95,7 @@ public AppOpenAdManager(Application application) { } private void loadAd(Context context) { + AdUtils.initialize(context); if (isLoadingAd || isAdAvailable()) { return; } diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/startup/StartupInitializer.java b/app/src/main/java/com/d4rk/androidtutorials/java/startup/StartupInitializer.java new file mode 100644 index 00000000..f6d63aa8 --- /dev/null +++ b/app/src/main/java/com/d4rk/androidtutorials/java/startup/StartupInitializer.java @@ -0,0 +1,33 @@ +package com.d4rk.androidtutorials.java.startup; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.work.ExistingWorkPolicy; +import androidx.work.OneTimeWorkRequest; +import androidx.work.WorkManager; + +/** + * Helper used to enqueue a one-off background job for initializing ads and + * cookies. The work is only scheduled once per app launch sequence. + */ +public final class StartupInitializer { + + private static final String WORK_NAME = "startup_init"; + + private StartupInitializer() { + // no-op + } + + /** + * Schedules the {@link StartupWorker} using {@link WorkManager}. If the work + * is already enqueued, this call is ignored. + */ + public static void schedule(@NonNull Context context) { + OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder( + StartupWorker.class).build(); + WorkManager.getInstance(context).enqueueUniqueWork( + WORK_NAME, ExistingWorkPolicy.KEEP, workRequest); + } +} + diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/startup/StartupWorker.java b/app/src/main/java/com/d4rk/androidtutorials/java/startup/StartupWorker.java new file mode 100644 index 00000000..575d2c57 --- /dev/null +++ b/app/src/main/java/com/d4rk/androidtutorials/java/startup/StartupWorker.java @@ -0,0 +1,30 @@ +package com.d4rk.androidtutorials.java.startup; + +import android.content.Context; +import android.webkit.CookieManager; + +import androidx.annotation.NonNull; +import androidx.work.Worker; +import androidx.work.WorkerParameters; + +import com.d4rk.androidtutorials.java.ads.AdUtils; + +/** + * Background worker that initializes advertising utilities and the + * {@link CookieManager} away from the app's startup path. + */ +public class StartupWorker extends Worker { + + public StartupWorker(@NonNull Context context, @NonNull WorkerParameters params) { + super(context, params); + } + + @NonNull + @Override + public Result doWork() { + AdUtils.initialize(getApplicationContext()); + CookieManager.getInstance(); + return Result.success(); + } +} + 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 5d551606..5cc7e240 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 @@ -44,6 +44,7 @@ import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate; import com.d4rk.androidtutorials.java.utils.ReviewHelper; import com.d4rk.androidtutorials.java.ads.AdUtils; +import com.d4rk.androidtutorials.java.startup.StartupInitializer; import com.google.android.material.navigation.NavigationBarView; import com.google.android.material.snackbar.Snackbar; import com.google.android.play.core.appupdate.AppUpdateInfo; @@ -112,6 +113,8 @@ protected void onCreate(Bundle savedInstanceState) { 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. diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/startup/StartupActivity.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/startup/StartupActivity.java index 0bc2ccd8..b3c6124f 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/startup/StartupActivity.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/startup/StartupActivity.java @@ -10,6 +10,7 @@ import com.d4rk.androidtutorials.java.databinding.ActivityStartupBinding; import com.d4rk.androidtutorials.java.ui.screens.onboarding.OnboardingActivity; import com.google.android.ump.ConsentRequestParameters; +import com.d4rk.androidtutorials.java.startup.StartupInitializer; import dagger.hilt.android.AndroidEntryPoint; import me.zhanghai.android.fastscroll.FastScrollerBuilder; @@ -25,6 +26,8 @@ protected void onCreate(Bundle savedInstanceState) { ActivityStartupBinding binding = ActivityStartupBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); + StartupInitializer.schedule(this); + viewModel = new ViewModelProvider(this).get(StartupViewModel.class); ConsentRequestParameters params = new ConsentRequestParameters.Builder().build(); viewModel.requestConsentInfoUpdate(this, params,