Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1202866b authored by Cosmin Băieș's avatar Cosmin Băieș
Browse files

Add logShowImePostLayoutState

This logs the state in ImeInsetsSourceProvider when we have an on-going
show request that registered an mShowImeRunner, and either a new show
request comes in (cancelling the original one) or a new hide request
comes in (failing the original show).

The new logs should help understand issues where the mShowImeRunner is
registered but not running for a long time (2-3 seconds).

This also adds a line for the dumpsys when the mImeRequester is null.

Bug: 328360239
Test: n/a
Change-Id: I835cf6eeaa1ab1b7cc38481c7c57b478eddb010f
parent f1d202bd
Loading
Loading
Loading
Loading
+57 −7
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.graphics.Rect;
import android.os.Trace;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
import android.view.InsetsSource;
import android.view.InsetsSourceConsumer;
@@ -50,6 +51,8 @@ import java.io.PrintWriter;
 */
final class ImeInsetsSourceProvider extends InsetsSourceProvider {

    private static final String TAG = ImeInsetsSourceProvider.class.getSimpleName();

    /** The token tracking the current IME request or {@code null} otherwise. */
    @Nullable
    private ImeTracker.Token mImeRequesterStatsToken;
@@ -220,12 +223,16 @@ final class ImeInsetsSourceProvider extends InsetsSourceProvider {
     */
    void scheduleShowImePostLayout(InsetsControlTarget imeTarget,
            @NonNull ImeTracker.Token statsToken) {
        boolean targetChanged = isTargetChangedWithinActivity(imeTarget);
        mImeRequester = imeTarget;
        if (mImeRequesterStatsToken != null) {
            // Cancel the pre-existing stats token, if any.
            // Log state on pre-existing request cancel.
            logShowImePostLayoutState();
            ImeTracker.forLogging().onCancelled(
                    mImeRequesterStatsToken, ImeTracker.PHASE_WM_SHOW_IME_RUNNER);
        }
        mImeRequesterStatsToken = statsToken;
        boolean targetChanged = isTargetChangedWithinActivity(imeTarget);
        mImeRequester = imeTarget;
        if (targetChanged) {
            // target changed, check if new target can show IME.
            ProtoLog.d(WM_DEBUG_IME, "IME target changed within ActivityRecord");
@@ -297,13 +304,17 @@ final class ImeInsetsSourceProvider extends InsetsSourceProvider {
     */
    void abortShowImePostLayout() {
        ProtoLog.d(WM_DEBUG_IME, "abortShowImePostLayout");
        mImeRequester = null;
        mIsImeLayoutDrawn = false;
        mShowImeRunner = null;
        if (mImeRequesterStatsToken != null) {
            // Log state on abort.
            logShowImePostLayoutState();
            ImeTracker.forLogging().onFailed(
                    mImeRequesterStatsToken, ImeTracker.PHASE_WM_ABORT_SHOW_IME_POST_LAYOUT);
            mImeRequesterStatsToken = null;
        }
        mImeRequester = null;
        mIsImeLayoutDrawn = false;
        mShowImeRunner = null;
    }

    @VisibleForTesting
    boolean isReadyToShowIme() {
@@ -337,6 +348,41 @@ final class ImeInsetsSourceProvider extends InsetsSourceProvider {
                || sameAsImeControlTarget();
    }

    /**
     * Logs the current state required for scheduleShowImePostLayout's runnable to be triggered.
     */
    private void logShowImePostLayoutState() {
        final var windowState = mWindowContainer != null ? mWindowContainer.asWindowState() : null;
        final var dcTarget = mDisplayContent.getImeTarget(IME_TARGET_LAYERING);
        final var controlTarget = mDisplayContent.getImeTarget(IME_TARGET_CONTROL);
        final var sb = new StringBuilder();
        sb.append("mWindowContainer: ").append(mWindowContainer);
        sb.append(" windowState: ").append(windowState);
        if (windowState != null) {
            sb.append(" windowState.isDrawn(): ").append(windowState.isDrawn());
            sb.append(" windowState.mGivenInsetsPending: ").append(windowState.mGivenInsetsPending);
        }
        sb.append(" mIsImeLayoutDrawn: ").append(mIsImeLayoutDrawn);
        sb.append(" mShowImeRunner: ").append(mShowImeRunner);
        sb.append(" mImeRequester: ").append(mImeRequester);
        sb.append(" dcTarget: ").append(dcTarget);
        sb.append(" controlTarget: ").append(controlTarget);
        sb.append(" isReadyToShowIme(): ").append(isReadyToShowIme());
        if (mImeRequester != null && dcTarget != null && controlTarget != null) {
            sb.append(" isImeLayeringTarget: ");
            sb.append(isImeLayeringTarget(mImeRequester, dcTarget));
            sb.append(" isAboveImeLayeringTarget: ");
            sb.append(isAboveImeLayeringTarget(mImeRequester, dcTarget));
            sb.append(" isImeFallbackTarget: ");
            sb.append(isImeFallbackTarget(mImeRequester));
            sb.append(" isImeInputTarget: ");
            sb.append(isImeInputTarget(mImeRequester));
            sb.append(" sameAsImeControlTarget: ");
            sb.append(sameAsImeControlTarget());
        }
        Slog.d(TAG, sb.toString());
    }

    // ---------------------------------------------------------------------------------------
    // Methods for checking IME insets target changing state.
    //
@@ -399,6 +445,10 @@ final class ImeInsetsSourceProvider extends InsetsSourceProvider {
            pw.print("showImePostLayout pending for mImeRequester=");
            pw.print(mImeRequester);
            pw.println();
        } else {
            pw.print(prefix);
            pw.print("showImePostLayout not scheduled, mImeRequester=null");
            pw.println();
        }
        pw.println();
    }