From b2aea8a65c149a04b9ee2eed6514aee720b712b3 Mon Sep 17 00:00:00 2001 From: MoNe Date: Sun, 5 May 2024 19:48:08 +0330 Subject: [PATCH] feat: add a workflow to generate release APK using input keys and zones (#31) --- .github/workflows/release-dynamic.yml | 59 +++++++++++++++++++ build.gradle.kts | 14 +++++ sample-kotlin/build.gradle.kts | 10 ++-- .../tapsell/sample/appopen/AppOpenFragment.kt | 59 +++++++++++++++++++ .../sample/appopen/AppOpenViewModel.kt | 57 ++++++++++++++++++ .../ir/tapsell/sample/home/HomeFragment.kt | 3 + .../interstitial/InterstitialFragment.kt | 3 +- .../sample/native/NativeBannerFragment.kt | 3 +- .../tapsell/sample/preroll/PreRollFragment.kt | 3 +- .../sample/rewarded/RewardedVideoFragment.kt | 3 +- .../sample/standard/StandardBannerFragment.kt | 3 +- .../src/main/res/layout/fragment_app_open.xml | 49 +++++++++++++++ .../src/main/res/layout/fragment_home.xml | 13 +++- .../main/res/layout/fragment_interstitial.xml | 10 ++++ .../res/layout/fragment_native_banner.xml | 10 ++++ .../src/main/res/layout/fragment_preroll.xml | 10 ++++ .../res/layout/fragment_rewarded_video.xml | 11 ++++ .../res/layout/fragment_standard_banner.xml | 10 ++++ .../src/main/res/navigation/nav_graph.xml | 9 +++ sample-kotlin/src/main/res/values/dimens.xml | 4 ++ sample-kotlin/src/main/res/values/strings.xml | 2 + scripts/change-app.sh | 28 +++++++++ .../main/java/ir/tapsell/shared/Constants.kt | 1 + 23 files changed, 362 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/release-dynamic.yml create mode 100644 sample-kotlin/src/main/java/ir/tapsell/sample/appopen/AppOpenFragment.kt create mode 100644 sample-kotlin/src/main/java/ir/tapsell/sample/appopen/AppOpenViewModel.kt create mode 100644 sample-kotlin/src/main/res/layout/fragment_app_open.xml create mode 100644 scripts/change-app.sh diff --git a/.github/workflows/release-dynamic.yml b/.github/workflows/release-dynamic.yml new file mode 100644 index 0000000..89321b4 --- /dev/null +++ b/.github/workflows/release-dynamic.yml @@ -0,0 +1,59 @@ +name: Android Dynamic Release +on: + workflow_dispatch: + inputs: + tapsellAppKey: + description: 'Tapsell App Key' + required: true + default: '76798342-99a7-4a5f-bf5a-60a088d5dcfb' + AdmobAppKey: + description: 'Admob App Key' + required: true + default: 'ca-app-pub-3940256099942544~3347511713' + ApplovinAppKey: + description: 'Applovin App Key' + required: true + default: '5WfZLCGTQmDr6Mf7BBEf5blVwrf8VBMJSmwUSq9-1q5bPpCH_OGAWEP2z2lRkmonLgPzG6gbL4DlvUF9frFmt6' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: gradle + + - name: Decode Keystore + env: + # Create `SIGNING_KEY_STORE_BASE64` environment in GitHub secrets and place the base64 encoded value + # of your keystore there. + ENCODED_STRING: ${{ secrets.SIGNING_KEY_STORE_BASE64 }} + SIGNING_KEY_STORE_PATH: ${{ secrets.MYAPP_RELEASE_STORE_FILE }} + + run: | + echo "keystore path: $MYAPP_RELEASE_STORE_FILE" + echo $ENCODED_STRING > keystore-b64.txt + base64 -d keystore-b64.txt > release.keystore + + - name: Build Release apk + env: + SIGNING_KEY_STORE_PATH: ${{ secrets.MYAPP_RELEASE_STORE_FILE }} + SIGNING_KEY_ALIAS: ${{ secrets.MYAPP_RELEASE_KEY_ALIAS }} + SIGNING_KEY_PASSWORD: ${{ secrets.MYAPP_RELEASE_KEY_PASSWORD }} + SIGNING_STORE_PASSWORD: ${{ secrets.MYAPP_RELEASE_STORE_PASSWORD }} + run: | + sh ./scripts/change-app.sh "${{ github.event.inputs.tapsellAppKey }}" "${{ github.event.inputs.AdmobAppKey }}" "${{ github.event.inputs.ApplovinAppKey }}" + ./gradlew sample-kotlin:assembleRelease + + - name: Upload Release Build to Artifacts + uses: actions/upload-artifact@v3 + with: + name: release-artifacts + path: sample-kotlin/build/outputs/apk/release/*universal-release*.apk + \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index b537e95..a4c568b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,4 +3,18 @@ plugins { alias(libs.plugins.androidApplication) apply false alias(libs.plugins.kotlinAndroid) apply false alias(libs.plugins.kotlinJvm) apply false +} + +ext { + set("TAPSELL_APP_ID", TapsellManifestPlaceholders.TAPSELL_APP_ID) + set("TAPSELL_APP_MARKET", TapsellManifestPlaceholders.TAPSELL_MARKET) + set("ADMOB_APP_ID", TapsellManifestPlaceholders.ADMOB_APP_ID) + set("APPLOVIN_APP_ID", TapsellManifestPlaceholders.APPLOVIN_APP_ID) +} + +object TapsellManifestPlaceholders { + const val TAPSELL_APP_ID = "76798342-99a7-4a5f-bf5a-60a088d5dcfb" + const val TAPSELL_MARKET = "CafeBazaar" + const val ADMOB_APP_ID = "ca-app-pub-3940256099942544~3347511713" + const val APPLOVIN_APP_ID = "5WfZLCGTQmDr6Mf7BBEf5blVwrf8VBMJSmwUSq9-1q5bPpCH_OGAWEP2z2lRkmonLgPzG6gbL4DlvUF9frFmt6" } \ No newline at end of file diff --git a/sample-kotlin/build.gradle.kts b/sample-kotlin/build.gradle.kts index 4fc0f05..a715e10 100644 --- a/sample-kotlin/build.gradle.kts +++ b/sample-kotlin/build.gradle.kts @@ -20,11 +20,10 @@ android { addManifestPlaceholders( mapOf( - "TapsellMediationAppMarket" to "CafeBazaar", - "TapsellMediationAppKey" to "76798342-99a7-4a5f-bf5a-60a088d5dcfb", - "TapsellMediationAdmobAdapterSignature" to "ca-app-pub-3940256099942544~3347511713", - "TapsellMediationApplovinAdapterSignature" to - "5WfZLCGTQmDr6Mf7BBEf5blVwrf8VBMJSmwUSq9-1q5bPpCH_OGAWEP2z2lRkmonLgPzG6gbL4DlvUF9frFmt6", + "TapsellMediationAppMarket" to properties["TAPSELL_APP_MARKET"] as String, + "TapsellMediationAppKey" to properties["TAPSELL_APP_ID"] as String, + "TapsellMediationAdmobAdapterSignature" to properties["ADMOB_APP_ID"] as String, + "TapsellMediationApplovinAdapterSignature" to properties["APPLOVIN_APP_ID"] as String, ) ) } @@ -106,3 +105,4 @@ dependencies { androidTestImplementation(libs.espresso.core) debugImplementation(libs.leakcanary) } + diff --git a/sample-kotlin/src/main/java/ir/tapsell/sample/appopen/AppOpenFragment.kt b/sample-kotlin/src/main/java/ir/tapsell/sample/appopen/AppOpenFragment.kt new file mode 100644 index 0000000..a3855d2 --- /dev/null +++ b/sample-kotlin/src/main/java/ir/tapsell/sample/appopen/AppOpenFragment.kt @@ -0,0 +1,59 @@ +package ir.tapsell.sample.appopen + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope +import ir.tapsell.sample.databinding.FragmentInterstitialBinding +import ir.tapsell.shared.AdmobKeys +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +class AppOpenFragment : Fragment() { + + private var _binding: FragmentInterstitialBinding? = null + private val binding get() = _binding!! + private val viewModel by viewModels() + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentInterstitialBinding.inflate(inflater, container, false) + return _binding?.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.inputZone.setText(AdmobKeys.APP_OPEN) + binding.btnRequest.setOnClickListener { + requestAd() + } + binding.btnShow.setOnClickListener { + showAd() + } + + lifecycleScope.launch(Dispatchers.Main) { + viewModel.logMessage.collect { + binding.tvLog.text = it + } + } + } + + private fun requestAd() { + viewModel.requestAd(binding.inputZone.text.toString()) + } + + private fun showAd() { + viewModel.showAd(requireActivity()) + } + + override fun onDestroy() { + super.onDestroy() + _binding = null + } +} diff --git a/sample-kotlin/src/main/java/ir/tapsell/sample/appopen/AppOpenViewModel.kt b/sample-kotlin/src/main/java/ir/tapsell/sample/appopen/AppOpenViewModel.kt new file mode 100644 index 0000000..0b2dd9b --- /dev/null +++ b/sample-kotlin/src/main/java/ir/tapsell/sample/appopen/AppOpenViewModel.kt @@ -0,0 +1,57 @@ +package ir.tapsell.sample.appopen + +import android.util.Log +import androidx.fragment.app.FragmentActivity +import ir.tapsell.mediation.Tapsell +import ir.tapsell.mediation.ad.AdStateListener +import ir.tapsell.mediation.ad.request.RequestResultListener +import ir.tapsell.mediation.ad.show.AdShowCompletionState +import ir.tapsell.sample.BaseViewModel + +class AppOpenViewModel : BaseViewModel() { + + companion object { + private const val TAG = "AppOpenViewModel" + } + + var responseId: String? = null + private set + + + fun requestAd(zoneId: String) { + Tapsell.requestAppOpenAd(zoneId, object : RequestResultListener { + override fun onFailure() { + log(TAG, "onFailure", Log.ERROR) + } + + override fun onSuccess(adId: String) { + responseId = adId + log(TAG, "onSuccess: $adId") + } + }) + } + + fun showAd(activity: FragmentActivity) { + if (responseId.isNullOrEmpty()) { + log(TAG, "adId is empty", Log.ERROR) + return + } + Tapsell.showAppOpenAd(responseId, activity, object : AdStateListener.AppOpen { + override fun onAdClicked() { + log(TAG, "onAdClicked") + } + + override fun onAdClosed(completionState: AdShowCompletionState) { + log(TAG, "onAdClosed: ${completionState.name}") + } + + override fun onAdFailed(message: String) { + log(TAG, "onAdFailed: $message", Log.ERROR) + } + + override fun onAdImpression() { + log(TAG, "onAdImpression") + } + }) + } +} diff --git a/sample-kotlin/src/main/java/ir/tapsell/sample/home/HomeFragment.kt b/sample-kotlin/src/main/java/ir/tapsell/sample/home/HomeFragment.kt index 386f573..ccc15fa 100644 --- a/sample-kotlin/src/main/java/ir/tapsell/sample/home/HomeFragment.kt +++ b/sample-kotlin/src/main/java/ir/tapsell/sample/home/HomeFragment.kt @@ -42,6 +42,9 @@ class HomeFragment : Fragment() { binding.btnInterstitial.setOnClickListener { navController.navigate(R.id.action_fragment_home_to_fragment_interstitial) } + binding.btnAppOpen.setOnClickListener { + navController.navigate(R.id.action_fragment_home_to_fragment_app_open) + } binding.btnStandardBanner.setOnClickListener { navController.navigate(R.id.action_fragment_home_to_fragment_standard_banner) } diff --git a/sample-kotlin/src/main/java/ir/tapsell/sample/interstitial/InterstitialFragment.kt b/sample-kotlin/src/main/java/ir/tapsell/sample/interstitial/InterstitialFragment.kt index 6875fe0..8befe56 100644 --- a/sample-kotlin/src/main/java/ir/tapsell/sample/interstitial/InterstitialFragment.kt +++ b/sample-kotlin/src/main/java/ir/tapsell/sample/interstitial/InterstitialFragment.kt @@ -29,6 +29,7 @@ class InterstitialFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding.inputZone.setText(TapsellMediationKeys.INTERSTITIAL) binding.btnRequest.setOnClickListener { requestAd() } @@ -44,7 +45,7 @@ class InterstitialFragment : Fragment() { } private fun requestAd() { - viewModel.requestAd(TapsellMediationKeys.INTERSTITIAL) + viewModel.requestAd(binding.inputZone.text.toString()) } private fun showAd() { diff --git a/sample-kotlin/src/main/java/ir/tapsell/sample/native/NativeBannerFragment.kt b/sample-kotlin/src/main/java/ir/tapsell/sample/native/NativeBannerFragment.kt index 718c306..f4baa2c 100644 --- a/sample-kotlin/src/main/java/ir/tapsell/sample/native/NativeBannerFragment.kt +++ b/sample-kotlin/src/main/java/ir/tapsell/sample/native/NativeBannerFragment.kt @@ -32,6 +32,7 @@ class NativeBannerFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding.inputZone.setText(TapsellMediationKeys.NATIVE) binding.btnRequest.setOnClickListener { requestAd() } @@ -50,7 +51,7 @@ class NativeBannerFragment : Fragment() { } private fun requestAd(count: Int = 1) { - viewModel.requestAd(TapsellMediationKeys.NATIVE, count) + viewModel.requestAd(binding.inputZone.text.toString(), count) } private fun showAd() = NativeAdViewContainer(requireContext()).let { diff --git a/sample-kotlin/src/main/java/ir/tapsell/sample/preroll/PreRollFragment.kt b/sample-kotlin/src/main/java/ir/tapsell/sample/preroll/PreRollFragment.kt index 0233f9a..b6a0c1d 100644 --- a/sample-kotlin/src/main/java/ir/tapsell/sample/preroll/PreRollFragment.kt +++ b/sample-kotlin/src/main/java/ir/tapsell/sample/preroll/PreRollFragment.kt @@ -37,6 +37,7 @@ class PreRollFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding.inputZone.setText(TapsellMediationKeys.PRE_ROLL) binding.btnRequest.setOnClickListener { requestAd() } @@ -56,7 +57,7 @@ class PreRollFragment : Fragment() { private fun requestAd() { viewModel.requestAd( - zoneId = TapsellMediationKeys.PRE_ROLL, + zoneId = binding.inputZone.text.toString(), container = binding.videoPlayerContainer, companionContainer = binding.companionContainer, // optional videoPlayer = binding.exoPlayer, diff --git a/sample-kotlin/src/main/java/ir/tapsell/sample/rewarded/RewardedVideoFragment.kt b/sample-kotlin/src/main/java/ir/tapsell/sample/rewarded/RewardedVideoFragment.kt index 9f7194d..a3c75d1 100644 --- a/sample-kotlin/src/main/java/ir/tapsell/sample/rewarded/RewardedVideoFragment.kt +++ b/sample-kotlin/src/main/java/ir/tapsell/sample/rewarded/RewardedVideoFragment.kt @@ -29,6 +29,7 @@ class RewardedVideoFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding.inputZone.setText(TapsellMediationKeys.REWARDED) binding.btnRequest.setOnClickListener { requestAd() } @@ -44,7 +45,7 @@ class RewardedVideoFragment : Fragment() { } private fun requestAd() { - viewModel.requestAd(TapsellMediationKeys.REWARDED) + viewModel.requestAd(binding.inputZone.text.toString()) } private fun showAd() { diff --git a/sample-kotlin/src/main/java/ir/tapsell/sample/standard/StandardBannerFragment.kt b/sample-kotlin/src/main/java/ir/tapsell/sample/standard/StandardBannerFragment.kt index f1eef40..f6e84cc 100644 --- a/sample-kotlin/src/main/java/ir/tapsell/sample/standard/StandardBannerFragment.kt +++ b/sample-kotlin/src/main/java/ir/tapsell/sample/standard/StandardBannerFragment.kt @@ -32,6 +32,7 @@ class StandardBannerFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding.inputZone.setText(AdmobKeys.BANNER) binding.btnRequest.setOnClickListener { requestAd() } @@ -48,7 +49,7 @@ class StandardBannerFragment : Fragment() { private fun requestAd() { viewModel.requestAd( - AdmobKeys.BANNER, + binding.inputZone.text.toString(), BannerSize.BANNER_ADAPTIVE ) } diff --git a/sample-kotlin/src/main/res/layout/fragment_app_open.xml b/sample-kotlin/src/main/res/layout/fragment_app_open.xml new file mode 100644 index 0000000..c721847 --- /dev/null +++ b/sample-kotlin/src/main/res/layout/fragment_app_open.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/sample-kotlin/src/main/res/layout/fragment_home.xml b/sample-kotlin/src/main/res/layout/fragment_home.xml index 7980505..e925574 100644 --- a/sample-kotlin/src/main/res/layout/fragment_home.xml +++ b/sample-kotlin/src/main/res/layout/fragment_home.xml @@ -22,9 +22,18 @@ android:layout_height="wrap_content" android:layout_marginVertical="@dimen/space_small" android:text="@string/interstitial" - app:layout_constraintBottom_toTopOf="@+id/btn_native_banner" + app:layout_constraintBottom_toTopOf="@+id/btn_app_open" app:layout_constraintTop_toBottomOf="@+id/btn_rewarded_video" /> + + + app:layout_constraintTop_toBottomOf="@+id/btn_app_open" /> + + \ No newline at end of file diff --git a/sample-kotlin/src/main/res/layout/fragment_native_banner.xml b/sample-kotlin/src/main/res/layout/fragment_native_banner.xml index bafb827..c976ca6 100644 --- a/sample-kotlin/src/main/res/layout/fragment_native_banner.xml +++ b/sample-kotlin/src/main/res/layout/fragment_native_banner.xml @@ -52,4 +52,14 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + \ No newline at end of file diff --git a/sample-kotlin/src/main/res/layout/fragment_preroll.xml b/sample-kotlin/src/main/res/layout/fragment_preroll.xml index a551557..890df49 100644 --- a/sample-kotlin/src/main/res/layout/fragment_preroll.xml +++ b/sample-kotlin/src/main/res/layout/fragment_preroll.xml @@ -84,4 +84,14 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/preroll_container" /> + + \ No newline at end of file diff --git a/sample-kotlin/src/main/res/layout/fragment_rewarded_video.xml b/sample-kotlin/src/main/res/layout/fragment_rewarded_video.xml index 886e9ae..bf90dcb 100644 --- a/sample-kotlin/src/main/res/layout/fragment_rewarded_video.xml +++ b/sample-kotlin/src/main/res/layout/fragment_rewarded_video.xml @@ -11,6 +11,7 @@ android:id="@+id/btn_request" android:layout_width="match_parent" android:layout_height="wrap_content" + android:singleLine="true" android:text="@string/request" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -36,4 +37,14 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/btn_show" /> + + \ No newline at end of file diff --git a/sample-kotlin/src/main/res/layout/fragment_standard_banner.xml b/sample-kotlin/src/main/res/layout/fragment_standard_banner.xml index 660fc2f..0c88c50 100644 --- a/sample-kotlin/src/main/res/layout/fragment_standard_banner.xml +++ b/sample-kotlin/src/main/res/layout/fragment_standard_banner.xml @@ -44,4 +44,14 @@ android:layout_centerHorizontal="true" app:layout_constraintTop_toTopOf="parent" /> + + \ No newline at end of file diff --git a/sample-kotlin/src/main/res/navigation/nav_graph.xml b/sample-kotlin/src/main/res/navigation/nav_graph.xml index d9a3e16..43c6cbd 100644 --- a/sample-kotlin/src/main/res/navigation/nav_graph.xml +++ b/sample-kotlin/src/main/res/navigation/nav_graph.xml @@ -40,6 +40,9 @@ app:destination="@id/fragment_preroll" app:popUpToSaveState="true" app:restoreState="true" /> + @@ -55,6 +58,12 @@ android:label="@string/interstitial" tools:layout="@layout/fragment_interstitial" /> + + 8dp 16dp 64dp + + 12sp + 14sp + 16sp \ No newline at end of file diff --git a/sample-kotlin/src/main/res/values/strings.xml b/sample-kotlin/src/main/res/values/strings.xml index 6196868..f53c14f 100644 --- a/sample-kotlin/src/main/res/values/strings.xml +++ b/sample-kotlin/src/main/res/values/strings.xml @@ -6,9 +6,11 @@ Show Destroy Interstitial + AppOpen Native Banner Standard Banner Native Video PreRoll Vast + zoneId \ No newline at end of file diff --git a/scripts/change-app.sh b/scripts/change-app.sh new file mode 100644 index 0000000..8ae326d --- /dev/null +++ b/scripts/change-app.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +PROJECT_DIR="" +if [ -n "${CI_PROJECT_DIR}" ]; then + PROJECT_DIR="${CI_PROJECT_DIR}" +else + PROJECT_DIR=$(dirname "$PWD") +fi + +FILE="$PROJECT_DIR/build.gradle.kts" + +# shellcheck disable=SC2120 +update_app_keys() { + CI_TAPSELL_APP_ID="$1" + CI_ADMOB_APP_ID="$2" + CI_APPLOVIN_APP_ID="$3" + + echo "Updating Tapsell App Keys to the new app: TapsellAppId: $CI_TAPSELL_APP_ID - AdmobAppId: $CI_ADMOB_APP_ID - ApplovinAppId: $CI_APPLOVIN_APP_ID" + + if [ -n "$CI_TAPSELL_APP_ID" ] && [ -n "$CI_ADMOB_APP_ID" ] && [ -n "$CI_APPLOVIN_APP_ID" ]; then + sed -i '' -e "s/const val TAPSELL_APP_ID.*/const val TAPSELL_APP_ID = \"$CI_TAPSELL_APP_ID\"/" "$FILE" + sed -i '' -e "s/const val ADMOB_APP_ID.*/const val ADMOB_APP_ID = \"$CI_ADMOB_APP_ID\"/" "$FILE" + sed -i '' -e "s/const val APPLOVIN_APP_ID.*/const val APPLOVIN_APP_ID = \"$CI_APPLOVIN_APP_ID\"/" "$FILE" + echo "App Keys updated successfully." + else + echo "Failed to update app keys: One or more keys are undefined." + fi +} \ No newline at end of file diff --git a/shared/src/main/java/ir/tapsell/shared/Constants.kt b/shared/src/main/java/ir/tapsell/shared/Constants.kt index 1e52a7c..ed23ebd 100644 --- a/shared/src/main/java/ir/tapsell/shared/Constants.kt +++ b/shared/src/main/java/ir/tapsell/shared/Constants.kt @@ -20,6 +20,7 @@ object LegacyKeys { object AdmobKeys { const val REWARDED = "d8f4ff72-e2e9-4e67-9eb8-f6d75787ef09" const val INTERSTITIAL = "48b73764-8025-4c9d-9507-ce7a2c7f32ef" + const val APP_OPEN = "48b73764-8025-4c9d-9507-ce7a2c7f32ef" const val NATIVE = "15cacb1b-6598-4fe9-b2da-8b26b4c1bbc5" const val BANNER = "f965455e-a37a-4732-a0b4-05fc39cae16e" }