修复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)
}
override fun onResume() {
super.onResume()
viewModel.loadApps()
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?

View File

@ -7,16 +7,22 @@ import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.activityViewModels
import com.xyzshell.andinfo.AndInfo
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.setDecimal1
import com.xyzshell.myphoneinfo.databinding.FragmentCameraBinding
import com.xyzshell.myphoneinfo.databinding.ItemCameraTypeBinding
import com.xyzshell.myphoneinfo.dialog.DialogCameraMore
import com.xyzshell.myphoneinfo.main.MainViewModel
import kotlin.getValue
class CameraFragment : Fragment() {
private lateinit var binding:FragmentCameraBinding
private val mainViewModel: MainViewModel by activityViewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -25,6 +31,11 @@ class CameraFragment : Fragment() {
}
}
override fun onResume() {
super.onResume()
mainViewModel.refreshCameraInfo()
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
@ -32,129 +43,133 @@ class CameraFragment : Fragment() {
// Inflate the layout for this fragment
binding = FragmentCameraBinding.inflate(inflater, container, false)
initText()
// binding.frontMore.setOnClickListener {
// dialogCamera1= dialogCamera1?:DialogCameraMore(1)
// dialogCamera1?.show(childFragmentManager, "DialogCameraMore1")
// }
binding.swipeRefresh.setOnRefreshListener {
load(binding.swipeRefresh)
mainViewModel.refreshCameraInfo()
}
return binding.root
}
private fun initText() {
val cameraInfo = AndInfo.instance.camera
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.open2.text=cameraInfo.get
binding.videoCheck1.content.text=getString(R.string.hight_speed_video)
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.MemInfo
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.databinding.FragmentHardWareBinding
import com.xyzshell.myphoneinfo.dialog.DialogBlueTooth
@ -66,7 +68,7 @@ class HardWareFragment : Fragment() {
override fun onResume() {
super.onResume()
checkAndDisplayBluetoothInfo()
mainViewModel.refreshHardwareInfo(requireContext())
binding.root.postDelayed({mainViewModel.refreshHardwareInfo(requireContext())},300)
}
@ -88,6 +90,10 @@ class HardWareFragment : Fragment() {
dialogDiskPart = dialogDiskPart ?: DialogDiskPart()
dialogDiskPart?.show(childFragmentManager, "DiskPart")
}
binding.swipeRefresh.setOnRefreshListener {
load(binding.swipeRefresh)
mainViewModel.refreshHardwareInfo(requireContext())
}
return binding.root
}
@ -363,6 +369,7 @@ class HardWareFragment : Fragment() {
//频率
binding.text9.textTitle.text = getString(R.string.frequencies)
mainViewModel.cpuInfo.observe(viewLifecycleOwner) { cpu ->
stop(binding.swipeRefresh)
cpu?.let {
binding.text0.textContent.text = cpu.getProcessorName()
binding.text1.textContent.text = cpu.getVendor()

View File

@ -5,23 +5,37 @@ import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.activityViewModels
import com.xyzshell.andinfo.AndInfo
import com.xyzshell.andinfo.libs.DRMInfo
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.main.MainViewModel
class SystemShowFragment : Fragment() {
private lateinit var binding: FragmentSystemShowBinding
private val mainViewModel: MainViewModel by activityViewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onResume() {
super.onResume()
binding.root.postDelayed({mainViewModel.refreshSystemInfo()},300)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding= FragmentSystemShowBinding.inflate(inflater,container,false)
binding.swipeRefresh.setOnRefreshListener {
load(binding.swipeRefresh)
mainViewModel.refreshSystemInfo()
}
initView()
return binding.root
}
@ -34,21 +48,19 @@ private lateinit var binding: FragmentSystemShowBinding
}
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.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.textwide2.textTitle.text=getString(R.string.version)
binding.textwide3.textTitle.text=getString(R.string.algorithm)
binding.textwide4.textTitle.text=getString(R.string.device_id)
binding.textwide5.textTitle.text=getString(R.string.security_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.textwide2.textContent.text=it?.version
binding.textwide3.textContent.text=it?.algorithms?.joinToString()
@ -62,79 +74,94 @@ private lateinit var binding: FragmentSystemShowBinding
* Identifier
* */
private fun setIdentifier() {
val buildInfo = AndInfo.instance.build
binding.idDev1.text=buildInfo.googlePlayServicesVersionCode.toString()
binding.idDev2.text=buildInfo.deviceUniqueId
//google play services
binding.textgoogle.textTitle.text=getString(R.string.google_play_services_version)
binding.textgoogle.textContent.text=buildInfo.googlePlayServicesVersion
mainViewModel.buildInfo.observe(viewLifecycleOwner){
buildInfo ->
buildInfo?.let {
binding.idDev1.text=buildInfo.googlePlayServicesVersionCode.toString()
binding.idDev2.text=buildInfo.deviceUniqueId
//google play services
binding.textgoogle.textTitle.text=getString(R.string.google_play_services_version)
binding.textgoogle.textContent.text=buildInfo.googlePlayServicesVersion
}
}
}
/**
* 操作系统
* */
private fun setOperatingSystem() {
val buildInfo = AndInfo.instance.build
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.textContent.text=buildInfo.versionSdkInt.toString()
// binding.textOp3.textTitle.text=getString(R.string.emui)
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.textContent.text=buildInfo.display
binding.textOp6.textTitle.text=getString(R.string.baseband)
binding.textOp6.textContent.text=buildInfo.brand
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.textContent.text=buildInfo.buildDate.toString()
binding.textOp9.textTitle.text=getString(R.string.initial_release)
// todo
binding.textOp10.textTitle.text=getString(R.string.architecture)
binding.textOp10.textContent.text=buildInfo.kernelArchitecture
binding.textOp11.textTitle.text=getString(R.string.instruction_sets)
// todo
binding.textOp10.textTitle.text=getString(R.string.architecture)
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.textContent.text=if (AndInfo.instance.build.isRooted) "Yes" else "No"
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.textContent.text=buildInfo.toyboxVersion
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.textContent.text=AndInfo.instance.build.openSslVersion + " " + AndInfo.instance.build.boringSslVersion
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.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.textOp20.textTitle.text=getString(R.string.kernel)
binding.textOp20.textContent.text=AndInfo.instance.build.kernelCompleteVersion
binding.textOp20.textContent.text=buildInfo.kernelCompleteVersion
}
}
}
/**
* 设置设备信息
* */
private fun setDeviceInfo() {
val deviceInfo = AndInfo.instance.device
binding.phoneName.text=deviceInfo.brand
binding.text0.textTitle.text=getString(R.string.model)
binding.text0.textContent.text=deviceInfo.model
binding.text1.textTitle.text=getString(R.string.product)
binding.text1.textContent.text=deviceInfo.productName
binding.text2.textTitle.text=getString(R.string.device)
binding.text2.textContent.text=deviceInfo.device
binding.text3.textTitle.text=getString(R.string.board)
binding.text3.textContent.text=deviceInfo.boardName
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)
}
}
}
companion object {

View File

@ -10,7 +10,11 @@ import androidx.lifecycle.viewModelScope
import com.xyzshell.andinfo.AndInfo
import com.xyzshell.andinfo.libs.AppDetails
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.DRMInfo
import com.xyzshell.andinfo.libs.DeviceInfo
import com.xyzshell.andinfo.libs.DisplayInfo
import com.xyzshell.andinfo.libs.GpuInfo
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.myphoneinfo.custom.PermissionChecker
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
class MainViewModel: ViewModel() {
@ -44,6 +49,17 @@ class MainViewModel: ViewModel() {
private val _inputInfo= MutableLiveData<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 _networkStatus= MutableLiveData<NetworkInfo.NetworkType?>()
@ -60,13 +76,17 @@ class MainViewModel: ViewModel() {
//应用列表
private val _installedApps= MutableLiveData<List<AppDetails>>()
val installedApps: LiveData<List<AppDetails>> = _installedApps
init{
//相机相关
private val _cameraInfo = MutableLiveData<CameraInfo?>()
val cameraInfo: LiveData<CameraInfo?> = _cameraInfo
init{
loadApps()
}
refreshSystemInfo()
refreshCameraInfo()
}
fun refreshApps() {
loadApps()
@ -120,21 +140,6 @@ class MainViewModel: ViewModel() {
_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() {
viewModelScope.launch(Dispatchers.IO){
val apps= AndInfo.instance.app.getInstalledApps()
@ -149,20 +154,20 @@ class MainViewModel: ViewModel() {
fun refreshHardwareInfo(context: Context){
viewModelScope.launch(Dispatchers.IO){
try {
val cpu= AndInfo.instance.cpu
_cpuInfo.postValue(cpu)
val gpu= AndInfo.instance.gpu
_gpuInfo.postValue(gpu)
val display = AndInfo.instance.display
_displayInfo.postValue(display)
val storage = AndInfo.instance.storage
_storageInfo.postValue(storage)
val mem = AndInfo.instance.memory
_memInfo.postValue(mem)
val cpu= async{AndInfo.instance.cpu}
_cpuInfo.postValue(cpu.await())
val gpu= async{AndInfo.instance.gpu}
_gpuInfo.postValue(gpu.await())
val display = async{AndInfo.instance.display}
_displayInfo.postValue(display.await())
val storage = async{AndInfo.instance.storage}
_storageInfo.postValue(storage.await())
val mem = async{AndInfo.instance.memory}
_memInfo.postValue(mem.await())
// 检查权限
val bluetoothInfo = AndInfo.instance.bluetooth
val inputInfo= AndInfo.instance.input
_inputInfo.postValue(inputInfo)
val inputInfo= async{AndInfo.instance.input}
_inputInfo.postValue(inputInfo.await())
val hasPermissions= bluetoothInfo.requiredPermissions.all { 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/swipeRefresh"
android:background="@color/background_color"
tools:context=".dashboard.BatteryFragment">
<androidx.core.widget.NestedScrollView

View File

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

View File

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