From ed7ba9068382a522a35f1671a08ff8ec2865648d Mon Sep 17 00:00:00 2001 From: 11111 <1364007522@qq.com> Date: Sat, 27 Dec 2025 14:59:55 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=9B=B4=E6=94=B9VPN=E6=9C=AA=E8=8E=B7?= =?UTF-8?q?=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clash/fragment/home/HomeFragment.kt | 12 +- .../clash/fragment/setting/SettingFragment.kt | 2 +- build.gradle.kts | 225 +----------------- 3 files changed, 10 insertions(+), 229 deletions(-) diff --git a/app/src/main/java/com/yingmao/clash/fragment/home/HomeFragment.kt b/app/src/main/java/com/yingmao/clash/fragment/home/HomeFragment.kt index b8b10b9..90788a9 100644 --- a/app/src/main/java/com/yingmao/clash/fragment/home/HomeFragment.kt +++ b/app/src/main/java/com/yingmao/clash/fragment/home/HomeFragment.kt @@ -446,23 +446,23 @@ open class HomeFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispa withContext(Dispatchers.Main){ hideLoading() stateChanged(CLASH_STOP, false) + ivAccelerate.setImageResource(R.mipmap.yjl_home_clink_bg) RxToast.info(resources.getString(R.string.vpnStartingError)) AppLog.i("NewAccFragment", "vpnRequest::VPN权限点击取消") } } } else { + withContext(Dispatchers.Main) { + tvClick.text=resources.getString(R.string.Accelerating) + ivAccelerate.setImageResource(R.mipmap.yjl_home_clink_select_bg) + hideLoading() + } accelerateViewModel.appStartupStatus() } } catch (e: Exception) { stopUTimer() e.printStackTrace() } - withContext(Dispatchers.Main) { - tvClick.text=resources.getString(R.string.Accelerating) - ivAccelerate.setImageResource(R.mipmap.yjl_home_clink_select_bg) - hideLoading() -// checkGlo() - } } } diff --git a/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt b/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt index 509cfc2..a8927fe 100644 --- a/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt +++ b/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt @@ -226,7 +226,7 @@ class SettingFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispatc settingPageList.add(singItem) settingPageList.add(serviceTermsItem) settingPageList.add(sourceSwitchItem) - settingPageList.add(upLoadData) +// settingPageList.add(upLoadData) settingPageList.add(privacyPolicyItem) settingPageList.add(initializationItem) settingPageList.add(customItem) diff --git a/build.gradle.kts b/build.gradle.kts index 18035cb..66f7c76 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -93,7 +93,7 @@ subprojects { } productFlavors { flavorDimensions("feature") - create("0000") { + create("0168") { 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", "\"0000\"") + buildConfigField("String", "productId", "\"0168\"") manifestPlaceholders( mapOf( "APP_NAME" to "@string/wf", @@ -109,228 +109,9 @@ subprojects { ) ) } - create("1111") { - isDefault = true - dimension = flavorDimensionList[0] - buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")") - buildConfigField("boolean", "is_free", "false") - buildConfigField("boolean", "is_back_cn", "false") - buildConfigField("String", "applicationId", "\"com.jsq.wufu\"") - buildConfigField("String", "service_url", "\"https://api.yijianlianjsq.com/\"") - buildConfigField("String", "productId", "\"1111\"") - manifestPlaceholders( - mapOf( - "APP_NAME" to "@string/wf", - "APP_ICON" to "@mipmap/oneclickconnection" - ) - ) - } - create("6666") { - isDefault = true - dimension = flavorDimensionList[0] - buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")") - buildConfigField("boolean", "is_free", "false") - buildConfigField("boolean", "is_back_cn", "false") - buildConfigField("String", "applicationId", "\"com.jsq.wufu\"") - buildConfigField("String", "service_url", "\"https://api.yijianlianjsq.com/\"") - buildConfigField("String", "productId", "\"6666\"") - manifestPlaceholders( - mapOf( - "APP_NAME" to "@string/wf", - "APP_ICON" to "@mipmap/oneclickconnection" - ) - ) - } - create("7077") { - isDefault = true - dimension = flavorDimensionList[0] - buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")") - buildConfigField("boolean", "is_free", "false") - buildConfigField("boolean", "is_back_cn", "false") - buildConfigField("String", "applicationId", "\"com.jsq.wufu\"") - buildConfigField("String", "service_url", "\"https://api.yijianlianjsq.com/\"") - buildConfigField("String", "productId", "\"7077\"") - manifestPlaceholders( - mapOf( - "APP_NAME" to "@string/wf", - "APP_ICON" to "@mipmap/oneclickconnection" - ) - ) - } - - create("5555") { - isDefault = true - dimension = flavorDimensionList[0] - buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")") - buildConfigField("boolean", "is_free", "false") - buildConfigField("boolean", "is_back_cn", "false") - buildConfigField("String", "applicationId", "\"com.jsq.wufu\"") - buildConfigField("String", "service_url", "\"https://api.yijianlianjsq.com/\"") - buildConfigField("String", "productId", "\"5555\"") - manifestPlaceholders( - mapOf( - "APP_NAME" to "@string/wf", - "APP_ICON" to "@mipmap/oneclickconnection" - ) - ) - } - - create("2222") { - isDefault = true - dimension = flavorDimensionList[0] - buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")") - buildConfigField("boolean", "is_free", "false") - buildConfigField("boolean", "is_back_cn", "false") - buildConfigField("String", "applicationId", "\"com.jsq.wufu\"") - buildConfigField("String", "service_url", "\"https://api.yijianlianjsq.com/\"") - buildConfigField("String", "productId", "\"2222\"") - manifestPlaceholders( - mapOf( - "APP_NAME" to "@string/wf", - "APP_ICON" to "@mipmap/oneclickconnection" - ) - ) - } - - create("9999") { - isDefault = true - dimension = flavorDimensionList[0] - buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")") - buildConfigField("boolean", "is_free", "false") - buildConfigField("boolean", "is_back_cn", "false") - buildConfigField("String", "applicationId", "\"com.jsq.wufu\"") - buildConfigField("String", "service_url", "\"https://api.yijianlianjsq.com/\"") - buildConfigField("String", "productId", "\"9999\"") - manifestPlaceholders( - mapOf( - "APP_NAME" to "@string/wf", - "APP_ICON" to "@mipmap/oneclickconnection" - ) - ) - } - - create("11111") { - isDefault = true - dimension = flavorDimensionList[0] - buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")") - buildConfigField("boolean", "is_free", "false") - buildConfigField("boolean", "is_back_cn", "false") - buildConfigField("String", "applicationId", "\"com.jsq.wufu\"") - buildConfigField("String", "service_url", "\"https://api.yijianlianjsq.com/\"") - buildConfigField("String", "productId", "\"11111\"") - manifestPlaceholders( - mapOf( - "APP_NAME" to "@string/wf", - "APP_ICON" to "@mipmap/oneclickconnection" - ) - ) - } - - create("2211") { - isDefault = true - dimension = flavorDimensionList[0] - buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")") - buildConfigField("boolean", "is_free", "false") - buildConfigField("boolean", "is_back_cn", "false") - buildConfigField("String", "applicationId", "\"com.jsq.wufu\"") - buildConfigField("String", "service_url", "\"https://api.yijianlianjsq.com/\"") - buildConfigField("String", "productId", "\"2211\"") - manifestPlaceholders( - mapOf( - "APP_NAME" to "@string/wf", - "APP_ICON" to "@mipmap/oneclickconnection" - ) - ) - } - create("8088") { - isDefault = true - dimension = flavorDimensionList[0] - buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")") - buildConfigField("boolean", "is_free", "false") - buildConfigField("boolean", "is_back_cn", "false") - buildConfigField("String", "applicationId", "\"com.jsq.wufu\"") - buildConfigField("String", "service_url", "\"https://api.yijianlianjsq.com/\"") - buildConfigField("String", "productId", "\"8088\"") - manifestPlaceholders( - mapOf( - "APP_NAME" to "@string/wf", - "APP_ICON" to "@mipmap/oneclickconnection" - ) - ) - } - - create("0214") { - isDefault = true - dimension = flavorDimensionList[0] - buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")") - buildConfigField("boolean", "is_free", "false") - buildConfigField("boolean", "is_back_cn", "false") - buildConfigField("String", "applicationId", "\"com.jsq.wufu\"") - buildConfigField("String", "service_url", "\"https://api.yijianlianjsq.com/\"") - buildConfigField("String", "productId", "\"0214\"") - manifestPlaceholders( - mapOf( - "APP_NAME" to "@string/wf", - "APP_ICON" to "@mipmap/oneclickconnection" - ) - ) - } - - create("9099") { - isDefault = true - dimension = flavorDimensionList[0] - buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")") - buildConfigField("boolean", "is_free", "false") - buildConfigField("boolean", "is_back_cn", "false") - buildConfigField("String", "applicationId", "\"com.jsq.wufu\"") - buildConfigField("String", "service_url", "\"https://api.yijianlianjsq.com/\"") - buildConfigField("String", "productId", "\"9099\"") - manifestPlaceholders( - mapOf( - "APP_NAME" to "@string/wf", - "APP_ICON" to "@mipmap/oneclickconnection" - ) - ) - } - create("7777") { - isDefault = true - dimension = flavorDimensionList[0] - buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")") - buildConfigField("boolean", "is_free", "false") - buildConfigField("boolean", "is_back_cn", "false") - buildConfigField("String", "applicationId", "\"com.jsq.wufu\"") - buildConfigField("String", "service_url", "\"https://api.yijianlianjsq.com/\"") - buildConfigField("String", "productId", "\"7777\"") - manifestPlaceholders( - mapOf( - "APP_NAME" to "@string/wf", - "APP_ICON" to "@mipmap/oneclickconnection" - ) - ) - } - create("2210") { - isDefault = true - dimension = flavorDimensionList[0] - buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")") - buildConfigField("boolean", "is_free", "false") - buildConfigField("boolean", "is_back_cn", "false") - buildConfigField("String", "applicationId", "\"com.jsq.wufu\"") - buildConfigField("String", "service_url", "\"https://api.yijianlianjsq.com/\"") - buildConfigField("String", "productId", "\"2210\"") - manifestPlaceholders( - mapOf( - "APP_NAME" to "@string/wf", - "APP_ICON" to "@mipmap/oneclickconnection" - ) - ) - } - - - - } sourceSets { - getByName("2211") { + getByName("0168") { java.srcDirs("src/foss/java") } } From 2a81375282890f539621b409899f3eba438b3c4a Mon Sep 17 00:00:00 2001 From: 11111 <1364007522@qq.com> Date: Mon, 29 Dec 2025 17:45:29 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E5=85=B3=E9=97=AD=E6=BA=90=E5=88=87?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/yingmao/clash/act/SplashActivity.kt | 2 +- build.gradle.kts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) 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 cee7254..7ad3dba 100644 --- a/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt @@ -195,7 +195,7 @@ class SplashActivity : BaseActivity() { } // //对源地址加密操作 // val byteArrayToHexStr = -// AESUtil.byteArrayToHexStr(AESUtil.encrypt("https://api.yijianlianjsq.com+https://yjl.kuaifei.net+https://api.onetouchjsq.com+https://yjlapi.anxuan009.com+https://yjl.jimao.xyz")) +// AESUtil.byteArrayToHexStr(AESUtil.encrypt("https://api.yijianlianjsq.com+https://api.onetouchjsq.com+https://yjlapi.anxuan009.com")) // android.util.Log.i("AAAAAAAAAAA","data:::"+byteArrayToHexStr) } diff --git a/build.gradle.kts b/build.gradle.kts index 66f7c76..7da4385 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -93,7 +93,7 @@ subprojects { } productFlavors { flavorDimensions("feature") - create("0168") { + create("7788") { 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", "\"0168\"") + buildConfigField("String", "productId", "\"7788\"") manifestPlaceholders( mapOf( "APP_NAME" to "@string/wf", @@ -111,7 +111,7 @@ subprojects { } } sourceSets { - getByName("0168") { + getByName("7788") { java.srcDirs("src/foss/java") } } From 39e847335c16d47884244ee99f10acf4e0b9dc1a Mon Sep 17 00:00:00 2001 From: 11111 <1364007522@qq.com> Date: Tue, 30 Dec 2025 20:35:41 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E4=B8=80=E9=94=AE=E8=BF=9E=20=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E4=B8=8A=E4=BC=A0=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yingmao/clash/act/MainActivity.kt | 23 +++-- .../clash/fragment/home/HomeFragment.kt | 30 ++++++- .../clash/fragment/setting/SettingFragment.kt | 72 +++++----------- .../java/com/yingmao/clash/levellog/AppLog.kt | 2 +- .../yingmao/clash/levellog/LogcatService.kt | 83 +------------------ .../main/java/com/yingmao/clash/util/Utils.kt | 4 + app/src/main/res/values/strings.xml | 4 +- 7 files changed, 74 insertions(+), 144 deletions(-) diff --git a/app/src/main/java/com/yingmao/clash/act/MainActivity.kt b/app/src/main/java/com/yingmao/clash/act/MainActivity.kt index 9800686..5045069 100644 --- a/app/src/main/java/com/yingmao/clash/act/MainActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/MainActivity.kt @@ -46,7 +46,6 @@ import com.yingmao.clash.base.BaseActivity import com.yingmao.clash.conf.BZYConstants import com.yingmao.clash.conf.Conf import com.yingmao.clash.entity.CheckLoginRsp -import com.yingmao.clash.entity.NodeGroupItem import com.yingmao.clash.fragment.home.HomeFragment import com.yingmao.clash.fragment.setting.SettingFragment import com.yingmao.clash.fragment.vip.vipFragment @@ -130,6 +129,7 @@ class MainActivity : BaseActivity() { private var mainBroadcastReceiver: BroadcastReceiver? = null val trafficStatisticsData = MutableLiveData() suspend fun setSub2(url: String) { + try { profileBinder?.let { pm -> pm.queryAll().forEach { itemPro -> if (itemPro.name != Conf.getClashConfName(MainApplication.getApp()?.applicationContext)) { @@ -186,6 +186,9 @@ class MainActivity : BaseActivity() { } } } + }catch (e: Exception){ + AppLog.e("HomeFragment", "setSub2() Error===>",e) + } } } @@ -233,8 +236,6 @@ class MainActivity : BaseActivity() { requestPermissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS) } } - //初始进入 将日志采集开关变为不开启 - MMKV.defaultMMKV().encode(BZYConstants.BehaviorLogSwitch, false) } inner class NodeListBR : BroadcastReceiver() { @@ -285,7 +286,10 @@ class MainActivity : BaseActivity() { aivHome.setImageResource(R.drawable.yjl_home_page_choose) aivCenter.setImageResource(R.drawable.yjl_user_page) aivVip.setImageResource(R.drawable.yjl_vip_page) - checkVPN() + if(clashRunning){ + checkVPN() + } + } aivCenter.setOnClickListener { @@ -294,7 +298,9 @@ class MainActivity : BaseActivity() { aivHome.setImageResource(R.drawable.yjl_home_page) aivCenter.setImageResource(R.drawable.yjl_user_page_choose) aivVip.setImageResource(R.drawable.yjl_vip_page) - checkVPN() + if(clashRunning){ + checkVPN() + } } aivVip.setOnClickListener { @@ -338,6 +344,7 @@ class MainActivity : BaseActivity() { val data = httpStatus.rsp as SubscriptionRsp if (data.code != "1000") { RxToast.error(resources.getString(R.string.NodeAcquisitionFailed) + "${data.msg}") + AppLog.i("MainActivity", "httpSuccess GET_AIRNODES===>${data.msg}") } data.data.let { netSubUrl -> if (netSubUrl.isNotEmpty()) { @@ -515,6 +522,7 @@ class MainActivity : BaseActivity() { when (httpStatus.reqType) { HttpReqType.HEARTBEAT -> { Logger.d("心跳失败") + AppLog.i("HomeFragment", " httpFailure HEARTBEAT===>${httpStatus.msg}") if (5 <= HEART_BEAT_FAILURE_FREQUENCY) { HEART_BEAT_FAILURE_FREQUENCY = 0 Logger.d("心跳失败次数超过10次,退出登录") @@ -524,15 +532,18 @@ class MainActivity : BaseActivity() { } HttpReqType.CHECK_LOGIN -> { + AppLog.i("HomeFragment", " httpFailure CHECK_LOGIN===>${httpStatus.msg}") payResultLoading?.dismiss() RxToast.error(resources.getString(R.string.QueryFailed)+ httpStatus.msg) } HttpReqType.GET_AIRNODES -> { + AppLog.i("HomeFragment", " httpFailure GET_AIRNODES===>${httpStatus.msg}") Logger.e("获取节点异常:${httpStatus.msg}") } HttpReqType.VIPSIGN -> { + AppLog.i("HomeFragment", " httpFailure VIPSIGN===>${httpStatus.msg}") RxToast.error(resources.getString(R.string.CheckFailed) + httpStatus.msg) } @@ -806,7 +817,7 @@ class MainActivity : BaseActivity() { } fun checkVPN(){ val behaviorLogSwitch = - MMKV.defaultMMKV().decodeBool(BZYConstants.BehaviorLogSwitch, false) + MMKV.defaultMMKV().decodeBool(BZYConstants.BehaviorLogSwitch, true) if(behaviorLogSwitch){ launch(Dispatchers.IO) { val isVPN =Utils.isVpnActive(this@MainActivity) diff --git a/app/src/main/java/com/yingmao/clash/fragment/home/HomeFragment.kt b/app/src/main/java/com/yingmao/clash/fragment/home/HomeFragment.kt index 90788a9..83530a5 100644 --- a/app/src/main/java/com/yingmao/clash/fragment/home/HomeFragment.kt +++ b/app/src/main/java/com/yingmao/clash/fragment/home/HomeFragment.kt @@ -12,7 +12,6 @@ import android.os.Build import android.os.Bundle import android.text.TextUtils import android.view.View -import android.view.WindowManager import android.widget.FrameLayout import android.widget.ImageView import android.widget.LinearLayout @@ -30,8 +29,10 @@ import androidx.lifecycle.lifecycleScope import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.customview.customView import com.afollestad.materialdialogs.customview.getCustomView +import com.cncat.vpn.common.compat.startForegroundServiceCompat import com.cncat.vpn.common.constants.Intents import com.cncat.vpn.common.log.Log +import com.cncat.vpn.common.util.intent import com.cncat.vpn.core.Clash import com.cncat.vpn.core.model.TunnelState import com.cncat.vpn.service.model.Profile @@ -50,12 +51,15 @@ import com.yingmao.clash.act.MainActivity.Companion.newUuid import com.yingmao.clash.act.MainActivity.Companion.profileBinder import com.yingmao.clash.act.MainActivity.Companion.subUrl import com.yingmao.clash.act.NodeGroupActivity +import com.yingmao.clash.app.MainApplication import com.yingmao.clash.conf.BZYConstants +import com.yingmao.clash.conf.BZYConstants.Companion.MMKV_KEY_REMEMBER_USERNAME import com.yingmao.clash.conf.Conf import com.yingmao.clash.entity.NodeGroupItem import com.yingmao.clash.fragment.AccelerateViewModel import com.yingmao.clash.fragment.BaseFragment import com.yingmao.clash.levellog.AppLog +import com.yingmao.clash.levellog.LogcatService import com.yingmao.clash.net.http.HttpReqType import com.yingmao.clash.net.http.HttpStatus import com.yingmao.clash.net.http.entity.AppStartupStatus @@ -77,6 +81,7 @@ import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import java.net.URL import java.text.SimpleDateFormat import java.util.Locale import java.util.concurrent.atomic.AtomicInteger @@ -298,7 +303,8 @@ open class HomeFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispa if (connectId != -1) { accelerateViewModel.appStopStatus(connectId) } - + //关闭内核日志采集Service + requireActivity().stopService(LogcatService::class.intent) } rxDialogSureCancel.show() @@ -333,7 +339,8 @@ open class HomeFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispa if(networkAvailable){ showLoading(resources.getString(R.string.Starting), requireContext()) startClash(true) - //开启完毕之后开启定时器, + //开启完成之后开始采集日志 + behaviorLog() }else{ RxToast.error("网络不可用,请打开网络!") AppLog.i("NewAccFragment", "networkAvailable ${networkAvailable}") @@ -913,10 +920,12 @@ open class HomeFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispa when (httpStatus.reqType) { HttpReqType.AppStartupStatus -> { Log.d("AppStartupStatus is Failure ${httpStatus.msg}") + AppLog.i("HomeFragment", " httpFailure AppStartupStatus===>${httpStatus.msg}") } HttpReqType.AppStopStatus -> { Log.d("AppStopStatus is Failure ${httpStatus.msg}") + AppLog.i("HomeFragment", " httpFailure AppStopStatus===>${httpStatus.msg}") } else -> { @@ -1107,4 +1116,19 @@ open class HomeFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispa } return mList } + fun behaviorLog(){ + //开启采集之后点击采集 + MMKV.defaultMMKV().encode(BZYConstants.BehaviorLogSwitch, true) + val selectedName = + MMKV.defaultMMKV().decodeString(MMKV_KEY_REMEMBER_USERNAME, "") + val equipmentModel = Utils.getEquipmentModel() + val validPeriod = MMKV.defaultMMKV().decodeLong(BZYConstants.MMKV_KEY_VPN_VALID_PERIOD) + AppLog.i("HomeFragment", "selectedName===>${selectedName}") + AppLog.i("HomeFragment", "用户有效时长===>${validPeriod}") + AppLog.i("HomeFragment", "用户是否过期===>${checkExpire()}") + AppLog.i("HomeFragment", "机型数据===>${equipmentModel}") + AppLog.i("HomeFragment", "订阅连接地址===>${subUrl}") + AppLog.i("HomeFragment", "OAID===>${MainApplication.Companion.OAID}") + requireContext().startService(LogcatService::class.intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt b/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt index a8927fe..693163e 100644 --- a/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt +++ b/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt @@ -8,8 +8,6 @@ import android.content.Context import android.content.Intent import android.os.Build import android.os.Bundle -import android.os.Environment -import android.provider.Settings import android.text.TextUtils import android.view.View import android.widget.FrameLayout @@ -22,8 +20,6 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.customview.customView import com.alibaba.sdk.android.oss.ClientException import com.alibaba.sdk.android.oss.OSSClient import com.alibaba.sdk.android.oss.ServiceException @@ -33,7 +29,6 @@ import com.alibaba.sdk.android.oss.common.auth.OSSStsTokenCredentialProvider import com.alibaba.sdk.android.oss.internal.OSSAsyncTask import com.alibaba.sdk.android.oss.model.PutObjectRequest import com.alibaba.sdk.android.oss.model.PutObjectResult -import com.cncat.vpn.common.compat.startForegroundServiceCompat import com.cncat.vpn.common.log.Log import com.cncat.vpn.common.util.intent import com.hjq.permissions.OnPermissionCallback @@ -47,21 +42,19 @@ import com.yingmao.clash.act.ActivityActivity import com.yingmao.clash.act.AgreementAndPrivacyActivity import com.yingmao.clash.act.BandPhoneActivity import com.yingmao.clash.act.MainActivity -import com.yingmao.clash.act.MainActivity.Companion.newUuid import com.yingmao.clash.act.MainActivity.Companion.profileBinder import com.yingmao.clash.act.MainActivity.Companion.setSub2 import com.yingmao.clash.act.MainActivity.Companion.subUrl -import com.yingmao.clash.act.MainActivity.Companion.trafficStatisticsData import com.yingmao.clash.act.SettingActivity import com.yingmao.clash.act.ShareActivity import com.yingmao.clash.act.SplashHelper import com.yingmao.clash.app.MainApplication -import com.yingmao.clash.levellog.LogcatService import com.yingmao.clash.conf.BZYConstants import com.yingmao.clash.entity.SettingPageBean import com.yingmao.clash.fragment.BaseFragment import com.yingmao.clash.fragment.home.HomeFragment.Companion.clashRunning import com.yingmao.clash.levellog.AppLog +import com.yingmao.clash.levellog.LogcatService import com.yingmao.clash.net.http.HttpReqType import com.yingmao.clash.net.http.HttpStatus import com.yingmao.clash.net.http.entity.ParamData @@ -184,24 +177,11 @@ class SettingFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispatc R.drawable.switching_item_tag, ) - val logDirParent = "applogs" - val logDir = File(requireActivity().filesDir, logDirParent) - val processName =getProcessName() - val logFile = File(logDir, "$processName.log") - val upLoadData = if(logFile.exists()){ - SettingPageBean( - 7, - "上传日志", - R.drawable.user_uplog_icon, - ) - }else{ - SettingPageBean( - 7, - "采集日志", - R.drawable.user_uplog_icon, - ) - } - + val upLoadData =SettingPageBean( + 7, + "上传日志", + R.drawable.user_uplog_icon, + ) val privacyPolicyItem= SettingPageBean( 8, resources.getString(R.string.PrivacyPolicy), @@ -226,7 +206,7 @@ class SettingFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispatc settingPageList.add(singItem) settingPageList.add(serviceTermsItem) settingPageList.add(sourceSwitchItem) -// settingPageList.add(upLoadData) + settingPageList.add(upLoadData) settingPageList.add(privacyPolicyItem) settingPageList.add(initializationItem) settingPageList.add(customItem) @@ -294,30 +274,21 @@ class SettingFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispatc } 7->{ - if(itemData.name=="上传日志"){ - showLoading(resources.getString(R.string.UploadingInProgress), requireActivity()) - mainAtyVM.getUploadParameters() - settingPageList[itemData.type-1].name="采集日志" - settingAdapter.notifyItemChanged(itemData.type-1) - MMKV.defaultMMKV().encode(BZYConstants.BehaviorLogSwitch, false) - requireActivity().stopService(LogcatService::class.intent) + val getIsGlo= MMKV.defaultMMKV().decodeBool(BZYConstants.MMKV_KEY_GLOBAL_MODEL, false) + if(clashRunning&&getIsGlo){ + RxToast.info("全局模式暂不支持上传日志,请切换到全局模式或关闭加速!") }else{ - MaterialDialog(requireActivity()).show { - this.cancelable(true) - cornerRadius(res = R.dimen.dp_15) - customView( - R.layout.logsings_dialog_layout, - scrollable = false, - noVerticalPadding = true, - horizontalPadding = false - ) - val tvSure = findViewById(R.id.tvSure) - tvSure.setOnClickListener { - settingPageList[itemData.type-1].name="上传日志" - settingAdapter.notifyItemChanged(itemData.type-1) - requireActivity().startForegroundServiceCompat(LogcatService::class.intent) - dismiss() - } + + val logDirParent = "applogs" + val logDir = File(requireActivity().filesDir, logDirParent) + val processName =getProcessName() + val logFile = File(logDir, "$processName.log") + if(logFile.exists()){ + showLoading(resources.getString(R.string.UploadingInProgress), requireActivity()) + mainAtyVM.getUploadParameters() + requireActivity().stopService(LogcatService::class.intent) + }else{ + RxToast.info("暂时未采集到相关日志数据") } } } @@ -873,7 +844,6 @@ class SettingFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispatc hideLoading() val deleteFile = DataUtils.deleteFile(filePath) Log.i("PutObjectRequest deleteFile ${deleteFile}") - AppLog.i("LogcatService", "删除删除成功deleteFile::${deleteFile}") MMKV.defaultMMKV().encode(BZYConstants.BehaviorLogSwitch, false) RxToast.info(resources.getString(R.string.BehaviorLogSuccessfully)) } diff --git a/app/src/main/java/com/yingmao/clash/levellog/AppLog.kt b/app/src/main/java/com/yingmao/clash/levellog/AppLog.kt index f59a154..c4467f6 100644 --- a/app/src/main/java/com/yingmao/clash/levellog/AppLog.kt +++ b/app/src/main/java/com/yingmao/clash/levellog/AppLog.kt @@ -28,7 +28,7 @@ object AppLog { tr: Throwable? ) { val behaviorLogSwitch = - MMKV.defaultMMKV().decodeBool(BZYConstants.BehaviorLogSwitch, false) + MMKV.defaultMMKV().decodeBool(BZYConstants.BehaviorLogSwitch, true) if(behaviorLogSwitch){ LogDispatcher.enqueue( LogEvent( diff --git a/app/src/main/java/com/yingmao/clash/levellog/LogcatService.kt b/app/src/main/java/com/yingmao/clash/levellog/LogcatService.kt index b604a6f..f782d47 100644 --- a/app/src/main/java/com/yingmao/clash/levellog/LogcatService.kt +++ b/app/src/main/java/com/yingmao/clash/levellog/LogcatService.kt @@ -1,6 +1,5 @@ package com.yingmao.clash.levellog -import android.app.PendingIntent import android.app.Service import android.content.ComponentName import android.content.Intent @@ -11,25 +10,12 @@ import android.os.IBinder import android.os.IInterface import android.util.Log import androidx.annotation.RequiresApi -import androidx.core.app.NotificationChannelCompat -import androidx.core.app.NotificationCompat -import androidx.core.app.NotificationManagerCompat -import com.cncat.vpn.common.compat.getColorCompat -import com.cncat.vpn.common.compat.pendingIntentFlags -import com.cncat.vpn.common.compat.startForegroundCompat import com.cncat.vpn.common.util.intent import com.cncat.vpn.core.model.LogMessage import com.cncat.vpn.service.RemoteService import com.cncat.vpn.service.remote.ILogObserver import com.cncat.vpn.service.remote.IRemoteService import com.cncat.vpn.service.remote.unwrap -import com.tencent.mmkv.MMKV -import com.yingmao.clash.R -import com.yingmao.clash.act.MainActivity -import com.yingmao.clash.act.SettingActivity -import com.yingmao.clash.app.MainApplication -import com.yingmao.clash.conf.BZYConstants -import com.yingmao.clash.util.Utils import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.NonCancellable @@ -46,7 +32,6 @@ class LogcatService : Service(), CoroutineScope by CoroutineScope(Dispatchers.De Log.i("LogcatServiceClose","onServiceDisconnected::${name}") stopSelf() } - @RequiresApi(Build.VERSION_CODES.KITKAT) override fun onServiceConnected(name: ComponentName?, service: IBinder?) { Log.i("LogcatServiceConnect","onServiceConnected::${name}") @@ -56,25 +41,13 @@ class LogcatService : Service(), CoroutineScope by CoroutineScope(Dispatchers.De override fun onCreate() { super.onCreate() - - running = true - - createNotificationChannel() - - showNotification() - bindService(RemoteService::class.intent, connection, BIND_AUTO_CREATE) } override fun onDestroy() { cancel() - unbindService(connection) - - stopForeground(true) - - running = false - + stopSelf() super.onDestroy() } @@ -100,14 +73,6 @@ class LogcatService : Service(), CoroutineScope by CoroutineScope(Dispatchers.De val channel = Channel(CACHE_CAPACITY) try { - MMKV.defaultMMKV().encode(BZYConstants.Companion.BehaviorLogSwitch, true) - val selectedName = - MMKV.defaultMMKV().decodeString(BZYConstants.Companion.NODE_SELECTED_NAME_KEY, "") - val equipmentModel = Utils.getEquipmentModel() - AppLog.i("LogcatService", "selectedName===>${selectedName}") - AppLog.i("LogcatService", "用户是否过期===>${checkExpire()}") - AppLog.i("LogcatService", "机型数据===>${equipmentModel}") - AppLog.i("LogcatService", "OAID===>${MainApplication.Companion.OAID}") val observer = object : ILogObserver { override fun newItem(log: LogMessage) { channel.trySend(log) @@ -117,6 +82,7 @@ class LogcatService : Service(), CoroutineScope by CoroutineScope(Dispatchers.De while (isActive) { val msg = channel.receive() AppLog.i("LogcatServiceMsg", "core msg===>${msg}") + Log.i("LogcatServiceMsg","core msg===>${msg}") } } catch (e: IOException) { Log.e("Write log file: $e", e.toString()) @@ -131,52 +97,7 @@ class LogcatService : Service(), CoroutineScope by CoroutineScope(Dispatchers.De } } - private fun createNotificationChannel() { - NotificationManagerCompat.from(this) - .createNotificationChannel( - NotificationChannelCompat.Builder( - CHANNEL_ID, - NotificationManagerCompat.IMPORTANCE_DEFAULT - ).setName(getString(R.string.clash_logcat)).build() - ) - } - - private fun showNotification() { - val notification = NotificationCompat - .Builder(this, CHANNEL_ID) - .setSmallIcon(R.mipmap.oneclickconnection) - .setColor(getColorCompat(R.color.color_clash)) - .setContentTitle(getString(R.string.clash_logcat)) - .setContentText("采集中") - .setContentIntent( - PendingIntent.getActivity( - this, - R.id.nf_logcat_status, - MainActivity::class.intent - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP), - pendingIntentFlags(PendingIntent.FLAG_UPDATE_CURRENT) - ) - ) - .build() - - startForegroundCompat(R.id.nf_logcat_status, notification) - } - companion object { - private const val CHANNEL_ID = "clash_logcat_channel_id" private const val CACHE_CAPACITY = 129 - - var running: Boolean = false - } - private fun checkExpire(): Boolean { - val validPeriod = MMKV.defaultMMKV().decodeLong(BZYConstants.Companion.MMKV_KEY_VPN_VALID_PERIOD) - if (validPeriod > 0) { - val nowTime = System.currentTimeMillis(); - com.cncat.vpn.common.log.Log.d("validPeriod==>$validPeriod, nowTime==>$nowTime") - if (validPeriod >= nowTime) { - return false - } - } - return true } } \ No newline at end of file diff --git a/app/src/main/java/com/yingmao/clash/util/Utils.kt b/app/src/main/java/com/yingmao/clash/util/Utils.kt index a1b546e..6c46531 100644 --- a/app/src/main/java/com/yingmao/clash/util/Utils.kt +++ b/app/src/main/java/com/yingmao/clash/util/Utils.kt @@ -15,8 +15,12 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.RequiresApi import com.yingmao.clash.levellog.AppLog +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import okhttp3.OkHttpClient import okhttp3.Request +import org.json.JSONObject +import java.net.Inet4Address import java.net.NetworkInterface import java.nio.charset.StandardCharsets import java.security.MessageDigest diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 530b960..94ae3be 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -492,8 +492,8 @@ 模式切换中 模式切换成功 - 行为日志上传成功! - 行为日志上传失败! + 日志上传成功! + 日志上传失败! VPN权限未允许 请设置允许! 请关闭加速后在切换节点 \ No newline at end of file From c8c9885837abfd65089328ecb6f6a036c9e22e7f Mon Sep 17 00:00:00 2001 From: 11111 <1364007522@qq.com> Date: Tue, 30 Dec 2025 20:49:33 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=B8=80=E9=94=AE=E8=BF=9E=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=A5=E5=BF=97=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/yingmao/clash/levellog/LogcatService.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/yingmao/clash/levellog/LogcatService.kt b/app/src/main/java/com/yingmao/clash/levellog/LogcatService.kt index f782d47..2f5c4ad 100644 --- a/app/src/main/java/com/yingmao/clash/levellog/LogcatService.kt +++ b/app/src/main/java/com/yingmao/clash/levellog/LogcatService.kt @@ -82,7 +82,6 @@ class LogcatService : Service(), CoroutineScope by CoroutineScope(Dispatchers.De while (isActive) { val msg = channel.receive() AppLog.i("LogcatServiceMsg", "core msg===>${msg}") - Log.i("LogcatServiceMsg","core msg===>${msg}") } } catch (e: IOException) { Log.e("Write log file: $e", e.toString()) From 20cd429db0aa61582078e21c2ebdf8628b287e9d Mon Sep 17 00:00:00 2001 From: 11111 <1364007522@qq.com> Date: Wed, 31 Dec 2025 11:36:39 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E6=9B=B4=E6=8D=A2=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yingmao/clash/fragment/setting/SettingFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt b/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt index 693163e..ab6ce12 100644 --- a/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt +++ b/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt @@ -276,7 +276,7 @@ class SettingFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispatc 7->{ val getIsGlo= MMKV.defaultMMKV().decodeBool(BZYConstants.MMKV_KEY_GLOBAL_MODEL, false) if(clashRunning&&getIsGlo){ - RxToast.info("全局模式暂不支持上传日志,请切换到全局模式或关闭加速!") + RxToast.info("全局模式暂不支持上传日志,请切换到智能模式或关闭加速!") }else{ val logDirParent = "applogs" From ac3d72343a24304f28da9b43975d086c764e3b4a Mon Sep 17 00:00:00 2001 From: 11111 <1364007522@qq.com> Date: Wed, 31 Dec 2025 15:21:58 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=97=A5=E5=BF=97=E9=87=87=E9=9B=86=20?= =?UTF-8?q?=E9=87=87=E9=9B=86=E5=90=AF=E5=8A=A8=E9=A1=B5,=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=A1=B5,=E9=A6=96=E9=A1=B5=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yingmao/clash/act/LoginActivity.kt | 8 +++-- .../com/yingmao/clash/act/MainActivity.kt | 30 +++++++++---------- .../com/yingmao/clash/act/SplashActivity.kt | 13 ++++++++ .../com/yingmao/clash/conf/BZYConstants.kt | 1 - .../clash/fragment/home/HomeFragment.kt | 25 ++++++++-------- .../clash/fragment/setting/SettingFragment.kt | 17 +++++++++-- .../java/com/yingmao/clash/levellog/AppLog.kt | 21 +++++-------- 7 files changed, 70 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/com/yingmao/clash/act/LoginActivity.kt b/app/src/main/java/com/yingmao/clash/act/LoginActivity.kt index 929dce1..3cfc1f9 100644 --- a/app/src/main/java/com/yingmao/clash/act/LoginActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/LoginActivity.kt @@ -17,7 +17,6 @@ import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager import android.widget.* -import androidx.core.content.ContextCompat import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope @@ -51,6 +50,7 @@ import java.io.File import androidx.core.graphics.toColorInt import androidx.core.net.toUri import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.yingmao.clash.levellog.AppLog class LoginActivity : BaseActivity(), View.OnClickListener { private lateinit var loginViewMode: LoginAtyVM @@ -114,7 +114,7 @@ class LoginActivity : BaseActivity(), View.OnClickListener { super.httpSuccess(httpStatus) if (httpStatus.reqType == HttpReqType.LOGIN) { val rsp = httpStatus.rsp - com.cncat.vpn.common.log.Log.d("HttpReqType.LOGIN rsp==>${rsp}") + AppLog.i("SplashActivity", "httpSuccess HttpReqType.LOGIN ${rsp}") if (rsp is LoginRsp) { if (rsp.code == "1000") { val mmkv = MMKV.defaultMMKV() @@ -135,6 +135,7 @@ class LoginActivity : BaseActivity(), View.OnClickListener { } else if (httpStatus.reqType == HttpReqType.CHECK_LOGIN) { hideLoadingDialog() val rsp = httpStatus.rsp + AppLog.i("SplashActivity", "httpSuccess HttpReqType.CHECK_LOGIN ${rsp}") if (rsp is CheckLoginRsp) { if (rsp.code == 0) { rsp.data?.let { MainApplication.setUserInfo(it) } @@ -161,6 +162,7 @@ class LoginActivity : BaseActivity(), View.OnClickListener { } else if (httpStatus.reqType == HttpReqType.GETAPPVERION) { (httpStatus.rsp as AppVersionCheckRsp).let { aver -> com.cncat.vpn.common.log.Log.i("appVersionCheck ==>$aver") + AppLog.i("SplashActivity", "httpSuccess HttpReqType.GETAPPVERION ${aver}") if (aver.code == 200) { aver.data?.let { md -> if (md.isForce) { //强制更新 @@ -182,6 +184,7 @@ class LoginActivity : BaseActivity(), View.OnClickListener { override fun httpFailure(httpStatus: HttpStatus.Failure) { super.httpFailure(httpStatus) if (httpStatus.reqType == HttpReqType.LOGIN) { + AppLog.i("SplashActivity", "httpFailure HttpReqType.LOGIN ${httpStatus.msg}") SplashHelper(splashAtyVM).getHostWithFallback { success -> MainScope().launch { if (success) { @@ -229,6 +232,7 @@ class LoginActivity : BaseActivity(), View.OnClickListener { } } } else if (httpStatus.reqType == HttpReqType.CHECK_LOGIN) { + AppLog.i("SplashActivity", "httpFailure HttpReqType.CHECK_LOGIN ${httpStatus.msg}") if (::rxDialogShapeLoading.isInitialized && rxDialogShapeLoading.isShowing) { rxDialogShapeLoading.cancel() } diff --git a/app/src/main/java/com/yingmao/clash/act/MainActivity.kt b/app/src/main/java/com/yingmao/clash/act/MainActivity.kt index 5045069..be0af5e 100644 --- a/app/src/main/java/com/yingmao/clash/act/MainActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/MainActivity.kt @@ -47,6 +47,7 @@ import com.yingmao.clash.conf.BZYConstants import com.yingmao.clash.conf.Conf import com.yingmao.clash.entity.CheckLoginRsp import com.yingmao.clash.fragment.home.HomeFragment +import com.yingmao.clash.fragment.home.HomeFragment.Companion.clashRunning import com.yingmao.clash.fragment.setting.SettingFragment import com.yingmao.clash.fragment.vip.vipFragment import com.yingmao.clash.levellog.AppLog @@ -89,9 +90,6 @@ import java.util.UUID class MainActivity : BaseActivity() { private lateinit var mainAtyVM: MainAtyVM private var payResultLoading: RxDialogShapeLoading? = null - private val clashRunning: Boolean - get() = Remote.broadcasts.clashRunning - private var timer: Timer? = null private var uTimerTask: TimerTask? = null private var newMainActGlo: Boolean = false @@ -298,6 +296,7 @@ class MainActivity : BaseActivity() { aivHome.setImageResource(R.drawable.yjl_home_page) aivCenter.setImageResource(R.drawable.yjl_user_page_choose) aivVip.setImageResource(R.drawable.yjl_vip_page) + Log.i("AAAAAAAAAAAAAAAAAAA clashRunning${clashRunning}") if(clashRunning){ checkVPN() } @@ -342,6 +341,7 @@ class MainActivity : BaseActivity() { when (httpStatus.reqType) { HttpReqType.GET_AIRNODES -> { val data = httpStatus.rsp as SubscriptionRsp + AppLog.i("SplashActivity", "httpSuccess HttpReqType.GET_AIRNODES ${data}") if (data.code != "1000") { RxToast.error(resources.getString(R.string.NodeAcquisitionFailed) + "${data.msg}") AppLog.i("MainActivity", "httpSuccess GET_AIRNODES===>${data.msg}") @@ -373,6 +373,7 @@ class MainActivity : BaseActivity() { HttpReqType.GetActivity -> { val data = httpStatus.rsp as GetActivityRsp + AppLog.i("SplashActivity", "httpSuccess HttpReqType.GetActivity ${data}") if (data.code == 200) { if (data.data.data.list.isNotEmpty()) { data.data.data.list[0].redirectLink.let { @@ -400,6 +401,7 @@ class MainActivity : BaseActivity() { HttpReqType.CHECK_LOGIN -> { (httpStatus.rsp as CheckLoginRsp).let { checkLoginRsp -> + AppLog.i("SplashActivity", "httpSuccess HttpReqType.CHECK_LOGIN ${checkLoginRsp}") if (checkLoginRsp.code == 0) { val mmkv = MMKV.defaultMMKV() val oldExpireTime = @@ -433,6 +435,7 @@ class MainActivity : BaseActivity() { HttpReqType.PHDOWNLOADURL -> { (httpStatus.rsp as PhDownloadUrlRsp).let { + AppLog.i("SplashActivity", "httpSuccess HttpReqType.PHDOWNLOADURL ${it}") if (it.code == 1000) { val lastNotice = MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_NOTICE_READ, "") @@ -467,6 +470,7 @@ class MainActivity : BaseActivity() { HttpReqType.EXPENSES_RECORD ->{ if(httpStatus.rsp is ExpensesRecordRsp){ httpStatus.rsp.let { expensesRecordRsp -> + AppLog.i("SplashActivity", "httpSuccess HttpReqType.EXPENSES_RECORD ${expensesRecordRsp}") if(expensesRecordRsp.code == "1000"){ if(expensesRecordRsp.data != null) { val expensesRecordList = expensesRecordRsp.data.expensesRecords @@ -504,6 +508,7 @@ class MainActivity : BaseActivity() { } HttpReqType.Report->{ (httpStatus.rsp as AppVersionCheckRsp).let { + AppLog.i("SplashActivity", "httpSuccess HttpReqType.Report ${it}") android.util.Log.i("reqType:","data:::"+it.code) if(it.code==200){ //上报百度支付功能 @@ -816,19 +821,14 @@ class MainActivity : BaseActivity() { aivVip.setImageResource(R.drawable.yjl_vip_page_choose) } fun checkVPN(){ - val behaviorLogSwitch = - MMKV.defaultMMKV().decodeBool(BZYConstants.BehaviorLogSwitch, true) - if(behaviorLogSwitch){ - launch(Dispatchers.IO) { - val isVPN =Utils.isVpnActive(this@MainActivity) - AppLog.i("NewMainActivity", "VPN是否打开::::${isVPN}") - val vpnCheChek =Utils.checkHttpOk("https://www.youtube.com") - AppLog.i("NewMainActivity", "校验访问https://www.youtube.com::${vpnCheChek}") + launch(Dispatchers.IO) { + val isVPN =Utils.isVpnActive(this@MainActivity) + AppLog.i("NewMainActivity", "VPN是否打开::::${isVPN}") + val vpnCheChek =Utils.checkHttpOk("https://www.youtube.com") + AppLog.i("NewMainActivity", "校验访问https://www.youtube.com::${vpnCheChek}") - val vpnCheChekGoogle =Utils.checkHttpOk("https://www.google.com") - AppLog.i("NewMainActivity", "校验访问https://www.google.com::${vpnCheChekGoogle}") - } + val vpnCheChekGoogle =Utils.checkHttpOk("https://www.google.com") + AppLog.i("NewMainActivity", "校验访问https://www.google.com::${vpnCheChekGoogle}") } - } } \ 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 7ad3dba..f110703 100644 --- a/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt @@ -44,6 +44,7 @@ import com.yingmao.clash.conf.BZYConstants.Companion.MMKV_KEY_NOTE_DEFAULT_PSW import com.yingmao.clash.conf.BZYConstants.Companion.MMKV_KEY_REMEMBER_PASSWORD import com.yingmao.clash.conf.BZYConstants.Companion.MMKV_KEY_REMEMBER_USERNAME import com.yingmao.clash.entity.CheckLoginRsp +import com.yingmao.clash.levellog.AppLog import com.yingmao.clash.listener.DownLoadListener import com.yingmao.clash.net.http.HttpReqType import com.yingmao.clash.net.http.HttpStatus @@ -388,6 +389,7 @@ class SplashActivity : BaseActivity() { HttpReqType.REGISTER -> { dialogDoMainChoose?.dismiss() with(httpStatus.rsp as RegisterRsp) { + AppLog.i("SplashActivity", "注册请求接口code:${code}") if (code == "10000" || code == "200") { if (data != null) { if (!data.phoneNumber.isNullOrEmpty()) { @@ -414,6 +416,7 @@ class SplashActivity : BaseActivity() { if (decodeBool) { MMKV.defaultMMKV().encode(BZYConstants.INITIALIZATION, true) } + AppLog.i("SplashActivity", "注册接口调用登录前: phoneNumber${data?.phoneNumber} defaultPassword${BZYConstants.defaultPassword}") splashAtyVM.login(encryName, encryPsw) } else if (code == "20062") { message?.let { @@ -429,16 +432,19 @@ class SplashActivity : BaseActivity() { } else { MMKV.defaultMMKV().encode(MMKV_KEY_REMEMBER_USERNAME, username) } + AppLog.i("SplashActivity", "注册接口调用返回20062: message${message}") val intent = Intent(this@SplashActivity, LoginActivity::class.java) startActivity(intent) finish() } else if (code == "403") { + AppLog.i("SplashActivity", "注册接口调用返回403: message${message}") pbWeb.visibility = View.INVISIBLE message?.let { RxToast.error(it) } webView?.setOnTouchListener { _, _ -> false } } else { + AppLog.i("SplashActivity", "注册接口调用返回未知数据: code:${code}") MaterialDialog(this@SplashActivity).show { message(text = initErrMsg) positiveButton(R.string.retry) { @@ -456,6 +462,7 @@ class SplashActivity : BaseActivity() { HttpReqType.LOGIN -> { val rsp = httpStatus.rsp if (rsp is LoginRsp) { + AppLog.i("SplashActivity", "HttpReqType.LOGIN rsp.code ${rsp.code }") if (rsp.code == "1000") { val mmkv = MMKV.defaultMMKV() com.cncat.vpn.common.log.Log.i(" HttpReqType.LOGIN token ==> ${rsp.data.vpnToken}") @@ -487,6 +494,8 @@ class SplashActivity : BaseActivity() { HttpReqType.CHECK_LOGIN -> { dialogDoMainChoose?.dismiss() (httpStatus.rsp as CheckLoginRsp).let { checkLoginRsp -> + + AppLog.i("SplashActivity", "HttpReqType.CHECK_LOGIN checkLoginRsp ${checkLoginRsp.code }") if (checkLoginRsp.code == 0) { com.cncat.vpn.common.log.Log.d("splash CHECK_LOGIN==>") checkLoginRsp.data?.let { MainApplication.setUserInfo(it) } @@ -511,6 +520,7 @@ class SplashActivity : BaseActivity() { } HttpReqType.App_VERION_CHECK -> { (httpStatus.rsp as AppVersionCheckRsp).let { avcr -> + AppLog.i("SplashActivity", " HttpReqType.App_VERION_CHECK avcr ${avcr}") com.cncat.vpn.common.log.Log.i("App_VERION_CHECK ==>$avcr") if (avcr.code == 200) { avcr.data?.let { md -> @@ -548,6 +558,7 @@ class SplashActivity : BaseActivity() { rlPb.visibility = View.GONE pbWeb.visibility = View.INVISIBLE com.cncat.vpn.common.log.Log.d("httpFailure HttpReqType.REGISTER") + AppLog.i("SplashActivity", "httpFailure HttpReqType.REGISTER ${httpStatus.msg}") if (super.switchServer2()) {//切换服务器并直接重试 doRegisterByEncryption() } else { @@ -565,6 +576,7 @@ class SplashActivity : BaseActivity() { } HttpReqType.LOGIN -> { + AppLog.i("SplashActivity", "httpFailure HttpReqType.LOGIN ${httpStatus.msg}") MaterialDialog(this@SplashActivity).show { message(text = initErrMsg) positiveButton(R.string.confirm) { @@ -585,6 +597,7 @@ class SplashActivity : BaseActivity() { HttpReqType.CHECK_LOGIN -> { com.cncat.vpn.common.log.Log.d("httpFailure HttpReqType.CHECK_LOGIN") + AppLog.i("SplashActivity", "httpFailure HttpReqType.CHECK_LOGIN ${httpStatus.msg}") RxToast.error("检测到网络异常,请尝试切换其他地址.") if (super.switchServer2()) { splashAtyVM.checkLogin() diff --git a/app/src/main/java/com/yingmao/clash/conf/BZYConstants.kt b/app/src/main/java/com/yingmao/clash/conf/BZYConstants.kt index ae33a6c..7a88c82 100644 --- a/app/src/main/java/com/yingmao/clash/conf/BZYConstants.kt +++ b/app/src/main/java/com/yingmao/clash/conf/BZYConstants.kt @@ -70,6 +70,5 @@ class BZYConstants { const val applicationMode = "ApplicationMode" const val is_splash_first = "is_splash_first" const val ScreenFlag="screenshotFlag" - const val BehaviorLogSwitch = "BehaviorLogSwitch" } } \ No newline at end of file diff --git a/app/src/main/java/com/yingmao/clash/fragment/home/HomeFragment.kt b/app/src/main/java/com/yingmao/clash/fragment/home/HomeFragment.kt index 83530a5..d6c1e8c 100644 --- a/app/src/main/java/com/yingmao/clash/fragment/home/HomeFragment.kt +++ b/app/src/main/java/com/yingmao/clash/fragment/home/HomeFragment.kt @@ -41,6 +41,7 @@ import com.google.gson.Gson import com.google.gson.JsonParser import com.orhanobut.logger.Logger import com.tencent.mmkv.MMKV +import com.yingmao.clash.BuildConfig import com.yingmao.clash.R import com.yingmao.clash.act.ChangeNodeActivity.ProxyMode import com.yingmao.clash.act.MainActivity @@ -187,6 +188,17 @@ open class HomeFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispa observe(this, accelerateViewModel) initSS() accelerateViewModel.getSelectNodeInfo() + val selectedName = + MMKV.defaultMMKV().decodeString(MMKV_KEY_REMEMBER_USERNAME, "") + val equipmentModel = Utils.getEquipmentModel() + val validPeriod = MMKV.defaultMMKV().decodeLong(BZYConstants.MMKV_KEY_VPN_VALID_PERIOD) + AppLog.i("HomeFragment", "用户账号===>${selectedName}") + AppLog.i("HomeFragment", "版本号===>${requireActivity().resources.getString(R.string.currentVersionNumber) + "${BuildConfig.VERSION_NAME}." + BuildConfig.productId}") + AppLog.i("HomeFragment", "用户有效时长===>${validPeriod}") + AppLog.i("HomeFragment", "用户是否过期===>${checkExpire()}") + AppLog.i("HomeFragment", "机型数据===>${equipmentModel}") + AppLog.i("HomeFragment", "订阅连接地址===>${subUrl}") + AppLog.i("HomeFragment", "OAID===>${MainApplication.Companion.OAID}") } @@ -1117,18 +1129,7 @@ open class HomeFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispa return mList } fun behaviorLog(){ - //开启采集之后点击采集 - MMKV.defaultMMKV().encode(BZYConstants.BehaviorLogSwitch, true) - val selectedName = - MMKV.defaultMMKV().decodeString(MMKV_KEY_REMEMBER_USERNAME, "") - val equipmentModel = Utils.getEquipmentModel() - val validPeriod = MMKV.defaultMMKV().decodeLong(BZYConstants.MMKV_KEY_VPN_VALID_PERIOD) - AppLog.i("HomeFragment", "selectedName===>${selectedName}") - AppLog.i("HomeFragment", "用户有效时长===>${validPeriod}") - AppLog.i("HomeFragment", "用户是否过期===>${checkExpire()}") - AppLog.i("HomeFragment", "机型数据===>${equipmentModel}") - AppLog.i("HomeFragment", "订阅连接地址===>${subUrl}") - AppLog.i("HomeFragment", "OAID===>${MainApplication.Companion.OAID}") + AppLog.i("HomeFragment", "加速开启前 订阅连接地址 behaviorLog===>${subUrl}") requireContext().startService(LogcatService::class.intent) } } \ No newline at end of file diff --git a/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt b/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt index ab6ce12..2de8ead 100644 --- a/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt +++ b/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt @@ -65,6 +65,7 @@ import com.yingmao.clash.util.CommonUtils import com.yingmao.clash.util.DataUtils import com.yingmao.clash.util.DataUtils.getAllFilePath import com.yingmao.clash.util.PayUtils +import com.yingmao.clash.util.Utils import com.yingmao.clash.view.RxToast import com.yingmao.clash.view.dialog.DialogBandChoose import com.yingmao.clash.view.dialog.DialogDoMainChoose @@ -278,7 +279,9 @@ class SettingFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispatc if(clashRunning&&getIsGlo){ RxToast.info("全局模式暂不支持上传日志,请切换到智能模式或关闭加速!") }else{ - + if(clashRunning){ + checkVPN() + } val logDirParent = "applogs" val logDir = File(requireActivity().filesDir, logDirParent) val processName =getProcessName() @@ -844,7 +847,6 @@ class SettingFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispatc hideLoading() val deleteFile = DataUtils.deleteFile(filePath) Log.i("PutObjectRequest deleteFile ${deleteFile}") - MMKV.defaultMMKV().encode(BZYConstants.BehaviorLogSwitch, false) RxToast.info(resources.getString(R.string.BehaviorLogSuccessfully)) } }else{ @@ -878,4 +880,15 @@ class SettingFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispatc } + fun checkVPN(){ + launch(Dispatchers.IO) { + val isVPN =Utils.isVpnActive(requireActivity()) + AppLog.i("NewMainActivity", "VPN是否打开::::${isVPN}") + val vpnCheChek =Utils.checkHttpOk("https://www.youtube.com") + AppLog.i("NewMainActivity", "校验访问https://www.youtube.com::${vpnCheChek}") + + val vpnCheChekGoogle =Utils.checkHttpOk("https://www.google.com") + AppLog.i("NewMainActivity", "校验访问https://www.google.com::${vpnCheChekGoogle}") + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/yingmao/clash/levellog/AppLog.kt b/app/src/main/java/com/yingmao/clash/levellog/AppLog.kt index c4467f6..de30feb 100644 --- a/app/src/main/java/com/yingmao/clash/levellog/AppLog.kt +++ b/app/src/main/java/com/yingmao/clash/levellog/AppLog.kt @@ -27,19 +27,14 @@ object AppLog { msg: String, tr: Throwable? ) { - val behaviorLogSwitch = - MMKV.defaultMMKV().decodeBool(BZYConstants.BehaviorLogSwitch, true) - if(behaviorLogSwitch){ - LogDispatcher.enqueue( - LogEvent( - time = System.currentTimeMillis(), - level = level, - tag = tag, - message = msg, - throwable = tr - ) + LogDispatcher.enqueue( + LogEvent( + time = System.currentTimeMillis(), + level = level, + tag = tag, + message = msg, + throwable = tr ) - } - + ) } }