diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..ae388c2 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..2b8a50f --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0ad17cb --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..aae3dfa --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,63 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' + id 'com.google.gms.google-services' +} + +android { + namespace 'com.example.admoballadsimplementation' + compileSdk 34 + + defaultConfig { + applicationId "com.example.admoballadsimplementation" + minSdk 24 + targetSdk 34 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = '17' + } + buildFeatures { + viewBinding = true + } +} + +dependencies { + + implementation 'androidx.core:core-ktx:1.12.0' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.10.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + + //Navigation + implementation ("androidx.navigation:navigation-fragment-ktx:2.7.4") + implementation ("androidx.navigation:navigation-ui-ktx:2.7.4") + + //adMob Dependency + implementation ("com.google.android.gms:play-services-ads:22.4.0") + + //SDP + implementation ("com.intuit.sdp:sdp-android:1.1.0") + + //SSP + implementation ("com.intuit.ssp:ssp-android:1.1.0") + + +} \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..014c31e --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "196483348977", + "project_id": "dummy-1873e", + "storage_bucket": "dummy-1873e.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:196483348977:android:161a1117afbd14e6f0ec50", + "android_client_info": { + "package_name": "com.example.admoballadsimplementation" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyD8tooKbip5afJtKqAanJ58NMu_g6jEoT8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..3617731 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/admoballadsimplementation/adapters/AdsAdapter.kt b/app/src/main/java/com/example/admoballadsimplementation/adapters/AdsAdapter.kt new file mode 100644 index 0000000..a82997f --- /dev/null +++ b/app/src/main/java/com/example/admoballadsimplementation/adapters/AdsAdapter.kt @@ -0,0 +1,50 @@ +package com.example.admoballadsimplementation.adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.admoballadsimplementation.databinding.RvAdmobBinding +import com.example.admoballadsimplementation.models.AdModel + +class AdsAdapter : + RecyclerView.Adapter() { + private var listener: OnClickListener? = null + private var mainList: List = ArrayList() + override fun onCreateViewHolder(parent: ViewGroup , viewType: Int): AdsViewHolder { + val binding = RvAdmobBinding.inflate(LayoutInflater.from(parent.context) , parent , false) + return AdsViewHolder(binding) + } + + override fun onBindViewHolder(holder: AdsViewHolder, position: Int) { + holder.bind(mainList[position]) + holder.cdMain.setOnClickListener { listener?.onItemClick(position) } + } + + override fun getItemCount(): Int { + return mainList.size + } + + inner class AdsViewHolder(private val binding: RvAdmobBinding) : + RecyclerView.ViewHolder(binding.root) { + val cdMain = binding.cdMain + + + fun bind(item: AdModel) { + binding.adType.text = item.name + } + } + + interface OnClickListener { + fun onItemClick(position: Int) + } + + fun setOnClickListener(listener: OnClickListener) { + this.listener = listener + } + + fun submitList(list: List) + { + this.mainList = list + notifyDataSetChanged() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/admoballadsimplementation/application/AdsApplication.kt b/app/src/main/java/com/example/admoballadsimplementation/application/AdsApplication.kt new file mode 100644 index 0000000..f1f6d63 --- /dev/null +++ b/app/src/main/java/com/example/admoballadsimplementation/application/AdsApplication.kt @@ -0,0 +1,14 @@ +package com.example.admoballadsimplementation.application + +import android.app.Application +import com.google.android.gms.ads.MobileAds + + +class AdsApplication: Application() { + override fun onCreate() { + super.onCreate() + MobileAds.initialize( + this + ) { } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/admoballadsimplementation/data/AdsViewModel.kt b/app/src/main/java/com/example/admoballadsimplementation/data/AdsViewModel.kt new file mode 100644 index 0000000..edaa410 --- /dev/null +++ b/app/src/main/java/com/example/admoballadsimplementation/data/AdsViewModel.kt @@ -0,0 +1,26 @@ +package com.example.admoballadsimplementation.data + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.example.admoballadsimplementation.models.AdModel + + +open class AdsViewModel : ViewModel() { + + fun returnArrayList(): MutableLiveData?> { + val list = ArrayList() + list.add(AdModel("Rewarded")) + list.add(AdModel("Small Native")) + list.add(AdModel("Large Native")) + list.add(AdModel("Banner")) + list.add(AdModel("Interstitial")) + + val arrayList: MutableLiveData?> = MutableLiveData?>() + arrayList.value = list + return arrayList + } + + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/admoballadsimplementation/listeners/AllAdsInterface.kt b/app/src/main/java/com/example/admoballadsimplementation/listeners/AllAdsInterface.kt new file mode 100644 index 0000000..3e692a0 --- /dev/null +++ b/app/src/main/java/com/example/admoballadsimplementation/listeners/AllAdsInterface.kt @@ -0,0 +1,25 @@ +package com.example.admoballadsimplementation.listeners + +import android.app.Activity +import android.widget.FrameLayout +import com.google.android.gms.ads.AdSize +import com.google.android.gms.ads.AdView +import com.google.android.gms.ads.nativead.NativeAd +import com.google.android.gms.ads.nativead.NativeAdView + +interface AllAdsInterface { + fun setBannerAds(layout: FrameLayout , adView: AdView , context: Activity) + fun getAdSize(activity: Activity): AdSize? + fun loadBanner(activity: Activity , adView: AdView) + fun loadRewardedAds(context: Activity) + fun showRewardAds(activity: Activity) + fun loadInterstitialAd(context: Activity) + fun showInterstitialAd(context: Activity) + fun populateNativeAdView(nativeAd: NativeAd , adView: NativeAdView) + fun showSmallNativeAd(activity: Activity? , frameLayout: FrameLayout) + fun showLargeNativeAd(activity: Activity? , frameLayout: FrameLayout) + fun showSmallNativeAdDialog(activity: Activity) + fun showLargeNativeAdDialog(activity: Activity) + + fun showToast(context: Activity, message: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/admoballadsimplementation/models/AdModel.kt b/app/src/main/java/com/example/admoballadsimplementation/models/AdModel.kt new file mode 100644 index 0000000..0dac3b4 --- /dev/null +++ b/app/src/main/java/com/example/admoballadsimplementation/models/AdModel.kt @@ -0,0 +1,3 @@ +package com.example.admoballadsimplementation.models + +data class AdModel(val name: String) \ No newline at end of file diff --git a/app/src/main/java/com/example/admoballadsimplementation/ui/activities/MainActivity.kt b/app/src/main/java/com/example/admoballadsimplementation/ui/activities/MainActivity.kt new file mode 100644 index 0000000..bf050d7 --- /dev/null +++ b/app/src/main/java/com/example/admoballadsimplementation/ui/activities/MainActivity.kt @@ -0,0 +1,12 @@ +package com.example.admoballadsimplementation.ui.activities + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.example.admoballadsimplementation.R + +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/admoballadsimplementation/ui/fragments/Home.kt b/app/src/main/java/com/example/admoballadsimplementation/ui/fragments/Home.kt new file mode 100644 index 0000000..4c91c2b --- /dev/null +++ b/app/src/main/java/com/example/admoballadsimplementation/ui/fragments/Home.kt @@ -0,0 +1,107 @@ +package com.example.admoballadsimplementation.ui.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import androidx.lifecycle.ViewModelProvider +import com.example.admoballadsimplementation.R +import com.example.admoballadsimplementation.adapters.AdsAdapter +import com.example.admoballadsimplementation.data.AdsViewModel +import com.example.admoballadsimplementation.databinding.FragmentHomeBinding +import com.example.admoballadsimplementation.listeners.AllAdsInterface +import com.example.admoballadsimplementation.utils.AllAdsImplementer +import com.example.admoballadsimplementation.utils.Constants +import com.google.android.gms.ads.AdView + + +class Home : Fragment(), AllAdsInterface by AllAdsImplementer() { + private var _binding: FragmentHomeBinding? = null + private val binding get() = _binding!! + private lateinit var adapter: AdsAdapter + private val viewModel: AdsViewModel by activityViewModels() + private var adView: AdView? = null + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentHomeBinding.inflate(inflater, container, false) + + adapter = AdsAdapter() + binding.rvAdsType.adapter = adapter + + viewModel.returnArrayList().observe(viewLifecycleOwner) { adList -> + if (adList != null) { + adapter.submitList(adList) + } + } + + adView = AdView(requireContext()) + setBannerAds(binding.include.adViewContainer, adView!!, requireActivity()) + loadRewardedAds(requireActivity()) + loadInterstitialAd(requireActivity()) + + adapter.setOnClickListener(listener = object : AdsAdapter.OnClickListener { + override fun onItemClick(position: Int) { + try { + when (position) { + 0 -> { + if (Constants.isAdsAvailable) { + showRewardAds(requireActivity()) + } else { + showToast( + requireActivity(), + getString(R.string.admob_ads_are_not_loaded_yet) + ) + } + } + + + 1 -> { + showSmallNativeAdDialog(requireActivity()) + } + + 2 -> { + showLargeNativeAdDialog(requireActivity()) + } + + 3 -> { + Toast.makeText( + requireContext(), + getString(R.string.banner_is_implemented_below_you_can_check_it_out), + Toast.LENGTH_SHORT + ).show() + } + + 4 -> { + if (Constants.isAdsAvailable) { + showInterstitialAd(requireActivity()) + } else { + showToast( + requireActivity(), + getString(R.string.admob_ads_are_not_loaded_yet) + ) + } + } + } + + } catch (ex: Exception) { + ex.printStackTrace() + } + } + }) + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/admoballadsimplementation/utils/AllAdsImplementer.kt b/app/src/main/java/com/example/admoballadsimplementation/utils/AllAdsImplementer.kt new file mode 100644 index 0000000..4fea13b --- /dev/null +++ b/app/src/main/java/com/example/admoballadsimplementation/utils/AllAdsImplementer.kt @@ -0,0 +1,337 @@ +package com.example.admoballadsimplementation.utils + +import android.app.Activity +import android.app.AlertDialog +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.util.DisplayMetrics +import android.util.Log +import android.view.Display +import android.view.View +import android.widget.Button +import android.widget.FrameLayout +import android.widget.RatingBar +import android.widget.TextView +import android.widget.Toast +import com.example.admoballadsimplementation.listeners.AllAdsInterface +import com.example.admoballadsimplementation.R +import com.example.admoballadsimplementation.utils.Constants.TAG +import com.example.admoballadsimplementation.utils.Constants.isAdsAvailable +import com.google.android.gms.ads.AdError +import com.google.android.gms.ads.AdListener +import com.google.android.gms.ads.AdLoader +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.FullScreenContentCallback +import com.google.android.gms.ads.LoadAdError +import com.google.android.gms.ads.interstitial.InterstitialAd +import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback +import com.google.android.gms.ads.nativead.MediaView +import com.google.android.gms.ads.nativead.NativeAd +import com.google.android.gms.ads.nativead.NativeAdView +import com.google.android.gms.ads.rewarded.RewardedAd +import com.google.android.gms.ads.rewarded.RewardedAdLoadCallback + + +class AllAdsImplementer: AllAdsInterface { + private var mRewardedAd: RewardedAd? = null + private var mInterstitialAd: InterstitialAd? = null + private val adRequest: AdRequest = AdRequest.Builder().build() + + override fun setBannerAds(layout: FrameLayout , adView: AdView , context: Activity) { + layout.addView(adView) + adView.adUnitId = context.getString(R.string.banner_ad) + loadBanner(context , adView) + } + + + override fun getAdSize(activity: Activity): AdSize { + val display: Display = activity.windowManager.defaultDisplay + val outMetrics = DisplayMetrics() + display.getMetrics(outMetrics) + val widthPixels = outMetrics.widthPixels.toFloat() + val density = outMetrics.density + val adWidth = (widthPixels / density).toInt() + return AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(activity , adWidth) + } + + + override fun loadBanner(activity: Activity , adView: AdView) { + val adRequest: AdRequest = AdRequest.Builder() + .build() + val adSize = getAdSize(activity) + adView.setAdSize(adSize) + adView.loadAd(adRequest) + adView.adListener = object: AdListener() { + override fun onAdClicked() { + } + + override fun onAdClosed() { + } + + override fun onAdFailedToLoad(adError: LoadAdError) { + isAdsAvailable = false + } + + override fun onAdImpression() { + } + + override fun onAdLoaded() { + isAdsAvailable = true + } + + override fun onAdOpened() { + } + } + } + + + override fun loadRewardedAds(context: Activity) { + RewardedAd.load( + context , + context.getString(R.string.reward_ad) , + adRequest, + object : RewardedAdLoadCallback() { + override fun onAdFailedToLoad(loadAdError: LoadAdError) { + super.onAdFailedToLoad(loadAdError) + mRewardedAd = null + } + + override fun onAdLoaded(rewardedAd: RewardedAd) { + super.onAdLoaded(rewardedAd) + mRewardedAd = rewardedAd + rewardedAd.fullScreenContentCallback = object : FullScreenContentCallback() { + override fun onAdDismissedFullScreenContent() { + super.onAdDismissedFullScreenContent() + loadRewardedAds(context) + } + } + } + }) + } + + override fun showRewardAds(activity: Activity) { + if (mRewardedAd != null) { + mRewardedAd!!.show( + activity + ) { rewardItem -> + val amount = rewardItem.amount + val type = rewardItem.type + } + RewardedAd.load( + activity , + activity.getString(R.string.reward_ad) , + adRequest, + object : RewardedAdLoadCallback() { + override fun onAdFailedToLoad(loadAdError: LoadAdError) { + super.onAdFailedToLoad(loadAdError) + mRewardedAd = null + } + + override fun onAdLoaded(rewardedAd: RewardedAd) { + super.onAdLoaded(rewardedAd) + mRewardedAd = rewardedAd + rewardedAd.fullScreenContentCallback = object : FullScreenContentCallback() { + override fun onAdDismissedFullScreenContent() { + super.onAdDismissedFullScreenContent() + loadRewardedAds(activity) + } + } + } + }) + } else { + showToast(activity, activity.getString(R.string.reward_ads_is_not_ready_yet)) + } + } + + override fun loadInterstitialAd(context: Activity) { + val adRequest = AdRequest.Builder().build() + InterstitialAd.load(context , context.getString(R.string.interstitial_ad) , adRequest , + object : InterstitialAdLoadCallback() { + override fun onAdLoaded(interstitialAd: InterstitialAd) { + mInterstitialAd = interstitialAd + Log.i(TAG , "onAdLoaded") + } + + override fun onAdFailedToLoad(loadAdError: LoadAdError) { + Log.d(TAG , loadAdError.toString()) + mInterstitialAd = null + } + }) + } + + + override fun showInterstitialAd(context: Activity) { + if (mInterstitialAd != null) { + mInterstitialAd!!.show(context) + mInterstitialAd!!.fullScreenContentCallback = object : FullScreenContentCallback() { + override fun onAdClicked() { + Log.d(TAG , context.getString(R.string.ad_was_clicked)) + } + + override fun onAdDismissedFullScreenContent() { + Log.d(TAG , context.getString(R.string.ad_dismissed_fullscreen_content)) + loadInterstitialAd(context) + } + + override fun onAdFailedToShowFullScreenContent(adError: AdError) { + Log.e(TAG , context.getString(R.string.ad_failed_to_show_fullscreen_content)) + mInterstitialAd = null + } + + override fun onAdImpression() { + Log.d(TAG , context.getString(R.string.ad_recorded_an_impression)) + } + + override fun onAdShowedFullScreenContent() { + Log.d(TAG , context.getString(R.string.ad_showed_fullscreen_content)) + } + } + } else { + loadInterstitialAd(context) + Log.d("TAG" , context.getString(R.string.the_interstitial_ad_wasn_t_ready_yet)) + } + } + + + override fun populateNativeAdView(nativeAd: NativeAd , adView: NativeAdView) { + adView.mediaView = adView.findViewById(R.id.ad_media) as MediaView + adView.advertiserView = adView.findViewById(R.id.ad_advertiser) + adView.bodyView = adView.findViewById(R.id.ad_body) + adView.callToActionView = adView.findViewById(R.id.ad_call_to_action) + adView.iconView = adView.findViewById(R.id.ad_app_icon) + adView.priceView = adView.findViewById(R.id.ad_price) + adView.starRatingView = adView.findViewById(R.id.ad_stars) + adView.storeView = adView.findViewById(R.id.ad_store) + adView.headlineView = adView.findViewById(R.id.ad_headline) + (adView.headlineView as TextView?)!!.text = nativeAd.headline + (adView.bodyView as TextView?)!!.text = nativeAd.body + (adView.callToActionView as TextView?)!!.text = nativeAd.callToAction + if (nativeAd.icon == null) { + adView.iconView!!.visibility = View.GONE + } else { + adView.iconView!!.background = nativeAd.icon!!.drawable + adView.iconView!!.visibility = View.VISIBLE + } + if (nativeAd.price == null) { + adView.priceView!!.visibility = View.VISIBLE + } else { + (adView.priceView as TextView?)!!.text = nativeAd.price + adView.priceView!!.visibility = View.VISIBLE + } + if (nativeAd.store == null) { + adView.storeView!!.visibility = View.VISIBLE + } else { + (adView.storeView as TextView?)!!.text = nativeAd.store + adView.storeView!!.visibility = View.VISIBLE + } + if (nativeAd.starRating == null) { + adView.starRatingView!!.visibility = View.INVISIBLE + } else { + (adView.starRatingView as RatingBar?)?.rating = nativeAd.starRating!!.toFloat() + adView.starRatingView!!.visibility = View.VISIBLE + } + if (nativeAd.advertiser == null) { + adView.advertiserView!!.visibility = View.INVISIBLE + } else { + (adView.advertiserView as TextView?)!!.text = nativeAd.advertiser + adView.advertiserView!!.visibility = View.VISIBLE + } + adView.setNativeAd(nativeAd) + } + + override fun showSmallNativeAd(activity: Activity? , frameLayout: FrameLayout) { + val adView = activity!!.layoutInflater.inflate(R.layout.native_small, null) as NativeAdView + val builder = AdLoader.Builder(activity , activity.getString(R.string.ad_native)) + .forNativeAd { nativeAd: NativeAd -> + populateNativeAdView(nativeAd , adView) + frameLayout.removeAllViews() + frameLayout.addView(adView) + }.withAdListener(object : AdListener() { + override fun onAdFailedToLoad(loadAdError: LoadAdError) { + super.onAdFailedToLoad(loadAdError) + try { + } catch (e: java.lang.Exception) { + e.printStackTrace() + } + } + }) + builder.build().loadAd(AdRequest.Builder().build()) + } + + override fun showLargeNativeAd(activity: Activity? , frameLayout: FrameLayout) { + val adView = activity!!.layoutInflater.inflate(R.layout.native_large, null) as NativeAdView + val builder = AdLoader.Builder(activity , activity.getString(R.string.ad_native)) + .forNativeAd { nativeAd: NativeAd -> + populateNativeAdView(nativeAd , adView) + frameLayout.removeAllViews() + frameLayout.addView(adView) + }.withAdListener(object : AdListener() { + override fun onAdFailedToLoad(loadAdError: LoadAdError) { + super.onAdFailedToLoad(loadAdError) + try { + } catch (e: java.lang.Exception) { + e.printStackTrace() + } + } + }) + builder.build().loadAd(AdRequest.Builder().build()) + } + + + override fun showSmallNativeAdDialog(activity: Activity) + { + val dialogBuilder: AlertDialog.Builder = + AlertDialog.Builder(activity) + val inflater = activity.layoutInflater + val dialogView: View = inflater.inflate(R.layout.native_small_dialog, null , false) + dialogBuilder.setView(dialogView) + val nativeAd: FrameLayout = dialogView.findViewById(R.id.fl_adplaceholder) + showSmallNativeAd(activity,nativeAd) + val btnYes: Button = dialogView.findViewById(R.id.btnYes) + val alertDialog: AlertDialog? = dialogBuilder.create() + if (alertDialog != null) { + alertDialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + } + if (alertDialog != null) { + alertDialog.window?.attributes?.windowAnimations = + R.style.DialogAnimation + } + alertDialog?.show() + + btnYes.setOnClickListener { + alertDialog!!.dismiss() + } + } + + override fun showLargeNativeAdDialog(activity: Activity) + { + val dialogBuilder: AlertDialog.Builder = + AlertDialog.Builder(activity) + val inflater = activity.layoutInflater + val dialogView: View = inflater.inflate(R.layout.native_large_dialog, null , false) + dialogBuilder.setView(dialogView) + val nativeAd: FrameLayout = dialogView.findViewById(R.id.fl_adplaceholder) + showSmallNativeAd(activity,nativeAd) + val btnYes: Button = dialogView.findViewById(R.id.btnYes) + val alertDialog: AlertDialog? = dialogBuilder.create() + if (alertDialog != null) { + alertDialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + } + if (alertDialog != null) { + alertDialog.window?.attributes?.windowAnimations = + R.style.DialogAnimation + } + alertDialog?.show() + + btnYes.setOnClickListener { + alertDialog!!.dismiss() + } + } + + override fun showToast(context: Activity, message: String) + { + Toast.makeText(context, message, Toast.LENGTH_SHORT).show() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/admoballadsimplementation/utils/Constants.kt b/app/src/main/java/com/example/admoballadsimplementation/utils/Constants.kt new file mode 100644 index 0000000..6e644f7 --- /dev/null +++ b/app/src/main/java/com/example/admoballadsimplementation/utils/Constants.kt @@ -0,0 +1,6 @@ +package com.example.admoballadsimplementation.utils + +object Constants { + val TAG = "AdsTAG" + var isAdsAvailable: Boolean = false +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/baseline_arrow_forward_ios_24.xml b/app/src/main/res/drawable/baseline_arrow_forward_ios_24.xml new file mode 100644 index 0000000..243b1b3 --- /dev/null +++ b/app/src/main/res/drawable/baseline_arrow_forward_ios_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/dialog_round.xml b/app/src/main/res/drawable/dialog_round.xml new file mode 100644 index 0000000..a8ec15d --- /dev/null +++ b/app/src/main/res/drawable/dialog_round.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..2159ef6 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/banner_layout.xml b/app/src/main/res/layout/banner_layout.xml new file mode 100644 index 0000000..20ea36d --- /dev/null +++ b/app/src/main/res/layout/banner_layout.xml @@ -0,0 +1,19 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..278e744 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/native_large.xml b/app/src/main/res/layout/native_large.xml new file mode 100644 index 0000000..9e67b67 --- /dev/null +++ b/app/src/main/res/layout/native_large.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +