package tk.wasdennnoch.androidn_ify.systemui.statusbar; import android.content.res.XModuleResources; import java.lang.reflect.Array; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import tk.wasdennnoch.androidn_ify.XposedHook; import tk.wasdennnoch.androidn_ify.systemui.SystemUIHooks; import tk.wasdennnoch.androidn_ify.utils.ConfigUtils; import tk.wasdennnoch.androidn_ify.utils.RomUtils; class LollipopStatusBarHooks extends StatusBarHooks { private static final String TAG = "LollipopStatusBarHooks"; LollipopStatusBarHooks(ClassLoader classLoader) { super(classLoader); } @Override protected void hookSetMobileDataIndicators() { XposedBridge.hookAllMethods(mSignalClusterClass, "setMobileDataIndicators", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if (mDataDisabled && ConfigUtils.notifications().enable_data_disabled_indicator) { int typeIcon = !RomUtils.isCmBased() ? 2 : 3; int isTypeIconWide = ConfigUtils.L1 && !RomUtils.isCmBased() ? 5 : 6; Class mediaTekIconIdWrapperClass = null; try { mediaTekIconIdWrapperClass = XposedHelpers.findClass("com.mediatek.systemui.ext.IconIdWrapper", mClassLoader); XposedHook.logI(TAG, "Identified MediaTek device"); } catch (XposedHelpers.ClassNotFoundError ignore) { } if (mediaTekIconIdWrapperClass != null && mediaTekIconIdWrapperClass.isInstance(param.args[typeIcon])) { // MediaTek devices wrap the id Object iconIdWrapperArray = Array.newInstance(mediaTekIconIdWrapperClass, 1); Array.set(iconIdWrapperArray, 0, XposedHelpers.newInstance(mediaTekIconIdWrapperClass, XModuleResources.createInstance(XposedHook.getModulePath(), null), SystemUIHooks.R_drawable_stat_sys_data_disabled)); param.args[typeIcon] = iconIdWrapperArray; } else { param.args[typeIcon] = SystemUIHooks.R_drawable_stat_sys_data_disabled; } if (param.args[isTypeIconWide] instanceof Boolean) param.args[isTypeIconWide] = false; else if (param.args[7] instanceof Boolean) // Mediatek // (boolean visible, int strengthIcon, int mobileTypeId, // int ?, int ?, String ?, String ?, // boolean isTypeIconWide, int subId param.args[7] = false; else if (param.args[8] instanceof Boolean) // Xperia // (boolean mobileVisible, int mobileStrengthId, int mobileActivityId, int mobileTypeId, // int mobileRoamingIconId, String mobileDecription, String mobileTypeDescription, boolean roaming, // boolean isMobileTypeIconWide, int noSimIconId) param.args[8] = false; } } }); } }