Skip to content

Commit 7119874

Browse files
committed
closes #16; fix time zone issue for overseas users.
1 parent dfc7793 commit 7119874

22 files changed

+157
-99
lines changed

app/src/main/java/me/teble/xposed/autodaily/hook/CoreServiceHook.kt

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import me.teble.xposed.autodaily.ui.ConfUnit
2020
import me.teble.xposed.autodaily.utils.LogUtil
2121
import me.teble.xposed.autodaily.utils.TimeUtil
2222
import java.time.LocalDateTime
23+
import java.util.*
2324
import java.util.concurrent.TimeUnit
2425
import java.util.concurrent.locks.ReentrantLock
2526
import kotlin.concurrent.thread
@@ -37,6 +38,7 @@ class CoreServiceHook : BaseHook() {
3738
private val cronLock = ReentrantLock()
3839
const val EXEC_TASK = 1
3940
const val AUTO_EXEC = 2
41+
const val START_CRON = 3
4042
private val handlerThread by lazy {
4143
HandlerThread("CoreServiceHookThread").apply { start() }
4244
}
@@ -47,6 +49,7 @@ class CoreServiceHook : BaseHook() {
4749
when (msg.what) {
4850
EXEC_TASK -> runTasks(true)
4951
AUTO_EXEC -> runTasks(false)
52+
START_CRON -> startCorn()
5053
}
5154
}
5255
}
@@ -74,7 +77,7 @@ class CoreServiceHook : BaseHook() {
7477
}
7578

7679
private fun executorTask(conf: TaskProperties) {
77-
val executeTime = TimeUtil.currentTimeMillis()
80+
val executeTime = System.currentTimeMillis()
7881
val needExecGroups = mutableListOf<TaskGroup>()
7982
lock.withLock {
8083
for (group in conf.taskGroups) {
@@ -112,7 +115,7 @@ class CoreServiceHook : BaseHook() {
112115
}
113116
threadPool.shutdown()
114117
while (!threadPool.awaitTermination(1, TimeUnit.SECONDS)) {
115-
if (TimeUtil.currentTimeMillis() - executeTime > 20 * 60 * 1000) {
118+
if (System.currentTimeMillis() - executeTime > 20 * 60 * 1000) {
116119
// 关闭运行时间超过20分钟的任务
117120
threadPool.shutdownNow()
118121
}
@@ -125,41 +128,47 @@ class CoreServiceHook : BaseHook() {
125128
}
126129
}
127130
}
131+
132+
private fun startCorn() {
133+
val scheduler = CronUtil.scheduler
134+
if (scheduler.isStarted) {
135+
return
136+
}
137+
TimeUtil.init()
138+
CronUtil.setMatchSecond(true)
139+
scheduler.setTimeZone(TimeZone.getTimeZone("GMT+8"))
140+
try {
141+
CronUtil.start()
142+
} catch (e: Throwable) {
143+
LogUtil.e(e, "CronUtil.start error: ")
144+
ToastUtil.send("任务调度器启动失败,详情请查看日志")
145+
}
146+
LogUtil.d("CoreService 进程已经启动,启动时间 -> ${LocalDateTime.now()}")
147+
LogUtil.d("任务调度器启动成功")
148+
CronUtil.schedule(
149+
"task_timer",
150+
"0 */10 * * * *"
151+
) {
152+
handler.sendEmptyMessage(AUTO_EXEC)
153+
}
154+
CronUtil.schedule(
155+
"check_update_task",
156+
"0 0 9/3 * * *"
157+
) {
158+
if (ConfigUtil.checkUpdate(false)) {
159+
ConfUnit.needUpdate = true
160+
}
161+
}
162+
LogUtil.d("任务调度器存在任务:${scheduler.taskTable.ids}")
163+
}
128164
}
129165

130166
@MethodHook("代理 service hook")
131167
fun coreServiceHook() {
132168
XposedHelpers.findAndHookMethod(load(CoreService),
133169
"onCreate", object : XC_MethodHook() {
134170
override fun beforeHookedMethod(param: MethodHookParam) {
135-
val scheduler = CronUtil.scheduler
136-
if (scheduler.isStarted) {
137-
return
138-
}
139-
CronUtil.setMatchSecond(true)
140-
try {
141-
CronUtil.start()
142-
} catch (e: Throwable) {
143-
LogUtil.e(e, "CronUtil.start error: ")
144-
ToastUtil.send("任务调度器启动失败,详情请查看日志")
145-
}
146-
logd("CoreService 进程已经启动,启动时间 -> ${LocalDateTime.now()}")
147-
LogUtil.d("任务调度器启动成功")
148-
CronUtil.schedule(
149-
"task_timer",
150-
"0 */10 * * * *"
151-
) {
152-
handler.sendEmptyMessage(AUTO_EXEC)
153-
}
154-
CronUtil.schedule(
155-
"check_update_task",
156-
"0 0 9/3 * * *"
157-
) {
158-
if (ConfigUtil.checkUpdate(false)) {
159-
ConfUnit.needUpdate = true
160-
}
161-
}
162-
LogUtil.d("任务调度器存在任务:${scheduler.taskTable.ids}")
171+
handler.sendEmptyMessage(START_CRON)
163172
}
164173
}
165174
)

app/src/main/java/me/teble/xposed/autodaily/hook/MainHook.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import me.teble.xposed.autodaily.hook.proxy.ProxyManager
3232
import me.teble.xposed.autodaily.hook.proxy.activity.ResInjectUtil
3333
import me.teble.xposed.autodaily.hook.utils.ToastUtil
3434
import me.teble.xposed.autodaily.utils.LogUtil
35-
import me.teble.xposed.autodaily.utils.TimeUtil
3635
import me.teble.xposed.autodaily.utils.fieldValueAs
3736
import me.teble.xposed.autodaily.utils.new
3837
import java.lang.reflect.Method
@@ -180,9 +179,9 @@ class MainHook : IXposedHookLoadPackage, IXposedHookZygoteInit {
180179
LogUtil.log("needLocateClasses -> $needLocateClasses")
181180
ToastUtil.send("正在尝试定位QQ混淆类")
182181
val info = needLocateClasses.associateWith { confuseInfo[it] }
183-
val startTime = TimeUtil.currentTimeMillis()
182+
val startTime = System.currentTimeMillis()
184183
val locateRes = locateClasses(info)
185-
val useTime = TimeUtil.currentTimeMillis() - startTime
184+
val useTime = System.currentTimeMillis() - startTime
186185
var locateNum = 0
187186
locateRes.forEach {
188187
if (it.value.size == 1) {

app/src/main/java/me/teble/xposed/autodaily/hook/SplashActivityHook.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import me.teble.xposed.autodaily.ui.AppUpdateLayout
2121
import me.teble.xposed.autodaily.ui.ConfUnit
2222
import me.teble.xposed.autodaily.ui.ConfigUpdateLayout
2323
import me.teble.xposed.autodaily.ui.CustomDialog
24-
import me.teble.xposed.autodaily.utils.TimeUtil
2524
import java.util.*
2625
import kotlin.concurrent.thread
2726

@@ -38,7 +37,6 @@ class SplashActivityHook : BaseHook() {
3837
findMethod(SplashActivity) { name == "doOnCreate" }.hookAfter {
3938
val context = it.thisObject as Activity
4039
thread {
41-
TimeUtil.init()
4240
loadSaveConf()
4341
if (ConfigUtil.checkUpdate(false)) {
4442
ConfUnit.needUpdate = true

app/src/main/java/me/teble/xposed/autodaily/hook/function/impl/FavoriteManager.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ open class FavoriteManager : BaseFunction(
3838

3939
open fun syncGetVoterList(page: Int, pageSize: Int): List<VoterInfo>? {
4040
LogUtil.d("正在获取点赞列表 page: $page, pageSize: $pageSize")
41-
val startTime = TimeUtil.currentTimeMillis()
41+
val startTime = System.currentTimeMillis()
4242
val id = "syncGetVoterList"
4343
FromServiceMsgHook.resMap[id] = null
4444
getVoterList(page, pageSize)
45-
while (TimeUtil.currentTimeMillis() - startTime < 10_000) {
45+
while (System.currentTimeMillis() - startTime < 10_000) {
4646
Thread.sleep(120)
4747
@Suppress("UNCHECKED_CAST")
4848
val tmp = FromServiceMsgHook.resMap[id] as List<VoterInfo>?
@@ -57,7 +57,7 @@ open class FavoriteManager : BaseFunction(
5757

5858
open fun getAllYesterdayVoter(maxPage: Int): List<VoterInfo>? {
5959
LogUtil.d("正在获取前${maxPage}页的点赞列表")
60-
val beginOfYesterday = DateUtil.beginOfDay(Date(TimeUtil.currentTimeMillis())).time / 1000 - 24 * 60 * 60
60+
val beginOfYesterday = DateUtil.beginOfDay(Date(TimeUtil.cnTimeMillis())).time / 1000 - 24 * 60 * 60
6161
val mutableList = mutableListOf<VoterInfo>()
6262
for (i in 1..maxPage) {
6363
val list = syncGetVoterList(i, 30)

app/src/main/java/me/teble/xposed/autodaily/hook/function/impl/MiniLoginManager.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import me.teble.xposed.autodaily.hook.utils.QApplicationUtil
1111
import me.teble.xposed.autodaily.hook.utils.QApplicationUtil.currentUin
1212
import me.teble.xposed.autodaily.hook.utils.WupUtil
1313
import me.teble.xposed.autodaily.utils.LogUtil
14-
import me.teble.xposed.autodaily.utils.TimeUtil
1514
import me.teble.xposed.autodaily.utils.invokeAs
1615
import me.teble.xposed.autodaily.utils.new
1716
import mqq.app.Packet
@@ -30,11 +29,11 @@ open class MiniLoginManager : BaseFunction(
3029
}
3130

3231
open fun syncGetLoginCode(miniAppId: String): String? {
33-
val startTime = TimeUtil.currentTimeMillis()
32+
val startTime = System.currentTimeMillis()
3433
val id = "syncGetLoginCode"
3534
FromServiceMsgHook.resMap[id] = null
3635
sendLoginRequest(miniAppId)
37-
while (TimeUtil.currentTimeMillis() - startTime < 10_000) {
36+
while (System.currentTimeMillis() - startTime < 10_000) {
3837
Thread.sleep(120)
3938
val tmp = FromServiceMsgHook.resMap[id] as String?
4039
tmp?.let {

app/src/main/java/me/teble/xposed/autodaily/hook/function/impl/MiniProfileManager.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import me.teble.xposed.autodaily.hook.utils.QApplicationUtil.currentUin
1212
import me.teble.xposed.autodaily.hook.utils.WupUtil
1313
import me.teble.xposed.autodaily.task.model.MiniProfile
1414
import me.teble.xposed.autodaily.utils.LogUtil
15-
import me.teble.xposed.autodaily.utils.TimeUtil
1615
import me.teble.xposed.autodaily.utils.invokeAs
1716
import me.teble.xposed.autodaily.utils.new
1817
import mqq.app.Packet
@@ -31,11 +30,11 @@ open class MiniProfileManager : BaseFunction(
3130
}
3231

3332
open fun syncGetProfile(miniAppId: String): MiniProfile? {
34-
val startTime = TimeUtil.currentTimeMillis()
33+
val startTime = System.currentTimeMillis()
3534
val id = "syncGetProfile"
3635
FromServiceMsgHook.resMap[id] = null
3736
sendGetProfileRequest(miniAppId)
38-
while (TimeUtil.currentTimeMillis() - startTime < 10_000) {
37+
while (System.currentTimeMillis() - startTime < 10_000) {
3938
Thread.sleep(120)
4039
val tmp = FromServiceMsgHook.resMap[id] as MiniProfile?
4140
tmp?.let {

app/src/main/java/me/teble/xposed/autodaily/hook/utils/CalculationUtil.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ object CalculationUtil {
5959
}
6060

6161
val microsecondTime: Long
62-
get() = TimeUtil.currentTimeMillis()
62+
get() = TimeUtil.cnTimeMillis()
6363

6464
val secondTime: Int
65-
get() = (TimeUtil.currentTimeMillis() / 1000).toInt()
65+
get() = (TimeUtil.cnTimeMillis() / 1000).toInt()
6666

6767
val random: Double
6868
get() = Random().nextDouble()

app/src/main/java/me/teble/xposed/autodaily/hook/utils/ServletUtil.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ object ServletUtil {
2121
append(currentUin)
2222
append("_")
2323
append(sdf.format(Date()))
24-
append(TimeUtil.currentTimeMillis() % 1000)
24+
append(TimeUtil.cnTimeMillis() % 1000)
2525
append("_")
2626
append(
2727
Random().apply {
28-
setSeed(TimeUtil.currentTimeMillis())
28+
setSeed(TimeUtil.cnTimeMillis())
2929
}.nextInt(90000) + 10000
3030
)
3131
}

app/src/main/java/me/teble/xposed/autodaily/task/cron/CronTimer.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,25 +26,25 @@ class CronTimer
2626
private var isStop = false
2727
override fun run() {
2828
val timerUnit = if (scheduler.config.matchSecond) TIMER_UNIT_SECOND else TIMER_UNIT_MINUTE
29-
var thisTime = TimeUtil.currentTimeMillis()
29+
var thisTime = TimeUtil.cnTimeMillis()
3030
var nextTime: Long
3131
var sleep: Long
3232
while (false == isStop) {
3333
//下一时间计算是按照上一个执行点开始时间计算的
3434
//此处除以定时单位是为了清零单位以下部分,例如单位是分则秒和毫秒清零
3535
nextTime = (thisTime / timerUnit + 1) * timerUnit
36-
sleep = nextTime - TimeUtil.currentTimeMillis()
36+
sleep = nextTime - TimeUtil.cnTimeMillis()
3737
if (isValidSleepMillis(sleep, timerUnit)) {
3838
if (!ThreadUtil.safeSleep(sleep)) {
3939
//等待直到下一个时间点,如果被中断直接退出Timer
4040
break
4141
}
4242
//执行点,时间记录为执行开始的时间,而非结束时间
43-
thisTime = TimeUtil.currentTimeMillis()
43+
thisTime = TimeUtil.cnTimeMillis()
4444
spawnLauncher(thisTime)
4545
} else {
4646
// 非正常时间重新计算(issue#1224@Github)
47-
thisTime = TimeUtil.currentTimeMillis()
47+
thisTime = TimeUtil.cnTimeMillis()
4848
}
4949
}
5050
}

app/src/main/java/me/teble/xposed/autodaily/task/cron/pattent/CronPatternUtil.kt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,20 @@ object CronPatternUtil {
3535
} else null
3636
}
3737

38+
fun nextDateAfter(timezone: TimeZone?, pattern: CronPattern, start: Date, isMatchSecond: Boolean): Date? {
39+
val matchedDates: List<Date> = matchedDates(
40+
timezone,
41+
pattern,
42+
start.time,
43+
DateUtil.endOfYear(start).time,
44+
1,
45+
isMatchSecond
46+
)
47+
return if (CollUtil.isNotEmpty(matchedDates)) {
48+
matchedDates[0]
49+
} else null
50+
}
51+
3852
/**
3953
* 列举指定日期之后(到开始日期对应年年底)内所有匹配表达式的日期
4054
*
@@ -123,4 +137,28 @@ object CronPatternUtil {
123137
}
124138
return result
125139
}
140+
141+
fun matchedDates(
142+
timezone: TimeZone?,
143+
pattern: CronPattern,
144+
start: Long,
145+
end: Long,
146+
count: Int,
147+
isMatchSecond: Boolean
148+
): List<Date> {
149+
Assert.isTrue(start < end, "Start date is later than end !")
150+
val result: MutableList<Date> = ArrayList(count)
151+
val step = if (isMatchSecond) DateUnit.SECOND.millis else DateUnit.MINUTE.millis
152+
var i = start
153+
while (i < end) {
154+
if (pattern.match(timezone, i, isMatchSecond)) {
155+
result.add(DateUtil.date(i))
156+
if (result.size >= count) {
157+
break
158+
}
159+
}
160+
i += step
161+
}
162+
return result
163+
}
126164
}

0 commit comments

Comments
 (0)