Commit 608e9032 authored by sheteng's avatar sheteng

加速修改

parent 984a0e8f
...@@ -57,7 +57,6 @@ class BottomNavigationFragment : XPageFragment(), ViewPager.OnPageChangeListener ...@@ -57,7 +57,6 @@ class BottomNavigationFragment : XPageFragment(), ViewPager.OnPageChangeListener
binding.viewPager.adapter = adapter binding.viewPager.adapter = adapter
binding.viewPager.setNoScroll(true) binding.viewPager.setNoScroll(true)
AcceleratorUtils.initConnect(fragments[0] as AcceleratorFragment)
} }
override fun initListeners() { override fun initListeners() {
......
...@@ -29,6 +29,7 @@ import android.hardware.SensorEventListener ...@@ -29,6 +29,7 @@ import android.hardware.SensorEventListener
import android.os.Handler import android.os.Handler
import android.util.Log import android.util.Log
import com.ccwangluo.accelerator.ui.dialog.PermissionDialog import com.ccwangluo.accelerator.ui.dialog.PermissionDialog
import com.ccwangluo.accelerator.ui.home.AcceleratorFragment
import com.ccwangluo.accelerator.utils.datareport.DataRePortUtils import com.ccwangluo.accelerator.utils.datareport.DataRePortUtils
import fm.jiecao.jcvideoplayer_lib.JCVideoPlayer import fm.jiecao.jcvideoplayer_lib.JCVideoPlayer
import com.tencent.android.tpush.XGIOperateCallback import com.tencent.android.tpush.XGIOperateCallback
...@@ -88,6 +89,8 @@ class MainActivity() : XPageActivity(), TencentLocationListener { ...@@ -88,6 +89,8 @@ class MainActivity() : XPageActivity(), TencentLocationListener {
mSensorEventListener = JCVideoPlayer.JCAutoFullscreenListener() mSensorEventListener = JCVideoPlayer.JCAutoFullscreenListener()
DataRePortUtils.report("st_app_open") DataRePortUtils.report("st_app_open")
AcceleratorUtils.initConnect(this)
} }
private fun getPermission() { private fun getPermission() {
......
...@@ -22,6 +22,7 @@ import com.ccwangluo.accelerator.utils.ShareUtils ...@@ -22,6 +22,7 @@ import com.ccwangluo.accelerator.utils.ShareUtils
import com.ccwangluo.accelerator.utils.SysUtils import com.ccwangluo.accelerator.utils.SysUtils
import com.ccwangluo.accelerator.utils.datareport.DataRePortUtils import com.ccwangluo.accelerator.utils.datareport.DataRePortUtils
import com.ccwangluo.cc_quickly.utils.SettingSPUtils import com.ccwangluo.cc_quickly.utils.SettingSPUtils
import com.github.shadowsocks.bg.AuthManager
import com.github.shadowsocks.bg.BaseService import com.github.shadowsocks.bg.BaseService
import com.github.shadowsocks.http.HttpConfig import com.github.shadowsocks.http.HttpConfig
import com.hjq.toast.ToastUtils import com.hjq.toast.ToastUtils
...@@ -108,11 +109,11 @@ class AcceleratorFragment : XPageFragment() { ...@@ -108,11 +109,11 @@ class AcceleratorFragment : XPageFragment() {
binding.activeNetwork.setText(SysUtils.getActiveNet()) binding.activeNetwork.setText(SysUtils.getActiveNet())
}) })
acceleratorViewModel.accState.observe(this, { acceleratorViewModel.accState.observe(this) {
binding.accStateTx.setText(SysUtils.getAccTimeString(accTimer)) binding.accStateTx.setText(SysUtils.getAccTimeString(accTimer))
state = it state = it
freshData(it) freshData(it)
if (SettingSPUtils.isSmartAccOpen) { if (AuthManager.isSmartAccOpen) {
binding.smartAccOpen.setText("已开启") binding.smartAccOpen.setText("已开启")
binding.smartAccOpen.setTextColor(resources.getColor(R.color.open_acc_enable)) binding.smartAccOpen.setTextColor(resources.getColor(R.color.open_acc_enable))
binding.smartAccOpenArea.visibility = View.GONE binding.smartAccOpenArea.visibility = View.GONE
...@@ -121,15 +122,15 @@ class AcceleratorFragment : XPageFragment() { ...@@ -121,15 +122,15 @@ class AcceleratorFragment : XPageFragment() {
binding.smartAccOpen.setTextColor(resources.getColor(R.color.white)) binding.smartAccOpen.setTextColor(resources.getColor(R.color.white))
binding.smartAccOpenArea.visibility = View.VISIBLE binding.smartAccOpenArea.visibility = View.VISIBLE
} }
}) }
acceleratorViewModel.userProfile.observe(this, { acceleratorViewModel.userProfile.observe(this) {
if (it.hasUnreadNotice) { if (it.hasUnreadNotice) {
binding.iconNoticeBadge.visibility = View.VISIBLE binding.iconNoticeBadge.visibility = View.VISIBLE
} else { } else {
binding.iconNoticeBadge.visibility = View.GONE binding.iconNoticeBadge.visibility = View.GONE
} }
}) }
binding.progressViewCircleSmall.setProgressViewUpdateListener(object : binding.progressViewCircleSmall.setProgressViewUpdateListener(object :
CircleProgressView.CircleProgressUpdateListener { CircleProgressView.CircleProgressUpdateListener {
...@@ -172,13 +173,13 @@ class AcceleratorFragment : XPageFragment() { ...@@ -172,13 +173,13 @@ class AcceleratorFragment : XPageFragment() {
} }
binding.smartAccOpen.setOnClickListener { binding.smartAccOpen.setOnClickListener {
if (!SettingSPUtils.isSmartAccOpen) { if (!AuthManager.isSmartAccOpen) {
openToWebview(HttpConfig.UI_SETTING_URL) openToWebview(HttpConfig.UI_SETTING_URL)
} }
} }
binding.smartAccOpenBtn.setOnClickListener { binding.smartAccOpenBtn.setOnClickListener {
if (!SettingSPUtils.isSmartAccOpen) { if (!AuthManager.isSmartAccOpen) {
openToWebview(HttpConfig.UI_SETTING_URL) openToWebview(HttpConfig.UI_SETTING_URL)
} }
} }
...@@ -246,20 +247,20 @@ class AcceleratorFragment : XPageFragment() { ...@@ -246,20 +247,20 @@ class AcceleratorFragment : XPageFragment() {
AcceleratorUtils.getGameList(this) { AcceleratorUtils.getGameList(this) {
if (it) { if (it) {
// //
AcceleratorUtils.game?.let { // AcceleratorUtils.game?.let {
if (!SysUtils.isPackageInstall(requireContext(), it.packageName)) { // if (!SysUtils.isPackageInstall(requireContext(), it.packageName)) {
binding.quickTopToast.visibility = View.VISIBLE // binding.quickTopToast.visibility = View.VISIBLE
binding.quickTopToastTx.setText("请先安装游戏后加速") // binding.quickTopToastTx.setText("请先安装游戏后加速")
binding.quickTopToastTx.postDelayed({ // binding.quickTopToastTx.postDelayed({
binding.quickTopToast.visibility = View.GONE // binding.quickTopToast.visibility = View.GONE
}, 2000) // }, 2000)
DataRePortUtils.report( // DataRePortUtils.report(
"st_speed_result", // "st_speed_result",
mapOf("result" to 0, "cause" to "1") // mapOf("result" to 0, "cause" to "1")
) // )
return@getGameList // return@getGameList
} // }
} // }
//用户是否有使用时长 //用户是否有使用时长
LoginUtils.getUserHasTimer(this@AcceleratorFragment) { LoginUtils.getUserHasTimer(this@AcceleratorFragment) {
if (it) { if (it) {
...@@ -405,18 +406,18 @@ class AcceleratorFragment : XPageFragment() { ...@@ -405,18 +406,18 @@ class AcceleratorFragment : XPageFragment() {
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
// AcceleratorUtils.registerStateListener { state, l, net -> AcceleratorUtils.registerStateListener { state, l, net ->
// net?.let { net?.let {
// acceleratorViewModel.netState.postValue(net) acceleratorViewModel.netState.postValue(net)
// } }
// accTimer = l accTimer = l
// acceleratorViewModel.accState.postValue(state) acceleratorViewModel.accState.postValue(state)
// } }
} }
override fun onStop() { override fun onStop() {
super.onStop() super.onStop()
// AcceleratorUtils.unRegisterStateListener() AcceleratorUtils.unRegisterStateListener()
} }
override fun onResume() { override fun onResume() {
......
...@@ -13,6 +13,7 @@ import android.content.Intent ...@@ -13,6 +13,7 @@ import android.content.Intent
import android.net.Uri import android.net.Uri
import android.provider.Settings import android.provider.Settings
import com.ccwangluo.accelerator.utils.SysUtils import com.ccwangluo.accelerator.utils.SysUtils
import com.github.shadowsocks.bg.AuthManager
import com.xuexiang.xpage.base.XPageActivity import com.xuexiang.xpage.base.XPageActivity
...@@ -109,7 +110,7 @@ class AndroidActivityInterface(val xPageActivity: XPageActivity, val agentWeb: A ...@@ -109,7 +110,7 @@ class AndroidActivityInterface(val xPageActivity: XPageActivity, val agentWeb: A
*/ */
@JavascriptInterface @JavascriptInterface
fun setSmartAccOpen(isopen: Boolean) { fun setSmartAccOpen(isopen: Boolean) {
SettingSPUtils.isSmartAccOpen = isopen AuthManager.isSmartAccOpen = isopen
} }
/** /**
...@@ -118,7 +119,7 @@ class AndroidActivityInterface(val xPageActivity: XPageActivity, val agentWeb: A ...@@ -118,7 +119,7 @@ class AndroidActivityInterface(val xPageActivity: XPageActivity, val agentWeb: A
@JavascriptInterface @JavascriptInterface
fun getSmartAccStatus(callback: String) { fun getSmartAccStatus(callback: String) {
agentWeb.getJsAccessEntrace() agentWeb.getJsAccessEntrace()
.quickCallJs(callback, SettingSPUtils.isSmartAccOpen.toString()) .quickCallJs(callback, AuthManager.isSmartAccOpen.toString())
} }
/** /**
......
...@@ -18,6 +18,7 @@ import com.ccwangluo.accelerator.utils.AcceleratorUtils ...@@ -18,6 +18,7 @@ import com.ccwangluo.accelerator.utils.AcceleratorUtils
import com.ccwangluo.accelerator.utils.ShareUtils import com.ccwangluo.accelerator.utils.ShareUtils
import com.ccwangluo.accelerator.utils.SysUtils import com.ccwangluo.accelerator.utils.SysUtils
import com.ccwangluo.accelerator.utils.datareport.DataRePortUtils import com.ccwangluo.accelerator.utils.datareport.DataRePortUtils
import com.github.shadowsocks.bg.AuthManager
import com.github.shadowsocks.bg.BaseService import com.github.shadowsocks.bg.BaseService
import com.tencent.bugly.beta.Beta import com.tencent.bugly.beta.Beta
...@@ -184,7 +185,7 @@ class AndroidInterface(val xPageFragment: XPageFragment, val agentWeb: AgentWeb) ...@@ -184,7 +185,7 @@ class AndroidInterface(val xPageFragment: XPageFragment, val agentWeb: AgentWeb)
*/ */
@JavascriptInterface @JavascriptInterface
fun setSmartAccOpen(isopen: Boolean) { fun setSmartAccOpen(isopen: Boolean) {
SettingSPUtils.isSmartAccOpen = isopen AuthManager.isSmartAccOpen = isopen
} }
...@@ -194,7 +195,7 @@ class AndroidInterface(val xPageFragment: XPageFragment, val agentWeb: AgentWeb) ...@@ -194,7 +195,7 @@ class AndroidInterface(val xPageFragment: XPageFragment, val agentWeb: AgentWeb)
@JavascriptInterface @JavascriptInterface
fun getSmartAccStatus(callback: String) { fun getSmartAccStatus(callback: String) {
agentWeb.getJsAccessEntrace() agentWeb.getJsAccessEntrace()
.quickCallJs(callback, SettingSPUtils.isSmartAccOpen.toString()) .quickCallJs(callback, AuthManager.isSmartAccOpen.toString())
} }
/** /**
......
...@@ -15,6 +15,7 @@ import com.ccwangluo.accelerator.ui.dialog.CommonDialog ...@@ -15,6 +15,7 @@ import com.ccwangluo.accelerator.ui.dialog.CommonDialog
import com.ccwangluo.accelerator.ui.home.AcceleratorFragment import com.ccwangluo.accelerator.ui.home.AcceleratorFragment
import com.ccwangluo.accelerator.utils.datareport.DataRePortUtils import com.ccwangluo.accelerator.utils.datareport.DataRePortUtils
import com.ccwangluo.accelerator.utils.http.HttpGo import com.ccwangluo.accelerator.utils.http.HttpGo
import com.ccwangluo.cc_quickly.utils.SettingSPUtils
import com.github.shadowsocks.Core import com.github.shadowsocks.Core
import com.github.shadowsocks.acl.Acl import com.github.shadowsocks.acl.Acl
import com.github.shadowsocks.aidl.IShadowsocksService import com.github.shadowsocks.aidl.IShadowsocksService
...@@ -48,59 +49,16 @@ object AcceleratorUtils { ...@@ -48,59 +49,16 @@ object AcceleratorUtils {
private lateinit var connect: ActivityResultLauncher<Void?> private lateinit var connect: ActivityResultLauncher<Void?>
private lateinit var context: XPageActivity
private lateinit var acceleratorFragment: AcceleratorFragment
// service // service
var state = BaseService.State.Idle var state = BaseService.State.Idle
private set private set
private lateinit var context: XPageActivity
//游戏 //游戏
var game: GameInfo? = null var game: GameInfo? = null
private val stateListener: (BaseService.State) -> Unit = { state -> private var stateListener: (BaseService.State, Long, NetState?) -> Unit = { state, l, s ->
if (state == BaseService.State.Connected) {
game?.let {
val gameServerAndPort = it.boosterServer.split(":")
DataStore.pingAccHost = gameServerAndPort[0]
DataStore.pingAccPort = gameServerAndPort[1].toInt()
context.lifecycleScope.launch(Dispatchers.IO) {
while (AcceleratorUtils.state == BaseService.State.Connected) {
netState.preNetDelay =
NetUtils.tcpPing(gameServerAndPort[0], gameServerAndPort[1].toInt())
.toInt()
// val delay =
// NetUtils.tcpPing(serverPort[0], serverPort[1].toInt(), DataStore.portProxy)
// .toInt()
// netState.accNetDelay = delay
LoginUtils.getUserHasTimer { haveTime ->
if (!haveTime) { //没有加速时长关闭服务
stopAccelerator()
}
}
netState.accNetDelay =
if (netState.accNetDelay > netState.preNetDelay && netState.preNetDelay != -1) {
netState.preNetDelay
} else {
netState.accNetDelay
}
netState.lossRate = if (netState.accNetDelay == -1) "100" else "0"
acceleratorFragment.updateNetState(netState)
delay(1000)
}
}
}
} else {
netState.accNetDelay = -1
netState.lossRate = if (netState.preNetDelay == -1) "100" else "0"
acceleratorFragment.updateNetState(netState)
}
acceleratorFragment.changeState(state)
} }
var vipExpireListener: () -> Unit = { -> var vipExpireListener: () -> Unit = { ->
...@@ -134,18 +92,10 @@ object AcceleratorUtils { ...@@ -134,18 +92,10 @@ object AcceleratorUtils {
this.connect = connect this.connect = connect
NetworkAdapter.initNetworks(context) NetworkAdapter.initNetworks(context)
ProfileManager.ensureNotEmpty() ProfileManager.ensureNotEmpty()
context.lifecycleScope.launch(Dispatchers.IO) {
NetUtils.init()
while (true) {
testLatency()
delay(TimeUnit.SECONDS.toMillis(DataStore.pingIntervalSec.toLong()))
}
}
} }
fun initConnect(acceleratorFragment: AcceleratorFragment) { fun initConnect(context: Context) {
this.acceleratorFragment = acceleratorFragment
connection.connect(context, shadowsocksConnection) connection.connect(context, shadowsocksConnection)
} }
...@@ -172,38 +122,29 @@ object AcceleratorUtils { ...@@ -172,38 +122,29 @@ object AcceleratorUtils {
val serverPort = it.boosterServer.split(":") val serverPort = it.boosterServer.split(":")
DataStore.pingAccHost = serverPort[0] DataStore.pingAccHost = serverPort[0]
DataStore.pingAccPort = serverPort[1].toInt() DataStore.pingAccPort = serverPort[1].toInt()
// context.lifecycleScope.launch(Dispatchers.IO) { xPageFragment.lifecycleScope.launch(Dispatchers.IO) {
// while (true) { while (true) {
// val net = NetState(-1, -1, "100") if (state == BaseService.State.Connected) {
// if (state == BaseService.State.Connected) { netState.preNetDelay =
// net.preNetDelay = NetUtils.tcpPing(serverPort[0], serverPort[1].toInt())
// NetUtils.tcpPing(serverPort[0], serverPort[1].toInt()).toInt() .toInt()
// val delay = LoginUtils.getUserHasTimer { haveTime ->
// NetUtils.tcpPing( if (!haveTime) { //没有加速时长关闭服务
// serverPort[0], stopAccelerator()
// serverPort[1].toInt(), }
// DataStore.portProxy }
// ) netState.accNetDelay =
// .toInt() if (netState.accNetDelay > netState.preNetDelay && netState.preNetDelay != -1) {
// net.accNetDelay = delay netState.preNetDelay
// LoginUtils.getUserHasTimer { } else {
// if (!it) { //没有加速时长关闭服务 netState.accNetDelay
// stopAccelerator() }
// } netState.lossRate = if (netState.accNetDelay == -1) "100" else "0"
// } }
// net.accNetDelay = stateListener(state, getAccTime(), netState)
// if (net.accNetDelay > net.preNetDelay && net.preNetDelay != -1) net.preNetDelay else net.accNetDelay delay(1000)
// net.lossRate = if (net.accNetDelay == -1) "100" else "0" }
// } else { }
// net.accNetDelay = -1
// net.lossRate = if (net.preNetDelay == -1) "100" else "0"
// }
// withContext(Dispatchers.Main) {
// stateListener(state, getAccTime(), net)
// }
// delay(1000)
// }
// }
} }
} }
...@@ -243,16 +184,16 @@ object AcceleratorUtils { ...@@ -243,16 +184,16 @@ object AcceleratorUtils {
} }
// fun registerStateListener(listener: (BaseService.State, Long, NetState?) -> Unit) { fun registerStateListener(listener: (BaseService.State, Long, NetState?) -> Unit) {
// stateListener = listener stateListener = listener
// stateListener(state, getAccTime(), null) stateListener(state, getAccTime(), null)
// } }
//
// fun unRegisterStateListener() { fun unRegisterStateListener() {
// stateListener = { state, l, net -> stateListener = { state, l, net ->
//
// } }
// } }
fun registerVipExpireListener(listener: () -> Unit) { fun registerVipExpireListener(listener: () -> Unit) {
vipExpireListener = listener vipExpireListener = listener
...@@ -272,7 +213,7 @@ object AcceleratorUtils { ...@@ -272,7 +213,7 @@ object AcceleratorUtils {
private val shadowsocksConnection = object : ShadowsocksConnection.Callback { private val shadowsocksConnection = object : ShadowsocksConnection.Callback {
override fun stateChanged(state: BaseService.State, profileName: String?, msg: String?) { override fun stateChanged(state: BaseService.State, profileName: String?, msg: String?) {
AcceleratorUtils.state = state AcceleratorUtils.state = state
stateListener(state) stateListener(state, getAccTime(), netState)
if (state == BaseService.State.Stopped && !msg.isNullOrBlank()) { if (state == BaseService.State.Stopped && !msg.isNullOrBlank()) {
DataRePortUtils.report( DataRePortUtils.report(
"st_speed_result", "st_speed_result",
...@@ -297,7 +238,7 @@ object AcceleratorUtils { ...@@ -297,7 +238,7 @@ object AcceleratorUtils {
} catch (_: RemoteException) { } catch (_: RemoteException) {
BaseService.State.Idle BaseService.State.Idle
} }
stateListener(state) stateListener(state, getAccTime(), netState)
} }
override fun onBinderDied() { override fun onBinderDied() {
...@@ -307,7 +248,6 @@ object AcceleratorUtils { ...@@ -307,7 +248,6 @@ object AcceleratorUtils {
override fun trafficUpdated(profileId: Long, stats: TrafficStats) { override fun trafficUpdated(profileId: Long, stats: TrafficStats) {
netState.accNetDelay = stats.latency netState.accNetDelay = stats.latency
// acceleratorFragment.updateTraffic(stats)
} }
} }
...@@ -328,39 +268,5 @@ object AcceleratorUtils { ...@@ -328,39 +268,5 @@ object AcceleratorUtils {
connection.disconnect(context) connection.disconnect(context)
} }
private suspend fun testLatency() {
val networkAutoSwitch = true // TODO: 根据用户设置测试延迟 ,过高时切换 connection.bindNetwork(NetworkMode.CELLULAR.code)
if (networkAutoSwitch) {
val wifiLatency: Int = doTestLatency(DataStore.pingAccHost, DataStore.pingAccPort, NetworkAdapter.wifiNetwork)
val cellularLatency: Int = doTestLatency(DataStore.pingAccHost, DataStore.pingAccPort, NetworkAdapter.cellularNetwork)
Timber.d("wifi latency: $wifiLatency, cellular latency: $cellularLatency")
} else {
val currentNetworkLatency = doTestLatency(DataStore.pingAccHost, DataStore.pingAccPort, null, true)
Timber.d("network latency: $currentNetworkLatency")
}
}
private suspend fun doTestLatency(pingHost: String, pingPort: Int, network: Network?, systemNetwork: Boolean = false): Int {
return withTimeoutOrNull(DataStore.pingTimeoutMillis.toLong()) {
try {
val socketAddress: Socket = when {
network != null -> {
network.socketFactory.createSocket()
}
systemNetwork -> {
Socket()
}
else -> {
return@withTimeoutOrNull -1
}
}
val start = System.currentTimeMillis()
socketAddress.connect(InetSocketAddress(pingHost, pingPort), DataStore.pingTimeoutMillis)
(System.currentTimeMillis() - start).toInt()
} catch (_: Exception) {
-1
}
} ?: -1
}
} }
\ No newline at end of file
...@@ -33,15 +33,6 @@ object SettingSPUtils { ...@@ -33,15 +33,6 @@ object SettingSPUtils {
MMKV.defaultMMKV().putBoolean(IS_AGREE_PRIVACY_KEY, isAgreePrivacy) MMKV.defaultMMKV().putBoolean(IS_AGREE_PRIVACY_KEY, isAgreePrivacy)
} }
/**
* 智能加速是否启动
*/
var isSmartAccOpen: Boolean
get() = MMKV.defaultMMKV().decodeBool(IS_SMART_ACC_OPEN, true)
set(isSmartAccOpen) {
MMKV.defaultMMKV().putBoolean(IS_SMART_ACC_OPEN, isSmartAccOpen)
}
var lastAPPOpenReportTime: Long var lastAPPOpenReportTime: Long
get() = MMKV.defaultMMKV().decodeLong(LAST_APP_SRART_TIME, 0L) get() = MMKV.defaultMMKV().decodeLong(LAST_APP_SRART_TIME, 0L)
set(lastAPPOpenReportTime) { set(lastAPPOpenReportTime) {
......
package com.github.shadowsocks.bg package com.github.shadowsocks.bg
import android.net.Network
import android.os.Build import android.os.Build
import com.ccnet.acc.AccVpn import com.ccnet.acc.AccVpn
import com.ccnet.acc.NetworkAdapter
import com.github.shadowsocks.Core import com.github.shadowsocks.Core
import com.github.shadowsocks.database.Profile import com.github.shadowsocks.database.Profile
import com.github.shadowsocks.database.ProfileManager import com.github.shadowsocks.database.ProfileManager
...@@ -11,8 +13,7 @@ import com.google.gson.Gson ...@@ -11,8 +13,7 @@ import com.google.gson.Gson
import com.google.gson.JsonStreamParser import com.google.gson.JsonStreamParser
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import com.tencent.mmkv.MMKV import com.tencent.mmkv.MMKV
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.*
import kotlinx.coroutines.withContext
import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
...@@ -21,6 +22,8 @@ import okhttp3.RequestBody.Companion.toRequestBody ...@@ -21,6 +22,8 @@ import okhttp3.RequestBody.Companion.toRequestBody
import timber.log.Timber import timber.log.Timber
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import java.net.InetSocketAddress
import java.net.Socket
import java.security.SecureRandom import java.security.SecureRandom
import java.security.cert.X509Certificate import java.security.cert.X509Certificate
import java.util.concurrent.Executors import java.util.concurrent.Executors
...@@ -84,12 +87,22 @@ object AuthManager { ...@@ -84,12 +87,22 @@ object AuthManager {
mmkv.putLong("LAST_ACC_TIME", last_acc_time) mmkv.putLong("LAST_ACC_TIME", last_acc_time)
} }
/**
* 智能加速是否启动
*/
var isSmartAccOpen: Boolean
get() = mmkv.decodeBool("IS_SMART_ACC_OPEN", true)
set(isSmartAccOpen) {
mmkv.putBoolean("IS_SMART_ACC_OPEN", isSmartAccOpen)
}
class AuthException(msg: String) : IOException(msg), BaseService.ExpectedException class AuthException(msg: String) : IOException(msg), BaseService.ExpectedException
suspend fun initAuthProfile(profile: Profile) { suspend fun initAuthProfile(profile: Profile) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val gameId: Int = gameId?.toInt() ?: throw AuthException("游戏不存在") val gameId: Int = gameId?.toInt() ?: throw AuthException("游戏不存在")
val lineConfigResult = postSync<LineConfig>("/api/acc/line",authToken, LineConfigReq(gameId, area)) val lineConfigResult =
postSync<LineConfig>("/api/acc/line", authToken, LineConfigReq(gameId, area))
if (lineConfigResult.isSuccessful()) { if (lineConfigResult.isSuccessful()) {
val lineConfig = lineConfigResult.unwrapData() val lineConfig = lineConfigResult.unwrapData()
profile.host = lineConfig.host profile.host = lineConfig.host
...@@ -113,7 +126,7 @@ object AuthManager { ...@@ -113,7 +126,7 @@ object AuthManager {
return return
} }
scheduleAtFixedRate?.cancel(false) scheduleAtFixedRate?.cancel(false)
var failedCount:Int=0 var failedCount: Int = 0
scheduleAtFixedRate = executor.scheduleAtFixedRate({ scheduleAtFixedRate = executor.scheduleAtFixedRate({
val context = val context =
if (Build.VERSION.SDK_INT < 24 || Core.user.isUserUnlocked) Core.app else Core.deviceStorage if (Build.VERSION.SDK_INT < 24 || Core.user.isUserUnlocked) Core.app else Core.deviceStorage
...@@ -124,12 +137,12 @@ object AuthManager { ...@@ -124,12 +137,12 @@ object AuthManager {
if (data.state == BaseService.State.Connected) { if (data.state == BaseService.State.Connected) {
data.proxy?.let { proxyInstance -> data.proxy?.let { proxyInstance ->
val refreshTokenResult = postSync<RefreshTokenRes>( val refreshTokenResult = postSync<RefreshTokenRes>(
"/api/acc/line/refresh",authToken, "/api/acc/line/refresh", authToken,
RefreshTokenReq(proxyInstance.profile.token ?: "") RefreshTokenReq(proxyInstance.profile.token ?: "")
) )
Timber.d("refreshTokenResult: $refreshTokenResult") Timber.d("refreshTokenResult: $refreshTokenResult")
if (refreshTokenResult.isSuccessful()) { if (refreshTokenResult.isSuccessful()) {
failedCount=0 failedCount = 0
proxyInstance.profile.token = refreshTokenResult.unwrapData().token proxyInstance.profile.token = refreshTokenResult.unwrapData().token
configJson.addProperty("token", proxyInstance.profile.token) configJson.addProperty("token", proxyInstance.profile.token)
configFile.writeText(configJson.toString()) configFile.writeText(configJson.toString())
...@@ -138,23 +151,80 @@ object AuthManager { ...@@ -138,23 +151,80 @@ object AuthManager {
} }
return@let return@let
} else if (refreshTokenResult.code == 1001) { } else if (refreshTokenResult.code == 1001) {
failedCount=0 failedCount = 0
throw AuthException(refreshTokenResult.error!!) throw AuthException(refreshTokenResult.error!!)
} else { } else {
failedCount++; failedCount++;
//连续失败超过3次抛异常 //连续失败超过3次抛异常
if(failedCount>=3){ if (failedCount >= 3) {
failedCount=0 failedCount = 0
throw AuthException("网络异常") throw AuthException("网络异常")
} }
} }
} }
GlobalScope.launch {
testLatency()
}
} }
}, 1, 1, TimeUnit.MINUTES) }, 1, 1, TimeUnit.MINUTES)
} }
var loginAuthToken:String = "1" private suspend fun testLatency() {
val networkAutoSwitch =
AuthManager.isSmartAccOpen // 根据用户设置测试延迟 ,过高时切换 connection.bindNetwork(NetworkMode.CELLULAR.code)
if (networkAutoSwitch) {
val wifiLatency: Int = doTestLatency(
DataStore.pingAccHost,
DataStore.pingAccPort,
NetworkAdapter.wifiNetwork
)
val cellularLatency: Int = doTestLatency(
DataStore.pingAccHost,
DataStore.pingAccPort,
NetworkAdapter.cellularNetwork
)
Timber.d("wifi latency: $wifiLatency, cellular latency: $cellularLatency")
} else {
val currentNetworkLatency =
doTestLatency(DataStore.pingAccHost, DataStore.pingAccPort, null, true)
Timber.d("network latency: $currentNetworkLatency")
}
}
private suspend fun doTestLatency(
pingHost: String,
pingPort: Int,
network: Network?,
systemNetwork: Boolean = false
): Int {
return withTimeoutOrNull(DataStore.pingTimeoutMillis.toLong()) {
try {
val socketAddress: Socket = when {
network != null -> {
network.socketFactory.createSocket()
}
systemNetwork -> {
Socket()
}
else -> {
return@withTimeoutOrNull -1
}
}
val start = System.currentTimeMillis()
socketAddress.connect(
InetSocketAddress(pingHost, pingPort),
DataStore.pingTimeoutMillis
)
(System.currentTimeMillis() - start).toInt()
} catch (_: Exception) {
-1
}
} ?: -1
}
var loginAuthToken: String = "1"
val jsonType get() = "application/json; charset=utf-8".toMediaTypeOrNull() val jsonType get() = "application/json; charset=utf-8".toMediaTypeOrNull()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment