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

Commit 9c7982ad authored by Youkichi Hosoi's avatar Youkichi Hosoi
Browse files

Register FocusTransitionObserver.dump through ShellCommandHandler

Currently, FocusTransitionObserver.dump is registered through
DesktopTasksController only when desktop mode is supported.
However, FocusTransitionObserver exists independently of desktop mode,
so the registration should be done directly through ShellCommandHandler.

Bug: 408122780
Test: atest FocusTransitionObserverTest
Test: adb shell dumpsys activity service SystemUIService WMShell
Flag: EXEMPT DEBUG

Change-Id: I1d874a1f4ac09e2ab738e6be9716450433998f03
parent 71d44fb7
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -817,8 +817,10 @@ public abstract class WMShellBaseModule {

    @WMSingleton
    @Provides
    static FocusTransitionObserver provideFocusTransitionObserver() {
        return new FocusTransitionObserver();
    static FocusTransitionObserver provideFocusTransitionObserver(
            ShellInit shellInit,
            ShellCommandHandler shellCommandHandler) {
        return new FocusTransitionObserver(shellInit, shellCommandHandler);
    }

    @WMSingleton
+0 −1
Original line number Diff line number Diff line
@@ -5910,7 +5910,6 @@ class DesktopTasksController(
        pw.println("${prefix}DesktopTasksController")
        desktopConfig.dump(pw, innerPrefix)
        userRepositories.dump(pw, innerPrefix)
        focusTransitionObserver.dump(pw, innerPrefix)
        if (Flags.showDesktopExperienceDevOption()) {
            dumpFlags(pw, prefix)
        }
+14 −1
Original line number Diff line number Diff line
@@ -41,6 +41,8 @@ import android.window.TransitionInfo;
import com.android.wm.shell.shared.FocusTransitionListener;
import com.android.wm.shell.shared.IFocusTransitionListener;
import com.android.wm.shell.shared.TransitionUtil.LeafTaskFilter;
import com.android.wm.shell.sysui.ShellCommandHandler;
import com.android.wm.shell.sysui.ShellInit;

import java.io.PrintWriter;
import java.util.ArrayList;
@@ -57,6 +59,8 @@ import java.util.concurrent.Executor;
public class FocusTransitionObserver {
    private static final String TAG = FocusTransitionObserver.class.getSimpleName();

    private final ShellCommandHandler mShellCommandHandler;

    private IFocusTransitionListener mRemoteListener;
    private final Map<FocusTransitionListener, Executor> mLocalListeners =
            new HashMap<>();
@@ -66,7 +70,16 @@ public class FocusTransitionObserver {

    private final ArraySet<RunningTaskInfo> mTmpTasksToBeNotified = new ArraySet<>();

    public FocusTransitionObserver() {}
    public FocusTransitionObserver(
            @NonNull ShellInit shellInit,
            @NonNull ShellCommandHandler shellCommandHandler) {
        mShellCommandHandler = shellCommandHandler;
        shellInit.addInitCallback(this::onInit, this);
    }

    private void onInit() {
        mShellCommandHandler.addDumpCallback(this::dump, this);
    }

    /**
     * Update display/window focus state from the given transition info and notifies changes if any.
+17 −1
Original line number Diff line number Diff line
@@ -25,12 +25,15 @@ import static android.window.TransitionInfo.FLAG_MOVED_TO_TOP;

import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.when;

@@ -48,6 +51,8 @@ import com.android.window.flags.Flags;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.TestShellExecutor;
import com.android.wm.shell.shared.FocusTransitionListener;
import com.android.wm.shell.sysui.ShellCommandHandler;
import com.android.wm.shell.sysui.ShellInit;

import org.junit.Before;
import org.junit.Test;
@@ -69,13 +74,18 @@ public class FocusTransitionObserverTest extends ShellTestCase {

    private FocusTransitionListener mListener;
    private final TestShellExecutor mShellExecutor = new TestShellExecutor();
    private ShellInit mShellInit;
    private ShellCommandHandler mShellCommandHandler;
    private FocusTransitionObserver mFocusTransitionObserver;

    @Before
    public void setUp() {
        mListener = mock(FocusTransitionListener.class);
        mFocusTransitionObserver = new FocusTransitionObserver();
        mShellInit = spy(new ShellInit(mShellExecutor));
        mShellCommandHandler = mock(ShellCommandHandler.class);
        mFocusTransitionObserver = new FocusTransitionObserver(mShellInit, mShellCommandHandler);
        mFocusTransitionObserver.setLocalFocusTransitionListener(mListener, mShellExecutor);
        mShellInit.init();
        mShellExecutor.flushAll();
        clearInvocations(mListener);
    }
@@ -254,6 +264,12 @@ public class FocusTransitionObserverTest extends ShellTestCase {
        clearInvocations(mListener);
    }

    @Test
    public void testAddDump() {
        verify(mShellCommandHandler, times(1)).addDumpCallback(
                any(), isA(FocusTransitionObserver.class));
    }

    private TransitionInfo.Change setupTaskChange(List<TransitionInfo.Change> changes, int taskId,
            @TransitionMode int mode, int displayId, boolean focused) {
        return setupTaskChange(changes, taskId, mode, displayId, displayId, focused);