整理规范代码

This commit is contained in:
2022-01-30 23:07:14 +08:00
parent e30afc4011
commit 4c13768500
22 changed files with 145 additions and 95 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*
@@ -37,10 +37,15 @@ class TSApplication : Application() {
* @return [TSApplication]
*/
val appContext get() = context ?: error("App is death")
/** 自身 APP 是否已启动 */
var isMineStarted = false
}
override fun onCreate() {
super.onCreate()
/** 设置状态 */
isMineStarted = true
/** 设置静态实例 */
context = this
/** 跟随系统夜间模式 */

View File

@@ -1,5 +1,5 @@
/**
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*
@@ -33,7 +33,6 @@ import com.fankes.tsbattery.hook.HookMedium.QQ_PACKAGE_NAME
import com.fankes.tsbattery.hook.HookMedium.SELF_PACKAGE_NAME
import com.fankes.tsbattery.hook.HookMedium.TIM_PACKAGE_NAME
import com.fankes.tsbattery.hook.HookMedium.WECHAT_PACKAGE_NAME
import com.fankes.tsbattery.utils.XPrefUtils
import com.fankes.tsbattery.utils.showDialog
import com.fankes.tsbattery.utils.versionCode
import com.fankes.tsbattery.utils.versionName
@@ -205,7 +204,7 @@ class HookMain : IXposedHookLoadPackage {
if (packageName != WECHAT_PACKAGE_NAME)
runWithoutError("SplashActivity") {
/** 判断是否开启提示模块运行信息 */
if (XPrefUtils.getBoolean(HookMedium.ENABLE_RUN_INFO))
if (HookMedium.getBoolean(HookMedium.ENABLE_RUN_INFO))
XposedHelpers.findAndHookMethod(
"$QQ_PACKAGE_NAME.activity.SplashActivity",
classLoader,
@@ -224,8 +223,8 @@ class HookMain : IXposedHookLoadPackage {
title = "TSBattery 已激活"
msg = "[提示模块运行信息功能已打开]\n\n" +
"模块工作看起来一切正常,请自行测试是否能达到省电效果。\n\n" +
"已生效模块版本:${XPrefUtils.getString(HookMedium.ENABLE_MODULE_VERSION)}\n" +
"当前模式:${if (XPrefUtils.getBoolean(HookMedium.ENABLE_QQTIM_WHITE_MODE)) "保守模式" else "完全模式"}" +
"已生效模块版本:${HookMedium.getString(HookMedium.ENABLE_MODULE_VERSION)}\n" +
"当前模式:${if (HookMedium.getBoolean(HookMedium.ENABLE_QQTIM_WHITE_MODE)) "保守模式" else "完全模式"}" +
"\n\n包名:${packageName}\n版本:$versionName($versionCode)" +
"\n\n模块只对挂后台锁屏情况下有省电效果,请不要将过多的群提醒,消息通知打开,这样子在使用过程时照样会极其耗电。\n\n" +
"如果你不想看到此提示。请在模块设置中关闭“提示模块运行信息”,此设置默认关闭。\n\n" +
@@ -241,7 +240,7 @@ class HookMain : IXposedHookLoadPackage {
else
runWithoutError("LauncherUI") {
/** 判断是否开启提示模块运行信息 */
if (XPrefUtils.getBoolean(HookMedium.ENABLE_RUN_INFO))
if (HookMedium.getBoolean(HookMedium.ENABLE_RUN_INFO))
XposedHelpers.findAndHookMethod(
"$WECHAT_PACKAGE_NAME.ui.LauncherUI",
classLoader,
@@ -259,7 +258,7 @@ class HookMain : IXposedHookLoadPackage {
title = "TSBattery 已激活"
msg = "[提示模块运行信息功能已打开]\n\n" +
"模块工作看起来一切正常,请自行测试是否能达到省电效果。\n\n" +
"已生效模块版本:${XPrefUtils.getString(HookMedium.ENABLE_MODULE_VERSION)}\n" +
"已生效模块版本:${HookMedium.getString(HookMedium.ENABLE_MODULE_VERSION)}\n" +
"当前模式:基础省电" +
"\n\n包名:${packageName}\n版本:$versionName($versionCode)" +
"\n\n当前只支持微信的基础省电,即系统电源锁,后续会继续适配微信相关的省电功能(在新建文件夹了)。\n\n" +
@@ -279,7 +278,7 @@ class HookMain : IXposedHookLoadPackage {
/** Hook CoreService 指定方法 */
if (packageName == QQ_PACKAGE_NAME)
runWithoutError("CoreServiceKnownMethods") {
if (XPrefUtils.getBoolean(HookMedium.ENABLE_QQTIM_CORESERVICE_BAN)) {
if (HookMedium.getBoolean(HookMedium.ENABLE_QQTIM_CORESERVICE_BAN)) {
XposedHelpers.findAndHookMethod(
"$QQ_PACKAGE_NAME.app.CoreService",
classLoader, "startTempService", replaceToNull
@@ -302,7 +301,7 @@ class HookMain : IXposedHookLoadPackage {
}
/** Hook CoreService 启动方法 */
runWithoutError("CoreService") {
if (XPrefUtils.getBoolean(HookMedium.ENABLE_QQTIM_CORESERVICE_BAN)) {
if (HookMedium.getBoolean(HookMedium.ENABLE_QQTIM_CORESERVICE_BAN)) {
XposedHelpers.findAndHookMethod(
"$QQ_PACKAGE_NAME.app.CoreService",
classLoader, "onCreate",
@@ -323,7 +322,7 @@ class HookMain : IXposedHookLoadPackage {
}
/** Hook CoreService$KernelService 启动方法 */
runWithoutError("CoreService\$KernelService") {
if (XPrefUtils.getBoolean(HookMedium.ENABLE_QQTIM_CORESERVICE_CHILD_BAN)) {
if (HookMedium.getBoolean(HookMedium.ENABLE_QQTIM_CORESERVICE_CHILD_BAN)) {
XposedHelpers.findAndHookMethod(
"$QQ_PACKAGE_NAME.app.CoreService\$KernelService",
classLoader, "onCreate",
@@ -382,7 +381,7 @@ class HookMain : IXposedHookLoadPackage {
hookCoreService()
}
/** 关闭保守模式后不再仅仅作用于系统电源锁 */
if (!XPrefUtils.getBoolean(HookMedium.ENABLE_QQTIM_WHITE_MODE)) {
if (!HookMedium.getBoolean(HookMedium.ENABLE_QQTIM_WHITE_MODE)) {
runWithoutError("BaseChatPie(first time)") {
/** 通过在 SplashActivity 里取到应用的版本号 */
XposedHelpers.findAndHookMethod(
@@ -542,7 +541,7 @@ class HookMain : IXposedHookLoadPackage {
/** 微信 */
WECHAT_PACKAGE_NAME -> {
/** 判断是否关闭 Hook */
if (XPrefUtils.getBoolean(HookMedium.DISABLE_WECHAT_HOOK)) return
if (HookMedium.getBoolean(HookMedium.DISABLE_WECHAT_HOOK)) return
lpparam.apply {
hookSystemWakeLock()
hookModuleRunningInfo()

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*
@@ -18,15 +18,24 @@
*
* This file is Created by fankes on 2021/11/9.
*/
@file:Suppress("DEPRECATION", "SetWorldReadable")
package com.fankes.tsbattery.hook
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.util.Log
import android.widget.Toast
import androidx.annotation.Keep
import com.fankes.tsbattery.application.TSApplication.Companion.appContext
import com.fankes.tsbattery.application.TSApplication.Companion.isMineStarted
import com.fankes.tsbattery.ui.MainActivity
import com.fankes.tsbattery.utils.FileUtils
import com.fankes.tsbattery.utils.XPrefUtils
import java.io.File
@Keep
object HookMedium {
@@ -84,4 +93,88 @@ object HookMedium {
}
return isExp
}
/**
* 获取保存的值
* @param key 名称
* @param default 默认值
* @return [Boolean] 保存的值
*/
fun getBoolean(key: String, default: Boolean = false) =
if (isMineStarted)
appContext.getSharedPreferences(
appContext.packageName + "_preferences",
Context.MODE_PRIVATE
).getBoolean(key, default)
else XPrefUtils.getBoolean(key, default)
/**
* 获取保存的值
* @param key 名称
* @param default 默认值
* @return [String] 保存的值
*/
fun getString(key: String, default: String = "unknown") =
if (isMineStarted)
appContext.getSharedPreferences(
appContext.packageName + "_preferences",
Context.MODE_PRIVATE
).getString(key, default)
else XPrefUtils.getString(key, default)
/**
* 保存值
* @param key 名称
* @param bool 值
*/
fun putBoolean(key: String, bool: Boolean) {
appContext.getSharedPreferences(
appContext.packageName + "_preferences",
Context.MODE_PRIVATE
).edit().putBoolean(key, bool).apply()
setWorldReadable(appContext)
/** 延迟继续设置强制允许 SP 可读可写 */
Handler().postDelayed({ setWorldReadable(appContext) }, 500)
Handler().postDelayed({ setWorldReadable(appContext) }, 1000)
Handler().postDelayed({ setWorldReadable(appContext) }, 1500)
}
/**
* 保存值
* @param key 名称
* @param value 值
*/
fun putString(key: String, value: String) {
appContext.getSharedPreferences(
appContext.packageName + "_preferences",
Context.MODE_PRIVATE
).edit().putString(key, value).apply()
setWorldReadable(appContext)
/** 延迟继续设置强制允许 SP 可读可写 */
Handler().postDelayed({ setWorldReadable(appContext) }, 500)
Handler().postDelayed({ setWorldReadable(appContext) }, 1000)
Handler().postDelayed({ setWorldReadable(appContext) }, 1500)
}
/**
* 强制设置 Sp 存储为全局可读可写
* 以供模块使用
* @param context 实例
*/
fun setWorldReadable(context: Context) {
try {
if (FileUtils.getDefaultPrefFile(context).exists()) {
for (file in arrayOf<File>(
FileUtils.getDataDir(context),
FileUtils.getPrefDir(context),
FileUtils.getDefaultPrefFile(context)
)) {
file.setReadable(true, false)
file.setExecutable(true, false)
}
}
} catch (_: Exception) {
Toast.makeText(context, "无法写入模块设置,请检查权限\n如果此提示一直显示,请不要双开模块", Toast.LENGTH_SHORT).show()
}
}
}

View File

@@ -1,5 +1,5 @@
/**
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*
@@ -18,20 +18,15 @@
*
* This file is Created by fankes on 2021/9/4.
*/
@file:Suppress(
"DEPRECATION", "SetTextI18n", "SetWorldReadable", "WorldReadableFiles",
"LocalVariableName", "SameParameterValue"
)
@file:Suppress("SetTextI18n", "LocalVariableName", "SameParameterValue")
package com.fankes.tsbattery.ui
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.view.View
import android.widget.LinearLayout
import android.widget.TextView
@@ -46,9 +41,11 @@ import com.fankes.tsbattery.hook.HookMedium
import com.fankes.tsbattery.hook.HookMedium.QQ_PACKAGE_NAME
import com.fankes.tsbattery.hook.HookMedium.TIM_PACKAGE_NAME
import com.fankes.tsbattery.hook.HookMedium.WECHAT_PACKAGE_NAME
import com.fankes.tsbattery.utils.*
import com.fankes.tsbattery.utils.isInstall
import com.fankes.tsbattery.utils.isNotSystemInDarkMode
import com.fankes.tsbattery.utils.openSelfSetting
import com.fankes.tsbattery.utils.showDialog
import com.gyf.immersionbar.ktx.immersionBar
import java.io.File
class MainActivity : AppCompatActivity() {
@@ -222,87 +219,43 @@ class MainActivity : AppCompatActivity() {
override fun onResume() {
super.onResume()
setWorldReadable()
HookMedium.setWorldReadable(this)
}
override fun onRestart() {
super.onRestart()
setWorldReadable()
HookMedium.setWorldReadable(this)
}
override fun onPause() {
super.onPause()
setWorldReadable()
HookMedium.setWorldReadable(this)
}
/**
* 获取保存的值
* @param key 名称
* @param default 默认值
* @return [Boolean] 保存的值
*/
private fun getBoolean(key: String) =
getSharedPreferences(
packageName + "_preferences",
Context.MODE_PRIVATE
).getBoolean(key, false)
private fun getBoolean(key: String, default: Boolean = false) = HookMedium.getBoolean(key, default)
/**
* 保存值
* @param key 名称
* @param bool 值
*/
private fun putBoolean(key: String, bool: Boolean) {
getSharedPreferences(
packageName + "_preferences",
Context.MODE_PRIVATE
).edit().putBoolean(key, bool).apply()
setWorldReadable()
/** 延迟继续设置强制允许 SP 可读可写 */
Handler().postDelayed({ setWorldReadable() }, 500)
Handler().postDelayed({ setWorldReadable() }, 1000)
Handler().postDelayed({ setWorldReadable() }, 1500)
}
private fun putBoolean(key: String, bool: Boolean) = HookMedium.putBoolean(key, bool)
/**
* 保存值
* @param key 名称
* @param value 值
*/
private fun putString(key: String, value: String) {
getSharedPreferences(
packageName + "_preferences",
Context.MODE_PRIVATE
).edit().putString(key, value).apply()
setWorldReadable()
/** 延迟继续设置强制允许 SP 可读可写 */
Handler().postDelayed({ setWorldReadable() }, 500)
Handler().postDelayed({ setWorldReadable() }, 1000)
Handler().postDelayed({ setWorldReadable() }, 1500)
}
/**
* 强制设置 Sp 存储为全局可读可写
* 以供模块使用
*/
private fun setWorldReadable() {
try {
if (FileUtils.getDefaultPrefFile(this).exists()) {
for (file in arrayOf<File>(
FileUtils.getDataDir(this),
FileUtils.getPrefDir(this),
FileUtils.getDefaultPrefFile(this)
)) {
file.setReadable(true, false)
file.setExecutable(true, false)
}
}
} catch (_: Exception) {
Toast.makeText(this, "无法写入模块设置,请检查权限\n如果此提示一直显示,请不要双开模块", Toast.LENGTH_SHORT).show()
}
}
private fun putString(key: String, value: String) = HookMedium.putString(key, value)
override fun onBackPressed() {
setWorldReadable()
HookMedium.setWorldReadable(this)
super.onBackPressed()
}

View File

@@ -1,5 +1,5 @@
/**
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*

View File

@@ -1,5 +1,5 @@
/**
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*
@@ -24,9 +24,9 @@ import de.robv.android.xposed.XSharedPreferences
object XPrefUtils {
fun getBoolean(key: String) = pref.getBoolean(key, false)
fun getBoolean(key: String, default: Boolean = false) = pref.getBoolean(key, default)
fun getString(key: String) = pref.getString(key, "unknown")
fun getString(key: String, default: String = "unknown") = pref.getString(key, default)
private val pref: XSharedPreferences
get() {

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021. Fankes Studio(qzmmcn@163.com)
* Copyright (C) 2022. Fankes Studio(qzmmcn@163.com)
*
* This file is part of TSBattery.
*