package kz.virtex.htc.tweaker.mods; import kz.virtex.htc.tweaker.Const; import kz.virtex.htc.tweaker.XMain; import android.media.AudioManager; import com.android.internal.util.ArrayUtils; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XC_MethodReplacement; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; public class Android { public static void hookDebugFlag() { final Class<?> PowerManagerService = XposedHelpers.findClass("com.htc.htcjavaflag.HtcDebugFlag", null); XposedHelpers.findAndHookMethod(PowerManagerService, "getHtcDebugFlag", new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { //return Boolean.valueOf(Const.DEBUG); return Boolean.valueOf(true); } }); } public static void hookAndroidLog() { final Class<?> Log = XposedHelpers.findClass("android.util.Log", null); XposedHelpers.findAndHookMethod(Log, "println_native", int.class, int.class, String.class, String.class, new XC_MethodHook() { protected void beforeHookedMethod(MethodHookParam param) throws Throwable { int priority = (Integer) param.args[1]; switch (priority) { case android.util.Log.VERBOSE: if (XMain.pref.getBoolean(Const.TWEAK_LOGCAT_FILTER + "_Verbose", false)) { param.setResult(0); return; } case android.util.Log.DEBUG: if (XMain.pref.getBoolean(Const.TWEAK_LOGCAT_FILTER + "_Debug", false)) { param.setResult(0); return; } case android.util.Log.INFO: if (XMain.pref.getBoolean(Const.TWEAK_LOGCAT_FILTER + "_Info", false)) { param.setResult(0); return; } case android.util.Log.WARN: if (XMain.pref.getBoolean(Const.TWEAK_LOGCAT_FILTER + "_Warn", false)) { param.setResult(0); return; } case android.util.Log.ERROR: if (XMain.pref.getBoolean(Const.TWEAK_LOGCAT_FILTER + "_Error", false)) { param.setResult(0); return; } } param.setResult(0); } }); } public static void hookAllCapsLocale() { final Class<?> PowerManagerService = XposedHelpers.findClass("com.htc.util.res.HtcResUtil", null); XposedHelpers.findAndHookMethod(PowerManagerService, "isInAllCapsLocale", "android.content.Context", new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { return Boolean.valueOf(false); } }); } public static void hookEnableSkypeCall() { final Class<?> PowerManagerService = XposedHelpers.findClass("com.android.internal.telephony.enableSkypeCall", null); XposedHelpers.findAndHookMethod(PowerManagerService, "startWatchingForBootAnimationFinished", new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { Boolean ret = true; return ret; } }); } public static void hookBootSound() { final Class<?> PowerManagerService = XposedHelpers.findClass("com.android.server.power.PowerManagerService", null); XposedHelpers.findAndHookMethod(PowerManagerService, "startWatchingForBootAnimationFinished", new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { XposedBridge.log("startWatchingForBootAnimationFinished"); } }); final Class<?> AudioService = XposedHelpers.findClass("android.media.AudioService", null); XposedHelpers.findAndHookMethod(AudioService, "onSetStreamVolume", "int", "int", "int", "int", new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { XposedBridge.log("onSetStreamVolume"); XposedBridge.log("0: " + param.args[0]); XposedBridge.log("1: " + param.args[1]); XposedBridge.log("2: " + param.args[2]); XposedBridge.log("3: " + param.args[3]); } }); XposedHelpers.findAndHookConstructor(AudioService, "android.content.Context", new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { XposedBridge.log("AudioService"); XposedBridge.log("STREAM_SYSTEM : " + XposedHelpers.callMethod(param.thisObject, "getStreamVolume", AudioManager.STREAM_SYSTEM)); XposedBridge.log("STREAM_NOTIFICATION: " + XposedHelpers.callMethod(param.thisObject, "getStreamVolume", AudioManager.STREAM_NOTIFICATION)); // AudioService.XposedHelpers.callMethod(param.thisObject, // "onSetStreamVolume", 1,0,0,2); // XposedHelpers.callMethod(param.thisObject, // "onSetStreamVolume", 5,0,0,2); XposedBridge.log("STREAM_SYSTEM : " + XposedHelpers.callMethod(param.thisObject, "getStreamVolume", AudioManager.STREAM_SYSTEM)); XposedBridge.log("STREAM_NOTIFICATION: " + XposedHelpers.callMethod(param.thisObject, "getStreamVolume", AudioManager.STREAM_NOTIFICATION)); } }); } public static void hookCDROMMount() { Class<?> MountService = XposedHelpers.findClass("com.android.server.MountService", null); XposedHelpers.findAndHookMethod(MountService, "setMountISOEnabled", "boolean", new XC_MethodHook() { protected void beforeHookedMethod(MethodHookParam param) throws Throwable { param.args[0] = false; } }); XposedHelpers.findAndHookMethod(MountService, "setPCtoolISOEnabled", "boolean", new XC_MethodHook() { protected void beforeHookedMethod(MethodHookParam param) throws Throwable { param.args[0] = false; } }); } public static void hookSDcardPermission() { final Class<?> pms = XposedHelpers.findClass("com.android.server.pm.PackageManagerService", null); XposedHelpers.findAndHookMethod(pms, "readPermission", "org.xmlpull.v1.XmlPullParser", "java.lang.String", new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { String permission = (String) param.args[1]; if (permission.equals("android.permission.WRITE_EXTERNAL_STORAGE")) { Class<?> process = XposedHelpers.findClass("android.os.Process", null); int gid = (Integer) XposedHelpers.callStaticMethod(process, "getGidForName", "media_rw"); Object mSettings = XposedHelpers.getObjectField(param.thisObject, "mSettings"); Object mPermissions = XposedHelpers.getObjectField(mSettings, "mPermissions"); Object bp = XposedHelpers.callMethod(mPermissions, "get", permission); int[] bp_gids = (int[]) XposedHelpers.getObjectField(bp, "gids"); XposedHelpers.setObjectField(bp, "gids", ArrayUtils.appendInt(bp_gids, gid)); } } }); } }