diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f4bd709..9449392 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -15,7 +15,7 @@ dependencies { implementation(fileTree(mapOf("dir" to "src/main/libs", "include" to listOf("*.aar")))) implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") // implementation(files("src\\main\\libs\\Baidu_ocpc_action_2_7_2.aar")) -// implementation(files("src\\main\\libs\\OpenInstall.jar")) + implementation(files("src\\main\\libs\\OpenInstall.jar")) // implementation("com.google.firebase:firebase-crashlytics-buildtools:3.0.2") // implementation(files("src/main/libs/openinstall.jar")) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ffaf165..d980d85 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -59,6 +59,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt b/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt index 7994978..cf26463 100644 --- a/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt @@ -5,6 +5,7 @@ import android.content.Intent import android.net.Uri import android.os.Build import android.os.Bundle +import android.provider.Settings import android.text.TextUtils import android.util.Log import android.view.View @@ -21,11 +22,20 @@ import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.afollestad.materialdialogs.MaterialDialog +import com.cncat.vpn.common.Global import com.cncat.vpn.service.ClashManager import com.cncat.vpn.service.remote.IClashManager import com.cncat.vpn.service.remote.wrap +import com.fm.openinstall.Configuration +import com.fm.openinstall.OpenInstall +import com.fm.openinstall.listener.AppInstallAdapter +import com.fm.openinstall.listener.AppInstallListener +import com.fm.openinstall.listener.AppWakeUpAdapter +import com.fm.openinstall.model.AppData +import com.fm.openinstall.model.Error import com.github.gzuliyujiang.oaid.DeviceID import com.github.gzuliyujiang.oaid.DeviceIdentifier +import com.google.gson.Gson import com.google.gson.JsonObject import com.tencent.mmkv.MMKV import com.yingmao.clash.BuildConfig @@ -76,6 +86,7 @@ class SplashActivity : BaseActivity() { var registerKey = "" var registerIV2 = "" lateinit var username: String + var InviteCode="" } private var captchaInfo = "" @@ -128,6 +139,8 @@ class SplashActivity : BaseActivity() { private fun initApplication() { username = Utils.getUniqueID(this) MainApplication.initUtil() + // 获取拉起参数 + openinstall() val oaId = OAID Log.i("SplashActOAID", "OAID::" + OAID + "oaId.isEmpty()::" + oaId.isEmpty()) if(oaId.isEmpty()){ @@ -185,26 +198,24 @@ class SplashActivity : BaseActivity() { // val byteArrayToHexStr = // AESUtil.byteArrayToHexStr(AESUtil.encrypt("https://api.yijianlianjsq.com+https://yjl.kuaifei.net+https://api.onetouchjsq.com+https://yjl.jimao.xyz")) // android.util.Log.i("AAAAAAAAAAA","data:::"+byteArrayToHexStr) - - // 获取拉起参数 -// openinstall() } -// override fun onNewIntent(intent: Intent?) { -// super.onNewIntent(intent) -// // 此处要调用,否则App在后台运行时,会无法获取 -// OpenInstall.getWakeUp(intent, wakeUpAdapter) -// } -// private var wakeUpAdapter: AppWakeUpAdapter = object : AppWakeUpAdapter() { -// override fun onWakeUp(appData: AppData) { -// // 打印数据便于调试 -// Log.d("OpenInstall", "getWakeUp : wakeupData = $appData") -// // 获取渠道编号参数 -// val channelCode = appData.getChannel() -// // 获取自定义参数 -// val bindData = appData.getData() -// Log.d("OpenInstall", "channelCode : bindData = $channelCode"+"bindData::"+bindData) -// } -// } + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + // 此处要调用,否则App在后台运行时,会无法获取 + OpenInstall.getWakeUp(intent, wakeUpAdapter) + } + private var wakeUpAdapter: AppWakeUpAdapter = object : AppWakeUpAdapter() { + override fun onWakeUp(appData: AppData) { + // 打印数据便于调试 + Log.d("OpenInstallAAAAA", "getWakeUp : wakeupData = " + appData.toString()); + // 获取渠道编号参数 + val channelCode = appData.getChannel() + // 获取自定义参数 + val bindData = appData.getData() + Log.d("OpenInstallAAAAA", "channelCode : bindData = $channelCode"+"bindData::"+bindData) + } + } + @SuppressLint("JavascriptInterface", "SetJavaScriptEnabled") private fun setWebView() { rlPb.visibility = View.INVISIBLE @@ -363,29 +374,84 @@ class SplashActivity : BaseActivity() { } } - val reqJson = JsonObject() - reqJson.addProperty("password", BZYConstants.defaultPassword) - reqJson.addProperty("checkPassword", BZYConstants.defaultPassword) - reqJson.addProperty("invitationCode", BuildConfig.productId) - reqJson.addProperty("clientIp", "127.0.0.1") - reqJson.addProperty("from", "5") - reqJson.addProperty("androidDevice", username) - reqJson.addProperty("userAgent", userAgent) - reqJson.addProperty("oaid", oaId) - reqJson.addProperty("equipmentModel", equipmentModel) - reqJson.addProperty("pkg", BuildConfig.applicationId) - if (captchaInfo.isNotEmpty()) { - reqJson.addProperty("captchaVerifyParam", captchaInfo) - } - if (registerKey.isNotEmpty() && registerIV2.isNotEmpty()) { - val data = AESUtil.byteArrayToHexStr( - AESUtil.RegisterEncrypt(reqJson.toString(), registerKey, registerIV2) - ) - val params: Map = mutableMapOf( - "data" to data - ) - splashAtyVM.registerByEncryption(params) - } + OpenInstall.getInstall(object : AppInstallListener { + override fun onInstallFinish(appData: AppData?, error: Error?) { + if (error != null && error.shouldRetry()) { + // 获取数据异常,可以尝试重新获取 + Log.d("OpenInstallError", "数据错误" + error.toString()) + val reqJson = JsonObject() + reqJson.addProperty("password", BZYConstants.defaultPassword) + reqJson.addProperty("checkPassword", BZYConstants.defaultPassword) + reqJson.addProperty("invitationCode", BuildConfig.productId) + reqJson.addProperty("clientIp", "127.0.0.1") + reqJson.addProperty("from", "5") + reqJson.addProperty("androidDevice", username) + reqJson.addProperty("userAgent", userAgent) + reqJson.addProperty("oaid", oaId) + reqJson.addProperty("equipmentModel", equipmentModel) + reqJson.addProperty("pkg", BuildConfig.applicationId) + if (captchaInfo.isNotEmpty()) { + reqJson.addProperty("captchaVerifyParam", captchaInfo) + } + if (registerKey.isNotEmpty() && registerIV2.isNotEmpty()) { + val data = AESUtil.byteArrayToHexStr( + AESUtil.RegisterEncrypt(reqJson.toString(), registerKey, registerIV2) + ) + val params: Map = mutableMapOf( + "data" to data + ) + splashAtyVM.registerByEncryption(params) + } + } else { + val safeAppData = appData ?: AppData() + val channelCode = safeAppData.channel // 获取渠道编号参数 + val bindData = safeAppData.data // 获取自定义参数 + android.util.Log.d("OpenInstallSuccess", "获取数据" + safeAppData.toString()+"channelCode::${channelCode}"+"bindData::${bindData}") + val data = Gson().fromJson(bindData, InviteData::class.java) + InviteCode=data.InviteCode + + android.util.Log.d("OpenInstallSuccess", "InviteCode:::${InviteCode}") + + val reqJson = JsonObject() + reqJson.addProperty("password", BZYConstants.defaultPassword) + reqJson.addProperty("checkPassword", BZYConstants.defaultPassword) + if(InviteCode.isEmpty()){ + Log.i( + "InviteCodeIsEmpty()", + "InviteCode::${InviteCode}" + ) + reqJson.addProperty("invitationCode", BuildConfig.productId) + }else{ + reqJson.addProperty("invitationCode", InviteCode) + Log.i( + "OpenInstallSuccessInviteCode", + "InviteCode::${InviteCode}" + ) + } + + reqJson.addProperty("clientIp", "127.0.0.1") + reqJson.addProperty("from", "5") + reqJson.addProperty("androidDevice", username) + reqJson.addProperty("userAgent", userAgent) + reqJson.addProperty("oaid", oaId) + reqJson.addProperty("equipmentModel", equipmentModel) + reqJson.addProperty("pkg", BuildConfig.applicationId) + if (captchaInfo.isNotEmpty()) { + reqJson.addProperty("captchaVerifyParam", captchaInfo) + } + if (registerKey.isNotEmpty() && registerIV2.isNotEmpty()) { + val data = AESUtil.byteArrayToHexStr( + AESUtil.RegisterEncrypt(reqJson.toString(), registerKey, registerIV2) + ) + val params: Map = mutableMapOf( + "data" to data + ) + splashAtyVM.registerByEncryption(params) + } + } + } + }) + } @SuppressLint("ClickableViewAccessibility") @@ -420,6 +486,8 @@ class SplashActivity : BaseActivity() { if (decodeBool) { MMKV.defaultMMKV().encode(BZYConstants.INITIALIZATION, true) } + // 用户注册成功后调用 + OpenInstall.reportRegister() splashAtyVM.login(encryName, encryPsw) } else if (code == "20062") { message?.let { @@ -701,12 +769,20 @@ class SplashActivity : BaseActivity() { } startActivity(intent) } -// private fun openinstall() { -// // 所有的设备标识符开发者都可控制,请参考集成文档 -// val configuration: Configuration? = Configuration.Builder() -// .build() -// -// OpenInstall.init(this, configuration) -// OpenInstall.getWakeUp(intent, wakeUpAdapter) -// } + private fun openinstall() { + val androidId = + Settings.System.getString(baseContext.contentResolver, Settings.Secure.ANDROID_ID) + // 所有的设备标识符开发者都可控制,请参考集成文档 + val configuration: Configuration? = Configuration.Builder() + .androidId(androidId) + .serialNumber("10086") + .build() + + OpenInstall.clipBoardEnabled(false); //false为不读取,true为读取 + OpenInstall.init(this, configuration) + OpenInstall.getWakeUp(intent, wakeUpAdapter) + } + data class InviteData( + val InviteCode: String + ) } \ No newline at end of file diff --git a/app/src/main/java/com/yingmao/clash/app/MainApplication.kt b/app/src/main/java/com/yingmao/clash/app/MainApplication.kt index 21622d2..e93b1ad 100644 --- a/app/src/main/java/com/yingmao/clash/app/MainApplication.kt +++ b/app/src/main/java/com/yingmao/clash/app/MainApplication.kt @@ -12,15 +12,22 @@ import androidx.core.content.getSystemService import com.cncat.vpn.common.Global import com.cncat.vpn.common.compat.currentProcessName import com.cncat.vpn.common.log.Log +import com.fm.openinstall.OpenInstall +import com.fm.openinstall.listener.AppInstallListener +import com.fm.openinstall.model.AppData +import com.fm.openinstall.model.Error import com.github.gzuliyujiang.oaid.DeviceID import com.github.gzuliyujiang.oaid.DeviceIdentifier import com.github.gzuliyujiang.oaid.IGetter +import com.google.gson.Gson import com.jakewharton.processphoenix.ProcessPhoenix import com.orhanobut.logger.Logger import com.stripe.android.PaymentConfiguration import com.tencent.mmkv.MMKV import com.yingmao.clash.R +import com.yingmao.clash.act.SplashActivity.Companion.InviteCode +import com.yingmao.clash.act.SplashActivity.InviteData import com.yingmao.clash.conf.Constants import com.yingmao.clash.entity.UserData import com.yingmao.clash.util.CrashCatchHandler @@ -110,7 +117,7 @@ class MainApplication : Application() { mainApplication, "pk_live_51Nkl6vLWP3xWXY4LfXtdMtXzHazv6pav2rH1p1BfICeh5meGGjglExiw4GgmSzWO7NptEM1c549Fe11zRy9nCfxs009zEwLpXP" ) -// OpenInstall.preInit(mainApplication) + OpenInstall.preInit(mainApplication) } } diff --git a/app/src/main/libs/OpenInstall.jar b/app/src/main/libs/OpenInstall.jar new file mode 100644 index 0000000..6d48a06 Binary files /dev/null and b/app/src/main/libs/OpenInstall.jar differ diff --git a/build.gradle.kts b/build.gradle.kts index 831595a..71600b6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -93,7 +93,7 @@ subprojects { } productFlavors { flavorDimensions("feature") - create("3333") { + create("8279") { isDefault = true dimension = flavorDimensionList[0] buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")") @@ -101,7 +101,7 @@ subprojects { buildConfigField("boolean", "is_back_cn", "false") buildConfigField("String", "applicationId", "\"com.jsq.wufu\"") buildConfigField("String", "service_url", "\"https://api.yijianlianjsq.com/\"") - buildConfigField("String", "productId", "\"3333\"") + buildConfigField("String", "productId", "\"8279\"") manifestPlaceholders( mapOf( "APP_NAME" to "@string/wf", @@ -112,7 +112,7 @@ subprojects { } sourceSets { - getByName("3333") { + getByName("8279") { java.srcDirs("src/foss/java") } }