一键连相关更改

This commit is contained in:
level 2025-06-18 12:28:19 +08:00
parent 09bcec1012
commit 428995e243
12 changed files with 187 additions and 58 deletions

View File

@ -31,7 +31,16 @@ import androidx.viewpager2.widget.ViewPager2
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.customview.customView import com.afollestad.materialdialogs.customview.customView
import com.afollestad.materialdialogs.customview.getCustomView import com.afollestad.materialdialogs.customview.getCustomView
import com.airbnb.lottie.LottieAnimationView import com.cncat.vpn.common.log.Log
import com.cncat.vpn.core.model.LogMessage
import com.cncat.vpn.service.ClashManager
import com.cncat.vpn.service.ProfileManager
import com.cncat.vpn.service.model.Profile
import com.cncat.vpn.service.remote.IClashManager
import com.cncat.vpn.service.remote.ILogObserver
import com.cncat.vpn.service.remote.IProfileManager
import com.cncat.vpn.service.remote.wrap
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.JsonArray import com.google.gson.JsonArray
import com.google.gson.JsonObject import com.google.gson.JsonObject
@ -41,14 +50,13 @@ import com.yingmao.clash.BuildConfig
import com.yingmao.clash.R import com.yingmao.clash.R
import com.yingmao.clash.app.MainApplication import com.yingmao.clash.app.MainApplication
import com.yingmao.clash.base.BaseActivity import com.yingmao.clash.base.BaseActivity
import com.cncat.vpn.common.log.Log
import com.yingmao.clash.conf.BZYConstants import com.yingmao.clash.conf.BZYConstants
import com.yingmao.clash.conf.Conf import com.yingmao.clash.conf.Conf
import com.cncat.vpn.core.model.LogMessage import com.yingmao.clash.entity.BannerImgBean
import com.yingmao.clash.entity.CheckLoginRsp import com.yingmao.clash.entity.CheckLoginRsp
import com.yingmao.clash.fragment.NewAccFragment import com.yingmao.clash.fragment.NewAccFragment
import com.yingmao.clash.fragment.NewAccFragment.Companion.CHECK_NODE_REQUEST_CODE
import com.yingmao.clash.fragment.mine.MineFragment import com.yingmao.clash.fragment.mine.MineFragment
import com.yingmao.clash.fragment.recharge.BackupRechargeActivity
import com.yingmao.clash.listener.DownLoadListener import com.yingmao.clash.listener.DownLoadListener
import com.yingmao.clash.net.http.HttpApi import com.yingmao.clash.net.http.HttpApi
import com.yingmao.clash.net.http.HttpReqType import com.yingmao.clash.net.http.HttpReqType
@ -58,35 +66,21 @@ import com.yingmao.clash.net.http.entity.AppVersionCheckRsp
import com.yingmao.clash.net.http.entity.GetActivityRsp import com.yingmao.clash.net.http.entity.GetActivityRsp
import com.yingmao.clash.net.http.entity.HeartBeatRsp import com.yingmao.clash.net.http.entity.HeartBeatRsp
import com.yingmao.clash.net.http.entity.PhDownloadUrlRsp import com.yingmao.clash.net.http.entity.PhDownloadUrlRsp
import com.yingmao.clash.net.http.entity.ShowNode
import com.yingmao.clash.net.http.entity.SubscriptionRsp import com.yingmao.clash.net.http.entity.SubscriptionRsp
import com.yingmao.clash.net.http.entity.VipSignRsp import com.yingmao.clash.net.http.entity.VipSignRsp
import com.yingmao.clash.remote.Remote import com.yingmao.clash.remote.Remote
import com.cncat.vpn.service.ClashManager
import com.cncat.vpn.service.ProfileManager
import com.cncat.vpn.service.model.Profile
import com.cncat.vpn.service.remote.IClashManager
import com.cncat.vpn.service.remote.ILogObserver
import com.cncat.vpn.service.remote.IProfileManager
import com.cncat.vpn.service.remote.wrap
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.yingmao.clash.entity.BannerImgBean
import com.yingmao.clash.fragment.NewAccFragment.Companion.CHECK_NODE_REQUEST_CODE
import com.yingmao.clash.net.http.entity.ExpensesRecordRsp
import com.yingmao.clash.net.http.entity.ShowNode
import com.yingmao.clash.util.AESUtil import com.yingmao.clash.util.AESUtil
import com.yingmao.clash.util.CommonUtils import com.yingmao.clash.util.CommonUtils
import com.yingmao.clash.util.Utils import com.yingmao.clash.util.Utils
import com.yingmao.clash.view.RxToast import com.yingmao.clash.view.RxToast
import com.yingmao.clash.view.adapter.MainVPAdapter import com.yingmao.clash.view.adapter.MainVPAdapter
import com.yingmao.clash.view.dialog.ActivityViewDialog import com.yingmao.clash.view.dialog.ActivityViewDialog
import com.yingmao.clash.view.dialog.ActivityViewDialog.OnDialogClickListener
import com.yingmao.clash.view.dialog.DialogAppVersion import com.yingmao.clash.view.dialog.DialogAppVersion
import com.yingmao.clash.view.dialog.DialogBandChoose import com.yingmao.clash.view.dialog.DialogBandChoose
import com.yingmao.clash.view.dialog.DialogNotice
import com.yingmao.clash.view.dialog.HomeActivityDialog import com.yingmao.clash.view.dialog.HomeActivityDialog
import com.yingmao.clash.view.dialog.RxDialogShapeLoading import com.yingmao.clash.view.dialog.RxDialogShapeLoading
import com.yingmao.clash.vm.MainAtyVM import com.yingmao.clash.vm.MainAtyVM
import com.yingmao.clash.webview.BZYWebViewKeFu
import com.yingmao.clash.webview.BZYWebViewNormal import com.yingmao.clash.webview.BZYWebViewNormal
import com.yingmao.clash.webview.CustomerServiceWebView import com.yingmao.clash.webview.CustomerServiceWebView
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -133,10 +127,14 @@ class NewMainActivity : BaseActivity() {
private var u_timerTask: TimerTask? = null private var u_timerTask: TimerTask? = null
private lateinit var clDeepSeek:ConstraintLayout private lateinit var clDeepSeek:ConstraintLayout
private lateinit var floating:FloatingActionButton private lateinit var floating:FloatingActionButton
var payResultLoading: RxDialogShapeLoading? = null
private var timerJob: Job? = null
private var loadingTimeoutNum = 3
companion object { companion object {
//记录心跳失败次数 //记录心跳失败次数
var HEART_BEAT_FAILURE_FREQUENCY = 0 var HEART_BEAT_FAILURE_FREQUENCY = 0
const val REQUEST_CODE_PAY_WEB_VIEW_ACTIVITY = 1000 const val REQUEST_CODE_PAY_WEB_VIEW_ACTIVITY = 1000
var isSubbed = false
var isSubed = false var isSubed = false
var newUuid: String? = null var newUuid: String? = null
var subUrl: String? = null var subUrl: String? = null
@ -495,8 +493,6 @@ class NewMainActivity : BaseActivity() {
checkPayResultDia?.dismiss() checkPayResultDia?.dismiss()
mainAtyVM.getAirNodes() mainAtyVM.getAirNodes()
RxToast.info(resources.getString(R.string.SuccessfullyUpdatedUserInformation)) RxToast.info(resources.getString(R.string.SuccessfullyUpdatedUserInformation))
} else { } else {
// RxToast.info(resources.getString(R.string.PaymentResultsStr)) // RxToast.info(resources.getString(R.string.PaymentResultsStr))
} }
@ -983,9 +979,6 @@ class NewMainActivity : BaseActivity() {
dialog.show() dialog.show()
} }
var payResultLoading: RxDialogShapeLoading? = null
private var timerJob: Job? = null
private var loadingTimeoutNum = 3
private fun showLoadingDialog(msg: String) { private fun showLoadingDialog(msg: String) {
payResultLoading = RxDialogShapeLoading(this) payResultLoading = RxDialogShapeLoading(this)
payResultLoading!!.setMessage(msg) payResultLoading!!.setMessage(msg)
@ -1199,42 +1192,58 @@ class NewMainActivity : BaseActivity() {
startActivity(intent) startActivity(intent)
} }
public suspend fun setSub2(url: String) { private suspend fun setSub2(url: String) {
Log.d("setSub2 2")
profileBinder?.let { pm -> profileBinder?.let { pm ->
Log.d("setSub2 3")
pm.queryAll().forEach { itemPro -> pm.queryAll().forEach { itemPro ->
Log.d("setSub2 itemPro ==>${itemPro}")
if (itemPro.name != Conf.getClashConfName(this@NewMainActivity.applicationContext)) { if (itemPro.name != Conf.getClashConfName(this@NewMainActivity.applicationContext)) {
Log.d("setSub2 delete ==>${itemPro.name}")
pm.delete(itemPro.uuid) pm.delete(itemPro.uuid)
} }
} }
val pro = pm.queryActive() val pro = pm.queryActive()
Log.d("setSub2 4")
pro?.let { pro?.let {
var actname = it.name
Log.d("new main actname==>" + actname)
Log.d("setSub2 pro 已存在 ==>")
pm.setActive(it) pm.setActive(it)
delay(500) delay(500)
//判断配置文件source
if (!TextUtils.isEmpty(pro.source)) { if (!TextUtils.isEmpty(pro.source)) {
// Log.d("setSub2 pro.source==>${pro.source}, url==>${url}") Log.d("setSub2 pro.source==>${pro.source}, url==>${url}")
//订阅链接不同就更换
if (pro.source != url) { if (pro.source != url) {
Log.d("setSub2 patch") pm.patch(
pm.patch(pro.uuid, pro.name, url, 1800000L) pro.uuid, pro.name,
url, 1800000L
)
pm.commit(pro.uuid) { status -> pm.commit(pro.uuid) { status ->
Log.d("setSub2 updateStatus: " + Gson().toJson(status.args) + ", pro==>" + status.progress) android.util.Log.d(
Conf.TAG,
"new updateStatus: " + Gson().toJson(status.args) + ", pro==>" + status.progress
)
} }
} }
} }
pm.update(it.uuid) pm.update(it.uuid)
newUuid = pro.uuid.toString()
newUuid = pro.uuid.toString(); isSubbed = true
isSubed = true
Log.d("setSub2 setActive end")
} ?: run { } ?: run {
createMyProfile(pm, url) val uuid: UUID = pm.create(
Profile.Type.Url, Conf.getClashConfName(this@NewMainActivity.applicationContext)
)
delay(500)
pm.queryByUUID(uuid)?.let { qPro ->
pm.setActive(qPro)
pm.patch(
qPro.uuid, qPro.name,
url, 1800000L
)
pm.commit(qPro.uuid) { status ->
android.util.Log.d(
Conf.TAG,
"new updateStatus: " + Gson().toJson(status.args) + ", pro==>" + status.progress
)
}
newUuid = qPro.uuid.toString()
isSubbed = true
}
} }
} }
} }

View File

@ -54,11 +54,13 @@ import com.yingmao.clash.util.DataUtils
import com.yingmao.clash.util.DataUtils.getAllFilePath import com.yingmao.clash.util.DataUtils.getAllFilePath
import com.yingmao.clash.view.RxToast import com.yingmao.clash.view.RxToast
import com.yingmao.clash.view.adapter.LanguageAdapter import com.yingmao.clash.view.adapter.LanguageAdapter
import com.yingmao.clash.view.dialog.DialogDoMainChoose
import com.yingmao.clash.view.dialog.RxDialogShapeLoading import com.yingmao.clash.view.dialog.RxDialogShapeLoading
import com.yingmao.clash.view.popwindow.CommonPopupWindow import com.yingmao.clash.view.popwindow.CommonPopupWindow
import com.yingmao.clash.vm.MainAtyVM import com.yingmao.clash.vm.MainAtyVM
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.File import java.io.File
@ -83,9 +85,11 @@ class SettingActivity : BaseActivity() {
private lateinit var clyszc: ConstraintLayout private lateinit var clyszc: ConstraintLayout
private lateinit var clApplicationModeTitleStr: ConstraintLayout private lateinit var clApplicationModeTitleStr: ConstraintLayout
private lateinit var llControlApplication: ConstraintLayout private lateinit var llControlApplication: ConstraintLayout
private lateinit var clSwitching:ConstraintLayout
private lateinit var TVApplicationModeTxt:TextView private lateinit var TVApplicationModeTxt:TextView
private var popupWindow: CommonPopupWindow? = null private var popupWindow: CommonPopupWindow? = null
private var layoutGravity: CommonPopupWindow.LayoutGravity? = null private var layoutGravity: CommonPopupWindow.LayoutGravity? = null
var dialogDoMainChoose: DialogDoMainChoose? = null
@RequiresApi(Build.VERSION_CODES.R) @RequiresApi(Build.VERSION_CODES.R)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -106,6 +110,13 @@ class SettingActivity : BaseActivity() {
clApplicationModeTitleStr=findViewById(R.id.clApplicationModeTitleStr) clApplicationModeTitleStr=findViewById(R.id.clApplicationModeTitleStr)
llControlApplication=findViewById(R.id.llControlApplication) llControlApplication=findViewById(R.id.llControlApplication)
TVApplicationModeTxt=findViewById(R.id.TVApplicationModeTxt) TVApplicationModeTxt=findViewById(R.id.TVApplicationModeTxt)
clSwitching=findViewById(R.id.clSwitching)
clSwitching.setOnClickListener {
RxToast.info(getString(R.string.Switching))
showDomainList()
}
clApplicationModeTitleStr.setOnClickListener { clApplicationModeTitleStr.setOnClickListener {
if (NewAccFragment.clashRunning) { if (NewAccFragment.clashRunning) {
RxToast.info("请关闭加速后再选择.") RxToast.info("请关闭加速后再选择.")
@ -731,4 +742,51 @@ class SettingActivity : BaseActivity() {
} }
private fun showDomainList() {
try {
SplashHelper(mainAtyVM).getHostWithFallback { success ->
MainScope().launch {
if (success) {
if (dialogDoMainChoose == null) {
dialogDoMainChoose = DialogDoMainChoose(this@SettingActivity)
}
if (dialogDoMainChoose?.isShowing == false) {
dialogDoMainChoose?.setOnTryButtonListener(object :
DialogDoMainChoose.OnTryButtonListener {
override fun tryButton() {
RxToast.info(getString(R.string.ModificationFailed))
dialogDoMainChoose?.dismiss()
}
override fun cancel() {
dialogDoMainChoose?.dismiss()
}
})
dialogDoMainChoose?.setOnListItemListener(object :
DialogDoMainChoose.OnListItemListener {
override fun listItemClick() {
RxToast.info(getString(R.string.StorageSuccessful))
MainApplication.restartApp(this@SettingActivity,object:MainApplication.OnRestartButtonListener{
override fun enterButton() {
}
override fun cancelButton() {
dialogDoMainChoose?.dismiss()
}
})
}
})
dialogDoMainChoose?.show()
}
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}
} }

View File

@ -21,7 +21,7 @@ import java.util.ArrayList
open class PublicViewMode : BaseViewMode() { open class PublicViewMode : BaseViewMode() {
fun getHost(callback: AsyncCallback) { fun getHost(callback: AsyncCallback) {
val rt = val rt =
NetService.instances.createFreeBaseUrl("https://pubtofile.oss-cn-hongkong.aliyuncs.com/app_host/") NetService.instances.createFreeBaseUrl("https://yingmao.oss-cn-hongkong.aliyuncs.com/")
doAsyncNoNeedReturn(HttpReqType.GET_HOST) { doAsyncNoNeedReturn(HttpReqType.GET_HOST) {
try { //TODO bug 会引起崩溃 try { //TODO bug 会引起崩溃
val host = when { val host = when {

View File

@ -152,7 +152,7 @@ open class NewAccFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dis
accelerateIv.setOnClickListener(this) accelerateIv.setOnClickListener(this)
refreshExpireIv=view.findViewById(R.id.refresh_expire_iv) refreshExpireIv=view.findViewById(R.id.refresh_expire_iv)
tvDelayMs=view.findViewById(R.id.tvDelayMs) tvDelayMs=view.findViewById(R.id.tvDelayMs)
refreshExpireIv.setOnClickListener { tvEndTime.setOnClickListener {
updateUserInfo() updateUserInfo()
} }
setExpireDate() setExpireDate()

View File

@ -93,10 +93,10 @@ class NetService private constructor() : INetService {
// .sslSocketFactory(getSSLSocketFactory(), CustomTrustManager())//信任所有证书 // .sslSocketFactory(getSSLSocketFactory(), CustomTrustManager())//信任所有证书
.sslSocketFactory(getSSLSocketFactory(), trustAllCerts[0] as X509TrustManager) .sslSocketFactory(getSSLSocketFactory(), trustAllCerts[0] as X509TrustManager)
.hostnameVerifier(getHostnameVerifier()!!) .hostnameVerifier(getHostnameVerifier()!!)
// if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
// builder.addInterceptor(loggingInterceptor)
// }
builder.addInterceptor(loggingInterceptor) builder.addInterceptor(loggingInterceptor)
}
// builder.addInterceptor(loggingInterceptor)
return builder.build() return builder.build()
} }

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M783.1,848.5c-79.8,64.7 -175.9,96.6 -271.7,96.6 -111,0 -221.6,-42.8 -305.9,-127.1 -147.3,-147.3 -168,-374.8 -54.8,-544.7l29.5,96.9c2.9,9.6 11.7,15.8 21.3,15.8 2.1,0 4.3,-0.3 6.5,-1 11.8,-3.6 18.4,-16 14.8,-27.8l-41.9,-137.3c-2.9,-9.6 -11.7,-15.6 -21.2,-15.7h-2.2c-3.8,0 -7.5,0.9 -10.8,2.8L15.8,246.9C4,250.4 -2.6,262.9 1,274.6c3.6,11.8 16,18.4 27.8,14.8l73.2,-22.3c-48.2,80.3 -71.8,173.6 -67.1,268.6C40.7,654.1 90.1,765.5 174,849.4c83.9,83.9 195.3,133.3 313.7,139.1 7.9,0.4 15.8,0.6 23.6,0.6 109.2,0 214.9,-37.2 299.8,-106.1 9.6,-7.7 11,-21.8 3.3,-31.3 -7.8,-9.5 -21.8,-11 -31.3,-3.2zM1023,749.4c-3.6,-11.8 -16,-18.4 -27.8,-14.8L922,756.9c48.2,-80.3 71.8,-173.6 67.1,-268.6 -5.8,-118.4 -55.2,-229.8 -139.1,-313.7C766.2,90.7 654.8,41.3 536.4,35.5 418.8,29.7 303.9,67.2 212.9,141c-9.6,7.7 -11,21.8 -3.3,31.3 7.7,9.6 21.8,11 31.3,3.3C413.2,35.9 661.5,49 818.6,206.1c147.3,147.3 168,374.8 54.8,544.6l-29.5,-96.8c-3.6,-11.8 -16,-18.4 -27.8,-14.8 -11.8,3.6 -18.4,16 -14.8,27.8l41.9,137.3c1.7,5.6 5.6,10.4 10.8,13.2 3.3,1.7 6.9,2.6 10.5,2.6 0.3,0 0.7,-0.1 1,-0.1 0.3,0 0.6,0.1 1,0.1 3.9,0 7.7,-1 11.1,-3l130.8,-39.9c11.6,-3.5 18.2,-16 14.6,-27.7z"
android:fillColor="#FF8A04"/>
</vector>

View File

@ -114,9 +114,8 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
android:layout_marginStart="21dp" android:layout_marginStart="21dp"
android:layout_marginEnd="21dp" android:layout_marginEnd="21dp"
android:layout_marginTop="22dp" android:layout_marginTop="10dp"
android:layout_marginBottom="22dp" android:layout_marginBottom="10dp"
app:layout_constraintBottom_toBottomOf="parent"
> >
<TextView <TextView
@ -125,7 +124,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:layout_marginBottom="10dp" android:layout_marginBottom="10dp"
android:text="@string/LanguageStr" android:text="@string/LanguageSwitchingStr"
android:textColor="#5A2B31" android:textColor="#5A2B31"
android:textSize="16sp" android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
@ -153,7 +152,54 @@
app:layout_constraintEnd_toStartOf="@+id/aiLanguage" app:layout_constraintEnd_toStartOf="@+id/aiLanguage"
app:layout_constraintTop_toTopOf="@+id/aiLanguage" /> app:layout_constraintTop_toTopOf="@+id/aiLanguage" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clSwitching"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/clLanguageSwitchingStr"
android:layout_marginStart="21dp"
android:layout_marginEnd="21dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
app:layout_constraintBottom_toBottomOf="parent"
>
<TextView
android:id="@+id/tvSwitching"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:text="@string/source_switch"
android:textColor="#5A2B31"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/aiSwitching"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/oc_xy"
app:layout_constraintBottom_toBottomOf="@+id/tvSwitching"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/tvSwitching" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="5dp"
android:text="@string/Consistentdevice"
android:textColor="#828282"
android:visibility="gone"
android:textSize="11sp"
app:layout_constraintBottom_toBottomOf="@+id/aiSwitching"
app:layout_constraintEnd_toStartOf="@+id/aiSwitching"
app:layout_constraintTop_toTopOf="@+id/aiSwitching" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
@ -279,7 +325,7 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
android:layout_marginStart="21dp" android:layout_marginStart="21dp"
android:layout_marginEnd="21dp" android:layout_marginEnd="21dp"
android:layout_marginTop="22dp" android:layout_marginTop="10dp"
> >
<TextView <TextView
@ -312,7 +358,7 @@
android:background="#E59E4D" android:background="#E59E4D"
android:layout_marginStart="21dp" android:layout_marginStart="21dp"
android:layout_marginEnd="21dp" android:layout_marginEnd="21dp"
android:layout_marginTop="16dp" android:layout_marginTop="10dp"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/clServiceTerms" app:layout_constraintTop_toBottomOf="@+id/clServiceTerms"
@ -327,8 +373,8 @@
app:layout_constraintTop_toBottomOf="@+id/LineView" app:layout_constraintTop_toBottomOf="@+id/LineView"
android:layout_marginStart="21dp" android:layout_marginStart="21dp"
android:layout_marginEnd="21dp" android:layout_marginEnd="21dp"
android:layout_marginTop="16dp" android:layout_marginTop="10dp"
android:layout_marginBottom="20dp" android:layout_marginBottom="10dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
> >

View File

@ -55,14 +55,17 @@
android:layout_marginStart="10dp" android:layout_marginStart="10dp"
android:textColor="@color/orange_FF8A04" android:textColor="@color/orange_FF8A04"
android:textSize="16sp" android:textSize="16sp"
android:textStyle="bold" /> android:textStyle="bold"
android:drawableRight="@drawable/ic_refresh"
android:drawablePadding="5dp"
/>
<ImageView <ImageView
android:layout_marginStart="5dp" android:layout_marginStart="5dp"
android:id="@+id/refresh_expire_iv" android:id="@+id/refresh_expire_iv"
android:layout_width="25dp" android:layout_width="25dp"
android:layout_height="25dp" android:layout_height="25dp"
android:visibility="visible" android:visibility="gone"
android:src="@drawable/refresh2" android:src="@drawable/refresh2"
android:tint="@color/orange_FF8A04" android:tint="@color/orange_FF8A04"
tools:ignore="UseAppTint" tools:ignore="UseAppTint"

View File

@ -395,4 +395,5 @@ Service Description\n
<string name="RecommendedRoutes">Recommended route</string> <string name="RecommendedRoutes">Recommended route</string>
<string name="timeOut">Route timeout</string> <string name="timeOut">Route timeout</string>
<string name="deepSeekStr">AI Chat</string> <string name="deepSeekStr">AI Chat</string>
<string name="Switching">Switching, please wait</string>
</resources> </resources>

View File

@ -385,4 +385,5 @@
<string name="RecommendedRoutes">推薦線路</string> <string name="RecommendedRoutes">推薦線路</string>
<string name="timeOut">線路超時</string> <string name="timeOut">線路超時</string>
<string name="deepSeekStr">AI 聊天</string> <string name="deepSeekStr">AI 聊天</string>
<string name="Switching">切換中,請稍後</string>
</resources> </resources>

View File

@ -383,4 +383,5 @@
<string name="RecommendedRoutes">推薦線路</string> <string name="RecommendedRoutes">推薦線路</string>
<string name="timeOut">線路超時</string> <string name="timeOut">線路超時</string>
<string name="deepSeekStr">AI 聊天</string> <string name="deepSeekStr">AI 聊天</string>
<string name="Switching">切換中,請稍後</string>
</resources> </resources>

View File

@ -409,4 +409,5 @@
<string name="RecommendedRoutes">推荐线路</string> <string name="RecommendedRoutes">推荐线路</string>
<string name="timeOut">线路超时</string> <string name="timeOut">线路超时</string>
<string name="deepSeekStr">AI聊天</string> <string name="deepSeekStr">AI聊天</string>
<string name="Switching">切换中,请稍后</string>
</resources> </resources>