X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Ffree%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Fhelpers%2FAdHelper.kt;fp=app%2Fsrc%2Ffree%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Fhelpers%2FAdHelper.kt;h=a572e938471f245bedab892dcc132341e5b3127e;hp=0000000000000000000000000000000000000000;hb=568ac6354411aa26c42077d2b80f8770f6e64695;hpb=1650cd6eff9ef807a84263328cb73e755250e3af diff --git a/app/src/free/java/com/stoutner/privacybrowser/helpers/AdHelper.kt b/app/src/free/java/com/stoutner/privacybrowser/helpers/AdHelper.kt new file mode 100644 index 00000000..a572e938 --- /dev/null +++ b/app/src/free/java/com/stoutner/privacybrowser/helpers/AdHelper.kt @@ -0,0 +1,176 @@ +/* + * Copyright © 2016-2021 Soren Stoutner . + * + * This file is part of Privacy Browser . + * + * Privacy Browser is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Privacy Browser is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Privacy Browser. If not, see . + */ + +package com.stoutner.privacybrowser.helpers + +import android.app.Activity +import android.content.Context +import android.os.Bundle +import android.util.DisplayMetrics +import android.view.View +import android.widget.RelativeLayout + +import androidx.fragment.app.FragmentManager + +import com.google.ads.mediation.admob.AdMobAdapter +import com.google.android.gms.ads.AdRequest +import com.google.android.gms.ads.AdSize +import com.google.android.gms.ads.AdView +import com.google.android.gms.ads.MobileAds + +import com.stoutner.privacybrowser.R +import com.stoutner.privacybrowser.dialogs.AdConsentDialog + +object AdHelper { + // Define the class variables. + private var initialized = false + + // The `@JvmStatic` notation can be removed once all the code has migrated to Kotlin. + @JvmStatic + fun initializeAds(view: View, context: Context, activity: Activity, fragmentManager: FragmentManager, adUnitId: String) { + // Check to see if the ads have been initialized. + if (!initialized) { // This is the first run; the ads have not yet been initialized. + // Initialize mobile ads. + MobileAds.initialize(context) + + // Initialize the bookmarks database helper. + val adConsentDatabaseHelper = AdConsentDatabaseHelper(context) + + // Check to see if consent has been granted. + val adConsentGranted = adConsentDatabaseHelper.isGranted + + // Display the ad consent dialog if needed. + if (!adConsentGranted) { // Ad consent has not been granted. + // Instantiate the ad consent dialog. + val adConsentDialogFragment = AdConsentDialog() + + // Display the ad consent dialog. + adConsentDialogFragment.show(fragmentManager,"Ad Consent") + } else { // Ad consent has already been granted. + // Load an ad. + loadAd(view, context, activity, adUnitId) + } + + // Set the initialized variable to true so this section doesn't run again. + initialized = true + } else { // Ads have previously been initialized. + // Load an ad. + loadAd(view, context, activity, adUnitId) + } + } + + // The `@JvmStatic` notation can be removed once all the code has migrated to Kotlin. + @JvmStatic + fun loadAd(view: View, context: Context, activity: Activity, adUnitId: String) { + // Cast the generic view to an AdView. + var adView = view as AdView + + // Save the layout parameters. They are used when programatically recreating the ad below. + val adViewLayoutParameters = adView.layoutParams as RelativeLayout.LayoutParams + + // Get a handle for the ad view parent. + val adViewParentLayout = adView.parent as RelativeLayout + + // Remove the AdView. + adViewParentLayout.removeView(adView) + + // Create a new AdView. This is necessary because the size can change when the device is rotated. + adView = AdView(context) + + // Set the ad unit ID. + adView.adUnitId = adUnitId + + // Set the view ID. + adView.id = R.id.adview + + // Set the layout parameters. + adView.layoutParams = adViewLayoutParameters + + // Add the new ad view to the parent layout. + adViewParentLayout.addView(adView) + + // Get a handle for the display. Once the minimum API >= 30, this should be changed to `context.getDisplay()`. + @Suppress("DEPRECATION") val display = activity.windowManager.defaultDisplay + + // Initialize a display metrics. + val displayMetrics = DisplayMetrics() + + // Get the display metrics from the display. Once the minimum APO >= 30, this should be replaced with `WindowMetrics.getBounds()` and `Configuration.densityDpi`. + @Suppress("DEPRECATION") + display.getMetrics(displayMetrics) + + // Get the width pixels and the density. + val widthPixels = displayMetrics.widthPixels.toFloat() + val density = displayMetrics.density + + // Calculate the ad width. + val adWidth = (widthPixels / density).toInt() + + // Get the ad size. + val adSize = AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(context, adWidth) + + // Set the ad size on the adView. + adView.adSize = adSize + + // Create an ad settings bundle. + val adSettingsBundle = Bundle() + + // Only request non-personalized ads. + adSettingsBundle.putString("npa", "1") + + // Build the ad request. + val adRequest = AdRequest.Builder().addNetworkExtrasBundle(AdMobAdapter::class.java, adSettingsBundle).build() + + // Make it so. + adView.loadAd(adRequest) + } + + // The `@JvmStatic` notation can be removed once all the code has migrated to Kotlin. + // This method exists here for the sake of consistency with the following two methods. + @JvmStatic + fun hideAd(view: View) { + // Cast the generic view to an AdView. + val adView = view as AdView + + // Hide the ad. + adView.visibility = View.GONE + } + + // The `@JvmStatic` notation can be removed once all the code has migrated to Kotlin. + // This method exists here so that the main WebView activity doesn't need to import `com.google.android.gms.ads.AdView`. + @JvmStatic + fun pauseAd(view: View) { + // Cast The generic view to an AdView. + val adView = view as AdView + + // Pause the AdView. + adView.pause() + } + + // The `@JvmStatic` notation can be removed once all the code has migrated to Kotlin. + // This method exists here so that the main WebView activity doesn't need to import `com.google.android.gms.ads.AdView`. + @JvmStatic + fun resumeAd(view: View) { + // Cast the generic view to an AdView. + val adView = view as AdView + + // Resume the AdView. + adView.resume() + } +} \ No newline at end of file