Repository方法接口完整定义表

59 阅读10分钟

Repository方法接口完整定义表

方法签名说明用途
PrInternetConnectionRepository (pRInternetConnectionRepository)
fun getTurnAllPortsToLANInfo(): Observable<*>获取所有端口转LAN信息支持网络连接V2版本的端口配置
fun getUsbWanInfo(): Observable<*>获取USB WAN连接信息获取USB网络连接的配置和状态
fun getHotspotWanInfo(): Observable<*>获取热点WAN连接信息获取热点模式下的WAN连接配置
fun getConnCheckInfo(): Observable<ConnectionCheckInfo>获取连接检测信息获取网络连接监测的配置参数
fun setMacClone(macCloneType: Byte, customMacAddress: String): Completable设置MAC克隆配置MAC地址克隆功能
fun setConnCheckInfo(info: ConnectionCheckInfo): Completable设置连接检测信息配置网络连接监测参数
fun setMultiWanInfo(params: MultiWanInfo): Completable设置多WAN信息配置多WAN负载均衡和备份设置
fun reverseEthernetFoldStatus(): Unit切换以太网折叠状态控制UI中以太网信息的展开/折叠显示
fun reverseUsbFoldStatus(): Unit切换USB折叠状态控制UI中USB信息的展开/折叠显示
fun reverseHotspotFoldStatus(): Unit切换热点折叠状态控制UI中热点信息的展开/折叠显示
fun getEthernetFoldStatus(): Boolean获取以太网折叠状态获取以太网信息当前的显示状态
fun getUsbFoldStatus(): Boolean获取USB折叠状态获取USB信息当前的显示状态
fun getHotspotFoldStatus(): Boolean获取热点折叠状态获取热点信息当前的显示状态
fun getConnCheckInfoLiveData(): MutableLiveData<Resource<ConnectionCheckInfo>>连接检测信息LiveData提供连接检测配置的响应式数据
fun getUsbWanInfoLiveData(): LiveData<Resource<PortableUsbWanInfo>>USB WAN信息LiveData提供USB连接信息的响应式数据
fun getTurnAllPortsToLANInfoLiveData(): MutableLiveData<Resource<TurnAllPortsToLANInfo>>端口转LAN信息LiveData提供端口配置的响应式数据
PortableRouterRepository (pRSummaryRepository)
fun getSummaryInfo(): Observable<PortableRouterBean>获取便携路由器汇总信息获取路由器模式信息、多WAN状态等核心配置
fun doConnectConnection(connectionType: String): Observable<*>连接指定类型的网络连接启用特定网络连接类型(以太网/USB/热点)
fun disconnectConnection(connectionType: String): Observable<*>断开指定类型的网络连接禁用特定网络连接类型
fun setNetworkInfo(params: SetConnectionParam): Observable<*>设置网络信息配置网络连接模式和参数
fun getPortableRouterSummaryInfo(): PortableRouterBean?获取便携路由器汇总信息(同步)同步获取当前路由器状态信息
fun getPortableRouterSummaryInfoLiveData(): MutableLiveData<Resource<PortableRouterBean>>便携路由器汇总信息LiveData提供响应式的路由器状态数据绑定
RouterWanRepository (wanRepository)
fun getMACCloneInfo(): Observable<*>获取MAC克隆信息获取当前MAC克隆配置状态
fun getWanConnInfoV40(): Observable<WanInfoBean>获取WAN连接信息V4.0获取WAN连接的详细配置信息
fun getPortableHotspotWanInfo(): Observable<WanInfoBean>获取便携热点WAN信息获取热点模式下的WAN连接信息
fun isConnectedViaATA(): Boolean检查是否通过ATA连接判断当前是否使用ATA连接方式
fun setWanConnInfoV40(params: WanInfoParams): Completable设置WAN连接信息V4.0配置WAN连接参数
fun setPortableHotspotWanInfo(params: WanInfoParams): Completable设置便携热点WAN信息配置热点模式的WAN连接
fun getMacCloneBean(): MacCloneBean?获取MAC克隆Bean获取MAC克隆配置的详细信息对象
fun getWanInfoSourceLiveData(): MutableLiveData<Resource<WanInfoBean?>>WAN信息源LiveData提供WAN连接信息的响应式数据
fun getHotspotWanInfoSourceLiveData(): MutableLiveData<Resource<WanInfoBean?>>热点WAN信息源LiveData提供热点WAN信息的响应式数据
fun getWanInfo(): WanInfoBean?获取WAN信息Bean当前WAN连接的配置信息对象
OpModeRepository (opModeRepository)
fun getPortableRouterOperationModeInfo(): Observable<*>获取便携路由器操作模式信息获取当前的操作模式配置
fun setPortableRouterOperationModeInfo(mode: String): Completable设置便携路由器操作模式信息切换路由器的操作模式
fun getHotspotNeedReboot(): Boolean获取热点是否需要重启判断切换热点模式是否需要设备重启
fun setPortableRouterOperationModeV4Info(params: PortableRouterOpModeV4Params): Observable<PortableRouterOpModeV4Result>设置便携路由器操作模式V4信息设置新版本的操作模式,支持无重启切换
fun setUsbType(mode: String): Observable<*>设置USB类型配置USB连接的设备类型(调制解调器/网络共享)
fun getPortableOpModeInfoLiveData(): LiveData<*>便携操作模式信息LiveData提供操作模式的响应式数据
fun getPortableRouteModeBean(): PortableRouteModeBean?获取便携路由模式Bean当前路由模式的配置对象
ReRepository (reRepository)
fun getMainApInfo(): Observable<*>获取主AP信息获取主要接入点的配置信息
fun getRepeaterConnInfo(): Observable<*>获取中继器连接信息获取中继器模式的连接状态和配置
fun isConnectedViaATA(): Boolean检查是否通过ATA连接判断当前是否使用ATA连接方式
fun setRepeaterConnInfo(connInfoList: RepeaterConnInfoList): Observable<*>设置中继器连接信息配置中继器的连接参数和频段信息
fun getRepeaterConnInfoInfo(): RepeaterConnInfoBean?获取中继器连接信息Bean当前中继器连接的配置信息对象

统计汇总

  • 总计方法数: 43个
  • PrInternetConnectionRepository: 16个方法
  • PortableRouterRepository: 6个方法
  • RouterWanRepository: 10个方法
  • OpModeRepository: 7个方法
  • ReRepository: 5个方法
package com.tplink.tether.tether_4_0.component.more.internetconnection.view

import android.content.DialogInterface
import android.os.Bundle
import android.text.Editable
import android.text.TextUtils
import android.text.TextWatcher
import android.view.*
import androidx.core.view.isVisible
import androidx.databinding.Observable
import androidx.databinding.ObservableBoolean
import androidx.lifecycle.ViewModelProvider
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.tplink.design.dialog.TPToastDialog
import com.tplink.design.snackbar.TPSnackBar
import com.tplink.tether.R
import com.tplink.tether.databinding.*
import com.tplink.tether.model.tracker.TrackerDefine
import com.tplink.tether.model.tracker.TrackerMgr
import com.tplink.tether.network.tmp.beans.ipv6.Ipv6AdvanceBean
import com.tplink.tether.network.tmp.beans.ipv6.Ipv6InfoSetBean
import com.tplink.tether.tether_4_0.base.AbstractTetherBaseFragment
import com.tplink.tether.tether_4_0.base.activityNetworkViewModels
import com.tplink.tether.tether_4_0.base.startLoading
import com.tplink.tether.tether_4_0.base.stopLoading
import com.tplink.tether.tether_4_0.component.more.internetconnection.portablerouter.view.ConnectionMethodSelectFragment
import com.tplink.tether.tether_4_0.component.more.internetconnection.portablerouter.viewmodel.PrInternetConnectionViewModel
import com.tplink.tether.tether_4_0.component.more.internetconnection.viewmodel.Ipv6AdvancedSettingViewModelV4
import com.tplink.tether.tether_4_0.component.more.internetconnection.viewmodel.Ipv6SettingViewModelV4
import com.tplink.tether.tether_4_0.component.more.internetconnection.viewmodel.Ipv6SettingViewModelV4.Companion.NO_SELECTION
import com.tplink.tether.tether_4_0.component.network.dashboard.repository.bo.PortableRouterModeInfoConnectionType
import com.tplink.tether.tmp.model.Device
import com.tplink.tether.tmp.packet.TMPDefine
import com.tplink.tether.util.UIUtils
import com.tplink.tether.viewmodel.BaseViewModelFactory
import com.tplink.tether.viewmodel.ipv6.Ipv66To4AdvancedSettingViewModel


class Ipv6SettingFragment : AbstractTetherBaseFragment<FragmentIpv6SettingBinding>() {
private val prInternetConnectionViewModel by activityNetworkViewModels<PrInternetConnectionViewModel>()
private lateinit var binding: FragmentIpv6SettingBinding
private val DEFAULT_MTUS_SIZE = "1500"
private val DEFAULT_RELEASE_TIME = "86400"

companion object {
val CURRENCONTYPE = "currentConType"

@JvmStatic
fun newInstance() =
Ipv6SettingFragment().apply {
}
}

private var settingWanStaticipV6Binding: SettingWanStaticipV6Binding? = null
private var settingWanDynamicipV6Binding: SettingWanDynamicipV6Binding? = null
private var settingWanPppoeV6Binding: SettingWanPppoeV6Binding? = null
private var settingWan6to4TunnelBinding: SettingWan6to4TunnelBinding? = null

private lateinit var vs_dynamicip_ipv6: ViewStub
private lateinit var vs_staticip_ipv6: ViewStub
private lateinit var vs_pppoe_ipv6: ViewStub
private lateinit var vs_6to4: ViewStub

private lateinit var commonToolBarBinding: CommonToolbar40Binding
private lateinit var advancedViewModel: Ipv6AdvancedSettingViewModelV4
private lateinit var to4viewModel: Ipv66To4AdvancedSettingViewModel
private lateinit var viewModel: Ipv6SettingViewModelV4
private var advancedBean: Ipv6AdvanceBean? = null
private var menuItem: MenuItem? = null
private var isInit = false
private var connTypeChoose = false
private var assignTypeChoose = false
private var isSave = false

override fun bindView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): FragmentIpv6SettingBinding {
binding = FragmentIpv6SettingBinding.inflate(layoutInflater)
viewModel = ViewModelProvider(
requireActivity(),
BaseViewModelFactory(this)
)[Ipv6SettingViewModelV4::class.java]

advancedViewModel = ViewModelProvider(
requireActivity(),
BaseViewModelFactory(this)
)[Ipv6AdvancedSettingViewModelV4::class.java]

to4viewModel = ViewModelProvider(
requireActivity(),
BaseViewModelFactory(this)
)[Ipv66To4AdvancedSettingViewModel::class.java]
init()
initView()
initViewStub()
initListener()
updateView()
return binding
}

private fun init() {
viewModel.currentConnTypeSettingPage.set(viewModel.currentConnType.get())
advancedViewModel.currentConnType = viewModel.currentConnTypeSettingPage.get()
if (viewModel.currentConnTypeSettingPage.get() == TMPDefine.IPV6_CONN_MODE.CONN_TYPE_DYNAMICIP) {
advancedViewModel.init(viewModel.advancedDynamicBean)
}
if (viewModel.currentConnTypeSettingPage.get() == TMPDefine.IPV6_CONN_MODE.CONN_TYPE_PPPOE) {
advancedViewModel.init(viewModel.advancedPppoeBean)
}
to4viewModel.customDnsAddressEnable.set(viewModel.custom6To4DnsEnable)
to4viewModel.primaryDns.set(viewModel.custom6To4DnsPrimary)
to4viewModel.secondaryDns.set(viewModel.custom6To4DnsSecondary)
}

override fun subscribeViewModel(savedInstanceState: Bundle?) {
viewModel.saveSuccess.observe(viewLifecycleOwner) {
TrackerMgr.getInstance().commonTrack(
TrackerDefine.EVENT_CATEGORY.INTERNET_CONNECTION,
TrackerDefine.EVENT_ACTION.IPV6_CONNECTION_PAGE, TrackerDefine.EVENT_LABLE.IPV6
)
it?.let {
handleRequestResult(it)
}
}

viewModel.renewSuccess.observe(viewLifecycleOwner) {
it?.let {
settingWanDynamicipV6Binding!!.ipv6RenewV4.reset()

handleRequestResult(it)
}
}
viewModel.connectSuccess.observe(viewLifecycleOwner) {
it?.let {
settingWanPppoeV6Binding?.ipv6ConnectV4?.reset()
settingWan6to4TunnelBinding?.ipv66to4ConnectV4?.reset()
handleRequestResult(it)
}
}

viewModel.releaseSuccess.observe(viewLifecycleOwner) {
it?.let {
settingWanDynamicipV6Binding!!.ipv6ReleaseV4.reset()
handleRequestResult(it)
}
}

viewModel.disconnectSuccess.observe(viewLifecycleOwner) {
it?.let {
settingWanPppoeV6Binding?.ipv6DisconnectV4?.reset()
handleRequestResult(it)
}
}

viewModel.uiChange.showOrDismissDialog.observe(viewLifecycleOwner) {
it?.let {
if (it) {
TPToastDialog.showLoading(requireContext())
} else {
TPToastDialog.dismiss()
}
}
}

viewModel.selectedType.observe(viewLifecycleOwner) {
changeWanType(it)
}
viewModel.refresh1.observe(viewLifecycleOwner) {
updateViewFromDetailPage()
}

viewModel.updateAssignedType.observe(viewLifecycleOwner) {
viewModel.currentAssignedTypeSettingPage.set(it)
showLanAssignedTypeView(it)
showWanTypeStubView(viewModel.currentConnTypeSettingPage.get().toInt())
}

advancedViewModel.advancedSave.observe(viewLifecycleOwner) { advanceBean ->
advancedBean = advanceBean
advancedBean?.let {
viewModel.saveAdvanceParams(it)
}
showLanAssignedTypeView(viewModel.currentAssignedTypeSettingPage.get())
updateWanTypeStubView(viewModel.currentConnTypeSettingPage.get())
}

viewModel.updateInternetAccessModeEvent.observe(viewLifecycleOwner) {
updateInternetAccessMode()
}
}

private fun updateWanTypeStubView(selected_type: Byte) {
binding.tptfIpv6AddressPrefix.isEnabled = false
binding.rlIpv6AddressPrefixLayout.visibility = View.GONE
settingWanDynamicipV6Binding?.tptlivIpv6DynamicIp?.visibility = View.VISIBLE
when (selected_type) {
TMPDefine.IPV6_CONN_MODE.CONN_TYPE_DYNAMICIP -> {
if (viewModel.advancedDynamicBean.currentAddressType == TMPDefine.IPV6_ADDRESS_GET_MODE.ADDRESS_GET_TYPE_NON_ADDRESS) {
settingWanDynamicipV6Binding?.tptlivIpv6DynamicIp?.visibility = View.GONE
}
viewModel.advancedDynamicBean.prefixDelegainEnable?.let {
binding.tptfIpv6AddressPrefix.isEnabled = !it
if (!it) {
binding.rlIpv6AddressPrefixLayout.visibility = View.GONE
}
}
// 与初始数据进行对比,与初始数据相同则认为没有改变
viewModel.isDyanamicAdvanceChange = !isAdvanceSame(
viewModel.advancedDynamicBean.clone(),
viewModel.advancedDynamicBeanGet.clone()
)
}

TMPDefine.IPV6_CONN_MODE.CONN_TYPE_PPPOE -> {
if (viewModel.advancedPppoeBean.currentAddressType == TMPDefine.IPV6_ADDRESS_GET_MODE.ADDRESS_GET_TYPE_NON_ADDRESS) {

}
if (viewModel.advancedPppoeBean.currentAddressType == TMPDefine.IPV6_ADDRESS_GET_MODE.ADDRESS_GET_TYPE_SPEDIFIED_BY_ISP) {
binding.tptfIpv6AddressPrefix.isEnabled = true
binding.rlIpv6AddressPrefixLayout.visibility = View.VISIBLE
} else {
viewModel.advancedPppoeBean.prefixDelegainEnable?.let {
binding.tptfIpv6AddressPrefix.isEnabled = !it
if (!it) {
binding.rlIpv6AddressPrefixLayout.visibility = View.GONE
}
}
}
viewModel.isPppoeAdvanceChange = !isAdvanceSame(
viewModel.advancedPppoeBean.clone(),
viewModel.advancedPppoeBeanGet.clone()
)
}
}
if (!binding.tptfIpv6AddressPrefix.isEnabled) {
binding.tptfIpv6AddressPrefix.setText("")
}
setOptionsMenuEnable(checkValidate() && !checkSame())
}

private fun isAdvanceSame(cloneBean: Ipv6AdvanceBean, cloneBeanGet: Ipv6AdvanceBean): Boolean {
val formatCloneBean = formatAdvancedDynamicString(cloneBean)
val formatCloneBeanGet = formatAdvancedDynamicString(cloneBeanGet)
return formatCloneBean.ipAddress == formatCloneBeanGet.ipAddress &&
formatCloneBean.prefixDelegainEnable == formatCloneBeanGet.prefixDelegainEnable &&
formatCloneBean.currentAddressType == formatCloneBeanGet.currentAddressType &&
formatCloneBean.currentDnsAddressType == formatCloneBeanGet.currentDnsAddressType &&
formatCloneBean.primaryDns == formatCloneBeanGet.primaryDns &&
formatCloneBean.secondaryDns == formatCloneBeanGet.secondaryDns &&
formatCloneBean.customPrimaryDns == formatCloneBeanGet.customPrimaryDns &&
formatCloneBean.customSecondaryDns == formatCloneBeanGet.customSecondaryDns
}

private fun formatAdvancedDynamicString(advancedDynamicBean: Ipv6AdvanceBean): Ipv6AdvanceBean {
if (advancedDynamicBean.ipAddress.isNullOrEmpty()) {
advancedDynamicBean.ipAddress = null
}
if (advancedDynamicBean.primaryDns.isNullOrEmpty()) {
advancedDynamicBean.primaryDns = null
}
if (advancedDynamicBean.secondaryDns.isNullOrEmpty()) {
advancedDynamicBean.secondaryDns = null
}
if (advancedDynamicBean.customPrimaryDns.isNullOrEmpty()) {
advancedDynamicBean.customPrimaryDns = null
}
if (advancedDynamicBean.customSecondaryDns.isNullOrEmpty()) {
advancedDynamicBean.customSecondaryDns = null
}
return advancedDynamicBean
}

private fun changeWanType(selectedType: Int) {
if (viewModel.currentConnTypeSettingPage.get().toInt() != selectedType) {
viewModel.currentConnTypeSettingPage.set(selectedType.toByte())
advancedViewModel.currentConnType = viewModel.currentConnTypeSettingPage.get()
showLanAssignedTypeView(viewModel.currentAssignedTypeSettingPage.get())
showWanTypeStubView(selectedType)
}
}

private fun updateView() {
isInit = true
viewModel.isDyanamicAdvanceChange = false
viewModel.isPppoeAdvanceChange = false
viewModel.isTunnel6to4AdvanceChange = false
showLanAssignedTypeView(viewModel.currentAssignedTypeSettingPage.get())
showWanTypeStubView(viewModel.currentConnTypeSettingPage.get().toInt())
if (Device.getGlobalDevice().wan_conn_type != TMPDefine.WAN_CONN_MODE.CONN_TYPE_PPPOE) {
settingWanPppoeV6Binding!!.tptlvSyncIpv4Edit.getTitle().isEnabled = false
}
updateInternetAccessMode()
isInit = false
}

private fun updateInternetAccessMode() {
if(prInternetConnectionViewModel.isSupportInternetConnectionV2()) {
binding.itemConnectionMethod.setContentText(getMethodStr(viewModel.internetAccessMode))
binding.tptConnectionType.setContentText(R.string.onemesh_please_select)
viewModel.currentConnTypeSettingPage.set(NO_SELECTION.toByte())
showWanTypeStubView(NO_SELECTION)
}
}

private fun getMethodStr(method: String?): Int {
if (method == null) return 0
return when (method) {
PortableRouterModeInfoConnectionType.ETHERNET -> R.string.common_ethernet
PortableRouterModeInfoConnectionType.USB -> R.string.usb_internet
else -> R.string.hotspot
}
}

private fun updateViewFromDetailPage() {
viewModel.currentConnTypeSettingPage.set(viewModel.currentConnType.get())
viewModel.currentAssignedTypeSettingPage.set(viewModel.currentAssignedType.get())
isInit = true
viewModel.isDyanamicAdvanceChange = false
viewModel.isPppoeAdvanceChange = false
viewModel.isTunnel6to4AdvanceChange = false
showLanAssignedTypeView(viewModel.currentAssignedType.get())
showWanTypeStubView(viewModel.currentConnType.get().toInt())
if (Device.getGlobalDevice().wan_conn_type != TMPDefine.WAN_CONN_MODE.CONN_TYPE_PPPOE) {
settingWanPppoeV6Binding!!.tptlvSyncIpv4Edit.getActionSwitch().isEnabled = false
settingWanPppoeV6Binding!!.tptlvSyncIpv4Edit.getTitle().isEnabled = false
}
isInit = false
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
menu.clear()
inflater.inflate(R.menu.common_save_0, menu)
menuItem = menu.findItem(R.id.common_save_0)
menuItem?.isEnabled = false
setOptionsMenuEnable(checkValidate() && !checkSame())
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.common_save_0 -> {
menuItem?.startLoading(requireContext())
isSave = true
viewModel.setIpv6Info(getSaveParams())
}
}
return super.onOptionsItemSelected(item)
}

override fun onHiddenChanged(hidden: Boolean) {
setSupportActionBar(commonToolBarBinding.toolbar)
setOptionsMenuEnable(checkValidate() && !checkSame())
super.onHiddenChanged(hidden)
}

private fun initView() {
commonToolBarBinding = CommonToolbar40Binding.bind(binding.root)
setHasOptionsMenu(true)
commonToolBarBinding.toolbar.title = getString(R.string.mobile_network_new_apn_type_ipv6)
commonToolBarBinding.toolbar.setNavigationOnClickListener {
onBackPressed()
}
setSupportActionBar(commonToolBarBinding.toolbar)

binding.tptConnectionType.setOnClickListener {
UIUtils.hideIME(requireActivity())
gotoWanTypeSelect()
}

if (prInternetConnectionViewModel.isSupportInternetConnectionV2()) {
binding.itemConnectionMethod.isVisible = true
binding.itemConnectionMethod.setOnClickListener {
viewModel.commonSwitchFragmentEvent.postValue(ConnectionMethodSelectFragment::class.java.name)
}
} else {
binding.itemConnectionMethod.isVisible = false
}

binding.tptlivAssignedType.setOnClickListener {
UIUtils.hideIME(requireActivity())
gotoIpv6LanSelectFragment()
}

binding.editTextIpv6ReleaseTimeNote.text =
getString(R.string.setting_ipv6_staticip_mtu_note, DEFAULT_RELEASE_TIME)

binding.tptlivAdvancedSetting.setOnClickListener {
UIUtils.hideIME(requireActivity())
gotoAdvancedSettingFragment()
}
}

private fun gotoIpv6LanSelectFragment() {
viewModel.gotoIpv6AssignedTypeSelectFragment.postValue(viewModel.currentAssignedTypeSettingPage.get())
}

private fun goto6to4AdvancedFragment() {
viewModel.goto6to4AdvancedFragment.postValue(true)
}

private fun gotoAdvancedSettingFragment() {
val bean: Ipv6AdvanceBean =
if (viewModel.currentConnTypeSettingPage.get() == TMPDefine.IPV6_CONN_MODE.CONN_TYPE_DYNAMICIP) {
viewModel.advancedDynamicBean
} else {
viewModel.advancedPppoeBean
}
viewModel.gotoAdvancedSettingFragment.postValue(bean)
}

private fun initViewStub() {
vs_staticip_ipv6 = binding.root.findViewById(R.id.viewstub_staticip_ipv6)
vs_staticip_ipv6.setOnInflateListener { _: ViewStub?, _: View? ->
settingWanStaticipV6Binding = SettingWanStaticipV6Binding.bind(binding.root)
}
vs_staticip_ipv6.inflate()

vs_dynamicip_ipv6 = binding.root.findViewById(R.id.viewstub_dynamicip_ipv6)
vs_dynamicip_ipv6.setOnInflateListener { _: ViewStub?, _: View? ->
settingWanDynamicipV6Binding = SettingWanDynamicipV6Binding.bind(binding.root)
}
vs_dynamicip_ipv6.inflate()

vs_pppoe_ipv6 = binding.root.findViewById(R.id.viewstub_pppoe_ipv6)
vs_pppoe_ipv6.setOnInflateListener { _: ViewStub?, _: View? ->
settingWanPppoeV6Binding = SettingWanPppoeV6Binding.bind(binding.root)
}
vs_pppoe_ipv6.inflate()

vs_6to4 = binding.root.findViewById(R.id.viewstub_ipv6_6to4)
vs_6to4.setOnInflateListener { _: ViewStub?, _: View? ->
settingWan6to4TunnelBinding = SettingWan6to4TunnelBinding.bind(binding.root)
}
vs_6to4.inflate()

vs_staticip_ipv6.visibility = View.GONE
vs_dynamicip_ipv6.visibility = View.GONE
vs_pppoe_ipv6.visibility = View.GONE
vs_6to4.visibility = View.GONE

settingWanStaticipV6Binding!!.tvIpv6StaticMtuTvV4.text =
getString(R.string.setting_ipv6_staticip_mtu_note, DEFAULT_MTUS_SIZE)

settingWanDynamicipV6Binding!!.ipv6RenewV4.setOnClickListener {
isSave = true
viewModel.setIpv6Renew()
}

settingWanDynamicipV6Binding!!.ipv6ReleaseV4.setOnClickListener {
isSave = true
viewModel.setIpv6Release()
}

settingWanPppoeV6Binding!!.tptlvSyncIpv4Edit.getActionSwitch()
.setOnCheckedChangeListener { _, isChecked ->
if (isChecked)
settingWanPppoeV6Binding!!.settingIpv6UserInfoV4.visibility = View.GONE
else
settingWanPppoeV6Binding!!.settingIpv6UserInfoV4.visibility = View.VISIBLE
UIUtils.hideIME(binding.root)
setOptionsMenuEnable(checkValidate() && !checkSame())
}

settingWanPppoeV6Binding!!.ipv6ConnectV4.setOnClickListener {
isSave = true
viewModel.setIpv6Connect(getSaveParams())
}

settingWanPppoeV6Binding!!.ipv6DisconnectV4.setOnClickListener {
isSave = true
viewModel.setIpv6Disconnect()
}

settingWan6to4TunnelBinding?.tptliv6to4CustomDnsAddress?.setOnClickListener {
goto6to4AdvancedFragment()
}

settingWan6to4TunnelBinding?.ipv66to4ConnectV4?.setOnClickListener {
isSave = true
viewModel.setIpv6Connect(getSaveParams())
}

settingWan6to4TunnelBinding?.ipv66to4DisconnectV4?.setOnClickListener {
isSave = true
viewModel.setIpv6Disconnect()
}
}

private fun initListener() {
settingWanStaticipV6Binding!!.tptfIpv6StaticIpV4.onFocusChangeListener = focusChangeListener
settingWanStaticipV6Binding!!.tptfIpv6StaticDefaultGatewayV4.onFocusChangeListener =
focusChangeListener
settingWanStaticipV6Binding!!.tptfIpv6StaticMtuV4.onFocusChangeListener =
focusChangeListener

settingWanStaticipV6Binding!!.tptfIpv6StaticPrimaryDnsV4.onFocusChangeListener =
focusChangeListener
settingWanStaticipV6Binding!!.tptfIpv6StaticSecondDnsV4.onFocusChangeListener =
focusChangeListener
settingWanPppoeV6Binding!!.editTextIpv6PppoeUsernameV4.onFocusChangeListener =
focusChangeListener
settingWanPppoeV6Binding!!.editTextIpv6PppoePasswordV4.onFocusChangeListener =
focusChangeListener

binding.tptfIpv6AddressPrefix.onFocusChangeListener = focusChangeListener
binding.tptfIpv6ReleaseTime.onFocusChangeListener = focusChangeListener
initTextChangeListener()
setEnableListener()
}

private val focusChangeListener = View.OnFocusChangeListener { view, hasFocus ->
if (hasFocus) {
UIUtils.showIME(requireContext(), view)
}
}

private fun gotoWanTypeSelect() {
viewModel.gotoIpv6TypeSelectFragment.postValue(viewModel.currentConnTypeSettingPage.get().toInt())
}

private fun handleRequestResult(isSuccess: Boolean) {
menuItem?.stopLoading()
if (isSuccess) {
if (isSave) {
TPSnackBar.show(binding.root, getString(R.string.common_succeeded)) {
showTop = true
belowActionBar = true
duration = Snackbar.LENGTH_SHORT
}
viewModel.commonBack.postValue(true)
isSave = false
}
updateView()
} else {
if (isSave) {
TPSnackBar.show(binding.root, getString(R.string.common_failed)) {
showTop = true
belowActionBar = true
duration = Snackbar.LENGTH_SHORT
}
isSave = false
}
}
}

private fun showWanTypeStubView(selectedType: Int) {
connTypeChoose = true
vs_staticip_ipv6.visibility = View.GONE
vs_dynamicip_ipv6.visibility = View.GONE
vs_pppoe_ipv6.visibility = View.GONE
vs_6to4.visibility = View.GONE
settingWanPppoeV6Binding?.llEditBottom?.visibility = View.VISIBLE
settingWanDynamicipV6Binding!!.ipv6RenewV4.isEnabled = true
settingWanDynamicipV6Binding!!.ipv6ReleaseV4.isEnabled = true
settingWanPppoeV6Binding?.ipv6DisconnectV4?.isEnabled = true
settingWanPppoeV6Binding?.ipv6ConnectV4?.visibility = View.GONE
settingWanPppoeV6Binding?.ipv6DisconnectV4?.visibility = View.GONE
settingWanDynamicipV6Binding?.tptlivIpv6DynamicIp?.visibility = View.VISIBLE
binding.tptfIpv6AddressPrefix.isEnabled = true
// selectedType属于0-4范围才表示已经选择过connectionType了
if (selectedType in TMPDefine.IPV6_CONN_MODE.CONN_TYPE_STATICIP.toInt()..TMPDefine.IPV6_CONN_MODE.CONN_TYPE_PASS_THROUGH.toInt()) {
binding.llIpv6Lan.visibility = View.VISIBLE
binding.tptlivAdvancedSetting.visibility = View.VISIBLE
binding.tvUnableNote.visibility = View.GONE
} else {
binding.llIpv6Lan.visibility = View.GONE
binding.tptlivAdvancedSetting.visibility = View.GONE
binding.tvUnableNote.visibility = View.VISIBLE
}
when (selectedType) {
TMPDefine.IPV6_CONN_MODE.CONN_TYPE_STATICIP.toInt() -> {
vs_staticip_ipv6.visibility = View.VISIBLE
settingWanPppoeV6Binding?.llEditBottom?.visibility = View.GONE
binding.tptConnectionType.setContentText(getString(R.string.setting_wan_type_static_ip))
binding.tptlivAdvancedSetting.visibility = View.GONE
val staticIpMode = viewModel.ipv6Info.staticIpMode
if (staticIpMode?.ip?.isEmpty() != true) {
settingWanStaticipV6Binding!!.tptfIpv6StaticIpV4.setText(staticIpMode.ip)
}
if (staticIpMode?.gateway?.isEmpty() != true) {
settingWanStaticipV6Binding!!.tptfIpv6StaticDefaultGatewayV4.setText(
staticIpMode?.gateway
)
}
if (staticIpMode?.primaryDns?.isEmpty() != true) {
settingWanStaticipV6Binding!!.tptfIpv6StaticPrimaryDnsV4.setText(staticIpMode?.primaryDns)
}
if (staticIpMode?.secondaryDns.isNullOrEmpty() != true) {
settingWanStaticipV6Binding!!.tptfIpv6StaticSecondDnsV4.setText(staticIpMode?.secondaryDns)
}
settingWanStaticipV6Binding!!.tptfIpv6StaticMtuV4.setText(staticIpMode?.mtuSize.toString())
}
TMPDefine.IPV6_CONN_MODE.CONN_TYPE_DYNAMICIP.toInt() -> {
vs_dynamicip_ipv6.visibility = View.VISIBLE
binding.tptConnectionType.setContentText(getString(R.string.setting_ipv6_dynamic_ip))
val dynamicIpMode = viewModel.ipv6Info.dynamicIpMode
if (viewModel.ipv6Info?.isEnable != true) {
settingWanDynamicipV6Binding?.ipv6RenewV4?.isEnabled = false
}
if (TextUtils.isEmpty(dynamicIpMode?.ip)) {
settingWanDynamicipV6Binding?.tptlivIpv6DynamicIp?.setContentText("-")
settingWanDynamicipV6Binding!!.ipv6ReleaseV4.isEnabled = false
} else {
settingWanDynamicipV6Binding?.tptlivIpv6DynamicIp?.setContentText(dynamicIpMode?.ip)
}
if (viewModel.advancedDynamicBean.currentDnsAddressType == TMPDefine.IPV6_DNS_ADDRESS_MODE.DNS_ADDRESS_TYPE_CUSTOM) {
settingWanDynamicipV6Binding?.tptlivIpv6DynamicPrimaryDns?.setContentText(
viewModel.advancedDynamicBean.customPrimaryDns
)
settingWanDynamicipV6Binding?.tptlivIpv6DynamicSecondaryDns?.setContentText(
viewModel.advancedDynamicBean.customSecondaryDns
)
} else {
if (TextUtils.isEmpty(dynamicIpMode?.primaryDns))
settingWanDynamicipV6Binding?.tptlivIpv6DynamicPrimaryDns?.setContentText("-")
else
settingWanDynamicipV6Binding?.tptlivIpv6DynamicPrimaryDns?.setContentText(
dynamicIpMode?.primaryDns
)
if (TextUtils.isEmpty(dynamicIpMode?.secondaryDns))
settingWanDynamicipV6Binding?.tptlivIpv6DynamicSecondaryDns?.setContentText(
"-"
)
else
settingWanDynamicipV6Binding?.tptlivIpv6DynamicSecondaryDns?.setContentText(
dynamicIpMode?.secondaryDns
)
}
viewModel.advancedDynamicBean.prefixDelegainEnable?.let {
binding.tptfIpv6AddressPrefix.isEnabled = !it
if (!it) {
binding.rlIpv6AddressPrefixLayout.visibility = View.GONE
}
}

if (viewModel.advancedDynamicBean.currentAddressType == TMPDefine.IPV6_ADDRESS_GET_MODE.ADDRESS_GET_TYPE_NON_ADDRESS) {
settingWanDynamicipV6Binding?.tptlivIpv6DynamicIp?.visibility = View.GONE
}
}
TMPDefine.IPV6_CONN_MODE.CONN_TYPE_PPPOE.toInt() -> {
settingWanPppoeV6Binding?.ipv6ConnectV4?.visibility = View.VISIBLE
settingWanPppoeV6Binding?.ipv6DisconnectV4?.visibility = View.VISIBLE
vs_pppoe_ipv6.visibility = View.VISIBLE
binding.tptConnectionType.setContentText(getString(R.string.setting_wan_type_pppoe))
val pppoeMode = viewModel.ipv6Info.pppoeMode
if (pppoeMode?.isConnect != true) {
settingWanPppoeV6Binding?.ipv6DisconnectV4?.isEnabled = false
}
if (pppoeMode?.username?.isNotEmpty() == true) {
settingWanPppoeV6Binding!!.editTextIpv6PppoeUsernameV4.setText(pppoeMode.username)
}
if (pppoeMode?.password?.isNotEmpty() == true) {
settingWanPppoeV6Binding!!.editTextIpv6PppoePasswordV4.setText(pppoeMode.password)
}
settingWanPppoeV6Binding!!.tptlvSyncIpv4Edit.getActionSwitch().isChecked =
pppoeMode?.isUseSameAccount == true

if (viewModel.advancedPppoeBean.currentAddressType == TMPDefine.IPV6_ADDRESS_GET_MODE.ADDRESS_GET_TYPE_SPEDIFIED_BY_ISP) {
binding.tptfIpv6AddressPrefix.isEnabled = true
binding.rlIpv6AddressPrefixLayout.visibility = View.VISIBLE
} else {
viewModel.advancedPppoeBean.prefixDelegainEnable?.let {
binding.tptfIpv6AddressPrefix.isEnabled = !it
if (!it) {
binding.rlIpv6AddressPrefixLayout.visibility = View.GONE
}
}
}
}
TMPDefine.IPV6_CONN_MODE.CONN_TYPE_6TO4_TUNNEL.toInt() -> {
vs_6to4.visibility = View.VISIBLE
binding.rlIpv6AddressPrefixLayout.visibility = View.GONE
binding.tptlivAdvancedSetting.visibility = View.GONE
binding.tptConnectionType.setContentText(getString(R.string.setting_ipv6_6to4_tunnel))
val tunnel6To4Mode = viewModel.ipv6Info.tunnel6To4Mode
if (tunnel6To4Mode?.isConnect != true) {
settingWan6to4TunnelBinding?.ipv66to4DisconnectV4?.isEnabled = false
}
}
TMPDefine.IPV6_CONN_MODE.CONN_TYPE_PASS_THROUGH.toInt() -> {
settingWanPppoeV6Binding?.llEditBottom?.visibility = View.GONE
binding.tptlivAdvancedSetting.visibility = View.GONE
binding.tptfIpv6AddressPrefix.isEnabled = false
binding.llIpv6Lan.visibility = View.GONE
binding.tptConnectionType.setContentText(getString(R.string.setting_ipv6_passthrough))
}
}
if (!binding.tptfIpv6AddressPrefix.isEnabled) {
binding.tptfIpv6AddressPrefix.setText("")
}
setOptionsMenuEnable(checkValidate() && !checkSame())
connTypeChoose = false
}

private fun showLanAssignedTypeView(selected_type: Byte) {
assignTypeChoose = true
binding.ipv6ReleaseTimeV4.visibility = View.GONE
binding.rlIpv6AddressPrefixLayout.visibility = View.VISIBLE
when (selected_type) {
TMPDefine.IPV6_ASSIGNED_MODE.ASSIGNED_TYPE_DHCPV6 -> {
binding.ipv6ReleaseTimeV4.visibility = View.VISIBLE
binding.tptlivAssignedType.setContentText(getString(R.string.setting_ipv6_assigned_dhcpv6))
val dhcpv6Mode = viewModel.ipv6Info.dhcpv6Mode
if (dhcpv6Mode != null) {
binding.tptfIpv6AddressPrefix.setText(dhcpv6Mode.addressPrefix)
binding.tptfIpv6ReleaseTime.setText(dhcpv6Mode.releaseTime.toString())
}
}
TMPDefine.IPV6_ASSIGNED_MODE.ASSIGNED_TYPE_SLAAC_STATELESS_DHCP -> {
binding.tptlivAssignedType.setContentText(getString(R.string.setting_ipv6_assigned_slaac_stateless))
val slaacStatelessDhcpMode = viewModel.ipv6Info.slaacStatelessDhcpMode
if (slaacStatelessDhcpMode != null) {
binding.tptfIpv6AddressPrefix.setText(slaacStatelessDhcpMode.addressPrefix)
}
}
TMPDefine.IPV6_ASSIGNED_MODE.ASSIGNED_TYPE_SLAAC_RDNSS -> {
binding.tptlivAssignedType.setContentText(getString(R.string.setting_ipv6_assigned_slaac_rndss))
val slaacRdnssMode = viewModel.ipv6Info.slaacRdnssMode
if (slaacRdnssMode != null) {
binding.tptfIpv6AddressPrefix.setText(slaacRdnssMode.addressPrefix)
}
}
TMPDefine.IPV6_ASSIGNED_MODE.ASSIGNED_TYPE_ND_PROXY -> {
binding.tptlivAssignedType.setContentText(getString(R.string.setting_ipv6_assigned_nd_proxy))
// ND Proxy模式 无address前缀
binding.rlIpv6AddressPrefixLayout.visibility = View.GONE
}
}
setOptionsMenuEnable(checkValidate() && !checkSame())
assignTypeChoose = false
}

private fun getSaveParams(): Ipv6InfoSetBean {
UIUtils.hideIME(requireActivity())
val params = viewModel.getSaveParams()
when (viewModel.currentConnTypeSettingPage.get()) {
TMPDefine.IPV6_CONN_MODE.CONN_TYPE_STATICIP -> {
val staticIpParams = Ipv6InfoSetBean.StaticIpParams()
staticIpParams.ip = settingWanStaticipV6Binding!!.tptfIpv6StaticIpV4.getText()
staticIpParams.primaryDns =
settingWanStaticipV6Binding!!.tptfIpv6StaticPrimaryDnsV4.getText()
staticIpParams.secondaryDns =
settingWanStaticipV6Binding!!.tptfIpv6StaticSecondDnsV4.getText()
staticIpParams.gateway =
settingWanStaticipV6Binding!!.tptfIpv6StaticDefaultGatewayV4.getText()
staticIpParams.mtuSize =
settingWanStaticipV6Binding!!.tptfIpv6StaticMtuV4.getText().toInt()
params.staticIpMode = staticIpParams
}
TMPDefine.IPV6_CONN_MODE.CONN_TYPE_DYNAMICIP -> {
val dynamicIpParams = Ipv6InfoSetBean.DynamicIpParams()
viewModel.advancedDynamicBean.prefixDelegainEnable?.let {
dynamicIpParams.isPrefixDelegainEnable = it
}
if (TextUtils.isEmpty(viewModel.advancedDynamicBean.customPrimaryDns)) {
dynamicIpParams.customPrimaryDns = ""
} else {
dynamicIpParams.customPrimaryDns =
viewModel.advancedDynamicBean.customPrimaryDns
}

if (TextUtils.isEmpty(viewModel.advancedDynamicBean.customSecondaryDns)) {
dynamicIpParams.customSecondaryDns = ""
} else {
dynamicIpParams.customSecondaryDns =
viewModel.advancedDynamicBean.customSecondaryDns
}

viewModel.advancedDynamicBean.currentAddressType?.let {
dynamicIpParams.currentAddressType = it
}

viewModel.advancedDynamicBean.currentDnsAddressType?.let {
dynamicIpParams.currentDnsAddressType = it
}
params.dynamicIpMode = dynamicIpParams
}
TMPDefine.IPV6_CONN_MODE.CONN_TYPE_PPPOE -> {
val pppoeParams = Ipv6InfoSetBean.PppoeParams()
pppoeParams.isUseSameAccount =
settingWanPppoeV6Binding!!.tptlvSyncIpv4Edit.getActionSwitch().isChecked
pppoeParams.username =
settingWanPppoeV6Binding!!.editTextIpv6PppoeUsernameV4.getText()
pppoeParams.password =
settingWanPppoeV6Binding!!.editTextIpv6PppoePasswordV4.getText()
if (TextUtils.isEmpty(viewModel.advancedPppoeBean.ipAddress)) {
pppoeParams.ispIpv6Address = ""
} else {
pppoeParams.ispIpv6Address = viewModel.advancedPppoeBean.ipAddress
}
if (TextUtils.isEmpty(viewModel.advancedPppoeBean.customPrimaryDns)) {
pppoeParams.primaryDns = ""
} else {
pppoeParams.primaryDns = viewModel.advancedPppoeBean.customPrimaryDns
}
if (TextUtils.isEmpty(viewModel.advancedPppoeBean.customSecondaryDns)) {
pppoeParams.secondaryDns = ""
} else {
pppoeParams.secondaryDns = viewModel.advancedPppoeBean.customSecondaryDns
}
viewModel.advancedPppoeBean.customSecondaryDns?.let {
pppoeParams.secondaryDns = it
}
viewModel.advancedPppoeBean.prefixDelegainEnable?.let {
pppoeParams.isPrefixDelegainEnable = it
}
viewModel.advancedPppoeBean.currentAddressType?.let {
pppoeParams.currentAddressType = it
}
viewModel.advancedPppoeBean.currentDnsAddressType?.let {
pppoeParams.currentDnsAddressType = it
}
params.pppoeMode = pppoeParams
}
TMPDefine.IPV6_CONN_MODE.CONN_TYPE_6TO4_TUNNEL -> {
val tunnel6To4Params = Ipv6InfoSetBean.Tunnel6To4Params()
tunnel6To4Params.primaryDns = viewModel.custom6To4DnsPrimary
tunnel6To4Params.secondaryDns = viewModel.custom6To4DnsSecondary
tunnel6To4Params.isCustomDnsAddressEnable = viewModel.custom6To4DnsEnable
params.tunnel6To4Mode = tunnel6To4Params
}
}

if (viewModel.currentAssignedTypeSettingPage.get() == TMPDefine.IPV6_ASSIGNED_MODE.ASSIGNED_TYPE_DHCPV6) {
if (binding.tptfIpv6ReleaseTime.getText().isEmpty()) {
params.releaseTime = DEFAULT_RELEASE_TIME.toInt()
} else {
params.releaseTime = binding.tptfIpv6ReleaseTime.getText().toInt()
}
} else if (viewModel.ipv6Info.dhcpv6Mode != null) {
params.releaseTime = viewModel.ipv6Info.dhcpv6Mode.releaseTime
}

params.customMacAddress = viewModel.ipv6Info.customMacAddress

params.currentAddressPrefix = binding.tptfIpv6AddressPrefix.getText()
if (viewModel.getSupportInternetAccessModes().isNotEmpty()) {
params.internetAccessMode = viewModel.internetAccessMode
}
return params
}

private fun initTextChangeListener() {
settingWanStaticipV6Binding!!.tptfIpv6StaticIpV4.addTextChangedListener(object :
TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable) {
if (!connTypeChoose) {
if (viewModel.checkIpAddressValid(s.toString())) {
settingWanStaticipV6Binding!!.tptfIpv6StaticIpV4.error = null
setOptionsMenuEnable(checkValidate() && !checkSame())
} else {
settingWanStaticipV6Binding!!.tptfIpv6StaticIpV4.error =
getString(R.string.parental_control_filter_invalid)
setOptionsMenuEnable(false)
}
}
}
})
settingWanStaticipV6Binding!!.tptfIpv6StaticDefaultGatewayV4.addTextChangedListener(object :
TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable) {
if (!connTypeChoose) {
if (viewModel.checkIpAddressValid(s.toString())) {
settingWanStaticipV6Binding!!.tptfIpv6StaticDefaultGatewayV4.error = null
setOptionsMenuEnable(checkValidate() && !checkSame())
} else {
settingWanStaticipV6Binding!!.tptfIpv6StaticDefaultGatewayV4.error =
getString(R.string.parental_control_filter_invalid)
setOptionsMenuEnable(false)
}
}
}
})
settingWanStaticipV6Binding!!.tptfIpv6StaticPrimaryDnsV4.addTextChangedListener(object :
TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable) {
if (!connTypeChoose) {
if (viewModel.checkDnsAddressValid(s.toString())) {
settingWanStaticipV6Binding!!.tptfIpv6StaticPrimaryDnsV4.error = null
setOptionsMenuEnable(checkValidate() && !checkSame())
} else {
settingWanStaticipV6Binding!!.tptfIpv6StaticPrimaryDnsV4.error =
getString(R.string.parental_control_filter_invalid)
setOptionsMenuEnable(false)
}
}
}
})
settingWanStaticipV6Binding!!.tptfIpv6StaticSecondDnsV4.addTextChangedListener(object :
TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable) {
if (!connTypeChoose) {
if (viewModel.checkStaticSecondaryDnsAddressValid(s.toString())) {
settingWanStaticipV6Binding!!.tptfIpv6StaticSecondDnsV4.error = null
setOptionsMenuEnable(checkValidate() && !checkSame())
} else {
settingWanStaticipV6Binding!!.tptfIpv6StaticSecondDnsV4.error =
getString(R.string.parental_control_filter_invalid)
setOptionsMenuEnable(false)
}
}
}
})
settingWanStaticipV6Binding!!.tptfIpv6StaticMtuV4.addTextChangedListener(object :
TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable) {
if (TextUtils.isEmpty(s.toString()) || s.toString()
.toInt() > viewModel.MAX_MTU_SIZE || s.toString()
.toInt() < viewModel.MIN_MTU_SIZE
) {
settingWanStaticipV6Binding!!.tptfIpv6StaticMtuV4.error = getString(
R.string.iptv_vlan_id_invalidate,
viewModel.MIN_MTU_SIZE,
viewModel.MAX_MTU_SIZE
)
setOptionsMenuEnable(false)
} else {
settingWanStaticipV6Binding!!.tptfIpv6StaticMtuV4.error = null
setOptionsMenuEnable(checkValidate() && !checkSame())
}
}
})
settingWanPppoeV6Binding!!.editTextIpv6PppoeUsernameV4.addTextChangedListener(object :
TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable) {
if (viewModel.checkPppoeUsername(s.toString())) {
settingWanPppoeV6Binding!!.editTextIpv6PppoeUsernameV4.error = null
setOptionsMenuEnable(checkValidate() && !checkSame())
} else {
settingWanPppoeV6Binding!!.editTextIpv6PppoeUsernameV4.error =
getString(R.string.parental_control_filter_invalid)
setOptionsMenuEnable(false)
}
}
})
settingWanPppoeV6Binding!!.editTextIpv6PppoePasswordV4.addTextChangedListener(object :
TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable) {
if (viewModel.checkPppoePassword(s.toString())) {
settingWanPppoeV6Binding!!.editTextIpv6PppoePasswordV4.error = null
setOptionsMenuEnable(checkValidate() && !checkSame())
} else {
settingWanPppoeV6Binding!!.editTextIpv6PppoePasswordV4.error =
getString(R.string.parental_control_filter_invalid)
setOptionsMenuEnable(false)
}
}
})

binding.tptfIpv6ReleaseTime.addTextChangedListener(object :
TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable) {
if (TextUtils.isEmpty(s.toString()) || s.toString()
.toInt() > viewModel.MAX_RELEASEE_TIME || s.toString()
.toInt() < viewModel.MIN_RELEASE_TIME
) {
binding.tptfIpv6ReleaseTime.error = getString(
R.string.iptv_vlan_id_invalidate,
viewModel.MIN_RELEASE_TIME,
viewModel.MAX_RELEASEE_TIME
)
setOptionsMenuEnable(false)
} else {
binding.tptfIpv6ReleaseTime.error = null
setOptionsMenuEnable(checkValidate() && !checkSame())
}
}
})
binding.tptfIpv6AddressPrefix.addTextChangedListener(object :
TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable) {
if (!assignTypeChoose && binding.tptfIpv6AddressPrefix.isEnabled) {
if (viewModel.checkIpv6AddressPrefix(s.toString())) {
binding.tptfIpv6AddressPrefix.error = null
setOptionsMenuEnable(checkValidate() && !checkSame())
} else {
binding.tptfIpv6AddressPrefix.error =
getString(R.string.parental_control_filter_invalid)
setOptionsMenuEnable(false)
}
}
}
})
}

private fun checkValidate(): Boolean {
if (!viewModel.checkInternetConnectValid(
settingWanStaticipV6Binding!!.tptfIpv6StaticIpV4.getText(),
settingWanStaticipV6Binding!!.tptfIpv6StaticDefaultGatewayV4.getText(),
settingWanStaticipV6Binding!!.tptfIpv6StaticPrimaryDnsV4.getText(),
settingWanStaticipV6Binding!!.tptfIpv6StaticSecondDnsV4.getText(),
settingWanStaticipV6Binding!!.tptfIpv6StaticMtuV4.getText(),
settingWanPppoeV6Binding!!.tptlvSyncIpv4Edit.getActionSwitch().isChecked,
settingWanPppoeV6Binding!!.editTextIpv6PppoeUsernameV4.getText(),
settingWanPppoeV6Binding!!.editTextIpv6PppoePasswordV4.getText()
)
) {
return false
}

if (!viewModel.checkLanValid(
binding.tptfIpv6AddressPrefix.isEnabled && binding.rlIpv6AddressPrefixLayout.visibility == View.VISIBLE,
binding.tptfIpv6AddressPrefix.getText(),
binding.tptfIpv6ReleaseTime.getText()
)
) {
return false
}
return true
}

private fun checkSame(): Boolean {
if (!viewModel.checkInternetConnectSame(
settingWanStaticipV6Binding!!.tptfIpv6StaticIpV4.getText(),
settingWanStaticipV6Binding!!.tptfIpv6StaticDefaultGatewayV4.getText(),
settingWanStaticipV6Binding!!.tptfIpv6StaticPrimaryDnsV4.getText(),
settingWanStaticipV6Binding!!.tptfIpv6StaticSecondDnsV4.getText(),
settingWanStaticipV6Binding!!.tptfIpv6StaticMtuV4.getText(),
settingWanPppoeV6Binding!!.tptlvSyncIpv4Edit.getActionSwitch().isChecked,
settingWanPppoeV6Binding!!.editTextIpv6PppoeUsernameV4.getText(),
settingWanPppoeV6Binding!!.editTextIpv6PppoePasswordV4.getText()
)
) {
return false
}

if (!viewModel.checkLanSame(
binding.tptfIpv6AddressPrefix.isEnabled && binding.rlIpv6AddressPrefixLayout.visibility == View.VISIBLE,
binding.tptfIpv6AddressPrefix.getText(),
binding.tptfIpv6ReleaseTime.getText()
)
) {
return false
}
if (viewModel.checkInternetAccessModeChanged()) {
return false
}
return true
}

private fun setEnableListener() {
viewModel.setEnableListener(object : Observable.OnPropertyChangedCallback() {
override fun onPropertyChanged(sender: Observable, propertyId: Int) {
if (!isInit) {
if (sender is ObservableBoolean) {
val isChecked = sender.get()
UIUtils.hideIME(binding.root)
if (isChecked) {
setOptionsMenuEnable(checkValidate() && !checkSame())
} else {
setOptionsMenuEnable(!checkSame())
}
}
}
}
})
}

private fun setOptionsMenuEnable (enable : Boolean) {
menuItem?.isEnabled = enable
}

override fun onBackPressed(): Boolean {
if (!checkSame()) {
MaterialAlertDialogBuilder(requireContext()).setMessage(getString(R.string.high_speed_mode_quit_hint))
.setNegativeButton(
resources.getString(R.string.common_cancel)
) { dialog: DialogInterface, _: Int -> dialog.dismiss() }
.setPositiveButton(
resources.getString(R.string.qos_custom_leave)
) { dialog: DialogInterface, _: Int ->
viewModel.currentAssignedTypeSettingPage.set(viewModel.currentAssignedType.get())
viewModel.commonBack.postValue(true)
dialog.dismiss()
}
.setCancelable(false)
.create().show()
} else {
viewModel.commonBack.postValue(true)
}
return true
}
}