修复camera、hardware、system卡顿的问题
This commit is contained in:
parent
596daf5fcc
commit
689b92bfd0
@ -36,6 +36,11 @@ class AppsFragment : Fragment(),AppListAdapter.OnShowDialogListener {
|
|||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
viewModel.loadApps()
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater, container: ViewGroup?,
|
inflater: LayoutInflater, container: ViewGroup?,
|
||||||
savedInstanceState: Bundle?
|
savedInstanceState: Bundle?
|
||||||
|
|||||||
@ -7,16 +7,22 @@ import androidx.fragment.app.Fragment
|
|||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import androidx.fragment.app.activityViewModels
|
||||||
import com.xyzshell.andinfo.AndInfo
|
import com.xyzshell.andinfo.AndInfo
|
||||||
import com.xyzshell.myphoneinfo.R
|
import com.xyzshell.myphoneinfo.R
|
||||||
|
import com.xyzshell.myphoneinfo.custom.RefreshManager.load
|
||||||
|
import com.xyzshell.myphoneinfo.custom.RefreshManager.stop
|
||||||
import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.setDecimal0
|
import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.setDecimal0
|
||||||
import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.setDecimal1
|
import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.setDecimal1
|
||||||
import com.xyzshell.myphoneinfo.databinding.FragmentCameraBinding
|
import com.xyzshell.myphoneinfo.databinding.FragmentCameraBinding
|
||||||
import com.xyzshell.myphoneinfo.databinding.ItemCameraTypeBinding
|
import com.xyzshell.myphoneinfo.databinding.ItemCameraTypeBinding
|
||||||
import com.xyzshell.myphoneinfo.dialog.DialogCameraMore
|
import com.xyzshell.myphoneinfo.dialog.DialogCameraMore
|
||||||
|
import com.xyzshell.myphoneinfo.main.MainViewModel
|
||||||
|
import kotlin.getValue
|
||||||
|
|
||||||
class CameraFragment : Fragment() {
|
class CameraFragment : Fragment() {
|
||||||
private lateinit var binding:FragmentCameraBinding
|
private lateinit var binding:FragmentCameraBinding
|
||||||
|
private val mainViewModel: MainViewModel by activityViewModels()
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@ -25,6 +31,11 @@ class CameraFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
mainViewModel.refreshCameraInfo()
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater, container: ViewGroup?,
|
inflater: LayoutInflater, container: ViewGroup?,
|
||||||
savedInstanceState: Bundle?
|
savedInstanceState: Bundle?
|
||||||
@ -32,129 +43,133 @@ class CameraFragment : Fragment() {
|
|||||||
// Inflate the layout for this fragment
|
// Inflate the layout for this fragment
|
||||||
binding = FragmentCameraBinding.inflate(inflater, container, false)
|
binding = FragmentCameraBinding.inflate(inflater, container, false)
|
||||||
initText()
|
initText()
|
||||||
|
binding.swipeRefresh.setOnRefreshListener {
|
||||||
// binding.frontMore.setOnClickListener {
|
load(binding.swipeRefresh)
|
||||||
// dialogCamera1= dialogCamera1?:DialogCameraMore(1)
|
mainViewModel.refreshCameraInfo()
|
||||||
// dialogCamera1?.show(childFragmentManager, "DialogCameraMore1")
|
}
|
||||||
// }
|
|
||||||
return binding.root
|
return binding.root
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initText() {
|
private fun initText() {
|
||||||
val cameraInfo = AndInfo.instance.camera
|
// binding.open2.text=cameraInfo.get
|
||||||
val cameraIds = cameraInfo.cameraIds
|
|
||||||
if(!cameraIds.isEmpty()){
|
|
||||||
cameraIds.forEachIndexed { index, cameraId ->
|
|
||||||
val characteristics = cameraInfo.getCameraCharacteristics(cameraId)
|
|
||||||
characteristics?.let {
|
|
||||||
|
|
||||||
val cameraCardView = LayoutInflater.from(context).inflate(
|
|
||||||
R.layout.item_camera_type,
|
|
||||||
binding.llCamera,
|
|
||||||
false
|
|
||||||
)
|
|
||||||
val itemBinding = ItemCameraTypeBinding.bind(cameraCardView)
|
|
||||||
|
|
||||||
// 2. 设置标题(区分前后摄像头)
|
|
||||||
val facing = cameraInfo.getCameraFacing(it).toString()
|
|
||||||
val cameraName = when (facing) {
|
|
||||||
"FRONT" -> getString(R.string.front_camera_1) + "${index + 1}"
|
|
||||||
"BACK" -> getString(R.string.rear_camera_1)+"${index + 1}"
|
|
||||||
|
|
||||||
else -> "External Camera ${index + 1}"
|
|
||||||
}
|
|
||||||
itemBinding.titleCon.text = cameraName
|
|
||||||
|
|
||||||
//取第一个相机的视频帧率
|
|
||||||
if(index==0){
|
|
||||||
cameraInfo.getMaxFrameRate(it).let { maxFrameRate->
|
|
||||||
binding.video.textTitle.text=getString(R.string.max_frequency)
|
|
||||||
binding.video.textContent.text=maxFrameRate.toString()+"HZ"
|
|
||||||
}
|
|
||||||
cameraInfo.supportsHighSpeedVideo(it).let { hasHighSpeedVideo ->
|
|
||||||
binding.videoCheck1.image.isSelected=hasHighSpeedVideo
|
|
||||||
}
|
|
||||||
cameraInfo.hasVideoStabilization(it).let { hasVideoStabilization ->
|
|
||||||
binding.videoCheck2.image.isSelected=hasVideoStabilization
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 4. 设置详细信息(使用 include 的文本)
|
|
||||||
|
|
||||||
itemBinding.camText1.textTitle.text=getString(R.string.resolution)
|
|
||||||
itemBinding.camText2.textTitle.text=getString(R.string.sensor_size)
|
|
||||||
itemBinding.camText3.textTitle.text=getString(R.string.pixel_size)
|
|
||||||
itemBinding.camText4.textTitle.text=getString(R.string._35mm_equivalent_focal_length)
|
|
||||||
itemBinding.camText5.textTitle.text=getString(R.string.shutter_speed)
|
|
||||||
itemBinding.camText6.textTitle.text=getString(R.string.iso_sensitivity_range)
|
|
||||||
itemBinding.rearCheck2.content.text=getString(R.string.flash)
|
|
||||||
itemBinding.rearCheck1.content.text=getString(R.string.optical_image_stabilization)
|
|
||||||
|
|
||||||
// 设置百万像素
|
|
||||||
|
|
||||||
cameraInfo.getMegaPixels(it)?.let { size ->
|
|
||||||
itemBinding.conText1.text = "${setDecimal1(size)} MP"
|
|
||||||
}
|
|
||||||
//光圈值
|
|
||||||
cameraInfo.getAvailableApertures(it)?.let { apertures ->
|
|
||||||
if (apertures.isNotEmpty()) {
|
|
||||||
itemBinding.conText2.text = "f/${apertures[0]}" // 取第一个光圈值
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//像素阵列大小
|
|
||||||
cameraInfo.getPixelArraySize(it)?.let { size ->
|
|
||||||
itemBinding.camText1.textContent.text = size
|
|
||||||
|
|
||||||
}
|
|
||||||
// 传感器物理尺寸
|
|
||||||
cameraInfo.getSensorPhysicalSize(it)?.let { size ->
|
|
||||||
itemBinding.camText2.textContent.text=size
|
|
||||||
}
|
|
||||||
// 传感器物理尺寸
|
|
||||||
cameraInfo.getPixelSize(it)?.let { size ->
|
|
||||||
itemBinding.camText3.textContent.text="${setDecimal0(size)}μm"
|
|
||||||
}
|
|
||||||
|
|
||||||
// 35mm等效焦距
|
|
||||||
cameraInfo.getFocal35mmEquivalent(it)?.let { size ->
|
|
||||||
itemBinding.camText4.textContent.text="${size.toInt()}mm"
|
|
||||||
}
|
|
||||||
// 快门速度
|
|
||||||
cameraInfo.getShutterSpeedRange(it)?.let { size ->
|
|
||||||
itemBinding.camText5.textContent.text=size
|
|
||||||
}
|
|
||||||
|
|
||||||
// ISO感光范围
|
|
||||||
cameraInfo.getIsoRange(it)?.let { size ->
|
|
||||||
itemBinding.camText6.textContent.text=size.lower.toString() + " - " + size.upper.toString()
|
|
||||||
}
|
|
||||||
// 光学防抖
|
|
||||||
cameraInfo.hasOpticalStabilization(it).let { hasOpticalStabilization ->
|
|
||||||
itemBinding.rearCheck1.image.isSelected=hasOpticalStabilization
|
|
||||||
}
|
|
||||||
// 闪光灯
|
|
||||||
cameraInfo.hasFlashUnit(it)?.let { hasFlash ->
|
|
||||||
itemBinding.rearCheck2.image.isSelected=hasFlash
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 6. 设置"更多"按钮点击事件
|
|
||||||
itemBinding.rearMore.setOnClickListener {
|
|
||||||
var dialogCamera0: DialogCameraMore? = null
|
|
||||||
dialogCamera0= null ?:DialogCameraMore(cameraName,cameraId)
|
|
||||||
dialogCamera0.show(childFragmentManager, "DialogCameraMore")
|
|
||||||
}
|
|
||||||
|
|
||||||
// 7. 添加到父容器
|
|
||||||
binding.llCamera.addView(cameraCardView)
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// binding.open2.text=cameraInfo.get
|
|
||||||
binding.videoCheck1.content.text=getString(R.string.hight_speed_video)
|
binding.videoCheck1.content.text=getString(R.string.hight_speed_video)
|
||||||
binding.videoCheck2.content.text=getString(R.string.video_stabilization)
|
binding.videoCheck2.content.text=getString(R.string.video_stabilization)
|
||||||
|
mainViewModel.cameraInfo.observe(viewLifecycleOwner, ){
|
||||||
|
cameraInfo ->
|
||||||
|
stop(binding.swipeRefresh)
|
||||||
|
cameraInfo?.let {
|
||||||
|
val cameraIds = cameraInfo.cameraIds
|
||||||
|
if(!cameraIds.isEmpty()){
|
||||||
|
cameraIds.forEachIndexed { index, cameraId ->
|
||||||
|
val characteristics = cameraInfo.getCameraCharacteristics(cameraId)
|
||||||
|
characteristics?.let {
|
||||||
|
|
||||||
|
val cameraCardView = LayoutInflater.from(context).inflate(
|
||||||
|
R.layout.item_camera_type,
|
||||||
|
binding.llCamera,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
val itemBinding = ItemCameraTypeBinding.bind(cameraCardView)
|
||||||
|
|
||||||
|
// 2. 设置标题(区分前后摄像头)
|
||||||
|
val facing = cameraInfo.getCameraFacing(it).toString()
|
||||||
|
val cameraName = when (facing) {
|
||||||
|
"FRONT" -> getString(R.string.front_camera_1) + "${index + 1}"
|
||||||
|
"BACK" -> getString(R.string.rear_camera_1)+"${index + 1}"
|
||||||
|
|
||||||
|
else -> "External Camera ${index + 1}"
|
||||||
|
}
|
||||||
|
itemBinding.titleCon.text = cameraName
|
||||||
|
|
||||||
|
//取第一个相机的视频帧率
|
||||||
|
if(index==0){
|
||||||
|
cameraInfo.getMaxFrameRate(it).let { maxFrameRate->
|
||||||
|
binding.video.textTitle.text=getString(R.string.max_frequency)
|
||||||
|
binding.video.textContent.text=maxFrameRate.toString()+"HZ"
|
||||||
|
}
|
||||||
|
cameraInfo.supportsHighSpeedVideo(it).let { hasHighSpeedVideo ->
|
||||||
|
binding.videoCheck1.image.isSelected=hasHighSpeedVideo
|
||||||
|
}
|
||||||
|
cameraInfo.hasVideoStabilization(it).let { hasVideoStabilization ->
|
||||||
|
binding.videoCheck2.image.isSelected=hasVideoStabilization
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 4. 设置详细信息(使用 include 的文本)
|
||||||
|
|
||||||
|
itemBinding.camText1.textTitle.text=getString(R.string.resolution)
|
||||||
|
itemBinding.camText2.textTitle.text=getString(R.string.sensor_size)
|
||||||
|
itemBinding.camText3.textTitle.text=getString(R.string.pixel_size)
|
||||||
|
itemBinding.camText4.textTitle.text=getString(R.string._35mm_equivalent_focal_length)
|
||||||
|
itemBinding.camText5.textTitle.text=getString(R.string.shutter_speed)
|
||||||
|
itemBinding.camText6.textTitle.text=getString(R.string.iso_sensitivity_range)
|
||||||
|
itemBinding.rearCheck2.content.text=getString(R.string.flash)
|
||||||
|
itemBinding.rearCheck1.content.text=getString(R.string.optical_image_stabilization)
|
||||||
|
|
||||||
|
// 设置百万像素
|
||||||
|
|
||||||
|
cameraInfo.getMegaPixels(it)?.let { size ->
|
||||||
|
itemBinding.conText1.text = "${setDecimal1(size)} MP"
|
||||||
|
}
|
||||||
|
//光圈值
|
||||||
|
cameraInfo.getAvailableApertures(it)?.let { apertures ->
|
||||||
|
if (apertures.isNotEmpty()) {
|
||||||
|
itemBinding.conText2.text = "f/${apertures[0]}" // 取第一个光圈值
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//像素阵列大小
|
||||||
|
cameraInfo.getPixelArraySize(it)?.let { size ->
|
||||||
|
itemBinding.camText1.textContent.text = size
|
||||||
|
|
||||||
|
}
|
||||||
|
// 传感器物理尺寸
|
||||||
|
cameraInfo.getSensorPhysicalSize(it)?.let { size ->
|
||||||
|
itemBinding.camText2.textContent.text=size
|
||||||
|
}
|
||||||
|
// 传感器物理尺寸
|
||||||
|
cameraInfo.getPixelSize(it)?.let { size ->
|
||||||
|
itemBinding.camText3.textContent.text="${setDecimal0(size)}μm"
|
||||||
|
}
|
||||||
|
|
||||||
|
// 35mm等效焦距
|
||||||
|
cameraInfo.getFocal35mmEquivalent(it)?.let { size ->
|
||||||
|
itemBinding.camText4.textContent.text="${size.toInt()}mm"
|
||||||
|
}
|
||||||
|
// 快门速度
|
||||||
|
cameraInfo.getShutterSpeedRange(it)?.let { size ->
|
||||||
|
itemBinding.camText5.textContent.text=size
|
||||||
|
}
|
||||||
|
|
||||||
|
// ISO感光范围
|
||||||
|
cameraInfo.getIsoRange(it)?.let { size ->
|
||||||
|
itemBinding.camText6.textContent.text=size.lower.toString() + " - " + size.upper.toString()
|
||||||
|
}
|
||||||
|
// 光学防抖
|
||||||
|
cameraInfo.hasOpticalStabilization(it).let { hasOpticalStabilization ->
|
||||||
|
itemBinding.rearCheck1.image.isSelected=hasOpticalStabilization
|
||||||
|
}
|
||||||
|
// 闪光灯
|
||||||
|
cameraInfo.hasFlashUnit(it)?.let { hasFlash ->
|
||||||
|
itemBinding.rearCheck2.image.isSelected=hasFlash
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 6. 设置"更多"按钮点击事件
|
||||||
|
itemBinding.rearMore.setOnClickListener {
|
||||||
|
var dialogCamera0: DialogCameraMore? = null
|
||||||
|
dialogCamera0= null ?:DialogCameraMore(cameraName,cameraId)
|
||||||
|
dialogCamera0.show(childFragmentManager, "DialogCameraMore")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 7. 添加到父容器
|
||||||
|
binding.llCamera.addView(cameraCardView)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,6 +22,8 @@ import com.xyzshell.andinfo.AndInfo
|
|||||||
import com.xyzshell.andinfo.libs.CpuInfo
|
import com.xyzshell.andinfo.libs.CpuInfo
|
||||||
import com.xyzshell.andinfo.libs.MemInfo
|
import com.xyzshell.andinfo.libs.MemInfo
|
||||||
import com.xyzshell.myphoneinfo.R
|
import com.xyzshell.myphoneinfo.R
|
||||||
|
import com.xyzshell.myphoneinfo.custom.RefreshManager.load
|
||||||
|
import com.xyzshell.myphoneinfo.custom.RefreshManager.stop
|
||||||
import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.convertToApproximateAspectRatio
|
import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.convertToApproximateAspectRatio
|
||||||
import com.xyzshell.myphoneinfo.databinding.FragmentHardWareBinding
|
import com.xyzshell.myphoneinfo.databinding.FragmentHardWareBinding
|
||||||
import com.xyzshell.myphoneinfo.dialog.DialogBlueTooth
|
import com.xyzshell.myphoneinfo.dialog.DialogBlueTooth
|
||||||
@ -66,7 +68,7 @@ class HardWareFragment : Fragment() {
|
|||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
checkAndDisplayBluetoothInfo()
|
checkAndDisplayBluetoothInfo()
|
||||||
mainViewModel.refreshHardwareInfo(requireContext())
|
binding.root.postDelayed({mainViewModel.refreshHardwareInfo(requireContext())},300)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -88,6 +90,10 @@ class HardWareFragment : Fragment() {
|
|||||||
dialogDiskPart = dialogDiskPart ?: DialogDiskPart()
|
dialogDiskPart = dialogDiskPart ?: DialogDiskPart()
|
||||||
dialogDiskPart?.show(childFragmentManager, "DiskPart")
|
dialogDiskPart?.show(childFragmentManager, "DiskPart")
|
||||||
}
|
}
|
||||||
|
binding.swipeRefresh.setOnRefreshListener {
|
||||||
|
load(binding.swipeRefresh)
|
||||||
|
mainViewModel.refreshHardwareInfo(requireContext())
|
||||||
|
}
|
||||||
|
|
||||||
return binding.root
|
return binding.root
|
||||||
}
|
}
|
||||||
@ -363,6 +369,7 @@ class HardWareFragment : Fragment() {
|
|||||||
//频率
|
//频率
|
||||||
binding.text9.textTitle.text = getString(R.string.frequencies)
|
binding.text9.textTitle.text = getString(R.string.frequencies)
|
||||||
mainViewModel.cpuInfo.observe(viewLifecycleOwner) { cpu ->
|
mainViewModel.cpuInfo.observe(viewLifecycleOwner) { cpu ->
|
||||||
|
stop(binding.swipeRefresh)
|
||||||
cpu?.let {
|
cpu?.let {
|
||||||
binding.text0.textContent.text = cpu.getProcessorName()
|
binding.text0.textContent.text = cpu.getProcessorName()
|
||||||
binding.text1.textContent.text = cpu.getVendor()
|
binding.text1.textContent.text = cpu.getVendor()
|
||||||
|
|||||||
@ -5,23 +5,37 @@ import androidx.fragment.app.Fragment
|
|||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import androidx.fragment.app.activityViewModels
|
||||||
import com.xyzshell.andinfo.AndInfo
|
import com.xyzshell.andinfo.AndInfo
|
||||||
import com.xyzshell.andinfo.libs.DRMInfo
|
import com.xyzshell.andinfo.libs.DRMInfo
|
||||||
import com.xyzshell.myphoneinfo.R
|
import com.xyzshell.myphoneinfo.R
|
||||||
|
import com.xyzshell.myphoneinfo.custom.RefreshManager.load
|
||||||
|
import com.xyzshell.myphoneinfo.custom.RefreshManager.stop
|
||||||
import com.xyzshell.myphoneinfo.databinding.FragmentSystemShowBinding
|
import com.xyzshell.myphoneinfo.databinding.FragmentSystemShowBinding
|
||||||
|
import com.xyzshell.myphoneinfo.main.MainViewModel
|
||||||
|
|
||||||
class SystemShowFragment : Fragment() {
|
class SystemShowFragment : Fragment() {
|
||||||
private lateinit var binding: FragmentSystemShowBinding
|
private lateinit var binding: FragmentSystemShowBinding
|
||||||
|
private val mainViewModel: MainViewModel by activityViewModels()
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
binding.root.postDelayed({mainViewModel.refreshSystemInfo()},300)
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater, container: ViewGroup?,
|
inflater: LayoutInflater, container: ViewGroup?,
|
||||||
savedInstanceState: Bundle?
|
savedInstanceState: Bundle?
|
||||||
): View? {
|
): View? {
|
||||||
binding= FragmentSystemShowBinding.inflate(inflater,container,false)
|
binding= FragmentSystemShowBinding.inflate(inflater,container,false)
|
||||||
|
binding.swipeRefresh.setOnRefreshListener {
|
||||||
|
load(binding.swipeRefresh)
|
||||||
|
mainViewModel.refreshSystemInfo()
|
||||||
|
}
|
||||||
initView()
|
initView()
|
||||||
return binding.root
|
return binding.root
|
||||||
}
|
}
|
||||||
@ -34,21 +48,19 @@ private lateinit var binding: FragmentSystemShowBinding
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun setDrm() {
|
private fun setDrm() {
|
||||||
val clearkeyDrmDetail = AndInfo.instance.drm.getDrmDetail(DRMInfo.CLEARKEY_UUID)
|
|
||||||
val widevineDrmDetail = AndInfo.instance.drm.getDrmDetail(DRMInfo.WIDEVINE_UUID)
|
|
||||||
binding.textclear1.textTitle.text=getString(R.string.vendor)
|
binding.textclear1.textTitle.text=getString(R.string.vendor)
|
||||||
binding.textclear2.textTitle.text=getString(R.string.version)
|
binding.textclear2.textTitle.text=getString(R.string.version)
|
||||||
clearkeyDrmDetail.let {
|
|
||||||
binding.textclear1.textContent.text=it?.vendor
|
|
||||||
binding.textclear2.textContent.text=it?.version
|
|
||||||
}
|
|
||||||
binding.textwide1.textTitle.text=getString(R.string.vendor)
|
binding.textwide1.textTitle.text=getString(R.string.vendor)
|
||||||
binding.textwide2.textTitle.text=getString(R.string.version)
|
binding.textwide2.textTitle.text=getString(R.string.version)
|
||||||
binding.textwide3.textTitle.text=getString(R.string.algorithm)
|
binding.textwide3.textTitle.text=getString(R.string.algorithm)
|
||||||
binding.textwide4.textTitle.text=getString(R.string.device_id)
|
binding.textwide4.textTitle.text=getString(R.string.device_id)
|
||||||
binding.textwide5.textTitle.text=getString(R.string.security_level)
|
binding.textwide5.textTitle.text=getString(R.string.security_level)
|
||||||
binding.textwide6.textTitle.text=getString(R.string.highest_hdcp_level)
|
binding.textwide6.textTitle.text=getString(R.string.highest_hdcp_level)
|
||||||
widevineDrmDetail.let {
|
mainViewModel.clearkeyDrmDetail.observe(viewLifecycleOwner) {
|
||||||
|
binding.textclear1.textContent.text=it?.vendor
|
||||||
|
binding.textclear2.textContent.text=it?.version
|
||||||
|
}
|
||||||
|
mainViewModel.widevineDrmDetail.observe(viewLifecycleOwner) {
|
||||||
binding.textwide1.textContent.text=it?.vendor
|
binding.textwide1.textContent.text=it?.vendor
|
||||||
binding.textwide2.textContent.text=it?.version
|
binding.textwide2.textContent.text=it?.version
|
||||||
binding.textwide3.textContent.text=it?.algorithms?.joinToString()
|
binding.textwide3.textContent.text=it?.algorithms?.joinToString()
|
||||||
@ -62,79 +74,94 @@ private lateinit var binding: FragmentSystemShowBinding
|
|||||||
* Identifier
|
* Identifier
|
||||||
* */
|
* */
|
||||||
private fun setIdentifier() {
|
private fun setIdentifier() {
|
||||||
val buildInfo = AndInfo.instance.build
|
mainViewModel.buildInfo.observe(viewLifecycleOwner){
|
||||||
binding.idDev1.text=buildInfo.googlePlayServicesVersionCode.toString()
|
buildInfo ->
|
||||||
binding.idDev2.text=buildInfo.deviceUniqueId
|
buildInfo?.let {
|
||||||
//google play services
|
binding.idDev1.text=buildInfo.googlePlayServicesVersionCode.toString()
|
||||||
binding.textgoogle.textTitle.text=getString(R.string.google_play_services_version)
|
binding.idDev2.text=buildInfo.deviceUniqueId
|
||||||
binding.textgoogle.textContent.text=buildInfo.googlePlayServicesVersion
|
//google play services
|
||||||
|
binding.textgoogle.textTitle.text=getString(R.string.google_play_services_version)
|
||||||
|
binding.textgoogle.textContent.text=buildInfo.googlePlayServicesVersion
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 操作系统
|
* 操作系统
|
||||||
* */
|
* */
|
||||||
private fun setOperatingSystem() {
|
private fun setOperatingSystem() {
|
||||||
val buildInfo = AndInfo.instance.build
|
|
||||||
binding.textOp1.textTitle.text=getString(R.string.android_version)
|
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.textTitle.text=getString(R.string.api)
|
||||||
binding.textOp2.textContent.text=buildInfo.versionSdkInt.toString()
|
|
||||||
// binding.textOp3.textTitle.text=getString(R.string.emui)
|
// binding.textOp3.textTitle.text=getString(R.string.emui)
|
||||||
|
|
||||||
binding.textOp4.textTitle.text=getString(R.string.security_patch)
|
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.textTitle.text=getString(R.string.version)
|
||||||
binding.textOp5.textContent.text=buildInfo.display
|
|
||||||
binding.textOp6.textTitle.text=getString(R.string.baseband)
|
binding.textOp6.textTitle.text=getString(R.string.baseband)
|
||||||
binding.textOp6.textContent.text=buildInfo.brand
|
|
||||||
binding.textOp7.textTitle.text=getString(R.string.fingerprint)
|
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.textTitle.text=getString(R.string.build_time)
|
||||||
binding.textOp8.textContent.text=buildInfo.buildDate.toString()
|
|
||||||
binding.textOp9.textTitle.text=getString(R.string.initial_release)
|
binding.textOp9.textTitle.text=getString(R.string.initial_release)
|
||||||
// todo
|
// todo
|
||||||
binding.textOp10.textTitle.text=getString(R.string.architecture)
|
|
||||||
binding.textOp10.textContent.text=buildInfo.kernelArchitecture
|
|
||||||
binding.textOp11.textTitle.text=getString(R.string.instruction_sets)
|
binding.textOp11.textTitle.text=getString(R.string.instruction_sets)
|
||||||
// todo
|
// todo
|
||||||
|
binding.textOp10.textTitle.text=getString(R.string.architecture)
|
||||||
binding.textOp12.textTitle.text=getString(R.string.treble)
|
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.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.textTitle.text=getString(R.string.google_play_services)
|
||||||
binding.textOp14.textContent.text=buildInfo.googlePlayServicesVersion
|
|
||||||
binding.textOp15.textTitle.text=getString(R.string.toybox)
|
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.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.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.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.textTitle.text=getString(R.string.usb_debugging)
|
||||||
|
binding.textOp20.textTitle.text=getString(R.string.kernel)
|
||||||
|
mainViewModel.buildInfo.observe(viewLifecycleOwner) { buildInfo ->
|
||||||
|
buildInfo?.let {
|
||||||
|
binding.textOp1.textContent.text=buildInfo.versionRelease
|
||||||
|
binding.textOp2.textContent.text=buildInfo.versionSdkInt.toString()
|
||||||
|
binding.textOp4.textContent.text=buildInfo.securityPatch
|
||||||
|
binding.textOp5.textContent.text=buildInfo.display
|
||||||
|
binding.textOp6.textContent.text=buildInfo.brand
|
||||||
|
binding.textOp7.textContent.text=buildInfo.fingerprint
|
||||||
|
binding.textOp8.textContent.text=buildInfo.buildDate.toString()
|
||||||
|
binding.textOp10.textContent.text=buildInfo.kernelArchitecture
|
||||||
|
binding.textOp12.textContent.text=if (buildInfo.isTrebleEnabled) "Supported" else "Not supported"
|
||||||
|
binding.textOp13.textContent.text=if (AndInfo.instance.build.isRooted) "Yes" else "No"
|
||||||
|
binding.textOp14.textContent.text=buildInfo.googlePlayServicesVersion
|
||||||
|
binding.textOp15.textContent.text=buildInfo.toyboxVersion
|
||||||
|
binding.textOp16.textContent.text=buildInfo.jvmName + " " + buildInfo.jvmVersion
|
||||||
|
binding.textOp17.textContent.text=buildInfo.openSslVersion + " " + buildInfo.boringSslVersion
|
||||||
|
binding.textOp18.textContent.text=buildInfo.systemLanguage
|
||||||
binding.textOp19.textContent.text=if (buildInfo.isUsbDebuggingEnabled) "Enabled" else "Disabled"
|
binding.textOp19.textContent.text=if (buildInfo.isUsbDebuggingEnabled) "Enabled" else "Disabled"
|
||||||
//内核
|
//内核
|
||||||
binding.textOp20.textTitle.text=getString(R.string.kernel)
|
binding.textOp20.textContent.text=buildInfo.kernelCompleteVersion
|
||||||
binding.textOp20.textContent.text=AndInfo.instance.build.kernelCompleteVersion
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置设备信息
|
* 设置设备信息
|
||||||
* */
|
* */
|
||||||
private fun setDeviceInfo() {
|
private fun setDeviceInfo() {
|
||||||
val deviceInfo = AndInfo.instance.device
|
|
||||||
binding.phoneName.text=deviceInfo.brand
|
|
||||||
binding.text0.textTitle.text=getString(R.string.model)
|
binding.text0.textTitle.text=getString(R.string.model)
|
||||||
binding.text0.textContent.text=deviceInfo.model
|
|
||||||
binding.text1.textTitle.text=getString(R.string.product)
|
binding.text1.textTitle.text=getString(R.string.product)
|
||||||
binding.text1.textContent.text=deviceInfo.productName
|
|
||||||
binding.text2.textTitle.text=getString(R.string.device)
|
binding.text2.textTitle.text=getString(R.string.device)
|
||||||
binding.text2.textContent.text=deviceInfo.device
|
|
||||||
binding.text3.textTitle.text=getString(R.string.board)
|
binding.text3.textTitle.text=getString(R.string.board)
|
||||||
binding.text3.textContent.text=deviceInfo.boardName
|
|
||||||
binding.text4.textTitle.text=getString(R.string.manufacturer)
|
binding.text4.textTitle.text=getString(R.string.manufacturer)
|
||||||
binding.text4.textContent.text=deviceInfo.manufacturer
|
|
||||||
|
mainViewModel.deviceInfo.observe(viewLifecycleOwner) {
|
||||||
|
deviceInfo ->
|
||||||
|
stop(binding.swipeRefresh)
|
||||||
|
deviceInfo?.let {
|
||||||
|
binding.phoneName.text=deviceInfo.brand
|
||||||
|
binding.text0.textContent.text=deviceInfo.model
|
||||||
|
binding.text1.textContent.text=deviceInfo.productName
|
||||||
|
binding.text2.textContent.text=deviceInfo.device
|
||||||
|
binding.text3.textContent.text=deviceInfo.boardName
|
||||||
|
binding.text4.textContent.text=deviceInfo.manufacturer
|
||||||
// binding.text5.textTitle.text=getString(R.string.baseband)
|
// binding.text5.textTitle.text=getString(R.string.baseband)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
@ -10,7 +10,11 @@ import androidx.lifecycle.viewModelScope
|
|||||||
import com.xyzshell.andinfo.AndInfo
|
import com.xyzshell.andinfo.AndInfo
|
||||||
import com.xyzshell.andinfo.libs.AppDetails
|
import com.xyzshell.andinfo.libs.AppDetails
|
||||||
import com.xyzshell.andinfo.libs.BluetoothInfo
|
import com.xyzshell.andinfo.libs.BluetoothInfo
|
||||||
|
import com.xyzshell.andinfo.libs.BuildInfo
|
||||||
|
import com.xyzshell.andinfo.libs.CameraInfo
|
||||||
import com.xyzshell.andinfo.libs.CpuInfo
|
import com.xyzshell.andinfo.libs.CpuInfo
|
||||||
|
import com.xyzshell.andinfo.libs.DRMInfo
|
||||||
|
import com.xyzshell.andinfo.libs.DeviceInfo
|
||||||
import com.xyzshell.andinfo.libs.DisplayInfo
|
import com.xyzshell.andinfo.libs.DisplayInfo
|
||||||
import com.xyzshell.andinfo.libs.GpuInfo
|
import com.xyzshell.andinfo.libs.GpuInfo
|
||||||
import com.xyzshell.andinfo.libs.InputInfo
|
import com.xyzshell.andinfo.libs.InputInfo
|
||||||
@ -20,6 +24,7 @@ import com.xyzshell.andinfo.libs.NetworkInfo
|
|||||||
import com.xyzshell.andinfo.libs.StorageInfo
|
import com.xyzshell.andinfo.libs.StorageInfo
|
||||||
import com.xyzshell.myphoneinfo.custom.PermissionChecker
|
import com.xyzshell.myphoneinfo.custom.PermissionChecker
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.async
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
class MainViewModel: ViewModel() {
|
class MainViewModel: ViewModel() {
|
||||||
@ -44,6 +49,17 @@ class MainViewModel: ViewModel() {
|
|||||||
private val _inputInfo= MutableLiveData<InputInfo?>()
|
private val _inputInfo= MutableLiveData<InputInfo?>()
|
||||||
val input: LiveData<InputInfo?> = _inputInfo
|
val input: LiveData<InputInfo?> = _inputInfo
|
||||||
|
|
||||||
|
// 系统相关数据
|
||||||
|
private val _deviceInfo = MutableLiveData<DeviceInfo?>()
|
||||||
|
val deviceInfo: LiveData<DeviceInfo?> = _deviceInfo
|
||||||
|
private val _buildInfo = MutableLiveData<BuildInfo?>()
|
||||||
|
val buildInfo: LiveData<BuildInfo?> = _buildInfo
|
||||||
|
private val _clearkeyDrmDetail = MutableLiveData<DRMInfo.DRMDetail?>()
|
||||||
|
val clearkeyDrmDetail: LiveData<DRMInfo.DRMDetail?> = _clearkeyDrmDetail
|
||||||
|
|
||||||
|
private val _widevineDrmDetail = MutableLiveData<DRMInfo.DRMDetail?>()
|
||||||
|
val widevineDrmDetail: LiveData<DRMInfo.DRMDetail?> = _widevineDrmDetail
|
||||||
|
|
||||||
//网络相关
|
//网络相关
|
||||||
private val networkInfo= AndInfo.instance.network
|
private val networkInfo= AndInfo.instance.network
|
||||||
private val _networkStatus= MutableLiveData<NetworkInfo.NetworkType?>()
|
private val _networkStatus= MutableLiveData<NetworkInfo.NetworkType?>()
|
||||||
@ -60,13 +76,17 @@ class MainViewModel: ViewModel() {
|
|||||||
|
|
||||||
//应用列表
|
//应用列表
|
||||||
private val _installedApps= MutableLiveData<List<AppDetails>>()
|
private val _installedApps= MutableLiveData<List<AppDetails>>()
|
||||||
|
|
||||||
|
|
||||||
val installedApps: LiveData<List<AppDetails>> = _installedApps
|
val installedApps: LiveData<List<AppDetails>> = _installedApps
|
||||||
|
|
||||||
init{
|
//相机相关
|
||||||
|
private val _cameraInfo = MutableLiveData<CameraInfo?>()
|
||||||
|
val cameraInfo: LiveData<CameraInfo?> = _cameraInfo
|
||||||
|
|
||||||
|
init{
|
||||||
loadApps()
|
loadApps()
|
||||||
}
|
refreshSystemInfo()
|
||||||
|
refreshCameraInfo()
|
||||||
|
}
|
||||||
|
|
||||||
fun refreshApps() {
|
fun refreshApps() {
|
||||||
loadApps()
|
loadApps()
|
||||||
@ -120,21 +140,6 @@ class MainViewModel: ViewModel() {
|
|||||||
_networkPermissionGranted.postValue(hasPermissions)
|
_networkPermissionGranted.postValue(hasPermissions)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取当前网络状态(快速检查)
|
|
||||||
*/
|
|
||||||
fun getCurrentNetworkType(context: Context): NetworkInfo.NetworkType? {
|
|
||||||
return try {
|
|
||||||
if (PermissionChecker.getMissingPermissions(context).isEmpty()) {
|
|
||||||
networkInfo.getCurrentNetworkType()
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
} catch (e: Exception) {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fun loadApps() {
|
fun loadApps() {
|
||||||
viewModelScope.launch(Dispatchers.IO){
|
viewModelScope.launch(Dispatchers.IO){
|
||||||
val apps= AndInfo.instance.app.getInstalledApps()
|
val apps= AndInfo.instance.app.getInstalledApps()
|
||||||
@ -149,20 +154,20 @@ class MainViewModel: ViewModel() {
|
|||||||
fun refreshHardwareInfo(context: Context){
|
fun refreshHardwareInfo(context: Context){
|
||||||
viewModelScope.launch(Dispatchers.IO){
|
viewModelScope.launch(Dispatchers.IO){
|
||||||
try {
|
try {
|
||||||
val cpu= AndInfo.instance.cpu
|
val cpu= async{AndInfo.instance.cpu}
|
||||||
_cpuInfo.postValue(cpu)
|
_cpuInfo.postValue(cpu.await())
|
||||||
val gpu= AndInfo.instance.gpu
|
val gpu= async{AndInfo.instance.gpu}
|
||||||
_gpuInfo.postValue(gpu)
|
_gpuInfo.postValue(gpu.await())
|
||||||
val display = AndInfo.instance.display
|
val display = async{AndInfo.instance.display}
|
||||||
_displayInfo.postValue(display)
|
_displayInfo.postValue(display.await())
|
||||||
val storage = AndInfo.instance.storage
|
val storage = async{AndInfo.instance.storage}
|
||||||
_storageInfo.postValue(storage)
|
_storageInfo.postValue(storage.await())
|
||||||
val mem = AndInfo.instance.memory
|
val mem = async{AndInfo.instance.memory}
|
||||||
_memInfo.postValue(mem)
|
_memInfo.postValue(mem.await())
|
||||||
// 检查权限
|
// 检查权限
|
||||||
val bluetoothInfo = AndInfo.instance.bluetooth
|
val bluetoothInfo = AndInfo.instance.bluetooth
|
||||||
val inputInfo= AndInfo.instance.input
|
val inputInfo= async{AndInfo.instance.input}
|
||||||
_inputInfo.postValue(inputInfo)
|
_inputInfo.postValue(inputInfo.await())
|
||||||
|
|
||||||
val hasPermissions= bluetoothInfo.requiredPermissions.all { permission ->
|
val hasPermissions= bluetoothInfo.requiredPermissions.all { permission ->
|
||||||
ActivityCompat.checkSelfPermission(context, permission) ==
|
ActivityCompat.checkSelfPermission(context, permission) ==
|
||||||
@ -179,4 +184,25 @@ class MainViewModel: ViewModel() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun refreshSystemInfo(){
|
||||||
|
viewModelScope.launch(Dispatchers.IO){
|
||||||
|
val device = AndInfo.instance.device
|
||||||
|
_deviceInfo.postValue(device)
|
||||||
|
val buildInfo = AndInfo.instance.build
|
||||||
|
_buildInfo.postValue(buildInfo)
|
||||||
|
val clearkeyDrmDetail = AndInfo.instance.drm.getDrmDetail(DRMInfo.CLEARKEY_UUID)
|
||||||
|
_clearkeyDrmDetail.postValue(clearkeyDrmDetail)
|
||||||
|
val widevineDrmDetail = AndInfo.instance.drm.getDrmDetail(DRMInfo.WIDEVINE_UUID)
|
||||||
|
_widevineDrmDetail.postValue(widevineDrmDetail)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun refreshCameraInfo(){
|
||||||
|
viewModelScope.launch(Dispatchers.IO){
|
||||||
|
val cameraInfo = AndInfo.instance.camera
|
||||||
|
_cameraInfo.postValue(cameraInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -3,6 +3,7 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/swipeRefresh"
|
||||||
android:background="@color/background_color"
|
android:background="@color/background_color"
|
||||||
tools:context=".dashboard.BatteryFragment">
|
tools:context=".dashboard.BatteryFragment">
|
||||||
<androidx.core.widget.NestedScrollView
|
<androidx.core.widget.NestedScrollView
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
android:id="@+id/swipeRefresh"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="@color/background_color"
|
android:background="@color/background_color"
|
||||||
tools:context=".dashboard.DashboardFragment">
|
tools:context=".dashboard.DashboardFragment">
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/swipeRefresh"
|
||||||
android:background="@color/background_color"
|
android:background="@color/background_color"
|
||||||
tools:context=".dashboard.DashboardFragment">
|
tools:context=".dashboard.DashboardFragment">
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user