mirror of
https://github.com/LittleTurtle2333/SimplicityTools.git
synced 2026-07-13 20:01:17 +08:00
对Android13进行兼容性测试并拆分结构
This commit is contained in:
@@ -2,7 +2,7 @@ package com.lt2333.simplicitytools.hooks
|
|||||||
|
|
||||||
import com.lt2333.simplicitytools.BuildConfig
|
import com.lt2333.simplicitytools.BuildConfig
|
||||||
import com.lt2333.simplicitytools.hooks.apps.*
|
import com.lt2333.simplicitytools.hooks.apps.*
|
||||||
import com.lt2333.simplicitytools.hooks.rules.all.CorePatchMainHook
|
import com.lt2333.simplicitytools.hooks.rules.all.corepatch.CorePatchMainHook
|
||||||
import com.lt2333.simplicitytools.utils.xposed.EasyXposedInit
|
import com.lt2333.simplicitytools.utils.xposed.EasyXposedInit
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
||||||
import de.robv.android.xposed.IXposedHookZygoteInit
|
import de.robv.android.xposed.IXposedHookZygoteInit
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.apps
|
package com.lt2333.simplicitytools.hooks.apps
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import com.lt2333.simplicitytools.hooks.rules.all.CorePatchMainHook
|
import com.lt2333.simplicitytools.hooks.rules.all.android.AllowUntrustedTouchesForAll
|
||||||
|
import com.lt2333.simplicitytools.hooks.rules.all.android.DeleteOnPostNotificationForAll
|
||||||
|
import com.lt2333.simplicitytools.hooks.rules.all.android.DisableFlagSecureForAll
|
||||||
|
import com.lt2333.simplicitytools.hooks.rules.all.corepatch.CorePatchMainHook
|
||||||
import com.lt2333.simplicitytools.hooks.rules.s.android.*
|
import com.lt2333.simplicitytools.hooks.rules.s.android.*
|
||||||
import com.lt2333.simplicitytools.hooks.rules.t.android.MaxWallpaperScaleForT
|
import com.lt2333.simplicitytools.hooks.rules.t.android.MaxWallpaperScaleForT
|
||||||
|
import com.lt2333.simplicitytools.hooks.rules.t.android.SystemPropertiesHookForT
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
||||||
|
|
||||||
@@ -17,23 +21,23 @@ object Android : AppRegister() {
|
|||||||
Build.VERSION_CODES.TIRAMISU -> {
|
Build.VERSION_CODES.TIRAMISU -> {
|
||||||
autoInitHooks(
|
autoInitHooks(
|
||||||
lpparam,
|
lpparam,
|
||||||
DisableFlagSecureForS, //允许截图
|
DisableFlagSecureForAll, //允许截图
|
||||||
DeleteOnPostNotificationForS, //上层显示
|
DeleteOnPostNotificationForAll, //上层显示
|
||||||
RemoveSmallWindowRestrictionsForS, //解除小窗限制
|
RemoveSmallWindowRestrictionsForS, //解除小窗限制
|
||||||
MaxWallpaperScaleForT, //壁纸缩放比例
|
MaxWallpaperScaleForT, //壁纸缩放比例
|
||||||
SystemPropertiesHookForS, //SystemPropertiesHook
|
SystemPropertiesHookForT, //SystemPropertiesHook
|
||||||
AllowUntrustedTouchesForS, //允许不受信任的触摸
|
AllowUntrustedTouchesForAll, //允许不受信任的触摸
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Build.VERSION_CODES.S -> {
|
Build.VERSION_CODES.S -> {
|
||||||
autoInitHooks(
|
autoInitHooks(
|
||||||
lpparam,
|
lpparam,
|
||||||
DisableFlagSecureForS, //允许截图
|
DisableFlagSecureForAll, //允许截图
|
||||||
DeleteOnPostNotificationForS, //上层显示
|
DeleteOnPostNotificationForAll, //上层显示
|
||||||
RemoveSmallWindowRestrictionsForS, //解除小窗限制
|
RemoveSmallWindowRestrictionsForS, //解除小窗限制
|
||||||
MaxWallpaperScaleForS, //壁纸缩放比例
|
MaxWallpaperScaleForS, //壁纸缩放比例
|
||||||
SystemPropertiesHookForS, //SystemPropertiesHook
|
SystemPropertiesHookForS, //SystemPropertiesHook
|
||||||
AllowUntrustedTouchesForS, //允许不受信任的触摸
|
AllowUntrustedTouchesForAll, //允许不受信任的触摸
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.apps
|
package com.lt2333.simplicitytools.hooks.apps
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import com.lt2333.simplicitytools.hooks.rules.s.cast.ForceSupportSendAppForS
|
import com.lt2333.simplicitytools.hooks.rules.all.cast.ForceSupportSendAppForAll
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
||||||
|
|
||||||
@@ -12,12 +12,12 @@ object Cast: AppRegister() {
|
|||||||
when (Build.VERSION.SDK_INT) {
|
when (Build.VERSION.SDK_INT) {
|
||||||
Build.VERSION_CODES.TIRAMISU -> {
|
Build.VERSION_CODES.TIRAMISU -> {
|
||||||
autoInitHooks(lpparam,
|
autoInitHooks(lpparam,
|
||||||
ForceSupportSendAppForS, //强制允许所有应用接力
|
ForceSupportSendAppForAll, //强制允许所有应用接力
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Build.VERSION_CODES.S -> {
|
Build.VERSION_CODES.S -> {
|
||||||
autoInitHooks(lpparam,
|
autoInitHooks(lpparam,
|
||||||
ForceSupportSendAppForS, //强制允许所有应用接力
|
ForceSupportSendAppForAll, //强制允许所有应用接力
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.apps
|
package com.lt2333.simplicitytools.hooks.apps
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import com.lt2333.simplicitytools.hooks.rules.s.miuihome.AlwaysDisplayTimeForS
|
import com.lt2333.simplicitytools.hooks.rules.all.miuihome.AlwaysDisplayTimeForAll
|
||||||
import com.lt2333.simplicitytools.hooks.rules.s.miuihome.DoubleTapToSleepForS
|
import com.lt2333.simplicitytools.hooks.rules.all.miuihome.DoubleTapToSleepForAll
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
||||||
|
|
||||||
@@ -14,15 +14,15 @@ object MiuiHome : AppRegister() {
|
|||||||
Build.VERSION_CODES.TIRAMISU -> {
|
Build.VERSION_CODES.TIRAMISU -> {
|
||||||
autoInitHooks(
|
autoInitHooks(
|
||||||
lpparam,
|
lpparam,
|
||||||
AlwaysDisplayTimeForS, //时钟显示时钟
|
AlwaysDisplayTimeForAll, //时钟显示时钟
|
||||||
DoubleTapToSleepForS, //双击锁屏
|
DoubleTapToSleepForAll, //双击锁屏
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Build.VERSION_CODES.S -> {
|
Build.VERSION_CODES.S -> {
|
||||||
autoInitHooks(
|
autoInitHooks(
|
||||||
lpparam,
|
lpparam,
|
||||||
AlwaysDisplayTimeForS, //时钟显示时钟
|
AlwaysDisplayTimeForAll, //时钟显示时钟
|
||||||
DoubleTapToSleepForS, //双击锁屏
|
DoubleTapToSleepForAll, //双击锁屏
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.apps
|
package com.lt2333.simplicitytools.hooks.apps
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
import com.lt2333.simplicitytools.hooks.rules.all.powerkeeper.LockMaxFpsForAll
|
||||||
import com.lt2333.simplicitytools.hooks.rules.s.powerkeeper.DoNotClearAppForS
|
import com.lt2333.simplicitytools.hooks.rules.s.powerkeeper.DoNotClearAppForS
|
||||||
import com.lt2333.simplicitytools.hooks.rules.s.powerkeeper.LockMaxFpsForS
|
|
||||||
import com.lt2333.simplicitytools.hooks.rules.s.powerkeeper.MakeMilletMoreAggressiveForS
|
import com.lt2333.simplicitytools.hooks.rules.s.powerkeeper.MakeMilletMoreAggressiveForS
|
||||||
import com.lt2333.simplicitytools.hooks.rules.s.powerkeeper.PreventRecoveryOfBatteryOptimizationWhitelistForS
|
import com.lt2333.simplicitytools.hooks.rules.s.powerkeeper.PreventRecoveryOfBatteryOptimizationWhitelistForS
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
||||||
@@ -15,7 +15,7 @@ object PowerKeeper: AppRegister() {
|
|||||||
when (Build.VERSION.SDK_INT) {
|
when (Build.VERSION.SDK_INT) {
|
||||||
Build.VERSION_CODES.TIRAMISU -> {
|
Build.VERSION_CODES.TIRAMISU -> {
|
||||||
autoInitHooks(lpparam,
|
autoInitHooks(lpparam,
|
||||||
LockMaxFpsForS, //锁定最高刷新率
|
LockMaxFpsForAll, //锁定最高刷新率
|
||||||
PreventRecoveryOfBatteryOptimizationWhitelistForS, //防止恢复电池优化白名单
|
PreventRecoveryOfBatteryOptimizationWhitelistForS, //防止恢复电池优化白名单
|
||||||
DoNotClearAppForS,//阻止杀后台
|
DoNotClearAppForS,//阻止杀后台
|
||||||
MakeMilletMoreAggressiveForS,//使 Millet 更激进
|
MakeMilletMoreAggressiveForS,//使 Millet 更激进
|
||||||
@@ -23,7 +23,7 @@ object PowerKeeper: AppRegister() {
|
|||||||
}
|
}
|
||||||
Build.VERSION_CODES.S -> {
|
Build.VERSION_CODES.S -> {
|
||||||
autoInitHooks(lpparam,
|
autoInitHooks(lpparam,
|
||||||
LockMaxFpsForS, //锁定最高刷新率
|
LockMaxFpsForAll, //锁定最高刷新率
|
||||||
PreventRecoveryOfBatteryOptimizationWhitelistForS, //防止恢复电池优化白名单
|
PreventRecoveryOfBatteryOptimizationWhitelistForS, //防止恢复电池优化白名单
|
||||||
DoNotClearAppForS,//阻止杀后台
|
DoNotClearAppForS,//阻止杀后台
|
||||||
MakeMilletMoreAggressiveForS,//使 Millet 更激进
|
MakeMilletMoreAggressiveForS,//使 Millet 更激进
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.apps
|
package com.lt2333.simplicitytools.hooks.apps
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import com.lt2333.simplicitytools.hooks.rules.s.reardisplay.RearDisplayWeatherForS
|
import com.lt2333.simplicitytools.hooks.rules.all.reardisplay.RearDisplayWeatherForAll
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
||||||
|
|
||||||
@@ -12,12 +12,12 @@ object RearDisplay: AppRegister() {
|
|||||||
when (Build.VERSION.SDK_INT) {
|
when (Build.VERSION.SDK_INT) {
|
||||||
Build.VERSION_CODES.TIRAMISU -> {
|
Build.VERSION_CODES.TIRAMISU -> {
|
||||||
autoInitHooks(lpparam,
|
autoInitHooks(lpparam,
|
||||||
RearDisplayWeatherForS, //背屏显示天气
|
RearDisplayWeatherForAll, //背屏显示天气
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Build.VERSION_CODES.S -> {
|
Build.VERSION_CODES.S -> {
|
||||||
autoInitHooks(lpparam,
|
autoInitHooks(lpparam,
|
||||||
RearDisplayWeatherForS, //背屏显示天气
|
RearDisplayWeatherForAll, //背屏显示天气
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.apps
|
package com.lt2333.simplicitytools.hooks.apps
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import com.lt2333.simplicitytools.hooks.rules.s.securitycenter.*
|
import com.lt2333.simplicitytools.hooks.rules.all.securitycenter.LockOneHundredForAll
|
||||||
|
import com.lt2333.simplicitytools.hooks.rules.all.securitycenter.RemoveOpenAppConfirmationPopupForAll
|
||||||
|
import com.lt2333.simplicitytools.hooks.rules.all.securitycenter.SkipWaitingTimeForAll
|
||||||
|
import com.lt2333.simplicitytools.hooks.rules.all.securitycenter.RemoveMacroBlacklistForAll
|
||||||
|
import com.lt2333.simplicitytools.hooks.rules.s.securitycenter.ShowBatteryTemperatureForS
|
||||||
import com.lt2333.simplicitytools.hooks.rules.t.securitycenter.ShowBatteryTemperatureForT
|
import com.lt2333.simplicitytools.hooks.rules.t.securitycenter.ShowBatteryTemperatureForT
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
||||||
@@ -13,20 +17,20 @@ object SecurityCenter: AppRegister() {
|
|||||||
when (Build.VERSION.SDK_INT) {
|
when (Build.VERSION.SDK_INT) {
|
||||||
Build.VERSION_CODES.TIRAMISU -> {
|
Build.VERSION_CODES.TIRAMISU -> {
|
||||||
autoInitHooks(lpparam,
|
autoInitHooks(lpparam,
|
||||||
SkipWaitingTimeForS, //跳过 5/10秒等待时间
|
SkipWaitingTimeForAll, //跳过 5/10秒等待时间
|
||||||
LockOneHundredForS, //锁定 100分
|
LockOneHundredForAll, //锁定 100分
|
||||||
RemoveMacroBlacklistForS, //去除自动连招黑名单
|
RemoveMacroBlacklistForAll, //去除自动连招黑名单
|
||||||
ShowBatteryTemperatureForT, //显示电池温度
|
ShowBatteryTemperatureForT, //显示电池温度
|
||||||
RemoveOpenAppConfirmationPopupForS, //去除打开应用弹窗
|
RemoveOpenAppConfirmationPopupForAll, //去除打开应用弹窗
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Build.VERSION_CODES.S -> {
|
Build.VERSION_CODES.S -> {
|
||||||
autoInitHooks(lpparam,
|
autoInitHooks(lpparam,
|
||||||
SkipWaitingTimeForS, //跳过 5/10秒等待时间
|
SkipWaitingTimeForAll, //跳过 5/10秒等待时间
|
||||||
LockOneHundredForS, //锁定 100分
|
LockOneHundredForAll, //锁定 100分
|
||||||
RemoveMacroBlacklistForS, //去除自动连招黑名单
|
RemoveMacroBlacklistForAll, //去除自动连招黑名单
|
||||||
ShowBatteryTemperatureForS, //显示电池温度
|
ShowBatteryTemperatureForS, //显示电池温度
|
||||||
RemoveOpenAppConfirmationPopupForS, //去除打开应用弹窗
|
RemoveOpenAppConfirmationPopupForAll, //去除打开应用弹窗
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.apps
|
package com.lt2333.simplicitytools.hooks.apps
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import com.lt2333.simplicitytools.hooks.rules.s.settings.ShowNotificationImportanceForS
|
import com.lt2333.simplicitytools.hooks.rules.all.settings.ShowNotificationImportanceForAll
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
||||||
|
|
||||||
@@ -12,12 +12,12 @@ object Settings: AppRegister() {
|
|||||||
when (Build.VERSION.SDK_INT) {
|
when (Build.VERSION.SDK_INT) {
|
||||||
Build.VERSION_CODES.TIRAMISU -> {
|
Build.VERSION_CODES.TIRAMISU -> {
|
||||||
autoInitHooks(lpparam,
|
autoInitHooks(lpparam,
|
||||||
ShowNotificationImportanceForS, //显示通知重要程度
|
ShowNotificationImportanceForAll, //显示通知重要程度
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Build.VERSION_CODES.S -> {
|
Build.VERSION_CODES.S -> {
|
||||||
autoInitHooks(lpparam,
|
autoInitHooks(lpparam,
|
||||||
ShowNotificationImportanceForS, //显示通知重要程度
|
ShowNotificationImportanceForAll, //显示通知重要程度
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.lt2333.simplicitytools.hooks.apps
|
|||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import com.lt2333.simplicitytools.hooks.rules.s.systemui.*
|
import com.lt2333.simplicitytools.hooks.rules.s.systemui.*
|
||||||
|
import com.lt2333.simplicitytools.hooks.rules.t.systemui.*
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
||||||
|
|
||||||
@@ -12,39 +13,37 @@ object SystemUI: AppRegister() {
|
|||||||
when (Build.VERSION.SDK_INT) {
|
when (Build.VERSION.SDK_INT) {
|
||||||
Build.VERSION_CODES.TIRAMISU -> {
|
Build.VERSION_CODES.TIRAMISU -> {
|
||||||
autoInitHooks(lpparam,
|
autoInitHooks(lpparam,
|
||||||
HideStatusBarIconForS, //隐藏状态栏图标
|
HideStatusBarIconForT, //隐藏状态栏图标
|
||||||
HideBatteryIconForS, //隐藏电池
|
HideBatteryIconForT, //隐藏电池
|
||||||
HideHDIconForS, //隐藏HD图标
|
HideHDIconForT, //隐藏HD图标
|
||||||
HideSimIconForS, //隐藏SIM卡图标
|
HideSimIconForT, //隐藏SIM卡图标
|
||||||
HideMobileActivityIconForS, //隐藏移动箭头图标
|
HideMobileActivityIconForT, //隐藏移动箭头图标
|
||||||
HideMobileTypeIconForS, //隐藏移动类型图标
|
HideMobileTypeIconForT, //隐藏移动类型图标
|
||||||
HideStatusBarNetworkSpeedSecondForS, //隐藏状态栏网速/s
|
HideStatusBarNetworkSpeedSecondForT, //隐藏状态栏网速/s
|
||||||
HideWifiActivityIconForS, //隐藏WIFI活动箭头图标
|
HideWifiActivityIconForT, //隐藏WIFI活动箭头图标
|
||||||
MaximumNumberOfNotificationIconsForS, //通知图标上限
|
MaximumNumberOfNotificationIconsForT, //通知图标上限
|
||||||
StatusBarNetworkSpeedRefreshSpeedForS, //状态栏网速秒刷新
|
StatusBarNetworkSpeedRefreshSpeedForT, //状态栏网速秒刷新
|
||||||
StatusBarTimeCustomizationForS, //状态栏时钟自定义
|
StatusBarTimeCustomizationForT, //状态栏时钟自定义
|
||||||
RemoveTheLeftSideOfTheLockScreenForS, //移除锁屏负一屏功能
|
RemoveTheLeftSideOfTheLockScreenForT, //移除锁屏负一屏功能
|
||||||
RemoveLockScreenCameraForS, //移除锁屏相机功能
|
RemoveLockScreenCameraForT, //移除锁屏相机功能
|
||||||
NotificationWeatherForS, //通知面板天气
|
NotificationWeatherForT, //通知面板天气
|
||||||
NewNotificationWeatherForS, // 新控制中心天气
|
NewNotificationWeatherForT, // 新控制中心天气
|
||||||
OldNotificationWeatherForS,
|
OldNotificationWeatherForT,
|
||||||
ControlCenterWeatherForS, //控制中心天气
|
ControlCenterWeatherForT, //控制中心天气
|
||||||
//StatusBarCurrent, //TODO:状态栏电流
|
StatusBarLayoutForT, //状态栏布局
|
||||||
StatusBarLayoutForS, //状态栏布局
|
HideNetworkSpeedSplitterForT, //隐藏时钟与实时网速之间的分隔符
|
||||||
HideNetworkSpeedSplitterForS, //隐藏时钟与实时网速之间的分隔符
|
WaveChargeForT, //Alpha充电动画
|
||||||
WaveChargeForS, //Alpha充电动画
|
LockScreenCurrentForT, //锁屏电流
|
||||||
LockScreenCurrentForS, //锁屏电流
|
LockScreenDoubleTapToSleepForT, //锁屏下双击锁屏
|
||||||
LockScreenDoubleTapToSleepForS, //锁屏下双击锁屏
|
StatusBarDoubleTapToSleepForT, //双击状态栏锁屏
|
||||||
StatusBarDoubleTapToSleepForS, //双击状态栏锁屏
|
OldQSCustomForT, //旧版快速设置自定义
|
||||||
OldQSCustomForS, //旧版快速设置自定义
|
DoubleLineNetworkSpeedForT, //双排网速
|
||||||
DoubleLineNetworkSpeedForS, //双排网速
|
StatusBarBigMobileTypeIconForT, //大移动类型
|
||||||
StatusBarBigMobileTypeIconForS, //大移动类型
|
BatteryPercentageForT, //电量百分比
|
||||||
BatteryPercentageForS, //电量百分比
|
CustomMobileTypeTextForT, //自定义移动类型文本
|
||||||
CustomMobileTypeTextForS, //自定义移动类型文本
|
CanNotificationSlideForT, //允许下滑通知打开小窗
|
||||||
CanNotificationSlideForS, //允许下滑通知打开小窗
|
LockScreenClockDisplaySecondsForT, // 锁屏时钟显示秒
|
||||||
LockScreenClockDisplaySecondsForS, // 锁屏时钟显示秒
|
ShowWifiStandardForT, // 显示 WIFI 角标
|
||||||
ShowWifiStandardForS, // 显示 WIFI 角标
|
|
||||||
NoPasswordHookForS, // 显示 WIFI 角标
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Build.VERSION_CODES.S -> {
|
Build.VERSION_CODES.S -> {
|
||||||
@@ -66,7 +65,6 @@ object SystemUI: AppRegister() {
|
|||||||
NewNotificationWeatherForS, // 新控制中心天气
|
NewNotificationWeatherForS, // 新控制中心天气
|
||||||
OldNotificationWeatherForS,
|
OldNotificationWeatherForS,
|
||||||
ControlCenterWeatherForS, //控制中心天气
|
ControlCenterWeatherForS, //控制中心天气
|
||||||
//StatusBarCurrent, //TODO:状态栏电流
|
|
||||||
StatusBarLayoutForS, //状态栏布局
|
StatusBarLayoutForS, //状态栏布局
|
||||||
HideNetworkSpeedSplitterForS, //隐藏时钟与实时网速之间的分隔符
|
HideNetworkSpeedSplitterForS, //隐藏时钟与实时网速之间的分隔符
|
||||||
WaveChargeForS, //Alpha充电动画
|
WaveChargeForS, //Alpha充电动画
|
||||||
@@ -81,7 +79,6 @@ object SystemUI: AppRegister() {
|
|||||||
CanNotificationSlideForS, //允许下滑通知打开小窗
|
CanNotificationSlideForS, //允许下滑通知打开小窗
|
||||||
LockScreenClockDisplaySecondsForS, // 锁屏时钟显示秒
|
LockScreenClockDisplaySecondsForS, // 锁屏时钟显示秒
|
||||||
ShowWifiStandardForS, // 显示 WIFI 角标
|
ShowWifiStandardForS, // 显示 WIFI 角标
|
||||||
NoPasswordHookForS, // 显示 WIFI 角标
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.apps
|
package com.lt2333.simplicitytools.hooks.apps
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import com.lt2333.simplicitytools.hooks.rules.s.thememanager.RemoveAdsForS
|
import com.lt2333.simplicitytools.hooks.rules.all.thememanager.RemoveAdsForAll
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
||||||
|
|
||||||
@@ -12,12 +12,12 @@ object ThemeManager: AppRegister() {
|
|||||||
when (Build.VERSION.SDK_INT) {
|
when (Build.VERSION.SDK_INT) {
|
||||||
Build.VERSION_CODES.TIRAMISU -> {
|
Build.VERSION_CODES.TIRAMISU -> {
|
||||||
autoInitHooks(lpparam,
|
autoInitHooks(lpparam,
|
||||||
RemoveAdsForS, //移除主题壁纸的广告
|
RemoveAdsForAll, //移除主题壁纸的广告
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Build.VERSION_CODES.S -> {
|
Build.VERSION_CODES.S -> {
|
||||||
autoInitHooks(lpparam,
|
autoInitHooks(lpparam,
|
||||||
RemoveAdsForS, //移除主题壁纸的广告
|
RemoveAdsForAll, //移除主题壁纸的广告
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.all;
|
|
||||||
|
|
||||||
public class CorePatchForSv2 extends CorePatchForS{
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.s.android
|
package com.lt2333.simplicitytools.hooks.rules.all.android
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
@@ -6,7 +6,7 @@ import com.github.kyuubiran.ezxhelper.utils.hookReturnConstant
|
|||||||
import com.lt2333.simplicitytools.utils.hasEnable
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
object AllowUntrustedTouchesForS : HookRegister() {
|
object AllowUntrustedTouchesForAll : HookRegister() {
|
||||||
override fun init() = hasEnable("allow_untrusted_touches") {
|
override fun init() = hasEnable("allow_untrusted_touches") {
|
||||||
findMethod("android.hardware.input.InputManager") {
|
findMethod("android.hardware.input.InputManager") {
|
||||||
name == "getBlockUntrustedTouchesMode" && parameterTypes[0] == Context::class.java
|
name == "getBlockUntrustedTouchesMode" && parameterTypes[0] == Context::class.java
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.s.android
|
package com.lt2333.simplicitytools.hooks.rules.all.android
|
||||||
|
|
||||||
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
import com.lt2333.simplicitytools.utils.hasEnable
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
object DeleteOnPostNotificationForS : HookRegister() {
|
object DeleteOnPostNotificationForAll : HookRegister() {
|
||||||
override fun init() {
|
override fun init() {
|
||||||
findMethod("com.android.server.wm.AlertWindowNotification") {
|
findMethod("com.android.server.wm.AlertWindowNotification") {
|
||||||
name == "onPostNotification"
|
name == "onPostNotification"
|
||||||
@@ -1,12 +1,13 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.s.android
|
package com.lt2333.simplicitytools.hooks.rules.all.android
|
||||||
|
|
||||||
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
import com.lt2333.simplicitytools.utils.hasEnable
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
object DisableFlagSecureForS : HookRegister() {
|
object DisableFlagSecureForAll : HookRegister() {
|
||||||
override fun init() {
|
override fun init() {
|
||||||
|
// TODO: 23.1.30及之后的版本无法在部分场景生效,疑似MIUI做了修改
|
||||||
findMethod("com.android.server.wm.WindowState") {
|
findMethod("com.android.server.wm.WindowState") {
|
||||||
name == "isSecureLocked"
|
name == "isSecureLocked"
|
||||||
}.hookBefore {
|
}.hookBefore {
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.s.cast
|
package com.lt2333.simplicitytools.hooks.rules.all.cast
|
||||||
|
|
||||||
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||||
import com.lt2333.simplicitytools.utils.hasEnable
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
object ForceSupportSendAppForS : HookRegister() {
|
object ForceSupportSendAppForAll : HookRegister() {
|
||||||
|
|
||||||
override fun init() = hasEnable("force_support_send_app") {
|
override fun init() = hasEnable("force_support_send_app") {
|
||||||
findMethod("com.xiaomi.mirror.synergy.MiuiSynergySdk") {
|
findMethod("com.xiaomi.mirror.synergy.MiuiSynergySdk") {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.all;
|
package com.lt2333.simplicitytools.hooks.rules.all.corepatch;
|
||||||
|
|
||||||
|
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.all;
|
package com.lt2333.simplicitytools.hooks.rules.all.corepatch;
|
||||||
|
|
||||||
|
|
||||||
import android.app.AndroidAppHelper;
|
import android.app.AndroidAppHelper;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.all;
|
package com.lt2333.simplicitytools.hooks.rules.all.corepatch;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.all.corepatch;
|
||||||
|
|
||||||
|
public class CorePatchForSv2 extends CorePatchForS{
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.all;
|
package com.lt2333.simplicitytools.hooks.rules.all.corepatch;
|
||||||
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.all;
|
package com.lt2333.simplicitytools.hooks.rules.all.corepatch;
|
||||||
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.all;
|
package com.lt2333.simplicitytools.hooks.rules.all.corepatch;
|
||||||
|
|
||||||
import de.robv.android.xposed.XC_MethodHook;
|
import de.robv.android.xposed.XC_MethodHook;
|
||||||
import de.robv.android.xposed.XSharedPreferences;
|
import de.robv.android.xposed.XSharedPreferences;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.all;
|
package com.lt2333.simplicitytools.hooks.rules.all.corepatch;
|
||||||
|
|
||||||
import com.lt2333.simplicitytools.BuildConfig;
|
import com.lt2333.simplicitytools.BuildConfig;
|
||||||
|
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.s.miuihome
|
package com.lt2333.simplicitytools.hooks.rules.all.miuihome
|
||||||
|
|
||||||
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
import com.lt2333.simplicitytools.utils.hasEnable
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
object AlwaysDisplayTimeForS : HookRegister() {
|
object AlwaysDisplayTimeForAll : HookRegister() {
|
||||||
|
|
||||||
override fun init() {
|
override fun init() {
|
||||||
try {
|
try {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.s.miuihome
|
package com.lt2333.simplicitytools.hooks.rules.all.miuihome
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.os.SystemClock
|
import android.os.SystemClock
|
||||||
@@ -6,7 +6,7 @@ import android.view.MotionEvent
|
|||||||
import android.view.ViewConfiguration
|
import android.view.ViewConfiguration
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
|
||||||
class DoubleTapControllerForS internal constructor(mContext: Context) {
|
class DoubleTapControllerForAll internal constructor(mContext: Context) {
|
||||||
|
|
||||||
private val maxDuration: Long = 500
|
private val maxDuration: Long = 500
|
||||||
private var mActionDownRawX: Float = 0f
|
private var mActionDownRawX: Float = 0f
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.s.miuihome
|
package com.lt2333.simplicitytools.hooks.rules.all.miuihome
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
@@ -8,14 +8,14 @@ import com.lt2333.simplicitytools.utils.hasEnable
|
|||||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
import de.robv.android.xposed.XposedHelpers
|
import de.robv.android.xposed.XposedHelpers
|
||||||
|
|
||||||
object DoubleTapToSleepForS : HookRegister() {
|
object DoubleTapToSleepForAll : HookRegister() {
|
||||||
|
|
||||||
override fun init() = hasEnable("double_tap_to_sleep") {
|
override fun init() = hasEnable("double_tap_to_sleep") {
|
||||||
hookAllConstructorAfter("com.miui.home.launcher.Workspace") {
|
hookAllConstructorAfter("com.miui.home.launcher.Workspace") {
|
||||||
var mDoubleTapControllerEx =
|
var mDoubleTapControllerEx =
|
||||||
XposedHelpers.getAdditionalInstanceField(it.thisObject, "mDoubleTapControllerEx")
|
XposedHelpers.getAdditionalInstanceField(it.thisObject, "mDoubleTapControllerEx")
|
||||||
if (mDoubleTapControllerEx != null) return@hookAllConstructorAfter
|
if (mDoubleTapControllerEx != null) return@hookAllConstructorAfter
|
||||||
mDoubleTapControllerEx = DoubleTapControllerForS((it.args[0] as Context))
|
mDoubleTapControllerEx = DoubleTapControllerForAll((it.args[0] as Context))
|
||||||
XposedHelpers.setAdditionalInstanceField(
|
XposedHelpers.setAdditionalInstanceField(
|
||||||
it.thisObject,
|
it.thisObject,
|
||||||
"mDoubleTapControllerEx",
|
"mDoubleTapControllerEx",
|
||||||
@@ -28,7 +28,7 @@ object DoubleTapToSleepForS : HookRegister() {
|
|||||||
val mDoubleTapControllerEx = XposedHelpers.getAdditionalInstanceField(
|
val mDoubleTapControllerEx = XposedHelpers.getAdditionalInstanceField(
|
||||||
it.thisObject,
|
it.thisObject,
|
||||||
"mDoubleTapControllerEx"
|
"mDoubleTapControllerEx"
|
||||||
) as DoubleTapControllerForS
|
) as DoubleTapControllerForAll
|
||||||
if (!mDoubleTapControllerEx.isDoubleTapEvent(it.args[0] as MotionEvent)) return@hookBefore
|
if (!mDoubleTapControllerEx.isDoubleTapEvent(it.args[0] as MotionEvent)) return@hookBefore
|
||||||
val mCurrentScreenIndex = it.thisObject.getObject("mCurrentScreenIndex") as Int
|
val mCurrentScreenIndex = it.thisObject.getObject("mCurrentScreenIndex") as Int
|
||||||
val cellLayout = it.thisObject.invokeMethodAuto("getCellLayout", mCurrentScreenIndex)
|
val cellLayout = it.thisObject.invokeMethodAuto("getCellLayout", mCurrentScreenIndex)
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.s.powerkeeper
|
package com.lt2333.simplicitytools.hooks.rules.all.powerkeeper
|
||||||
|
|
||||||
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
import com.lt2333.simplicitytools.utils.hasEnable
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
object LockMaxFpsForS : HookRegister() {
|
object LockMaxFpsForAll: HookRegister() {
|
||||||
|
|
||||||
override fun init() {
|
override fun init() {
|
||||||
findMethod("com.miui.powerkeeper.statemachine.DisplayFrameSetting") {
|
findMethod("com.miui.powerkeeper.statemachine.DisplayFrameSetting") {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.s.reardisplay
|
package com.lt2333.simplicitytools.hooks.rules.all.reardisplay
|
||||||
|
|
||||||
import android.graphics.Typeface
|
import android.graphics.Typeface
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
@@ -15,7 +15,7 @@ import com.lt2333.simplicitytools.utils.hasEnable
|
|||||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
import com.lt2333.simplicitytools.views.WeatherView
|
import com.lt2333.simplicitytools.views.WeatherView
|
||||||
|
|
||||||
object RearDisplayWeatherForS : HookRegister() {
|
object RearDisplayWeatherForAll : HookRegister() {
|
||||||
|
|
||||||
override fun init() = hasEnable("rear_show_weather") {
|
override fun init() = hasEnable("rear_show_weather") {
|
||||||
findMethod("com.xiaomi.misubscreenui.light.aod.view.VerticalClockView") {
|
findMethod("com.xiaomi.misubscreenui.light.aod.view.VerticalClockView") {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.s.securitycenter
|
package com.lt2333.simplicitytools.hooks.rules.all.securitycenter
|
||||||
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
@@ -6,7 +6,7 @@ import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
|||||||
import com.lt2333.simplicitytools.utils.hasEnable
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
object LockOneHundredForS : HookRegister() {
|
object LockOneHundredForAll : HookRegister() {
|
||||||
|
|
||||||
override fun init() {
|
override fun init() {
|
||||||
//防止点击重新检测
|
//防止点击重新检测
|
||||||
@@ -1,13 +1,14 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.s.securitycenter
|
package com.lt2333.simplicitytools.hooks.rules.all.securitycenter
|
||||||
|
|
||||||
import com.lt2333.simplicitytools.utils.XSPUtils
|
import com.lt2333.simplicitytools.utils.XSPUtils
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
import de.robv.android.xposed.XC_MethodHook
|
import de.robv.android.xposed.XC_MethodHook
|
||||||
import de.robv.android.xposed.XposedHelpers
|
import de.robv.android.xposed.XposedHelpers
|
||||||
|
|
||||||
object RemoveMacroBlacklistForS : HookRegister() {
|
object RemoveMacroBlacklistForAll : HookRegister() {
|
||||||
|
|
||||||
override fun init() {
|
override fun init() {
|
||||||
|
// TODO: 新版已失效
|
||||||
if (XSPUtils.getBoolean("remove_macro_blacklist", false)) {
|
if (XSPUtils.getBoolean("remove_macro_blacklist", false)) {
|
||||||
var letter = 'a'
|
var letter = 'a'
|
||||||
for (i in 0..25) {
|
for (i in 0..25) {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.s.securitycenter
|
package com.lt2333.simplicitytools.hooks.rules.all.securitycenter
|
||||||
|
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
@@ -6,7 +6,7 @@ import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
|||||||
import com.lt2333.simplicitytools.utils.hasEnable
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
object RemoveOpenAppConfirmationPopupForS : HookRegister() {
|
object RemoveOpenAppConfirmationPopupForAll : HookRegister() {
|
||||||
|
|
||||||
override fun init() {
|
override fun init() {
|
||||||
findMethod("android.widget.TextView") {
|
findMethod("android.widget.TextView") {
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.s.securitycenter
|
package com.lt2333.simplicitytools.hooks.rules.all.securitycenter
|
||||||
|
|
||||||
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
import com.lt2333.simplicitytools.utils.hasEnable
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
object SkipWaitingTimeForS : HookRegister() {
|
object SkipWaitingTimeForAll : HookRegister() {
|
||||||
|
|
||||||
override fun init() {
|
override fun init() {
|
||||||
findMethod("android.widget.TextView") {
|
findMethod("android.widget.TextView") {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.s.settings
|
package com.lt2333.simplicitytools.hooks.rules.all.settings
|
||||||
|
|
||||||
import android.app.NotificationChannel
|
import android.app.NotificationChannel
|
||||||
import com.github.kyuubiran.ezxhelper.utils.*
|
import com.github.kyuubiran.ezxhelper.utils.*
|
||||||
@@ -6,7 +6,7 @@ import com.lt2333.simplicitytools.utils.XSPUtils
|
|||||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
import de.robv.android.xposed.XposedHelpers
|
import de.robv.android.xposed.XposedHelpers
|
||||||
|
|
||||||
object ShowNotificationImportanceForS : HookRegister() {
|
object ShowNotificationImportanceForAll : HookRegister() {
|
||||||
|
|
||||||
override fun init() {
|
override fun init() {
|
||||||
findMethod("com.android.settings.notification.ChannelNotificationSettings") {
|
findMethod("com.android.settings.notification.ChannelNotificationSettings") {
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.s.thememanager
|
package com.lt2333.simplicitytools.hooks.rules.all.thememanager
|
||||||
|
|
||||||
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
import com.lt2333.simplicitytools.utils.hasEnable
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
object RemoveAdsForS : HookRegister() {
|
object RemoveAdsForAll : HookRegister() {
|
||||||
|
|
||||||
override fun init() {
|
override fun init() {
|
||||||
findMethod("com.android.thememanager.basemodule.ad.model.AdInfoResponse") {
|
findMethod("com.android.thememanager.basemodule.ad.model.AdInfoResponse") {
|
||||||
@@ -27,7 +27,6 @@ object NewNotificationWeatherForS : HookRegister() {
|
|||||||
val time = it.args[0]?.toString()
|
val time = it.args[0]?.toString()
|
||||||
val view = it.thisObject as TextView
|
val view = it.thisObject as TextView
|
||||||
if (view.id == clockId && time != null && this::weather.isInitialized) {
|
if (view.id == clockId && time != null && this::weather.isInitialized) {
|
||||||
// TODO("调高天气位置")
|
|
||||||
// val layout = view.layoutParams as ViewGroup.MarginLayoutParams
|
// val layout = view.layoutParams as ViewGroup.MarginLayoutParams
|
||||||
// val y = view.height / 2
|
// val y = view.height / 2
|
||||||
// layout.topMargin = -y
|
// layout.topMargin = -y
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
package com.lt2333.simplicitytools.hooks.rules.s.systemui
|
|
||||||
|
|
||||||
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
|
||||||
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
|
||||||
import com.lt2333.simplicitytools.utils.hasEnable
|
|
||||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
|
||||||
|
|
||||||
object NoPasswordHookForS : HookRegister() {
|
|
||||||
|
|
||||||
override fun init() {
|
|
||||||
hasEnable("no_need_to_enter_password_when_power_on") {
|
|
||||||
findMethod("com.android.internal.widget.LockPatternUtils\$StrongAuthTracker") { name == "isBiometricAllowedForUser" }.hookBefore {
|
|
||||||
it.result = true
|
|
||||||
}
|
|
||||||
findMethod("com.android.internal.widget.LockPatternUtils") { name == "isBiometricAllowedForUser" }.hookBefore {
|
|
||||||
it.result = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.android
|
||||||
|
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
|
import com.lt2333.simplicitytools.utils.XSPUtils
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
object SystemPropertiesHookForT : HookRegister() {
|
||||||
|
override fun init() {
|
||||||
|
val mediaStepsSwitch = XSPUtils.getBoolean("media_volume_steps_switch", false)
|
||||||
|
val mediaSteps = XSPUtils.getInt("media_volume_steps", 15)
|
||||||
|
|
||||||
|
findMethod("android.os.SystemProperties") {
|
||||||
|
name == "getInt" && returnType == Int::class.java
|
||||||
|
}.hookBefore {
|
||||||
|
when (it.args[0] as String) {
|
||||||
|
"ro.config.media_vol_steps" -> if (mediaStepsSwitch) it.result = mediaSteps
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.util.TypedValue
|
||||||
|
import android.widget.TextView
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.getObjectAs
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||||
|
import com.lt2333.simplicitytools.utils.XSPUtils
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
object BatteryPercentageForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
val size = XSPUtils.getFloat("battery_percentage_font_size", 0f)
|
||||||
|
if (size == 0f) return
|
||||||
|
findMethod("com.android.systemui.statusbar.views.MiuiBatteryMeterView") {
|
||||||
|
name == "updateResources"
|
||||||
|
}.hookAfter {
|
||||||
|
(it.thisObject.getObjectAs<TextView>("mBatteryPercentView")).setTextSize(
|
||||||
|
TypedValue.COMPLEX_UNIT_DIP, size
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
object CanNotificationSlideForT: HookRegister() {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
findMethod("com.android.systemui.statusbar.notification.NotificationSettingsManager") {
|
||||||
|
name == "canSlide"
|
||||||
|
}.hookAfter {
|
||||||
|
hasEnable("can_notification_slide") {
|
||||||
|
it.result = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,200 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.content.ComponentName
|
||||||
|
import android.content.Intent
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import android.widget.TextView
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
import cn.fkj233.ui.activity.dp2px
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.*
|
||||||
|
import com.lt2333.simplicitytools.utils.SystemProperties
|
||||||
|
import com.lt2333.simplicitytools.utils.XSPUtils
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
import com.lt2333.simplicitytools.views.WeatherView
|
||||||
|
|
||||||
|
object ControlCenterWeatherForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() = hasEnable("control_center_weather") {
|
||||||
|
var mWeatherView: TextView? = null
|
||||||
|
var mConstraintLayout: ConstraintLayout? = null
|
||||||
|
val isDisplayCity = XSPUtils.getBoolean("control_center_weather_city", false)
|
||||||
|
findMethod("com.android.systemui.controlcenter.phone.widget.QSControlCenterHeaderView") {
|
||||||
|
name == "onFinishInflate"
|
||||||
|
}.hookAfter { param ->
|
||||||
|
val viewGroup = param.thisObject as ViewGroup
|
||||||
|
val context = viewGroup.context
|
||||||
|
|
||||||
|
// MIUI编译时间大于 2022-03-12 00:00:00 且为内测版
|
||||||
|
if (SystemProperties[context, "ro.build.date.utc"]!!.toInt() >= 1647014400 &&
|
||||||
|
!SystemProperties[context, "ro.build.version.incremental"]!!.endsWith("XM")
|
||||||
|
) {
|
||||||
|
//获取原组件
|
||||||
|
val bigTimeId =
|
||||||
|
context.resources.getIdentifier("big_time", "id", context.packageName)
|
||||||
|
val big_time: TextView = viewGroup.findViewById(bigTimeId)
|
||||||
|
|
||||||
|
val dateTimeId =
|
||||||
|
context.resources.getIdentifier("date_time", "id", context.packageName)
|
||||||
|
val dateTime: TextView = viewGroup.findViewById(dateTimeId)
|
||||||
|
|
||||||
|
//创建新布局
|
||||||
|
val mConstraintLayoutLp = LinearLayout.LayoutParams(
|
||||||
|
LinearLayout.LayoutParams.MATCH_PARENT,
|
||||||
|
LinearLayout.LayoutParams.WRAP_CONTENT
|
||||||
|
).also {
|
||||||
|
it.topMargin = context.resources.getDimensionPixelSize(
|
||||||
|
context.resources.getIdentifier(
|
||||||
|
"qs_control_header_tiles_margin_top",
|
||||||
|
"dimen",
|
||||||
|
context.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
mConstraintLayout =
|
||||||
|
ConstraintLayout(context).also { it.layoutParams = mConstraintLayoutLp }
|
||||||
|
|
||||||
|
(big_time.parent as ViewGroup).addView(mConstraintLayout, 0)
|
||||||
|
|
||||||
|
//从原布局中删除组件
|
||||||
|
(big_time.parent as ViewGroup).removeView(big_time)
|
||||||
|
(dateTime.parent as ViewGroup).removeView(dateTime)
|
||||||
|
|
||||||
|
//添加组件至新布局
|
||||||
|
mConstraintLayout!!.addView(big_time)
|
||||||
|
mConstraintLayout!!.addView(dateTime)
|
||||||
|
|
||||||
|
//组件属性
|
||||||
|
val dateTimeLp = ConstraintLayout.LayoutParams(
|
||||||
|
ConstraintLayout.LayoutParams.WRAP_CONTENT,
|
||||||
|
ConstraintLayout.LayoutParams.WRAP_CONTENT
|
||||||
|
).also {
|
||||||
|
it.startToEnd = bigTimeId
|
||||||
|
it.bottomToBottom = 0
|
||||||
|
it.marginStart = context.resources.getDimensionPixelSize(
|
||||||
|
context.resources.getIdentifier(
|
||||||
|
"notification_panel_time_date_space",
|
||||||
|
"dimen",
|
||||||
|
context.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
it.bottomMargin = dp2px(context, 5f)
|
||||||
|
}
|
||||||
|
dateTime.layoutParams = dateTimeLp
|
||||||
|
|
||||||
|
|
||||||
|
//创建天气组件
|
||||||
|
mWeatherView = WeatherView(context, isDisplayCity).apply {
|
||||||
|
setTextAppearance(
|
||||||
|
context.resources.getIdentifier(
|
||||||
|
"TextAppearance.QSControl.Date",
|
||||||
|
"style",
|
||||||
|
context.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
}
|
||||||
|
mConstraintLayout!!.addView(mWeatherView)
|
||||||
|
|
||||||
|
val mweatherviewLp = ConstraintLayout.LayoutParams(
|
||||||
|
ConstraintLayout.LayoutParams.WRAP_CONTENT,
|
||||||
|
ConstraintLayout.LayoutParams.WRAP_CONTENT
|
||||||
|
).also {
|
||||||
|
it.startToEnd = bigTimeId
|
||||||
|
it.bottomToTop = dateTimeId
|
||||||
|
it.marginStart = context.resources.getDimensionPixelSize(
|
||||||
|
context.resources.getIdentifier(
|
||||||
|
"notification_panel_time_date_space",
|
||||||
|
"dimen",
|
||||||
|
context.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
(mWeatherView as WeatherView).layoutParams = mweatherviewLp
|
||||||
|
|
||||||
|
} else {
|
||||||
|
val layoutParam =
|
||||||
|
loadClass("androidx.constraintlayout.widget.ConstraintLayout\$LayoutParams").getConstructor(
|
||||||
|
Int::class.java,
|
||||||
|
Int::class.java
|
||||||
|
).newInstance(
|
||||||
|
ViewGroup.LayoutParams.WRAP_CONTENT,
|
||||||
|
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||||
|
) as ViewGroup.MarginLayoutParams
|
||||||
|
layoutParam.putObject(
|
||||||
|
"bottomToTop",
|
||||||
|
context.resources.getIdentifier("date_time", "id", context.packageName)
|
||||||
|
)
|
||||||
|
layoutParam.putObject(
|
||||||
|
"startToEnd",
|
||||||
|
context.resources.getIdentifier("big_time", "id", context.packageName)
|
||||||
|
)
|
||||||
|
layoutParam.marginStart = context.resources.getDimensionPixelSize(
|
||||||
|
context.resources.getIdentifier(
|
||||||
|
"notification_panel_time_date_space",
|
||||||
|
"dimen",
|
||||||
|
context.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
mWeatherView = WeatherView(context, isDisplayCity).apply {
|
||||||
|
setTextAppearance(
|
||||||
|
context.resources.getIdentifier(
|
||||||
|
"TextAppearance.QSControl.Date",
|
||||||
|
"style",
|
||||||
|
context.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
layoutParams = layoutParam
|
||||||
|
}
|
||||||
|
viewGroup.addView(mWeatherView)
|
||||||
|
}
|
||||||
|
|
||||||
|
(mWeatherView as WeatherView).setOnClickListener {
|
||||||
|
try {
|
||||||
|
val intent = Intent().apply {
|
||||||
|
flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
||||||
|
component = ComponentName(
|
||||||
|
"com.miui.weather2",
|
||||||
|
"com.miui.weather2.ActivityWeatherMain"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
context.startActivity(intent)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Toast.makeText(context, "启动失败", Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//解决横屏重叠
|
||||||
|
findMethod("com.android.systemui.controlcenter.phone.widget.QSControlCenterHeaderView") {
|
||||||
|
name == "updateLayout"
|
||||||
|
}.hookAfter {
|
||||||
|
val viewGroup = it.thisObject as ViewGroup
|
||||||
|
val context = viewGroup.context
|
||||||
|
val mOrientation = viewGroup.getObject("mOrientation") as Int
|
||||||
|
// MIUI编译时间大于 2022-03-12 00:00:00 且为内测版
|
||||||
|
if (SystemProperties[context, "ro.build.date.utc"]!!.toInt() >= 1647014400 && !SystemProperties[context, "ro.build.version.incremental"]!!.endsWith(
|
||||||
|
"DEV"
|
||||||
|
) && !SystemProperties[context, "ro.build.version.incremental"]!!.endsWith("XM")
|
||||||
|
) {
|
||||||
|
if (mOrientation == 1) {
|
||||||
|
mConstraintLayout!!.visibility = View.VISIBLE
|
||||||
|
} else {
|
||||||
|
mConstraintLayout!!.visibility = View.GONE
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (mOrientation == 1) {
|
||||||
|
mWeatherView!!.visibility = View.VISIBLE
|
||||||
|
} else {
|
||||||
|
mWeatherView!!.visibility = View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||||
|
import com.lt2333.simplicitytools.utils.XSPUtils
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
object CustomMobileTypeTextForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() = hasEnable("custom_mobile_type_text_switch") {
|
||||||
|
// TODO: Android13自定义网络类型文本不可用
|
||||||
|
findMethod("com.android.systemui.statusbar.policy.MobileSignalController") {
|
||||||
|
name == "getMobileTypeName" && parameterTypes[0] == Int::class.java
|
||||||
|
}.hookAfter {
|
||||||
|
it.result = XSPUtils.getString("custom_mobile_type_text", "5G")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.net.TrafficStats
|
||||||
|
import android.util.TypedValue
|
||||||
|
import android.view.Gravity
|
||||||
|
import android.widget.TextView
|
||||||
|
import com.github.kyuubiran.ezxhelper.init.InitFields
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findConstructor
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
|
import com.lt2333.simplicitytools.R
|
||||||
|
import com.lt2333.simplicitytools.utils.XSPUtils
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
import java.text.DecimalFormat
|
||||||
|
|
||||||
|
object DoubleLineNetworkSpeedForT : HookRegister() {
|
||||||
|
|
||||||
|
private var mLastTotalUp: Long = 0
|
||||||
|
private var mLastTotalDown: Long = 0
|
||||||
|
|
||||||
|
private var lastTimeStampTotalUp: Long = 0
|
||||||
|
private var lastTimeStampTotalDown: Long = 0
|
||||||
|
|
||||||
|
private var upIcon = ""
|
||||||
|
private var downIcon = ""
|
||||||
|
|
||||||
|
private val getDualSize = XSPUtils.getInt("status_bar_network_speed_dual_row_size", 0)
|
||||||
|
private val getDualAlign = XSPUtils.getInt("status_bar_network_speed_dual_row_gravity", 0)
|
||||||
|
|
||||||
|
override fun init() = hasEnable("status_bar_dual_row_network_speed") {
|
||||||
|
|
||||||
|
val none = InitFields.moduleRes.getString(R.string.none)
|
||||||
|
|
||||||
|
if (XSPUtils.getString("status_bar_network_speed_dual_row_icon", none) != none) {
|
||||||
|
upIcon = XSPUtils.getString("status_bar_network_speed_dual_row_icon", none)?.firstOrNull().toString()
|
||||||
|
downIcon = XSPUtils.getString("status_bar_network_speed_dual_row_icon", none)?.lastOrNull().toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
findConstructor("com.android.systemui.statusbar.views.NetworkSpeedView") {
|
||||||
|
parameterCount == 2
|
||||||
|
}.hookAfter {
|
||||||
|
val mView = it.thisObject as TextView
|
||||||
|
mView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 7f)
|
||||||
|
if (getDualSize != 0) {
|
||||||
|
mView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, getDualSize.toFloat())
|
||||||
|
}
|
||||||
|
mView.isSingleLine = false
|
||||||
|
mView.setLineSpacing(0F, 0.8F)
|
||||||
|
if (getDualAlign == 0) {
|
||||||
|
mView.gravity = Gravity.START or Gravity.CENTER_VERTICAL
|
||||||
|
} else {
|
||||||
|
mView.gravity = Gravity.END or Gravity.CENTER_VERTICAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.statusbar.policy.NetworkSpeedController") {
|
||||||
|
name == "formatSpeed" && parameterCount == 2
|
||||||
|
}.hookBefore {
|
||||||
|
if (getDualAlign == 0) {
|
||||||
|
it.result = "$upIcon ${getTotalUpSpeed(it.args[0] as Context)}\n$downIcon ${
|
||||||
|
getTotalDownloadSpeed(it.args[0] as Context)
|
||||||
|
}"
|
||||||
|
} else {
|
||||||
|
it.result = "${getTotalUpSpeed(it.args[0] as Context)} $upIcon\n${
|
||||||
|
getTotalDownloadSpeed(it.args[0] as Context)
|
||||||
|
} $downIcon"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取总的上行速度
|
||||||
|
private fun getTotalUpSpeed(context: Context): String {
|
||||||
|
val totalUpSpeed: Float
|
||||||
|
|
||||||
|
val currentTotalTxBytes = TrafficStats.getTotalTxBytes()
|
||||||
|
val nowTimeStampTotalUp = System.currentTimeMillis()
|
||||||
|
|
||||||
|
//计算上传速度
|
||||||
|
val bytes = (currentTotalTxBytes - mLastTotalUp) * 1000 / (nowTimeStampTotalUp - lastTimeStampTotalUp).toFloat()
|
||||||
|
val unit: String
|
||||||
|
|
||||||
|
if (bytes >= 1048576) {
|
||||||
|
totalUpSpeed = DecimalFormat("0.0").format(bytes / 1048576).toFloat()
|
||||||
|
unit = context.resources.getString(context.resources.getIdentifier("megabyte_per_second", "string", context.packageName))
|
||||||
|
} else {
|
||||||
|
totalUpSpeed = DecimalFormat("0.0").format(bytes / 1024).toFloat()
|
||||||
|
unit = context.resources.getString(context.resources.getIdentifier("kilobyte_per_second", "string", context.packageName))
|
||||||
|
}
|
||||||
|
|
||||||
|
//保存当前的流量总和和上次的时间戳
|
||||||
|
mLastTotalUp = currentTotalTxBytes
|
||||||
|
lastTimeStampTotalUp = nowTimeStampTotalUp
|
||||||
|
|
||||||
|
return if (totalUpSpeed >= 100) {
|
||||||
|
"${totalUpSpeed.toInt()}$unit"
|
||||||
|
} else {
|
||||||
|
"${totalUpSpeed}$unit"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取总的下行速度
|
||||||
|
private fun getTotalDownloadSpeed(context: Context): String {
|
||||||
|
val totalDownSpeed: Float
|
||||||
|
val currentTotalRxBytes = TrafficStats.getTotalRxBytes()
|
||||||
|
val nowTimeStampTotalDown = System.currentTimeMillis()
|
||||||
|
|
||||||
|
//计算下行速度
|
||||||
|
val bytes = (currentTotalRxBytes - mLastTotalDown) * 1000 / (nowTimeStampTotalDown - lastTimeStampTotalDown).toFloat()
|
||||||
|
|
||||||
|
val unit: String
|
||||||
|
|
||||||
|
if (bytes >= 1048576) {
|
||||||
|
totalDownSpeed = DecimalFormat("0.0").format(bytes / 1048576).toFloat()
|
||||||
|
unit = context.resources.getString(context.resources.getIdentifier("megabyte_per_second", "string", context.packageName))
|
||||||
|
} else {
|
||||||
|
totalDownSpeed = DecimalFormat("0.0").format(bytes / 1024).toFloat()
|
||||||
|
unit = context.resources.getString(context.resources.getIdentifier("kilobyte_per_second", "string", context.packageName))
|
||||||
|
}
|
||||||
|
//保存当前的流量总和和上次的时间戳
|
||||||
|
mLastTotalDown = currentTotalRxBytes
|
||||||
|
lastTimeStampTotalDown = nowTimeStampTotalDown
|
||||||
|
|
||||||
|
return if (totalDownSpeed >= 100) {
|
||||||
|
"${totalDownSpeed.toInt()}$unit"
|
||||||
|
} else {
|
||||||
|
"${totalDownSpeed}$unit"
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.FrameLayout
|
||||||
|
import android.widget.ImageView
|
||||||
|
import android.widget.TextView
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.getObject
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.getObjectAs
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
object HideBatteryIconForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
findMethod("com.android.systemui.statusbar.views.MiuiBatteryMeterView") {
|
||||||
|
name == "updateResources"
|
||||||
|
}.hookAfter {
|
||||||
|
//隐藏电池图标
|
||||||
|
hasEnable("hide_battery_icon") {
|
||||||
|
(it.thisObject.getObjectAs<ImageView>("mBatteryIconView")).visibility = View.GONE
|
||||||
|
if (it.thisObject.getObject("mBatteryStyle") == 1) {
|
||||||
|
(it.thisObject.getObjectAs<FrameLayout>("mBatteryDigitalView")).visibility =
|
||||||
|
View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//隐藏电池内的百分比
|
||||||
|
hasEnable("hide_battery_percentage_icon") {
|
||||||
|
(it.thisObject.getObjectAs<TextView>("mBatteryPercentMarkView")).textSize = 0F
|
||||||
|
}
|
||||||
|
//隐藏电池百分号
|
||||||
|
hasEnable("hide_battery_percentage_icon") {
|
||||||
|
(it.thisObject.getObjectAs<TextView>("mBatteryPercentMarkView")).textSize = 0F
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.statusbar.views.MiuiBatteryMeterView") {
|
||||||
|
name == "updateChargeAndText"
|
||||||
|
}.hookAfter {
|
||||||
|
//隐藏电池充电图标
|
||||||
|
hasEnable("hide_battery_charging_icon") {
|
||||||
|
(it.thisObject.getObjectAs<ImageView>("mBatteryChargingInView")).visibility =
|
||||||
|
View.GONE
|
||||||
|
(it.thisObject.getObjectAs<ImageView>("mBatteryChargingView")).visibility =
|
||||||
|
View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.ImageView
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.*
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
import de.robv.android.xposed.XC_MethodHook
|
||||||
|
|
||||||
|
object HideHDIconForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.statusbar.StatusBarMobileView") {
|
||||||
|
name == "initViewState" && parameterCount == 1
|
||||||
|
}.hookAfter {
|
||||||
|
hide(it)
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.statusbar.StatusBarMobileView") {
|
||||||
|
name == "updateState" && parameterCount == 1
|
||||||
|
}.hookAfter {
|
||||||
|
hide(it)
|
||||||
|
}
|
||||||
|
hasEnable("hide_new_hd_icon") {
|
||||||
|
findMethod("com.android.systemui.statusbar.policy.HDController") { name == "update" }.hookBefore {
|
||||||
|
it.result = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hide(it: XC_MethodHook.MethodHookParam) {
|
||||||
|
hasEnable("hide_big_hd_icon") {
|
||||||
|
(it.thisObject.getObjectAs<ImageView>("mVolte")).visibility = View.GONE
|
||||||
|
}
|
||||||
|
hasEnable("hide_small_hd_icon") {
|
||||||
|
(it.thisObject.getObjectAs<ImageView>("mSmallHd")).visibility = View.GONE
|
||||||
|
}
|
||||||
|
hasEnable("hide_hd_no_service_icon") {
|
||||||
|
(it.thisObject.getObjectAs<ImageView>("mVolteNoService")).visibility = View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.ImageView
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.getObjectAs
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
import de.robv.android.xposed.XC_MethodHook
|
||||||
|
|
||||||
|
object HideMobileActivityIconForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
findMethod("com.android.systemui.statusbar.StatusBarMobileView") {
|
||||||
|
name == "initViewState" && parameterCount == 1
|
||||||
|
}.hookAfter {
|
||||||
|
hide(it)
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.statusbar.StatusBarMobileView") {
|
||||||
|
name == "updateState" && parameterCount == 1
|
||||||
|
}.hookAfter {
|
||||||
|
hide(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hide(it: XC_MethodHook.MethodHookParam) {
|
||||||
|
hasEnable("hide_mobile_activity_icon") {
|
||||||
|
(it.thisObject.getObjectAs<ImageView>("mLeftInOut")).visibility = View.GONE
|
||||||
|
(it.thisObject.getObjectAs<ImageView>("mRightInOut")).visibility = View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.ImageView
|
||||||
|
import android.widget.TextView
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.getObjectAs
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||||
|
import com.lt2333.simplicitytools.utils.XSPUtils
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
import de.robv.android.xposed.XC_MethodHook
|
||||||
|
|
||||||
|
object HideMobileTypeIconForT : HookRegister() {
|
||||||
|
|
||||||
|
private val isBigType = XSPUtils.getBoolean("big_mobile_type_icon", false)
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
findMethod("com.android.systemui.statusbar.StatusBarMobileView") {
|
||||||
|
name == "initViewState" && parameterCount == 1
|
||||||
|
}.hookAfter {
|
||||||
|
hideMobileTypeIcon(it)
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.statusbar.StatusBarMobileView") {
|
||||||
|
name == "updateState" && parameterCount == 1
|
||||||
|
}.hookAfter {
|
||||||
|
hideMobileTypeIcon(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hideMobileTypeIcon(it: XC_MethodHook.MethodHookParam) {
|
||||||
|
hasEnable("hide_mobile_type_icon") {
|
||||||
|
if (isBigType) {
|
||||||
|
(it.thisObject.getObjectAs<TextView>("mMobileType")).visibility =
|
||||||
|
View.GONE
|
||||||
|
(it.thisObject.getObjectAs<ImageView>("mMobileTypeImage")).visibility =
|
||||||
|
View.GONE
|
||||||
|
(it.thisObject.getObjectAs<TextView>("mMobileTypeSingle")).visibility =
|
||||||
|
View.GONE
|
||||||
|
} else {
|
||||||
|
(it.thisObject.getObjectAs<TextView>("mMobileType")).visibility =
|
||||||
|
View.INVISIBLE
|
||||||
|
(it.thisObject.getObjectAs<ImageView>("mMobileTypeImage")).visibility =
|
||||||
|
View.INVISIBLE
|
||||||
|
(it.thisObject.getObjectAs<TextView>("mMobileTypeSingle")).visibility =
|
||||||
|
View.INVISIBLE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.widget.TextView
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
object HideNetworkSpeedSplitterForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
findMethod("com.android.systemui.statusbar.views.NetworkSpeedSplitter") {
|
||||||
|
name == "init"
|
||||||
|
}.hookAfter {
|
||||||
|
hasEnable("hide_network_speed_splitter") {
|
||||||
|
val textView = it.thisObject as TextView
|
||||||
|
textView.text = " "
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
object HideSimIconForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.StatusBarSignalPolicy") {
|
||||||
|
name == "hasCorrectSubs" && parameterTypes[0] == MutableList::class.java
|
||||||
|
}.hookBefore {
|
||||||
|
val list = it.args[0] as MutableList<*>
|
||||||
|
val size = list.size
|
||||||
|
hasEnable("hide_sim_two_icon", extraCondition = { size == 2 }) {
|
||||||
|
list.removeAt(1)
|
||||||
|
}
|
||||||
|
hasEnable("hide_sim_one_icon", extraCondition = { size >= 1 }) {
|
||||||
|
list.removeAt(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
import de.robv.android.xposed.XC_MethodHook
|
||||||
|
|
||||||
|
object HideStatusBarIconForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.StatusBarIconControllerImpl") {
|
||||||
|
name == "setIconVisibility" && parameterCount == 2
|
||||||
|
}.hookBefore {
|
||||||
|
hideIcon(it)
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.MiuiDripLeftStatusBarIconControllerImpl") {
|
||||||
|
name == "setIconVisibility" && parameterCount == 2
|
||||||
|
}.hookBefore {
|
||||||
|
hideIcon(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hideIcon(it: XC_MethodHook.MethodHookParam) {
|
||||||
|
//Log.d("图标名字", "handleLoadPackage: " + it.args[0])
|
||||||
|
when (it.args[0] as String) {
|
||||||
|
//隐藏蓝牙
|
||||||
|
"bluetooth" -> hasEnable("hide_bluetooth_icon") {
|
||||||
|
it.args[1] = false
|
||||||
|
}
|
||||||
|
//隐藏蓝牙电量
|
||||||
|
"bluetooth_handsfree_battery" -> hasEnable("hide_bluetooth_battery_icon") {
|
||||||
|
it.args[1] = false
|
||||||
|
}
|
||||||
|
//隐藏勿扰
|
||||||
|
"zen" -> hasEnable("hide_zen_icon") {
|
||||||
|
it.args[1] = false
|
||||||
|
}
|
||||||
|
//隐藏声音
|
||||||
|
"volume" -> hasEnable("hide_volume_icon") {
|
||||||
|
it.args[1] = false
|
||||||
|
}
|
||||||
|
//隐藏WIFI
|
||||||
|
"wifi" -> hasEnable("hide_wifi_icon") {
|
||||||
|
it.args[1] = false
|
||||||
|
}
|
||||||
|
//隐藏WIFI辅助
|
||||||
|
"slave_wifi" -> hasEnable("hide_slave_wifi_icon") {
|
||||||
|
it.args[1] = false
|
||||||
|
}
|
||||||
|
//隐藏飞行模式
|
||||||
|
"airplane" -> hasEnable("hide_airplane_icon") {
|
||||||
|
it.args[1] = false
|
||||||
|
}
|
||||||
|
//隐藏闹钟
|
||||||
|
"alarm_clock" -> hasEnable("hide_alarm_icon") {
|
||||||
|
it.args[1] = false
|
||||||
|
}
|
||||||
|
//隐藏定位
|
||||||
|
"location" -> hasEnable("hide_gps_icon") {
|
||||||
|
it.args[1] = false
|
||||||
|
}
|
||||||
|
//隐藏热点
|
||||||
|
"hotspot" -> hasEnable("hide_hotspot_icon") {
|
||||||
|
it.args[1] = false
|
||||||
|
}
|
||||||
|
//隐藏耳机
|
||||||
|
"headset" -> hasEnable("hide_headset_icon") {
|
||||||
|
it.args[1] = false
|
||||||
|
}
|
||||||
|
//隐藏VPN
|
||||||
|
"vpn" -> hasEnable("hide_vpn_icon") {
|
||||||
|
it.args[1] = false
|
||||||
|
}
|
||||||
|
//隐藏无SIM卡
|
||||||
|
"no_sim" -> hasEnable("hide_no_sim_icon") {
|
||||||
|
it.args[1] = false
|
||||||
|
}
|
||||||
|
//隐藏NFC图标
|
||||||
|
"nfc" -> hasEnable("hide_nfc_icon") {
|
||||||
|
it.args[1] = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
object HideStatusBarNetworkSpeedSecondForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
findMethod("com.android.systemui.statusbar.views.NetworkSpeedView") {
|
||||||
|
name == "setNetworkSpeed" && parameterCount == 1
|
||||||
|
}.hookBefore {
|
||||||
|
hasEnable("hide_status_bar_network_speed_second") {
|
||||||
|
if (it.args[0] != null) {
|
||||||
|
val mText = (it.args[0] as String)
|
||||||
|
.replace("/", "")
|
||||||
|
.replace("s", "")
|
||||||
|
.replace("\'", "")
|
||||||
|
.replace("วิ", "")
|
||||||
|
it.args[0] = mText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.ImageView
|
||||||
|
import android.widget.TextView
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.getObjectAs
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
import de.robv.android.xposed.XC_MethodHook
|
||||||
|
|
||||||
|
object HideWifiActivityIconForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
findMethod("com.android.systemui.statusbar.StatusBarWifiView") {
|
||||||
|
name == "initViewState" && parameterCount == 1
|
||||||
|
}.hookAfter {
|
||||||
|
hide(it)
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.statusbar.StatusBarWifiView") {
|
||||||
|
name == "updateState" && parameterCount == 1
|
||||||
|
}.hookAfter {
|
||||||
|
hide(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hide(it: XC_MethodHook.MethodHookParam) {
|
||||||
|
//隐藏WIFI箭头
|
||||||
|
hasEnable("hide_wifi_activity_icon") {
|
||||||
|
(it.thisObject.getObjectAs<ImageView>("mWifiActivityView")).visibility =
|
||||||
|
View.INVISIBLE
|
||||||
|
}
|
||||||
|
//隐藏WIFI标准图标
|
||||||
|
hasEnable("hide_wifi_standard_icon") {
|
||||||
|
(it.thisObject.getObjectAs<TextView>("mWifiStandardView")).visibility =
|
||||||
|
View.INVISIBLE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.Handler
|
||||||
|
import android.provider.Settings
|
||||||
|
import android.util.Log
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import android.widget.TextView
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.*
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
import de.robv.android.xposed.XC_MethodHook
|
||||||
|
import java.lang.reflect.Method
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
object LockScreenClockDisplaySecondsForT : HookRegister() {
|
||||||
|
|
||||||
|
private var nowTime: Date = Calendar.getInstance().time
|
||||||
|
|
||||||
|
override fun init() = hasEnable("lock_screen_clock_display_seconds") {
|
||||||
|
findConstructor("com.miui.clock.MiuiBaseClock") {
|
||||||
|
paramCount == 2
|
||||||
|
}.hookAfter {
|
||||||
|
try {
|
||||||
|
val viewGroup = it.thisObject as LinearLayout
|
||||||
|
val d: Method = viewGroup.javaClass.getDeclaredMethod("updateTime")
|
||||||
|
val r = Runnable {
|
||||||
|
d.isAccessible = true
|
||||||
|
d.invoke(viewGroup)
|
||||||
|
}
|
||||||
|
|
||||||
|
class T : TimerTask() {
|
||||||
|
override fun run() {
|
||||||
|
Handler(viewGroup.context.mainLooper).post(r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Timer().scheduleAtFixedRate(T(), 1000 - System.currentTimeMillis() % 1000, 1000)
|
||||||
|
} catch (_: Exception) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.miui.clock.MiuiLeftTopClock") {
|
||||||
|
name == "updateTime"
|
||||||
|
}.hookAfter { updateTime(it, false) }
|
||||||
|
|
||||||
|
findMethod("com.miui.clock.MiuiCenterHorizontalClock") {
|
||||||
|
name == "updateTime"
|
||||||
|
}.hookAfter { updateTime(it, false) }
|
||||||
|
|
||||||
|
findMethod("com.miui.clock.MiuiLeftTopLargeClock") {
|
||||||
|
name == "updateTime"
|
||||||
|
}.hookAfter { updateTime(it, false) }
|
||||||
|
|
||||||
|
findMethod("com.miui.clock.MiuiVerticalClock") {
|
||||||
|
name == "updateTime"
|
||||||
|
}.hookAfter { updateTime(it, true) }
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateTime(it: XC_MethodHook.MethodHookParam, isVertical: Boolean) {
|
||||||
|
val textV = it.thisObject.getObjectAs<TextView>("mTimeText")
|
||||||
|
val c: Context = textV.context
|
||||||
|
|
||||||
|
Log.d("lock_screen_clock_display_seconds", "updateTime: ${it.thisObject.javaClass.simpleName}")
|
||||||
|
val is24 = Settings.System.getString(c.contentResolver, Settings.System.TIME_12_24) == "24"
|
||||||
|
|
||||||
|
nowTime = Calendar.getInstance().time
|
||||||
|
|
||||||
|
textV.text = getTime(is24, isVertical)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressLint("SimpleDateFormat")
|
||||||
|
private fun getTime(is24: Boolean, isVertical: Boolean): String {
|
||||||
|
var timePattern = ""
|
||||||
|
timePattern += if (isVertical) { //垂直
|
||||||
|
if (is24) "HH\nmm\nss" else "hh\nmm\nss"
|
||||||
|
} else { //水平
|
||||||
|
if (is24) "HH:mm:ss" else "h:mm:ss"
|
||||||
|
}
|
||||||
|
timePattern = SimpleDateFormat(timePattern).format(nowTime)
|
||||||
|
return timePattern
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
|
||||||
|
import android.app.AndroidAppHelper
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.BatteryManager
|
||||||
|
import android.widget.TextView
|
||||||
|
import com.github.kyuubiran.ezxhelper.init.InitFields
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.getObject
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||||
|
import com.lt2333.simplicitytools.R
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
import java.io.BufferedReader
|
||||||
|
import java.io.FileReader
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
|
object LockScreenCurrentForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() = hasEnable("lock_screen_charging_current") {
|
||||||
|
findMethod("com.android.keyguard.charge.ChargeUtils") {
|
||||||
|
name == "getChargingHintText" && parameterCount == 3
|
||||||
|
}.hookAfter {
|
||||||
|
it.result = "${getCurrent()}\n${it.result}"
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.KeyguardBottomAreaView") {
|
||||||
|
name == "onFinishInflate"
|
||||||
|
}.hookAfter {
|
||||||
|
(it.thisObject.getObject("mIndicationText") as TextView).isSingleLine = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private fun getCurrent(): String {
|
||||||
|
val batteryManager = AndroidAppHelper.currentApplication().getSystemService(Context.BATTERY_SERVICE) as BatteryManager
|
||||||
|
val current = abs(batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW) / 1000)
|
||||||
|
return "${InitFields.moduleRes.getString(R.string.current_current)} ${current}mA"
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取平均电流值
|
||||||
|
* 获取 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 (_: java.lang.Exception) {
|
||||||
|
}
|
||||||
|
return defaultValue
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.app.KeyguardManager
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.SystemClock
|
||||||
|
import android.view.MotionEvent
|
||||||
|
import android.view.View
|
||||||
|
import android.view.View.OnTouchListener
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
import de.robv.android.xposed.XposedHelpers
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
|
object LockScreenDoubleTapToSleepForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() = hasEnable("lock_screen_double_tap_to_sleep") {
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer") {
|
||||||
|
name == "onFinishInflate"
|
||||||
|
}.hookBefore {
|
||||||
|
val view = it.thisObject as View
|
||||||
|
XposedHelpers.setAdditionalInstanceField(view, "currentTouchTime", 0L)
|
||||||
|
XposedHelpers.setAdditionalInstanceField(view, "currentTouchX", 0f)
|
||||||
|
XposedHelpers.setAdditionalInstanceField(view, "currentTouchY", 0f)
|
||||||
|
view.setOnTouchListener(OnTouchListener { v, event ->
|
||||||
|
if (event.action != MotionEvent.ACTION_DOWN) return@OnTouchListener false
|
||||||
|
var currentTouchTime =
|
||||||
|
XposedHelpers.getAdditionalInstanceField(view, "currentTouchTime") as Long
|
||||||
|
var currentTouchX =
|
||||||
|
XposedHelpers.getAdditionalInstanceField(view, "currentTouchX") as Float
|
||||||
|
var currentTouchY =
|
||||||
|
XposedHelpers.getAdditionalInstanceField(view, "currentTouchY") as Float
|
||||||
|
val lastTouchTime = currentTouchTime
|
||||||
|
val lastTouchX = currentTouchX
|
||||||
|
val lastTouchY = currentTouchY
|
||||||
|
currentTouchTime = System.currentTimeMillis()
|
||||||
|
currentTouchX = event.x
|
||||||
|
currentTouchY = event.y
|
||||||
|
if (currentTouchTime - lastTouchTime < 250L && abs(currentTouchX - lastTouchX) < 100f && abs(
|
||||||
|
currentTouchY - lastTouchY
|
||||||
|
) < 100f
|
||||||
|
) {
|
||||||
|
val keyguardMgr =
|
||||||
|
v.context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
|
||||||
|
if (keyguardMgr.isKeyguardLocked) {
|
||||||
|
XposedHelpers.callMethod(
|
||||||
|
v.context.getSystemService(Context.POWER_SERVICE),
|
||||||
|
"goToSleep",
|
||||||
|
SystemClock.uptimeMillis()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
currentTouchTime = 0L
|
||||||
|
currentTouchX = 0f
|
||||||
|
currentTouchY = 0f
|
||||||
|
}
|
||||||
|
XposedHelpers.setAdditionalInstanceField(
|
||||||
|
view,
|
||||||
|
"currentTouchTime",
|
||||||
|
currentTouchTime
|
||||||
|
)
|
||||||
|
XposedHelpers.setAdditionalInstanceField(view, "currentTouchX", currentTouchX)
|
||||||
|
XposedHelpers.setAdditionalInstanceField(view, "currentTouchY", currentTouchY)
|
||||||
|
v.performClick()
|
||||||
|
false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookReplace
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.invokeMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.putObject
|
||||||
|
import com.lt2333.simplicitytools.utils.XSPUtils
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
object MaximumNumberOfNotificationIconsForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
val icons = XSPUtils.getInt("maximum_number_of_notification_icons", 3)
|
||||||
|
val dots = XSPUtils.getInt("maximum_number_of_notification_dots", 3)
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.NotificationIconContainer") {
|
||||||
|
name == "miuiShowNotificationIcons" && parameterCount == 1
|
||||||
|
}.hookReplace {
|
||||||
|
if (it.args[0] as Boolean) {
|
||||||
|
it.thisObject.putObject("MAX_DOTS", dots)
|
||||||
|
it.thisObject.putObject("MAX_STATIC_ICONS", icons)
|
||||||
|
it.thisObject.putObject("MAX_VISIBLE_ICONS_ON_LOCK", icons)
|
||||||
|
} else {
|
||||||
|
it.thisObject.putObject("MAX_DOTS", 0)
|
||||||
|
it.thisObject.putObject("MAX_STATIC_ICONS", 0)
|
||||||
|
it.thisObject.putObject("MAX_VISIBLE_ICONS_ON_LOCK", 0)
|
||||||
|
}
|
||||||
|
it.thisObject.invokeMethod("updateState")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.pm.ApplicationInfo
|
||||||
|
import android.widget.TextView
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.*
|
||||||
|
import com.lt2333.simplicitytools.utils.XSPUtils
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
import com.lt2333.simplicitytools.views.WeatherData
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressLint("StaticFieldLeak")
|
||||||
|
object NewNotificationWeatherForT : HookRegister() {
|
||||||
|
// TODO: Android13控制中心天气不可用
|
||||||
|
lateinit var weather: WeatherData
|
||||||
|
var clockId: Int = -2
|
||||||
|
|
||||||
|
@SuppressLint("DiscouragedApi", "ClickableViewAccessibility")
|
||||||
|
override fun init() = hasEnable("control_center_weather") {
|
||||||
|
val isDisplayCity = XSPUtils.getBoolean("notification_weather_city", false)
|
||||||
|
findMethod("com.android.systemui.controlcenter.phone.widget.ControlCenterDateView", findSuper = true) { name == "onDetachedFromWindow" }.hookBefore {
|
||||||
|
if ((it.thisObject as TextView).id == clockId && this::weather.isInitialized) {
|
||||||
|
weather.onDetachedFromWindow()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
findMethod("com.android.systemui.controlcenter.phone.widget.ControlCenterDateView", findSuper = true) { name == "setText" }.hookBefore {
|
||||||
|
val time = it.args[0]?.toString()
|
||||||
|
val view = it.thisObject as TextView
|
||||||
|
if (view.id == clockId && time != null && this::weather.isInitialized) {
|
||||||
|
// val layout = view.layoutParams as ViewGroup.MarginLayoutParams
|
||||||
|
// val y = view.height / 2
|
||||||
|
// layout.topMargin = -y
|
||||||
|
it.args[0] = "${weather.weatherData}$time"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.shared.plugins.PluginManagerImpl") { name == "getClassLoader" }.hookAfter { getClassLoader ->
|
||||||
|
val appInfo = getClassLoader.args[0] as ApplicationInfo
|
||||||
|
val classLoader = getClassLoader.result as ClassLoader
|
||||||
|
if (appInfo.packageName == "miui.systemui.plugin") {
|
||||||
|
findMethod("miui.systemui.controlcenter.windowview.MainPanelHeaderController", classLoader = classLoader) { name == "addClockViews" }.hookAfter {
|
||||||
|
val dateView = it.thisObject.getObjectAs<TextView>("dateView")
|
||||||
|
clockId = dateView.id
|
||||||
|
weather = WeatherData(dateView.context, isDisplayCity)
|
||||||
|
weather.callBacks = {
|
||||||
|
dateView.invokeMethod("updateTime")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,201 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.content.ComponentName
|
||||||
|
import android.content.Intent
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import android.widget.TextView
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
import cn.fkj233.ui.activity.dp2px
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.*
|
||||||
|
import com.lt2333.simplicitytools.utils.SystemProperties
|
||||||
|
import com.lt2333.simplicitytools.utils.XSPUtils
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
import com.lt2333.simplicitytools.views.WeatherView
|
||||||
|
|
||||||
|
object NotificationWeatherForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() = hasEnable("notification_weather") {
|
||||||
|
var mWeatherView: TextView? = null
|
||||||
|
var mConstraintLayout: ConstraintLayout? = null
|
||||||
|
val isDisplayCity = XSPUtils.getBoolean("notification_weather_city", false)
|
||||||
|
findMethod("com.android.systemui.qs.MiuiNotificationHeaderView") {
|
||||||
|
name == "onFinishInflate"
|
||||||
|
}.hookAfter { param ->
|
||||||
|
val viewGroup = param.thisObject as ViewGroup
|
||||||
|
val context = viewGroup.context
|
||||||
|
|
||||||
|
// MIUI编译时间大于 2022-03-12 00:00:00 且为内测版
|
||||||
|
if (SystemProperties[context, "ro.build.date.utc"].toInt() >= 1647014400 &&
|
||||||
|
!SystemProperties[context, "ro.build.version.incremental"].endsWith("XM")
|
||||||
|
) {
|
||||||
|
//获取原组件
|
||||||
|
val bigTimeId =
|
||||||
|
context.resources.getIdentifier("big_time", "id", context.packageName)
|
||||||
|
val bigTime: TextView = viewGroup.findViewById(bigTimeId)
|
||||||
|
|
||||||
|
val dateTimeId =
|
||||||
|
context.resources.getIdentifier("date_time", "id", context.packageName)
|
||||||
|
val dateTime: TextView = viewGroup.findViewById(dateTimeId)
|
||||||
|
|
||||||
|
//创建新布局
|
||||||
|
val mConstraintLayoutLp = LinearLayout.LayoutParams(
|
||||||
|
LinearLayout.LayoutParams.MATCH_PARENT,
|
||||||
|
LinearLayout.LayoutParams.WRAP_CONTENT
|
||||||
|
).also {
|
||||||
|
it.topMargin = context.resources.getDimensionPixelSize(
|
||||||
|
context.resources.getIdentifier(
|
||||||
|
"qs_control_header_tiles_margin_top",
|
||||||
|
"dimen",
|
||||||
|
context.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
mConstraintLayout =
|
||||||
|
ConstraintLayout(context).also { it.layoutParams = mConstraintLayoutLp }
|
||||||
|
|
||||||
|
(bigTime.parent as ViewGroup).addView(mConstraintLayout, 0)
|
||||||
|
|
||||||
|
|
||||||
|
//从原布局中删除组件
|
||||||
|
(bigTime.parent as ViewGroup).removeView(bigTime)
|
||||||
|
(dateTime.parent as ViewGroup).removeView(dateTime)
|
||||||
|
|
||||||
|
|
||||||
|
//添加组件至新布局
|
||||||
|
mConstraintLayout!!.addView(bigTime)
|
||||||
|
mConstraintLayout!!.addView(dateTime)
|
||||||
|
|
||||||
|
//组件属性
|
||||||
|
|
||||||
|
val dateTimeLp = ConstraintLayout.LayoutParams(
|
||||||
|
ConstraintLayout.LayoutParams.WRAP_CONTENT,
|
||||||
|
ConstraintLayout.LayoutParams.WRAP_CONTENT
|
||||||
|
).also {
|
||||||
|
it.startToEnd = bigTimeId
|
||||||
|
it.bottomToBottom = 0
|
||||||
|
it.marginStart = context.resources.getDimensionPixelSize(
|
||||||
|
context.resources.getIdentifier(
|
||||||
|
"notification_panel_time_date_space",
|
||||||
|
"dimen",
|
||||||
|
context.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
it.bottomMargin = dp2px(context, 5f)
|
||||||
|
}
|
||||||
|
dateTime.layoutParams = dateTimeLp
|
||||||
|
|
||||||
|
|
||||||
|
//创建天气组件
|
||||||
|
mWeatherView = WeatherView(context, isDisplayCity).apply {
|
||||||
|
setTextAppearance(
|
||||||
|
context.resources.getIdentifier(
|
||||||
|
"TextAppearance.QSControl.Date",
|
||||||
|
"style",
|
||||||
|
context.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
}
|
||||||
|
mConstraintLayout!!.addView(mWeatherView)
|
||||||
|
|
||||||
|
val mweatherviewLp = ConstraintLayout.LayoutParams(
|
||||||
|
ConstraintLayout.LayoutParams.WRAP_CONTENT,
|
||||||
|
ConstraintLayout.LayoutParams.WRAP_CONTENT
|
||||||
|
).also {
|
||||||
|
it.startToEnd = bigTimeId
|
||||||
|
it.bottomToTop = dateTimeId
|
||||||
|
it.marginStart = context.resources.getDimensionPixelSize(
|
||||||
|
context.resources.getIdentifier(
|
||||||
|
"notification_panel_time_date_space",
|
||||||
|
"dimen",
|
||||||
|
context.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
(mWeatherView as WeatherView).layoutParams = mweatherviewLp
|
||||||
|
|
||||||
|
} else {
|
||||||
|
val layoutParam =
|
||||||
|
loadClass("androidx.constraintlayout.widget.ConstraintLayout\$LayoutParams").getConstructor(
|
||||||
|
Int::class.java,
|
||||||
|
Int::class.java
|
||||||
|
).newInstance(
|
||||||
|
ViewGroup.LayoutParams.WRAP_CONTENT,
|
||||||
|
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||||
|
) as ViewGroup.MarginLayoutParams
|
||||||
|
layoutParam.putObject(
|
||||||
|
"bottomToTop",
|
||||||
|
context.resources.getIdentifier("date_time", "id", context.packageName)
|
||||||
|
)
|
||||||
|
layoutParam.putObject(
|
||||||
|
"startToEnd",
|
||||||
|
context.resources.getIdentifier("big_time", "id", context.packageName)
|
||||||
|
)
|
||||||
|
layoutParam.marginStart = context.resources.getDimensionPixelSize(
|
||||||
|
context.resources.getIdentifier(
|
||||||
|
"notification_panel_time_date_space",
|
||||||
|
"dimen",
|
||||||
|
context.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
mWeatherView = WeatherView(context, isDisplayCity).apply {
|
||||||
|
setTextAppearance(
|
||||||
|
context.resources.getIdentifier(
|
||||||
|
"TextAppearance.QSControl.Date",
|
||||||
|
"style",
|
||||||
|
context.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
layoutParams = layoutParam
|
||||||
|
}
|
||||||
|
viewGroup.addView(mWeatherView)
|
||||||
|
}
|
||||||
|
|
||||||
|
(mWeatherView as WeatherView).setOnClickListener {
|
||||||
|
try {
|
||||||
|
val intent = Intent().apply {
|
||||||
|
flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
||||||
|
component = ComponentName(
|
||||||
|
"com.miui.weather2",
|
||||||
|
"com.miui.weather2.ActivityWeatherMain"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
context.startActivity(intent)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Toast.makeText(context, "启动失败", Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.qs.MiuiNotificationHeaderView") {
|
||||||
|
name == "updateLayout"
|
||||||
|
}.hookAfter {
|
||||||
|
val viewGroup = it.thisObject as ViewGroup
|
||||||
|
val context = viewGroup.context
|
||||||
|
val mOrientation = viewGroup.getObject("mOrientation") as Int
|
||||||
|
// MIUI编译时间大于 2022-03-12 00:00:00 且为内测版
|
||||||
|
if (SystemProperties[context, "ro.build.date.utc"]!!.toInt() >= 1647014400 && !SystemProperties[context, "ro.build.version.incremental"]!!.endsWith(
|
||||||
|
"DEV"
|
||||||
|
) && !SystemProperties[context, "ro.build.version.incremental"]!!.endsWith("XM")
|
||||||
|
) {
|
||||||
|
if (mOrientation == 1) {
|
||||||
|
mConstraintLayout!!.visibility = View.VISIBLE
|
||||||
|
} else {
|
||||||
|
mConstraintLayout!!.visibility = View.GONE
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (mOrientation == 1) {
|
||||||
|
mWeatherView!!.visibility = View.VISIBLE
|
||||||
|
} else {
|
||||||
|
mWeatherView!!.visibility = View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.content.ComponentName
|
||||||
|
import android.content.Intent
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.TextView
|
||||||
|
import android.widget.Toast
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.*
|
||||||
|
import com.lt2333.simplicitytools.utils.XSPUtils
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
import com.lt2333.simplicitytools.views.WeatherView
|
||||||
|
|
||||||
|
object OldNotificationWeatherForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() = hasEnable("notification_weather") {
|
||||||
|
var mWeatherView: TextView? = null
|
||||||
|
val isDisplayCity = XSPUtils.getBoolean("notification_weather_city", false)
|
||||||
|
findMethod("com.android.systemui.qs.MiuiQSHeaderView") {
|
||||||
|
name == "onFinishInflate"
|
||||||
|
}.hookAfter {
|
||||||
|
val viewGroup = it.thisObject as ViewGroup
|
||||||
|
val context = viewGroup.context
|
||||||
|
val layoutParam =
|
||||||
|
loadClass("androidx.constraintlayout.widget.ConstraintLayout\$LayoutParams")
|
||||||
|
.getConstructor(Int::class.java, Int::class.java)
|
||||||
|
.newInstance(
|
||||||
|
ViewGroup.LayoutParams.WRAP_CONTENT,
|
||||||
|
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||||
|
) as ViewGroup.MarginLayoutParams
|
||||||
|
|
||||||
|
layoutParam.putObject(
|
||||||
|
"endToStart",
|
||||||
|
context.resources.getIdentifier(
|
||||||
|
"notification_shade_shortcut",
|
||||||
|
"id",
|
||||||
|
context.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
layoutParam.putObject(
|
||||||
|
"topToTop",
|
||||||
|
context.resources.getIdentifier(
|
||||||
|
"notification_shade_shortcut",
|
||||||
|
"id",
|
||||||
|
context.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
layoutParam.putObject(
|
||||||
|
"bottomToBottom",
|
||||||
|
context.resources.getIdentifier(
|
||||||
|
"notification_shade_shortcut",
|
||||||
|
"id",
|
||||||
|
context.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
mWeatherView = WeatherView(context, isDisplayCity).apply {
|
||||||
|
setTextAppearance(
|
||||||
|
context.resources.getIdentifier(
|
||||||
|
"TextAppearance.StatusBar.Expanded.Clock.QuickSettingDate",
|
||||||
|
"style",
|
||||||
|
context.packageName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
layoutParams = layoutParam
|
||||||
|
}
|
||||||
|
viewGroup.addView(mWeatherView)
|
||||||
|
(mWeatherView as WeatherView).setOnClickListener {
|
||||||
|
try {
|
||||||
|
val intent = Intent().apply {
|
||||||
|
flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
||||||
|
component = ComponentName(
|
||||||
|
"com.miui.weather2",
|
||||||
|
"com.miui.weather2.ActivityWeatherMain"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
context.startActivity(intent)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Toast.makeText(context, "启动失败,可能是不支持", Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//解决横屏重叠
|
||||||
|
findMethod("com.android.systemui.qs.MiuiQSHeaderView") {
|
||||||
|
name == "updateLayout"
|
||||||
|
}.hookAfter {
|
||||||
|
val mOritation = it.thisObject.getObject("mOrientation") as Int
|
||||||
|
if (mOritation == 1) {
|
||||||
|
mWeatherView!!.visibility = View.VISIBLE
|
||||||
|
} else {
|
||||||
|
mWeatherView!!.visibility = View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.putObject
|
||||||
|
import com.lt2333.simplicitytools.utils.XSPUtils
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
object OldQSCustomForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() = hasEnable("old_qs_custom_switch") {
|
||||||
|
val mRows = XSPUtils.getInt("qs_custom_rows", 3)
|
||||||
|
val mRowsHorizontal = XSPUtils.getInt("qs_custom_rows_horizontal", 2)
|
||||||
|
val mColumns = XSPUtils.getInt("qs_custom_columns", 4)
|
||||||
|
val mColumnsUnexpanded = XSPUtils.getInt("qs_custom_columns_unexpanded", 5)
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.qs.MiuiQuickQSPanel") {
|
||||||
|
name == "setMaxTiles" && parameterCount == 1
|
||||||
|
}.hookBefore {
|
||||||
|
//未展开时的列数
|
||||||
|
it.args[0] = mColumnsUnexpanded
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.qs.MiuiTileLayout") {
|
||||||
|
name == "updateColumns"
|
||||||
|
}.hookAfter {
|
||||||
|
//展开时的列数
|
||||||
|
it.thisObject.putObject("mColumns", mColumns)
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.qs.MiuiTileLayout") {
|
||||||
|
name == "updateResources"
|
||||||
|
}.hookAfter {
|
||||||
|
//展开时的行数
|
||||||
|
val viewGroup = it.thisObject as ViewGroup
|
||||||
|
val mConfiguration: Configuration = viewGroup.context.resources.configuration
|
||||||
|
if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) {
|
||||||
|
viewGroup.putObject("mMaxAllowedRows", mRows)
|
||||||
|
} else {
|
||||||
|
viewGroup.putObject("mMaxAllowedRows", mRowsHorizontal)
|
||||||
|
}
|
||||||
|
viewGroup.requestLayout()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.getObject
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
object RemoveLockScreenCameraForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
//屏蔽右下角组件显示
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.KeyguardBottomAreaView") {
|
||||||
|
name == "onFinishInflate"
|
||||||
|
}.hookAfter {
|
||||||
|
hasEnable("remove_lock_screen_camera") {
|
||||||
|
(it.thisObject.getObject("mRightAffordanceViewLayout") as LinearLayout).visibility =
|
||||||
|
View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//屏蔽滑动撞墙动画
|
||||||
|
findMethod("com.android.keyguard.KeyguardMoveRightController") {
|
||||||
|
name == "onTouchMove" && parameterCount == 2
|
||||||
|
}.hookBefore {
|
||||||
|
hasEnable("remove_lock_screen_camera") {
|
||||||
|
it.result = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
findMethod("com.android.keyguard.KeyguardMoveRightController") {
|
||||||
|
name == "reset"
|
||||||
|
}.hookBefore {
|
||||||
|
hasEnable("remove_lock_screen_camera") {
|
||||||
|
it.result = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
object RemoveTheLeftSideOfTheLockScreenForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
findMethod("com.android.keyguard.negative.MiuiKeyguardMoveLeftViewContainer") {
|
||||||
|
name == "inflateLeftView"
|
||||||
|
}.hookBefore {
|
||||||
|
hasEnable("remove_the_left_side_of_the_lock_screen") {
|
||||||
|
it.result = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.getObjectAs
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.putObject
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
object ShowWifiStandardForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
findMethod("com.android.systemui.statusbar.StatusBarWifiView") {
|
||||||
|
name == "initViewState" && parameterCount == 1
|
||||||
|
}.hookBefore {
|
||||||
|
hasEnable("show_wifi_standard") {
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.StatusBarSignalPolicy\$WifiIconState") {
|
||||||
|
name == "copyTo" && parameterCount == 1
|
||||||
|
}.hookBefore {
|
||||||
|
val wifiStandard = it.thisObject.getObjectAs<Int>("wifiStandard")
|
||||||
|
it.thisObject.putObject("showWifiStandard", wifiStandard != 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.statusbar.StatusBarWifiView") {
|
||||||
|
name == "updateState" && parameterCount == 1
|
||||||
|
}.hookBefore {
|
||||||
|
hasEnable("show_wifi_standard") {
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.StatusBarSignalPolicy\$WifiIconState") {
|
||||||
|
name == "copyTo" && parameterCount == 1
|
||||||
|
}.hookBefore {
|
||||||
|
val wifiStandard = it.thisObject.getObjectAs<Int>("wifiStandard")
|
||||||
|
it.thisObject.putObject("showWifiStandard", wifiStandard != 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,124 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.res.Resources
|
||||||
|
import android.graphics.Typeface
|
||||||
|
import android.util.TypedValue
|
||||||
|
import android.view.Gravity
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.ImageView
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import android.widget.TextView
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookReturnConstant
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.putObject
|
||||||
|
import com.lt2333.simplicitytools.utils.XSPUtils
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
|
||||||
|
object StatusBarBigMobileTypeIconForT : HookRegister() {
|
||||||
|
|
||||||
|
private val upAndDownPosition = XSPUtils.getInt("big_mobile_type_icon_up_and_down_position", 0)
|
||||||
|
private val leftAndRightMargin =
|
||||||
|
XSPUtils.getInt("big_mobile_type_icon_left_and_right_margins", 0)
|
||||||
|
private val isBold = XSPUtils.getBoolean("big_mobile_type_icon_bold", true)
|
||||||
|
private val size = XSPUtils.getFloat("big_mobile_type_icon_size", 12.5f)
|
||||||
|
|
||||||
|
override fun init() = hasEnable("big_mobile_type_icon") {
|
||||||
|
// TODO: Android13大移动类型图标不可用
|
||||||
|
findMethod("com.android.systemui.statusbar.StatusBarMobileView") {
|
||||||
|
name == "init"
|
||||||
|
}.hookAfter { param ->
|
||||||
|
val statusBarMobileView = param.thisObject as ViewGroup
|
||||||
|
val context: Context = statusBarMobileView.context
|
||||||
|
val res: Resources = context.resources
|
||||||
|
|
||||||
|
//获取组件
|
||||||
|
val mobileContainerLeftId: Int =
|
||||||
|
res.getIdentifier("mobile_container_left", "id", "com.android.systemui")
|
||||||
|
val mobileContainerLeft =
|
||||||
|
statusBarMobileView.findViewById<ViewGroup>(mobileContainerLeftId)
|
||||||
|
|
||||||
|
val mobileTypeId: Int =
|
||||||
|
res.getIdentifier("mobile_type", "id", "com.android.systemui")
|
||||||
|
val mobileType = statusBarMobileView.findViewById<TextView>(mobileTypeId)
|
||||||
|
|
||||||
|
val mobileLeftMobileInoutId: Int = res.getIdentifier(
|
||||||
|
"mobile_left_mobile_inout",
|
||||||
|
"id",
|
||||||
|
"com.android.systemui"
|
||||||
|
)
|
||||||
|
val mobileLeftMobileInout =
|
||||||
|
statusBarMobileView.findViewById<ImageView>(mobileLeftMobileInoutId)
|
||||||
|
|
||||||
|
|
||||||
|
//获取插入位置
|
||||||
|
val mobileContainerRightId: Int = res.getIdentifier(
|
||||||
|
"mobile_container_right",
|
||||||
|
"id",
|
||||||
|
"com.android.systemui"
|
||||||
|
)
|
||||||
|
val mobileContainerRight =
|
||||||
|
statusBarMobileView.findViewById<ViewGroup>(mobileContainerRightId)
|
||||||
|
val rightParentLayout = mobileContainerRight.parent as ViewGroup
|
||||||
|
val mobileContainerRightIndex =
|
||||||
|
rightParentLayout.indexOfChild(mobileContainerRight)
|
||||||
|
|
||||||
|
//创建新布局
|
||||||
|
val newLinearLayoutLP = LinearLayout.LayoutParams(
|
||||||
|
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||||
|
LinearLayout.LayoutParams.MATCH_PARENT
|
||||||
|
)
|
||||||
|
val newLinearlayout = LinearLayout(context).also {
|
||||||
|
it.layoutParams = newLinearLayoutLP
|
||||||
|
it.id = mobileContainerLeftId
|
||||||
|
it.setPadding(leftAndRightMargin, 0, leftAndRightMargin, 0)
|
||||||
|
}
|
||||||
|
param.thisObject.putObject("mMobileLeftContainer", newLinearlayout)
|
||||||
|
rightParentLayout.addView(
|
||||||
|
newLinearlayout,
|
||||||
|
mobileContainerRightIndex
|
||||||
|
)
|
||||||
|
|
||||||
|
//将组件插入新的布局
|
||||||
|
(mobileType.parent as ViewGroup).removeView(mobileType)
|
||||||
|
(mobileLeftMobileInout.parent as ViewGroup).removeView(mobileLeftMobileInout)
|
||||||
|
(mobileContainerLeft.parent as ViewGroup).removeView(mobileContainerLeft)
|
||||||
|
|
||||||
|
|
||||||
|
newLinearlayout.addView(mobileType) //类型
|
||||||
|
val mobileTypeLp = LinearLayout.LayoutParams(
|
||||||
|
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||||
|
LinearLayout.LayoutParams.WRAP_CONTENT
|
||||||
|
).also {
|
||||||
|
it.gravity = Gravity.CENTER_VERTICAL
|
||||||
|
it.topMargin = upAndDownPosition
|
||||||
|
}
|
||||||
|
mobileType.also {
|
||||||
|
it.setTextSize(TypedValue.COMPLEX_UNIT_DIP, size)
|
||||||
|
if (isBold) {
|
||||||
|
it.typeface = Typeface.DEFAULT_BOLD
|
||||||
|
}
|
||||||
|
it.layoutParams = mobileTypeLp
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
newLinearlayout.addView(mobileLeftMobileInout) //箭头
|
||||||
|
val mobileLeftMobileInoutLp = LinearLayout.LayoutParams(
|
||||||
|
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||||
|
LinearLayout.LayoutParams.MATCH_PARENT
|
||||||
|
)
|
||||||
|
mobileLeftMobileInout.also {
|
||||||
|
it.layoutParams = mobileLeftMobileInoutLp
|
||||||
|
}
|
||||||
|
|
||||||
|
//屏蔽更新布局
|
||||||
|
findMethod("com.android.systemui.statusbar.StatusBarMobileView") {
|
||||||
|
name == "updateMobileTypeLayout" && parameterTypes[0] == String::class.java
|
||||||
|
}.hookReturnConstant(null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.SystemClock
|
||||||
|
import android.view.MotionEvent
|
||||||
|
import android.view.View.OnTouchListener
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
import de.robv.android.xposed.XposedHelpers
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
|
object StatusBarDoubleTapToSleepForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() = hasEnable("status_bar_double_tap_to_sleep") {
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.MiuiPhoneStatusBarView") {
|
||||||
|
name == "onFinishInflate"
|
||||||
|
}.hookBefore {
|
||||||
|
val view = it.thisObject as ViewGroup
|
||||||
|
XposedHelpers.setAdditionalInstanceField(view, "currentTouchTime", 0L)
|
||||||
|
XposedHelpers.setAdditionalInstanceField(view, "currentTouchX", 0f)
|
||||||
|
XposedHelpers.setAdditionalInstanceField(view, "currentTouchY", 0f)
|
||||||
|
view.setOnTouchListener(OnTouchListener { v, event ->
|
||||||
|
if (event.action != MotionEvent.ACTION_DOWN) return@OnTouchListener false
|
||||||
|
var currentTouchTime =
|
||||||
|
XposedHelpers.getAdditionalInstanceField(view, "currentTouchTime") as Long
|
||||||
|
var currentTouchX =
|
||||||
|
XposedHelpers.getAdditionalInstanceField(view, "currentTouchX") as Float
|
||||||
|
var currentTouchY =
|
||||||
|
XposedHelpers.getAdditionalInstanceField(view, "currentTouchY") as Float
|
||||||
|
val lastTouchTime = currentTouchTime
|
||||||
|
val lastTouchX = currentTouchX
|
||||||
|
val lastTouchY = currentTouchY
|
||||||
|
currentTouchTime = System.currentTimeMillis()
|
||||||
|
currentTouchX = event.x
|
||||||
|
currentTouchY = event.y
|
||||||
|
if (currentTouchTime - lastTouchTime < 250L && abs(currentTouchX - lastTouchX) < 100f && abs(
|
||||||
|
currentTouchY - lastTouchY
|
||||||
|
) < 100f
|
||||||
|
) {
|
||||||
|
XposedHelpers.callMethod(
|
||||||
|
v.context.getSystemService(Context.POWER_SERVICE),
|
||||||
|
"goToSleep",
|
||||||
|
SystemClock.uptimeMillis()
|
||||||
|
)
|
||||||
|
currentTouchTime = 0L
|
||||||
|
currentTouchX = 0f
|
||||||
|
currentTouchY = 0f
|
||||||
|
}
|
||||||
|
XposedHelpers.setAdditionalInstanceField(
|
||||||
|
view,
|
||||||
|
"currentTouchTime",
|
||||||
|
currentTouchTime
|
||||||
|
)
|
||||||
|
XposedHelpers.setAdditionalInstanceField(view, "currentTouchX", currentTouchX)
|
||||||
|
XposedHelpers.setAdditionalInstanceField(view, "currentTouchY", currentTouchY)
|
||||||
|
v.performClick()
|
||||||
|
false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,425 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.app.KeyguardManager
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import android.content.res.Resources
|
||||||
|
import android.view.Gravity
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
import cn.fkj233.ui.activity.dp2px
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.*
|
||||||
|
import com.lt2333.simplicitytools.utils.XSPUtils
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
object StatusBarLayoutForT : HookRegister() {
|
||||||
|
|
||||||
|
private val getMode = XSPUtils.getInt("status_bar_layout_mode", 0)
|
||||||
|
private val getHoleLocation = XSPUtils.getInt("screen_hole_location", 0)
|
||||||
|
|
||||||
|
private var statusBarLeft = 0
|
||||||
|
private var statusBarTop = 0
|
||||||
|
private var statusBarRight = 0
|
||||||
|
private var statusBarBottom = 0
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
|
||||||
|
// TODO: Android13状态栏布局不可用
|
||||||
|
|
||||||
|
var mLeftLayout: LinearLayout? = null
|
||||||
|
var mRightLayout: LinearLayout? = null
|
||||||
|
var mCenterLayout: LinearLayout?
|
||||||
|
var statusBar: ViewGroup? = null
|
||||||
|
|
||||||
|
fun updateLayout(context: Context) {
|
||||||
|
//判断屏幕方向
|
||||||
|
val mConfiguration: Configuration = context.resources.configuration
|
||||||
|
if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) {
|
||||||
|
mLeftLayout!!.setPadding(statusBarLeft, 0, 0, 0)
|
||||||
|
mRightLayout!!.setPadding(0, 0, statusBarRight, 0)
|
||||||
|
statusBar!!.setPadding(0, statusBarTop, 0, statusBarBottom)
|
||||||
|
} else {
|
||||||
|
//横屏状态
|
||||||
|
mLeftLayout!!.setPadding(175, 0, 0, 0)
|
||||||
|
mRightLayout!!.setPadding(0, 0, 175, 0)
|
||||||
|
statusBar!!.setPadding(0, statusBarTop, 0, statusBarBottom)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//判断是否开启居中挖孔兼容模式
|
||||||
|
if (getHoleLocation == 1) {
|
||||||
|
findMethod("com.android.systemui.ScreenDecorations\$DisplayCutoutView") {
|
||||||
|
name == "boundsFromDirection" && parameterCount == 3 && isStatic
|
||||||
|
}.hookBefore {
|
||||||
|
it.args[1] = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
when (getMode) {
|
||||||
|
//默认
|
||||||
|
0 -> return
|
||||||
|
//时钟居中
|
||||||
|
1 -> {
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.CollapsedStatusBarFragment") {
|
||||||
|
name == "onViewCreated" && parameterCount == 2
|
||||||
|
}.hookAfter { param ->
|
||||||
|
val miuiPhoneStatusBarView =
|
||||||
|
param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||||
|
val context: Context = miuiPhoneStatusBarView.context
|
||||||
|
val res: Resources = miuiPhoneStatusBarView.resources
|
||||||
|
val statusBarId: Int =
|
||||||
|
res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||||
|
val statusBarContentsId: Int =
|
||||||
|
res.getIdentifier("status_bar_contents", "id", "com.android.systemui")
|
||||||
|
val systemIconAreaId: Int =
|
||||||
|
res.getIdentifier("system_icon_area", "id", "com.android.systemui")
|
||||||
|
val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui")
|
||||||
|
val phoneStatusBarLeftContainerId: Int =
|
||||||
|
res.getIdentifier(
|
||||||
|
"phone_status_bar_left_container",
|
||||||
|
"id",
|
||||||
|
"com.android.systemui"
|
||||||
|
)
|
||||||
|
val notificationIconAreaInnerId: Int =
|
||||||
|
res.getIdentifier(
|
||||||
|
"notification_icon_area_inner",
|
||||||
|
"id",
|
||||||
|
"com.android.systemui"
|
||||||
|
)
|
||||||
|
statusBar = miuiPhoneStatusBarView.findViewById(statusBarId)
|
||||||
|
val statusBarContents: ViewGroup =
|
||||||
|
miuiPhoneStatusBarView.findViewById(statusBarContentsId)
|
||||||
|
if (statusBar == null) return@hookAfter
|
||||||
|
val clock: TextView = miuiPhoneStatusBarView.findViewById(clockId)
|
||||||
|
val phoneStatusBarLeftContainer: ViewGroup =
|
||||||
|
miuiPhoneStatusBarView.findViewById(phoneStatusBarLeftContainerId)
|
||||||
|
val notificationIconAreaInner: ViewGroup =
|
||||||
|
miuiPhoneStatusBarView.findViewById(notificationIconAreaInnerId)
|
||||||
|
val systemIconArea: ViewGroup =
|
||||||
|
miuiPhoneStatusBarView.findViewById(systemIconAreaId)
|
||||||
|
|
||||||
|
(clock.parent as ViewGroup).removeView(clock)
|
||||||
|
(phoneStatusBarLeftContainer.parent as ViewGroup).removeView(
|
||||||
|
phoneStatusBarLeftContainer
|
||||||
|
)
|
||||||
|
(notificationIconAreaInner.parent as ViewGroup).removeView(
|
||||||
|
notificationIconAreaInner
|
||||||
|
)
|
||||||
|
(systemIconArea.parent as ViewGroup).removeView(systemIconArea)
|
||||||
|
|
||||||
|
val mConstraintLayout =
|
||||||
|
ConstraintLayout(context).also {
|
||||||
|
it.layoutParams = ConstraintLayout.LayoutParams(
|
||||||
|
ConstraintLayout.LayoutParams.MATCH_PARENT,
|
||||||
|
ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
mConstraintLayout.addView(notificationIconAreaInner)
|
||||||
|
|
||||||
|
val fullscreenNotificationIconAreaLp = LinearLayout.LayoutParams(
|
||||||
|
ConstraintLayout.LayoutParams.MATCH_PARENT,
|
||||||
|
ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||||
|
)
|
||||||
|
|
||||||
|
notificationIconAreaInner.layoutParams = fullscreenNotificationIconAreaLp
|
||||||
|
|
||||||
|
//增加一个左对齐布局
|
||||||
|
mLeftLayout = LinearLayout(context)
|
||||||
|
val leftLp: LinearLayout.LayoutParams =
|
||||||
|
LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)
|
||||||
|
mLeftLayout!!.layoutParams = leftLp
|
||||||
|
mLeftLayout!!.gravity = Gravity.START or Gravity.CENTER_VERTICAL
|
||||||
|
|
||||||
|
//增加一个居中布局
|
||||||
|
mCenterLayout = LinearLayout(context)
|
||||||
|
val centerLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams(
|
||||||
|
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||||
|
LinearLayout.LayoutParams.MATCH_PARENT
|
||||||
|
)
|
||||||
|
mCenterLayout!!.layoutParams = centerLp
|
||||||
|
mCenterLayout!!.gravity = Gravity.CENTER or Gravity.CENTER_VERTICAL
|
||||||
|
mRightLayout = LinearLayout(context)
|
||||||
|
val rightLp: LinearLayout.LayoutParams =
|
||||||
|
LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)
|
||||||
|
mRightLayout!!.layoutParams = rightLp
|
||||||
|
mRightLayout!!.gravity = Gravity.END or Gravity.CENTER_VERTICAL
|
||||||
|
mLeftLayout!!.addView(phoneStatusBarLeftContainer)
|
||||||
|
mLeftLayout!!.addView(mConstraintLayout)
|
||||||
|
|
||||||
|
mCenterLayout!!.addView(clock)
|
||||||
|
mRightLayout!!.addView(systemIconArea)
|
||||||
|
statusBarContents.addView(mLeftLayout, 0)
|
||||||
|
statusBarContents.addView(mCenterLayout)
|
||||||
|
statusBarContents.addView(mRightLayout)
|
||||||
|
|
||||||
|
statusBarLeft = statusBar!!.paddingLeft
|
||||||
|
statusBarTop = statusBar!!.paddingTop
|
||||||
|
statusBarRight = statusBar!!.paddingRight
|
||||||
|
statusBarBottom = statusBar!!.paddingBottom
|
||||||
|
|
||||||
|
|
||||||
|
if (getHoleLocation == 2) {
|
||||||
|
val customLeftMargin = XSPUtils.getInt("status_bar_left_margin", 0)
|
||||||
|
if (customLeftMargin != 0) {
|
||||||
|
statusBarLeft = customLeftMargin
|
||||||
|
}
|
||||||
|
|
||||||
|
val customRightMargin = XSPUtils.getInt("status_bar_right_margin", 0)
|
||||||
|
if (customRightMargin != 0) {
|
||||||
|
statusBarRight = customRightMargin
|
||||||
|
}
|
||||||
|
updateLayout(context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.PhoneStatusBarView") {
|
||||||
|
name == "updateLayoutForCutout"
|
||||||
|
}.hookAfter {
|
||||||
|
hasEnable("layout_compatibility_mode") {
|
||||||
|
val context = (it.thisObject as ViewGroup).context
|
||||||
|
updateLayout(context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//时钟居右
|
||||||
|
2 -> {
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.CollapsedStatusBarFragment") {
|
||||||
|
name == "onViewCreated" && parameterCount == 2
|
||||||
|
}.hookAfter { param ->
|
||||||
|
val miuiPhoneStatusBarView =
|
||||||
|
param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||||
|
val context: Context = miuiPhoneStatusBarView.context
|
||||||
|
val res: Resources = miuiPhoneStatusBarView.resources
|
||||||
|
|
||||||
|
//组件ID
|
||||||
|
val statusBarId: Int =
|
||||||
|
res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||||
|
val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui")
|
||||||
|
val batteryId: Int = res.getIdentifier("battery", "id", "com.android.systemui")
|
||||||
|
|
||||||
|
//查找组件
|
||||||
|
statusBar = miuiPhoneStatusBarView.findViewById(statusBarId)
|
||||||
|
if (statusBar == null) return@hookAfter
|
||||||
|
val clock: TextView = miuiPhoneStatusBarView.findViewById(clockId)
|
||||||
|
val battery: ViewGroup = miuiPhoneStatusBarView.findViewById(batteryId)
|
||||||
|
|
||||||
|
//新建布局
|
||||||
|
val rightLp = LinearLayout.LayoutParams(
|
||||||
|
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||||
|
LinearLayout.LayoutParams.MATCH_PARENT
|
||||||
|
).also {
|
||||||
|
it.marginStart = dp2px(context, 5f)
|
||||||
|
}
|
||||||
|
mRightLayout = LinearLayout(context).also {
|
||||||
|
it.layoutParams = rightLp
|
||||||
|
}
|
||||||
|
|
||||||
|
//添加布局与组件
|
||||||
|
battery.addView(mRightLayout)
|
||||||
|
(clock.parent as ViewGroup).removeView(clock)
|
||||||
|
mRightLayout!!.addView(clock)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//时钟居中+图标居左
|
||||||
|
3 -> {
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.CollapsedStatusBarFragment") {
|
||||||
|
name == "onViewCreated" && parameterCount == 2
|
||||||
|
}.hookAfter { param ->
|
||||||
|
val miuiPhoneStatusBarView =
|
||||||
|
param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||||
|
val context: Context = miuiPhoneStatusBarView.context
|
||||||
|
val res: Resources = miuiPhoneStatusBarView.resources
|
||||||
|
val statusBarId: Int =
|
||||||
|
res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||||
|
val statusBarContentsId: Int =
|
||||||
|
res.getIdentifier("status_bar_contents", "id", "com.android.systemui")
|
||||||
|
val systemIconAreaId: Int =
|
||||||
|
res.getIdentifier("system_icon_area", "id", "com.android.systemui")
|
||||||
|
val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui")
|
||||||
|
val phoneStatusBarLeftContainerId: Int =
|
||||||
|
res.getIdentifier(
|
||||||
|
"phone_status_bar_left_container",
|
||||||
|
"id",
|
||||||
|
"com.android.systemui"
|
||||||
|
)
|
||||||
|
val fullscreenNotificationIconAreaId: Int =
|
||||||
|
res.getIdentifier(
|
||||||
|
"fullscreen_notification_icon_area",
|
||||||
|
"id",
|
||||||
|
"com.android.systemui"
|
||||||
|
)
|
||||||
|
val statusIconsId: Int =
|
||||||
|
res.getIdentifier(
|
||||||
|
"statusIcons",
|
||||||
|
"id",
|
||||||
|
"com.android.systemui"
|
||||||
|
)
|
||||||
|
val systemIconsId: Int =
|
||||||
|
res.getIdentifier(
|
||||||
|
"system_icons",
|
||||||
|
"id",
|
||||||
|
"com.android.systemui"
|
||||||
|
)
|
||||||
|
val batteryId: Int =
|
||||||
|
res.getIdentifier(
|
||||||
|
"battery",
|
||||||
|
"id",
|
||||||
|
"com.android.systemui"
|
||||||
|
)
|
||||||
|
|
||||||
|
statusBar = miuiPhoneStatusBarView.findViewById(statusBarId)
|
||||||
|
val statusBarContents: ViewGroup =
|
||||||
|
miuiPhoneStatusBarView.findViewById(statusBarContentsId)
|
||||||
|
if (statusBar == null) return@hookAfter
|
||||||
|
val clock: TextView = miuiPhoneStatusBarView.findViewById(clockId)
|
||||||
|
val phoneStatusBarLeftContainer: ViewGroup =
|
||||||
|
miuiPhoneStatusBarView.findViewById(phoneStatusBarLeftContainerId)
|
||||||
|
val fullscreenNotificationIconArea: ViewGroup =
|
||||||
|
miuiPhoneStatusBarView.findViewById(fullscreenNotificationIconAreaId)
|
||||||
|
val systemIconArea: ViewGroup =
|
||||||
|
miuiPhoneStatusBarView.findViewById(systemIconAreaId)
|
||||||
|
val statusIcons: ViewGroup =
|
||||||
|
miuiPhoneStatusBarView.findViewById(statusIconsId)
|
||||||
|
val systemIcons: ViewGroup =
|
||||||
|
miuiPhoneStatusBarView.findViewById(systemIconsId)
|
||||||
|
val battery: ViewGroup =
|
||||||
|
miuiPhoneStatusBarView.findViewById(batteryId)
|
||||||
|
|
||||||
|
(clock.parent as ViewGroup).removeView(clock)
|
||||||
|
(phoneStatusBarLeftContainer.parent as ViewGroup).removeView(
|
||||||
|
phoneStatusBarLeftContainer
|
||||||
|
)
|
||||||
|
(systemIconArea.parent as ViewGroup).removeView(systemIconArea)
|
||||||
|
(statusIcons.parent as ViewGroup).removeView(statusIcons)
|
||||||
|
(systemIcons.parent as ViewGroup).removeView(systemIcons)
|
||||||
|
(battery.parent as ViewGroup).removeView(battery)
|
||||||
|
(fullscreenNotificationIconArea.parent as ViewGroup).removeView(
|
||||||
|
fullscreenNotificationIconArea
|
||||||
|
)
|
||||||
|
|
||||||
|
val mConstraintLayout =
|
||||||
|
ConstraintLayout(context).also {
|
||||||
|
it.layoutParams = ConstraintLayout.LayoutParams(
|
||||||
|
ConstraintLayout.LayoutParams.MATCH_PARENT,
|
||||||
|
ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
mConstraintLayout.addView(fullscreenNotificationIconArea)
|
||||||
|
mConstraintLayout.addView(battery)
|
||||||
|
|
||||||
|
|
||||||
|
battery.layoutParams = ConstraintLayout.LayoutParams(
|
||||||
|
ConstraintLayout.LayoutParams.WRAP_CONTENT,
|
||||||
|
ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||||
|
).also {
|
||||||
|
it.endToEnd = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fullscreenNotificationIconArea.layoutParams = ConstraintLayout.LayoutParams(
|
||||||
|
0,
|
||||||
|
ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||||
|
).also {
|
||||||
|
it.startToEnd = batteryId
|
||||||
|
it.endToEnd = 0
|
||||||
|
}
|
||||||
|
fullscreenNotificationIconArea.layoutDirection = View.LAYOUT_DIRECTION_RTL
|
||||||
|
|
||||||
|
|
||||||
|
//增加一个左对齐布局
|
||||||
|
mLeftLayout = LinearLayout(context)
|
||||||
|
val leftLp: LinearLayout.LayoutParams =
|
||||||
|
LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)
|
||||||
|
mLeftLayout!!.layoutParams = leftLp
|
||||||
|
mLeftLayout!!.gravity = Gravity.START or Gravity.CENTER_VERTICAL
|
||||||
|
|
||||||
|
//增加一个居中布局
|
||||||
|
mCenterLayout = LinearLayout(context)
|
||||||
|
val centerLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams(
|
||||||
|
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||||
|
LinearLayout.LayoutParams.MATCH_PARENT
|
||||||
|
)
|
||||||
|
mCenterLayout!!.layoutParams = centerLp
|
||||||
|
mCenterLayout!!.gravity = Gravity.CENTER or Gravity.CENTER_VERTICAL
|
||||||
|
|
||||||
|
//增加一个右布局
|
||||||
|
mRightLayout = LinearLayout(context)
|
||||||
|
val rightLp: LinearLayout.LayoutParams =
|
||||||
|
LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)
|
||||||
|
mRightLayout!!.layoutParams = rightLp
|
||||||
|
mRightLayout!!.gravity = Gravity.END or Gravity.CENTER_VERTICAL
|
||||||
|
|
||||||
|
|
||||||
|
mLeftLayout!!.addView(phoneStatusBarLeftContainer)
|
||||||
|
mLeftLayout!!.addView(statusIcons)
|
||||||
|
statusIcons.layoutDirection = View.LAYOUT_DIRECTION_RTL
|
||||||
|
|
||||||
|
mCenterLayout!!.addView(clock)
|
||||||
|
|
||||||
|
mRightLayout!!.addView(mConstraintLayout)
|
||||||
|
fullscreenNotificationIconArea.layoutDirection = View.LAYOUT_DIRECTION_RTL
|
||||||
|
|
||||||
|
|
||||||
|
statusBarContents.addView(mLeftLayout, 0)
|
||||||
|
statusBarContents.addView(mCenterLayout)
|
||||||
|
statusBarContents.addView(mRightLayout)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
statusBarLeft = statusBar!!.paddingLeft
|
||||||
|
statusBarTop = statusBar!!.paddingTop
|
||||||
|
statusBarRight = statusBar!!.paddingRight
|
||||||
|
statusBarBottom = statusBar!!.paddingBottom
|
||||||
|
|
||||||
|
|
||||||
|
if (getHoleLocation == 2) {
|
||||||
|
val customLeftMargin = XSPUtils.getInt("status_bar_left_margin", 0)
|
||||||
|
if (customLeftMargin != 0) {
|
||||||
|
statusBarLeft = customLeftMargin
|
||||||
|
}
|
||||||
|
|
||||||
|
val customRightMargin = XSPUtils.getInt("status_bar_right_margin", 0)
|
||||||
|
if (customRightMargin != 0) {
|
||||||
|
statusBarRight = customRightMargin
|
||||||
|
}
|
||||||
|
updateLayout(context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//兼容模式
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.PhoneStatusBarView") {
|
||||||
|
name == "updateLayoutForCutout"
|
||||||
|
}.hookAfter {
|
||||||
|
if (getHoleLocation == 2) {
|
||||||
|
val context = (it.thisObject as ViewGroup).context
|
||||||
|
updateLayout(context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//解决重叠
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.MiuiCollapsedStatusBarFragment") {
|
||||||
|
name == "showClock" && parameterTypes[0] == Boolean::class.java
|
||||||
|
}.hookAfter {
|
||||||
|
val miuiPhoneStatusBarView = it.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||||
|
val res = miuiPhoneStatusBarView.resources
|
||||||
|
val statusBarId =
|
||||||
|
res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||||
|
val statusBar1 = miuiPhoneStatusBarView.findViewById<ViewGroup>(statusBarId)
|
||||||
|
//非锁屏下整个状态栏布局
|
||||||
|
val keyguardMgr =
|
||||||
|
statusBar1.context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
|
||||||
|
if (keyguardMgr.isKeyguardLocked) {
|
||||||
|
statusBar1!!.visibility = View.GONE
|
||||||
|
} else {
|
||||||
|
statusBar1!!.visibility = View.VISIBLE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
object StatusBarNetworkSpeedRefreshSpeedForT : HookRegister() {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
findMethod("com.android.systemui.statusbar.policy.NetworkSpeedController") {
|
||||||
|
name == "postUpdateNetworkSpeedDelay" && parameterTypes[0] == Long::class.java
|
||||||
|
}.hookBefore {
|
||||||
|
hasEnable("status_bar_network_speed_refresh_speed") {
|
||||||
|
it.args[0] = 1000L
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,337 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.res.Resources
|
||||||
|
import android.os.Handler
|
||||||
|
import android.provider.Settings
|
||||||
|
import android.util.TypedValue
|
||||||
|
import android.view.Gravity
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.TextView
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.*
|
||||||
|
import com.lt2333.simplicitytools.utils.XSPUtils
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
import java.lang.reflect.Method
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
object StatusBarTimeCustomizationForT : HookRegister() {
|
||||||
|
|
||||||
|
private val getMode = XSPUtils.getInt("custom_clock_mode", 0)
|
||||||
|
private val getClockSize = XSPUtils.getInt("status_bar_clock_size", 0)
|
||||||
|
private val getClockDoubleSize = XSPUtils.getInt("status_bar_clock_double_line_size", 0)
|
||||||
|
private val isYear = XSPUtils.getBoolean("status_bar_time_year", false)
|
||||||
|
private val isMonth = XSPUtils.getBoolean("status_bar_time_month", false)
|
||||||
|
private val isDay = XSPUtils.getBoolean("status_bar_time_day", false)
|
||||||
|
private val isWeek = XSPUtils.getBoolean("status_bar_time_week", false)
|
||||||
|
private val isHideSpace = XSPUtils.getBoolean("status_bar_time_hide_space", false)
|
||||||
|
private val isDoubleLine = XSPUtils.getBoolean("status_bar_time_double_line", false)
|
||||||
|
private val isSecond = XSPUtils.getBoolean("status_bar_time_seconds", false)
|
||||||
|
private val isDoubleHour = XSPUtils.getBoolean("status_bar_time_double_hour", false)
|
||||||
|
private val isPeriod = XSPUtils.getBoolean("status_bar_time_period", true)
|
||||||
|
private val isCenterAlign =
|
||||||
|
XSPUtils.getBoolean("status_bar_time_double_line_center_align", false)
|
||||||
|
|
||||||
|
//极客模式
|
||||||
|
private val getGeekClockSize = XSPUtils.getInt("status_bar_clock_size_geek", 0)
|
||||||
|
private val getGeekFormat = XSPUtils.getString("custom_clock_format_geek", "HH:mm:ss")
|
||||||
|
private val isGeekCenterAlign =
|
||||||
|
XSPUtils.getBoolean("status_bar_time_center_align_geek", false)
|
||||||
|
|
||||||
|
private lateinit var nowTime: Date
|
||||||
|
private var str = ""
|
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
|
override fun init() {
|
||||||
|
when (getMode) {
|
||||||
|
//预设模式
|
||||||
|
1 -> {
|
||||||
|
var c: Context? = null
|
||||||
|
|
||||||
|
findConstructor("com.android.systemui.statusbar.views.MiuiClock") {
|
||||||
|
paramCount == 3
|
||||||
|
}.hookAfter {
|
||||||
|
try {
|
||||||
|
c = it.args[0] as Context
|
||||||
|
val textV = it.thisObject as TextView
|
||||||
|
if (textV.resources.getResourceEntryName(textV.id) != "clock") return@hookAfter
|
||||||
|
textV.isSingleLine = false
|
||||||
|
if (isDoubleLine) {
|
||||||
|
str = "\n"
|
||||||
|
var clockDoubleLineSize = 7F
|
||||||
|
if (getClockDoubleSize != 0) {
|
||||||
|
clockDoubleLineSize = getClockDoubleSize.toFloat()
|
||||||
|
}
|
||||||
|
textV.setTextSize(TypedValue.COMPLEX_UNIT_DIP, clockDoubleLineSize)
|
||||||
|
textV.setLineSpacing(0F, 0.8F)
|
||||||
|
} else {
|
||||||
|
if (getClockSize != 0) {
|
||||||
|
val clockSize = getClockSize.toFloat()
|
||||||
|
textV.setTextSize(TypedValue.COMPLEX_UNIT_DIP, clockSize)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val d: Method = textV.javaClass.getDeclaredMethod("updateTime")
|
||||||
|
val r = Runnable {
|
||||||
|
d.isAccessible = true
|
||||||
|
d.invoke(textV)
|
||||||
|
}
|
||||||
|
|
||||||
|
class T : TimerTask() {
|
||||||
|
override fun run() {
|
||||||
|
Handler(textV.context.mainLooper).post(r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Timer().scheduleAtFixedRate(
|
||||||
|
T(),
|
||||||
|
1000 - System.currentTimeMillis() % 1000,
|
||||||
|
1000
|
||||||
|
)
|
||||||
|
} catch (_: Exception) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.statusbar.views.MiuiClock") {
|
||||||
|
name == "updateTime"
|
||||||
|
}.hookAfter {
|
||||||
|
try {
|
||||||
|
val textV = it.thisObject as TextView
|
||||||
|
if (textV.resources.getResourceEntryName(textV.id) == "clock") {
|
||||||
|
val t = Settings.System.getString(
|
||||||
|
c!!.contentResolver,
|
||||||
|
Settings.System.TIME_12_24
|
||||||
|
)
|
||||||
|
val is24 = t == "24"
|
||||||
|
nowTime = Calendar.getInstance().time
|
||||||
|
textV.text = getDate(c!!) + str + getTime(c!!, is24)
|
||||||
|
}
|
||||||
|
} catch (_: Exception) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isCenterAlign) {
|
||||||
|
// TODO: Android13时间居中对齐不可用
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.CollapsedStatusBarFragment") {
|
||||||
|
name == "onViewCreated" && parameterCount == 2
|
||||||
|
}.hookAfter {
|
||||||
|
val miuiPhoneStatusBarView =
|
||||||
|
it.thisObject.getObject("mStatusBar") as ViewGroup
|
||||||
|
val res: Resources = miuiPhoneStatusBarView.resources
|
||||||
|
val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui")
|
||||||
|
val clock: TextView = miuiPhoneStatusBarView.findViewById(clockId)
|
||||||
|
clock.gravity = Gravity.CENTER
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//极客模式
|
||||||
|
2 -> {
|
||||||
|
var c: Context? = null
|
||||||
|
|
||||||
|
findConstructor("com.android.systemui.statusbar.views.MiuiClock") {
|
||||||
|
paramCount == 3
|
||||||
|
}.hookAfter {
|
||||||
|
try {
|
||||||
|
c = it.args[0] as Context
|
||||||
|
val textV = it.thisObject as TextView
|
||||||
|
if (textV.resources.getResourceEntryName(textV.id) != "clock") return@hookAfter
|
||||||
|
textV.isSingleLine = false
|
||||||
|
textV.setLineSpacing(0F, 0.8F)
|
||||||
|
if (getGeekClockSize != 0) {
|
||||||
|
val clockSize = getGeekClockSize.toFloat()
|
||||||
|
textV.setTextSize(TypedValue.COMPLEX_UNIT_DIP, clockSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
val d: Method = textV.javaClass.getDeclaredMethod("updateTime")
|
||||||
|
val r = Runnable {
|
||||||
|
d.isAccessible = true
|
||||||
|
d.invoke(textV)
|
||||||
|
}
|
||||||
|
|
||||||
|
class T : TimerTask() {
|
||||||
|
override fun run() {
|
||||||
|
Handler(textV.context.mainLooper).post(r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Timer().scheduleAtFixedRate(
|
||||||
|
T(),
|
||||||
|
1000 - System.currentTimeMillis() % 1000,
|
||||||
|
1000
|
||||||
|
)
|
||||||
|
} catch (_: Exception) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
findMethod("com.android.systemui.statusbar.views.MiuiClock") {
|
||||||
|
name == "updateTime"
|
||||||
|
}.hookAfter {
|
||||||
|
try {
|
||||||
|
val textV = it.thisObject as TextView
|
||||||
|
if (textV.resources.getResourceEntryName(textV.id) == "clock") {
|
||||||
|
nowTime = Calendar.getInstance().time
|
||||||
|
textV.text = SimpleDateFormat(getGeekFormat).format(nowTime)
|
||||||
|
}
|
||||||
|
} catch (_: Exception) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isGeekCenterAlign) {
|
||||||
|
findMethod("com.android.systemui.statusbar.phone.CollapsedStatusBarFragment") {
|
||||||
|
name == "onViewCreated" && parameterCount == 2
|
||||||
|
}.hookAfter {
|
||||||
|
val miuiPhoneStatusBarView =
|
||||||
|
it.thisObject.getObject("mStatusBar") as ViewGroup
|
||||||
|
val res: Resources = miuiPhoneStatusBarView.resources
|
||||||
|
val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui")
|
||||||
|
val clock: TextView = miuiPhoneStatusBarView.findViewById(clockId)
|
||||||
|
clock.gravity = Gravity.CENTER
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SimpleDateFormat")
|
||||||
|
private fun getDate(context: Context): String {
|
||||||
|
var datePattern = ""
|
||||||
|
val isZh = isZh(context)
|
||||||
|
|
||||||
|
if (isYear) {
|
||||||
|
if (isZh) {
|
||||||
|
datePattern += "YY年"
|
||||||
|
// if (!isHideSpace) datePattern = "$datePattern "
|
||||||
|
} else {
|
||||||
|
datePattern += "YY"
|
||||||
|
if (isMonth || isDay) datePattern += "/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isMonth) {
|
||||||
|
if (isZh) {
|
||||||
|
datePattern += "M月"
|
||||||
|
// if (!isHideSpace) datePattern = "$datePattern "
|
||||||
|
} else {
|
||||||
|
datePattern += "M"
|
||||||
|
if (isDay) datePattern += "/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isDay) {
|
||||||
|
datePattern += if (isZh) {
|
||||||
|
"d日"
|
||||||
|
} else {
|
||||||
|
"d"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isWeek) {
|
||||||
|
if (!isHideSpace) datePattern = "$datePattern "
|
||||||
|
datePattern += "E"
|
||||||
|
if (!isDoubleLine) {
|
||||||
|
if (!isHideSpace) datePattern = "$datePattern "
|
||||||
|
}
|
||||||
|
}
|
||||||
|
datePattern = SimpleDateFormat(datePattern).format(nowTime)
|
||||||
|
return datePattern
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SimpleDateFormat")
|
||||||
|
private fun getTime(context: Context, t: Boolean): String {
|
||||||
|
var timePattern = ""
|
||||||
|
val isZh = isZh(context)
|
||||||
|
timePattern += if (t) "HH:mm" else "h:mm"
|
||||||
|
if (isSecond) timePattern += ":ss"
|
||||||
|
timePattern = SimpleDateFormat(timePattern).format(nowTime)
|
||||||
|
if (isZh) timePattern = getPeriod(isZh) + timePattern else timePattern += getPeriod(isZh)
|
||||||
|
timePattern = getDoubleHour() + timePattern
|
||||||
|
return timePattern
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SimpleDateFormat")
|
||||||
|
private fun getPeriod(isZh: Boolean): String {
|
||||||
|
var period = ""
|
||||||
|
if (isPeriod) {
|
||||||
|
if (isZh) {
|
||||||
|
when (SimpleDateFormat("HH").format(nowTime)) {
|
||||||
|
"00", "01", "02", "03", "04", "05" -> {
|
||||||
|
period = "凌晨"
|
||||||
|
}
|
||||||
|
"06", "07", "08", "09", "10", "11" -> {
|
||||||
|
period = "上午"
|
||||||
|
}
|
||||||
|
"12" -> {
|
||||||
|
period = "中午"
|
||||||
|
}
|
||||||
|
"13", "14", "15", "16", "17" -> {
|
||||||
|
period = "下午"
|
||||||
|
}
|
||||||
|
"18" -> {
|
||||||
|
period = "傍晚"
|
||||||
|
}
|
||||||
|
"19", "20", "21", "22", "23" -> {
|
||||||
|
period = "晚上"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
period = SimpleDateFormat("a").format(nowTime)
|
||||||
|
if (!isHideSpace) {
|
||||||
|
period = " $period"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return period
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SimpleDateFormat")
|
||||||
|
private fun getDoubleHour(): String {
|
||||||
|
var doubleHour = ""
|
||||||
|
if (isDoubleHour) {
|
||||||
|
when (SimpleDateFormat("HH").format(nowTime)) {
|
||||||
|
"23", "00" -> {
|
||||||
|
doubleHour = "子时"
|
||||||
|
}
|
||||||
|
"01", "02" -> {
|
||||||
|
doubleHour = "丑时"
|
||||||
|
}
|
||||||
|
"03", "04" -> {
|
||||||
|
doubleHour = "寅时"
|
||||||
|
}
|
||||||
|
"05", "06" -> {
|
||||||
|
doubleHour = "卯时"
|
||||||
|
}
|
||||||
|
"07", "08" -> {
|
||||||
|
doubleHour = "辰时"
|
||||||
|
}
|
||||||
|
"09", "10" -> {
|
||||||
|
doubleHour = "巳时"
|
||||||
|
}
|
||||||
|
"11", "12" -> {
|
||||||
|
doubleHour = "午时"
|
||||||
|
}
|
||||||
|
"13", "14" -> {
|
||||||
|
doubleHour = "未时"
|
||||||
|
}
|
||||||
|
"15", "16" -> {
|
||||||
|
doubleHour = "申时"
|
||||||
|
}
|
||||||
|
"17", "18" -> {
|
||||||
|
doubleHour = "酉时"
|
||||||
|
}
|
||||||
|
"19", "20" -> {
|
||||||
|
doubleHour = "戌时"
|
||||||
|
}
|
||||||
|
"21", "22" -> {
|
||||||
|
doubleHour = "亥时"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isHideSpace) {
|
||||||
|
doubleHour += " "
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return doubleHour
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isZh(context: Context): Boolean {
|
||||||
|
val locale = context.resources.configuration.locale
|
||||||
|
val language = locale.language
|
||||||
|
return language.endsWith("zh")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||||
|
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||||
|
import com.github.kyuubiran.ezxhelper.utils.putObject
|
||||||
|
import com.lt2333.simplicitytools.utils.hasEnable
|
||||||
|
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||||
|
|
||||||
|
object WaveChargeForT: HookRegister() {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
hasEnable("enable_wave_charge_animation") {
|
||||||
|
findMethod("com.android.keyguard.charge.ChargeUtils") {
|
||||||
|
name == "supportWaveChargeAnimation"
|
||||||
|
}.hookAfter {
|
||||||
|
val ex = Throwable()
|
||||||
|
val stackElement = ex.stackTrace
|
||||||
|
var mResult = false
|
||||||
|
val classTrue = setOf(
|
||||||
|
"com.android.keyguard.charge.ChargeUtils",
|
||||||
|
"com.android.keyguard.charge.container.MiuiChargeContainerView"
|
||||||
|
)
|
||||||
|
for (i in stackElement.indices) {
|
||||||
|
when (stackElement[i].className) {
|
||||||
|
in classTrue -> {
|
||||||
|
mResult = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
it.result = mResult
|
||||||
|
}
|
||||||
|
findMethod("com.android.keyguard.charge.wave.WaveView") {
|
||||||
|
name == "updateWaveHeight"
|
||||||
|
}.hookAfter {
|
||||||
|
it.thisObject.putObject("mWaveXOffset", 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user