package at.jclehner.appopsxposed.hacks;

import at.jclehner.appopsxposed.Hack;
import at.jclehner.appopsxposed.util.Constants;
import at.jclehner.appopsxposed.util.Util;
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;
import de.robv.android.xposed.callbacks.XC_LoadPackage;


public class MiuiHacks extends Hack
{
	@Override
	protected String onGetKeySuffix()
	{
		return "miui";
	}

	@Override
	protected boolean isEnabledByDefault()
	{
		try
		{
			Class.forName("miui.os.Build");
			log("Hack enabled");
			return true;
		}
		catch(ClassNotFoundException e)
		{
			return false;
		}
	}

	@Override
	protected void handleLoadFrameworkPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable
	{
		try
		{
			final Class<?> appOpsSvcClazz = loadClass("com.android.server.AppOpsService");
			XposedBridge.hookAllMethods(appOpsSvcClazz, "isMiuiAllowed",
					XC_MethodReplacement.returnConstant(true));
			XposedBridge.hookAllMethods(appOpsSvcClazz, "inMiuiAllowedBlackList",
					XC_MethodReplacement.returnConstant(false));

			XposedHelpers.findAndHookMethod(appOpsSvcClazz, "checkSystemApp",
					new Class<?>[] { int.class, int.class, String.class }, new XC_MethodHook() {
						@Override
						protected void afterHookedMethod(MethodHookParam param) throws Throwable
						{
							Boolean result = (Boolean) param.getResult();
							if(result == null || result)
								return;

							if(Constants.MODULE_PACKAGE.equals(param.args[2]))
								param.setResult(true);
						}
					}
			);

			log("Hooked: isMiuiAllowed, inMiuiAllowedBlackList, checkSystemApp");
		}
		catch(Throwable t)
		{
			Util.log(t);
		}
	}
}