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
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))
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
}
}