add network

This commit is contained in:
yuqian 2026-01-13 11:12:16 +08:00
parent f9a640cc5c
commit e5a7720af1
5 changed files with 166 additions and 60 deletions

View File

@ -86,6 +86,14 @@ object SetNumberOrWordUtils {
return closestRatio return closestRatio
} }
fun getHoursString(int: Int):String{
val div = int.div(3600)
return if(div>1){
"$div hours"
}else{
"$div hour"
}
}
} }

View File

@ -1,5 +1,6 @@
package com.xyzshell.myphoneinfo.dashboard package com.xyzshell.myphoneinfo.dashboard
import android.Manifest
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
@ -7,12 +8,15 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.annotation.RequiresPermission
import com.xyzshell.andinfo.AndInfo import com.xyzshell.andinfo.AndInfo
import com.xyzshell.andinfo.libs.NetworkInfo import com.xyzshell.andinfo.libs.NetworkInfo
import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.R
import com.xyzshell.myphoneinfo.custom.PermissionChecker import com.xyzshell.myphoneinfo.custom.PermissionChecker
import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.getHoursString
import com.xyzshell.myphoneinfo.databinding.FragmentNetworkBinding import com.xyzshell.myphoneinfo.databinding.FragmentNetworkBinding
import com.xyzshell.myphoneinfo.dialog.ShowLoadFragment import com.xyzshell.myphoneinfo.dialog.ShowLoadFragment
import kotlin.toString
class NetworkFragment : Fragment() { class NetworkFragment : Fragment() {
@ -36,12 +40,15 @@ private lateinit var binding:FragmentNetworkBinding
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
networkInfo= AndInfo.instance.network
refreshStatus()
setMobileInfo()
if(PermissionChecker.getMissingPermissions(context = requireContext()).isNotEmpty()){ if(PermissionChecker.getMissingPermissions(context = requireContext()).isNotEmpty()){
PermissionChecker.requestSimple( PermissionChecker.requestSimple(
requireActivity(), requireActivity(),
onGranted = { onGranted = {
// 权限已授予,执行操作 // 权限已授予,执行操作
refreshStatus()
}, },
onDenied = { onDenied = {
// 权限被拒绝 // 权限被拒绝
@ -49,23 +56,6 @@ private lateinit var binding:FragmentNetworkBinding
} }
) )
} }
networkInfo= AndInfo.instance.network
val currentNetworkType = networkInfo.getCurrentNetworkType()
when (currentNetworkType) {
NetworkInfo.NetworkType.WIFI -> {
status = 1
setWifiDetail()
}
NetworkInfo.NetworkType.MOBILE -> {
status = 2
setMobileInfo()
}
else -> {
status = 0
setNoConnect()
}
}
//wifi //wifi
binding.networkLayout.wfText1.textTitle.text=getString(R.string.status) binding.networkLayout.wfText1.textTitle.text=getString(R.string.status)
// binding.networkLayout.wfText2.textTitle.text=getString(R.string.network) // binding.networkLayout.wfText2.textTitle.text=getString(R.string.network)
@ -87,6 +77,14 @@ private lateinit var binding:FragmentNetworkBinding
binding.networkLayout.dhText7.textTitle.text=getString(R.string.ip_address) binding.networkLayout.dhText7.textTitle.text=getString(R.string.ip_address)
binding.networkLayout.dhText8.textTitle.text=getString(R.string.ipv6) binding.networkLayout.dhText8.textTitle.text=getString(R.string.ipv6)
//Hardware
binding.networkLayout.hardCheck1.content.text=getString(R.string.standard_all)
binding.networkLayout.hardCheck2.content.text=getString(R.string.wifi_direct_support)
binding.networkLayout.hardCheck3.content.text=getString(R.string.wifi_aware_support)
binding.networkLayout.hardCheck4.content.text=getString(R.string.wifi_passpoint_support)
binding.networkLayout.hardCheck5.content.text=getString(R.string.ghz_band_support)
binding.networkLayout.hardCheck6.content.text=getString(R.string.ghz6_band_support)
//mobel //mobel
binding.mdText1.textTitle.text=getString(R.string.dual_sim_dual_standby) binding.mdText1.textTitle.text=getString(R.string.dual_sim_dual_standby)
binding.mdText2.textTitle.text=getString(R.string.phone_type) binding.mdText2.textTitle.text=getString(R.string.phone_type)
@ -99,10 +97,6 @@ private lateinit var binding:FragmentNetworkBinding
binding.defText2.textTitle.text=getString(R.string.voice) binding.defText2.textTitle.text=getString(R.string.voice)
binding.defText3.textTitle.text=getString(R.string.short_message) binding.defText3.textTitle.text=getString(R.string.short_message)
binding.simText1.textTitle.text=getString(R.string.status)
binding.simText2.textTitle.text=getString(R.string.nation)
binding.simText3.textTitle.text=getString(R.string.roaming)
binding.simText4.textTitle.text=getString(R.string.network_type)
binding.networkLayout.pubShow.setOnClickListener{ binding.networkLayout.pubShow.setOnClickListener{
val tag = "showLoadFragment" val tag = "showLoadFragment"
@ -113,6 +107,23 @@ private lateinit var binding:FragmentNetworkBinding
} }
} }
private fun refreshStatus() {
val currentNetworkType = networkInfo.getCurrentNetworkType()
when (currentNetworkType) {
NetworkInfo.NetworkType.WIFI -> {
status = 1
setWifiDetail()
}
NetworkInfo.NetworkType.MOBILE -> {
status = 2
setMobileInfo()
}
else -> {
status = 0
setNoConnect()
}
}
}
private fun setNoConnect() { private fun setNoConnect() {
binding.noConnect.visibility=View.VISIBLE binding.noConnect.visibility=View.VISIBLE
binding.connectData.visibility=View.GONE binding.connectData.visibility=View.GONE
@ -132,22 +143,58 @@ private lateinit var binding:FragmentNetworkBinding
binding.networkLayout.wifiList.visibility=View.VISIBLE binding.networkLayout.wifiList.visibility=View.VISIBLE
binding.networkLayout.llPubShow.visibility=View.VISIBLE binding.networkLayout.llPubShow.visibility=View.VISIBLE
networkInfo.getMobileDetails()?.let { mobileDetails -> networkInfo.getMobileDetails()?.let { mobileDetails ->
//mobel
// binding.mdText1.textTitle.text=getString(R.string.dual_sim_dual_standby)
// binding.mdText2.textTitle.text=getString(R.string.phone_type)
// binding.mdText3.textTitle.text=getString(R.string.esim)
//
// binding.conTexts.textTitle.text=getString(R.string.status)
//
// binding.defText1.textTitle.text=getString(R.string.data)
//
// binding.defText2.textTitle.text=getString(R.string.voice)
// binding.defText3.textTitle.text=getString(R.string.short_message)
//
// binding.simText1.textTitle.text=getString(R.string.status)
// binding.simText2.textTitle.text=getString(R.string.nation)
// binding.simText3.textTitle.text=getString(R.string.roaming)
// binding.simText4.textTitle.text=getString(R.string.network_type)
binding.mdText1.textContent.text=mobileDetails.dualSim.toString()
binding.mdText2.textContent.text=mobileDetails.phoneType.toString()
binding.mdText3.textContent.text=mobileDetails.esimSupported.toString()
binding.conTexts.textContent.text=mobileDetails.dataEnabled.toString()
binding.defText1.textContent.text=mobileDetails.dataSim.toString()
binding.defText2.textContent.text=mobileDetails.voiceSim.toString()
binding.defText3.textContent.text=mobileDetails.smsSim.toString()
if(mobileDetails.simInfos.isNotEmpty()){
binding.simInfo1.simText1.textTitle.text=getString(R.string.status)
binding.simInfo1.simText2.textTitle.text=getString(R.string.nation)
binding.simInfo1.simText3.textTitle.text=getString(R.string.roaming)
binding.simInfo1.simText4.textTitle.text=getString(R.string.network_type)
binding.simInfo1.simText1.textContent.text=if(status==2) true.toString() else false.toString()
binding.simInfo1.simText2.textContent.text=mobileDetails.simInfos[0].countryIso.toString()
binding.simInfo1.simText3.textContent.text=mobileDetails.simInfos[0].roaming.toString()
if(mobileDetails.simInfos.size>1){
binding.simInfo2.root.visibility=View.VISIBLE
binding.simInfo2.simText1.textTitle.text=getString(R.string.status)
binding.simInfo2.simText2.textTitle.text=getString(R.string.nation)
binding.simInfo2.simText3.textTitle.text=getString(R.string.roaming)
binding.simInfo2.simText4.textTitle.text=getString(R.string.network_type)
binding.simInfo2.simText1.textContent.text=if(status==2) true.toString() else false.toString()
binding.simInfo2.simText2.textContent.text=mobileDetails.simInfos[1].countryIso.toString()
binding.simInfo2.simText3.textContent.text=mobileDetails.simInfos[1].roaming.toString()
}
}else{
binding.simInfo1.root.visibility=View.GONE
binding.simInfo2.root.visibility=View.GONE
}
} }
} }
/** /**
* 设置wifi信息 * 设置wifi信息
* */ * */
// binding.networkLayout.wfText2.textTitle.text=getString(R.string.network)
// binding.networkLayout.wfText3.textTitle.text=getString(R.string.bssid)
// binding.networkLayout.wfText4.textTitle.text=getString(R.string.function)
// binding.networkLayout.wfText5.textTitle.text=getString(R.string.connection_speed)
// binding.networkLayout.wfText6.textTitle.text=getString(R.string.signal_strength)
// binding.networkLayout.wfText7.textTitle.text=getString(R.string.frequency)
// binding.networkLayout.wfText8.textTitle.text=getString(R.string.frequency_band)
// binding.networkLayout.wfText9.textTitle.text=getString(R.string.channel)
// binding.networkLayout.wfText10.textTitle.text=getString(R.string.standard)
private fun setWifiDetail() { private fun setWifiDetail() {
binding.noConnect.visibility=View.GONE binding.noConnect.visibility=View.GONE
binding.conText1.text=getString(R.string.wifi) binding.conText1.text=getString(R.string.wifi)
@ -156,9 +203,12 @@ private lateinit var binding:FragmentNetworkBinding
binding.networkLayout.llPubShow.visibility=View.VISIBLE binding.networkLayout.llPubShow.visibility=View.VISIBLE
networkInfo.getWifiDetails()?.let { wifiDetails -> networkInfo.getWifiDetails()?.let { wifiDetails ->
Log.d("TTTTTTTT", (wifiDetails.signalLevelPercent?: "null").toString()) Log.d("TTTTTTTT", (wifiDetails.signalLevelPercent?: "null").toString())
binding.strengthView.setStrength(wifiDetails.signalLevelPercent?: 0) wifiDetails.signalLevelPercent?.let { percent->
binding.conText2.text="${wifiDetails.ssid}·${wifiDetails.linkSpeedMbps}" binding.strengthView.setStrength(calculateSignalLevel(percent = percent))
binding.conTExt3.text="${wifiDetails.signalLevelPercent} ${wifiDetails.rssi}" }
binding.conText2.text="${wifiDetails.ssid}·${wifiDetails.linkSpeedMbps} Mbps"
binding.conTExt3.text="${wifiDetails.signalLevelPercent}% ${wifiDetails.rssi} dBm"
if(wifiDetails.connected){ if(wifiDetails.connected){
binding.networkLayout.wfText1.textContent.text=getString(R.string.connectivity_status) binding.networkLayout.wfText1.textContent.text=getString(R.string.connectivity_status)
}else{ }else{
@ -167,15 +217,42 @@ private lateinit var binding:FragmentNetworkBinding
binding.networkLayout.wfText3.textContent.text=wifiDetails.bssid binding.networkLayout.wfText3.textContent.text=wifiDetails.bssid
binding.networkLayout.wfText4.textContent.text=wifiDetails.capabilities binding.networkLayout.wfText4.textContent.text=wifiDetails.capabilities
binding.networkLayout.wfText5.textContent.text=wifiDetails.linkSpeedMbps.toString() binding.networkLayout.wfText5.textContent.text="${wifiDetails.linkSpeedMbps} Mbps"
binding.networkLayout.wfText6.textContent.text=wifiDetails.signalLevelPercent.toString() binding.networkLayout.wfText6.textContent.text="${wifiDetails.rssi} dBm"
binding.networkLayout.wfText7.textContent.text=wifiDetails.frequency.toString() binding.networkLayout.wfText7.textContent.text="${wifiDetails.frequency} MHz"
binding.networkLayout.wfText8.textContent.text=wifiDetails.channel.toString() binding.networkLayout.wfText8.textContent.text=wifiDetails.channel.toString()
binding.networkLayout.wfText10.textContent.text=wifiDetails.standard.toString() binding.networkLayout.wfText10.textContent.text=wifiDetails.standard.toString()
binding.networkLayout.dhText1.textContent.text=wifiDetails.dhcpServer
binding.networkLayout.dhText2.textContent.text=getHoursString(wifiDetails.leaseDuration?: 0)
binding.networkLayout.dhText3.textContent.text=wifiDetails.gateway
binding.networkLayout.dhText4.textContent.text=wifiDetails.subnetMask
binding.networkLayout.dhText5.textContent.text=wifiDetails.dns1
binding.networkLayout.dhText6.textContent.text=wifiDetails.dns2
binding.networkLayout.dhText7.textContent.text=wifiDetails.ip
val toString = wifiDetails.ipv6.toString()
val ipv6 = toString.replace("[", "").replace("]", "")
binding.networkLayout.dhText8.textContent.text=ipv6
binding.networkLayout.hardCheck1.image.isSelected= wifiDetails.supportedStandards?.size==5
binding.networkLayout.hardCheck2.image.isSelected= wifiDetails.wifiDirect == true
binding.networkLayout.hardCheck3.image.isSelected= wifiDetails.wifiAware == true
binding.networkLayout.hardCheck4.image.isSelected= wifiDetails.wifiPasspoint == true
binding.networkLayout.hardCheck5.image.isSelected= wifiDetails.support5G == true
binding.networkLayout.hardCheck6.image.isSelected= wifiDetails.support6G == true
} }
} }
private fun calculateSignalLevel( percent: Int) : Int {
return when {
percent >= 80 -> 5 // 优秀
percent >= 60 -> 4 // 良好
percent >= 40 -> 3 // 一般
percent >= 20 -> 2 // 差
else -> 1 // 非常差/无信号
}
}
companion object { companion object {
@JvmStatic @JvmStatic

View File

@ -77,7 +77,7 @@
style="@style/TextBig" style="@style/TextBig"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Wi-Fi" android:text=""
android:textStyle="bold" android:textStyle="bold"
tools:ignore="RelativeOverlap" /> tools:ignore="RelativeOverlap" />
@ -86,7 +86,7 @@
style="@style/LeftContent" style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="LUX·433 Mbps" android:text=""
android:textStyle="bold" android:textStyle="bold"
tools:ignore="RelativeOverlap" /> tools:ignore="RelativeOverlap" />
@ -95,7 +95,7 @@
style="@style/LeftContent" style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="80% -60dBm" android:text=""
android:textStyle="bold" android:textStyle="bold"
tools:ignore="RelativeOverlap" /> tools:ignore="RelativeOverlap" />
</LinearLayout> </LinearLayout>
@ -189,26 +189,17 @@
<include <include
android:id="@+id/defText3" android:id="@+id/defText3"
layout="@layout/common_text_style" /> layout="@layout/common_text_style" />
<com.google.android.material.textview.MaterialTextView
style="@style/TextHeavy20"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="@string/sim_card_1"
tools:ignore="RelativeOverlap" />
<include <include
android:id="@+id/simText1" android:id="@+id/simInfo1"
layout="@layout/common_text_style" /> layout="@layout/item_set_sim"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<include <include
android:id="@+id/simText2" android:id="@+id/simInfo2"
layout="@layout/common_text_style" /> layout="@layout/item_set_sim"
<include android:layout_width="match_parent"
android:id="@+id/simText3" android:visibility="gone"
layout="@layout/common_text_style" /> android:layout_height="wrap_content"/>
<include
android:id="@+id/simText4"
layout="@layout/common_text_style" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/simTitle"
style="@style/TextHeavy20"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="@string/sim_card_1" />
<include
android:id="@+id/simText1"
layout="@layout/common_text_style" />
<include
android:id="@+id/simText2"
layout="@layout/common_text_style" />
<include
android:id="@+id/simText3"
layout="@layout/common_text_style" />
<include
android:id="@+id/simText4"
layout="@layout/common_text_style" />
</LinearLayout>

View File

@ -119,7 +119,7 @@
<string name="show">Show</string> <string name="show">Show</string>
<string name="ok">OK</string> <string name="ok">OK</string>
<string name="mobile_data">Mobile Data</string> <string name="mobile_data">Mobile Data</string>
<string name="dual_sim_dual_standby">Dual SIM dual standby</string> <string name="dual_sim_dual_standby">Dual SIM</string>
<string name="esim">eSIM</string> <string name="esim">eSIM</string>
<string name="sim_card_1">SIM 1</string> <string name="sim_card_1">SIM 1</string>
<string name="sim_card_2">SIM 2</string> <string name="sim_card_2">SIM 2</string>
@ -322,5 +322,10 @@
<string name="connectivity_status">Connected</string> <string name="connectivity_status">Connected</string>
<string name="not_connected">Not connected</string> <string name="not_connected">Not connected</string>
<string name="gps">GPS</string> <string name="gps">GPS</string>
<string name="standard_all">802.11 b/a/g/n/ac/ax/be</string>
<string name="wifi_direct_support">Wi-Fi Direct support</string>
<string name="wifi_aware_support">Wi-Fi Aware support</string>
<string name="wifi_passpoint_support">Wi-Fi Passpoint support</string>
<string name="ghz_band_support">5GHz band support</string>
<string name="ghz6_band_support">6GHz band support</string>
</resources> </resources>