新增首页storage,battery

This commit is contained in:
yuqian 2026-01-22 15:10:47 +08:00
parent fee044b500
commit 076b2d7086
6 changed files with 135 additions and 29 deletions

View File

@ -135,4 +135,13 @@ object SetNumberOrWordUtils {
this < 1000*1000*1000 -> "%.1f MB".format(this/(1000.0*1000)) this < 1000*1000*1000 -> "%.1f MB".format(this/(1000.0*1000))
else -> "%.1f GB".format(this/(1000.0*1000*1000)) else -> "%.1f GB".format(this/(1000.0*1000*1000))
} }
fun formatBytes(bytes: Long): String {
return when {
bytes < 1024 -> "$bytes B"
bytes < 1024 * 1024 -> String.format(java.util.Locale.US, "%.1f KB", bytes / 1024.0)
bytes < 1024 * 1024 * 1024 -> String.format(java.util.Locale.US, "%.1f MB", bytes / (1024.0 * 1024))
else -> String.format(java.util.Locale.US, "%.1f GB", bytes / (1024.0 * 1024 * 1024))
}
}
} }

View File

@ -2,6 +2,7 @@ package com.xyzshell.myphoneinfo.dashboard
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
@ -9,8 +10,14 @@ import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import com.xyzshell.andinfo.libs.BatteryDetails import com.xyzshell.andinfo.libs.BatteryDetails
import com.xyzshell.andinfo.libs.BuildInfo import com.xyzshell.andinfo.libs.BuildInfo
import com.xyzshell.andinfo.libs.MemInfo
import com.xyzshell.andinfo.libs.MemoryInfo
import com.xyzshell.andinfo.libs.NetworkInfo
import com.xyzshell.andinfo.libs.StorageInfo
import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.R
import com.xyzshell.myphoneinfo.base.BaseFragment import com.xyzshell.myphoneinfo.base.BaseFragment
import com.xyzshell.myphoneinfo.custom.RefreshManager.stop
import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.formatBytes
import com.xyzshell.myphoneinfo.databinding.FragmentDashboardBinding import com.xyzshell.myphoneinfo.databinding.FragmentDashboardBinding
import com.xyzshell.myphoneinfo.dialog.DialogAppInstall import com.xyzshell.myphoneinfo.dialog.DialogAppInstall
import com.xyzshell.myphoneinfo.dialog.DialogBattery import com.xyzshell.myphoneinfo.dialog.DialogBattery
@ -40,6 +47,7 @@ class DashboardFragment : BaseFragment<FragmentDashboardBinding>() {
private val mainViewModel: MainViewModel by activityViewModels() private val mainViewModel: MainViewModel by activityViewModels()
private lateinit var buildDialogInfo: BuildInfo private lateinit var buildDialogInfo: BuildInfo
private lateinit var batteryDialogInfo: BatteryDetails private lateinit var batteryDialogInfo: BatteryDetails
private lateinit var memInfo: MemoryInfo
companion object { companion object {
@ -108,11 +116,48 @@ class DashboardFragment : BaseFragment<FragmentDashboardBinding>() {
else->binding.layoutCenter.iconBattery.setImageResource(R.mipmap.property_1full) else->binding.layoutCenter.iconBattery.setImageResource(R.mipmap.property_1full)
} }
binding.layoutCenter.seekbar.progress=it!!.percentage binding.layoutCenter.seekbar.progress=it!!.percentage
binding.layoutCenter.seekbar.setOnTouchListener { _, _ -> true }
binding.layoutCenter.percent.text=it.percentage.toString()+"%" binding.layoutCenter.percent.text=it.percentage.toString()+"%"
binding.layoutCenter.batteryContent.text="${it.temperature}°C" binding.layoutCenter.batteryContent.text="${it.temperature}°C"
} }
} }
mainViewModel.storageInfo.observe(viewLifecycleOwner) {storagesInfo ->
storagesInfo?.let {
val breakdown = storagesInfo.getInternalStorageBreakdown()
val stoUsed = formatBytes(breakdown.usedSpace)
val stoFree = formatBytes(breakdown.freeSpace)
val stoTotal = formatBytes(breakdown.totalSpace)
binding.layoutCenter.percent1.text=String.format("%.1f%%", breakdown.usedPercentage)
binding.layoutCenter.seekbar1.progress=breakdown.usedPercentage.toInt()
binding.layoutCenter.seekbar1.setOnTouchListener { _, _ -> true }
binding.layoutCenter.storageContent.text="Free${stoFree}, Total${stoTotal}"
}
}
mainViewModel.memInfo.observe(viewLifecycleOwner) {memsInfo ->
if (memsInfo != null) {
memInfo=memsInfo.getMemoryInfo()
}
}
mainViewModel.networkStatus.observe(viewLifecycleOwner) {networkStatus ->
Log.d("NetworkFragment", "setObservers: $networkStatus")
when (networkStatus) {
NetworkInfo.NetworkType.WIFI -> {
binding.layoutCenter.network1.text = getString(R.string.wifi)
}
NetworkInfo.NetworkType.MOBILE -> {
binding.layoutCenter.network1.text = getString(R.string.mobile)
}
else -> {
}
}
}
} }
private fun initCpu() { private fun initCpu() {
binding.layoutCpu.run { binding.layoutCpu.run {
@ -167,7 +212,7 @@ class DashboardFragment : BaseFragment<FragmentDashboardBinding>() {
dialogMemory?.show(parentFragmentManager, "") dialogMemory?.show(parentFragmentManager, "")
} }
relayoutStorage.setOnClickListener { relayoutStorage.setOnClickListener {
dialogStorage = dialogStorage ?: DialogStorage() dialogStorage = dialogStorage ?: DialogStorage(memInfo)
dialogStorage?.show(parentFragmentManager, "") dialogStorage?.show(parentFragmentManager, "")
} }
} }

View File

@ -25,6 +25,7 @@ import com.xyzshell.myphoneinfo.R
import com.xyzshell.myphoneinfo.custom.RefreshManager.load import com.xyzshell.myphoneinfo.custom.RefreshManager.load
import com.xyzshell.myphoneinfo.custom.RefreshManager.stop import com.xyzshell.myphoneinfo.custom.RefreshManager.stop
import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.convertToApproximateAspectRatio import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.convertToApproximateAspectRatio
import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.formatBytes
import com.xyzshell.myphoneinfo.databinding.FragmentHardWareBinding import com.xyzshell.myphoneinfo.databinding.FragmentHardWareBinding
import com.xyzshell.myphoneinfo.dialog.DialogBlueTooth import com.xyzshell.myphoneinfo.dialog.DialogBlueTooth
import com.xyzshell.myphoneinfo.dialog.DialogDiskPart import com.xyzshell.myphoneinfo.dialog.DialogDiskPart
@ -174,6 +175,7 @@ class HardWareFragment : Fragment() {
(memUsed.substringBefore(" ").toDouble() / memTotal (memUsed.substringBefore(" ").toDouble() / memTotal
.substringBefore(" ") .substringBefore(" ")
.toDouble() * 100).toInt() .toDouble() * 100).toInt()
binding.memoryLayout.seekbar.setOnTouchListener { _, _ -> true }
//zarm //zarm
binding.memoryLayout.memText3.textTitle.text = getString(R.string.zram) binding.memoryLayout.memText3.textTitle.text = getString(R.string.zram)
@ -183,6 +185,7 @@ class HardWareFragment : Fragment() {
binding.memoryLayout.seekbar2.progress = binding.memoryLayout.seekbar2.progress =
(zramTotal.substringBefore(" ").toDouble() / zramTotal.substringBefore(" ") (zramTotal.substringBefore(" ").toDouble() / zramTotal.substringBefore(" ")
.toDouble() * 100).toInt() .toDouble() * 100).toInt()
binding.memoryLayout.seekbar2.setOnTouchListener { _, _ -> true }
} }
} }
@ -192,9 +195,9 @@ class HardWareFragment : Fragment() {
mainViewModel.storageInfo.observe(viewLifecycleOwner){storageInfo -> mainViewModel.storageInfo.observe(viewLifecycleOwner){storageInfo ->
storageInfo?.let { storageInfo?.let {
val breakdown = storageInfo.getInternalStorageBreakdown() val breakdown = storageInfo.getInternalStorageBreakdown()
val stoUsed = storageInfo.formatBytes(breakdown.usedSpace) val stoUsed = formatBytes(breakdown.usedSpace)
val stoFree = storageInfo.formatBytes(breakdown.freeSpace) val stoFree = formatBytes(breakdown.freeSpace)
val stoTotal = storageInfo.formatBytes(breakdown.totalSpace) val stoTotal = formatBytes(breakdown.totalSpace)
//appsAndData //appsAndData
val appsAndData = storageInfo.getFormattedAppsAndDataSize() val appsAndData = storageInfo.getFormattedAppsAndDataSize()
val system = storageInfo.getFormattedSystemSize() val system = storageInfo.getFormattedSystemSize()
@ -211,11 +214,12 @@ class HardWareFragment : Fragment() {
binding.memoryLayout.seekbarr2.progress = binding.memoryLayout.seekbarr2.progress =
// (breakdown.appsAndDataSize.toDouble() / breakdown.totalSpace.toDouble() * 100).toInt() // (breakdown.appsAndDataSize.toDouble() / breakdown.totalSpace.toDouble() * 100).toInt()
50 50
binding.memoryLayout.seekbarr2.setOnTouchListener { _, _ -> true }
//system //system
binding.memoryLayout.seekbarr1.progress = binding.memoryLayout.seekbarr1.progress =
// ((50+storageInfo.systemSize).toDouble() / breakdown.totalSpace.toDouble() * 100).toInt() // ((50+storageInfo.systemSize).toDouble() / breakdown.totalSpace.toDouble() * 100).toInt()
70 70
binding.memoryLayout.seekbarr1.setOnTouchListener { _, _ -> true }
//internalStorage //internalStorage
val interUsed = storageInfo.getInternalStorageBreakdown().usedSpace val interUsed = storageInfo.getInternalStorageBreakdown().usedSpace
val interFree = storageInfo.getInternalStorageBreakdown().freeSpace val interFree = storageInfo.getInternalStorageBreakdown().freeSpace
@ -226,13 +230,14 @@ class HardWareFragment : Fragment() {
binding.memoryLayout.interText1.textContent.text = binding.memoryLayout.interText1.textContent.text =
storageInfo.internalStorageFileSystemType.toString() storageInfo.internalStorageFileSystemType.toString()
binding.memoryLayout.interText2.textTitle.text = getString(R.string.block_size) binding.memoryLayout.interText2.textTitle.text = getString(R.string.block_size)
binding.memoryLayout.interText2.textContent.text = storageInfo.formatBytes(interTotal) binding.memoryLayout.interText2.textContent.text = formatBytes(interTotal)
binding.memoryLayout.interText3.textTitle.text = "/data" binding.memoryLayout.interText3.textTitle.text = "/data"
binding.memoryLayout.interText3.textContent.text = storageInfo.formatBytes(storageInfo.dataDirectoryTotalSpace) binding.memoryLayout.interText3.textContent.text = formatBytes(storageInfo.dataDirectoryTotalSpace)
binding.memoryLayout.stor3.text = "${storageInfo.formatBytes(interUsed)} used" binding.memoryLayout.stor3.text = "${formatBytes(interUsed)} used"
binding.memoryLayout.stor4.text = "${storageInfo.formatBytes(interFree)} free" binding.memoryLayout.stor4.text = "${formatBytes(interFree)} free"
binding.memoryLayout.seekbar5.progress = binding.memoryLayout.seekbar5.progress =
(interUsed.toDouble() / interTotal.toDouble() * 100).toInt() (interUsed.toDouble() / interTotal.toDouble() * 100).toInt()
binding.memoryLayout.seekbar5.setOnTouchListener { _, _ -> true }
storageInfo.abOtaPartitions?.forEach { text -> storageInfo.abOtaPartitions?.forEach { text ->
Log.d("TTTTTTTT","disk part:${text}") Log.d("TTTTTTTT","disk part:${text}")

View File

@ -2,17 +2,54 @@ package com.xyzshell.myphoneinfo.dialog
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.lifecycleScope
import com.xyzshell.andinfo.libs.MemInfo
import com.xyzshell.andinfo.libs.MemoryInfo
import com.xyzshell.andinfo.libs.StorageInfo
import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.R
import com.xyzshell.myphoneinfo.base.BaseDialogFragment import com.xyzshell.myphoneinfo.base.BaseDialogFragment
import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.formatBytes
import com.xyzshell.myphoneinfo.databinding.DialogStorageBinding import com.xyzshell.myphoneinfo.databinding.DialogStorageBinding
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class DialogStorage :BaseDialogFragment<DialogStorageBinding>(DialogStorageBinding::inflate){ class DialogStorage(val memory: MemoryInfo) :BaseDialogFragment<DialogStorageBinding>(DialogStorageBinding::inflate){
override fun getTitle(): String = resources.getString(R.string.storage) override fun getTitle(): String = resources.getString(R.string.storage)
override fun getIconRes(): Int? =8 override fun getIconRes(): Int? =8
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
delay(50) // 短暂延迟确保UI完成布局
withContext(Dispatchers.Main) {
memory.let {
val memUsed = formatBytes(it.usedRam)
val memFree = formatBytes(it.availableRam)
val memTotal = formatBytes(it.totalRam)
val zramTotal = formatBytes(it.zramTotal)
val zramUsed = formatBytes(it.zramUsed)
val zramFree = formatBytes(it.zramTotal - it.zramUsed)
binding.tvRamSize.setValue(memTotal)
binding.memUsed.text = "$memUsed used"
binding.memFree.text = "$memFree free"
binding.seekbar3.progress =
(memUsed.substringBefore(" ").toDouble() / memTotal
.substringBefore(" ")
.toDouble() * 100).toInt()
binding.seekbar3.setOnTouchListener { _, _ -> true }
binding.seekbar5.setOnTouchListener { _, _ -> true }
binding.zramUsed.text = "$zramUsed used"
binding.zramFree.text = "$zramFree free"
binding.seekbar5.progress =
(zramTotal.substringBefore(" ").toDouble() / zramTotal.substringBefore(" ")
.toDouble() * 100).toInt()
}
}}
} }

View File

@ -20,7 +20,7 @@
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<ImageView <ImageView
android:id="@+id/icon_battery" android:id="@+id/icon_battery"
android:layout_width="wrap_content" android:layout_width="40dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:src="@mipmap/property_1full" /> android:src="@mipmap/property_1full" />
@ -72,7 +72,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/apps" android:text="@string/apps"
android:textSize="10sp" android:textSize="11sp"
android:layout_marginStart="@dimen/each_item_padding_horizontal" android:layout_marginStart="@dimen/each_item_padding_horizontal"
/> />
</LinearLayout> </LinearLayout>
@ -93,8 +93,8 @@
app:layout_constraintTop_toBottomOf="@id/relayout_battery"> app:layout_constraintTop_toBottomOf="@id/relayout_battery">
<ImageView <ImageView
android:id="@+id/icon_storage" android:id="@+id/icon_storage"
android:layout_width="33dp" android:layout_width="40dp"
android:layout_height="33dp" android:layout_height="wrap_content"
android:layout_marginStart="5dp" android:layout_marginStart="5dp"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:src="@mipmap/stroke_bg" /> android:src="@mipmap/stroke_bg" />
@ -141,13 +141,13 @@
android:textSize="12sp" /> android:textSize="12sp" />
</LinearLayout> </LinearLayout>
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:layout_marginStart="@dimen/each_item_padding_horizontal"
android:id="@+id/storage_content" android:id="@+id/storage_content"
style="@style/LeftContent" style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/apps" android:text="@string/apps"
tools:ignore="RelativeOverlap" /> android:textSize="11sp"
android:layout_marginStart="@dimen/each_item_padding_horizontal" />
</LinearLayout> </LinearLayout>
@ -190,17 +190,29 @@
android:layout_height="33dp" android:layout_height="33dp"
android:layout_below="@id/title_network" android:layout_below="@id/title_network"
android:src="@mipmap/wifi_ic" /> android:src="@mipmap/wifi_ic" />
<LinearLayout
<com.google.android.material.textview.MaterialTextView android:layout_width="match_parent"
android:id="@+id/network_content"
style="@style/LeftContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignTop="@id/icon_network" android:layout_alignTop="@id/icon_network"
android:layout_marginStart="@dimen/dashboard_icon_content_interval" android:layout_marginStart="@dimen/dashboard_icon_content_interval"
android:layout_toEndOf="@id/icon_network" android:layout_toEndOf="@id/icon_network"
android:text="@string/apps" android:orientation="vertical">
tools:ignore="RelativeOverlap" /> <com.google.android.material.textview.MaterialTextView
android:id="@+id/network1"
style="@style/LeftContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="@string/apps" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/network2"
style="@style/LeftContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="@string/apps" />
</LinearLayout>
</RelativeLayout> </RelativeLayout>

View File

@ -45,9 +45,9 @@
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
style="@style/LeftContent" style="@style/LeftContent"
android:id="@+id/memUsed"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="28.01 GB used"
android:textSize="14sp" /> android:textSize="14sp" />
<View <View
@ -56,11 +56,10 @@
android:layout_weight="1" /> android:layout_weight="1" />
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/stor1" android:id="@+id/memFree"
style="@style/LeftContent" style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="128 GB total"
android:textSize="14sp" /> android:textSize="14sp" />
</LinearLayout> </LinearLayout>
@ -123,9 +122,9 @@
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
style="@style/LeftContent" style="@style/LeftContent"
android:id="@+id/zramUsed"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="2.22 GB used"
android:textSize="14sp" /> android:textSize="14sp" />
<View <View
@ -134,11 +133,10 @@
android:layout_weight="1" /> android:layout_weight="1" />
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/stor3" android:id="@+id/zramFree"
style="@style/LeftContent" style="@style/LeftContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="3.75 GB free"
android:textSize="14sp" /> android:textSize="14sp" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>