mirror of
https://github.com/awfixers-stuff/OwnDroid.git
synced 2026-03-23 11:05:59 +00:00
Hardware monitor
This commit is contained in:
@@ -77,6 +77,7 @@ import com.bintianqi.owndroid.dpm.DeviceOwner
|
|||||||
import com.bintianqi.owndroid.dpm.DisableAccountManagement
|
import com.bintianqi.owndroid.dpm.DisableAccountManagement
|
||||||
import com.bintianqi.owndroid.dpm.DisableKeyguardFeatures
|
import com.bintianqi.owndroid.dpm.DisableKeyguardFeatures
|
||||||
import com.bintianqi.owndroid.dpm.FRPPolicy
|
import com.bintianqi.owndroid.dpm.FRPPolicy
|
||||||
|
import com.bintianqi.owndroid.dpm.HardwareMonitor
|
||||||
import com.bintianqi.owndroid.dpm.InstallSystemUpdate
|
import com.bintianqi.owndroid.dpm.InstallSystemUpdate
|
||||||
import com.bintianqi.owndroid.dpm.IntentFilter
|
import com.bintianqi.owndroid.dpm.IntentFilter
|
||||||
import com.bintianqi.owndroid.dpm.Keyguard
|
import com.bintianqi.owndroid.dpm.Keyguard
|
||||||
@@ -222,6 +223,7 @@ fun Home(activity: FragmentActivity, vm: MyViewModel) {
|
|||||||
composable(route = "System") { SystemManage(navCtrl) }
|
composable(route = "System") { SystemManage(navCtrl) }
|
||||||
composable(route = "SystemOptions") { SystemOptions(navCtrl) }
|
composable(route = "SystemOptions") { SystemOptions(navCtrl) }
|
||||||
composable(route = "Keyguard") { Keyguard(navCtrl) }
|
composable(route = "Keyguard") { Keyguard(navCtrl) }
|
||||||
|
composable(route = "HardwareMonitor") { HardwareMonitor(navCtrl) }
|
||||||
composable(route = "ChangeTime") { ChangeTime(navCtrl) }
|
composable(route = "ChangeTime") { ChangeTime(navCtrl) }
|
||||||
composable(route = "ChangeTimeZone") { ChangeTimeZone(navCtrl) }
|
composable(route = "ChangeTimeZone") { ChangeTimeZone(navCtrl) }
|
||||||
composable(route = "PermissionPolicy") { PermissionPolicy(navCtrl) }
|
composable(route = "PermissionPolicy") { PermissionPolicy(navCtrl) }
|
||||||
|
|||||||
@@ -37,10 +37,12 @@ import android.content.Context
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build.VERSION
|
import android.os.Build.VERSION
|
||||||
|
import android.os.HardwarePropertiesManager
|
||||||
import android.os.UserManager
|
import android.os.UserManager
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
import androidx.compose.animation.AnimatedVisibility
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
import androidx.compose.animation.animateContentSize
|
import androidx.compose.animation.animateContentSize
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
@@ -78,6 +80,7 @@ import androidx.compose.material3.OutlinedTextField
|
|||||||
import androidx.compose.material3.SegmentedButton
|
import androidx.compose.material3.SegmentedButton
|
||||||
import androidx.compose.material3.SegmentedButtonDefaults
|
import androidx.compose.material3.SegmentedButtonDefaults
|
||||||
import androidx.compose.material3.SingleChoiceSegmentedButtonRow
|
import androidx.compose.material3.SingleChoiceSegmentedButtonRow
|
||||||
|
import androidx.compose.material3.Slider
|
||||||
import androidx.compose.material3.Switch
|
import androidx.compose.material3.Switch
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.material3.TextButton
|
import androidx.compose.material3.TextButton
|
||||||
@@ -87,9 +90,11 @@ import androidx.compose.material3.rememberTimePickerState
|
|||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.mutableFloatStateOf
|
||||||
import androidx.compose.runtime.mutableIntStateOf
|
import androidx.compose.runtime.mutableIntStateOf
|
||||||
import androidx.compose.runtime.mutableLongStateOf
|
import androidx.compose.runtime.mutableLongStateOf
|
||||||
import androidx.compose.runtime.mutableStateListOf
|
import androidx.compose.runtime.mutableStateListOf
|
||||||
|
import androidx.compose.runtime.mutableStateMapOf
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
@@ -128,6 +133,7 @@ import java.io.ByteArrayOutputStream
|
|||||||
import java.util.Date
|
import java.util.Date
|
||||||
import java.util.TimeZone
|
import java.util.TimeZone
|
||||||
import java.util.concurrent.Executors
|
import java.util.concurrent.Executors
|
||||||
|
import kotlin.math.roundToLong
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
@Composable
|
@Composable
|
||||||
@@ -146,6 +152,8 @@ fun SystemManage(navCtrl: NavHostController) {
|
|||||||
FunctionItem(R.string.options, icon = R.drawable.tune_fill0) { navCtrl.navigate("SystemOptions") }
|
FunctionItem(R.string.options, icon = R.drawable.tune_fill0) { navCtrl.navigate("SystemOptions") }
|
||||||
}
|
}
|
||||||
FunctionItem(R.string.keyguard, icon = R.drawable.screen_lock_portrait_fill0) { navCtrl.navigate("Keyguard") }
|
FunctionItem(R.string.keyguard, icon = R.drawable.screen_lock_portrait_fill0) { navCtrl.navigate("Keyguard") }
|
||||||
|
if(VERSION.SDK_INT >= 24 && deviceOwner && !dhizuku)
|
||||||
|
FunctionItem(R.string.hardware_monitor, icon = R.drawable.memory_fill0) { navCtrl.navigate("HardwareMonitor") }
|
||||||
if(VERSION.SDK_INT >= 24 && deviceOwner) {
|
if(VERSION.SDK_INT >= 24 && deviceOwner) {
|
||||||
FunctionItem(R.string.reboot, icon = R.drawable.restart_alt_fill0) { dialog = 1 }
|
FunctionItem(R.string.reboot, icon = R.drawable.restart_alt_fill0) { dialog = 1 }
|
||||||
}
|
}
|
||||||
@@ -338,7 +346,7 @@ fun Keyguard(navCtrl: NavHostController) {
|
|||||||
var flag by remember { mutableIntStateOf(0) }
|
var flag by remember { mutableIntStateOf(0) }
|
||||||
if(VERSION.SDK_INT >= 26 && profileOwner && dpm.isManagedProfile(receiver)) {
|
if(VERSION.SDK_INT >= 26 && profileOwner && dpm.isManagedProfile(receiver)) {
|
||||||
CheckBoxItem(
|
CheckBoxItem(
|
||||||
R.string.evict_credential_encryptoon_key,
|
R.string.evict_credential_encryption_key,
|
||||||
flag and FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY != 0
|
flag and FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY != 0
|
||||||
) { flag = flag xor FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY }
|
) { flag = flag xor FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY }
|
||||||
Spacer(Modifier.padding(vertical = 2.dp))
|
Spacer(Modifier.padding(vertical = 2.dp))
|
||||||
@@ -358,6 +366,87 @@ fun Keyguard(navCtrl: NavHostController) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
@RequiresApi(24)
|
||||||
|
@Composable
|
||||||
|
fun HardwareMonitor(navCtrl: NavHostController) {
|
||||||
|
val context = LocalContext.current
|
||||||
|
val hpm = context.getSystemService(HardwarePropertiesManager::class.java)
|
||||||
|
var refreshInterval by remember { mutableFloatStateOf(1F) }
|
||||||
|
val refreshIntervalMs = (refreshInterval * 1000).roundToLong()
|
||||||
|
val temperatures = remember { mutableStateMapOf<Int, List<Float>>() }
|
||||||
|
val tempTypeMap = mapOf(
|
||||||
|
HardwarePropertiesManager.DEVICE_TEMPERATURE_CPU to R.string.cpu_temp,
|
||||||
|
HardwarePropertiesManager.DEVICE_TEMPERATURE_GPU to R.string.gpu_temp,
|
||||||
|
HardwarePropertiesManager.DEVICE_TEMPERATURE_BATTERY to R.string.battery_temp,
|
||||||
|
HardwarePropertiesManager.DEVICE_TEMPERATURE_SKIN to R.string.skin_temp
|
||||||
|
)
|
||||||
|
val cpuUsages = remember { mutableStateListOf<Pair<Long, Long>>() }
|
||||||
|
val fanSpeeds = remember { mutableStateListOf<Float>() }
|
||||||
|
fun refresh() {
|
||||||
|
cpuUsages.clear()
|
||||||
|
cpuUsages.addAll(hpm.cpuUsages.map { it.active to it.total })
|
||||||
|
temperatures.clear()
|
||||||
|
tempTypeMap.forEach {
|
||||||
|
temperatures += it.key to hpm.getDeviceTemperatures(it.key, HardwarePropertiesManager.TEMPERATURE_CURRENT).toList()
|
||||||
|
}
|
||||||
|
fanSpeeds.clear()
|
||||||
|
fanSpeeds.addAll(hpm.fanSpeeds.toList())
|
||||||
|
}
|
||||||
|
LaunchedEffect(Unit) {
|
||||||
|
while(true) {
|
||||||
|
refresh()
|
||||||
|
delay(refreshIntervalMs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MyScaffold(R.string.hardware_monitor, 8.dp, navCtrl, false) {
|
||||||
|
Text(stringResource(R.string.refresh_interval), style = typography.titleLarge, modifier = Modifier.padding(vertical = 4.dp))
|
||||||
|
Slider(refreshInterval, { refreshInterval = it }, valueRange = 0.5F..2F, steps = 14)
|
||||||
|
Text("${refreshIntervalMs}ms")
|
||||||
|
Spacer(Modifier.padding(vertical = 10.dp))
|
||||||
|
temperatures.forEach { tempMapItem ->
|
||||||
|
Text(stringResource(tempTypeMap[tempMapItem.key]!!), style = typography.titleLarge, modifier = Modifier.padding(vertical = 4.dp))
|
||||||
|
if(tempMapItem.value.isEmpty()) {
|
||||||
|
Text(stringResource(R.string.unsupported))
|
||||||
|
} else {
|
||||||
|
tempMapItem.value.forEachIndexed { index, temp ->
|
||||||
|
Row(modifier = Modifier.padding(vertical = 4.dp)) {
|
||||||
|
Text(index.toString(), style = typography.titleMedium, modifier = Modifier.padding(start = 8.dp, end = 12.dp))
|
||||||
|
Text(if(temp == HardwarePropertiesManager.UNDEFINED_TEMPERATURE) stringResource(R.string.undefined) else temp.toString())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Spacer(Modifier.padding(vertical = 10.dp))
|
||||||
|
}
|
||||||
|
Text(stringResource(R.string.cpu_usages), style = typography.titleLarge, modifier = Modifier.padding(vertical = 4.dp))
|
||||||
|
if(cpuUsages.isEmpty()) {
|
||||||
|
Text(stringResource(R.string.unsupported))
|
||||||
|
} else {
|
||||||
|
cpuUsages.forEachIndexed { index, usage ->
|
||||||
|
Row(modifier = Modifier.padding(vertical = 4.dp)) {
|
||||||
|
Text(index.toString(), style = typography.titleMedium, modifier = Modifier.padding(start = 8.dp, end = 12.dp))
|
||||||
|
Column {
|
||||||
|
Text(stringResource(R.string.active) + ": " + usage.first + "ms")
|
||||||
|
Text(stringResource(R.string.total) + ": " + usage.second + "ms")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Spacer(Modifier.padding(vertical = 10.dp))
|
||||||
|
Text(stringResource(R.string.fan_speeds), style = typography.titleLarge, modifier = Modifier.padding(vertical = 4.dp))
|
||||||
|
if(fanSpeeds.isEmpty()) {
|
||||||
|
Text(stringResource(R.string.unsupported))
|
||||||
|
} else {
|
||||||
|
fanSpeeds.forEachIndexed { index, speed ->
|
||||||
|
Row(modifier = Modifier.padding(vertical = 4.dp)) {
|
||||||
|
Text(index.toString(), style = typography.titleMedium, modifier = Modifier.padding(start = 8.dp, end = 12.dp))
|
||||||
|
Text("$speed RPM")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
@Composable
|
@Composable
|
||||||
|
|||||||
@@ -136,7 +136,19 @@
|
|||||||
<string name="disable_usb_signal">Отключить USB-сигнал</string>
|
<string name="disable_usb_signal">Отключить USB-сигнал</string>
|
||||||
<string name="keyguard">Блокировка экрана</string>
|
<string name="keyguard">Блокировка экрана</string>
|
||||||
<string name="lock_now">Заблокировать экран сейчас</string>
|
<string name="lock_now">Заблокировать экран сейчас</string>
|
||||||
<string name="evict_credential_encryptoon_key">Удалить ключ шифрования учетных данных</string>
|
<string name="evict_credential_encryption_key">Удалить ключ шифрования учетных данных</string>
|
||||||
|
<!--TODO: the following 11 strings-->
|
||||||
|
<string name="hardware_monitor">Hardware monitor</string>
|
||||||
|
<string name="refresh_interval">Refresh interval</string>
|
||||||
|
<string name="cpu_temp">CPU temperatures</string>
|
||||||
|
<string name="gpu_temp">GPU temperatures</string>
|
||||||
|
<string name="battery_temp">Battery temperatures</string>
|
||||||
|
<string name="skin_temp">Skin temperatures</string>
|
||||||
|
<string name="undefined">Undefined</string>
|
||||||
|
<string name="cpu_usages">CPU usages</string>
|
||||||
|
<string name="active">Active</string>
|
||||||
|
<string name="total">Total</string>
|
||||||
|
<string name="fan_speeds">Fan speeds</string>
|
||||||
<string name="bug_report">Отчет об ошибке</string>
|
<string name="bug_report">Отчет об ошибке</string>
|
||||||
<string name="confirm_bug_report">Запросить отчет об ошибке?</string>
|
<string name="confirm_bug_report">Запросить отчет об ошибке?</string>
|
||||||
<string name="reboot">Перезагрузить</string>
|
<string name="reboot">Перезагрузить</string>
|
||||||
|
|||||||
@@ -137,7 +137,19 @@
|
|||||||
<string name="disable_usb_signal">USB sinyali</string> <!--TODO-->
|
<string name="disable_usb_signal">USB sinyali</string> <!--TODO-->
|
||||||
<string name="keyguard">Ekran kilidi</string>
|
<string name="keyguard">Ekran kilidi</string>
|
||||||
<string name="lock_now">Ekranı şimdi kilitle</string>
|
<string name="lock_now">Ekranı şimdi kilitle</string>
|
||||||
<string name="evict_credential_encryptoon_key">Kimlik doğrulama şifreleme anahtarını çıkar</string>
|
<string name="evict_credential_encryption_key">Kimlik doğrulama şifreleme anahtarını çıkar</string>
|
||||||
|
<!--TODO: the following 11 strings-->
|
||||||
|
<string name="hardware_monitor">Hardware monitor</string>
|
||||||
|
<string name="refresh_interval">Refresh interval</string>
|
||||||
|
<string name="cpu_temp">CPU temperatures</string>
|
||||||
|
<string name="gpu_temp">GPU temperatures</string>
|
||||||
|
<string name="battery_temp">Battery temperatures</string>
|
||||||
|
<string name="skin_temp">Skin temperatures</string>
|
||||||
|
<string name="undefined">Undefined</string>
|
||||||
|
<string name="cpu_usages">CPU usages</string>
|
||||||
|
<string name="active">Active</string>
|
||||||
|
<string name="total">Total</string>
|
||||||
|
<string name="fan_speeds">Fan speeds</string>
|
||||||
<string name="bug_report">Hata raporu</string>
|
<string name="bug_report">Hata raporu</string>
|
||||||
<string name="confirm_bug_report">Hata raporu iste?</string>
|
<string name="confirm_bug_report">Hata raporu iste?</string>
|
||||||
<string name="reboot">Yeniden başlat</string>
|
<string name="reboot">Yeniden başlat</string>
|
||||||
|
|||||||
@@ -131,7 +131,18 @@
|
|||||||
<string name="disable_usb_signal">禁用USB信号</string>
|
<string name="disable_usb_signal">禁用USB信号</string>
|
||||||
<string name="keyguard">锁屏</string>
|
<string name="keyguard">锁屏</string>
|
||||||
<string name="lock_now">立即锁屏</string>
|
<string name="lock_now">立即锁屏</string>
|
||||||
<string name="evict_credential_encryptoon_key">移除凭证加密密钥</string>
|
<string name="evict_credential_encryption_key">移除凭证加密密钥</string>
|
||||||
|
<string name="hardware_monitor">硬件监视器</string>
|
||||||
|
<string name="refresh_interval">刷新间隔</string>
|
||||||
|
<string name="cpu_temp">CPU温度</string>
|
||||||
|
<string name="gpu_temp">GPU温度</string>
|
||||||
|
<string name="battery_temp">电池温度</string>
|
||||||
|
<string name="skin_temp">表面温度</string>
|
||||||
|
<string name="undefined">未定义</string>
|
||||||
|
<string name="cpu_usages">CPU使用情况</string>
|
||||||
|
<string name="active">活动</string>
|
||||||
|
<string name="total">总计</string>
|
||||||
|
<string name="fan_speeds">Fan speeds</string>
|
||||||
<string name="bug_report">错误报告</string>
|
<string name="bug_report">错误报告</string>
|
||||||
<string name="confirm_bug_report">请求错误报告?</string>
|
<string name="confirm_bug_report">请求错误报告?</string>
|
||||||
<string name="reboot">重启</string>
|
<string name="reboot">重启</string>
|
||||||
|
|||||||
@@ -145,7 +145,18 @@
|
|||||||
<string name="disable_usb_signal">Disable USB signal</string>
|
<string name="disable_usb_signal">Disable USB signal</string>
|
||||||
<string name="keyguard">Keyguard</string>
|
<string name="keyguard">Keyguard</string>
|
||||||
<string name="lock_now">Lock screen now</string>
|
<string name="lock_now">Lock screen now</string>
|
||||||
<string name="evict_credential_encryptoon_key">Evict credential encryption key</string>
|
<string name="evict_credential_encryption_key">Evict credential encryption key</string>
|
||||||
|
<string name="hardware_monitor">Hardware monitor</string>
|
||||||
|
<string name="refresh_interval">Refresh interval</string>
|
||||||
|
<string name="cpu_temp">CPU temperatures</string>
|
||||||
|
<string name="gpu_temp">GPU temperatures</string>
|
||||||
|
<string name="battery_temp">Battery temperatures</string>
|
||||||
|
<string name="skin_temp">Skin temperatures</string>
|
||||||
|
<string name="undefined">Undefined</string>
|
||||||
|
<string name="cpu_usages">CPU usages</string>
|
||||||
|
<string name="active">Active</string>
|
||||||
|
<string name="total">Total</string>
|
||||||
|
<string name="fan_speeds">Fan speeds</string>
|
||||||
<string name="bug_report">Bug report</string>
|
<string name="bug_report">Bug report</string>
|
||||||
<string name="confirm_bug_report">Request bug report?</string>
|
<string name="confirm_bug_report">Request bug report?</string>
|
||||||
<string name="reboot">Reboot</string>
|
<string name="reboot">Reboot</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user