package kz.virtex.htc.tweaker.mods; import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; import java.util.Arrays; import kz.virtex.htc.tweaker.Const; import kz.virtex.htc.tweaker.Misc; import kz.virtex.htc.tweaker.R; import kz.virtex.htc.tweaker.TweakerService; import kz.virtex.htc.tweaker.XMain; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.TypedArray; import android.content.res.XModuleResources; import android.content.res.XmlResourceParser; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.text.TextPaint; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.FrameLayout; import android.widget.LinearLayout; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_InitPackageResources.InitPackageResourcesParam; import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam; public class Dialer { public static String[] Btn = {}; public static String[] Lat = {}; private static final BroadcastReceiver br = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { // TODO: } }; @SuppressWarnings("unused") private static Object getSettings(Context context, String name, String type, String deflt) throws NameNotFoundException { // Registering our receiver to get key press state IntentFilter intFilt = new IntentFilter(TweakerService.ACTION_VOLUME_KEY_PRESS); context.registerReceiver(br, intFilt); Misc.x("Dialer, BroadcastReceiver registered"); Context tweakContext = context.createPackageContext(Const.PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY); Intent intent = new Intent(tweakContext, TweakerService.class).setAction(TweakerService.ACTION_VOLUME_KEY_PRESS); tweakContext.startService(intent); Misc.x("Dialer, Service requested"); return new Object(); } private static String[] push(String[] array, String push) { String[] longer = new String[array.length + 1]; System.arraycopy(array, 0, longer, 0, array.length); longer[array.length] = push; return longer; } /* public static void hookBigDialKeypad(InitPackageResourcesParam resparam, String path) { XmlResourceParser specific_htc_keypad = resparam.res.getLayout(resparam.res.getIdentifier("specific_htc_keypad", "layout", resparam.packageName)); resparam.res.setReplacement(resparam.packageName, "layout", "specific_htc_keypad_big", specific_htc_keypad); int keypad_btn_layout = resparam.res.getInteger(resparam.res.getIdentifier("keypad_btn_layout", "id", resparam.packageName)); resparam.res.setReplacement(resparam.packageName, "id", "keypad_btn_layout_big", keypad_btn_layout); XposedBridge.log(resparam.packageName); } public static void hookBigDialKeypad(final LoadPackageParam paramLoadPackageParam) { findAndHookMethod("com.htc.htcdialer.widget.DialerKeypad", paramLoadPackageParam.classLoader, "initKeypadButton", View.class, int.class, int.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { View sss = (View) param.args[0]; LayoutParams params = sss.getLayoutParams(); params.height = 150; sss.setLayoutParams(params); } }); XposedHelpers.findAndHookConstructor("com.htc.htcdialer.widget.keypadbtn.MeasureUtils", paramLoadPackageParam.classLoader, boolean.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { param.args[0] = Boolean.valueOf(false); } }); } */ public static void hookSimCallButton(final LoadPackageParam paramLoadPackageParam) { findAndHookMethod("com.htc.htcdialer.Dialer", paramLoadPackageParam.classLoader, "updateDMDSCallButton", boolean.class, boolean.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { Context mContext = (Context) XposedHelpers.getObjectField(param.thisObject, "mContext"); boolean showSim1 = Misc.toBoolean(Misc.getSystemSettingsInt(mContext, Const.TWEAK_SHOW_SIM_CARD_DIAL + "_sim1", 1)); boolean showSim2 = Misc.toBoolean(Misc.getSystemSettingsInt(mContext, Const.TWEAK_SHOW_SIM_CARD_DIAL + "_sim2", 1)); boolean sim1hide = (Boolean) param.args[0]; boolean sim2hide = (Boolean) param.args[0]; // If user choosed to hide SIM 1 (Kcell) if (!showSim1) { // if SIM 2 (Beeline) also going to be disabled by the // system if (sim2hide) { // Let's get what we should do int action = Misc.getSystemSettingsInt(mContext, Const.TWEAK_SHOW_SIM_CARD_DIAL_ACTION, 0); switch (action) { // show another sim case 0: default: // if SIM 1 also not available if (sim1hide) { // do nothing, both SIMs are not visible return; } else { param.args[0] = Boolean.valueOf(true); } case 1: param.args[0] = Boolean.valueOf(true); } } else { param.args[0] = Boolean.valueOf(true); } } // If user choosed to hide SIM 2 (Beeline) if (!showSim2) { // if SIM 1 (Kcell) also going to be disabled by the system if (sim1hide) { // Let's get what we should do int action = Misc.getSystemSettingsInt(mContext, "tweak_show_sim_card_dial_action", 0); switch (action) { // show another sim case 0: default: // if SIM 2 also not available if (sim2hide) { // do nothing, both SIMs are not visible return; } else { param.args[1] = Boolean.valueOf(true); } case 1: param.args[1] = Boolean.valueOf(true); } } else { param.args[1] = Boolean.valueOf(true); } } } }); } // ---------------------------------------------------- // Replaces background on Dialer // ---------------------------------------------------- public static void hookSpecificHtcShowKeypad(final LoadPackageParam paramLoadPackageParam) { findAndHookMethod("com.htc.htcdialer.widget.keypadbtn.HtcKeypadBgBtn", paramLoadPackageParam.classLoader, "setEnabled", "boolean", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { float alpha = (Float) XposedHelpers.callMethod(param.thisObject, "getAlpha"); if (alpha <= 0.4F) // to avoid background set every time { View btn = (View) param.thisObject; View parent = (View) btn.getParent(); View main = (View) parent.getParent(); XModuleResources modRes = XModuleResources.createInstance(XMain.MODULE_PATH, null); Drawable bg = modRes.getDrawable(R.drawable.phone_keypad_bg); main.setBackground(bg); } } }); XposedHelpers.findAndHookConstructor("com.htc.htcdialer.widget.DividerDrawable", paramLoadPackageParam.classLoader, "android.content.Context", "android.graphics.drawable.Drawable", new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { XModuleResources modRes = XModuleResources.createInstance(XMain.MODULE_PATH, null); Drawable bg = modRes.getDrawable(R.drawable.phone_keypad_bg); XposedHelpers.setObjectField(param.thisObject, "mDrawable", bg); } }); findAndHookMethod("com.htc.htcdialer.widget.DividerDrawable", paramLoadPackageParam.classLoader, "setDividerColor", "int", "int", new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { int[] mColorValue = (int[]) XposedHelpers.getObjectField(param.thisObject, "mColorValue"); int index = (Integer) param.args[0]; if ((Integer) param.args[1] == Color.parseColor("#2f2f2f")) { mColorValue[index] = Color.parseColor("#444444"); XposedHelpers.setObjectField(param.thisObject, "mColorValue", mColorValue); } } }); } public static void hookCallButtons(final LoadPackageParam paramLoadPackageParam) { findAndHookMethod("com.htc.htcdialer.widget.DividerDrawable", paramLoadPackageParam.classLoader, "setDividerColor", "int", "int", new XC_MethodHook() { protected void beforeHookedMethod(MethodHookParam param) throws Throwable { int paramInt1 = (Integer) param.args[0]; int paramInt2 = (Integer) param.args[1]; if (paramInt1 == 4) { if (paramInt2 == -13388315) // #FF33B5E5 FIXME: get color // from resources param.args[1] = Misc.colorTransform(paramInt2, Misc.getHueValue(XMain.pref.getInt(Const.TWEAK_SLOT1_COLOR, 0))); if (paramInt2 == -13128336) // #FF37AD70 FIXME: get color // from resources param.args[1] = Misc.colorTransform(Color.parseColor("#33e5b1"), Misc.getHueValue(XMain.pref.getInt(Const.TWEAK_SLOT2_COLOR, 0))); } } }); findAndHookMethod("com.htc.htcdialer.widget.keypadbtn.ScaledString", paramLoadPackageParam.classLoader, "setText", "java.lang.CharSequence", new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { String text = null; if ((param.args[0] instanceof String)) text = (String) param.args[0]; if ((param.args[0] instanceof CharSequence)) text = ((CharSequence) param.args[0]).toString(); if (text == null) return; String slot1 = XMain.pref.getString("slot_1_user_text", ""); String slot2 = XMain.pref.getString("slot_2_user_text", ""); if (text.toLowerCase().contains(slot1.toLowerCase()) || text.toLowerCase().contains(slot2.toLowerCase())) { String pref = Const.TWEAK_SLOT1_COLOR; int color = -13388315; // FIXME: if (text.toLowerCase().contains(slot2.toLowerCase())) { pref = Const.TWEAK_SLOT2_COLOR; color = Color.parseColor("#33e5b1"); // FIXME: } TextPaint mTextPaint = (TextPaint) XposedHelpers.getObjectField(param.thisObject, "mTextPaint"); int tweak = Misc.colorTransform(color, Misc.getHueValue(XMain.pref.getInt(pref, 0))); mTextPaint.setColor(tweak); } } }); } public static void handleCallDirections(InitPackageResourcesParam resparam, String path) { XModuleResources modRes = XModuleResources.createInstance(path, resparam.res); resparam.res.setReplacement(resparam.packageName, "drawable", "icon_indicator_incoming_dark_s", modRes.fwd(R.drawable.icon_indicator_incoming_light_s)); resparam.res.setReplacement(resparam.packageName, "drawable", "icon_indicator_outgoing_dark_s", modRes.fwd(R.drawable.icon_indicator_outgoing_light_s)); } public static void hookDialerButtons(final LoadPackageParam paramLoadPackageParam) { findAndHookMethod("com.htc.htcdialer.widget.keypadbtn.HtcKeypadBgBtn", paramLoadPackageParam.classLoader, "init", "android.content.Context", "android.util.AttributeSet", "int", new XC_MethodHook() { protected void beforeHookedMethod(MethodHookParam param) throws Throwable { Context paramContext = (Context) param.args[0]; AttributeSet paramAttributeSet = (AttributeSet) param.args[1]; int paramInt = (Integer) param.args[2]; TypedArray dialer = paramContext.obtainStyledAttributes(paramAttributeSet, Const.HtcDialerAnimationButtonMode, paramInt, 0); String phonetic = dialer.getString(5); String latin = dialer.getString(3); if (!TextUtils.isEmpty(phonetic)) { if (!Arrays.asList(Btn).contains(phonetic)) { Btn = push(Btn, phonetic); } } if (!TextUtils.isEmpty(latin)) { if (!Arrays.asList(Lat).contains(latin)) { Lat = push(Lat, latin); } } dialer.recycle(); } }); findAndHookMethod("com.htc.htcdialer.widget.keypadbtn.ScaledString", paramLoadPackageParam.classLoader, "init", "android.content.Context", "java.lang.String", "int", new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { String paramString = (String) param.args[1]; if (Arrays.asList(Btn).contains(paramString)) { Object TextPaint = XposedHelpers.getObjectField(param.thisObject, "mTextPaint"); XposedHelpers.callMethod(TextPaint, "setColor", XMain.pref.getInt(Const.TWEAK_DIALER_BUTTON_COLOR, Const.DIALER_BUTTON_STOCK_COLOR)); XposedHelpers.callMethod(TextPaint, "setTextSize", XMain.pref.getFloat(Const.TWEAK_DIALER_BUTTON_SIZE, Const.DIALER_BUTTON_STOCK_SIZE)); } if (Arrays.asList(Lat).contains(paramString)) { Object TextPaint = XposedHelpers.getObjectField(param.thisObject, "mTextPaint"); XposedHelpers.callMethod(TextPaint, "setColor", XMain.pref.getInt(Const.TWEAK_DIALER_BUTTON_COLOR_LAT, Const.DIALER_BUTTON_STOCK_COLOR)); XposedHelpers.callMethod(TextPaint, "setTextSize", XMain.pref.getFloat(Const.TWEAK_DIALER_BUTTON_SIZE_LAT, Const.DIALER_BUTTON_STOCK_SIZE)); } } }); findAndHookMethod("com.htc.htcdialer.widget.keypadbtn.ScaledString", paramLoadPackageParam.classLoader, "setTouchState", "boolean", new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { CharSequence mString = (CharSequence) XposedHelpers.getObjectField(param.thisObject, "mString"); if (Arrays.asList(Btn).contains(mString.toString())) { Object TextPaint = XposedHelpers.getObjectField(param.thisObject, "mTextPaint"); XposedHelpers.callMethod(TextPaint, "setColor", XMain.pref.getInt(Const.TWEAK_DIALER_BUTTON_COLOR, Const.DIALER_BUTTON_STOCK_COLOR)); XposedHelpers.callMethod(TextPaint, "setTextSize", XMain.pref.getFloat(Const.TWEAK_DIALER_BUTTON_SIZE, Const.DIALER_BUTTON_STOCK_SIZE)); } if (Arrays.asList(Lat).contains(mString.toString())) { Object TextPaint = XposedHelpers.getObjectField(param.thisObject, "mTextPaint"); XposedHelpers.callMethod(TextPaint, "setColor", XMain.pref.getInt(Const.TWEAK_DIALER_BUTTON_COLOR_LAT, Const.DIALER_BUTTON_STOCK_COLOR)); XposedHelpers.callMethod(TextPaint, "setTextSize", XMain.pref.getFloat(Const.TWEAK_DIALER_BUTTON_SIZE_LAT, Const.DIALER_BUTTON_STOCK_SIZE)); } } }); } }