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 5617d9c..ebd65c7 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 @@ -913,6 +913,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 new file mode 100644 index 0000000..a9015a4 --- /dev/null +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt @@ -0,0 +1,91 @@ +package com.xyzshell.myphoneinfo.custom + +import kotlin.math.abs + +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 { + "" + } + } + + /* + 将数字加1并转换为字符串 + */ + fun convertToStringNormal(string: String): String { + + 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/AnalysisActivity.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AnalysisActivity.kt index f4eb363..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,10 +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 @@ -30,23 +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=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/CameraFragment.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/CameraFragment.kt index fa97463..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,21 +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.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) @@ -60,22 +61,25 @@ 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]}" // 取第一个光圈值 + //取第一个相机的视频帧率 + 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) @@ -86,9 +90,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 +111,38 @@ 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") } @@ -123,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/dashboard/HardWareFragment.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt index 453c7c5..5efd83d 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt @@ -8,7 +8,9 @@ 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.custom.SetNumberOrWordUtils.convertToApproximateAspectRatio import com.xyzshell.myphoneinfo.databinding.FragmentHardWareBinding import com.xyzshell.myphoneinfo.dialog.DialogBlueTooth import com.xyzshell.myphoneinfo.dialog.DialogDiskPart @@ -63,83 +65,125 @@ 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.getAllArchitectures().joinToString() + //制程工艺 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() + //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.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 -> + gpu.getGpuInformation().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 - } } + 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" @@ -149,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) 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..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,16 +1,16 @@ 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) :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 @@ -19,6 +19,128 @@ class DialogCameraMore(private val name:String) :BaseDialogFragment + 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/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 a943ced..3ad8617 100644 --- a/myphoneinfo/src/main/res/layout/activity_analysis.xml +++ b/myphoneinfo/src/main/res/layout/activity_analysis.xml @@ -14,32 +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,107 +139,38 @@ 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" /> - - - - - - - - - - - - - - - - - - - + android:orientation="vertical"> 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/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/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_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 @@ diff --git a/myphoneinfo/src/main/res/layout/hard_bluetooth.xml b/myphoneinfo/src/main/res/layout/hard_bluetooth.xml index 2c3a6a1..33e97a7 100644 --- a/myphoneinfo/src/main/res/layout/hard_bluetooth.xml +++ b/myphoneinfo/src/main/res/layout/hard_bluetooth.xml @@ -53,7 +53,7 @@ android:layout_weight="1"/> @@ -84,7 +85,7 @@ - + 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 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" /> Toybox Java VM current + AE lock + WB lock + White balance modes + Capabilities + Exposure modes + Autofocus modes + Scene modes \ No newline at end of file