package tk.wasdennnoch.androidn_ify.systemui.recents.doubletap;
import android.content.Context;
import android.os.Build;
import android.os.Handler;
import android.view.View;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import tk.wasdennnoch.androidn_ify.XposedHook;
import tk.wasdennnoch.androidn_ify.misc.SafeRunnable;
import tk.wasdennnoch.androidn_ify.utils.ConfigUtils;
public class DoubleTapSwKeys extends DoubleTapBase {
private static final String TAG = "DoubleTapSwKeys";
private static final String CLASS_PHONE_STATUS_BAR = "com.android.systemui.statusbar.phone.PhoneStatusBar";
private static Context mContext;
private static Handler mHandler;
private static boolean sWasPressed = false;
private static View.OnClickListener sOriginalRecentsClickListener;
private static View sRecentsButton;
private static final Runnable sResetPressedStateRunnable = new SafeRunnable() {
@Override
public void runSafe() {
XposedHook.logD(TAG, "Double tap timed out after " + mDoubletapSpeed + "ms, invoking original mRecentsClickListener");
sWasPressed = false;
sOriginalRecentsClickListener.onClick(sRecentsButton);
}
};
private static final XC_MethodHook prepareNavigationBarViewHook = new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedHook.logD(TAG, "prepareNavigationBarViewHook called");
mContext = (Context) XposedHelpers.getObjectField(param.thisObject, "mContext");
mHandler = (Handler) XposedHelpers.getObjectField(param.thisObject, "mHandler");
sOriginalRecentsClickListener = (View.OnClickListener) XposedHelpers.getObjectField(param.thisObject, "mRecentsClickListener");
Object navigationBarView = XposedHelpers.getObjectField(param.thisObject, "mNavigationBarView");
sRecentsButton = (View) XposedHelpers.callMethod(navigationBarView, "getRecentsButton");
sRecentsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
XposedHook.logD(TAG, "SW recents clicked");
if (!sWasPressed) {
sWasPressed = true;
mHandler.postDelayed(sResetPressedStateRunnable, mDoubletapSpeed);
} else {
XposedHook.logD(TAG, "Double tap detected");
mHandler.removeCallbacks(sResetPressedStateRunnable);
sWasPressed = false;
if (!isTaskLocked(mContext))
switchToLastApp(mContext, mHandler);
}
}
});
registerReceiver(mContext, false);
}
};
public static void hook(ClassLoader classLoader) {
try {
ConfigUtils config = ConfigUtils.getInstance();
if (Build.VERSION.SDK_INT >= 23 && !config.recents.alternative_method) return;
loadPrefDoubleTapSpeed();
if (config.recents.double_tap) {
try {
XposedHelpers.findAndHookMethod(CLASS_PHONE_STATUS_BAR, classLoader, "prepareNavigationBarView", prepareNavigationBarViewHook);
} catch (NoSuchMethodError e) {
// CM takes a boolean parameter
XposedHelpers.findAndHookMethod(CLASS_PHONE_STATUS_BAR, classLoader, "prepareNavigationBarView", boolean.class, prepareNavigationBarViewHook);
}
}
} catch (Throwable t) {
XposedHook.logE(TAG, "Error in hook", t);
}
}
}