Merge branch 'yijianlian_NewUI' into yijianlian_NewUI_tobase
# Conflicts: # app/src/main/java/com/yingmao/clash/act/SplashActivity.kt # build.gradle.kts
This commit is contained in:
commit
539354e273
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,8 +46,8 @@ 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.home.HomeFragment.Companion.clashRunning
|
||||
import com.yingmao.clash.fragment.setting.SettingFragment
|
||||
import com.yingmao.clash.fragment.vip.vipFragment
|
||||
import com.yingmao.clash.levellog.AppLog
|
||||
|
|
@ -90,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
|
||||
|
|
@ -130,6 +127,7 @@ class MainActivity : BaseActivity() {
|
|||
private var mainBroadcastReceiver: BroadcastReceiver? = null
|
||||
val trafficStatisticsData = MutableLiveData<String>()
|
||||
suspend fun setSub2(url: String) {
|
||||
try {
|
||||
profileBinder?.let { pm ->
|
||||
pm.queryAll().forEach { itemPro ->
|
||||
if (itemPro.name != Conf.getClashConfName(MainApplication.getApp()?.applicationContext)) {
|
||||
|
|
@ -186,6 +184,9 @@ class MainActivity : BaseActivity() {
|
|||
}
|
||||
}
|
||||
}
|
||||
}catch (e: Exception){
|
||||
AppLog.e("HomeFragment", "setSub2() Error===>",e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -233,8 +234,6 @@ class MainActivity : BaseActivity() {
|
|||
requestPermissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS)
|
||||
}
|
||||
}
|
||||
//初始进入 将日志采集开关变为不开启
|
||||
MMKV.defaultMMKV().encode(BZYConstants.BehaviorLogSwitch, false)
|
||||
}
|
||||
|
||||
inner class NodeListBR : BroadcastReceiver() {
|
||||
|
|
@ -285,7 +284,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 +296,10 @@ 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()
|
||||
Log.i("AAAAAAAAAAAAAAAAAAA clashRunning${clashRunning}")
|
||||
if(clashRunning){
|
||||
checkVPN()
|
||||
}
|
||||
}
|
||||
|
||||
aivVip.setOnClickListener {
|
||||
|
|
@ -336,8 +341,10 @@ 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}")
|
||||
}
|
||||
data.data.let { netSubUrl ->
|
||||
if (netSubUrl.isNotEmpty()) {
|
||||
|
|
@ -366,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 {
|
||||
|
|
@ -393,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 =
|
||||
|
|
@ -426,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, "")
|
||||
|
|
@ -460,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
|
||||
|
|
@ -497,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){
|
||||
//上报百度支付功能
|
||||
|
|
@ -515,6 +527,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 +537,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)
|
||||
}
|
||||
|
||||
|
|
@ -805,19 +821,14 @@ class MainActivity : BaseActivity() {
|
|||
aivVip.setImageResource(R.drawable.yjl_vip_page_choose)
|
||||
}
|
||||
fun checkVPN(){
|
||||
val behaviorLogSwitch =
|
||||
MMKV.defaultMMKV().decodeBool(BZYConstants.BehaviorLogSwitch, false)
|
||||
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}")
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -40,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
|
||||
|
|
@ -50,12 +52,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 +82,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
|
||||
|
|
@ -182,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}")
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -298,7 +315,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 +351,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}")
|
||||
|
|
@ -446,23 +465,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()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -913,10 +932,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 +1128,8 @@ open class HomeFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispa
|
|||
}
|
||||
return mList
|
||||
}
|
||||
fun behaviorLog(){
|
||||
AppLog.i("HomeFragment", "加速开启前 订阅连接地址 behaviorLog===>${subUrl}")
|
||||
requireContext().startService(LogcatService::class.intent)
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -72,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
|
||||
|
|
@ -184,24 +178,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),
|
||||
|
|
@ -294,30 +275,23 @@ 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<TextView>(R.id.tvSure)
|
||||
tvSure.setOnClickListener {
|
||||
settingPageList[itemData.type-1].name="上传日志"
|
||||
settingAdapter.notifyItemChanged(itemData.type-1)
|
||||
requireActivity().startForegroundServiceCompat(LogcatService::class.intent)
|
||||
dismiss()
|
||||
}
|
||||
if(clashRunning){
|
||||
checkVPN()
|
||||
}
|
||||
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,8 +847,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))
|
||||
}
|
||||
}else{
|
||||
|
|
@ -908,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}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -27,19 +27,14 @@ object AppLog {
|
|||
msg: String,
|
||||
tr: Throwable?
|
||||
) {
|
||||
val behaviorLogSwitch =
|
||||
MMKV.defaultMMKV().decodeBool(BZYConstants.BehaviorLogSwitch, false)
|
||||
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
|
||||
)
|
||||
}
|
||||
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<LogMessage>(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)
|
||||
|
|
@ -131,52 +96,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
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -492,8 +492,8 @@
|
|||
</string>
|
||||
<string name="modelchanging">模式切换中</string>
|
||||
<string name="modelchangSuccess">模式切换成功</string>
|
||||
<string name="BehaviorLogSuccessfully">行为日志上传成功!</string>
|
||||
<string name="BehaviorLogError">行为日志上传失败!</string>
|
||||
<string name="BehaviorLogSuccessfully">日志上传成功!</string>
|
||||
<string name="BehaviorLogError">日志上传失败!</string>
|
||||
<string name="vpnStartingError">VPN权限未允许 请设置允许!</string>
|
||||
<string name="CloseChooseNode">请关闭加速后在切换节点</string>
|
||||
</resources>
|
||||
Loading…
Reference in New Issue