From 689b92bfd0176c0b4248b1a7801250794d314641 Mon Sep 17 00:00:00 2001 From: yuqian Date: Fri, 16 Jan 2026 15:27:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dcamera=E3=80=81hardware?= =?UTF-8?q?=E3=80=81system=E5=8D=A1=E9=A1=BF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../myphoneinfo/dashboard/AppsFragment.kt | 5 + .../myphoneinfo/dashboard/CameraFragment.kt | 249 ++++++++++-------- .../myphoneinfo/dashboard/HardWareFragment.kt | 9 +- .../dashboard/SystemShowFragment.kt | 107 +++++--- .../myphoneinfo/main/MainViewModel.kt | 88 ++++--- .../src/main/res/layout/fragment_camera.xml | 1 + .../main/res/layout/fragment_hard_ware.xml | 1 + .../main/res/layout/fragment_system_show.xml | 1 + 8 files changed, 272 insertions(+), 189 deletions(-) diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AppsFragment.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AppsFragment.kt index f411487..2f93c8a 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AppsFragment.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AppsFragment.kt @@ -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? diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/CameraFragment.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/CameraFragment.kt index 843cac2..db2a498 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/CameraFragment.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/CameraFragment.kt @@ -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) + + } + } + } + } + } } diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt index 731b212..5fa0a81 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt @@ -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() diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/SystemShowFragment.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/SystemShowFragment.kt index e591b7c..b53aa6b 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/SystemShowFragment.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/SystemShowFragment.kt @@ -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 { diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/main/MainViewModel.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/main/MainViewModel.kt index 06ecf86..f53c3be 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/main/MainViewModel.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/main/MainViewModel.kt @@ -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() val input: LiveData = _inputInfo + // 系统相关数据 + private val _deviceInfo = MutableLiveData() + val deviceInfo: LiveData = _deviceInfo + private val _buildInfo = MutableLiveData() + val buildInfo: LiveData = _buildInfo + private val _clearkeyDrmDetail = MutableLiveData() + val clearkeyDrmDetail: LiveData = _clearkeyDrmDetail + + private val _widevineDrmDetail = MutableLiveData() + val widevineDrmDetail: LiveData = _widevineDrmDetail + //网络相关 private val networkInfo= AndInfo.instance.network private val _networkStatus= MutableLiveData() @@ -60,13 +76,17 @@ class MainViewModel: ViewModel() { //应用列表 private val _installedApps= MutableLiveData>() - - val installedApps: LiveData> = _installedApps - init{ + //相机相关 + private val _cameraInfo = MutableLiveData() + val cameraInfo: LiveData = _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) + } + + } } \ No newline at end of file diff --git a/myphoneinfo/src/main/res/layout/fragment_camera.xml b/myphoneinfo/src/main/res/layout/fragment_camera.xml index 56e001f..6ac04cc 100644 --- a/myphoneinfo/src/main/res/layout/fragment_camera.xml +++ b/myphoneinfo/src/main/res/layout/fragment_camera.xml @@ -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"> diff --git a/myphoneinfo/src/main/res/layout/fragment_system_show.xml b/myphoneinfo/src/main/res/layout/fragment_system_show.xml index 5912af7..172a4a2 100644 --- a/myphoneinfo/src/main/res/layout/fragment_system_show.xml +++ b/myphoneinfo/src/main/res/layout/fragment_system_show.xml @@ -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">