修复camera、hardware、system卡顿的问题

This commit is contained in:
yuqian 2026-01-16 15:27:05 +08:00
parent 596daf5fcc
commit 689b92bfd0
8 changed files with 272 additions and 189 deletions

View File

@ -36,6 +36,11 @@ class AppsFragment : Fragment(),AppListAdapter.OnShowDialogListener {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
} }
override fun onResume() {
super.onResume()
viewModel.loadApps()
}
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?

View File

@ -7,16 +7,22 @@ import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.activityViewModels
import com.xyzshell.andinfo.AndInfo import com.xyzshell.andinfo.AndInfo
import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.R
import com.xyzshell.myphoneinfo.custom.RefreshManager.load
import com.xyzshell.myphoneinfo.custom.RefreshManager.stop
import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.setDecimal0 import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.setDecimal0
import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.setDecimal1 import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.setDecimal1
import com.xyzshell.myphoneinfo.databinding.FragmentCameraBinding import com.xyzshell.myphoneinfo.databinding.FragmentCameraBinding
import com.xyzshell.myphoneinfo.databinding.ItemCameraTypeBinding import com.xyzshell.myphoneinfo.databinding.ItemCameraTypeBinding
import com.xyzshell.myphoneinfo.dialog.DialogCameraMore import com.xyzshell.myphoneinfo.dialog.DialogCameraMore
import com.xyzshell.myphoneinfo.main.MainViewModel
import kotlin.getValue
class CameraFragment : Fragment() { class CameraFragment : Fragment() {
private lateinit var binding:FragmentCameraBinding private lateinit var binding:FragmentCameraBinding
private val mainViewModel: MainViewModel by activityViewModels()
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -25,6 +31,11 @@ class CameraFragment : Fragment() {
} }
} }
override fun onResume() {
super.onResume()
mainViewModel.refreshCameraInfo()
}
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
@ -32,129 +43,133 @@ class CameraFragment : Fragment() {
// Inflate the layout for this fragment // Inflate the layout for this fragment
binding = FragmentCameraBinding.inflate(inflater, container, false) binding = FragmentCameraBinding.inflate(inflater, container, false)
initText() initText()
binding.swipeRefresh.setOnRefreshListener {
// binding.frontMore.setOnClickListener { load(binding.swipeRefresh)
// dialogCamera1= dialogCamera1?:DialogCameraMore(1) mainViewModel.refreshCameraInfo()
// dialogCamera1?.show(childFragmentManager, "DialogCameraMore1") }
// }
return binding.root return binding.root
} }
private fun initText() { private fun initText() {
val cameraInfo = AndInfo.instance.camera // binding.open2.text=cameraInfo.get
val cameraIds = cameraInfo.cameraIds
if(!cameraIds.isEmpty()){
cameraIds.forEachIndexed { index, cameraId ->
val characteristics = cameraInfo.getCameraCharacteristics(cameraId)
characteristics?.let {
val cameraCardView = LayoutInflater.from(context).inflate(
R.layout.item_camera_type,
binding.llCamera,
false
)
val itemBinding = ItemCameraTypeBinding.bind(cameraCardView)
// 2. 设置标题(区分前后摄像头)
val facing = cameraInfo.getCameraFacing(it).toString()
val cameraName = when (facing) {
"FRONT" -> getString(R.string.front_camera_1) + "${index + 1}"
"BACK" -> getString(R.string.rear_camera_1)+"${index + 1}"
else -> "External Camera ${index + 1}"
}
itemBinding.titleCon.text = cameraName
//取第一个相机的视频帧率
if(index==0){
cameraInfo.getMaxFrameRate(it).let { maxFrameRate->
binding.video.textTitle.text=getString(R.string.max_frequency)
binding.video.textContent.text=maxFrameRate.toString()+"HZ"
}
cameraInfo.supportsHighSpeedVideo(it).let { hasHighSpeedVideo ->
binding.videoCheck1.image.isSelected=hasHighSpeedVideo
}
cameraInfo.hasVideoStabilization(it).let { hasVideoStabilization ->
binding.videoCheck2.image.isSelected=hasVideoStabilization
}
}
// 4. 设置详细信息(使用 include 的文本)
itemBinding.camText1.textTitle.text=getString(R.string.resolution)
itemBinding.camText2.textTitle.text=getString(R.string.sensor_size)
itemBinding.camText3.textTitle.text=getString(R.string.pixel_size)
itemBinding.camText4.textTitle.text=getString(R.string._35mm_equivalent_focal_length)
itemBinding.camText5.textTitle.text=getString(R.string.shutter_speed)
itemBinding.camText6.textTitle.text=getString(R.string.iso_sensitivity_range)
itemBinding.rearCheck2.content.text=getString(R.string.flash)
itemBinding.rearCheck1.content.text=getString(R.string.optical_image_stabilization)
// 设置百万像素
cameraInfo.getMegaPixels(it)?.let { size ->
itemBinding.conText1.text = "${setDecimal1(size)} MP"
}
//光圈值
cameraInfo.getAvailableApertures(it)?.let { apertures ->
if (apertures.isNotEmpty()) {
itemBinding.conText2.text = "f/${apertures[0]}" // 取第一个光圈值
}
}
//像素阵列大小
cameraInfo.getPixelArraySize(it)?.let { size ->
itemBinding.camText1.textContent.text = size
}
// 传感器物理尺寸
cameraInfo.getSensorPhysicalSize(it)?.let { size ->
itemBinding.camText2.textContent.text=size
}
// 传感器物理尺寸
cameraInfo.getPixelSize(it)?.let { size ->
itemBinding.camText3.textContent.text="${setDecimal0(size)}μm"
}
// 35mm等效焦距
cameraInfo.getFocal35mmEquivalent(it)?.let { size ->
itemBinding.camText4.textContent.text="${size.toInt()}mm"
}
// 快门速度
cameraInfo.getShutterSpeedRange(it)?.let { size ->
itemBinding.camText5.textContent.text=size
}
// ISO感光范围
cameraInfo.getIsoRange(it)?.let { size ->
itemBinding.camText6.textContent.text=size.lower.toString() + " - " + size.upper.toString()
}
// 光学防抖
cameraInfo.hasOpticalStabilization(it).let { hasOpticalStabilization ->
itemBinding.rearCheck1.image.isSelected=hasOpticalStabilization
}
// 闪光灯
cameraInfo.hasFlashUnit(it)?.let { hasFlash ->
itemBinding.rearCheck2.image.isSelected=hasFlash
}
// 6. 设置"更多"按钮点击事件
itemBinding.rearMore.setOnClickListener {
var dialogCamera0: DialogCameraMore? = null
dialogCamera0= null ?:DialogCameraMore(cameraName,cameraId)
dialogCamera0.show(childFragmentManager, "DialogCameraMore")
}
// 7. 添加到父容器
binding.llCamera.addView(cameraCardView)
}
}
}
// binding.open2.text=cameraInfo.get
binding.videoCheck1.content.text=getString(R.string.hight_speed_video) binding.videoCheck1.content.text=getString(R.string.hight_speed_video)
binding.videoCheck2.content.text=getString(R.string.video_stabilization) binding.videoCheck2.content.text=getString(R.string.video_stabilization)
mainViewModel.cameraInfo.observe(viewLifecycleOwner, ){
cameraInfo ->
stop(binding.swipeRefresh)
cameraInfo?.let {
val cameraIds = cameraInfo.cameraIds
if(!cameraIds.isEmpty()){
cameraIds.forEachIndexed { index, cameraId ->
val characteristics = cameraInfo.getCameraCharacteristics(cameraId)
characteristics?.let {
val cameraCardView = LayoutInflater.from(context).inflate(
R.layout.item_camera_type,
binding.llCamera,
false
)
val itemBinding = ItemCameraTypeBinding.bind(cameraCardView)
// 2. 设置标题(区分前后摄像头)
val facing = cameraInfo.getCameraFacing(it).toString()
val cameraName = when (facing) {
"FRONT" -> getString(R.string.front_camera_1) + "${index + 1}"
"BACK" -> getString(R.string.rear_camera_1)+"${index + 1}"
else -> "External Camera ${index + 1}"
}
itemBinding.titleCon.text = cameraName
//取第一个相机的视频帧率
if(index==0){
cameraInfo.getMaxFrameRate(it).let { maxFrameRate->
binding.video.textTitle.text=getString(R.string.max_frequency)
binding.video.textContent.text=maxFrameRate.toString()+"HZ"
}
cameraInfo.supportsHighSpeedVideo(it).let { hasHighSpeedVideo ->
binding.videoCheck1.image.isSelected=hasHighSpeedVideo
}
cameraInfo.hasVideoStabilization(it).let { hasVideoStabilization ->
binding.videoCheck2.image.isSelected=hasVideoStabilization
}
}
// 4. 设置详细信息(使用 include 的文本)
itemBinding.camText1.textTitle.text=getString(R.string.resolution)
itemBinding.camText2.textTitle.text=getString(R.string.sensor_size)
itemBinding.camText3.textTitle.text=getString(R.string.pixel_size)
itemBinding.camText4.textTitle.text=getString(R.string._35mm_equivalent_focal_length)
itemBinding.camText5.textTitle.text=getString(R.string.shutter_speed)
itemBinding.camText6.textTitle.text=getString(R.string.iso_sensitivity_range)
itemBinding.rearCheck2.content.text=getString(R.string.flash)
itemBinding.rearCheck1.content.text=getString(R.string.optical_image_stabilization)
// 设置百万像素
cameraInfo.getMegaPixels(it)?.let { size ->
itemBinding.conText1.text = "${setDecimal1(size)} MP"
}
//光圈值
cameraInfo.getAvailableApertures(it)?.let { apertures ->
if (apertures.isNotEmpty()) {
itemBinding.conText2.text = "f/${apertures[0]}" // 取第一个光圈值
}
}
//像素阵列大小
cameraInfo.getPixelArraySize(it)?.let { size ->
itemBinding.camText1.textContent.text = size
}
// 传感器物理尺寸
cameraInfo.getSensorPhysicalSize(it)?.let { size ->
itemBinding.camText2.textContent.text=size
}
// 传感器物理尺寸
cameraInfo.getPixelSize(it)?.let { size ->
itemBinding.camText3.textContent.text="${setDecimal0(size)}μm"
}
// 35mm等效焦距
cameraInfo.getFocal35mmEquivalent(it)?.let { size ->
itemBinding.camText4.textContent.text="${size.toInt()}mm"
}
// 快门速度
cameraInfo.getShutterSpeedRange(it)?.let { size ->
itemBinding.camText5.textContent.text=size
}
// ISO感光范围
cameraInfo.getIsoRange(it)?.let { size ->
itemBinding.camText6.textContent.text=size.lower.toString() + " - " + size.upper.toString()
}
// 光学防抖
cameraInfo.hasOpticalStabilization(it).let { hasOpticalStabilization ->
itemBinding.rearCheck1.image.isSelected=hasOpticalStabilization
}
// 闪光灯
cameraInfo.hasFlashUnit(it)?.let { hasFlash ->
itemBinding.rearCheck2.image.isSelected=hasFlash
}
// 6. 设置"更多"按钮点击事件
itemBinding.rearMore.setOnClickListener {
var dialogCamera0: DialogCameraMore? = null
dialogCamera0= null ?:DialogCameraMore(cameraName,cameraId)
dialogCamera0.show(childFragmentManager, "DialogCameraMore")
}
// 7. 添加到父容器
binding.llCamera.addView(cameraCardView)
}
}
}
}
}
} }

View File

@ -22,6 +22,8 @@ import com.xyzshell.andinfo.AndInfo
import com.xyzshell.andinfo.libs.CpuInfo import com.xyzshell.andinfo.libs.CpuInfo
import com.xyzshell.andinfo.libs.MemInfo import com.xyzshell.andinfo.libs.MemInfo
import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.R
import com.xyzshell.myphoneinfo.custom.RefreshManager.load
import com.xyzshell.myphoneinfo.custom.RefreshManager.stop
import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.convertToApproximateAspectRatio import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.convertToApproximateAspectRatio
import com.xyzshell.myphoneinfo.databinding.FragmentHardWareBinding import com.xyzshell.myphoneinfo.databinding.FragmentHardWareBinding
import com.xyzshell.myphoneinfo.dialog.DialogBlueTooth import com.xyzshell.myphoneinfo.dialog.DialogBlueTooth
@ -66,7 +68,7 @@ class HardWareFragment : Fragment() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
checkAndDisplayBluetoothInfo() checkAndDisplayBluetoothInfo()
mainViewModel.refreshHardwareInfo(requireContext()) binding.root.postDelayed({mainViewModel.refreshHardwareInfo(requireContext())},300)
} }
@ -88,6 +90,10 @@ class HardWareFragment : Fragment() {
dialogDiskPart = dialogDiskPart ?: DialogDiskPart() dialogDiskPart = dialogDiskPart ?: DialogDiskPart()
dialogDiskPart?.show(childFragmentManager, "DiskPart") dialogDiskPart?.show(childFragmentManager, "DiskPart")
} }
binding.swipeRefresh.setOnRefreshListener {
load(binding.swipeRefresh)
mainViewModel.refreshHardwareInfo(requireContext())
}
return binding.root return binding.root
} }
@ -363,6 +369,7 @@ class HardWareFragment : Fragment() {
//频率 //频率
binding.text9.textTitle.text = getString(R.string.frequencies) binding.text9.textTitle.text = getString(R.string.frequencies)
mainViewModel.cpuInfo.observe(viewLifecycleOwner) { cpu -> mainViewModel.cpuInfo.observe(viewLifecycleOwner) { cpu ->
stop(binding.swipeRefresh)
cpu?.let { cpu?.let {
binding.text0.textContent.text = cpu.getProcessorName() binding.text0.textContent.text = cpu.getProcessorName()
binding.text1.textContent.text = cpu.getVendor() binding.text1.textContent.text = cpu.getVendor()

View File

@ -5,23 +5,37 @@ import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.activityViewModels
import com.xyzshell.andinfo.AndInfo import com.xyzshell.andinfo.AndInfo
import com.xyzshell.andinfo.libs.DRMInfo import com.xyzshell.andinfo.libs.DRMInfo
import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.R
import com.xyzshell.myphoneinfo.custom.RefreshManager.load
import com.xyzshell.myphoneinfo.custom.RefreshManager.stop
import com.xyzshell.myphoneinfo.databinding.FragmentSystemShowBinding import com.xyzshell.myphoneinfo.databinding.FragmentSystemShowBinding
import com.xyzshell.myphoneinfo.main.MainViewModel
class SystemShowFragment : Fragment() { class SystemShowFragment : Fragment() {
private lateinit var binding: FragmentSystemShowBinding private lateinit var binding: FragmentSystemShowBinding
private val mainViewModel: MainViewModel by activityViewModels()
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
} }
override fun onResume() {
super.onResume()
binding.root.postDelayed({mainViewModel.refreshSystemInfo()},300)
}
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
binding= FragmentSystemShowBinding.inflate(inflater,container,false) binding= FragmentSystemShowBinding.inflate(inflater,container,false)
binding.swipeRefresh.setOnRefreshListener {
load(binding.swipeRefresh)
mainViewModel.refreshSystemInfo()
}
initView() initView()
return binding.root return binding.root
} }
@ -34,21 +48,19 @@ private lateinit var binding: FragmentSystemShowBinding
} }
private fun setDrm() { private fun setDrm() {
val clearkeyDrmDetail = AndInfo.instance.drm.getDrmDetail(DRMInfo.CLEARKEY_UUID)
val widevineDrmDetail = AndInfo.instance.drm.getDrmDetail(DRMInfo.WIDEVINE_UUID)
binding.textclear1.textTitle.text=getString(R.string.vendor) binding.textclear1.textTitle.text=getString(R.string.vendor)
binding.textclear2.textTitle.text=getString(R.string.version) binding.textclear2.textTitle.text=getString(R.string.version)
clearkeyDrmDetail.let {
binding.textclear1.textContent.text=it?.vendor
binding.textclear2.textContent.text=it?.version
}
binding.textwide1.textTitle.text=getString(R.string.vendor) binding.textwide1.textTitle.text=getString(R.string.vendor)
binding.textwide2.textTitle.text=getString(R.string.version) binding.textwide2.textTitle.text=getString(R.string.version)
binding.textwide3.textTitle.text=getString(R.string.algorithm) binding.textwide3.textTitle.text=getString(R.string.algorithm)
binding.textwide4.textTitle.text=getString(R.string.device_id) binding.textwide4.textTitle.text=getString(R.string.device_id)
binding.textwide5.textTitle.text=getString(R.string.security_level) binding.textwide5.textTitle.text=getString(R.string.security_level)
binding.textwide6.textTitle.text=getString(R.string.highest_hdcp_level) binding.textwide6.textTitle.text=getString(R.string.highest_hdcp_level)
widevineDrmDetail.let { mainViewModel.clearkeyDrmDetail.observe(viewLifecycleOwner) {
binding.textclear1.textContent.text=it?.vendor
binding.textclear2.textContent.text=it?.version
}
mainViewModel.widevineDrmDetail.observe(viewLifecycleOwner) {
binding.textwide1.textContent.text=it?.vendor binding.textwide1.textContent.text=it?.vendor
binding.textwide2.textContent.text=it?.version binding.textwide2.textContent.text=it?.version
binding.textwide3.textContent.text=it?.algorithms?.joinToString() binding.textwide3.textContent.text=it?.algorithms?.joinToString()
@ -62,79 +74,94 @@ private lateinit var binding: FragmentSystemShowBinding
* Identifier * Identifier
* */ * */
private fun setIdentifier() { private fun setIdentifier() {
val buildInfo = AndInfo.instance.build mainViewModel.buildInfo.observe(viewLifecycleOwner){
binding.idDev1.text=buildInfo.googlePlayServicesVersionCode.toString() buildInfo ->
binding.idDev2.text=buildInfo.deviceUniqueId buildInfo?.let {
//google play services binding.idDev1.text=buildInfo.googlePlayServicesVersionCode.toString()
binding.textgoogle.textTitle.text=getString(R.string.google_play_services_version) binding.idDev2.text=buildInfo.deviceUniqueId
binding.textgoogle.textContent.text=buildInfo.googlePlayServicesVersion //google play services
binding.textgoogle.textTitle.text=getString(R.string.google_play_services_version)
binding.textgoogle.textContent.text=buildInfo.googlePlayServicesVersion
}
}
} }
/** /**
* 操作系统 * 操作系统
* */ * */
private fun setOperatingSystem() { private fun setOperatingSystem() {
val buildInfo = AndInfo.instance.build
binding.textOp1.textTitle.text=getString(R.string.android_version) binding.textOp1.textTitle.text=getString(R.string.android_version)
binding.textOp1.textContent.text=buildInfo.versionRelease
binding.textOp2.textTitle.text=getString(R.string.api) binding.textOp2.textTitle.text=getString(R.string.api)
binding.textOp2.textContent.text=buildInfo.versionSdkInt.toString()
// binding.textOp3.textTitle.text=getString(R.string.emui) // binding.textOp3.textTitle.text=getString(R.string.emui)
binding.textOp4.textTitle.text=getString(R.string.security_patch) binding.textOp4.textTitle.text=getString(R.string.security_patch)
binding.textOp4.textContent.text=buildInfo.securityPatch
binding.textOp5.textTitle.text=getString(R.string.version) binding.textOp5.textTitle.text=getString(R.string.version)
binding.textOp5.textContent.text=buildInfo.display
binding.textOp6.textTitle.text=getString(R.string.baseband) binding.textOp6.textTitle.text=getString(R.string.baseband)
binding.textOp6.textContent.text=buildInfo.brand
binding.textOp7.textTitle.text=getString(R.string.fingerprint) binding.textOp7.textTitle.text=getString(R.string.fingerprint)
binding.textOp7.textContent.text=buildInfo.fingerprint
binding.textOp8.textTitle.text=getString(R.string.build_time) binding.textOp8.textTitle.text=getString(R.string.build_time)
binding.textOp8.textContent.text=buildInfo.buildDate.toString()
binding.textOp9.textTitle.text=getString(R.string.initial_release) binding.textOp9.textTitle.text=getString(R.string.initial_release)
// todo // todo
binding.textOp10.textTitle.text=getString(R.string.architecture)
binding.textOp10.textContent.text=buildInfo.kernelArchitecture
binding.textOp11.textTitle.text=getString(R.string.instruction_sets) binding.textOp11.textTitle.text=getString(R.string.instruction_sets)
// todo // todo
binding.textOp10.textTitle.text=getString(R.string.architecture)
binding.textOp12.textTitle.text=getString(R.string.treble) binding.textOp12.textTitle.text=getString(R.string.treble)
binding.textOp12.textContent.text=if (buildInfo.isTrebleEnabled) "Supported" else "Not supported"
binding.textOp13.textTitle.text=getString(R.string.root_access) binding.textOp13.textTitle.text=getString(R.string.root_access)
binding.textOp13.textContent.text=if (AndInfo.instance.build.isRooted) "Yes" else "No"
binding.textOp14.textTitle.text=getString(R.string.google_play_services) binding.textOp14.textTitle.text=getString(R.string.google_play_services)
binding.textOp14.textContent.text=buildInfo.googlePlayServicesVersion
binding.textOp15.textTitle.text=getString(R.string.toybox) binding.textOp15.textTitle.text=getString(R.string.toybox)
binding.textOp15.textContent.text=buildInfo.toyboxVersion
binding.textOp16.textTitle.text=getString(R.string.java_VM) binding.textOp16.textTitle.text=getString(R.string.java_VM)
binding.textOp16.textContent.text=AndInfo.instance.build.jvmName + " " + AndInfo.instance.build.jvmVersion
binding.textOp17.textTitle.text=getString(R.string.ssl_version) binding.textOp17.textTitle.text=getString(R.string.ssl_version)
binding.textOp17.textContent.text=AndInfo.instance.build.openSslVersion + " " + AndInfo.instance.build.boringSslVersion
binding.textOp18.textTitle.text=getString(R.string.language) binding.textOp18.textTitle.text=getString(R.string.language)
binding.textOp18.textContent.text=AndInfo.instance.build.systemLanguage
binding.textOp19.textTitle.text=getString(R.string.usb_debugging) binding.textOp19.textTitle.text=getString(R.string.usb_debugging)
binding.textOp20.textTitle.text=getString(R.string.kernel)
mainViewModel.buildInfo.observe(viewLifecycleOwner) { buildInfo ->
buildInfo?.let {
binding.textOp1.textContent.text=buildInfo.versionRelease
binding.textOp2.textContent.text=buildInfo.versionSdkInt.toString()
binding.textOp4.textContent.text=buildInfo.securityPatch
binding.textOp5.textContent.text=buildInfo.display
binding.textOp6.textContent.text=buildInfo.brand
binding.textOp7.textContent.text=buildInfo.fingerprint
binding.textOp8.textContent.text=buildInfo.buildDate.toString()
binding.textOp10.textContent.text=buildInfo.kernelArchitecture
binding.textOp12.textContent.text=if (buildInfo.isTrebleEnabled) "Supported" else "Not supported"
binding.textOp13.textContent.text=if (AndInfo.instance.build.isRooted) "Yes" else "No"
binding.textOp14.textContent.text=buildInfo.googlePlayServicesVersion
binding.textOp15.textContent.text=buildInfo.toyboxVersion
binding.textOp16.textContent.text=buildInfo.jvmName + " " + buildInfo.jvmVersion
binding.textOp17.textContent.text=buildInfo.openSslVersion + " " + buildInfo.boringSslVersion
binding.textOp18.textContent.text=buildInfo.systemLanguage
binding.textOp19.textContent.text=if (buildInfo.isUsbDebuggingEnabled) "Enabled" else "Disabled" binding.textOp19.textContent.text=if (buildInfo.isUsbDebuggingEnabled) "Enabled" else "Disabled"
//内核 //内核
binding.textOp20.textTitle.text=getString(R.string.kernel) binding.textOp20.textContent.text=buildInfo.kernelCompleteVersion
binding.textOp20.textContent.text=AndInfo.instance.build.kernelCompleteVersion }
}
} }
/** /**
* 设置设备信息 * 设置设备信息
* */ * */
private fun setDeviceInfo() { private fun setDeviceInfo() {
val deviceInfo = AndInfo.instance.device
binding.phoneName.text=deviceInfo.brand
binding.text0.textTitle.text=getString(R.string.model) binding.text0.textTitle.text=getString(R.string.model)
binding.text0.textContent.text=deviceInfo.model
binding.text1.textTitle.text=getString(R.string.product) binding.text1.textTitle.text=getString(R.string.product)
binding.text1.textContent.text=deviceInfo.productName
binding.text2.textTitle.text=getString(R.string.device) binding.text2.textTitle.text=getString(R.string.device)
binding.text2.textContent.text=deviceInfo.device
binding.text3.textTitle.text=getString(R.string.board) binding.text3.textTitle.text=getString(R.string.board)
binding.text3.textContent.text=deviceInfo.boardName
binding.text4.textTitle.text=getString(R.string.manufacturer) binding.text4.textTitle.text=getString(R.string.manufacturer)
binding.text4.textContent.text=deviceInfo.manufacturer
mainViewModel.deviceInfo.observe(viewLifecycleOwner) {
deviceInfo ->
stop(binding.swipeRefresh)
deviceInfo?.let {
binding.phoneName.text=deviceInfo.brand
binding.text0.textContent.text=deviceInfo.model
binding.text1.textContent.text=deviceInfo.productName
binding.text2.textContent.text=deviceInfo.device
binding.text3.textContent.text=deviceInfo.boardName
binding.text4.textContent.text=deviceInfo.manufacturer
// binding.text5.textTitle.text=getString(R.string.baseband) // binding.text5.textTitle.text=getString(R.string.baseband)
}
}
} }
companion object { companion object {

View File

@ -10,7 +10,11 @@ import androidx.lifecycle.viewModelScope
import com.xyzshell.andinfo.AndInfo import com.xyzshell.andinfo.AndInfo
import com.xyzshell.andinfo.libs.AppDetails import com.xyzshell.andinfo.libs.AppDetails
import com.xyzshell.andinfo.libs.BluetoothInfo import com.xyzshell.andinfo.libs.BluetoothInfo
import com.xyzshell.andinfo.libs.BuildInfo
import com.xyzshell.andinfo.libs.CameraInfo
import com.xyzshell.andinfo.libs.CpuInfo import com.xyzshell.andinfo.libs.CpuInfo
import com.xyzshell.andinfo.libs.DRMInfo
import com.xyzshell.andinfo.libs.DeviceInfo
import com.xyzshell.andinfo.libs.DisplayInfo import com.xyzshell.andinfo.libs.DisplayInfo
import com.xyzshell.andinfo.libs.GpuInfo import com.xyzshell.andinfo.libs.GpuInfo
import com.xyzshell.andinfo.libs.InputInfo import com.xyzshell.andinfo.libs.InputInfo
@ -20,6 +24,7 @@ import com.xyzshell.andinfo.libs.NetworkInfo
import com.xyzshell.andinfo.libs.StorageInfo import com.xyzshell.andinfo.libs.StorageInfo
import com.xyzshell.myphoneinfo.custom.PermissionChecker import com.xyzshell.myphoneinfo.custom.PermissionChecker
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class MainViewModel: ViewModel() { class MainViewModel: ViewModel() {
@ -44,6 +49,17 @@ class MainViewModel: ViewModel() {
private val _inputInfo= MutableLiveData<InputInfo?>() private val _inputInfo= MutableLiveData<InputInfo?>()
val input: LiveData<InputInfo?> = _inputInfo val input: LiveData<InputInfo?> = _inputInfo
// 系统相关数据
private val _deviceInfo = MutableLiveData<DeviceInfo?>()
val deviceInfo: LiveData<DeviceInfo?> = _deviceInfo
private val _buildInfo = MutableLiveData<BuildInfo?>()
val buildInfo: LiveData<BuildInfo?> = _buildInfo
private val _clearkeyDrmDetail = MutableLiveData<DRMInfo.DRMDetail?>()
val clearkeyDrmDetail: LiveData<DRMInfo.DRMDetail?> = _clearkeyDrmDetail
private val _widevineDrmDetail = MutableLiveData<DRMInfo.DRMDetail?>()
val widevineDrmDetail: LiveData<DRMInfo.DRMDetail?> = _widevineDrmDetail
//网络相关 //网络相关
private val networkInfo= AndInfo.instance.network private val networkInfo= AndInfo.instance.network
private val _networkStatus= MutableLiveData<NetworkInfo.NetworkType?>() private val _networkStatus= MutableLiveData<NetworkInfo.NetworkType?>()
@ -60,13 +76,17 @@ class MainViewModel: ViewModel() {
//应用列表 //应用列表
private val _installedApps= MutableLiveData<List<AppDetails>>() private val _installedApps= MutableLiveData<List<AppDetails>>()
val installedApps: LiveData<List<AppDetails>> = _installedApps val installedApps: LiveData<List<AppDetails>> = _installedApps
init{ //相机相关
private val _cameraInfo = MutableLiveData<CameraInfo?>()
val cameraInfo: LiveData<CameraInfo?> = _cameraInfo
init{
loadApps() loadApps()
} refreshSystemInfo()
refreshCameraInfo()
}
fun refreshApps() { fun refreshApps() {
loadApps() loadApps()
@ -120,21 +140,6 @@ class MainViewModel: ViewModel() {
_networkPermissionGranted.postValue(hasPermissions) _networkPermissionGranted.postValue(hasPermissions)
} }
} }
/**
* 获取当前网络状态快速检查
*/
fun getCurrentNetworkType(context: Context): NetworkInfo.NetworkType? {
return try {
if (PermissionChecker.getMissingPermissions(context).isEmpty()) {
networkInfo.getCurrentNetworkType()
} else {
null
}
} catch (e: Exception) {
null
}
}
fun loadApps() { fun loadApps() {
viewModelScope.launch(Dispatchers.IO){ viewModelScope.launch(Dispatchers.IO){
val apps= AndInfo.instance.app.getInstalledApps() val apps= AndInfo.instance.app.getInstalledApps()
@ -149,20 +154,20 @@ class MainViewModel: ViewModel() {
fun refreshHardwareInfo(context: Context){ fun refreshHardwareInfo(context: Context){
viewModelScope.launch(Dispatchers.IO){ viewModelScope.launch(Dispatchers.IO){
try { try {
val cpu= AndInfo.instance.cpu val cpu= async{AndInfo.instance.cpu}
_cpuInfo.postValue(cpu) _cpuInfo.postValue(cpu.await())
val gpu= AndInfo.instance.gpu val gpu= async{AndInfo.instance.gpu}
_gpuInfo.postValue(gpu) _gpuInfo.postValue(gpu.await())
val display = AndInfo.instance.display val display = async{AndInfo.instance.display}
_displayInfo.postValue(display) _displayInfo.postValue(display.await())
val storage = AndInfo.instance.storage val storage = async{AndInfo.instance.storage}
_storageInfo.postValue(storage) _storageInfo.postValue(storage.await())
val mem = AndInfo.instance.memory val mem = async{AndInfo.instance.memory}
_memInfo.postValue(mem) _memInfo.postValue(mem.await())
// 检查权限 // 检查权限
val bluetoothInfo = AndInfo.instance.bluetooth val bluetoothInfo = AndInfo.instance.bluetooth
val inputInfo= AndInfo.instance.input val inputInfo= async{AndInfo.instance.input}
_inputInfo.postValue(inputInfo) _inputInfo.postValue(inputInfo.await())
val hasPermissions= bluetoothInfo.requiredPermissions.all { permission -> val hasPermissions= bluetoothInfo.requiredPermissions.all { permission ->
ActivityCompat.checkSelfPermission(context, permission) == ActivityCompat.checkSelfPermission(context, permission) ==
@ -179,4 +184,25 @@ class MainViewModel: ViewModel() {
} }
} }
} }
fun refreshSystemInfo(){
viewModelScope.launch(Dispatchers.IO){
val device = AndInfo.instance.device
_deviceInfo.postValue(device)
val buildInfo = AndInfo.instance.build
_buildInfo.postValue(buildInfo)
val clearkeyDrmDetail = AndInfo.instance.drm.getDrmDetail(DRMInfo.CLEARKEY_UUID)
_clearkeyDrmDetail.postValue(clearkeyDrmDetail)
val widevineDrmDetail = AndInfo.instance.drm.getDrmDetail(DRMInfo.WIDEVINE_UUID)
_widevineDrmDetail.postValue(widevineDrmDetail)
}
}
fun refreshCameraInfo(){
viewModelScope.launch(Dispatchers.IO){
val cameraInfo = AndInfo.instance.camera
_cameraInfo.postValue(cameraInfo)
}
}
} }

View File

@ -3,6 +3,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:id="@+id/swipeRefresh"
android:background="@color/background_color" android:background="@color/background_color"
tools:context=".dashboard.BatteryFragment"> tools:context=".dashboard.BatteryFragment">
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView

View File

@ -3,6 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:id="@+id/swipeRefresh"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/background_color" android:background="@color/background_color"
tools:context=".dashboard.DashboardFragment"> tools:context=".dashboard.DashboardFragment">

View File

@ -4,6 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/swipeRefresh"
android:background="@color/background_color" android:background="@color/background_color"
tools:context=".dashboard.DashboardFragment"> tools:context=".dashboard.DashboardFragment">