mirror of
https://github.com/LittleTurtle2333/SimplicityTools.git
synced 2026-07-12 19:31:17 +08:00
Feature: 锁屏电流信息展示 (#65)
This commit is contained in:
4
app/proguard-rules.pro
vendored
4
app/proguard-rules.pro
vendored
@@ -23,6 +23,10 @@
|
|||||||
public void *(de.robv.android.xposed.callbacks.XC_LoadPackage$LoadPackageParam);
|
public void *(de.robv.android.xposed.callbacks.XC_LoadPackage$LoadPackageParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-keep class * implements de.robv.android.xposed.IXposedHookZygoteInit {
|
||||||
|
public void *(de.robv.android.xposed.IXposedHookZygoteInit$StartupParam);
|
||||||
|
}
|
||||||
|
|
||||||
-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
|
-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
|
||||||
public static void check*(...);
|
public static void check*(...);
|
||||||
public static void throw*(...);
|
public static void throw*(...);
|
||||||
|
|||||||
@@ -942,6 +942,14 @@ class SettingsActivity : MIUIActivity() {
|
|||||||
SwitchV("enable_wave_charge_animation")
|
SwitchV("enable_wave_charge_animation")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
add(
|
||||||
|
TextSummaryWithSwitchV(
|
||||||
|
TextSummaryV(
|
||||||
|
textId = R.string.lock_screen_current,
|
||||||
|
),
|
||||||
|
SwitchV("lock_screen_current")
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,11 +4,17 @@ import com.github.kyuubiran.ezxhelper.init.EzXHelperInit
|
|||||||
import com.lt2333.simplicitytools.BuildConfig
|
import com.lt2333.simplicitytools.BuildConfig
|
||||||
import com.lt2333.simplicitytools.hook.app.*
|
import com.lt2333.simplicitytools.hook.app.*
|
||||||
import de.robv.android.xposed.IXposedHookLoadPackage
|
import de.robv.android.xposed.IXposedHookLoadPackage
|
||||||
|
import de.robv.android.xposed.IXposedHookZygoteInit
|
||||||
import de.robv.android.xposed.XSharedPreferences
|
import de.robv.android.xposed.XSharedPreferences
|
||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam
|
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam
|
||||||
|
|
||||||
class MainHook : IXposedHookLoadPackage {
|
class MainHook : IXposedHookLoadPackage,IXposedHookZygoteInit {
|
||||||
private var prefs = XSharedPreferences(BuildConfig.APPLICATION_ID, "config")
|
private var prefs = XSharedPreferences(BuildConfig.APPLICATION_ID, "config")
|
||||||
|
|
||||||
|
override fun initZygote(startupParam: IXposedHookZygoteInit.StartupParam) {
|
||||||
|
EzXHelperInit.initZygote(startupParam)
|
||||||
|
}
|
||||||
|
|
||||||
override fun handleLoadPackage(lpparam: LoadPackageParam) {
|
override fun handleLoadPackage(lpparam: LoadPackageParam) {
|
||||||
if (prefs.getBoolean("main_switch", true)) {
|
if (prefs.getBoolean("main_switch", true)) {
|
||||||
EzXHelperInit.initHandleLoadPackage(lpparam)
|
EzXHelperInit.initHandleLoadPackage(lpparam)
|
||||||
|
|||||||
@@ -70,6 +70,8 @@ class SystemUI : IXposedHookLoadPackage {
|
|||||||
HideNetworkSpeedSplitter().handleLoadPackage(lpparam)
|
HideNetworkSpeedSplitter().handleLoadPackage(lpparam)
|
||||||
//Alpha充电动画
|
//Alpha充电动画
|
||||||
WaveCharge().handleLoadPackage(lpparam)
|
WaveCharge().handleLoadPackage(lpparam)
|
||||||
|
//锁屏电流
|
||||||
|
LockScreenCurrent().handleLoadPackage(lpparam)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,140 @@
|
|||||||
|
package com.lt2333.simplicitytools.hook.app.systemui
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.IntentFilter
|
||||||
|
import android.graphics.Typeface
|
||||||
|
import android.view.Gravity
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.TextView
|
||||||
|
import cn.fkj233.ui.activity.dp2px
|
||||||
|
import com.github.kyuubiran.ezxhelper.init.InitFields
|
||||||
|
import com.lt2333.simplicitytools.R
|
||||||
|
import com.lt2333.simplicitytools.util.findClass
|
||||||
|
import com.lt2333.simplicitytools.util.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.util.hookAfterAllMethods
|
||||||
|
import com.lt2333.simplicitytools.util.hookAfterMethod
|
||||||
|
import com.microsoft.appcenter.utils.HandlerUtils.runOnUiThread
|
||||||
|
import de.robv.android.xposed.IXposedHookLoadPackage
|
||||||
|
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
||||||
|
import java.io.BufferedReader
|
||||||
|
import java.io.FileReader
|
||||||
|
import java.lang.reflect.Method
|
||||||
|
import java.util.*
|
||||||
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
|
class LockScreenCurrent(private var battery: String = "") : IXposedHookLoadPackage {
|
||||||
|
|
||||||
|
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
|
||||||
|
hasEnable("lock_screen_current") {
|
||||||
|
val miuiPhoneStatusBarViewClass =
|
||||||
|
"com.android.systemui.statusbar.phone.KeyguardBottomAreaView".findClass(lpparam.classLoader)
|
||||||
|
miuiPhoneStatusBarViewClass.hookAfterMethod("onFinishInflate") { param ->
|
||||||
|
val viewGroup = param.thisObject as ViewGroup
|
||||||
|
battery = getSystemBattery(viewGroup.context)
|
||||||
|
val textView = TextView(viewGroup.context).also {
|
||||||
|
it.typeface = Typeface.defaultFromStyle(Typeface.BOLD)
|
||||||
|
it.textSize = dp2px(viewGroup.context, 5f).toFloat()
|
||||||
|
}
|
||||||
|
textView.gravity = Gravity.CENTER or Gravity.BOTTOM
|
||||||
|
textView.setPadding(0, 0, 0, dp2px(viewGroup.context, 5f))
|
||||||
|
Timer().schedule(object : TimerTask() {
|
||||||
|
override fun run() {
|
||||||
|
runOnUiThread {
|
||||||
|
textView.text = getCurrent()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}, 0, 1000)
|
||||||
|
val darkIconDispatcherClass =
|
||||||
|
"com.android.systemui.plugins.DarkIconDispatcher".findClass(lpparam.classLoader)
|
||||||
|
darkIconDispatcherClass.hookAfterAllMethods("getTint") {
|
||||||
|
val areaTint = it.args[2] as Int
|
||||||
|
textView.setTextColor(areaTint)
|
||||||
|
}
|
||||||
|
viewGroup.addView(textView)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 原始代码来自 CSDN
|
||||||
|
* https://blog.csdn.net/zhangyongfeiyong/article/details/53641809
|
||||||
|
*/
|
||||||
|
@SuppressLint("PrivateApi")
|
||||||
|
private fun getCurrent(): String {
|
||||||
|
var result = ""
|
||||||
|
try {
|
||||||
|
val systemProperties = Class.forName("android.os.SystemProperties")
|
||||||
|
val get = systemProperties.getDeclaredMethod("get", String::class.java) as Method
|
||||||
|
val platName = get.invoke(null, "ro.hardware") as String
|
||||||
|
if (platName.startsWith("mt") || platName.startsWith("MT")) {
|
||||||
|
val filePath =
|
||||||
|
"/sys/class/power_supply/battery/device/FG_Battery_CurrentConsumption"
|
||||||
|
result = "${(getMeanCurrentVal(filePath, 5, 0) / 1000.0f).roundToInt()} mA"
|
||||||
|
} else if (platName.startsWith("qcom")) {
|
||||||
|
val filePath = "/sys/class/power_supply/battery/current_now"
|
||||||
|
val current = (getMeanCurrentVal(filePath, 5, 0) / 1000.0f).roundToInt()
|
||||||
|
result = if (current < 0) {
|
||||||
|
"${InitFields.moduleRes.getString(R.string.current_current)}$current mA,${InitFields.moduleRes.getString(R.string.charging)}$battery%".replace("-", "")
|
||||||
|
} else {
|
||||||
|
"${InitFields.moduleRes.getString(R.string.current_current)}-$current mA"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取平均电流值
|
||||||
|
* 获取 filePath 文件 totalCount 次数的平均值,每次采样间隔 intervalMs 时间
|
||||||
|
*/
|
||||||
|
private fun getMeanCurrentVal(filePath: String, totalCount: Int, intervalMs: Int): Float {
|
||||||
|
var meanVal = 0.0f
|
||||||
|
if (totalCount <= 0) {
|
||||||
|
return 0.0f
|
||||||
|
}
|
||||||
|
for (i in 0 until totalCount) {
|
||||||
|
try {
|
||||||
|
val f: Float = readFile(filePath, 0).toFloat()
|
||||||
|
meanVal += f / totalCount
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
if (intervalMs <= 0) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Thread.sleep(intervalMs.toLong())
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return meanVal
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun readFile(path: String, defaultValue: Int): Int {
|
||||||
|
try {
|
||||||
|
val bufferedReader = BufferedReader(FileReader(path))
|
||||||
|
val i: Int = bufferedReader.readLine().toInt(10)
|
||||||
|
bufferedReader.close()
|
||||||
|
return i
|
||||||
|
} catch (localException: java.lang.Exception) {
|
||||||
|
}
|
||||||
|
return defaultValue
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getSystemBattery(context: Context): String {
|
||||||
|
val batteryInfoIntent: Intent? = context.applicationContext.registerReceiver(
|
||||||
|
null,
|
||||||
|
IntentFilter(Intent.ACTION_BATTERY_CHANGED)
|
||||||
|
)
|
||||||
|
val level: Int = batteryInfoIntent!!.getIntExtra("level", 0)
|
||||||
|
val batterySum = batteryInfoIntent.getIntExtra("scale", 100)
|
||||||
|
val percentBattery = 100 * level / batterySum
|
||||||
|
return percentBattery.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -152,4 +152,7 @@
|
|||||||
<string name="current">当前值:</string>
|
<string name="current">当前值:</string>
|
||||||
<string name="participate_in_translation">参与翻译</string>
|
<string name="participate_in_translation">参与翻译</string>
|
||||||
<string name="participate_in_translation_summary">帮助我们将应用翻译成您的语言</string>
|
<string name="participate_in_translation_summary">帮助我们将应用翻译成您的语言</string>
|
||||||
|
<string name="lock_screen_current">锁屏显示电流信息</string>
|
||||||
|
<string name="current_current">当前电流:</string>
|
||||||
|
<string name="charging">充电中:</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -152,4 +152,7 @@
|
|||||||
<string name="current">當前值:</string>
|
<string name="current">當前值:</string>
|
||||||
<string name="participate_in_translation">參與翻譯</string>
|
<string name="participate_in_translation">參與翻譯</string>
|
||||||
<string name="participate_in_translation_summary">幫助我們將這個APP翻譯成您的語言</string>
|
<string name="participate_in_translation_summary">幫助我們將這個APP翻譯成您的語言</string>
|
||||||
|
<string name="lock_screen_current">锁屏显示电流信息</string>
|
||||||
|
<string name="current_current">當前電流:</string>
|
||||||
|
<string name="charging">充電中:</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -152,4 +152,7 @@
|
|||||||
<string name="current">當前值:</string>
|
<string name="current">當前值:</string>
|
||||||
<string name="participate_in_translation">參與評估</string>
|
<string name="participate_in_translation">參與評估</string>
|
||||||
<string name="participate_in_translation_summary">幫助我們將這個APP翻譯成您的語言</string>
|
<string name="participate_in_translation_summary">幫助我們將這個APP翻譯成您的語言</string>
|
||||||
|
<string name="lock_screen_current">锁屏显示电流信息</string>
|
||||||
|
<string name="current_current">當前電流:</string>
|
||||||
|
<string name="charging">充電中:</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -156,4 +156,7 @@
|
|||||||
<string name="current">Current:</string>
|
<string name="current">Current:</string>
|
||||||
<string name="participate_in_translation">Participate in translation</string>
|
<string name="participate_in_translation">Participate in translation</string>
|
||||||
<string name="participate_in_translation_summary">Help us translate the app into your language</string>
|
<string name="participate_in_translation_summary">Help us translate the app into your language</string>
|
||||||
|
<string name="lock_screen_current">Lock screen displays current information</string>
|
||||||
|
<string name="current_current">current:</string>
|
||||||
|
<string name="charging">charging:</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user