first version
This commit is contained in:
1
app/.gitignore
vendored
Normal file
1
app/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/build
|
||||
50
app/build.gradle.kts
Normal file
50
app/build.gradle.kts
Normal file
@@ -0,0 +1,50 @@
|
||||
plugins {
|
||||
id("com.android.application")
|
||||
id("org.jetbrains.kotlin.android")
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdk = 32
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "pub.chara.disablealttab"
|
||||
minSdk = 30
|
||||
targetSdk = 32
|
||||
versionCode = 1
|
||||
versionName = "1"
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
named("release") {
|
||||
isShrinkResources = true
|
||||
isMinifyEnabled = true
|
||||
proguardFiles("proguard-rules.pro")
|
||||
}
|
||||
}
|
||||
|
||||
androidResources {
|
||||
additionalParameters("--allow-reserved-package-id", "--package-id", "0x45")
|
||||
}
|
||||
|
||||
packagingOptions {
|
||||
resources {
|
||||
excludes += "/META-INF/**"
|
||||
excludes += "/kotlin/**"
|
||||
excludes += "/*.txt"
|
||||
excludes += "/*.bin"
|
||||
}
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
}
|
||||
kotlinOptions {
|
||||
jvmTarget = JavaVersion.VERSION_11.toString()
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation("com.github.kyuubiran:EzXHelper:0.9.2")
|
||||
compileOnly("de.robv.android.xposed:api:82")
|
||||
}
|
||||
1
app/proguard-rules.pro
vendored
Normal file
1
app/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1 @@
|
||||
-keep class pub.chara.disablealttab.MainHook
|
||||
24
app/src/main/AndroidManifest.xml
Normal file
24
app/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="pub.chara.disablealttab">
|
||||
|
||||
<application
|
||||
android:icon="@android:drawable/sym_def_app_icon"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@android:drawable/sym_def_app_icon">
|
||||
<meta-data
|
||||
android:name="xposedmodule"
|
||||
android:value="true" />
|
||||
<meta-data
|
||||
android:name="xposeddescription"
|
||||
android:value="@string/xposed_desc" />
|
||||
<meta-data
|
||||
android:name="xposedminversion"
|
||||
android:value="93" />
|
||||
<!-- xposed-scope here -->
|
||||
<meta-data
|
||||
android:name="xposedscope"
|
||||
android:resource="@array/xposedscope" />
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
1
app/src/main/assets/xposed_init
Normal file
1
app/src/main/assets/xposed_init
Normal file
@@ -0,0 +1 @@
|
||||
pub.chara.disablealttab.MainHook
|
||||
36
app/src/main/java/pub/chara/disablealttab/MainHook.kt
Normal file
36
app/src/main/java/pub/chara/disablealttab/MainHook.kt
Normal file
@@ -0,0 +1,36 @@
|
||||
package pub.chara.disablealttab
|
||||
|
||||
import android.os.Build
|
||||
import com.github.kyuubiran.ezxhelper.init.EzXHelperInit
|
||||
import com.github.kyuubiran.ezxhelper.utils.Log
|
||||
import com.github.kyuubiran.ezxhelper.utils.Log.logexIfThrow
|
||||
import de.robv.android.xposed.IXposedHookLoadPackage
|
||||
import de.robv.android.xposed.XposedBridge
|
||||
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
||||
import pub.chara.disablealttab.hook.*
|
||||
|
||||
private const val PACKAGE_NAME_HOOKED = "android"
|
||||
private const val TAG = "DisableAltTab"
|
||||
|
||||
class MainHook : IXposedHookLoadPackage {
|
||||
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
|
||||
if (lpparam.packageName == PACKAGE_NAME_HOOKED) {
|
||||
// Init EzXHelper
|
||||
EzXHelperInit.initHandleLoadPackage(lpparam)
|
||||
EzXHelperInit.setLogTag(TAG)
|
||||
EzXHelperInit.setToastTag(TAG)
|
||||
initHooks(AltTabHook)
|
||||
}
|
||||
}
|
||||
|
||||
private fun initHooks(vararg hook: BaseHook) {
|
||||
hook.forEach {
|
||||
runCatching {
|
||||
if (it.isInit) return@forEach
|
||||
it.init()
|
||||
it.isInit = true
|
||||
Log.i("Inited hook: ${it.javaClass.simpleName}")
|
||||
}.logexIfThrow("Failed init hook: ${it.javaClass.simpleName}")
|
||||
}
|
||||
}
|
||||
}
|
||||
29
app/src/main/java/pub/chara/disablealttab/hook/AltTabHook.kt
Normal file
29
app/src/main/java/pub/chara/disablealttab/hook/AltTabHook.kt
Normal file
@@ -0,0 +1,29 @@
|
||||
package pub.chara.disablealttab.hook
|
||||
|
||||
import android.view.KeyEvent
|
||||
import com.github.kyuubiran.ezxhelper.utils.*
|
||||
import de.robv.android.xposed.XposedBridge
|
||||
|
||||
object AltTabHook : BaseHook() {
|
||||
override fun init() {
|
||||
try {
|
||||
//disable alt-tab
|
||||
//this works for any android version
|
||||
findMethod("com.android.server.policy.PhoneWindowManager") {
|
||||
name == "interceptKeyBeforeDispatching"
|
||||
}.hookBefore { param ->
|
||||
run {
|
||||
val arg1: KeyEvent = param.args[1] as KeyEvent;
|
||||
// alt-tab
|
||||
if ((arg1.isAltPressed && arg1.keyCode == 61)) {
|
||||
param.result = 0L;
|
||||
}
|
||||
}
|
||||
}
|
||||
XposedBridge.log("MiuiPadMeta: AltTabHook success!")
|
||||
} catch (e: Throwable) {
|
||||
XposedBridge.log("MiuiPadMeta: AltTabHook failed!")
|
||||
XposedBridge.log(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package pub.chara.disablealttab.hook
|
||||
|
||||
abstract class BaseHook {
|
||||
var isInit: Boolean = false
|
||||
abstract fun init()
|
||||
}
|
||||
6
app/src/main/res/values/arrays.xml
Normal file
6
app/src/main/res/values/arrays.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string-array name="xposedscope">
|
||||
<item>android</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
4
app/src/main/res/values/strings.xml
Normal file
4
app/src/main/res/values/strings.xml
Normal file
@@ -0,0 +1,4 @@
|
||||
<resources>
|
||||
<string name="app_name">MiuiPadMeta</string>
|
||||
<string name="xposed_desc">A Xposed module to disable Alt-Tab hotkey for generic android devices.</string>
|
||||
</resources>
|
||||
Reference in New Issue
Block a user