package kz.virtex.htc.tweaker;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
import java.io.File;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.XModuleResources;
import android.content.res.XResources;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.graphics.ColorFilter;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.util.Log;
import kz.virtex.htc.tweaker.mods.Android;
import kz.virtex.htc.tweaker.mods.Bugs;
import kz.virtex.htc.tweaker.mods.Camera;
import kz.virtex.htc.tweaker.mods.Contacts;
import kz.virtex.htc.tweaker.mods.Dialer;
import kz.virtex.htc.tweaker.mods.HTCSync;
import kz.virtex.htc.tweaker.mods.Keyboard;
import kz.virtex.htc.tweaker.mods.LockScreen;
import kz.virtex.htc.tweaker.mods.Media;
import kz.virtex.htc.tweaker.mods.Messaging;
import kz.virtex.htc.tweaker.mods.Phone;
import kz.virtex.htc.tweaker.mods.Recorder;
import kz.virtex.htc.tweaker.mods.Services;
import kz.virtex.htc.tweaker.mods.Settings;
import kz.virtex.htc.tweaker.mods.SystemUI;
import kz.virtex.htc.tweaker.mods.Tweaker;
import kz.virtex.htc.tweaker.mods.Weather;
import kz.virtex.htc.tweaker.utils.ColorFilterGenerator;
import de.robv.android.xposed.IXposedHookInitPackageResources;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.IXposedHookZygoteInit;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XSharedPreferences;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.XC_MethodHook.MethodHookParam;
import de.robv.android.xposed.callbacks.XC_InitPackageResources.InitPackageResourcesParam;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
@SuppressWarnings("unused")
public class XMain implements IXposedHookInitPackageResources, IXposedHookZygoteInit, IXposedHookLoadPackage
{
public static XSharedPreferences pref;
public static String MODULE_PATH;
public static String weather_apk;
@SuppressLint("SdCardPath")
public void initZygote(StartupParam startupParam) throws Throwable
{
pref = new XSharedPreferences(Const.PACKAGE_NAME, Const.PREFERENCE_FILE);
weather_apk = pref.getString(Const.WEATHER_PACKAGE_APK, null);
MODULE_PATH = startupParam.modulePath;
if (pref.getBoolean(Const.TWEAK_ADB_NOTIFY, false))
Services.hookUpdateAdbNotification();
XModuleResources modRes = XModuleResources.createInstance(MODULE_PATH, null);
if (pref.getBoolean(Const.TWEAK_CHARGING_LED, false))
Services.hookUdateBatteryLight();
if (pref.getBoolean(Const.TWEAK_CHARGING_FLASH, false))
Services.hookFlashDuringPlugged();
Services.hookForceSetFlashing(pref.getInt(Const.TWEAK_FLASH_TIMEOUT, 5));
// Android.hookAndroidLog();
if (Weather.hookWeatherBitmapPreload())
Weather.hookWeatherBitmap();
if (pref.getBoolean(Const.TWEAK_FIX_SDCARD_PERMISSION, false))
Android.hookSDcardPermission();
if (XMain.pref.getInt(Const.TWEAK_SLOT1_COLOR, 0) != 0 || XMain.pref.getInt(Const.TWEAK_SLOT2_COLOR, 0) != 0)
Messaging.hookSetBadgeImageResource();
if (pref.getBoolean(Const.TWEAK_INPUT_METHOD_NOTIFY, false))
Services.hookInputMethodManagerService();
if (pref.getBoolean(Const.TWEAK_DISABLE_ALL_CAPS, false))
Android.hookAllCapsLocale();
if (pref.getBoolean(Const.TWEAK_ENABLE_ALL_LANGUAGES, false))
Settings.hookSystemLocales();
if (pref.getBoolean(Const.TWEAK_DEBUG_ON, false))
Android.hookDebugFlag();
// Control.hookVolumeMediaButtons();
if (Misc.isDual())
Messaging.hookSendTextMessage();
if (pref.getBoolean(Const.TWEAK_FIX_81970, false))
Bugs.tweak_fix81970();
if (pref.getBoolean(Const.TWEAK_FIX_98918, false))
Bugs.tweak_fix98918();
//if (!pref.getString("spn_1_user_text", "").isEmpty() || !pref.getString("spn_2_user_text", "").isEmpty())
//{
// Phone.hookServiceProviderName();
//}
//Phone.hookOperatorName();
//Phone.hookServiceState();
//Phone.hookServiceState2();
//Recorder.hookAudioRecord();
}
public void handleLoadPackage(LoadPackageParam paramLoadPackageParam) throws Throwable
{
String packageName = paramLoadPackageParam.packageName;
// if (paramLoadPackageParam.processName.equals("android") &&
// Integer.parseInt(XMain.pref.getString(Const.TWEAK_MEDIA_OPTION, "0"))
// != 0) {
// Control.execHook_VoluhookVolumeMediaButtonsmeMediaButtons(paramLoadPackageParam,
// Integer.parseInt(XMain.pref.getString(Const.TWEAK_MEDIA_OPTION,
// "0")));
// Control.hookVolumeMediaButtons(paramLoadPackageParam);
// }
// TODO: hook own package to check is it active or not for Main activity
// usage and checking
if (packageName.equals("kz.virtex.htc.tweaker"))
{
}
if (packageName.equals("com.android.internal.policy.impl"))
Misc.x("-------com.android.internal.policy.impl");
if (packageName.equals("com.android.internal.policy"))
Misc.x("-------com.android.internal.policy");
if (packageName.equals("com.android.internal"))
Misc.x("-------com.android.internal");
if (packageName.equals("com.android"))
Misc.x("-------com.android");
if (packageName.equals("android.net.sip"))
{
if (pref.getBoolean(Const.TWEAK_ENABLE_SIP, false))
Phone.hookSIP2(paramLoadPackageParam);
}
if (packageName.equals("com.android.phone"))
{
//Phone.hookOperatorName(paramLoadPackageParam);
if (Misc.isDual())
Phone.hookCopyDialExtra(paramLoadPackageParam);
if (pref.getBoolean(Const.TWEAK_ENABLE_SIP, false))
Phone.hookSIP(paramLoadPackageParam);
if (pref.getBoolean(Const.TWEAK_DISABLE_NS, false))
Phone.disableNoiseSuppression(paramLoadPackageParam);
if (pref.getBoolean(Const.TWEAK_DISABLE_DATA_ROAM_NOTIFY, false))
Phone.hookShowDataDisconnectedRoaming(paramLoadPackageParam);
/*----------------*/
/* CALL RECORDING */
/*----------------*/
Recorder.hookEnableCallRecording(paramLoadPackageParam);
Recorder.hookAutomateCallRecording(paramLoadPackageParam);
Recorder.hookAutomateCallRecordingFilename(paramLoadPackageParam);
}
if (packageName.equals("com.htc.soundrecorder"))
{
/*--------------------*/
/* RECORDING FILENAME */
/*--------------------*/
Recorder.getStorageRoot(paramLoadPackageParam);
Recorder.hookPausableAudioRecorderStart(paramLoadPackageParam);
//Recorder.hookIsEnableAudioRecord(paramLoadPackageParam);
}
if (packageName.equals("com.htc.htcdialer") || packageName.equals("com.htc.contacts"))
{
if (XMain.pref.getInt(Const.TWEAK_SLOT1_COLOR, 0) != 0 || XMain.pref.getInt(Const.TWEAK_SLOT2_COLOR, 0) != 0)
Dialer.hookCallButtons(paramLoadPackageParam);
if (pref.getBoolean(Const.TWEAK_OLD_SENSE_DIALER, false))
Dialer.hookSpecificHtcShowKeypad(paramLoadPackageParam);
/*----------------*/
/* DIALER BUTTONS */
/*----------------*/
if (pref.getBoolean(Const.TWEAK_DIALER_BUTTON, false))
Dialer.hookDialerButtons(paramLoadPackageParam);
if (Misc.isDual())
Dialer.hookSimCallButton(paramLoadPackageParam);
//Dialer.hookBigDialKeypad(paramLoadPackageParam);
}
if (packageName.equals("com.android.mms") || packageName.equals("com.htc.sense.mms"))
{
if (Misc.isDual())
Messaging.hookSendSMSButton(paramLoadPackageParam, packageName);
// Messaging.hookNotificationRemove(paramLoadPackageParam,
// packageName);
if (pref.getBoolean(Const.TWEAK_SMS_UNREAD_HIGHLIGHT, false))
Messaging.hookUnread(paramLoadPackageParam, packageName);
if (pref.getBoolean(Const.TWEAK_SMS_NOTIFY_TO_DIALOG, false))
Messaging.hookUpdateNotification(paramLoadPackageParam, packageName);
/*-----------------------*/
/* DELIVERY NOTIFICATION */
/*-----------------------*/
if (pref.getBoolean(Const.TWEAK_DELIVERY_NOTIFICATION, false))
Messaging.hookMessageNotification(paramLoadPackageParam, packageName);
if (XMain.pref.getInt(Const.TWEAK_SLOT1_COLOR, 0) != 0 || XMain.pref.getInt(Const.TWEAK_SLOT2_COLOR, 0) != 0)
Messaging.hookDualModeButtonStyle(paramLoadPackageParam, packageName);
}
if (packageName.equals("com.android.systemui"))
{
if (pref.getBoolean(Const.TWEAK_COLORED_SIM, false))
SystemUI.handleColoredSIM(paramLoadPackageParam);
if (pref.getBoolean(Const.TWEAK_MIUI_BATTERY, false))
SystemUI.hookStatusBarMIUIBattery(paramLoadPackageParam);
if (pref.getBoolean(Const.TWEAK_DISABLE_ALL_CAPS, false))
SystemUI.hookDateCase(paramLoadPackageParam);
if (pref.getBoolean(Const.TWEAK_STATUSBAR_CONDENSED, false))
SystemUI.hookBarFont(paramLoadPackageParam);
if (!pref.getBoolean(Const.TWEAK_STOCK_BATTERY, true))
SystemUI.hookDisableStockBattery(paramLoadPackageParam);
if (pref.getBoolean(Const.TWEAK_COLORED_BATTERY, false) && pref.getBoolean(Const.TWEAK_STOCK_BATTERY, true))
SystemUI.hookBatteryController(paramLoadPackageParam);
if (pref.getBoolean(Const.TWEAK_HEADS_UP_NOTIFICATION, false))
SystemUI.hookUseHeadsUp(paramLoadPackageParam);
/*----------------*/
/* QUICK PULLDOWN */
/*----------------*/
if (!pref.getString(Const.TWEAK_QUICK_SETTINGS, "0").equals("0"))
SystemUI.hookOnTouchEvent(paramLoadPackageParam, pref.getString(Const.TWEAK_QUICK_SETTINGS, "0"));
/*------------------------*/
/* EXPANDED NOTIFICATIONS */
/*------------------------*/
if (pref.getBoolean(Const.TWEAK_EXPANDED_NOTIFICATIONS, false))
SystemUI.hookExpandedNotifications(paramLoadPackageParam);
}
if (packageName.equals("com.nero.android.htc.sync"))
{
if (pref.getBoolean(Const.TWEAK_SYNC_NOTIFY, false))
HTCSync.hookHTCSyncNotification(paramLoadPackageParam);
}
if (packageName.equals("com.android.settings"))
{
if (pref.getBoolean(Const.TWEAK_USB_NOTIFY, false))
Settings.hookUSBNotification(paramLoadPackageParam);
}
if (packageName.equals("com.android.providers.media"))
{
if (pref.getBoolean(Const.TWEAK_MTP_NOTIFY, false))
Media.hookMPTNotification(paramLoadPackageParam);
}
if (packageName.equals("com.android.camera") || packageName.equals("com.htc.camera"))
{
// Camera.hookCameraActivity(paramLoadPackageParam);
if (!pref.getString(Const.TWEAK_PHOTO_PREFIX, "0").equals("0"))
Camera.hookCameraPrefix(paramLoadPackageParam, packageName, pref.getString(Const.TWEAK_PHOTO_PREFIX, "0"));
}
if (packageName.equals("com.htc.lockscreen"))
{
// LockScreen.hookOperatorName(paramLoadPackageParam);
}
}
public void handleInitPackageResources(InitPackageResourcesParam resparam) throws Throwable
{
if (resparam.packageName.equals("com.android.mms") || resparam.packageName.equals("com.htc.sense.mms"))
{
if (pref.getBoolean(Const.TWEAK_SMS_HIDE_BADGE, false))
Messaging.hookContactBadge(resparam);
if (pref.getInt(Const.TWEAK_SLOT1_COLOR, 0) != 0)
Phone.handleSlotIndicator1(resparam, MODULE_PATH, pref.getInt(Const.TWEAK_SLOT1_COLOR, 0));
if (pref.getInt(Const.TWEAK_SLOT2_COLOR, 0) != 0)
Phone.handleSlotIndicator2(resparam, MODULE_PATH, pref.getInt(Const.TWEAK_SLOT2_COLOR, 0));
}
if (resparam.packageName.equals("com.android.phone"))
{
if (pref.getInt(Const.TWEAK_SLOT1_COLOR, 0) != 0)
Phone.handleSlotIndicator1(resparam, MODULE_PATH, pref.getInt(Const.TWEAK_SLOT1_COLOR, 0));
if (pref.getInt(Const.TWEAK_SLOT2_COLOR, 0) != 0)
Phone.handleSlotIndicator2(resparam, MODULE_PATH, pref.getInt(Const.TWEAK_SLOT2_COLOR, 0));
}
if (resparam.packageName.equals("com.htc.htcdialer") || resparam.packageName.equals("com.htc.contacts"))
{
if (pref.getBoolean(Const.TWEAK_COLOR_CALL_INDICATOR, false))
Dialer.handleCallDirections(resparam, MODULE_PATH);
if (pref.getInt(Const.TWEAK_SLOT1_COLOR, 0) != 0)
Phone.handleSlotIndicator1(resparam, MODULE_PATH, pref.getInt(Const.TWEAK_SLOT1_COLOR, 0));
if (pref.getInt(Const.TWEAK_SLOT2_COLOR, 0) != 0)
Phone.handleSlotIndicator2(resparam, MODULE_PATH, pref.getInt(Const.TWEAK_SLOT2_COLOR, 0));
//Dialer.hookBigDialKeypad(resparam, MODULE_PATH);
}
if (resparam.packageName.equals("com.htc.contacts"))
{
if (pref.getInt(Const.TWEAK_SLOT1_COLOR, 0) != 0)
Phone.handleSlotIndicator1(resparam, MODULE_PATH, pref.getInt(Const.TWEAK_SLOT1_COLOR, 0));
if (pref.getInt(Const.TWEAK_SLOT2_COLOR, 0) != 0)
Phone.handleSlotIndicator2(resparam, MODULE_PATH, pref.getInt(Const.TWEAK_SLOT2_COLOR, 0));
if (pref.getBoolean(Const.TWEAK_COLOR_CALL_INDICATOR, false))
Contacts.handleCallDirections(resparam, MODULE_PATH);
}
if (resparam.packageName.equals("com.htc.weather.res") || resparam.packageName.equals("com.htc.Weather"))
{
if (pref.getBoolean(Const.TWEAK_COLORED_WEATHER, false))
Weather.handleColorWeather(resparam, weather_apk);
}
if (resparam.packageName.equals("com.htc.android.htcime") || resparam.packageName.equals("com.htc.sense.ime"))
{
if (pref.getBoolean(Const.TWEAK_POPUP_KEYBOARD, false))
Keyboard.handlePopup(resparam, MODULE_PATH);
}
if (resparam.packageName.equals("com.android.systemui"))
{
if (pref.getBoolean(Const.TWEAK_COLORED_SIM, false))
SystemUI.handleColoredSIM(resparam, MODULE_PATH);
if (pref.getBoolean(Const.TWEAK_COLORED_WIFI, false))
SystemUI.handleColoredWiFi(resparam, MODULE_PATH);
if (pref.getBoolean(Const.TWEAK_DATA_ICONS, false))
SystemUI.handleColoredData(resparam, MODULE_PATH);
}
}
}