diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/PermissionChecker.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/PermissionChecker.kt new file mode 100644 index 0000000..1cc6080 --- /dev/null +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/PermissionChecker.kt @@ -0,0 +1,92 @@ +package com.xyzshell.myphoneinfo.custom + +import android.Manifest +import android.app.Activity +import android.content.Context +import android.content.pm.PackageManager +import android.os.Build +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat + +object PermissionChecker { + /** + * 检查单个权限 + */ + fun hasPermission(context: Context, permission: String): Boolean { + return ContextCompat.checkSelfPermission( + context, + permission + ) == PackageManager.PERMISSION_GRANTED + } + + /** + * 检查Wi-Fi权限 + */ + fun hasWifiPermission(context: Context): Boolean { + val permissions = mutableListOf(Manifest.permission.ACCESS_WIFI_STATE) + + // Android 10+ 需要位置权限 + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) { + permissions.add(Manifest.permission.ACCESS_FINE_LOCATION) + } + + return permissions.all { hasPermission(context, it) } + } + + /** + * 检查电话权限 + */ + fun hasPhonePermission(context: Context): Boolean { + return hasPermission(context, Manifest.permission.READ_PHONE_STATE) + } + + /** + * 检查所有权限 + */ + fun hasWifiAndPhonePermissions(context: Context): Boolean { + return hasWifiPermission(context) && hasPhonePermission(context) + } + /** + * 获取缺少的权限列表 + */ + fun getMissingPermissions(context: Context): List { + val permissions = mutableListOf() + + // 检查 Wi-Fi 相关权限 + if (!hasPermission(context, Manifest.permission.ACCESS_WIFI_STATE)) { + permissions.add(Manifest.permission.ACCESS_WIFI_STATE) + } + + // Android 10+ 需要位置权限 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && + !hasPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)) { + permissions.add(Manifest.permission.ACCESS_FINE_LOCATION) + } + + // 检查电话权限 + if (!hasPermission(context, Manifest.permission.READ_PHONE_STATE)) { + permissions.add(Manifest.permission.READ_PHONE_STATE) + } + + return permissions + } + fun requestSimple( + activity: Activity, + onGranted: () -> Unit = {}, + onDenied: () -> Unit = {} + ) { + val missingPermissions = getMissingPermissions(activity) + + if (missingPermissions.isEmpty()) { + onGranted() + return + } + + ActivityCompat.requestPermissions( + activity, + missingPermissions.toTypedArray(), + 1000 + ) + } + + } \ No newline at end of file diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SignalStrengthView.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SignalStrengthView.kt index 4ec9d72..8fa9e04 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SignalStrengthView.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SignalStrengthView.kt @@ -19,8 +19,8 @@ class SignalStrengthView @JvmOverloads constructor( style = Paint.Style.FILL } - private val inactiveColor = "#eeeeee".toColorInt() - private val activeColor = "#1E8C29".toColorInt() + private val inactiveColor = "#B7D7D3".toColorInt() + private val activeColor = "#3B948A".toColorInt() private var strengthLevel: Int = 0 private val maxBars = 5 diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/NetworkFragment.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/NetworkFragment.kt index 00d38b5..af2ac31 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/NetworkFragment.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/NetworkFragment.kt @@ -1,17 +1,23 @@ package com.xyzshell.myphoneinfo.dashboard import android.os.Bundle +import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast +import com.xyzshell.andinfo.AndInfo +import com.xyzshell.andinfo.libs.NetworkInfo import com.xyzshell.myphoneinfo.R +import com.xyzshell.myphoneinfo.custom.PermissionChecker import com.xyzshell.myphoneinfo.databinding.FragmentNetworkBinding import com.xyzshell.myphoneinfo.dialog.ShowLoadFragment class NetworkFragment : Fragment() { - private var status=1//0:未连接,1:已连接 + private var status=0//0:未连接,1:wifi 2:数据流量 + private lateinit var networkInfo: NetworkInfo private lateinit var binding:FragmentNetworkBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -30,16 +36,45 @@ private lateinit var binding:FragmentNetworkBinding override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - //connection + if(!PermissionChecker.hasWifiAndPhonePermissions(context = requireContext())){ + PermissionChecker.requestSimple( + requireActivity(), + onGranted = { + // 权限已授予,执行操作 + + }, + onDenied = { + // 权限被拒绝 + Toast.makeText(context, getString(R.string.permissions_required), Toast.LENGTH_SHORT).show() + } + ) + } + 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 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) 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.wfText8.textTitle.text=getString(R.string.channel) binding.networkLayout.wfText10.textTitle.text=getString(R.string.standard) //dhcp @@ -69,20 +104,6 @@ private lateinit var binding:FragmentNetworkBinding binding.simText3.textTitle.text=getString(R.string.roaming) binding.simText4.textTitle.text=getString(R.string.network_type) - - if(status==0){ - binding.noConnect.visibility=View.VISIBLE - binding.connectData.visibility=View.GONE - binding.networkLayout.wfText1.textContent.text="Disconnected" - binding.networkLayout.wifiList.visibility=View.GONE - binding.networkLayout.llPubShow.visibility=View.GONE - }else{ - binding.noConnect.visibility=View.GONE - binding.connectData.visibility=View.VISIBLE - binding.networkLayout.wfText1.textContent.text="Connected" - binding.networkLayout.wifiList.visibility=View.VISIBLE - binding.networkLayout.llPubShow.visibility=View.VISIBLE - } binding.networkLayout.pubShow.setOnClickListener{ val tag = "showLoadFragment" if (requireActivity().supportFragmentManager.findFragmentByTag(tag) == null) { @@ -92,6 +113,69 @@ private lateinit var binding:FragmentNetworkBinding } } + private fun setNoConnect() { + binding.noConnect.visibility=View.VISIBLE + binding.connectData.visibility=View.GONE + binding.networkLayout.wfText1.textContent.text="Disconnected" + binding.networkLayout.wifiList.visibility=View.GONE + binding.networkLayout.llPubShow.visibility=View.GONE + } + + /** + * 设置流量信息 + * */ + private fun setMobileInfo() { + binding.noConnect.visibility=View.GONE + binding.conText1.text=getString(R.string.mobile) + binding.connectData.visibility=View.VISIBLE + binding.networkLayout.wfText1.textContent.text="Connected" + binding.networkLayout.wifiList.visibility=View.VISIBLE + binding.networkLayout.llPubShow.visibility=View.VISIBLE + networkInfo.getMobileDetails()?.let { mobileDetails -> + + } + } + + /** + * 设置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() { + binding.noConnect.visibility=View.GONE + binding.conText1.text=getString(R.string.wifi) + binding.connectData.visibility=View.VISIBLE + binding.networkLayout.wifiList.visibility=View.VISIBLE + binding.networkLayout.llPubShow.visibility=View.VISIBLE + networkInfo.getWifiDetails()?.let { wifiDetails -> + Log.d("TTTTTTTT", (wifiDetails.signalLevelPercent?: "null").toString()) + binding.strengthView.setStrength(wifiDetails.signalLevelPercent?: 0) + binding.conText2.text="${wifiDetails.ssid}·${wifiDetails.linkSpeedMbps}" + binding.conTExt3.text="${wifiDetails.signalLevelPercent} ${wifiDetails.rssi}" + if(wifiDetails.connected){ + binding.networkLayout.wfText1.textContent.text=getString(R.string.connectivity_status) + }else{ + binding.networkLayout.wfText1.textContent.text=getString(R.string.not_connected) + } + + binding.networkLayout.wfText3.textContent.text=wifiDetails.bssid + binding.networkLayout.wfText4.textContent.text=wifiDetails.capabilities + binding.networkLayout.wfText5.textContent.text=wifiDetails.linkSpeedMbps.toString() + binding.networkLayout.wfText6.textContent.text=wifiDetails.signalLevelPercent.toString() + binding.networkLayout.wfText7.textContent.text=wifiDetails.frequency.toString() + binding.networkLayout.wfText8.textContent.text=wifiDetails.channel.toString() + binding.networkLayout.wfText10.textContent.text=wifiDetails.standard.toString() + + } + } + companion object { @JvmStatic diff --git a/myphoneinfo/src/main/res/layout/fragment_network.xml b/myphoneinfo/src/main/res/layout/fragment_network.xml index d74d1f0..d413f4b 100644 --- a/myphoneinfo/src/main/res/layout/fragment_network.xml +++ b/myphoneinfo/src/main/res/layout/fragment_network.xml @@ -56,9 +56,11 @@ android:orientation="horizontal" android:paddingVertical="30dp"> - @@ -67,8 +69,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:layout_marginStart="50dp" - android:visibility="gone"> + android:layout_marginStart="30dp" + android:visibility="visible"> diff --git a/myphoneinfo/src/main/res/layout/network_layout.xml b/myphoneinfo/src/main/res/layout/network_layout.xml index 0a684f3..9f5441a 100644 --- a/myphoneinfo/src/main/res/layout/network_layout.xml +++ b/myphoneinfo/src/main/res/layout/network_layout.xml @@ -61,9 +61,6 @@ android:text="@string/network" tools:ignore="RelativeOverlap" /> - @@ -82,9 +79,6 @@ - diff --git a/myphoneinfo/src/main/res/values/strings.xml b/myphoneinfo/src/main/res/values/strings.xml index 7996e99..012a405 100644 --- a/myphoneinfo/src/main/res/values/strings.xml +++ b/myphoneinfo/src/main/res/values/strings.xml @@ -104,9 +104,9 @@ DHCP BSSID Function - Connection Speed + Link speed Frequency - Frequency Band + Channel Channel Standard DHCP Server @@ -319,6 +319,8 @@ UWB support NFC support Secure NFC support + Connected + Not connected GPS \ No newline at end of file