diff --git a/app/src/main/java/com/mogo/launcher/lancet/WindowCallbackLancet.java b/app/src/main/java/com/mogo/launcher/lancet/WindowCallbackLancet.java index d4f7ee1474..ce542d056a 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/WindowCallbackLancet.java +++ b/app/src/main/java/com/mogo/launcher/lancet/WindowCallbackLancet.java @@ -3,16 +3,16 @@ package com.mogo.launcher.lancet; import android.app.Activity; import android.app.Dialog; import android.os.Bundle; -import android.util.Log; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.view.Window; import android.view.WindowManager; +import android.widget.PopupWindow; import androidx.annotation.Keep; import androidx.annotation.NonNull; import androidx.annotation.Nullable; - import com.knightboost.lancet.api.Origin; import com.knightboost.lancet.api.Scope; import com.knightboost.lancet.api.This; @@ -24,6 +24,7 @@ import com.knightboost.lancet.api.annotations.TargetMethod; import com.knightboost.lancet.api.annotations.Weaver; import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider; import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; +import com.mogo.launcher.R; @Keep @Weaver @@ -58,31 +59,90 @@ public class WindowCallbackLancet { return dialog; } -// @TargetClass(value = "android.view.WindowManager",scope = Scope.SELF) -// @TargetMethod(methodName = "addView") -// @ReplaceInvoke -// public static void proxyWindowManagerAddView(WindowManager manager, View view, ViewGroup.LayoutParams params) { -// manager.addView(view, params); -// Log.d("XXXXXX", "--- add view ---- 1 ---"); -// IMoGoMoFangProvider mofang = CallerDevaToolsManager.INSTANCE.mofang(); -// if (mofang != null) { -// Log.d("XXXXXX", "--- add view ---- 2 ---"); -// Window.Callback callback = mofang.provideWindowCallback(null); -// view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { -// @Override -// public void onViewAttachedToWindow(@NonNull View v) { -// Log.d("XXXXXX", "--- add view ---- 3 ---"); -// v.setOnKeyListener((v1, keyCode, event) -> { -// Log.d("XXXXXX", "--- add view ---- 4 ---"); -// return callback.dispatchKeyEvent(event); -// }); -// } -// -// @Override -// public void onViewDetachedFromWindow(@NonNull View v) { -// -// } -// }); -// } -// } + @TargetClass(value = "android.view.WindowManager",scope = Scope.SELF) + @TargetMethod(methodName = "addView") + @ReplaceInvoke + public static void proxyWindowManagerAddView(WindowManager manager, View view, ViewGroup.LayoutParams params) { + view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { + private final GlobalFocusChangedListener listener = new GlobalFocusChangedListener(); + private boolean isAdd = false; + @Override + public void onViewAttachedToWindow(@NonNull View v) { + try { + v.getViewTreeObserver().addOnGlobalFocusChangeListener(listener); + isAdd = true; + } catch (Throwable t) { + t.printStackTrace(); + } + } + @Override + public void onViewDetachedFromWindow(@NonNull View v) { + try { + if (isAdd) { + v.getViewTreeObserver().removeOnGlobalFocusChangeListener(listener); + } + } catch (Throwable t) { + t.printStackTrace(); + } + } + }); + manager.addView(view, params); + } + + @TargetClass(value = "android.widget.PopupWindow",scope = Scope.ALL) + @TargetMethod(methodName = "setContentView") + @ReplaceInvoke + public static void proxyPopupWindowSetContentView(PopupWindow window, View view) { + view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { + private final GlobalFocusChangedListener listener = new GlobalFocusChangedListener(); + private boolean isAdd = false; + @Override + public void onViewAttachedToWindow(@NonNull View v) { + try { + v.getViewTreeObserver().addOnGlobalFocusChangeListener(listener); + isAdd = true; + } catch (Throwable t) { + t.printStackTrace(); + } + } + @Override + public void onViewDetachedFromWindow(@NonNull View v) { + try { + if (isAdd) { + v.getViewTreeObserver().removeOnGlobalFocusChangeListener(listener); + } + } catch (Throwable t) { + t.printStackTrace(); + } + } + }); + window.setContentView(view); + } + + private static class GlobalFocusChangedListener implements ViewTreeObserver.OnGlobalFocusChangeListener { + + private Window.Callback mCallBack = null; + + @Override + public void onGlobalFocusChanged(View oldFocus, View newFocus) { + if (newFocus != null) { + Object tag = newFocus.getTag(R.id.on_key_set); + if (tag == null) { + newFocus.setTag(R.id.on_key_set, 1); + newFocus.setOnKeyListener((v, keyCode, event) -> { + if (mCallBack == null) { + IMoGoMoFangProvider mofang = CallerDevaToolsManager.INSTANCE.mofang(); + if (mofang != null) { + mCallBack = mofang.provideWindowCallback(null); + } + } + if (mCallBack != null) { + return mCallBack.dispatchKeyEvent(event); + } + return false; + }); + } + } + } + } } diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml new file mode 100644 index 0000000000..fbde1ec5f4 --- /dev/null +++ b/app/src/main/res/values/ids.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file