package tk.wasdennnoch.androidn_ify.systemui.qs.tiles; import java.lang.reflect.Method; 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.qs.TilesManager; public class AOSPTile extends BaseTile { private static final String TAG = "AOSPTile"; private Class mTileClass; private XC_MethodHook.Unhook mHandleUpdateStateHook; private XC_MethodHook.Unhook mHandleToggleClickHook; private XC_MethodHook.Unhook mHandleClickHook; public AOSPTile(TilesManager tilesManager, Object host, String key) { super(tilesManager, host, key); mTile = XposedHelpers.callMethod(host, "createTile", key); if (mTile == null) throw new NullPointerException("crateTile returned null"); mTileClass = mTile.getClass(); XposedHelpers.setAdditionalInstanceField(mTile, TILE_KEY_NAME, mKey); registerCallbacks(); hook(); } private void hook() { try { mHandleUpdateStateHook = XposedHelpers.findAndHookMethod(mTileClass, "handleUpdateState", CLASS_TILE_STATE, Object.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { if (mKey.equals(XposedHelpers.getAdditionalInstanceField(param.thisObject, TILE_KEY_NAME))) { handleUpdateState(param.args[0], param.args[1]); } } }); //hookHandleClick(); } catch (Throwable t) { XposedHook.logE(TAG, "Error hooking tile " + mTileClass.getName(), t); } } private void hookHandleClick() { Method clickMethod; try { clickMethod = XposedHelpers.findMethodExact(mTileClass, "handleClick"); } catch (Throwable t) { // PA clickMethod = XposedHelpers.findMethodExact(mTileClass, "handleToggleClick"); mHandleToggleClickHook = XposedHelpers.findAndHookMethod(mTileClass, "handleClick", boolean.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { param.args[0] = true; // So that handleToggleClick gets called } }); } mHandleClickHook = XposedBridge.hookMethod(clickMethod, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if (mKey.equals(XposedHelpers.getAdditionalInstanceField(param.thisObject, TILE_KEY_NAME))) { if (handleClickInner()) { param.setResult(null); } } } }); } @Override public void handleDestroy() { super.handleDestroy(); mHandleUpdateStateHook.unhook(); //if (mHandleToggleClickHook != null) mHandleToggleClickHook.unhook(); //mHandleClickHook.unhook(); } @Override public void handleUpdateState(Object state, Object arg) { boolean visible = !mSecure || !mKeyguard.isShowing() || !mKeyguard.isSecure(); XposedHelpers.setBooleanField(state, "visible", visible); } @Override public boolean handleClickInner() { return false; /* if (mSecure && mKeyguard.isShowing() && mKeyguard.isSecure()) { SystemUIHooks.statusBarHooks.startRunnableDismissingKeyguard(new Runnable() { @Override public void run() { callHandleClick(); } }); return true; } else { return false; } */ } private void callHandleClick() { XposedHelpers.callMethod(mTile, "handleClick"); } }