From 01695f49d1d19d3aeee925dd9103fa4b39b78226 Mon Sep 17 00:00:00 2001 From: litingting Date: Fri, 16 Jan 2026 16:49:57 +0800 Subject: [PATCH] V1.2(3) TradPlus- Liftoff --- app/build.gradle.kts | 89 ++++++++- app/google-services.json | 29 +++ .../TradPlusLibrary_01_04_12_20-release.aar | Bin 0 -> 23056 bytes app/src/main/AndroidManifest.xml | 4 +- .../joyful/euphoria/board/EuphoriaBoard.kt | 2 + .../board/assistant/ServiceAssistant.java | 5 +- .../euphoria/board/xmlactivity/BeginXML.kt | 26 ++- .../board/xmlactivity/CategoryXML.java | 172 ------------------ .../euphoria/board/xmlactivity/DownloadXML.kt | 92 +++++++--- .../board/xmlactivity/PreviewXML.java | 29 ++- build.gradle.kts | 2 + settings.gradle.kts | 20 ++ 12 files changed, 250 insertions(+), 220 deletions(-) create mode 100644 app/google-services.json create mode 100644 app/libs/TradPlusLibrary_01_04_12_20-release.aar delete mode 100644 app/src/main/java/com/joyful/euphoria/board/xmlactivity/CategoryXML.java diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b6e9da8..4c0f9cf 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -9,6 +9,8 @@ plugins { id("org.jetbrains.kotlin.android") kotlin("kapt") id ("kotlin-android") + id("com.google.gms.google-services") + id("com.google.firebase.crashlytics") } val keystorePropertiesFile = rootProject.file("keystore.properties") val keystoreProperties = Properties().apply { @@ -22,8 +24,8 @@ android { applicationId = "com.joyful.euphoria.board" minSdk = 24 targetSdk = 36 - versionCode = 2 - versionName = "1.1" + versionCode = 3 + versionName = "1.2" setProperty( "archivesBaseName", "EuphoriaBoard_V" + versionName + "(${versionCode})_$timestamp" @@ -100,4 +102,87 @@ dependencies { // Android平台协程支持 implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4") + implementation(platform("com.google.firebase:firebase-bom:33.7.0")) + implementation("com.google.firebase:firebase-crashlytics") + implementation("com.google.firebase:firebase-analytics") + implementation("com.google.firebase:firebase-config") + + + implementation(files("libs/TradPlusLibrary_01_04_12_20-release.aar")) + // ---------------------TradPlus + implementation("com.tradplusad:tradplus:15.2.0.1") + implementation("androidx.legacy:legacy-support-v4:1.0.0") + implementation("androidx.appcompat:appcompat:1.3.0-alpha02") + + // IronSource + implementation("com.ironsource.sdk:mediationsdk:9.0.0") + implementation("com.tradplusad:tradplus-ironsource:10.15.2.0.1") + + // Pangle + implementation("com.tradplusad:tradplus-pangle:19.15.2.0.1") + implementation("com.pangle.global:pag-sdk:7.8.0.7") + + // UnityAds + implementation("com.tradplusad:tradplus-unity:5.15.2.0.1") + implementation("com.unity3d.ads:unity-ads:4.16.3") + + // Chartboost +// implementation("com.tradplusad:tradplus-chartboostx:15.15.2.0.1") +// implementation("com.chartboost:chartboost-sdk:9.10.0") +// implementation("com.google.android.gms:play-services-ads-identifier:17.0.0") +// implementation("com.google.android.gms:play-services-base:17.4.0") + + + //上面新版本下载失败用旧版本 + implementation("com.tradplusad:tradplus-chartboostx:15.14.5.0.1") + implementation("com.chartboost:chartboost-sdk:9.8.3") + implementation("com.google.android.gms:play-services-ads-identifier:17.0.0") + implementation("com.google.android.gms:play-services-base:17.4.0") + + // InMobi + implementation("com.tradplusad:tradplus-inmobix:23.15.2.0.1") + implementation("com.inmobi.monetization:inmobi-ads-kotlin:11.0.0") + implementation("com.squareup.okhttp3:okhttp:3.14.9") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4") + implementation("androidx.core:core-ktx:1.5.0") + implementation("org.jetbrains.kotlin:kotlin-stdlib:1.9.0") + + implementation("com.google.android.gms:play-services-ads-identifier:18.0.1") + implementation("com.google.android.gms:play-services-location:21.0.1") // optional + implementation("androidx.browser:browser:1.8.0") + implementation("com.squareup.picasso:picasso:2.8") + implementation("androidx.viewpager:viewpager:1.0.0") + implementation("androidx.recyclerview:recyclerview:1.2.1") + + // Fyber + implementation("com.fyber:marketplace-sdk:8.4.0") + implementation("com.tradplusad:tradplus-fyber:24.15.2.0.1") + implementation("com.google.android.gms:play-services-ads-identifier:17.0.0") + implementation("com.google.android.gms:play-services-base:17.4.0") + + // Mintegral + implementation("com.tradplusad:tradplus-mintegralx_overseas:18.15.2.0.1") + implementation("androidx.recyclerview:recyclerview:1.1.0") + implementation("com.mbridge.msdk.oversea:mbridge_android_sdk:16.10.11") + + // Liftoff (Vungle) + implementation("com.tradplusad:tradplus-vunglex:7.15.2.0.1") + implementation("com.vungle:vungle-ads:7.6.0") + + // Bigo + implementation("com.bigossp:bigo-ads:5.5.2") + implementation("com.tradplusad:tradplus-bigo:57.15.2.0.1") + + // Cross Promotion + implementation("com.tradplusad:tradplus-crosspromotion:27.15.2.0.1") + + // TP Exchange(注意与主包版本同步) + implementation("com.google.code.gson:gson:2.8.6") + implementation("com.tradplusad:tp_exchange:40.15.2.0.1") + + // Google UMP + implementation ("com.google.android.ump:user-messaging-platform:3.2.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..1652fef --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "367366033615", + "project_id": "euphoria-board", + "storage_bucket": "euphoria-board.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:367366033615:android:2e4373761a528d9a3c67ba", + "android_client_info": { + "package_name": "com.joyful.euphoria.board" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyCukTM4rS_pll5tA_tm6elJHMYUn5KjBDo" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/libs/TradPlusLibrary_01_04_12_20-release.aar b/app/libs/TradPlusLibrary_01_04_12_20-release.aar new file mode 100644 index 0000000000000000000000000000000000000000..de049ac6827d9b7e82ea67b4207bb1e145705bf3 GIT binary patch literal 23056 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 S|F}YZu4;$~2;~O<%>D}rAB)uh literal 0 HcmV?d00001 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index faf4ca8..8ea412d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,9 +13,7 @@ android:supportsRtl="true" android:theme="@style/MyKeyBoard" tools:targetApi="31"> - + val percentage: Float = 100 - millisUntilFinished.toFloat() / countTime * 100 val round = percentage.roundToInt() progressBar.progress = round - } - - override fun onFinish() { - progressBar.progress = 100 - toHome() - } - + }){ + progressBar.progress = 100 + toHome() } timer.start() diff --git a/app/src/main/java/com/joyful/euphoria/board/xmlactivity/CategoryXML.java b/app/src/main/java/com/joyful/euphoria/board/xmlactivity/CategoryXML.java deleted file mode 100644 index 1d22293..0000000 --- a/app/src/main/java/com/joyful/euphoria/board/xmlactivity/CategoryXML.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.joyful.euphoria.board.xmlactivity; - -import android.content.Intent; -import android.os.Bundle; -import android.util.Log; -import android.view.View; -import android.widget.TextView; -import android.widget.Toast; - -import androidx.activity.EdgeToEdge; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import com.joyful.euphoria.board.R; -import com.joyful.euphoria.board.recyclerview.RecyclerviewCategory; -import com.joyful.euphoria.board.beaned.BeanDetails; -import com.joyful.euphoria.board.beaned.BeanWrapper; -import com.joyful.euphoria.board.database.CategoryData; -import com.joyful.euphoria.board.database.BoardData; -import com.joyful.euphoria.board.EuphoriaBoard; -import com.joyful.euphoria.board.utils.FileUtils; -import com.joyful.euphoria.board.utils.ListDecorationUtils; -import java.util.ArrayList; -import java.util.List; - -public class CategoryXML extends AppCompatActivity { - private static final String TAG = "CategoryActivity"; - public static final String KEY_CATEGORY_NAME = "category_name"; - - private RecyclerView rvCateKeyboard; - private View llCateEmpty; - private View ivCateBack; - private TextView tvCateTitle; - private RecyclerviewCategory mCateKeyboardAdapter; - private List mKeyboardList = new ArrayList<>(); - private List mCategoryDataList = new ArrayList<>(); - private String mCurrentCategoryName; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - EdgeToEdge.enable(this); - setContentView(R.layout.activity_category_xml); - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.category), (v, insets) -> { - Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); - return insets; - }); - initView(); - getIntentData(); - initAdapter(); - loadCategoryData(); - loadKeyboardDataByCategory(); - } - - private void initView() { - rvCateKeyboard = findViewById(R.id.rv_cate_keyboard); - llCateEmpty = findViewById(R.id.ll_cate_empty); - ivCateBack = findViewById(R.id.iv_cate_back); - tvCateTitle = findViewById(R.id.tv_cate_title); - - ivCateBack.setOnClickListener(v -> finish()); - } - - private void getIntentData() { - mCurrentCategoryName = getIntent().getStringExtra(KEY_CATEGORY_NAME); - tvCateTitle.setText(mCurrentCategoryName == null ? "未知分类" : mCurrentCategoryName); - } - - private void initAdapter() { - mCateKeyboardAdapter = new RecyclerviewCategory(this, mKeyboardList); - GridLayoutManager layoutManager = new GridLayoutManager(this, 1); - rvCateKeyboard.setLayoutManager(layoutManager); - ListDecorationUtils decoration = new ListDecorationUtils(10, 10, 0); - rvCateKeyboard.addItemDecoration(decoration); - rvCateKeyboard.setAdapter(mCateKeyboardAdapter); - - // 键盘点击跳转Set界面 - mCateKeyboardAdapter.setOnCategoryKeyboardClickListener(bean -> { - if (bean == null || bean.getTitleName() == null) { - Toast.makeText(CategoryXML.this, "键盘数据异常", Toast.LENGTH_SHORT).show(); - return; - } - Intent intent = new Intent(CategoryXML.this, DownloadXML.class); - intent.putExtra(DownloadXML.SOURCE_KEY, bean); - intent.putExtra(DownloadXML.NAME_KEY, bean.getTitleName()); - intent.putExtra(DownloadXML.DISPLAY_URL_KEY, bean.getImgPath()); - intent.putExtra(DownloadXML.GIF_KEY, bean.getImgGif()); - intent.putExtra(DownloadXML.THUMB_KEY, bean.getThumbUrl()); - intent.putExtra(DownloadXML.ZIP_URL_KEY, bean.getZipPath()); - startActivity(intent); - }); - } - - private void loadCategoryData() { - try { - mCategoryDataList = FileUtils.readCategoryJsonFromAssets(this, "res.json"); - Log.d(TAG, "加载分类原始数据条数:" + mCategoryDataList.size()); - } catch (Exception e) { - Log.e(TAG, "加载分类原始数据失败", e); - } - } - - private void loadKeyboardDataByCategory() { - if (mCurrentCategoryName == null || mCategoryDataList.isEmpty()) { - showEmptyState(); - return; - } - - mKeyboardList.clear(); - // 从JSON原始数据加载 - for (CategoryData categoryData : mCategoryDataList) { - if (categoryData == null || !mCurrentCategoryName.equalsIgnoreCase(categoryData.getParent_name())) { - continue; - } - if (categoryData.getKeyboard_list() != null && !categoryData.getKeyboard_list().isEmpty()) { - for (BoardData boardData : categoryData.getKeyboard_list()) { - if (boardData == null) { - continue; - } - BeanDetails bean = new BeanDetails(); - bean.setTitleName(boardData.getTitle() != null ? boardData.getTitle() : "未知键盘"); - bean.setThumbUrl(boardData.getThumbUrl() != null ? boardData.getThumbUrl() : ""); - bean.setImgGif(boardData.getThumbUrlGif() != null ? boardData.getThumbUrlGif() : ""); - if (boardData.getDetail() != null && boardData.getDetail().getThemeContent() != null) { - bean.setImgPath(boardData.getDetail().getThemeContent().getImg() != null ? - boardData.getDetail().getThemeContent().getImg() : ""); - bean.setZipPath(boardData.getDetail().getThemeContent().getAndroidRawZipUrl() != null ? - boardData.getDetail().getThemeContent().getAndroidRawZipUrl() : ""); - } else { - bean.setImgPath(""); - bean.setZipPath(""); - } - mKeyboardList.add(bean); - } - } - break; - } - - // 备选:从DelightBoard全局数据加载 - if (mKeyboardList.isEmpty() && EuphoriaBoard.list != null && !EuphoriaBoard.list.isEmpty()) { - for (BeanWrapper wrapper : EuphoriaBoard.list) { - if (wrapper == null || !mCurrentCategoryName.equals(wrapper.getParentName())) { - continue; - } - mKeyboardList.addAll(wrapper.getKeyboardList()); - break; - } - } - - mCateKeyboardAdapter.notifyDataSetChanged(); - if (mKeyboardList.isEmpty()) { - showEmptyState(); - } else { - hideEmptyState(); - } - Log.d(TAG, "分类[" + mCurrentCategoryName + "]下加载键盘条数:" + mKeyboardList.size()); - } - - private void showEmptyState() { - rvCateKeyboard.setVisibility(View.GONE); - llCateEmpty.setVisibility(View.VISIBLE); - } - - private void hideEmptyState() { - rvCateKeyboard.setVisibility(View.VISIBLE); - llCateEmpty.setVisibility(View.GONE); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/joyful/euphoria/board/xmlactivity/DownloadXML.kt b/app/src/main/java/com/joyful/euphoria/board/xmlactivity/DownloadXML.kt index a00a6e0..00f38bd 100644 --- a/app/src/main/java/com/joyful/euphoria/board/xmlactivity/DownloadXML.kt +++ b/app/src/main/java/com/joyful/euphoria/board/xmlactivity/DownloadXML.kt @@ -13,6 +13,7 @@ import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView import android.widget.Toast +import androidx.activity.OnBackPressedCallback import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.OnApplyWindowInsetsListener @@ -22,23 +23,24 @@ import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.joyful.euphoria.board.EuphoriaBoard -import com.joyful.euphoria.board.R -import com.joyful.euphoria.board.beaned.BeanDetails -import com.joyful.euphoria.board.remember.OnItemClickRemember -import com.joyful.euphoria.board.remember.DownloadBoardRemember -import com.joyful.euphoria.board.assistant.DatabaseAssistant -import com.joyful.euphoria.board.recyclerview.RecyclerviewDownload -import com.joyful.euphoria.board.frag.Dialog -import com.joyful.euphoria.board.utils.Normal -import com.joyful.euphoria.board.utils.DealZipUtils -import com.joyful.euphoria.board.utils.SaveCurrentThemeUtils +import com.ad.tradpluslibrary.TPAdManager import com.bumptech.glide.Glide import com.bumptech.glide.integration.webp.decoder.WebpDrawable import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target +import com.joyful.euphoria.board.EuphoriaBoard +import com.joyful.euphoria.board.R +import com.joyful.euphoria.board.assistant.DatabaseAssistant +import com.joyful.euphoria.board.beaned.BeanDetails +import com.joyful.euphoria.board.frag.Dialog +import com.joyful.euphoria.board.recyclerview.RecyclerviewDownload +import com.joyful.euphoria.board.remember.DownloadBoardRemember +import com.joyful.euphoria.board.remember.OnItemClickRemember +import com.joyful.euphoria.board.utils.DealZipUtils +import com.joyful.euphoria.board.utils.Normal +import com.joyful.euphoria.board.utils.SaveCurrentThemeUtils import kotlinx.coroutines.launch import java.io.File @@ -61,8 +63,10 @@ class DownloadXML : AppCompatActivity() { @JvmField val SOURCE_KEY = "data_key" + @JvmField val KEYBOARD_ID = "KEYBOARD_ID" + @JvmField val KEYBOARD_IMG = "KEYBOARD_IMG" @@ -87,7 +91,6 @@ class DownloadXML : AppCompatActivity() { private lateinit var imgLike: ImageView - private var data: BeanDetails? = null override fun onCreate(savedInstanceState: Bundle?) { @@ -101,7 +104,7 @@ class DownloadXML : AppCompatActivity() { v!!.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets }) - + TPAdManager.loadAllAd(this) // 检查存储权限 checkStoragePermission() @@ -110,12 +113,30 @@ class DownloadXML : AppCompatActivity() { displayData() // 后使用 setApply() onClick() + onBackPressedDispatcher.addCallback( + this, + object : OnBackPressedCallback(true) { + + override fun handleOnBackPressed() { + // 物理返回被拦截 + back() + } + }) + + TPAdManager.showTPAD(this@DownloadXML) {} + } + + private fun back() { + TPAdManager.showTPAD(this@DownloadXML) { + finish() + } } // 检查存储权限 private fun checkStoragePermission() { if (Environment.getExternalStorageState() != Environment.MEDIA_MOUNTED) { - Toast.makeText(this, getString(R.string.storage_not_available), Toast.LENGTH_SHORT).show() + Toast.makeText(this, getString(R.string.storage_not_available), Toast.LENGTH_SHORT) + .show() return } @@ -222,7 +243,8 @@ class DownloadXML : AppCompatActivity() { private fun onClick() { imgBack.setOnClickListener { - finish() + back() + } imgLike.setOnClickListener { @@ -237,7 +259,11 @@ class DownloadXML : AppCompatActivity() { } } catch (e: Exception) { Log.e("SetActivity", "Like operation error", e) - Toast.makeText(this@DownloadXML, getString(R.string.operation_failed), Toast.LENGTH_SHORT).show() + Toast.makeText( + this@DownloadXML, + getString(R.string.operation_failed), + Toast.LENGTH_SHORT + ).show() } } } @@ -257,8 +283,10 @@ class DownloadXML : AppCompatActivity() { }) } - layoutManager = LinearLayoutManager(this@DownloadXML, - LinearLayoutManager.HORIZONTAL, false) + layoutManager = LinearLayoutManager( + this@DownloadXML, + LinearLayoutManager.HORIZONTAL, false + ) addItemDecoration(object : RecyclerView.ItemDecoration() { override fun getItemOffsets( outRect: Rect, @@ -315,13 +343,17 @@ class DownloadXML : AppCompatActivity() { private fun setApply() { applyBtn.setOnClickListener { - val checkEnable = Normal.checkEnable(this) - val checkSetDefault = Normal.checkSetDefault(this) - if (!checkEnable || !checkSetDefault) { - showDialog() - return@setOnClickListener + TPAdManager.showTPAD(this@DownloadXML) { + val checkEnable = Normal.checkEnable(this) + val checkSetDefault = Normal.checkSetDefault(this) + if (!checkEnable || !checkSetDefault) { + showDialog() + return@showTPAD + } + startDown() + } - startDown() + } } @@ -342,7 +374,8 @@ class DownloadXML : AppCompatActivity() { if (!DealZipUtils.isValidZipUrl(zipUrl)) { // 调用工具类校验 runOnUiThread { - Toast.makeText(this, getString(R.string.invalid_download_url), Toast.LENGTH_SHORT).show() + Toast.makeText(this, getString(R.string.invalid_download_url), Toast.LENGTH_SHORT) + .show() applyBtn.isEnabled = true loadingLayout.isVisible = false } @@ -364,7 +397,8 @@ class DownloadXML : AppCompatActivity() { } else { if (zipUrl.isEmpty()) { runOnUiThread { - Toast.makeText(this, getString(R.string.download_url_error), Toast.LENGTH_SHORT).show() + Toast.makeText(this, getString(R.string.download_url_error), Toast.LENGTH_SHORT) + .show() applyBtn.isEnabled = true loadingLayout.isVisible = false } @@ -393,7 +427,11 @@ class DownloadXML : AppCompatActivity() { findFirstDirectory?.let { apply("${it}/") } ?: run { - Toast.makeText(this@DownloadXML, getString(R.string.file_error), Toast.LENGTH_SHORT).show() + Toast.makeText( + this@DownloadXML, + getString(R.string.file_error), + Toast.LENGTH_SHORT + ).show() } } } diff --git a/app/src/main/java/com/joyful/euphoria/board/xmlactivity/PreviewXML.java b/app/src/main/java/com/joyful/euphoria/board/xmlactivity/PreviewXML.java index 865af15..53fa18f 100644 --- a/app/src/main/java/com/joyful/euphoria/board/xmlactivity/PreviewXML.java +++ b/app/src/main/java/com/joyful/euphoria/board/xmlactivity/PreviewXML.java @@ -11,6 +11,7 @@ import android.view.ViewTreeObserver; import android.view.WindowManager; import androidx.activity.EdgeToEdge; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; @@ -18,6 +19,7 @@ import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import com.ad.tradpluslibrary.TPAdManager; import com.joyful.euphoria.board.R; import com.joyful.euphoria.board.databinding.ActivityPreviewXmlBinding; import com.joyful.euphoria.board.utils.KeyNamesUtils; @@ -30,6 +32,8 @@ import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; import jp.wasabeef.glide.transformations.BlurTransformation; +import kotlin.Unit; +import kotlin.jvm.functions.Function0; public class PreviewXML extends AppCompatActivity { @@ -49,12 +53,27 @@ public class PreviewXML extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); - + TPAdManager.INSTANCE.loadAllAd(this); onInit(); + + getOnBackPressedDispatcher().addCallback( + this, new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + back(); + } + }); } - - + private void back() { + TPAdManager.INSTANCE.showTPAD(PreviewXML.this, new Function0() { + @Override + public Unit invoke() { + finish(); + return null; + } + }); + } public void onInit() { @@ -66,14 +85,14 @@ public class PreviewXML extends AppCompatActivity { vb.idBack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - finish(); + back(); } }); if (curPath == null) { return; } - String bgPath = curPath+"res/drawable-xxhdpi-v4/"+ KeyNamesUtils.previewBg; + String bgPath = curPath + "res/drawable-xxhdpi-v4/" + KeyNamesUtils.previewBg; Drawable bgDraw = Normal.INSTANCE.getBgDrawable(this, bgPath); if (bgDraw != null) { diff --git a/build.gradle.kts b/build.gradle.kts index 6b4974f..7e19871 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,4 +3,6 @@ plugins { id("com.android.application") version "8.9.2" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false kotlin("kapt") version "2.0.0" + id("com.google.gms.google-services") version "4.4.2" apply false + id ("com.google.firebase.crashlytics") version "3.0.2" apply false } diff --git a/settings.gradle.kts b/settings.gradle.kts index 2dc5873..ae6fd82 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,7 +12,27 @@ dependencyResolutionManagement { google() mavenCentral() maven("https://jitpack.io") + flatDir { + dirs("libs") + } + //------------------------- TradPlus + // Ironsource + maven { url = uri("https://android-sdk.is.com/") } + // Pangle + maven { url = uri("https://artifact.bytedance.com/repository/pangle") } + // Chartboost + maven { url = uri("https://cboost.jfrog.io/artifactory/chartboost-ads/") } + maven { + name = "Chartboost Mediation’s maven repo" + url = uri("https://cboost.jfrog.io/artifactory/chartboost-mediation") + } + // Mintegral + //Launch GP market application, Android X Version + //If you fail to pull the code using gradle, add the maven warehouse configuration to the project root build.gradle file + maven { + url = uri("https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea") + } } }