From a7a0d45d9bbb39e96dbf86e57654c934f41d0b33 Mon Sep 17 00:00:00 2001 From: yuqian Date: Wed, 24 Dec 2025 14:06:44 +0800 Subject: [PATCH 1/5] camera --- .../myphoneinfo/custom/SetNumberUtils.kt | 10 ++++ .../myphoneinfo/dashboard/CameraFragment.kt | 53 +++++++++++++------ .../myphoneinfo/dialog/DialogCameraMore.kt | 2 +- 3 files changed, 47 insertions(+), 18 deletions(-) create mode 100644 myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberUtils.kt diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberUtils.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberUtils.kt new file mode 100644 index 0000000..e67e60d --- /dev/null +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberUtils.kt @@ -0,0 +1,10 @@ +package com.xyzshell.myphoneinfo.custom + +object SetNumberUtils { + fun setDecimal1(double: Double): String{ + return "%.1f".format(double) + } + fun setDecimal0(double: Double): String{ + return double.toInt().toString() + } +} \ No newline at end of file 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 fa97463..4cb1e36 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/CameraFragment.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/CameraFragment.kt @@ -10,6 +10,8 @@ import androidx.fragment.app.FragmentContainer import com.google.android.material.textview.MaterialTextView import com.xyzshell.andinfo.AndInfo import com.xyzshell.myphoneinfo.R +import com.xyzshell.myphoneinfo.custom.SetNumberUtils.setDecimal0 +import com.xyzshell.myphoneinfo.custom.SetNumberUtils.setDecimal1 import com.xyzshell.myphoneinfo.databinding.FragmentCameraBinding import com.xyzshell.myphoneinfo.databinding.ItemCameraTypeBinding import com.xyzshell.myphoneinfo.dialog.DialogCameraMore @@ -60,21 +62,10 @@ class CameraFragment : Fragment() { "FRONT" -> getString(R.string.front_camera_1) + "${index + 1}" "BACK" -> getString(R.string.rear_camera_1)+"${index + 1}" - else -> "camera ${index + 1}" + else -> "External Camera ${index + 1}" } itemBinding.titleCon.text = cameraName - // 3. 设置相机规格参数 - - cameraInfo.getPixelArraySize(it)?.let { size -> - itemBinding.conText1.text = "${size} MP" - } - - cameraInfo.getAvailableApertures(it)?.let { apertures -> - if (apertures.isNotEmpty()) { - itemBinding.conText2.text = "f/${apertures[0]}" // 取第一个光圈值 - } - } // 4. 设置详细信息(使用 include 的文本) @@ -86,9 +77,18 @@ class CameraFragment : Fragment() { 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) -// checkBox2?.text = "光学防抖" -// checkBox2?.isChecked = capabilities?.contains("OPTICAL_IMAGE_STABILIZATION") ?: false + // 设置百万像素 + + 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 @@ -98,18 +98,37 @@ class CameraFragment : Fragment() { 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) + dialogCamera0= null ?:DialogCameraMore(cameraName,cameraId) dialogCamera0.show(childFragmentManager, "DialogCameraMore") } diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCameraMore.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCameraMore.kt index 860b86e..687f79e 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCameraMore.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCameraMore.kt @@ -10,7 +10,7 @@ import com.xyzshell.myphoneinfo.base.BaseDialogFragment import com.xyzshell.myphoneinfo.databinding.DialogCameraMoreBinding import com.xyzshell.myphoneinfo.databinding.DialogCpuInfoBinding -class DialogCameraMore(private val name:String) :BaseDialogFragment(DialogCameraMoreBinding::inflate){ +class DialogCameraMore(private val name:String,private val id:String) :BaseDialogFragment(DialogCameraMoreBinding::inflate){ override fun getTitle(): String = name override fun getIconRes(): Int? =9 From 38f87df5c942f65e2eb74f255c72fb6a432b2256 Mon Sep 17 00:00:00 2001 From: yuqian Date: Thu, 25 Dec 2025 10:05:42 +0800 Subject: [PATCH 2/5] =?UTF-8?q?camera=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../custom/SetNumberOrWordUtils.kt | 32 +++++ .../myphoneinfo/custom/SetNumberUtils.kt | 10 -- .../myphoneinfo/dashboard/CameraFragment.kt | 27 +++- .../myphoneinfo/dialog/DialogCameraMore.kt | 130 +++++++++++++++++- .../main/res/layout/common_dialog_item.xml | 7 +- .../main/res/layout/common_sensor_style.xml | 9 +- .../main/res/layout/dialog_camera_more.xml | 57 ++++---- .../src/main/res/layout/fragment_camera.xml | 3 +- .../src/main/res/layout/fragment_sensors.xml | 2 +- myphoneinfo/src/main/res/values/strings.xml | 7 + 10 files changed, 223 insertions(+), 61 deletions(-) create mode 100644 myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt delete mode 100644 myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberUtils.kt diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt new file mode 100644 index 0000000..9d9d8bf --- /dev/null +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt @@ -0,0 +1,32 @@ +package com.xyzshell.myphoneinfo.custom + +object SetNumberOrWordUtils { + fun setDecimal1(double: Double): String{ + return "%.1f".format(double) + } + fun setDecimal0(double: Double): String{ + return double.toInt().toString() + } + + fun toTitleCase(sentence: String): String { + if (sentence.isEmpty()) return "" + + val words = sentence.trim().split("\\s+".toRegex()) // 按一个或多个空格分割 + + return if (words.isNotEmpty()) { + // 第一个单词首字母大写 + val firstWord = words[0].lowercase().replaceFirstChar { it.uppercase() } + + // 其余单词保持小写 + val remainingWords = words.drop(1).joinToString(" ") { it.lowercase() } + + if (remainingWords.isNotEmpty()) { + "$firstWord $remainingWords" + } else { + firstWord + } + } else { + "" + } + } +} \ No newline at end of file diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberUtils.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberUtils.kt deleted file mode 100644 index e67e60d..0000000 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberUtils.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.xyzshell.myphoneinfo.custom - -object SetNumberUtils { - fun setDecimal1(double: Double): String{ - return "%.1f".format(double) - } - fun setDecimal0(double: Double): String{ - return double.toInt().toString() - } -} \ No newline at end of file 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 4cb1e36..1ef761d 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/CameraFragment.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/CameraFragment.kt @@ -1,23 +1,22 @@ package com.xyzshell.myphoneinfo.dashboard +import android.hardware.camera2.CameraCharacteristics 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 androidx.compose.material3.Text -import androidx.fragment.app.FragmentContainer -import com.google.android.material.textview.MaterialTextView import com.xyzshell.andinfo.AndInfo import com.xyzshell.myphoneinfo.R -import com.xyzshell.myphoneinfo.custom.SetNumberUtils.setDecimal0 -import com.xyzshell.myphoneinfo.custom.SetNumberUtils.setDecimal1 +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 class CameraFragment : Fragment() { - private lateinit var binding:FragmentCameraBinding; + private lateinit var binding:FragmentCameraBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -66,6 +65,20 @@ class CameraFragment : Fragment() { } 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 的文本) @@ -125,6 +138,7 @@ class CameraFragment : Fragment() { itemBinding.rearCheck2.image.isSelected=hasFlash } + // 6. 设置"更多"按钮点击事件 itemBinding.rearMore.setOnClickListener { var dialogCamera0: DialogCameraMore? = null @@ -142,6 +156,7 @@ class CameraFragment : Fragment() { binding.videoCheck1.content.text=getString(R.string.hight_speed_video) binding.videoCheck2.content.text=getString(R.string.video_stabilization) + } companion object { diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCameraMore.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCameraMore.kt index 687f79e..4c8fa00 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCameraMore.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCameraMore.kt @@ -1,14 +1,14 @@ package com.xyzshell.myphoneinfo.dialog -import android.graphics.Typeface import android.os.Bundle -import android.text.SpannableString -import android.text.style.StyleSpan import android.view.View +import com.xyzshell.andinfo.AndInfo import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.base.BaseDialogFragment +import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.setDecimal0 +import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.setDecimal1 +import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.toTitleCase import com.xyzshell.myphoneinfo.databinding.DialogCameraMoreBinding -import com.xyzshell.myphoneinfo.databinding.DialogCpuInfoBinding class DialogCameraMore(private val name:String,private val id:String) :BaseDialogFragment(DialogCameraMoreBinding::inflate){ override fun getTitle(): String = name @@ -19,6 +19,128 @@ class DialogCameraMore(private val name:String,private val id:String) :BaseDialo override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + val cameraInfo = AndInfo.instance.camera + if(!id.isEmpty()){ + id.forEachIndexed { index, cameraId -> + val characteristics = cameraInfo.getCameraCharacteristics(id) + characteristics?.let { + // 设置详细信息(使用 include 的文本) + // 设置百万像素 + + cameraInfo.getMegaPixels(it)?.let { size -> + binding.tv1.setValue("${setDecimal1(size)} MP") + } + //像素阵列大小 + cameraInfo.getPixelArraySize(it)?.let { size -> + binding.tv2.setValue(size) + + } + // 传感器物理尺寸 + cameraInfo.getSensorPhysicalSize(it)?.let { size -> + binding.tv3.setValue(size) + } + // 传感器px尺寸 + cameraInfo.getPixelSize(it)?.let { size -> + binding.tv4.setValue("${setDecimal0(size)}μm") + } + // 颜色排列 + cameraInfo.getColorFilterArrangement(it)?.let { size -> + binding.tv5.setValue(size) + } + //光圈值 + cameraInfo.getAvailableApertures(it)?.let { apertures -> + if (apertures.isNotEmpty()) { + binding.tv6.setValue("f/${apertures[0]}") + } + } + //焦距 + cameraInfo.getFocalLength(it)?.let { apertures -> + if (apertures.isNotEmpty()) { + binding.tv7.setValue(apertures[0].toString()) + } + } + + // 35mm等效焦距 + cameraInfo.getFocal35mmEquivalent(it)?.let { size -> + binding.tv8.setValue("${size.toInt()}mm") + } + // 裁切系数 + cameraInfo.getFocal35mmEquivalent(it)?.let { size -> + binding.tv9.setValue("${size.toInt()}x") + } + // 快门速度 + cameraInfo.getShutterSpeedRange(it)?.let { size -> + binding.tv11.setValue(size) + } + + // ISO感光范围 + cameraInfo.getIsoRange(it)?.let { size -> + binding.tv12.setValue(size.lower.toString() + " - " + size.upper.toString()) + } + + // 闪光灯 + binding.check1.content.text=getString(R.string.flash) + cameraInfo.hasFlashUnit(it)?.let { hasFlash -> + binding.check1.image.isSelected=hasFlash + } + // 视频防抖 + binding.check2.content.text=getString(R.string.video_stabilization) + cameraInfo.hasVideoStabilization(it)?.let { hasVideoStabilization -> + binding.check2.image.isSelected=hasVideoStabilization + } + // 光学防抖 + binding.check3.content.text=getString(R.string.optical_image_stabilization) + cameraInfo.hasOpticalStabilization(it).let { hasOpticalStabilization -> + binding.check3.image.isSelected = hasOpticalStabilization + } + // 曝光锁定 + // 曝光模式 + binding.check4.content.text=getString(R.string.ae_lock) + cameraInfo.getAutoExposureModes(it)?.let { list -> + val allInfo=list.joinToString(" , ") { mode -> mode} + binding.check4.image.isSelected=list.size>2 + binding.more2.text=allInfo + } + // 白平衡锁定 + // 白平衡模式 + binding.check5.content.text=getString(R.string.wb_lock) + cameraInfo.getWhiteBalanceModes(it)?.let { list -> + binding.check5.image.isSelected=list.size>2 + val allInfo=list.joinToString(" , ") { mode -> mode} + binding.more4.text=allInfo + } + + + //功能 + cameraInfo.getAvailableCapabilities(it).let{ capabilities -> + val allCapabilities = capabilities.joinToString(",") { capability -> + toTitleCase(capability.name.replace("_", " ")) + } + binding.more1.text=allCapabilities + } + //自动对焦模式 + cameraInfo.getAvailableCapabilities(it).let{ capabilities -> + val allInfo=capabilities.joinToString(" , ") { capability -> + toTitleCase(capability.name.replace("_", " ")) + } + binding.more3.text=allInfo + } + + //场景模式 + cameraInfo.getSceneModes(it).let{ capabilities -> + val allInfo=capabilities?.joinToString(" , ") { capability -> + toTitleCase(capability.replace("_", " ")) + } + binding.more5.text=allInfo + binding.tv10.setValue(capabilities?.get(0) ?: "") + } + + + + + } + } + } } override fun onNegativeClick() { diff --git a/myphoneinfo/src/main/res/layout/common_dialog_item.xml b/myphoneinfo/src/main/res/layout/common_dialog_item.xml index 93687e2..d8ede61 100644 --- a/myphoneinfo/src/main/res/layout/common_dialog_item.xml +++ b/myphoneinfo/src/main/res/layout/common_dialog_item.xml @@ -18,17 +18,17 @@ \ No newline at end of file diff --git a/myphoneinfo/src/main/res/layout/common_sensor_style.xml b/myphoneinfo/src/main/res/layout/common_sensor_style.xml index 5434369..6fceed5 100644 --- a/myphoneinfo/src/main/res/layout/common_sensor_style.xml +++ b/myphoneinfo/src/main/res/layout/common_sensor_style.xml @@ -4,7 +4,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:paddingHorizontal="18dp" android:paddingVertical="15dp" - android:layout_marginVertical="8dp" + android:layout_marginVertical="5dp" android:background="@drawable/dashboard_model_background" android:layout_height="wrap_content"> diff --git a/myphoneinfo/src/main/res/layout/dialog_camera_more.xml b/myphoneinfo/src/main/res/layout/dialog_camera_more.xml index 3827ac4..c0c5b19 100644 --- a/myphoneinfo/src/main/res/layout/dialog_camera_more.xml +++ b/myphoneinfo/src/main/res/layout/dialog_camera_more.xml @@ -94,16 +94,14 @@ style="@style/LeftContent" android:layout_width="150dp" android:layout_height="wrap_content" - android:text="Capabilities" - android:textSize="15sp" - android:textStyle="bold" /> + android:text="@string/capabilities" /> + android:textColor="@color/right_color" /> + android:text="@string/exposure_modes" /> + android:textColor="@color/right_color" /> + android:text="@string/autofocus_modes" /> + android:textColor="@color/right_color" + /> + android:text="@string/white_balance_modes" + /> + android:textColor="@color/right_color" + /> + android:text="@string/scene_modes" + /> + android:textColor="@color/right_color" + /> diff --git a/myphoneinfo/src/main/res/layout/fragment_camera.xml b/myphoneinfo/src/main/res/layout/fragment_camera.xml index 200bf07..56e001f 100644 --- a/myphoneinfo/src/main/res/layout/fragment_camera.xml +++ b/myphoneinfo/src/main/res/layout/fragment_camera.xml @@ -85,10 +85,11 @@ diff --git a/myphoneinfo/src/main/res/layout/fragment_sensors.xml b/myphoneinfo/src/main/res/layout/fragment_sensors.xml index 10e118a..7f3f183 100644 --- a/myphoneinfo/src/main/res/layout/fragment_sensors.xml +++ b/myphoneinfo/src/main/res/layout/fragment_sensors.xml @@ -20,7 +20,7 @@ diff --git a/myphoneinfo/src/main/res/values/strings.xml b/myphoneinfo/src/main/res/values/strings.xml index 4fa79d7..d47a71c 100644 --- a/myphoneinfo/src/main/res/values/strings.xml +++ b/myphoneinfo/src/main/res/values/strings.xml @@ -293,4 +293,11 @@ Toybox Java VM current + AE lock + WB lock + White balance modes + Capabilities + Exposure modes + Autofocus modes + Scene modes \ No newline at end of file From 0f20afb7260f8d4e1f9c038f754e95a490b28268 Mon Sep 17 00:00:00 2001 From: yuqian Date: Thu, 25 Dec 2025 15:11:30 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9cpu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../myphoneinfo/dashboard/AnalysisActivity.kt | 3 + .../myphoneinfo/dashboard/HardWareFragment.kt | 60 +++++++---- .../src/main/res/layout/activity_analysis.xml | 99 ++++++------------ .../main/res/layout/fragment_hard_ware.xml | 40 ++++--- .../src/main/res/layout/fragment_network.xml | 4 +- .../src/main/res/layout/hard_bluetooth.xml | 5 +- .../src/main/res/layout/network_layout.xml | 2 +- .../src/main/res/mipmap-xhdpi/go_back.png | Bin 436 -> 234 bytes 8 files changed, 105 insertions(+), 108 deletions(-) diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AnalysisActivity.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AnalysisActivity.kt index f4eb363..0353b77 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AnalysisActivity.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AnalysisActivity.kt @@ -3,6 +3,7 @@ package com.xyzshell.myphoneinfo.dashboard import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.xyzshell.andinfo.AndInfo import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.databinding.ActivityAnalysisBinding import com.xyzshell.myphoneinfo.dialog.DialogCpuInfo @@ -32,6 +33,8 @@ class AnalysisActivity : AppCompatActivity() { private fun initText() { //processor binding.proText1.textTitle.text=getString(R.string.hardware) + binding.proText1.textContent.text=AndInfo.instance.cpu.text() + println(AndInfo.instance.cpu.text()) binding.proText2.textTitle.text=getString(R.string.manufacturer) binding.proText3.textTitle.text=getString(R.string.marketing_name) binding.proText4.textTitle.text=getString(R.string.process) 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 453c7c5..2279c8f 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt @@ -8,6 +8,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.xyzshell.andinfo.AndInfo +import com.xyzshell.andinfo.libs.CpuInfo import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.databinding.FragmentHardWareBinding import com.xyzshell.myphoneinfo.dialog.DialogBlueTooth @@ -63,47 +64,66 @@ class HardWareFragment : Fragment() { } private fun initText() { + val cpu = AndInfo.instance.cpu//cpu信息 + val device = AndInfo.instance.device//设备信息 + val gpu=AndInfo.instance.gpu//gpu信息 + + //processor + //处理器 binding.text0.textTitle.text = getString(R.string.processor) - + binding.text0.textContent.text= cpu.getProcessorName() + //制造商 binding.text1.textTitle.text = getString(R.string.vendor) - binding.text1.textContent.text=AndInfo.instance.device.manufacturer + binding.text1.textContent.text=cpu.getVendor() + //硬件 binding.text2.textTitle.text = getString(R.string.hardware) - binding.text2.textContent.text=AndInfo.instance.device.hardwareName + binding.text2.textContent.text=cpu.getProcessorName() binding.text3.textTitle.text = getString(R.string.cores) - binding.text3.textContent.text=AndInfo.instance.cpu.cores.size.toString() + binding.text3.textContent.text=cpu.cores.size.toString() + //cpu内核详情 binding.text4.textTitle.text = getString(R.string.CPU) - binding.text4.textContent.text=AndInfo.instance.cpu.text() + binding.text4.textContent.text=cpu.getCpuText() + //制程工艺 binding.text5.textTitle.text = getString(R.string.process) - + binding.text5.textContent.text=cpu.getProcessInfo().process + //架构 binding.text6.textTitle.text = getString(R.string.architecture) - + binding.text6.textContent.text=cpu.getArchitecture() + //ABI binding.text7.textTitle.text = getString(R.string.ABI) + binding.text7.textContent.text=cpu.getAbi() + //supported_ABls binding.text8.textTitle.text = getString(R.string.supported_ABls) + binding.text8.textContent.text=cpu.getSupportedAbis().joinToString() + //频率 binding.text9.textTitle.text = getString(R.string.frequencies) + binding.text9.textContent.text=cpu.getFrequencyText() + println(cpu.getFrequencyText()) + //gpu - binding.cpuText1.textTitle.text = getString(R.string.vendor) - binding.cpuText2.textTitle.text = getString(R.string.gpu) - val gpuInfo=AndInfo.instance.gpu.getGpuInformation() - gpuInfo.vkPhysicalDevices?.let { devices -> + binding.gpuText1.textTitle.text = getString(R.string.vendor) + binding.gpuText1.textContent.text=gpu.getVendorName() + binding.gpuText2.textTitle.text = getString(R.string.gpu) + + gpu.getGpuInformation().vkPhysicalDevices?.let { devices -> if (devices.isNotEmpty()) { devices.forEachIndexed { index, vkPhysicalDevice -> - binding.cpuText1.textContent.text=vkPhysicalDevice.vendorId.toString() - binding.cpuText2.textContent.text=vkPhysicalDevice.deviceName + binding.gpuText2.textContent.text=vkPhysicalDevice.deviceName } } } - binding.cpuText3.textTitle.text=getString(R.string.max_frequency) - binding.cpuText4.textTitle.text=getString(R.string.architecture) - binding.cpuText5.textTitle.text=getString(R.string.cores) - binding.cpuText6.textTitle.text=getString(R.string.total_l2) - binding.cpuText7.textTitle.text=getString(R.string.bus_width) - binding.cpuText8.textTitle.text=getString(R.string.vulkan_support) - binding.cpuText9.textTitle.text=getString(R.string.vulkan_API) + binding.gpuText3.textTitle.text=getString(R.string.max_frequency) + binding.gpuText4.textTitle.text=getString(R.string.architecture) + binding.gpuText5.textTitle.text=getString(R.string.cores) + binding.gpuText6.textTitle.text=getString(R.string.total_l2) + binding.gpuText7.textTitle.text=getString(R.string.bus_width) + binding.gpuText8.textTitle.text=getString(R.string.vulkan_support) + binding.gpuText9.textTitle.text=getString(R.string.vulkan_API) binding.open1.text=getString(R.string.opengl) gpuInfo.eglInformation?.let { eglInfo -> eglInfo.eglExtensions?.let { diff --git a/myphoneinfo/src/main/res/layout/activity_analysis.xml b/myphoneinfo/src/main/res/layout/activity_analysis.xml index a943ced..8546d83 100644 --- a/myphoneinfo/src/main/res/layout/activity_analysis.xml +++ b/myphoneinfo/src/main/res/layout/activity_analysis.xml @@ -14,28 +14,25 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" android:background="@color/white" - android:orientation="vertical"> + android:gravity="center_vertical" + android:orientation="horizontal"> - + - - + android:text="@string/proc_cpuinfo" /> @@ -143,23 +143,29 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" - android:orientation="horizontal" + android:orientation="vertical" android:visibility="visible"> + + android:text="@string/cpu_times" /> @@ -182,11 +188,13 @@ android:text="@string/cluster_1" tools:ignore="RelativeOverlap" /> - - - - - - - - - - - \ No newline at end of file diff --git a/myphoneinfo/src/main/res/layout/fragment_hard_ware.xml b/myphoneinfo/src/main/res/layout/fragment_hard_ware.xml index 6be4a1c..f9b0f0b 100644 --- a/myphoneinfo/src/main/res/layout/fragment_hard_ware.xml +++ b/myphoneinfo/src/main/res/layout/fragment_hard_ware.xml @@ -74,9 +74,9 @@ android:id="@+id/text9" layout="@layout/common_text_style" /> - @@ -109,39 +108,39 @@ tools:ignore="RelativeOverlap" /> @@ -405,7 +405,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" - android:orientation="horizontal"> + android:orientation="vertical"> diff --git a/myphoneinfo/src/main/res/layout/fragment_network.xml b/myphoneinfo/src/main/res/layout/fragment_network.xml index 331384a..d74d1f0 100644 --- a/myphoneinfo/src/main/res/layout/fragment_network.xml +++ b/myphoneinfo/src/main/res/layout/fragment_network.xml @@ -81,7 +81,7 @@ @@ -84,7 +85,7 @@ - + diff --git a/myphoneinfo/src/main/res/layout/network_layout.xml b/myphoneinfo/src/main/res/layout/network_layout.xml index bab75cb..0a684f3 100644 --- a/myphoneinfo/src/main/res/layout/network_layout.xml +++ b/myphoneinfo/src/main/res/layout/network_layout.xml @@ -167,7 +167,7 @@ android:textStyle="bold" /> al18i#l~=Wmo{t+;bvO01ko+HTUOmf|X1praT(UHx3vIVCg!0GLulN&o-= delta 395 zcmV;60d)TA0ki`liBL{Q4GJ0x0000DNk~Le0000i0000Z2nGNE0PoW1)R7@He*sBJ zL_t(|0oB;ujem5N?t6AqA&=8e{-$UG(Cyuw7k$2yE7lZs;b&0NwN^nDH+)fwm~YT z_FC(u&y^mv!fjYo*L7%CIuVaKf3L6&iwt;^=lPF#%n3X-77Ye7V9_8j3l{Z)nXsr6 z%!Wl)Fe4VVf?2WX3CxT|cVKobYQSAs)6raiLeK@=gQZH%35zs_ZLbG z4`Zi*9RucB%kQ@4yMqwaJSBS2r?M=UMNv%tPux9+=YW2C)3KvlX9;GsVRc$#MR(4_ zjOgAS2OE0Oo{kAUc-PE=b~=|}Ks%rOOpSIvTf;#g4*Vp?GZc>7`|*f3qxG pi^oQT(F58$_ALP&$MLs(s51*XL}t`qLs|d;002ovPDHLkV1nB`q Date: Fri, 26 Dec 2025 14:28:39 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E9=99=A4status=EF=BC=8Ccpu=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xyzshell/andinfo/libs/CpuInfo.kt | 24 ++ .../custom/SetNumberOrWordUtils.kt | 8 + .../myphoneinfo/dashboard/AnalysisActivity.kt | 71 ++++- .../myphoneinfo/dashboard/HardWareFragment.kt | 24 +- .../myphoneinfo/dialog/DialogCpuInfo.kt | 48 +++- .../src/main/res/layout/activity_analysis.xml | 44 +-- .../src/main/res/layout/dialog_cpu_info.xml | 264 +----------------- .../src/main/res/layout/item_analysis.xml | 30 ++ .../src/main/res/layout/item_cpu_analysis.xml | 31 ++ .../src/main/res/layout/item_dialog_cpu.xml | 92 ++++++ 10 files changed, 304 insertions(+), 332 deletions(-) create mode 100644 myphoneinfo/src/main/res/layout/item_analysis.xml create mode 100644 myphoneinfo/src/main/res/layout/item_cpu_analysis.xml create mode 100644 myphoneinfo/src/main/res/layout/item_dialog_cpu.xml diff --git a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/CpuInfo.kt b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/CpuInfo.kt index 3204cc4..ffe814c 100644 --- a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/CpuInfo.kt +++ b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/CpuInfo.kt @@ -630,6 +630,30 @@ class CpuInfo { return sb.toString() } + fun getCpuText():String{//自定义衍生方法 + val sb = StringBuilder() + val clusterInfo = getClusterInfo() + if (clusterInfo.bigCoreCount > 0) { + sb.append("大核: ${clusterInfo.bigCoreCount} 个, 最高频率: ${formatFrequency(clusterInfo.bigCoreFreq)}\n") + } + if (clusterInfo.midCoreCount > 0) { + sb.append("中核: ${clusterInfo.midCoreCount} 个, 最高频率: ${formatFrequency(clusterInfo.midCoreFreq)}\n") + } + if (clusterInfo.littleCoreCount > 0) { + sb.append("小核: ${clusterInfo.littleCoreCount} 个, 最高频率: ${formatFrequency(clusterInfo.littleCoreFreq)}\n") + } + return sb.toString() + } + //去重频率 + fun getFrequencyText():String {//自定义衍生方法 + return getCoreFrequencies() + .map { freq -> + "${formatFrequency(freq.minFreq.toULong() * 1000UL)}-${formatFrequency(freq.maxFreq.toULong() * 1000UL)}" + } + .distinct() // 自动去重 + .joinToString("\n") // 每行一个 + } + /** * 格式化频率显示 * @param freqHz 频率(Hz) diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt index 9d9d8bf..44589f2 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt @@ -29,4 +29,12 @@ object SetNumberOrWordUtils { "" } } + + /* + 将数字加1并转换为字符串 + */ + fun convertToStringNormal(string: String): String { + + return (Integer.parseInt(string) + 1).toString() + } } \ No newline at end of file diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AnalysisActivity.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AnalysisActivity.kt index 0353b77..aa360d1 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AnalysisActivity.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AnalysisActivity.kt @@ -2,11 +2,18 @@ package com.xyzshell.myphoneinfo.dashboard import android.content.Intent import android.os.Bundle +import android.view.LayoutInflater import androidx.appcompat.app.AppCompatActivity import com.xyzshell.andinfo.AndInfo +import com.xyzshell.andinfo.libs.cpu.models.Processor import com.xyzshell.myphoneinfo.R +import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.convertToStringNormal import com.xyzshell.myphoneinfo.databinding.ActivityAnalysisBinding +import com.xyzshell.myphoneinfo.databinding.ItemAnalysisBinding +import com.xyzshell.myphoneinfo.databinding.ItemCpuAnalysisBinding import com.xyzshell.myphoneinfo.dialog.DialogCpuInfo +import kotlin.collections.component1 +import kotlin.collections.component2 class AnalysisActivity : AppCompatActivity() { private lateinit var binding: ActivityAnalysisBinding @@ -31,25 +38,73 @@ class AnalysisActivity : AppCompatActivity() { } private fun initText() { + val cpu = AndInfo.instance.cpu //processor binding.proText1.textTitle.text=getString(R.string.hardware) - binding.proText1.textContent.text=AndInfo.instance.cpu.text() - println(AndInfo.instance.cpu.text()) + binding.proText1.textContent.text=cpu.getProcessorName() binding.proText2.textTitle.text=getString(R.string.manufacturer) + binding.proText2.textContent.text=cpu.getVendor() binding.proText3.textTitle.text=getString(R.string.marketing_name) + binding.proText3.textContent.text=cpu.getProcessorName() binding.proText4.textTitle.text=getString(R.string.process) + binding.proText4.textContent.text=cpu.getProcess() binding.proText5.textTitle.text=getString(R.string.cores) + binding.proText5.textContent.text=cpu.getCoreCount().toString() binding.proText6.textTitle.text=getString(R.string.CPU) + binding.proText6.textContent.text=cpu.getAllArchitectures().joinToString() binding.proText7.textTitle.text=getString(R.string.frequencies) + binding.proText7.textContent.text=cpu.getFrequencyText() binding.proText8.textTitle.text=getString(R.string.architecture) + binding.proText8.textContent.text=cpu.getArchitecture() binding.proText9.textTitle.text=getString(R.string.ABI) + binding.proText9.textContent.text=cpu.getAbi() binding.proText10.textTitle.text=getString(R.string.supported_ABls) + binding.proText10.textContent.text=cpu.getSupportedAbis().joinToString() binding.proText11.textTitle.text=getString(R.string.features) - //cluster1 - binding.clu1Text1.textTitle.text=getString(R.string.type) - binding.clu1Text2.textTitle.text=getString(R.string.vendor) - binding.clu1Text3.textTitle.text=getString(R.string.cluster) - binding.clu1Text4.textTitle.text=getString(R.string.max_frequency) - binding.clu1Text5.textTitle.text=getString(R.string.min_frequency) + binding.proText11.textContent.text=cpu.getCpuFeatures().joinToString() + setCluster() + + } + + /** + * 设置集群信息*/ + private fun setCluster() { + val groupedProcessors = mutableMapOf>() + //给簇分类 + AndInfo.instance.cpu.processors.forEach { processor -> + val clusterId = processor.cluster.clusterId + val list = groupedProcessors.getOrPut(clusterId) { mutableListOf() } + list.add(processor) + } + groupedProcessors.forEach { (clusterId, processors) -> + println("集群 $clusterId: ${processors.size} 个处理器") + val itemView= LayoutInflater.from(this).inflate(R.layout.item_analysis,binding.llCluster,false) + val itemBinding = ItemAnalysisBinding.bind(itemView) + itemBinding.cluster1Title.text=getString(R.string.cluster)+convertToStringNormal(clusterId.toString()) + val coresRangeList= mutableListOf() + //获取簇范围 + processors.forEach { processor -> + coresRangeList.add(processor.core.coreId.toString()) + } + processors.forEach { processor -> + //设置每个cpu信息 + val itemGroup= LayoutInflater.from(this).inflate(R.layout.item_cpu_analysis,itemBinding.clusterInfo,false) + val itemGroupBinding = ItemCpuAnalysisBinding.bind(itemGroup) + itemGroupBinding.cputitle.text="cpu ${processor.core.coreId}" + itemGroupBinding.clu1Text1.textTitle.text=getString(R.string.type) + itemGroupBinding.clu1Text1.textContent.text=processor.cluster.uarch.toString() + itemGroupBinding.clu1Text2.textTitle.text=getString(R.string.vendor) + itemGroupBinding.clu1Text2.textContent.text=processor.cluster.vendor.toString() + itemGroupBinding.clu1Text3.textTitle.text=getString(R.string.cluster) + itemGroupBinding.clu1Text3.textContent.text="$coresRangeList" + itemGroupBinding.clu1Text4.textTitle.text=getString(R.string.max_frequency) + itemGroupBinding.clu1Text4.textContent.text=processor.cluster.frequency.toString()+" MHz" + itemGroupBinding.clu1Text5.textTitle.text=getString(R.string.min_frequency) + itemBinding.clusterInfo.addView(itemGroup) + println(" CPU${processor.core.coreId}: ${processor.cluster.uarch}") + } + //添加到父容器 + binding.llCluster.addView(itemView) + } } } \ No newline at end of file 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 2279c8f..1ae50b9 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt @@ -79,11 +79,12 @@ class HardWareFragment : Fragment() { //硬件 binding.text2.textTitle.text = getString(R.string.hardware) binding.text2.textContent.text=cpu.getProcessorName() + //核心数 binding.text3.textTitle.text = getString(R.string.cores) binding.text3.textContent.text=cpu.cores.size.toString() //cpu内核详情 binding.text4.textTitle.text = getString(R.string.CPU) - binding.text4.textContent.text=cpu.getCpuText() + binding.text4.textContent.text=cpu.getAllArchitectures().joinToString() //制程工艺 binding.text5.textTitle.text = getString(R.string.process) binding.text5.textContent.text=cpu.getProcessInfo().process @@ -99,7 +100,6 @@ class HardWareFragment : Fragment() { //频率 binding.text9.textTitle.text = getString(R.string.frequencies) binding.text9.textContent.text=cpu.getFrequencyText() - println(cpu.getFrequencyText()) @@ -125,16 +125,16 @@ class HardWareFragment : Fragment() { binding.gpuText8.textTitle.text=getString(R.string.vulkan_support) binding.gpuText9.textTitle.text=getString(R.string.vulkan_API) binding.open1.text=getString(R.string.opengl) - gpuInfo.eglInformation?.let { eglInfo -> - eglInfo.eglExtensions?.let { - dialogExtension?.setContent(it.joinToString()) - } - eglInfo.glInformation?.let{glInfo -> - binding.openItem1.text=glInfo.glVendor - binding.openItem2.text=glInfo.glRenderer - binding.openItem3.text=glInfo.glVersion - } - } +// gpuInfo.eglInformation?.let { eglInfo -> +// eglInfo.eglExtensions?.let { +// dialogExtension?.setContent(it.joinToString()) +// } +// eglInfo.glInformation?.let{glInfo -> +// binding.openItem1.text=glInfo.glVendor +// binding.openItem2.text=glInfo.glRenderer +// binding.openItem3.text=glInfo.glVersion +// } +// } //display val defaultDisplayInfo = AndInfo.instance.display.getDefaultDisplayInfo() if(defaultDisplayInfo!=null){ diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCpuInfo.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCpuInfo.kt index cbe9ecf..8f23053 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCpuInfo.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCpuInfo.kt @@ -3,11 +3,17 @@ package com.xyzshell.myphoneinfo.dialog import android.graphics.Typeface import android.os.Bundle import android.text.SpannableString +import android.text.style.ForegroundColorSpan import android.text.style.StyleSpan +import android.view.LayoutInflater import android.view.View +import androidx.compose.ui.graphics.Color +import androidx.core.content.ContextCompat +import com.xyzshell.andinfo.AndInfo import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.base.BaseDialogFragment import com.xyzshell.myphoneinfo.databinding.DialogCpuInfoBinding +import com.xyzshell.myphoneinfo.databinding.ItemDialogCpuBinding class DialogCpuInfo :BaseDialogFragment(DialogCpuInfoBinding::inflate){ override fun getTitle(): String = resources.getString(R.string.proc_cpuinfo) @@ -18,16 +24,32 @@ class DialogCpuInfo :BaseDialogFragment(DialogCpuInfoBindi override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding.cpuTv01.text=setColonBoldText("Processor :AArch64 Processor rev 2(aarch64)") - binding.cpuTv02.text=setColonBoldText("processor :1") - binding.cpuTv03.text=setColonBoldText("BogoMIPS :3.84" ) - binding.cpuTv04.text=setColonBoldText("Features :fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid") - binding.cpuTv05.text=setColonBoldText("CPU implementer :0×41") - binding.cpuTv06.text=setColonBoldText("CPU architecture :8") - binding.cpuTv07.text=setColonBoldText("CPU variant :0×0") - binding.cpuTv08.text=setColonBoldText("CPU part :0×d03") - binding.cpuTv09.text=setColonBoldText("CPU revision :4") - binding.hardwareTv.text=setColonBoldText("Hardware :vendor Kirin710") + val cpu = AndInfo.instance.cpu//cpu信息 + cpu.processors.forEach { processor -> + val view=LayoutInflater.from(context).inflate(R.layout.item_dialog_cpu,binding.container,false) + val itemBinding= ItemDialogCpuBinding.bind(view) + + itemBinding.cpuTv02.text=setColonBoldText("processor :${processor.core.coreId}") + itemBinding.cpuTv03.text=setColonBoldText("BogoMIPS :" ) + itemBinding.cpuTv04.text=setColonBoldText("Features :${cpu.getCpuFeatures().joinToString(",")}") + itemBinding.cpuTv05.text=setColonBoldText("CPU implementer :${processor.core.midr?.implementer}") + itemBinding.cpuTv06.text=setColonBoldText("CPU architecture :${processor.core.midr?.architecture}") + itemBinding.cpuTv07.text=setColonBoldText("CPU variant :${processor.core.midr?.variant}") + itemBinding.cpuTv08.text=setColonBoldText("CPU part :${processor.core.midr?.primaryPartNumber}") + itemBinding.cpuTv09.text=setColonBoldText("CPU revision :${processor.core.midr?.revision}") + binding.container.addView(view) + } + binding.hardwareTv.text=setColonBoldText("Hardware :${cpu.getProcessorName()}") +// binding.cpuTv01.text=setColonBoldText("Processor :${cpu.getProcessorName()}") +// binding.cpuTv02.text=setColonBoldText("processor :1") +// binding.cpuTv03.text=setColonBoldText("BogoMIPS :3.84" ) +// binding.cpuTv04.text=setColonBoldText("Features :fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid") +// binding.cpuTv05.text=setColonBoldText("CPU implementer :0×41") +// binding.cpuTv06.text=setColonBoldText("CPU architecture :8") +// binding.cpuTv07.text=setColonBoldText("CPU variant :0×0") +// binding.cpuTv08.text=setColonBoldText("CPU part :0×d03") +// binding.cpuTv09.text=setColonBoldText("CPU revision :4") +// binding.hardwareTv.text=setColonBoldText("Hardware :vendor Kirin710") } fun setColonBoldText( text: String) : SpannableString { val colonIndex = text.indexOf(":") @@ -40,6 +62,12 @@ class DialogCpuInfo :BaseDialogFragment(DialogCpuInfoBindi colonIndex, SpannableString.SPAN_INCLUSIVE_INCLUSIVE ) + spannableString.setSpan( + ForegroundColorSpan(ContextCompat.getColor(context,R.color.left_color)), + 0, + colonIndex, + SpannableString.SPAN_INCLUSIVE_EXCLUSIVE + ) return spannableString } else { return SpannableString(text) diff --git a/myphoneinfo/src/main/res/layout/activity_analysis.xml b/myphoneinfo/src/main/res/layout/activity_analysis.xml index 8546d83..3ad8617 100644 --- a/myphoneinfo/src/main/res/layout/activity_analysis.xml +++ b/myphoneinfo/src/main/res/layout/activity_analysis.xml @@ -33,10 +33,6 @@ android:textColor="@color/black" style="@style/TextHeavy20"/> - - - - - - - - - + android:orientation="vertical"> diff --git a/myphoneinfo/src/main/res/layout/dialog_cpu_info.xml b/myphoneinfo/src/main/res/layout/dialog_cpu_info.xml index 7bc9223..f11483d 100644 --- a/myphoneinfo/src/main/res/layout/dialog_cpu_info.xml +++ b/myphoneinfo/src/main/res/layout/dialog_cpu_info.xml @@ -16,277 +16,21 @@ android:orientation="vertical"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:textColor="@color/right_color" + android:textSize="18sp" /> diff --git a/myphoneinfo/src/main/res/layout/item_analysis.xml b/myphoneinfo/src/main/res/layout/item_analysis.xml new file mode 100644 index 0000000..2d63b83 --- /dev/null +++ b/myphoneinfo/src/main/res/layout/item_analysis.xml @@ -0,0 +1,30 @@ + + + + + + + + + \ No newline at end of file diff --git a/myphoneinfo/src/main/res/layout/item_cpu_analysis.xml b/myphoneinfo/src/main/res/layout/item_cpu_analysis.xml new file mode 100644 index 0000000..f5cba91 --- /dev/null +++ b/myphoneinfo/src/main/res/layout/item_cpu_analysis.xml @@ -0,0 +1,31 @@ + + + + + + + + + \ No newline at end of file diff --git a/myphoneinfo/src/main/res/layout/item_dialog_cpu.xml b/myphoneinfo/src/main/res/layout/item_dialog_cpu.xml new file mode 100644 index 0000000..7fb0838 --- /dev/null +++ b/myphoneinfo/src/main/res/layout/item_dialog_cpu.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From a59073b0af86c954bf1ad70040e642709094cbcd Mon Sep 17 00:00:00 2001 From: yuqian Date: Mon, 29 Dec 2025 10:16:04 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=A1=AC=E4=BB=B6GPU?= =?UTF-8?q?=EF=BC=8Cdisplay?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../custom/SetNumberOrWordUtils.kt | 51 ++++++++++++++++ .../myphoneinfo/dashboard/HardWareFragment.kt | 60 +++++++++++++------ 2 files changed, 93 insertions(+), 18 deletions(-) diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt index 44589f2..a9015a4 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt @@ -1,5 +1,7 @@ package com.xyzshell.myphoneinfo.custom +import kotlin.math.abs + object SetNumberOrWordUtils { fun setDecimal1(double: Double): String{ return "%.1f".format(double) @@ -37,4 +39,53 @@ object SetNumberOrWordUtils { return (Integer.parseInt(string) + 1).toString() } + + + /** + * 智能宽高比转换 + * 输入:width=1080, height=2800 + * 输出:20:9(近似值) + */ + fun convertToApproximateAspectRatio(width: Int, height: Int): String { + val isPortrait = height > width + + // 总是按横屏计算(宽>高) + val displayWidth = if (isPortrait) height else width + val displayHeight = if (isPortrait) width else height + + // 计算实际比例 + val actualRatio = displayWidth.toDouble() / displayHeight + + // 常见宽高比映射表(比例值 -> 宽高比字符串) + val commonRatios = mapOf( + 1.333 to "4:3", // 4:3 = 1.333 + 1.5 to "3:2", // 3:2 = 1.5 + 1.6 to "16:10", // 16:10 = 1.6 + 1.667 to "5:3", // 5:3 = 1.667 + 1.778 to "16:9", // 16:9 = 1.778 + 2.0 to "18:9", // 18:9 = 2.0 + 2.111 to "19:9", // 19:9 = 2.111 + 2.222 to "20:9", // 20:9 = 2.222 ← 您要的 + 2.333 to "21:9", // 21:9 = 2.333 + 2.4 to "24:10", // 24:10 = 2.4 + 2.5 to "25:10", // 25:10 = 2.5 + ) + + // 找到最接近的常见比例 + var closestRatio = "16:9" + var minDifference = Double.MAX_VALUE + + for ((ratioValue, ratioStr) in commonRatios) { + val difference = abs(actualRatio - ratioValue) + if (difference < minDifference) { + minDifference = difference + closestRatio = ratioStr + } + } + + return closestRatio + } + + + } \ No newline at end of file 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 1ae50b9..5efd83d 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt @@ -10,6 +10,7 @@ import android.view.ViewGroup import com.xyzshell.andinfo.AndInfo import com.xyzshell.andinfo.libs.CpuInfo import com.xyzshell.myphoneinfo.R +import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.convertToApproximateAspectRatio import com.xyzshell.myphoneinfo.databinding.FragmentHardWareBinding import com.xyzshell.myphoneinfo.dialog.DialogBlueTooth import com.xyzshell.myphoneinfo.dialog.DialogDiskPart @@ -120,46 +121,69 @@ class HardWareFragment : Fragment() { binding.gpuText3.textTitle.text=getString(R.string.max_frequency) binding.gpuText4.textTitle.text=getString(R.string.architecture) binding.gpuText5.textTitle.text=getString(R.string.cores) + binding.gpuText5.textContent.text=gpu.getOpenGLExtensionCount().toString() binding.gpuText6.textTitle.text=getString(R.string.total_l2) binding.gpuText7.textTitle.text=getString(R.string.bus_width) binding.gpuText8.textTitle.text=getString(R.string.vulkan_support) + binding.gpuText8.textContent.text=gpu.isVulkanSupported().toString() binding.gpuText9.textTitle.text=getString(R.string.vulkan_API) + binding.gpuText9.textContent.text=gpu.getVulkanApiVersion() binding.open1.text=getString(R.string.opengl) -// gpuInfo.eglInformation?.let { eglInfo -> -// eglInfo.eglExtensions?.let { -// dialogExtension?.setContent(it.joinToString()) -// } -// eglInfo.glInformation?.let{glInfo -> -// binding.openItem1.text=glInfo.glVendor -// binding.openItem2.text=glInfo.glRenderer -// binding.openItem3.text=glInfo.glVersion -// } -// } + gpu.getGpuInformation().eglInformation?.let { eglInfo -> + eglInfo.eglExtensions?.let { + dialogExtension?.setContent(it.joinToString()) + } + } + binding.openItem1.text=gpu.getVendorName() + binding.openItem2.text=gpu.getRendererName() + binding.openItem3.text=gpu.getOpenGLVersion() + + + //display - val defaultDisplayInfo = AndInfo.instance.display.getDefaultDisplayInfo() + val display=AndInfo.instance.display//显示信息 + val defaultDisplayInfo = display.getDefaultDisplayInfo() + val width = defaultDisplayInfo?.widthPixels.toString() + val height = defaultDisplayInfo?.heightPixels.toString() + if(defaultDisplayInfo!=null){ - binding.disText1.textContent.text=defaultDisplayInfo.widthPixels.toString()+"x"+defaultDisplayInfo.heightPixels.toString() + + binding.disText1.textContent.text=width+"x"+height } binding.disText1.textTitle.text=getString(R.string.resolution) - binding.disText2.textTitle.text=getString(R.string.screen_density)//这个是px + binding.disText2.textContent.text=defaultDisplayInfo?.ppi.toString() binding.disText3.textTitle.text=getString(R.string.screen_density_d) - val dpiStr=defaultDisplayInfo?.densityDpi.toString()+"(xxhdpi)\n"+defaultDisplayInfo?.xdpi?.roundToInt()+"dp"+defaultDisplayInfo?.ydpi?.roundToInt()+"dp" + val dpiStr=defaultDisplayInfo?.densityDpi.toString()+"(xxhdpi)\n"+defaultDisplayInfo?.xdpi?.roundToInt()+"dpx"+defaultDisplayInfo?.ydpi?.roundToInt()+"dp" binding.disText3.textContent.text=dpiStr binding.disText4.textTitle.text=getString(R.string.screen_size_e) + binding.disText5.textTitle.text=getString(R.string.aspect_ratio) + binding.disText5.textContent.text=convertToApproximateAspectRatio(width = width.toInt(), height = height.toInt()).toString() binding.disText6.textTitle.text=getString(R.string.refresh_rate) binding.disText6.textContent.text=defaultDisplayInfo?.refreshRate.toString()+"HZ" binding.disText7.textTitle.text=getString(R.string.wide_color_gamut) binding.disText7.textContent.text=defaultDisplayInfo?.isWideColorGamut.toString() binding.disText8.textTitle.text=getString(R.string.hdr_support) - binding.disText8.textContent.text=defaultDisplayInfo?.isHdr.toString() + if(defaultDisplayInfo?.isHdr == true){ + defaultDisplayInfo.hdrTypes.joinToString() + binding.disText8.textContent.text= defaultDisplayInfo.hdrTypes.joinToString() + }else{ + binding.disText8.textContent.text= "No" + } + + //memory val storageInfo = AndInfo.instance.storage//存储信息 val used=Formatter.formatFileSize(AndInfo.instance.context, storageInfo.internalStorageUsedSpace) val free=Formatter.formatFileSize(AndInfo.instance.context, storageInfo.internalStorageAvailableSpace) val total=Formatter.formatFileSize(AndInfo.instance.context, storageInfo.internalStorageTotalSpace) + + val outused=Formatter.formatFileSize(AndInfo.instance.context, storageInfo.externalStorageUsedSpace?: 0) + val outfree=Formatter.formatFileSize(AndInfo.instance.context, storageInfo.externalStorageAvailableSpace?: 0) + val outtotal=Formatter.formatFileSize(AndInfo.instance.context, storageInfo.externalStorageTotalSpace?: 0) + binding.memoryLayout.memText1.textTitle.text=getString(R.string.ram_size) binding.memoryLayout.memText1.textContent.text=total binding.memoryLayout.ram1.text=used+" used" @@ -169,9 +193,9 @@ class HardWareFragment : Fragment() { //storage binding.memoryLayout.memText3.textTitle.text=getString(R.string.zram) binding.memoryLayout.memText3.textContent.text=Formatter.formatFileSize(AndInfo.instance.context, storageInfo.internalStorageTotalSpace) - binding.memoryLayout.ram3.text=used+" used" - binding.memoryLayout.ram4.text=free+" free" - binding.memoryLayout.seekbar2.progress=(used.substring(0,used.indexOf(" ")).toDouble() / total.substring(0,total.indexOf(" ")).toDouble() *100).toInt() + binding.memoryLayout.ram3.text=outused+" used" + binding.memoryLayout.ram4.text=outfree+" free" + binding.memoryLayout.seekbar2.progress=(outused.substring(0,outused.indexOf(" ")).toDouble() / outtotal.substring(0,outtotal.indexOf(" ")).toDouble() *100).toInt() //fileSystem binding.memoryLayout.storText1.textTitle.text=getString(R.string.filesystem)