Device information
parent
e2b860c4da
commit
98451e55e2
@ -0,0 +1,93 @@
|
|||||||
|
package org.xtimms.tokusho.utils
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.app.ActivityManager
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.Build
|
||||||
|
import androidx.core.content.getSystemService
|
||||||
|
|
||||||
|
object DeviceUtil {
|
||||||
|
|
||||||
|
val isMiui: Boolean by lazy {
|
||||||
|
getSystemProperty("ro.miui.ui.version.name")?.isNotEmpty() ?: false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts the MIUI major version code from a string like "V12.5.3.0.QFGMIXM".
|
||||||
|
*
|
||||||
|
* @return MIUI major version code (e.g., 13) or null if can't be parsed.
|
||||||
|
*/
|
||||||
|
val miuiMajorVersion: Int? by lazy {
|
||||||
|
if (!isMiui) return@lazy null
|
||||||
|
|
||||||
|
Build.VERSION.INCREMENTAL
|
||||||
|
.substringBefore('.')
|
||||||
|
.trimStart('V')
|
||||||
|
.toIntOrNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("PrivateApi")
|
||||||
|
fun isMiuiOptimizationDisabled(): Boolean {
|
||||||
|
val sysProp = getSystemProperty("persist.sys.miui_optimization")
|
||||||
|
if (sysProp == "0" || sysProp == "false") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return try {
|
||||||
|
Class.forName("android.miui.AppOpsUtils")
|
||||||
|
.getDeclaredMethod("isXOptMode")
|
||||||
|
.invoke(null) as Boolean
|
||||||
|
} catch (e: Exception) {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val isSamsung: Boolean by lazy {
|
||||||
|
Build.MANUFACTURER.equals("samsung", ignoreCase = true)
|
||||||
|
}
|
||||||
|
|
||||||
|
val oneUiVersion: Double? by lazy {
|
||||||
|
try {
|
||||||
|
val semPlatformIntField = Build.VERSION::class.java.getDeclaredField("SEM_PLATFORM_INT")
|
||||||
|
val version = semPlatformIntField.getInt(null) - 90000
|
||||||
|
if (version < 0) {
|
||||||
|
1.0
|
||||||
|
} else {
|
||||||
|
((version / 10000).toString() + "." + version % 10000 / 100).toDouble()
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val invalidDefaultBrowsers = listOf(
|
||||||
|
"android",
|
||||||
|
"com.huawei.android.internal.app",
|
||||||
|
"com.zui.resolver",
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ActivityManager#isLowRamDevice is based on a system property, which isn't
|
||||||
|
* necessarily trustworthy. 1GB is supposedly the regular threshold.
|
||||||
|
*
|
||||||
|
* Instead, we consider anything with less than 3GB of RAM as low memory
|
||||||
|
* considering how heavy image processing can be.
|
||||||
|
*/
|
||||||
|
fun isLowRamDevice(context: Context): Boolean {
|
||||||
|
val memInfo = ActivityManager.MemoryInfo()
|
||||||
|
context.getSystemService<ActivityManager>()!!.getMemoryInfo(memInfo)
|
||||||
|
val totalMemBytes = memInfo.totalMem
|
||||||
|
return totalMemBytes < 3L * 1024 * 1024 * 1024
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("PrivateApi")
|
||||||
|
private fun getSystemProperty(key: String?): String? {
|
||||||
|
return try {
|
||||||
|
Class.forName("android.os.SystemProperties")
|
||||||
|
.getDeclaredMethod("get", String::class.java)
|
||||||
|
.invoke(null, key) as String
|
||||||
|
} catch (e: Exception) {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue