diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index 1c82619a61ade..33be381948f3b 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -1057,6 +1057,10 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation boolean canRun = false; if (show) { // Show request + if (fromIme) { + ImeTracing.getInstance().triggerClientDump( + "ImeInsetsSourceConsumer#requestShow", mHost.getInputMethodManager()); + } switch(consumer.requestShow(fromIme)) { case ShowResult.SHOW_IMMEDIATELY: canRun = true; @@ -1096,8 +1100,16 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation + fromIme); // We don't have a control at the moment. However, we still want to update requested // visibility state such that in case we get control, we can apply show animation. + if (fromIme) { + ImeTracing.getInstance().triggerClientDump( + "InsetsSourceConsumer#show", mHost.getInputMethodManager()); + } consumer.show(fromIme); } else if (animationType == ANIMATION_TYPE_HIDE) { + if (fromIme) { + ImeTracing.getInstance().triggerClientDump( + "InsetsSourceConsumer#hide", mHost.getInputMethodManager()); + } consumer.hide(); } } @@ -1217,8 +1229,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private void applyLocalVisibilityOverride() { for (int i = mSourceConsumers.size() - 1; i >= 0; i--) { - final InsetsSourceConsumer controller = mSourceConsumers.valueAt(i); - controller.applyLocalVisibilityOverride(); + final InsetsSourceConsumer consumer = mSourceConsumers.valueAt(i); + consumer.applyLocalVisibilityOverride(); } } diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java index 537fd42d71358..7ee337137176e 100644 --- a/core/java/android/view/InsetsSourceConsumer.java +++ b/core/java/android/view/InsetsSourceConsumer.java @@ -25,6 +25,7 @@ import static android.view.InsetsSourceConsumerProto.IS_REQUESTED_VISIBLE; import static android.view.InsetsSourceConsumerProto.PENDING_FRAME; import static android.view.InsetsSourceConsumerProto.PENDING_VISIBLE_FRAME; import static android.view.InsetsSourceConsumerProto.SOURCE_CONTROL; +import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.getDefaultVisibility; import static android.view.InsetsState.toPublicType; @@ -34,6 +35,7 @@ import android.annotation.IntDef; import android.annotation.Nullable; import android.graphics.Rect; import android.util.Log; +import android.util.imetracing.ImeTracing; import android.util.proto.ProtoOutputStream; import android.view.InsetsState.InternalInsetsType; import android.view.SurfaceControl.Transaction; @@ -108,6 +110,10 @@ public class InsetsSourceConsumer { */ public void setControl(@Nullable InsetsSourceControl control, @InsetsType int[] showTypes, @InsetsType int[] hideTypes) { + if (mType == ITYPE_IME) { + ImeTracing.getInstance().triggerClientDump("InsetsSourceConsumer#setControl", + mController.getHost().getInputMethodManager()); + } if (mSourceControl == control) { return; } @@ -237,6 +243,12 @@ public class InsetsSourceConsumer { final boolean isVisible = source != null ? source.isVisible() : getDefaultVisibility(mType); final boolean hasControl = mSourceControl != null; + if (mType == ITYPE_IME) { + ImeTracing.getInstance().triggerClientDump( + "InsetsSourceConsumer#applyLocalVisibilityOverride", + mController.getHost().getInputMethodManager()); + } + // We still need to let the legacy app know the visibility change even if we don't have the // control. If we don't have the source, we don't change the requested visibility for making // the callback behavior compatible. diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 2bea0d6b4b04c..800dabb2d21fc 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -19,6 +19,7 @@ package android.view; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; import static android.view.InputDevice.SOURCE_CLASS_NONE; +import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.InsetsState.SIZE; @@ -7914,6 +7915,10 @@ public final class ViewRootImpl implements ViewParent, if (mTranslator != null) { mTranslator.translateInsetsStateInScreenToAppWindow(insetsState); } + if (insetsState != null && insetsState.getSource(ITYPE_IME).isVisible()) { + ImeTracing.getInstance().triggerClientDump("ViewRootImpl#dispatchInsetsChanged", + getInsetsController().getHost().getInputMethodManager()); + } mHandler.obtainMessage(MSG_INSETS_CHANGED, insetsState).sendToTarget(); } @@ -7930,6 +7935,10 @@ public final class ViewRootImpl implements ViewParent, if (mTranslator != null) { mTranslator.translateInsetsStateInScreenToAppWindow(insetsState); } + if (insetsState != null && insetsState.getSource(ITYPE_IME).isVisible()) { + ImeTracing.getInstance().triggerClientDump("ViewRootImpl#dispatchInsetsControlChanged", + getInsetsController().getHost().getInputMethodManager()); + } SomeArgs args = SomeArgs.obtain(); args.arg1 = insetsState; args.arg2 = activeControls; diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 8d2c2d96637fd..1708355136d8f 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -596,6 +596,8 @@ public final class InputMethodManager { */ @Override public void finishInput() { + ImeTracing.getInstance().triggerClientDump( + "InputMethodManager.DelegateImpl#finishInput", InputMethodManager.this); synchronized (mH) { finishInputLocked(); } @@ -639,6 +641,10 @@ public final class InputMethodManager { int startInputFlags = getStartInputFlags(focusedView, 0); startInputFlags |= StartInputFlags.WINDOW_GAINED_FOCUS; + ImeTracing.getInstance().triggerClientDump( + "InputMethodManager.DelegateImpl#startInputAsyncOnWindowFocusGain", + InputMethodManager.this); + final ImeFocusController controller = getFocusController(); if (controller == null) { return; @@ -948,6 +954,9 @@ public final class InputMethodManager { case MSG_APPLY_IME_VISIBILITY: { synchronized (mH) { if (mImeInsetsConsumer != null) { + ImeTracing.getInstance().triggerClientDump( + "ImeInsetsSourceConsumer#applyImeVisibility", + InputMethodManager.this); mImeInsetsConsumer.applyImeVisibility(msg.arg1 != 0); } } @@ -1852,6 +1861,8 @@ public final class InputMethodManager { * {@link #HIDE_NOT_ALWAYS} bit set. **/ public void toggleSoftInputFromWindow(IBinder windowToken, int showFlags, int hideFlags) { + ImeTracing.getInstance().triggerClientDump( + "InputMethodManager#toggleSoftInputFromWindow", InputMethodManager.this); synchronized (mH) { final View servedView = getServedViewLocked(); if (servedView == null || servedView.getWindowToken() != windowToken) { @@ -1879,6 +1890,8 @@ public final class InputMethodManager { * {@link #HIDE_NOT_ALWAYS} bit set. */ public void toggleSoftInput(int showFlags, int hideFlags) { + ImeTracing.getInstance().triggerClientDump( + "InputMethodManager#toggleSoftInput", InputMethodManager.this); if (mCurMethod != null) { try { mCurMethod.toggleSoftInput(showFlags, hideFlags);