新增device,operation,identifier

This commit is contained in:
yuqian 2026-01-07 12:00:14 +08:00
parent 88ff91c8c7
commit 9d8b9d5bd7
4 changed files with 208 additions and 173 deletions

View File

@ -44,7 +44,11 @@ class HardWareFragment : Fragment() {
refreshBluetoothInfo()
} else {
// 显示权限被拒绝的UI
Toast.makeText(requireContext(), getString(R.string.permissions_required), Toast.LENGTH_SHORT).show()
Toast.makeText(
requireContext(),
getString(R.string.permissions_required),
Toast.LENGTH_SHORT
).show()
}
}
@ -81,8 +85,6 @@ class HardWareFragment : Fragment() {
}
private fun initText() {
val device = AndInfo.instance.device//设备信息
setProcessorInfo()
setGpuInfo()
setDisplayInfo()
@ -134,38 +136,34 @@ class HardWareFragment : Fragment() {
* */
private fun setMemoryInfo() {
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 breakdown = storageInfo.getInternalStorageBreakdown()
//内部存储器
val interused = storageInfo.formatBytes(breakdown.usedSpace)
val interfree = storageInfo.formatBytes(breakdown.freeSpace)
val intertotal = storageInfo.formatBytes(breakdown.totalSpace)
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
)
//总存储信息
val outused =Formatter.formatFileSize(AndInfo.instance.context, storageInfo.internalStorageUsedSpace)
val outfree = Formatter.formatFileSize(AndInfo.instance.context, storageInfo.internalStorageAvailableSpace)
val outtotal = Formatter.formatFileSize(AndInfo.instance.context, storageInfo.internalStorageTotalSpace)
//内存todo
binding.memoryLayout.memText1.textTitle.text = getString(R.string.ram_size)
binding.memoryLayout.memText1.textContent.text = total
binding.memoryLayout.ram1.text = used + " used"
binding.memoryLayout.ram2.text = free + " free"
binding.memoryLayout.seekbar.progress =
(used.substringBefore(" ").toDouble() / total.substringBefore(" ").toDouble() * 100).toInt()
// binding.memoryLayout.memText1.textContent.text = total
// binding.memoryLayout.ram1.text = used + " used"
// binding.memoryLayout.ram2.text = free + " free"
// binding.memoryLayout.seekbar.progress =
// (used.substringBefore(" ").toDouble() / total.substringBefore(" ")
// .toDouble() * 100).toInt()
//appsAndData
val appsAndData = storageInfo.getFormattedAppsAndDataSize()
val system = storageInfo.getFormattedSystemSize()
val other= storageInfo.getFormattedFreeSpace()+storageInfo.getFormattedCacheSize()
//zarm
//storage
binding.memoryLayout.memText3.textTitle.text = getString(R.string.zram)
binding.memoryLayout.memText3.textContent.text = Formatter.formatFileSize(
AndInfo.instance.context,
@ -174,31 +172,35 @@ class HardWareFragment : Fragment() {
binding.memoryLayout.ram3.text = outused + " used"
binding.memoryLayout.ram4.text = outfree + " free"
binding.memoryLayout.seekbar2.progress =
(outused.substringBefore(" ").toDouble() / outtotal.substringBefore(" ").toDouble() * 100).toInt()
(outused.substringBefore(" ").toDouble() / outtotal.substringBefore(" ")
.toDouble() * 100).toInt()
//fileSystem
binding.memoryLayout.storText1.textTitle.text = getString(R.string.filesystem)
binding.memoryLayout.storText1.textContent.text = total
binding.memoryLayout.stor1.text = used + " used"
binding.memoryLayout.stor2.text = free + " free"
binding.memoryLayout.radius1.text = used
binding.memoryLayout.radius2.text = used
binding.memoryLayout.radius3.text = free
//storage
binding.memoryLayout.storText1.textTitle.text = getString(R.string.size)
binding.memoryLayout.storText1.textContent.text = outtotal
binding.memoryLayout.stor1.text = outused + " used"
binding.memoryLayout.stor2.text = outtotal + " total"
binding.memoryLayout.radius1.text = appsAndData
binding.memoryLayout.radius2.text = system
binding.memoryLayout.radius3.text = other
binding.memoryLayout.seekbar3.progress =
(used.substringBefore(" ").toDouble() / total.substringBefore(" ").toDouble() * 100).toInt()
(outused.substringBefore(" ").toDouble() / outtotal.substringBefore(" ")
.toDouble() * 100).toInt()
//internalStorage
binding.memoryLayout.interText1.textTitle.text = getString(R.string.filesystem)
binding.memoryLayout.interText1.textContent.text =
storageInfo.internalStorageEncryptionType.toString()
binding.memoryLayout.interText2.textTitle.text = getString(R.string.block_size)
binding.memoryLayout.interText2.textContent.text = total
binding.memoryLayout.interText2.textContent.text = intertotal
binding.memoryLayout.interText3.textTitle.text = "/data"
binding.memoryLayout.interText3.textContent.text = total
binding.memoryLayout.stor3.text = used + " used"
binding.memoryLayout.stor4.text = free + " free"
binding.memoryLayout.interText3.textContent.text = intertotal
binding.memoryLayout.stor3.text = interused + " used"
binding.memoryLayout.stor4.text = interfree + " free"
binding.memoryLayout.seekbar2.progress =
(used.substringBefore(" ").toDouble() / total.substringBefore(" ").toDouble() * 100).toInt()
(interused.substringBefore(" ").toDouble() / intertotal.substringBefore(" ")
.toDouble() * 100).toInt()
}
/**
@ -222,12 +224,13 @@ class HardWareFragment : Fragment() {
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)
val screenSize = "${String.format("%.2f", display.getScreenSize()?.diagonalInches)}/ ${String.format("%.1f", display.getScreenSize()?.diagonalMm)} mm"
binding.disText4.textContent.text = screenSize
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)
@ -334,30 +337,39 @@ class HardWareFragment : Fragment() {
bluetoothInfo.getBluetoothFeatures().let { features ->
binding.bluetoothLayout.blueCheck1.content.text = getString(R.string.bluetooth_le)
binding.bluetoothLayout.blueCheck1.image.isSelected = features.bluetoothLe
binding.bluetoothLayout.blueCheck2.content.text=getString(R.string.multiple_advertisement)
binding.bluetoothLayout.blueCheck2.content.text =
getString(R.string.multiple_advertisement)
binding.bluetoothLayout.blueCheck2.image.isSelected = features.multipleAdvertisement
binding.bluetoothLayout.blueCheck3.content.text=getString(R.string.offloaded_filtering)
binding.bluetoothLayout.blueCheck3.content.text =
getString(R.string.offloaded_filtering)
binding.bluetoothLayout.blueCheck3.image.isSelected = features.offloadedFiltering
binding.bluetoothLayout.blueCheck4.content.text=getString(R.string.offloaded_scan_batching)
binding.bluetoothLayout.blueCheck4.content.text =
getString(R.string.offloaded_scan_batching)
binding.bluetoothLayout.blueCheck4.image.isSelected = features.offloadedScanBatching
binding.bluetoothLayout.blueCheck01.content.text=getString(R.string.le_periodic_advertising)
binding.bluetoothLayout.blueCheck01.content.text =
getString(R.string.le_periodic_advertising)
binding.bluetoothLayout.blueCheck01.image.isSelected = features.lePeriodicAdvertising
binding.bluetoothLayout.blueCheck02.content.text=getString(R.string.le_extended_advertising)
binding.bluetoothLayout.blueCheck02.content.text =
getString(R.string.le_extended_advertising)
binding.bluetoothLayout.blueCheck02.image.isSelected = features.leExtendedAdvertising
binding.bluetoothLayout.blueCheck03.content.text=getString(R.string.le_2m_phy_high_speed)
binding.bluetoothLayout.blueCheck03.content.text =
getString(R.string.le_2m_phy_high_speed)
binding.bluetoothLayout.blueCheck03.image.isSelected = features.leCodedPhy
binding.bluetoothLayout.blueCheck04.content.text=getString(R.string.le_2m_phy_low_power)
binding.bluetoothLayout.blueCheck04.content.text =
getString(R.string.le_2m_phy_low_power)
binding.bluetoothLayout.blueCheck04.image.isSelected = features.le2MbPhy
binding.bluetoothLayout.blueCheck05.content.text = getString(R.string.le_audio_support)
binding.bluetoothLayout.blueCheck05.image.isSelected = features.leAudioSupport
}
}
// 请求蓝牙权限的方法
private fun requestBluetoothPermissions() {
val permissions = AndInfo.instance.bluetooth.requiredPermissions
requestPermissionLauncher.launch(permissions)
}
// 检查权限的方法
private fun checkBluetoothPermissions(): Boolean {
val bluetoothInfo = AndInfo.instance.bluetooth
@ -366,6 +378,7 @@ class HardWareFragment : Fragment() {
PackageManager.PERMISSION_GRANTED
}
}
/**
* 检查并显示蓝牙信息
*/
@ -412,6 +425,7 @@ class HardWareFragment : Fragment() {
openBluetoothSettings()
}
}
/**
* 显示已配对设备弹窗
*/
@ -420,6 +434,7 @@ class HardWareFragment : Fragment() {
println("showBluetoothDialog" + AndInfo.instance.bluetooth.bondedDevices.size)
dialogBlueTooth?.show(childFragmentManager, "BlueTooth1")
}
/**
* 显示扫描到附近设备弹窗
*/
@ -441,8 +456,6 @@ class HardWareFragment : Fragment() {
}
/**
* 刷新蓝牙信息
*/
@ -471,6 +484,7 @@ class HardWareFragment : Fragment() {
}
}
}
/**
* 权限检查结果回调
*/
@ -484,11 +498,17 @@ class HardWareFragment : Fragment() {
// 权限已授予刷新UI
checkAndDisplayBluetoothInfo()
} else {
Toast.makeText(requireContext(), "Bluetooth permission is required.", Toast.LENGTH_SHORT).show()
Toast.makeText(
requireContext(),
"Bluetooth permission is required.",
Toast.LENGTH_SHORT
).show()
}
}
companion object {
private const val REQUEST_ENABLE_BT = 1001
@JvmStatic
fun newInstance() =
HardWareFragment().apply {

View File

@ -26,57 +26,9 @@ private lateinit var binding: FragmentSystemShowBinding
}
private fun initView() {
binding.phoneName.text=AndInfo.instance.device.brand
binding.text0.textTitle.text=getString(R.string.model)
binding.text0.textContent.text=AndInfo.instance.device.model
binding.text1.textTitle.text=getString(R.string.product)
binding.text1.textContent.text=AndInfo.instance.device.productName
binding.text2.textTitle.text=getString(R.string.device)
binding.text2.textContent.text=AndInfo.instance.device.device
binding.text3.textTitle.text=getString(R.string.board)
binding.text3.textContent.text=AndInfo.instance.device.boardName
binding.text4.textTitle.text=getString(R.string.manufacturer)
binding.text4.textContent.text=AndInfo.instance.device.manufacturer
binding.text5.textTitle.text=getString(R.string.baseband)
binding.text6.textTitle.text=getString(R.string.google_play_services_version)
//操作系统
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.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)
binding.textOp10.textTitle.text=getString(R.string.architecture)
binding.textOp11.textTitle.text=getString(R.string.instruction_sets)
binding.textOp12.textTitle.text=getString(R.string.treble)
binding.textOp13.textTitle.text=getString(R.string.root_access)
binding.textOp14.textTitle.text=getString(R.string.google_play_services)
binding.textOp15.textTitle.text=getString(R.string.toybox)
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.textOp18.textTitle.text=getString(R.string.language)
binding.textOp19.textTitle.text=getString(R.string.usb_debugging)
//内核
binding.textOp20.textTitle.text=getString(R.string.kernel)
binding.textOp20.textContent.text=AndInfo.instance.build.kernelCompleteVersion
setDeviceInfo()
setOperatingSystem()
setIdentifier()
binding.textclear1.textTitle.text=getString(R.string.vendor)
binding.textclear2.textTitle.text=getString(R.string.version)
@ -88,7 +40,85 @@ private lateinit var binding: FragmentSystemShowBinding
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)
}
/**
* 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
}
/**
* 操作系统
* */
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.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.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
}
/**
* 设置设备信息
* */
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
// binding.text5.textTitle.text=getString(R.string.baseband)
}
companion object {

View File

@ -59,6 +59,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textSize="16sp"
android:layout_marginStart="20dp"
tools:ignore="RelativeOverlap" />
</LinearLayout>
@ -77,9 +78,9 @@
<include
android:id="@+id/text4"
layout="@layout/common_text_style" />
<include
android:id="@+id/text5"
layout="@layout/common_text_style" />
<!-- <include-->
<!-- android:id="@+id/text5"-->
<!-- layout="@layout/common_text_style" />-->
</LinearLayout>
@ -146,9 +147,9 @@
<include
android:id="@+id/textOp2"
layout="@layout/common_text_style" />
<include
android:id="@+id/textOp3"
layout="@layout/common_text_style" />
<!-- <include-->
<!-- android:id="@+id/textOp3"-->
<!-- layout="@layout/common_text_style" />-->
<include
android:id="@+id/textOp4"
layout="@layout/common_text_style" />
@ -236,20 +237,16 @@
android:id="@+id/idDev1"
style="@style/LeftContent"
android:layout_marginStart="20dp"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="@string/apps"
android:textColor="@color/right_color"
tools:ignore="RelativeOverlap" />
<View
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="1dp"/>
<ImageView
android:layout_width="11dp"
android:layout_height="wrap_content"
android:src="@mipmap/copy"
android:layout_gravity="center_vertical"
/>
</LinearLayout>
<LinearLayout
@ -268,24 +265,20 @@
android:id="@+id/idDev2"
style="@style/LeftContent"
android:layout_marginStart="20dp"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="@string/apps"
android:textColor="@color/right_color"
tools:ignore="RelativeOverlap" />
<View
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="1dp"/>
<ImageView
android:layout_width="11dp"
android:layout_height="wrap_content"
android:src="@mipmap/copy"
android:layout_gravity="center_vertical"
/>
</LinearLayout>
<include
android:id="@+id/text6"
android:id="@+id/textgoogle"
layout="@layout/common_text_style" />
</LinearLayout>

View File

@ -62,7 +62,6 @@
style="@style/LeftContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2.22 GB used"
tools:ignore="RelativeOverlap" />
<View
@ -75,7 +74,6 @@
style="@style/LeftContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3.75 GB free"
tools:ignore="RelativeOverlap" />
</LinearLayout>
</LinearLayout>
@ -87,7 +85,7 @@
android:maxHeight="10dp"
android:minHeight="10dp"
android:padding="0dp"
android:progress="50"
android:progress="0"
android:progressDrawable="@drawable/progress_bg"
android:thumb="@drawable/progress_oval"
android:thumbOffset="0dp" />
@ -116,7 +114,6 @@
style="@style/LeftContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2.22 GB used"
tools:ignore="RelativeOverlap" />
<View
@ -129,7 +126,6 @@
style="@style/LeftContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3.75 GB free"
tools:ignore="RelativeOverlap" />
</LinearLayout>
</LinearLayout>
@ -141,7 +137,7 @@
android:maxHeight="10dp"
android:minHeight="10dp"
android:padding="0dp"
android:progress="50"
android:progress="0"
android:progressDrawable="@drawable/progress_bg"
android:thumb="@drawable/progress_oval"
android:thumbOffset="0dp" />
@ -204,7 +200,6 @@
style="@style/LeftContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2.22 GB used"
tools:ignore="RelativeOverlap" />
<View
@ -217,7 +212,6 @@
style="@style/LeftContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3.75 GB free"
tools:ignore="RelativeOverlap" />
</LinearLayout>
@ -231,7 +225,7 @@
android:maxHeight="10dp"
android:minHeight="10dp"
android:padding="0dp"
android:progress="50"
android:progress="0"
android:progressDrawable="@drawable/progress_bg"
android:thumb="@drawable/progress_oval"
android:thumbOffset="0dp" />
@ -397,7 +391,6 @@
style="@style/LeftContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2.22 GB used"
tools:ignore="RelativeOverlap" />
<View
@ -410,7 +403,6 @@
style="@style/LeftContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3.75 GB free"
tools:ignore="RelativeOverlap" />
</LinearLayout>
@ -421,7 +413,7 @@
android:maxHeight="10dp"
android:minHeight="10dp"
android:padding="0dp"
android:progress="50"
android:progress="0"
android:progressDrawable="@drawable/progress_bg"
android:thumb="@drawable/progress_oval"
android:thumbOffset="0dp" />