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

Commit d92b11e7 authored by Jerry Chang's avatar Jerry Chang
Browse files

Add test to make sure it inits WM Shell controllers properly

Removes redundant codes and tests init functions for each controller in
WMShell class.

Bug: 161116823
Bug: 161118569
Test: atest WMShellTest
Change-Id: Ie03c060a5741baed74c0880677c5656a6b1d4c4a
parent fa817ade
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_
import android.app.ActivityManager;
import android.content.Context;

import com.android.internal.annotations.VisibleForTesting;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.SystemUI;
@@ -48,11 +49,11 @@ import javax.inject.Inject;
 * Proxy in SysUiScope to delegate events to controllers in WM Shell library.
 */
@SysUISingleton
public final class WMShell extends SystemUI implements ProtoTraceable<SystemUiTraceProto>,
        CommandQueue.Callbacks {
public final class WMShell extends SystemUI implements ProtoTraceable<SystemUiTraceProto> {
    private final CommandQueue mCommandQueue;
    private final DisplayImeController mDisplayImeController;
    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    private final ActivityManagerWrapper mActivityManagerWrapper;
    private final Optional<Pip> mPipOptional;
    private final Optional<SplitScreen> mSplitScreenOptional;
    private final ProtoTracer mProtoTracer;
@@ -60,6 +61,7 @@ public final class WMShell extends SystemUI implements ProtoTraceable<SystemUiTr
    @Inject
    public WMShell(Context context, CommandQueue commandQueue,
            KeyguardUpdateMonitor keyguardUpdateMonitor,
            ActivityManagerWrapper activityManagerWrapper,
            DisplayImeController displayImeController,
            Optional<Pip> pipOptional,
            Optional<SplitScreen> splitScreenOptional,
@@ -67,6 +69,7 @@ public final class WMShell extends SystemUI implements ProtoTraceable<SystemUiTr
        super(context);
        mCommandQueue = commandQueue;
        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
        mActivityManagerWrapper = activityManagerWrapper;
        mDisplayImeController = displayImeController;
        mPipOptional = pipOptional;
        mSplitScreenOptional = splitScreenOptional;
@@ -79,14 +82,14 @@ public final class WMShell extends SystemUI implements ProtoTraceable<SystemUiTr
        // This is to prevent circular init problem by separating registration step out of its
        // constructor. And make sure the initialization of DisplayImeController won't depend on
        // specific feature anymore.
        mCommandQueue.addCallback(this);
        mDisplayImeController.startMonitorDisplays();

        mPipOptional.ifPresent(this::initPip);
        mSplitScreenOptional.ifPresent(this::initSplitScreen);
    }

    private void initPip(Pip pip) {
    @VisibleForTesting
    void initPip(Pip pip) {
        mCommandQueue.addCallback(new CommandQueue.Callbacks() {
            @Override
            public void showPictureInPictureMenu() {
@@ -95,7 +98,8 @@ public final class WMShell extends SystemUI implements ProtoTraceable<SystemUiTr
        });
    }

    private void initSplitScreen(SplitScreen splitScreen) {
    @VisibleForTesting
    void initSplitScreen(SplitScreen splitScreen) {
        mKeyguardUpdateMonitor.registerCallback(new KeyguardUpdateMonitorCallback() {
            @Override
            public void onKeyguardVisibilityChanged(boolean showing) {
@@ -107,7 +111,7 @@ public final class WMShell extends SystemUI implements ProtoTraceable<SystemUiTr
            }
        });

        ActivityManagerWrapper.getInstance().registerTaskStackListener(
        mActivityManagerWrapper.registerTaskStackListener(
                new TaskStackChangeListener() {
                    @Override
                    public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task,
+29 −17
Original line number Diff line number Diff line
@@ -16,21 +16,19 @@

package com.android.systemui.wmshell;

import static org.mockito.Mockito.times;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.app.Instrumentation;
import android.content.Context;
import android.test.suitebuilder.annotation.SmallTest;

import androidx.test.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;

import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.pip.Pip;
import com.android.systemui.pip.tv.PipController;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.stackdivider.SplitScreen;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.tracing.ProtoTracer;
@@ -48,29 +46,43 @@ import java.util.Optional;
@RunWith(AndroidJUnit4.class)
public class WMShellTest extends SysuiTestCase {

    Instrumentation mInstrumentation;
    WMShell mWMShell;
    @Mock Context mContext;
    @Mock CommandQueue mCommandQueue;
    @Mock KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    @Mock ActivityManagerWrapper mActivityManagerWrapper;
    @Mock DisplayImeController mDisplayImeController;
    @Mock Optional<Pip> mPipOptional;
    @Mock Optional<SplitScreen> mSplitScreenOptional;
    @Mock PipController mPipController;
    @Mock Pip mPip;
    @Mock SplitScreen mSplitScreen;
    @Mock ProtoTracer mProtoTracer;

    @Before
    public void setUp() throws Exception {
        mInstrumentation = InstrumentationRegistry.getInstrumentation();
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mWMShell = new WMShell(mContext, mCommandQueue, mKeyguardUpdateMonitor,
                mDisplayImeController, mPipOptional, mSplitScreenOptional, mProtoTracer);
                mActivityManagerWrapper, mDisplayImeController, Optional.of(mPip),
                Optional.of(mSplitScreen), mProtoTracer);
    }

    @Test
    public void start_startsMonitorDisplays() {
        mWMShell.start();
        when(mPipOptional.get()).thenReturn(mPipController);

        verify(mDisplayImeController).startMonitorDisplays();
    }

    @Test
    public void testWMShellRegisterCommandQueue() {
        verify(mCommandQueue, times(1)).addCallback(mWMShell);
    public void initPip_registersCommandQueueCallback() {
        mWMShell.initPip(mPip);

        verify(mCommandQueue).addCallback(any(CommandQueue.Callbacks.class));
    }

    @Test
    public void initSplitScreen_registersCallbacks() {
        mWMShell.initSplitScreen(mSplitScreen);

        verify(mKeyguardUpdateMonitor).registerCallback(any(KeyguardUpdateMonitorCallback.class));
        verify(mActivityManagerWrapper).registerTaskStackListener(
                any(TaskStackChangeListener.class));
    }
}