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

Commit d5c1ec0a authored by Bill Lin's avatar Bill Lin
Browse files

Add Unit Tests to guarantee non Pip feature device quality

Since Android Go disabled PIP feature, the current PIP arch
register a bunch of callback at ctor, however, with dagger's
mechanism it's not easy to predict which pip components was inited
and register callback, that could introduce NPE unexpectly.
Adding more test to verify disabled pip is a good option

Adding new unit tests for PIP :
+ PipControllerTest
+ PipTaskOrganizerTest
+ OverviewProxyServiceTest

Test: atest PipControllerTest
Test: atest PipTaskOrganizerTest
Test: atest WMShellTest
Test: make SystemUI
Test: make ArcSystemUI
Test: make WMShellUnitTests
Test: lunch aosp_tv_arm-userdebug & make
Test: atest SystemUITests
Test: atest WindowManagerShellTests
Test: atest WMShellUnitTests
Test: adb shell input keyevent 171(KEYCODE_WINDOW)
Test: manual test Pip demo AP
Test: adb shell dumpsys activity service com.android.systemui

Bug: 168715160
Change-Id: Idee90d00265d2ced629d4ba4eb0bb85c2a7905ac
parent 69248323
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ import com.android.internal.os.SomeArgs;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.pip.phone.PipMenuActivityController;
import com.android.systemui.pip.phone.PipUpdateThread;
import com.android.systemui.pip.phone.PipUtils;
import com.android.wm.shell.R;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayController;
@@ -260,6 +261,11 @@ public class PipTaskOrganizer extends TaskOrganizer implements ShellTaskOrganize
        mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;
        mSplitScreenOptional = splitScreenOptional;
        mTaskOrganizer = shellTaskOrganizer;

        if (!PipUtils.hasSystemFeature(context)) {
            Log.w(TAG, "Device not support PIP feature");
            return;
        }
        mTaskOrganizer.addListener(this, WINDOWING_MODE_PINNED);
        displayController.addDisplayWindowListener(this);
    }
+1 −5
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.systemui.pip.phone;

import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;

import static com.android.systemui.pip.PipAnimationController.isOutPipDirection;

@@ -30,7 +29,6 @@ import android.app.IActivityManager;
import android.app.RemoteAction;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.content.res.Configuration;
import android.graphics.Rect;
@@ -278,9 +276,7 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac
        mContext = context;
        mActivityManager = ActivityManager.getService();

        PackageManager pm = context.getPackageManager();
        boolean supportsPip = pm.hasSystemFeature(FEATURE_PICTURE_IN_PICTURE);
        if (supportsPip) {
        if (PipUtils.hasSystemFeature(mContext)) {
            initController(context, broadcastDispatcher, configController, deviceConfig,
                    displayController, floatingContentCoordinator, sysUiState, pipBoundsHandler,
                    pipSurfaceTransactionHelper, pipTaskOrganizer, pipUiEventLogger);
+11 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.pip.phone;

import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;

import android.app.ActivityTaskManager;
import android.app.ActivityTaskManager.RootTaskInfo;
@@ -57,4 +58,14 @@ public class PipUtils {
        }
        return new Pair<>(null, 0);
    }

    /**
     * The util to check if device has PIP feature
     *
     * @param context application context
     * @return true if device has PIP feature, false otherwise.
     */
    public static boolean hasSystemFeature(Context context) {
        return context.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE);
    }
}
+5 −3
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.systemui.recents;

import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
import static android.view.MotionEvent.ACTION_CANCEL;
import static android.view.MotionEvent.ACTION_DOWN;
@@ -65,6 +64,7 @@ import android.view.accessibility.AccessibilityManager;
import androidx.annotation.NonNull;

import com.android.internal.accessibility.dialog.AccessibilityButtonChooserActivity;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.policy.ScreenDecorationsUtils;
import com.android.internal.util.ScreenshotHelper;
import com.android.systemui.Dumpable;
@@ -77,6 +77,7 @@ import com.android.systemui.navigationbar.NavigationBarView;
import com.android.systemui.navigationbar.NavigationModeController;
import com.android.systemui.pip.Pip;
import com.android.systemui.pip.PipAnimationController;
import com.android.systemui.pip.phone.PipUtils;
import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener;
import com.android.systemui.settings.CurrentUserTracker;
import com.android.systemui.shared.recents.IOverviewProxy;
@@ -155,7 +156,8 @@ public class OverviewProxyService extends CurrentUserTracker implements
    private boolean mSupportsRoundedCornersOnWindows;
    private int mNavBarMode = NAV_BAR_MODE_3BUTTON;

    private ISystemUiProxy mSysUiProxy = new ISystemUiProxy.Stub() {
    @VisibleForTesting
    public ISystemUiProxy mSysUiProxy = new ISystemUiProxy.Stub() {

        @Override
        public void startScreenPinning(int taskId) {
@@ -624,7 +626,7 @@ public class OverviewProxyService extends CurrentUserTracker implements
        super(broadcastDispatcher);
        mContext = context;
        mPipOptional = pipOptional;
        mHasPipFeature = mContext.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE);
        mHasPipFeature = PipUtils.hasSystemFeature(mContext);
        mStatusBarOptionalLazy = statusBarOptionalLazy;
        mHandler = new Handler();
        mNavBarControllerLazy = navBarControllerLazy;
+5 −2
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.model.SysUiState;
import com.android.systemui.navigationbar.NavigationModeController;
import com.android.systemui.pip.Pip;
import com.android.systemui.pip.phone.PipUtils;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.shared.tracing.ProtoTraceable;
@@ -57,7 +58,6 @@ import com.android.wm.shell.protolog.ShellProtoLogImpl;
import com.android.wm.shell.splitscreen.SplitScreen;

import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Optional;
@@ -103,7 +103,6 @@ public final class WMShell extends SystemUI
            ProtoTracer protoTracer) {
        super(context);
        mCommandQueue = commandQueue;
        mCommandQueue.addCallback(this);
        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
        mActivityManagerWrapper = activityManagerWrapper;
        mDisplayImeController = displayImeController;
@@ -120,6 +119,7 @@ public final class WMShell extends SystemUI

    @Override
    public void start() {
        mCommandQueue.addCallback(this);
        // 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.
@@ -131,6 +131,9 @@ public final class WMShell extends SystemUI

    @VisibleForTesting
    void initPip(Pip pip) {
        if (!PipUtils.hasSystemFeature(mContext)) {
            return;
        }
        mCommandQueue.addCallback(new CommandQueue.Callbacks() {
            @Override
            public void showPictureInPictureMenu() {
Loading