auto js
This commit is contained in:
parent
1e7ceae4ed
commit
3c50b9b90c
|
@ -1,11 +1,8 @@
|
||||||
package com.android.grape
|
package com.android.grape
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.IntentFilter
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.activity.enableEdgeToEdge
|
import androidx.activity.enableEdgeToEdge
|
||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
|
@ -13,23 +10,16 @@ import androidx.appcompat.app.AlertDialog
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import androidx.lifecycle.lifecycleScope
|
|
||||||
import com.android.grape.databinding.ActivityMainBinding
|
import com.android.grape.databinding.ActivityMainBinding
|
||||||
import com.android.grape.job.MonitorService
|
|
||||||
import com.android.grape.receiver.ScriptReceiver
|
|
||||||
import com.android.grape.util.ClashUtil
|
import com.android.grape.util.ClashUtil
|
||||||
import com.android.grape.util.HttpUtil
|
|
||||||
import com.android.grape.util.NotificationPermissionHandler
|
import com.android.grape.util.NotificationPermissionHandler
|
||||||
|
import com.android.grape.util.ScriptUtil
|
||||||
import com.android.grape.util.StoragePermissionHelper
|
import com.android.grape.util.StoragePermissionHelper
|
||||||
import com.blankj.utilcode.util.LogUtils
|
import com.blankj.utilcode.util.LogUtils
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
|
|
||||||
class MainActivity : AppCompatActivity() {
|
class MainActivity : AppCompatActivity() {
|
||||||
private val viewModel by viewModels<MainViewModel>()
|
private val viewModel by viewModels<MainViewModel>()
|
||||||
private lateinit var viewBinding: ActivityMainBinding
|
private lateinit var viewBinding: ActivityMainBinding
|
||||||
private var intentFilter: IntentFilter? = null
|
|
||||||
private var scriptReceiver: ScriptReceiver? = null
|
|
||||||
private lateinit var permissionHandler: NotificationPermissionHandler
|
private lateinit var permissionHandler: NotificationPermissionHandler
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
@ -42,7 +32,7 @@ class MainActivity : AppCompatActivity() {
|
||||||
insets
|
insets
|
||||||
}
|
}
|
||||||
checkPermission()
|
checkPermission()
|
||||||
registerReceiver()
|
ScriptUtil.registerScriptResultReceiver()
|
||||||
viewBinding.start.setOnClickListener {
|
viewBinding.start.setOnClickListener {
|
||||||
try {
|
try {
|
||||||
ClashUtil.startProxy(this)
|
ClashUtil.startProxy(this)
|
||||||
|
@ -66,19 +56,10 @@ class MainActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("UnspecifiedRegisterReceiverFlag")
|
|
||||||
private fun registerReceiver() {
|
|
||||||
intentFilter = IntentFilter().apply {
|
|
||||||
addAction("com.ak.lu.SCRIPT_START")
|
|
||||||
scriptReceiver = ScriptReceiver()
|
|
||||||
registerReceiver(scriptReceiver, this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
ClashUtil.unregisterReceiver(this)
|
ClashUtil.unregisterReceiver(this)
|
||||||
unregisterReceiver(scriptReceiver)
|
ScriptUtil.unregisterScriptResultReceiver()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkPermission() {
|
private fun checkPermission() {
|
||||||
|
|
|
@ -5,36 +5,24 @@ import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
import android.util.Log
|
|
||||||
import com.android.grape.job.UnInstallService
|
import com.android.grape.job.UnInstallService
|
||||||
import com.android.grape.util.ScriptUtil
|
import com.android.grape.util.ScriptUtil.SCRIPT_RESULT_KEY
|
||||||
import com.android.grape.util.Util
|
import com.android.grape.util.Util
|
||||||
|
import com.blankj.utilcode.util.LogUtils
|
||||||
|
|
||||||
class ScriptReceiver : BroadcastReceiver() {
|
class ScriptReceiver : BroadcastReceiver() {
|
||||||
var hook_action: String = "com.android.task.board"
|
|
||||||
var EVENT: String = "event"
|
|
||||||
|
|
||||||
override fun onReceive(context: Context, intent: Intent) {
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
val action = intent.action
|
val action = intent.action
|
||||||
Log.i(ScriptUtil.TAG, context.packageName + " Receive action:" + action)
|
LogUtils.i("TAG", context.packageName + " Receive action:" + action)
|
||||||
val event = intent.getIntExtra(ScriptUtil.EVENT, -1)
|
val scriptResult = intent.getStringExtra(SCRIPT_RESULT_KEY)
|
||||||
when (event) {
|
Util.script_status = 0
|
||||||
ScriptUtil.START -> Log.i(ScriptUtil.TAG, "script start run...")
|
LogUtils.i(
|
||||||
ScriptUtil.STOP -> {
|
"IOSTQ:脚本结束",
|
||||||
Log.i(ScriptUtil.TAG, "proxyme revice script stop!")
|
"result----> $scriptResult"
|
||||||
val hook_intent = Intent(this.hook_action)
|
)
|
||||||
hook_intent.putExtra(this.EVENT, 0)
|
Handler(Looper.getMainLooper()).postDelayed(
|
||||||
context.sendBroadcast(hook_intent)
|
{ UnInstallService.onEvent(context) },
|
||||||
Util.script_status = 0
|
3000
|
||||||
Log.i(
|
)
|
||||||
"IOSTQ:脚本结束",
|
|
||||||
context.packageName + " send broadcast:" + this.hook_action + ":" + this.EVENT
|
|
||||||
)
|
|
||||||
Handler(Looper.getMainLooper()).postDelayed(
|
|
||||||
{ UnInstallService.onEvent(context) },
|
|
||||||
3000
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,25 +1,103 @@
|
||||||
package com.android.grape.util
|
package com.android.grape.util
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.content.IntentFilter
|
||||||
|
import android.os.Handler
|
||||||
|
import android.os.Looper
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import com.android.grape.MainApplication
|
||||||
|
import com.android.grape.receiver.ScriptReceiver
|
||||||
|
import com.blankj.utilcode.util.LogUtils
|
||||||
|
|
||||||
object ScriptUtil {
|
object ScriptUtil {
|
||||||
const val TAG: String = "LU_SCRIPT"
|
const val AUTOJS_SCRIPT_FINISHED_ACTION: String = "org.autojs.SCRIPT_FINISHED"
|
||||||
const val START: Int = 1
|
const val SCRIPT_RESULT_KEY: String = "result"
|
||||||
const val STOP: Int = 2
|
var scriptResultReceiver: BroadcastReceiver? = null
|
||||||
const val SRC_FILES: String = "sc_file"
|
fun execScript(context: Context, src: String) {
|
||||||
const val SC_ACTION: String = "com.ak.lu.SCRIPT"
|
if (!isAppInstalled("org.autojs.autojs6")) {
|
||||||
const val EVENT: String = "event"
|
runOnUiThread {
|
||||||
|
Toast.makeText(context, "Auto.js app not installed", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
fun execScript(context: Context, src: String?) {
|
val intent = Intent()
|
||||||
val intent = Intent(SC_ACTION)
|
intent.setClassName(
|
||||||
// todo 需要替换为调度app的pkg
|
"org.autojs.autojs6",
|
||||||
// intent.setComponent(new ComponentName(TARGET_PKG, ScriptReceiver.class.getName()));
|
"org.autojs.autojs.external.open.RunIntentActivity"
|
||||||
intent.putExtra(EVENT, START)
|
)
|
||||||
intent.putExtra(SRC_FILES, src)
|
intent.putExtra("path", src)
|
||||||
context.sendBroadcast(intent)
|
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
Util.script_status = 0
|
try {
|
||||||
Log.i(TAG, context.packageName + " send broadcast:" + SC_ACTION + ":" + EVENT)
|
context.startActivity(intent)
|
||||||
|
LogUtils.d("脚本运行中:$src")
|
||||||
|
} catch (e: Exception) {
|
||||||
|
LogUtils.e("AutoJsUtil", "运行脚本失败", e)
|
||||||
|
runOnUiThread {
|
||||||
|
Toast.makeText(context, "运行脚本失败: " + e.message, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun registerScriptResultReceiver() {
|
||||||
|
if (scriptResultReceiver == null) {
|
||||||
|
scriptResultReceiver = ScriptReceiver()
|
||||||
|
try {
|
||||||
|
val filter = IntentFilter(AUTOJS_SCRIPT_FINISHED_ACTION)
|
||||||
|
ContextCompat.registerReceiver(
|
||||||
|
MainApplication.instance,
|
||||||
|
scriptResultReceiver,
|
||||||
|
filter,
|
||||||
|
ContextCompat.RECEIVER_EXPORTED
|
||||||
|
)
|
||||||
|
LogUtils.d("广播接收器成功注册", null)
|
||||||
|
} catch (e: java.lang.Exception) {
|
||||||
|
LogUtils.e("Failed to register receiver", e)
|
||||||
|
scriptResultReceiver = null
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
LogUtils.d("广播接收器已注册,无需重复注册")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun unregisterScriptResultReceiver() {
|
||||||
|
if (scriptResultReceiver != null) {
|
||||||
|
try {
|
||||||
|
MainApplication.instance.unregisterReceiver(scriptResultReceiver)
|
||||||
|
LogUtils.d("广播接收器成功注销", null)
|
||||||
|
} catch (e: java.lang.Exception) {
|
||||||
|
LogUtils.e("Failed to unregister receiver", e)
|
||||||
|
}
|
||||||
|
scriptResultReceiver = null
|
||||||
|
} else {
|
||||||
|
LogUtils.d("广播接收器未注册,无需注销")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun runOnUiThread(action: Runnable) {
|
||||||
|
Handler(Looper.getMainLooper()).post(action)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun isAppInstalled(packageName: String): Boolean {
|
||||||
|
LogUtils.d("Checking if app is installed: $packageName", null)
|
||||||
|
try {
|
||||||
|
val cmd = "pm list packages | grep $packageName"
|
||||||
|
val result = ShellUtils.execRootCmdAndGetResult(cmd)
|
||||||
|
|
||||||
|
if (result != null && result.contains(packageName)) {
|
||||||
|
LogUtils.d("App is installed: $packageName", null)
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
LogUtils.w("App not installed: $packageName", null)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
} catch (e: java.lang.Exception) {
|
||||||
|
LogUtils.e("Unexpected exception while checking app installation: $packageName", e)
|
||||||
|
return false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue