mirror of
https://github.com/fankes/TSBattery.git
synced 2025-09-08 03:24:10 +08:00
Compare commits
14 Commits
Author | SHA1 | Date | |
---|---|---|---|
38c9d78f1e
|
|||
0ee03340da
|
|||
54ee2358cf
|
|||
55708eb96a
|
|||
c4de8ae448
|
|||
9e092742da
|
|||
fb27c107f4
|
|||
2be9a3d934
|
|||
d7dbecb65c
|
|||
6c2b3f12b3
|
|||
f1c520586a
|
|||
e9c99343c3
|
|||
20de713ffd
|
|||
3b78e8a515
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
[](https://github.com/fankes/TSBattery)
|
[](https://github.com/fankes/TSBattery)
|
||||||
[](https://github.com/fankes/TSBattery/blob/master/LICENSE)
|
[](https://github.com/fankes/TSBattery/blob/master/LICENSE)
|
||||||
[](https://github.com/fankes/TSBattery/releases)
|
[](https://github.com/fankes/TSBattery/releases)
|
||||||
[](https://github.com/fankes/TSBattery/releases)
|
[](https://github.com/fankes/TSBattery/releases)
|
||||||
[](https://github.com/Xposed-Modules-Repo/com.fankes.tsbattery/releases)
|
[](https://github.com/Xposed-Modules-Repo/com.fankes.tsbattery/releases)
|
||||||
[](https://t.me/XiaofangInternet)
|
[](https://t.me/XiaofangInternet)
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id 'com.android.application'
|
id 'com.android.application'
|
||||||
id 'kotlin-android'
|
id 'kotlin-android'
|
||||||
id 'com.google.devtools.ksp' version '1.6.21-1.0.5'
|
id 'com.google.devtools.ksp' version '1.7.0-1.0.6'
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
@@ -15,8 +15,7 @@ android {
|
|||||||
v2SigningEnabled true
|
v2SigningEnabled true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
compileSdkVersion 31
|
compileSdkVersion 32
|
||||||
buildToolsVersion "31.0.0"
|
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "com.fankes.tsbattery"
|
applicationId "com.fankes.tsbattery"
|
||||||
@@ -31,6 +30,8 @@ android {
|
|||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
minifyEnabled rootProject.ext.enableR8
|
minifyEnabled rootProject.ext.enableR8
|
||||||
|
shrinkResources rootProject.ext.enableR8
|
||||||
|
zipAlignEnabled rootProject.ext.enableR8
|
||||||
signingConfig signingConfigs.debug
|
signingConfig signingConfigs.debug
|
||||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
}
|
}
|
||||||
@@ -57,14 +58,12 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnly 'de.robv.android.xposed:api:82'
|
compileOnly 'de.robv.android.xposed:api:82'
|
||||||
implementation 'com.highcapable.yukihookapi:api:1.0.91'
|
implementation 'com.highcapable.yukihookapi:api:1.0.92'
|
||||||
ksp 'com.highcapable.yukihookapi:ksp-xposed:1.0.91'
|
ksp 'com.highcapable.yukihookapi:ksp-xposed:1.0.92'
|
||||||
implementation 'com.squareup.okhttp3:okhttp:4.9.3'
|
implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.7'
|
||||||
implementation 'com.geyifeng.immersionbar:immersionbar:3.2.0'
|
implementation 'androidx.core:core-ktx:1.8.0'
|
||||||
implementation 'com.geyifeng.immersionbar:immersionbar-ktx:3.2.0'
|
implementation 'androidx.appcompat:appcompat:1.4.2'
|
||||||
implementation 'androidx.core:core-ktx:1.7.0'
|
implementation 'com.google.android.material:material:1.6.1'
|
||||||
implementation 'androidx.appcompat:appcompat:1.4.1'
|
|
||||||
implementation 'com.google.android.material:material:1.6.0'
|
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
||||||
testImplementation 'junit:junit:4.13.2'
|
testImplementation 'junit:junit:4.13.2'
|
||||||
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
||||||
|
@@ -54,7 +54,7 @@ import com.highcapable.yukihookapi.hook.type.android.*
|
|||||||
import com.highcapable.yukihookapi.hook.type.java.*
|
import com.highcapable.yukihookapi.hook.type.java.*
|
||||||
import com.highcapable.yukihookapi.hook.xposed.proxy.IYukiHookXposedInit
|
import com.highcapable.yukihookapi.hook.xposed.proxy.IYukiHookXposedInit
|
||||||
|
|
||||||
@InjectYukiHookWithXposed
|
@InjectYukiHookWithXposed(isUsingResourcesHook = false)
|
||||||
class HookEntry : IYukiHookXposedInit {
|
class HookEntry : IYukiHookXposedInit {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@@ -134,6 +134,10 @@ class HookEntry : IYukiHookXposedInit {
|
|||||||
interceptBaseChatPie(methodName = "bl")
|
interceptBaseChatPie(methodName = "bl")
|
||||||
interceptBaseChatPie(methodName = "bm")
|
interceptBaseChatPie(methodName = "bm")
|
||||||
}
|
}
|
||||||
|
"8.8.93" -> {
|
||||||
|
interceptBaseChatPie(methodName = "J3")
|
||||||
|
interceptBaseChatPie(methodName = "S")
|
||||||
|
}
|
||||||
else -> loggerD(msg = "$version not supported!")
|
else -> loggerD(msg = "$version not supported!")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -147,6 +151,7 @@ class HookEntry : IYukiHookXposedInit {
|
|||||||
injectMember {
|
injectMember {
|
||||||
method {
|
method {
|
||||||
name = methodName
|
name = methodName
|
||||||
|
emptyParam()
|
||||||
returnType = UnitType
|
returnType = UnitType
|
||||||
}
|
}
|
||||||
intercept()
|
intercept()
|
||||||
@@ -159,7 +164,7 @@ class HookEntry : IYukiHookXposedInit {
|
|||||||
injectMember {
|
injectMember {
|
||||||
method {
|
method {
|
||||||
name = "acquireLocked"
|
name = "acquireLocked"
|
||||||
returnType = UnitType
|
emptyParam()
|
||||||
}
|
}
|
||||||
intercept()
|
intercept()
|
||||||
}
|
}
|
||||||
|
@@ -47,7 +47,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
|||||||
|
|
||||||
private const val moduleVersion = BuildConfig.VERSION_NAME
|
private const val moduleVersion = BuildConfig.VERSION_NAME
|
||||||
private const val qqSupportVersion =
|
private const val qqSupportVersion =
|
||||||
"8.2.11(Play)、8.8.17、8.8.23、8.8.35、8.8.38、8.8.50、8.8.55、8.8.68、8.8.80、8.8.83、8.8.85、8.8.88、8.8.90 (8.2.11、8.5.5~8.8.90)"
|
"8.2.11(Play)、8.8.17、8.8.23、8.8.35、8.8.38、8.8.50、8.8.55、8.8.68、8.8.80、8.8.83、8.8.85、8.8.88、8.8.90、8.8.93 (8.2.11、8.5.5~8.8.93)"
|
||||||
private const val timSupportVersion = "2+、3+ (并未完全测试每个版本)"
|
private const val timSupportVersion = "2+、3+ (并未完全测试每个版本)"
|
||||||
private const val wechatSupportVersion = "全版本仅支持基础省电,更多功能依然画饼"
|
private const val wechatSupportVersion = "全版本仅支持基础省电,更多功能依然画饼"
|
||||||
|
|
||||||
|
@@ -23,12 +23,14 @@
|
|||||||
|
|
||||||
package com.fankes.tsbattery.ui.activity.base
|
package com.fankes.tsbattery.ui.activity.base
|
||||||
|
|
||||||
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.core.content.res.ResourcesCompat
|
||||||
|
import androidx.core.view.WindowCompat
|
||||||
import androidx.viewbinding.ViewBinding
|
import androidx.viewbinding.ViewBinding
|
||||||
import com.fankes.tsbattery.R
|
import com.fankes.tsbattery.R
|
||||||
import com.fankes.tsbattery.utils.factory.isNotSystemInDarkMode
|
import com.fankes.tsbattery.utils.factory.isNotSystemInDarkMode
|
||||||
import com.gyf.immersionbar.ktx.immersionBar
|
|
||||||
import com.highcapable.yukihookapi.hook.factory.method
|
import com.highcapable.yukihookapi.hook.factory.method
|
||||||
import com.highcapable.yukihookapi.hook.type.android.LayoutInflaterClass
|
import com.highcapable.yukihookapi.hook.type.android.LayoutInflaterClass
|
||||||
import java.lang.reflect.ParameterizedType
|
import java.lang.reflect.ParameterizedType
|
||||||
@@ -52,13 +54,14 @@ abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {
|
|||||||
/** 隐藏系统的标题栏 */
|
/** 隐藏系统的标题栏 */
|
||||||
supportActionBar?.hide()
|
supportActionBar?.hide()
|
||||||
/** 初始化沉浸状态栏 */
|
/** 初始化沉浸状态栏 */
|
||||||
immersionBar {
|
WindowCompat.getInsetsController(window, window.decorView).apply {
|
||||||
statusBarColor(R.color.colorThemeBackground)
|
isAppearanceLightStatusBars = isNotSystemInDarkMode
|
||||||
autoDarkModeEnable(true)
|
isAppearanceLightNavigationBars = isNotSystemInDarkMode
|
||||||
statusBarDarkFont(isNotSystemInDarkMode)
|
}
|
||||||
navigationBarColor(R.color.colorThemeBackground)
|
ResourcesCompat.getColor(resources, R.color.colorThemeBackground, null).also {
|
||||||
navigationBarDarkIcon(isNotSystemInDarkMode)
|
window?.statusBarColor = it
|
||||||
fitsSystemWindows(true)
|
window?.navigationBarColor = it
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) window?.navigationBarDividerColor = it
|
||||||
}
|
}
|
||||||
/** 装载子类 */
|
/** 装载子类 */
|
||||||
onCreate()
|
onCreate()
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
*
|
*
|
||||||
* This file is Created by fankes on 2022/1/8.
|
* This file is Created by fankes on 2022/1/8.
|
||||||
*/
|
*/
|
||||||
@file:Suppress("DEPRECATION", "CanvasSize")
|
@file:Suppress("DEPRECATION", "CanvasSize", "OVERRIDE_DEPRECATION")
|
||||||
|
|
||||||
package com.fankes.tsbattery.utils.drawable.drawabletoolbox
|
package com.fankes.tsbattery.utils.drawable.drawabletoolbox
|
||||||
|
|
||||||
|
@@ -28,26 +28,21 @@ import android.content.Context
|
|||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.graphics.drawable.GradientDrawable
|
import android.graphics.drawable.GradientDrawable
|
||||||
import android.view.Gravity
|
import android.view.Gravity
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import android.widget.ProgressBar
|
import android.widget.ProgressBar
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.viewbinding.ViewBinding
|
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import com.highcapable.yukihookapi.annotation.CauseProblemsApi
|
|
||||||
import com.highcapable.yukihookapi.hook.factory.method
|
|
||||||
import com.highcapable.yukihookapi.hook.type.android.LayoutInflaterClass
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造对话框
|
* 构造对话框
|
||||||
* @param isUseBlackTheme 是否使用深色主题
|
* @param isUseBlackTheme 是否使用深色主题
|
||||||
* @param it 对话框方法体
|
* @param initiate 对话框方法体
|
||||||
*/
|
*/
|
||||||
fun Context.showDialog(isUseBlackTheme: Boolean = false, it: DialogBuilder.() -> Unit) =
|
fun Context.showDialog(isUseBlackTheme: Boolean = false, initiate: DialogBuilder.() -> Unit) =
|
||||||
DialogBuilder(this, isUseBlackTheme).apply(it).show()
|
DialogBuilder(context = this, isUseBlackTheme).apply(initiate).show()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 对话框构造器
|
* 对话框构造器
|
||||||
@@ -60,9 +55,7 @@ class DialogBuilder(val context: Context, private val isUseBlackTheme: Boolean)
|
|||||||
private var instanceAndroid: android.app.AlertDialog.Builder? = null // 实例对象
|
private var instanceAndroid: android.app.AlertDialog.Builder? = null // 实例对象
|
||||||
|
|
||||||
private var dialogInstance: Dialog? = null // 对话框实例
|
private var dialogInstance: Dialog? = null // 对话框实例
|
||||||
|
private var customLayoutView: View? = null // 自定义布局
|
||||||
@CauseProblemsApi
|
|
||||||
var customLayoutView: View? = null // 自定义布局
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否需要使用 AndroidX 风格对话框
|
* 是否需要使用 AndroidX 风格对话框
|
||||||
@@ -125,49 +118,37 @@ class DialogBuilder(val context: Context, private val isUseBlackTheme: Boolean)
|
|||||||
else customLayoutView?.findViewWithTag<TextView>("progressContent")?.text = value
|
else customLayoutView?.findViewWithTag<TextView>("progressContent")?.text = value
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置对话框自定义布局
|
|
||||||
* @return [ViewBinding]
|
|
||||||
*/
|
|
||||||
inline fun <reified T : ViewBinding> bind() =
|
|
||||||
T::class.java.method {
|
|
||||||
name = "inflate"
|
|
||||||
param(LayoutInflaterClass)
|
|
||||||
}.get().invoke<T>(LayoutInflater.from(context))?.apply {
|
|
||||||
customLayoutView = root
|
|
||||||
} ?: error("binding failed")
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置对话框确定按钮
|
* 设置对话框确定按钮
|
||||||
* @param text 按钮文本内容
|
* @param text 按钮文本内容
|
||||||
* @param it 点击事件
|
* @param callback 点击事件
|
||||||
*/
|
*/
|
||||||
fun confirmButton(text: String = "确定", it: () -> Unit = {}) {
|
fun confirmButton(text: String = "确定", callback: () -> Unit = {}) {
|
||||||
if (isUsingAndroidX)
|
if (isUsingAndroidX)
|
||||||
runInSafe { instanceAndroidX?.setPositiveButton(text) { _, _ -> it() } }
|
runInSafe { instanceAndroidX?.setPositiveButton(text) { _, _ -> callback() } }
|
||||||
else runInSafe { instanceAndroid?.setPositiveButton(text) { _, _ -> it() } }
|
else runInSafe { instanceAndroid?.setPositiveButton(text) { _, _ -> callback() } }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置对话框取消按钮
|
* 设置对话框取消按钮
|
||||||
* @param text 按钮文本内容
|
* @param text 按钮文本内容
|
||||||
* @param it 点击事件
|
* @param callback 点击事件
|
||||||
*/
|
*/
|
||||||
fun cancelButton(text: String = "取消", it: () -> Unit = {}) {
|
fun cancelButton(text: String = "取消", callback: () -> Unit = {}) {
|
||||||
if (isUsingAndroidX)
|
if (isUsingAndroidX)
|
||||||
runInSafe { instanceAndroidX?.setNegativeButton(text) { _, _ -> it() } }
|
runInSafe { instanceAndroidX?.setNegativeButton(text) { _, _ -> callback() } }
|
||||||
else runInSafe { instanceAndroid?.setNegativeButton(text) { _, _ -> it() } }
|
else runInSafe { instanceAndroid?.setNegativeButton(text) { _, _ -> callback() } }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置对话框第三个按钮
|
* 设置对话框第三个按钮
|
||||||
* @param text 按钮文本内容
|
* @param text 按钮文本内容
|
||||||
* @param it 点击事件
|
* @param callback 点击事件
|
||||||
*/
|
*/
|
||||||
fun neutralButton(text: String = "更多", it: () -> Unit = {}) {
|
fun neutralButton(text: String = "更多", callback: () -> Unit = {}) {
|
||||||
if (isUsingAndroidX)
|
if (isUsingAndroidX)
|
||||||
runInSafe { instanceAndroidX?.setNeutralButton(text) { _, _ -> it() } }
|
runInSafe { instanceAndroidX?.setNeutralButton(text) { _, _ -> callback() } }
|
||||||
else runInSafe { instanceAndroid?.setNeutralButton(text) { _, _ -> it() } }
|
else runInSafe { instanceAndroid?.setNeutralButton(text) { _, _ -> callback() } }
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 取消对话框 */
|
/** 取消对话框 */
|
||||||
|
@@ -137,13 +137,13 @@ fun toast(msg: String) = Toast.makeText(appContext, msg, Toast.LENGTH_SHORT).sho
|
|||||||
* 弹出 [Snackbar]
|
* 弹出 [Snackbar]
|
||||||
* @param msg 提示内容
|
* @param msg 提示内容
|
||||||
* @param actionText 按钮文本 - 不写默认取消按钮
|
* @param actionText 按钮文本 - 不写默认取消按钮
|
||||||
* @param it 按钮事件回调
|
* @param callback 按钮事件回调
|
||||||
*/
|
*/
|
||||||
fun Context.snake(msg: String, actionText: String = "", it: () -> Unit = {}) =
|
fun Context.snake(msg: String, actionText: String = "", callback: () -> Unit = {}) =
|
||||||
Snackbar.make((this as Activity).findViewById(android.R.id.content), msg, Snackbar.LENGTH_LONG).apply {
|
Snackbar.make((this as Activity).findViewById(android.R.id.content), msg, Snackbar.LENGTH_LONG).apply {
|
||||||
if (actionText.isBlank()) return@apply
|
if (actionText.isBlank()) return@apply
|
||||||
setActionTextColor(if (isSystemInDarkMode) Color.BLACK else Color.WHITE)
|
setActionTextColor(if (isSystemInDarkMode) Color.BLACK else Color.WHITE)
|
||||||
setAction(actionText) { it() }
|
setAction(actionText) { callback() }
|
||||||
}.show()
|
}.show()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -19,15 +19,21 @@
|
|||||||
*
|
*
|
||||||
* This file is Created by fankes on 2022/3/20.
|
* This file is Created by fankes on 2022/3/20.
|
||||||
*/
|
*/
|
||||||
|
@file:Suppress("NewApi")
|
||||||
|
|
||||||
package com.fankes.tsbattery.utils.tool
|
package com.fankes.tsbattery.utils.tool
|
||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.icu.text.SimpleDateFormat
|
||||||
|
import android.icu.util.Calendar
|
||||||
|
import android.icu.util.TimeZone
|
||||||
import com.fankes.tsbattery.utils.factory.*
|
import com.fankes.tsbattery.utils.factory.*
|
||||||
import okhttp3.*
|
import okhttp3.*
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取 Github Release 最新版本工具类
|
* 获取 Github Release 最新版本工具类
|
||||||
@@ -44,9 +50,9 @@ object GithubReleaseTool {
|
|||||||
* 获取最新版本信息
|
* 获取最新版本信息
|
||||||
* @param context 实例
|
* @param context 实例
|
||||||
* @param version 当前版本
|
* @param version 当前版本
|
||||||
* @param it 成功后回调 - ([String] 最新版本,[Function] 更新对话框方法体)
|
* @param result 成功后回调 - ([String] 最新版本,[Function] 更新对话框方法体)
|
||||||
*/
|
*/
|
||||||
fun checkingForUpdate(context: Context, version: String, it: (String, () -> Unit) -> Unit) = checkingInternetConnect(context) {
|
fun checkingForUpdate(context: Context, version: String, result: (String, () -> Unit) -> Unit) = checkingInternetConnect(context) {
|
||||||
OkHttpClient().newBuilder().build().newCall(
|
OkHttpClient().newBuilder().build().newCall(
|
||||||
Request.Builder()
|
Request.Builder()
|
||||||
.url("https://api.github.com/repos/$REPO_AUTHOR/$REPO_NAME/releases/latest")
|
.url("https://api.github.com/repos/$REPO_AUTHOR/$REPO_NAME/releases/latest")
|
||||||
@@ -56,12 +62,12 @@ object GithubReleaseTool {
|
|||||||
override fun onFailure(call: Call, e: IOException) {}
|
override fun onFailure(call: Call, e: IOException) {}
|
||||||
|
|
||||||
override fun onResponse(call: Call, response: Response) = runInSafe {
|
override fun onResponse(call: Call, response: Response) = runInSafe {
|
||||||
JSONObject(response.body?.string() ?: "").apply {
|
JSONObject(response.body.string()).apply {
|
||||||
GithubReleaseBean(
|
GithubReleaseBean(
|
||||||
name = getString("name"),
|
name = getString("name"),
|
||||||
htmlUrl = getString("html_url"),
|
htmlUrl = getString("html_url"),
|
||||||
content = getString("body"),
|
content = getString("body"),
|
||||||
date = getString("published_at").replace(oldValue = "T", newValue = " ").replace(oldValue = "Z", newValue = "")
|
date = getString("published_at").localTime()
|
||||||
).apply {
|
).apply {
|
||||||
fun showUpdate() = context.showDialog {
|
fun showUpdate() = context.showDialog {
|
||||||
title = "最新版本 $name"
|
title = "最新版本 $name"
|
||||||
@@ -72,7 +78,7 @@ object GithubReleaseTool {
|
|||||||
}
|
}
|
||||||
if (name != version) (context as? Activity?)?.runOnUiThread {
|
if (name != version) (context as? Activity?)?.runOnUiThread {
|
||||||
showUpdate()
|
showUpdate()
|
||||||
it(name) { showUpdate() }
|
result(name) { showUpdate() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -83,9 +89,9 @@ object GithubReleaseTool {
|
|||||||
/**
|
/**
|
||||||
* 检查网络连接情况
|
* 检查网络连接情况
|
||||||
* @param context 实例
|
* @param context 实例
|
||||||
* @param it 已连接回调
|
* @param callback 已连接回调
|
||||||
*/
|
*/
|
||||||
private fun checkingInternetConnect(context: Context, it: () -> Unit) = runInSafe {
|
private fun checkingInternetConnect(context: Context, callback: () -> Unit) = runInSafe {
|
||||||
if (isNetWorkSuccess)
|
if (isNetWorkSuccess)
|
||||||
OkHttpClient().newBuilder().build().newCall(
|
OkHttpClient().newBuilder().build().newCall(
|
||||||
Request.Builder()
|
Request.Builder()
|
||||||
@@ -106,11 +112,23 @@ object GithubReleaseTool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onResponse(call: Call, response: Response) = runInSafe {
|
override fun onResponse(call: Call, response: Response) = runInSafe {
|
||||||
(context as? Activity?)?.runOnUiThread { runInSafe { it() } }
|
(context as? Activity?)?.runOnUiThread { runInSafe { callback() } }
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 格式化时间为本地时区
|
||||||
|
* @return [String] 本地时区时间
|
||||||
|
*/
|
||||||
|
private fun String.localTime() = replace(oldValue = "T", newValue = " ").replace(oldValue = "Z", newValue = "").let {
|
||||||
|
runCatching {
|
||||||
|
val local = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ROOT).apply { timeZone = Calendar.getInstance().timeZone }
|
||||||
|
val current = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ROOT).apply { timeZone = TimeZone.getTimeZone("GMT") }
|
||||||
|
local.format(current.parse(it))
|
||||||
|
}.getOrNull() ?: it
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Github Release bean
|
* Github Release bean
|
||||||
* @param name 版本名称
|
* @param name 版本名称
|
||||||
|
@@ -1,6 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* TSBattery - A new way to save your battery avoid cancer apps hacker it.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/fankes/TSBattery
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/30.
|
||||||
|
*/
|
||||||
package com.fankes.tsbattery.utils.tool
|
package com.fankes.tsbattery.utils.tool
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import com.fankes.tsbattery.BuildConfig
|
||||||
import com.fankes.tsbattery.utils.factory.openBrowser
|
import com.fankes.tsbattery.utils.factory.openBrowser
|
||||||
import com.fankes.tsbattery.utils.factory.showDialog
|
import com.fankes.tsbattery.utils.factory.showDialog
|
||||||
import com.highcapable.yukihookapi.YukiHookAPI
|
import com.highcapable.yukihookapi.YukiHookAPI
|
||||||
@@ -13,7 +35,7 @@ import com.highcapable.yukihookapi.hook.xposed.prefs.data.PrefsData
|
|||||||
object YukiPromoteTool {
|
object YukiPromoteTool {
|
||||||
|
|
||||||
/** 推广已读存储键值 */
|
/** 推广已读存储键值 */
|
||||||
private val YUKI_PROMOTE_READED = PrefsData("yuki_promote_readed", false)
|
private val YUKI_PROMOTE_READED = PrefsData("yuki_promote_readed_${BuildConfig.VERSION_NAME}", false)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 显示推广对话框
|
* 显示推广对话框
|
||||||
|
@@ -2,13 +2,13 @@
|
|||||||
<!-- Base application theme. -->
|
<!-- Base application theme. -->
|
||||||
<style name="Theme.TSBattery" parent="Theme.Material3.DayNight">
|
<style name="Theme.TSBattery" parent="Theme.Material3.DayNight">
|
||||||
<!-- Primary brand color. -->
|
<!-- Primary brand color. -->
|
||||||
<item name="colorPrimary">@color/purple_200</item>
|
<item name="colorPrimary">@color/colorPrimaryAccent</item>
|
||||||
<item name="colorPrimaryVariant">@color/purple_700</item>
|
<item name="colorPrimaryVariant">@color/colorPrimaryAccent</item>
|
||||||
<item name="colorOnPrimary">@color/black</item>
|
<item name="colorOnPrimary">@color/black</item>
|
||||||
<!-- Secondary brand color. -->
|
<!-- Secondary brand color. -->
|
||||||
<item name="colorSecondary">@color/teal_200</item>
|
<item name="colorSecondary">@color/colorPrimaryAccent</item>
|
||||||
<item name="colorSecondaryVariant">@color/teal_200</item>
|
<item name="colorSecondaryVariant">@color/colorPrimaryAccent</item>
|
||||||
<item name="colorOnSecondary">@color/black</item>
|
<item name="colorOnSecondary">@color/colorPrimaryAccent</item>
|
||||||
<!-- Status bar color. -->
|
<!-- Status bar color. -->
|
||||||
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
|
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
|
||||||
<!-- Customize your theme here. -->
|
<!-- Customize your theme here. -->
|
||||||
|
@@ -1,10 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<color name="purple_200">#656565</color>
|
<color name="colorPrimaryAccent">#656565</color>
|
||||||
<color name="purple_500">#656565</color>
|
|
||||||
<color name="purple_700">#656565</color>
|
|
||||||
<color name="teal_200">#656565</color>
|
|
||||||
<color name="teal_700">#656565</color>
|
|
||||||
<color name="black">#FF000000</color>
|
<color name="black">#FF000000</color>
|
||||||
<color name="white">#FFFFFFFF</color>
|
<color name="white">#FFFFFFFF</color>
|
||||||
</resources>
|
</resources>
|
@@ -2,13 +2,13 @@
|
|||||||
<!-- Base application theme. -->
|
<!-- Base application theme. -->
|
||||||
<style name="Theme.TSBattery" parent="Theme.Material3.DayNight">
|
<style name="Theme.TSBattery" parent="Theme.Material3.DayNight">
|
||||||
<!-- Primary brand color. -->
|
<!-- Primary brand color. -->
|
||||||
<item name="colorPrimary">@color/purple_500</item>
|
<item name="colorPrimary">@color/colorPrimaryAccent</item>
|
||||||
<item name="colorPrimaryVariant">@color/purple_700</item>
|
<item name="colorPrimaryVariant">@color/colorPrimaryAccent</item>
|
||||||
<item name="colorOnPrimary">@color/teal_700</item>
|
<item name="colorOnPrimary">@color/colorPrimaryAccent</item>
|
||||||
<!-- Secondary brand color. -->
|
<!-- Secondary brand color. -->
|
||||||
<item name="colorSecondary">@color/teal_200</item>
|
<item name="colorSecondary">@color/colorPrimaryAccent</item>
|
||||||
<item name="colorSecondaryVariant">@color/teal_700</item>
|
<item name="colorSecondaryVariant">@color/colorPrimaryAccent</item>
|
||||||
<item name="colorOnSecondary">@color/black</item>
|
<item name="colorOnSecondary">@color/colorPrimaryAccent</item>
|
||||||
<!-- Status bar color. -->
|
<!-- Status bar color. -->
|
||||||
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
|
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
|
||||||
<!-- Customize your theme here. -->
|
<!-- Customize your theme here. -->
|
||||||
|
10
build.gradle
10
build.gradle
@@ -1,12 +1,12 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id 'com.android.application' version '7.2.0' apply false
|
id 'com.android.application' version '7.2.1' apply false
|
||||||
id 'com.android.library' version '7.2.0' apply false
|
id 'com.android.library' version '7.2.1' apply false
|
||||||
id 'org.jetbrains.kotlin.android' version '1.6.21' apply false
|
id 'org.jetbrains.kotlin.android' version '1.7.0' apply false
|
||||||
}
|
}
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
appVersionName = "3.9"
|
appVersionName = "3.96"
|
||||||
appVersionCode = 17
|
appVersionCode = 19
|
||||||
enableR8 = true
|
enableR8 = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
||||||
# Specifies the JVM arguments used for the daemon process.
|
# Specifies the JVM arguments used for the daemon process.
|
||||||
# The setting is particularly useful for tweaking memory settings.
|
# The setting is particularly useful for tweaking memory settings.
|
||||||
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
|
org.gradle.jvmargs=-XX:+UseParallelGC
|
||||||
# When configured, Gradle will run in incubating parallel mode.
|
# When configured, Gradle will run in incubating parallel mode.
|
||||||
# This option should only be used with decoupled projects. More details, visit
|
# This option should only be used with decoupled projects. More details, visit
|
||||||
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
||||||
@@ -19,3 +19,5 @@ android.useAndroidX=true
|
|||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
# Kotlin code style for this project: "official" or "obsolete":
|
# Kotlin code style for this project: "official" or "obsolete":
|
||||||
kotlin.code.style=official
|
kotlin.code.style=official
|
||||||
|
# Incremental
|
||||||
|
kotlin.incremental.useClasspathSnapshot=true
|
Reference in New Issue
Block a user