Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,35 +25,47 @@ class AlarmReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.i("ContentValues", "接收闹钟事件")
try {
// 初始化信息,例如ROOT权限
// 1. 初始化信息,例如ROOT权限
initEnv(context)
val bundleExtra = intent.getBundleExtra("timer")
val hour = bundleExtra!!.getInt("hour")
val bundleExtra = intent.getBundleExtra("timer") ?: return
val hour = bundleExtra.getInt("hour")
val minute = bundleExtra.getInt("minute")
val requestCode = bundleExtra.getInt("requestCode")
wakeUpAndUnlock(context)
// 先启动自己
// 2. 先启动自己到主界面
val intent2 = Intent(context, MainActivity::class.java)
intent2.flags = (Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
context.startActivity(intent2)
Log.i("ContentValues", "启动auto-sigin程序")

// 再启动要打开的APP
val intent3 = Intent("android.intent.action.MAIN")
intent3.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
val componentName = ComponentName(
Constant.getActiveApp().packageName, Constant.getActiveApp().activityName
)
Log.i(
"ContentValues",
"openAppByPackageName: " + Constant.getActiveApp().packageName + "," + Constant.getActiveApp().activityName
)
intent3.component = componentName
// 3. 打开企业微信
val autoSignAllowed = AutoSignPermissionUtils.isTodayAutoSignAllowed()
// 判断打卡日是否包含今天
if (autoSignAllowed) {
Log.i("ContentValues", "今天是要打卡的星期")
context.startActivity(intent3)
val launchIntentForPackage = context.packageManager.getLaunchIntentForPackage(
Constant.getActiveApp().packageName
)
if (launchIntentForPackage != null) {
SharePrefHelper.putLong(
SIGN_OPEN_INTENT_START_TIME, System.currentTimeMillis()
)
Log.i("ContentValues", "启动打卡程序 by launchIntentForPackage")
context.startActivity(launchIntentForPackage)
} else {
val componentIntent = Intent("android.intent.action.MAIN").apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
component = ComponentName(
Constant.getActiveApp().packageName,
Constant.getActiveApp().activityName
)
}
SharePrefHelper.putLong(
SIGN_OPEN_INTENT_START_TIME, System.currentTimeMillis()
)
Log.i(
"ContentValues",
"启动打卡程序 by openAppByPackageName ${Constant.getActiveApp().packageName},${Constant.getActiveApp().activityName}"
)
context.startActivity(componentIntent)
}
} else {
Log.i("ContentValues", "今天不是要打卡的星期")
}
Expand All @@ -78,14 +90,6 @@ class AlarmReceiver : BroadcastReceiver() {
AlarManagerUtil.timedTackAfOffWork(context, hour, minute, requestCode)
}
}
val launchIntentForPackage = context.packageManager.getLaunchIntentForPackage(Constant.getActiveApp().packageName)
if (autoSignAllowed && launchIntentForPackage != null) {
SharePrefHelper.putLong(
SIGN_OPEN_INTENT_START_TIME, System.currentTimeMillis()
)
context.startActivity(launchIntentForPackage)
Log.i("ContentValues", "启动打卡程序2")
}
Log.e("ContentValues", "定时成功!")
} catch (e: Exception) {
e.printStackTrace()
Expand Down Expand Up @@ -136,11 +140,11 @@ class AlarmReceiver : BroadcastReceiver() {
}
}

fun initEnv(context: Context?) {
fun initEnv(context: Context) {
val isRoot = isRoot
Constant.isRoot = isRoot == 0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
val isShizuku = isEnable(context!!)
val isShizuku = isEnable(context)
Constant.isShizuku = isShizuku
}
if (Constant.isRoot) {
Expand Down Expand Up @@ -199,7 +203,7 @@ class AlarmReceiver : BroadcastReceiver() {
"AlarmReceiver", "isAccessibilityByShizuku: $first--$second"
)
if ("cn.martinkay.autocheckinplugin/cn.martinkay.autocheckinplugin.service.MyAccessibilityService".contains(
second!!
second
)
) {
val (first1, second1) = execute("settings get secure accessibility_enabled", isRoot)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;

import cn.martinkay.autocheckinplugin.handler.pageprocessor.weixin.CompleteProcessor;
import cn.martinkay.autocheckinplugin.handler.pageprocessor.weixin.MessagePageProcessor;
import cn.martinkay.autocheckinplugin.handler.pageprocessor.weixin.SiginInProcessor;
import cn.martinkay.autocheckinplugin.handler.pageprocessor.weixin.WorkPageProcessor;
import cn.martinkay.autocheckinplugin.service.MyAccessibilityService;
import cn.martinkay.autocheckinplugin.util.AccessibilityHelper;
import cn.martinkay.autocheckinplugin.utils.AutoSignPermissionUtils;

public class WeixinHandler implements BaseHandler {
private static final String TAG = "WeixinHandler";
Expand All @@ -20,8 +20,14 @@ public class WeixinHandler implements BaseHandler {
private CompleteProcessor completeProcessor = new CompleteProcessor();

@Override
public void doHandle(AccessibilityEvent event, MyAccessibilityService myAccessibilityService) throws Exception {
AccessibilityNodeInfo nodeById = AccessibilityHelper.getNodeById(myAccessibilityService, "com.tencent.wework:id/hrb", 0);
public void doHandle(AccessibilityEvent event, MyAccessibilityService myAccessibilityService)
throws Exception {
if (!AutoSignPermissionUtils.INSTANCE.isMobileAutoSignLaunch()) {
return;
}
AccessibilityNodeInfo nodeById =
AccessibilityHelper.getNodeById(myAccessibilityService, "com.tencent.wework:id/hrb",
0);
if (nodeById != null) {
AccessibilityHelper.clickButtonByNode(myAccessibilityService, nodeById);
} else if (this.messagePageProcessor.canParse(event, myAccessibilityService)) {
Expand All @@ -39,8 +45,7 @@ public void doHandle(AccessibilityEvent event, MyAccessibilityService myAccessib
}
}

@Override
public boolean canHandler(String packageName2) {
@Override public boolean canHandler(String packageName2) {
return packageName.equals(packageName2);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,11 @@

import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import cn.martinkay.autocheckinplugin.SharePrefHelper;
import cn.martinkay.autocheckinplugin.handler.pageprocessor.BasePageProcessor;
import cn.martinkay.autocheckinplugin.service.MyAccessibilityService;
import cn.martinkay.autocheckinplugin.util.AccessibilityHelper;
import cn.martinkay.autocheckinplugin.utils.AutoSignPermissionUtils;

import static cn.martinkay.autocheckinplugin.SharePrefHelperKt.SIGN_OPEN_INTENT_START_TIME;

public class CompleteProcessor extends BasePageProcessor {
@Override public boolean canParse(AccessibilityEvent event,
MyAccessibilityService myAccessibilityService) {
Expand Down Expand Up @@ -48,9 +45,7 @@ public class CompleteProcessor extends BasePageProcessor {

@Override public void processPage(AccessibilityEvent event,
MyAccessibilityService myAccessibilityService) {
long startTime = SharePrefHelper.INSTANCE.getLong(SIGN_OPEN_INTENT_START_TIME, 0);
if ((System.currentTimeMillis() - startTime) > 5000) {
Log.i("CompleteProcessor", "不是由程序打开的,忽略");
if (!AutoSignPermissionUtils.INSTANCE.isMobileAutoSignLaunch()) {
return;
}
Log.w("CompleteProcessor", "打卡成功 关闭");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,11 @@
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import cn.martinkay.autocheckinplugin.SharePrefHelper;
import cn.martinkay.autocheckinplugin.handler.pageprocessor.BasePageProcessor;
import cn.martinkay.autocheckinplugin.service.MyAccessibilityService;
import cn.martinkay.autocheckinplugin.util.AccessibilityHelper;
import cn.martinkay.autocheckinplugin.utils.AutoSignPermissionUtils;

import static cn.martinkay.autocheckinplugin.SharePrefHelperKt.SIGN_OPEN_INTENT_START_TIME;

public class SiginInProcessor extends BasePageProcessor {
private final String TAG = "SigninPageProcessor";

Expand Down Expand Up @@ -52,9 +49,7 @@ public class SiginInProcessor extends BasePageProcessor {
}

private void runAccessibilityService(MyAccessibilityService myAccessibilityService) {
long startTime = SharePrefHelper.INSTANCE.getLong(SIGN_OPEN_INTENT_START_TIME, 0);
if ((System.currentTimeMillis() - startTime) > 5000) {
Log.i("SigninPageProcessor", "不是由程序打开的,忽略");
if (!AutoSignPermissionUtils.INSTANCE.isMobileAutoSignLaunch()) {
return;
}
AutoSignPermissionUtils.INSTANCE.increaseTodayAutoSignCount();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package cn.martinkay.autocheckinplugin.utils

import android.util.Log
import cn.martinkay.autocheckinplugin.SIGN_CALENDAR_SCHEME_CACHE
import cn.martinkay.autocheckinplugin.SIGN_OPEN_INTENT_START_TIME
import cn.martinkay.autocheckinplugin.SharePrefHelper
import cn.martinkay.autocheckinplugin.model.CalendarScheme
import com.alibaba.fastjson.JSON
Expand All @@ -28,10 +29,6 @@ object AutoSignPermissionUtils {
val calendar = Calendar.getInstance()
val workDay = workingDays.contains(calendar[Calendar.DAY_OF_WEEK])
if (calendarSchemeMap == null) {
Log.i(
"AutoSignPermission",
"isTodayAutoSignAllowed calendarSchemeMap = null workDay = $workDay"
)
return workDay
}
val date = com.haibin.calendarview.Calendar().apply {
Expand All @@ -40,10 +37,6 @@ object AutoSignPermissionUtils {
day = calendar.get(Calendar.DAY_OF_MONTH)
}.toString()
val value = calendarSchemeMap[date] ?: return workDay
Log.e(
"AutoSignPermission",
"isTodayAutoSignAllowed date = ${value.date} value.scheme = ${value.scheme}"
)
return value.scheme != CalendarScheme.AUTO_SIGN_DAY_FORBIDDEN
}

Expand All @@ -64,12 +57,20 @@ object AutoSignPermissionUtils {
this.date = date
}
value.nextScheme()
Log.w("AutoSignPermission", "increaseTodayAutoSignCount scheme = ${value.scheme}")
calendarSchemeMap[date] = value
SharePrefHelper.putString(
SIGN_CALENDAR_SCHEME_CACHE,
JSON.toJSONString(calendarSchemeMap.map { it.value }.toList())
)
GlobalScope.launch { notifyCalendarSchemeEvent.emit(Unit) }
}

fun isMobileAutoSignLaunch(): Boolean {
val startTime = SharePrefHelper.getLong(SIGN_OPEN_INTENT_START_TIME, 0)
if (System.currentTimeMillis() - startTime > 5000) {
Log.i("CompleteProcessor", "不是由程序打开的,忽略")
return false
}
return true
}
}
23 changes: 10 additions & 13 deletions app/src/main/java/cn/martinkay/autocheckinplugin/utils/HShizuku.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import android.os.ParcelFileDescriptor
import android.os.SystemClock
import android.view.InputEvent
import android.view.KeyEvent
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat
import cn.martinkay.autocheckinplugin.utils.HPackages.myUserId
Expand All @@ -23,13 +22,14 @@ object HShizuku {
private val userId get() = if (isRoot) myUserId else 0

@RequiresApi(Build.VERSION_CODES.P)
private fun asInterface(className: String, serviceName: String): Any =
ShizukuBinderWrapper(SystemServiceHelper.getSystemService(serviceName)).let {
Class.forName("$className\$Stub").run {
if (HTarget.P) HiddenApiBypass.invoke(this, null, "asInterface", it)
else getMethod("asInterface", IBinder::class.java).invoke(null, it)
}
private fun asInterface(className: String, serviceName: String): Any = ShizukuBinderWrapper(
SystemServiceHelper.getSystemService(serviceName)
).let {
Class.forName("$className\$Stub").run {
if (HTarget.P) HiddenApiBypass.invoke(this, null, "asInterface", it)
else getMethod("asInterface", IBinder::class.java).invoke(null, it)
}
}

fun isEnable(ctx: Context): Boolean {
//本函数用于检查shizuku状态,shizukuIsRun代表shizuk是否运行,shizukuIsAccept代表shizuku是否授权
Expand All @@ -41,8 +41,7 @@ object HShizuku {
) else shizukuIsAccept = true
} catch (e: Exception) {
if (ContextCompat.checkSelfPermission(
ctx,
"moe.shizuku.manager.permission.API_V23"
ctx, "moe.shizuku.manager.permission.API_V23"
) == PackageManager.PERMISSION_GRANTED
) shizukuIsAccept = true
if (e.javaClass == IllegalStateException::class.java) {
Expand All @@ -53,8 +52,7 @@ object HShizuku {
}

val lockScreen
@RequiresApi(Build.VERSION_CODES.P)
get() = runCatching {
@RequiresApi(Build.VERSION_CODES.P) get() = runCatching {
val input = asInterface("android.hardware.input.IInputManager", "input")
val inject = input::class.java.getMethod(
"injectInputEvent", InputEvent::class.java, Int::class.java
Expand All @@ -72,7 +70,6 @@ object HShizuku {
false
}


@RequiresApi(Build.VERSION_CODES.P)
fun forceStopApp(packageName: String) = runCatching {
asInterface("android.app.IActivityManager", "activity").let {
Expand All @@ -90,7 +87,7 @@ object HShizuku {
false
}

fun execute(command: String, root: Boolean = isRoot): Pair<Int, String?> = runCatching {
fun execute(command: String, root: Boolean = isRoot): Pair<Int, String> = runCatching {
IShizukuService.Stub.asInterface(Shizuku.getBinder())
.newProcess(arrayOf(if (root) "su" else "sh"), null, null).run {
ParcelFileDescriptor.AutoCloseOutputStream(outputStream).use {
Expand Down