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

Commit 74aa7f59 authored by Hongwei Wang's avatar Hongwei Wang
Browse files

[PiP2] Add UiEvent logs

Add the following missing logs in PiP2
- PICTURE_IN_PICTURE_ENTER
- PICTURE_IN_PICTURE_AUTO_ENTER
- PICTURE_IN_PICTURE_STASH_LEFT
- PICTURE_IN_PICTURE_STASH_RIGHT

Following logs are not added in PiP2 since the functionality is yet not
available
- PICTURE_IN_PICTURE_ENTER_CONTENT_PIP

Fixed also the issue that TaskInfo is not set for PipUiEventLogger in
PiP2, which causes logs not being sent at all.

Flag: com.android.wm.shell.enable_pip2
Bug: 387304221
Test: atest CtsStatsdAtomHostTestCases:UidAtomTests#testPictureInPictureState
Test: $ANDROID_HOST_OUT/bin/statsd_testdrive -terse 90
Change-Id: I0e91c333461a135a498f3b9c06ba7c5f133bd5d3
parent aaa37958
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -117,6 +117,7 @@ public abstract class Pip2Module {
            PipTouchHandler pipTouchHandler,
            PipAppOpsListener pipAppOpsListener,
            PhonePipMenuController pipMenuController,
            PipUiEventLogger pipUiEventLogger,
            @ShellMainThread ShellExecutor mainExecutor) {
        if (!PipUtils.isPip2ExperimentEnabled()) {
            return Optional.empty();
@@ -126,7 +127,7 @@ public abstract class Pip2Module {
                    displayInsetsController, pipBoundsState, pipBoundsAlgorithm,
                    pipDisplayLayoutState, pipScheduler, taskStackListener, shellTaskOrganizer,
                    pipTransitionState, pipTouchHandler, pipAppOpsListener, pipMenuController,
                    mainExecutor));
                    pipUiEventLogger, mainExecutor));
        }
    }

@@ -188,11 +189,11 @@ public abstract class Pip2Module {
            FloatingContentCoordinator floatingContentCoordinator,
            PipScheduler pipScheduler,
            Optional<PipPerfHintController> pipPerfHintControllerOptional,
            PipBoundsAlgorithm pipBoundsAlgorithm,
            PipTransitionState pipTransitionState) {
            PipTransitionState pipTransitionState,
            PipUiEventLogger pipUiEventLogger) {
        return new PipMotionHelper(context, pipBoundsState, menuController, pipSnapAlgorithm,
                floatingContentCoordinator, pipScheduler, pipPerfHintControllerOptional,
                pipBoundsAlgorithm, pipTransitionState);
                pipTransitionState, pipUiEventLogger);
    }

    @WMSingleton
+17 −13
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ import com.android.wm.shell.common.pip.PipAppOpsListener;
import com.android.wm.shell.common.pip.PipBoundsAlgorithm;
import com.android.wm.shell.common.pip.PipBoundsState;
import com.android.wm.shell.common.pip.PipDisplayLayoutState;
import com.android.wm.shell.common.pip.PipUiEventLogger;
import com.android.wm.shell.common.pip.PipUtils;
import com.android.wm.shell.pip.Pip;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
@@ -98,6 +99,7 @@ public class PipController implements ConfigurationChangeListener,
    private final PipTouchHandler mPipTouchHandler;
    private final PipAppOpsListener mPipAppOpsListener;
    private final PhonePipMenuController mPipMenuController;
    private final PipUiEventLogger mPipUiEventLogger;
    private final ShellExecutor mMainExecutor;
    private final PipImpl mImpl;
    private final List<Consumer<Boolean>> mOnIsInPipStateChangedListeners = new ArrayList<>();
@@ -143,6 +145,7 @@ public class PipController implements ConfigurationChangeListener,
            PipTouchHandler pipTouchHandler,
            PipAppOpsListener pipAppOpsListener,
            PhonePipMenuController pipMenuController,
            PipUiEventLogger pipUiEventLogger,
            ShellExecutor mainExecutor) {
        mContext = context;
        mShellCommandHandler = shellCommandHandler;
@@ -160,6 +163,7 @@ public class PipController implements ConfigurationChangeListener,
        mPipTouchHandler = pipTouchHandler;
        mPipAppOpsListener = pipAppOpsListener;
        mPipMenuController = pipMenuController;
        mPipUiEventLogger = pipUiEventLogger;
        mMainExecutor = mainExecutor;
        mImpl = new PipImpl();

@@ -187,6 +191,7 @@ public class PipController implements ConfigurationChangeListener,
            PipTouchHandler pipTouchHandler,
            PipAppOpsListener pipAppOpsListener,
            PhonePipMenuController pipMenuController,
            PipUiEventLogger pipUiEventLogger,
            ShellExecutor mainExecutor) {
        if (!context.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) {
            ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
@@ -197,7 +202,7 @@ public class PipController implements ConfigurationChangeListener,
                displayController, displayInsetsController, pipBoundsState, pipBoundsAlgorithm,
                pipDisplayLayoutState, pipScheduler, taskStackListener, shellTaskOrganizer,
                pipTransitionState, pipTouchHandler, pipAppOpsListener, pipMenuController,
                mainExecutor);
                pipUiEventLogger, mainExecutor);
    }

    public PipImpl getPipImpl() {
@@ -238,18 +243,6 @@ public class PipController implements ConfigurationChangeListener,
        });

        mPipAppOpsListener.setCallback(mPipTouchHandler.getMotionHelper());
        mPipTransitionState.addPipTransitionStateChangedListener(
                (oldState, newState, extra) -> {
                    if (newState == PipTransitionState.ENTERED_PIP) {
                        final TaskInfo taskInfo = mPipTransitionState.getPipTaskInfo();
                        if (taskInfo != null && taskInfo.topActivity != null) {
                            mPipAppOpsListener.onActivityPinned(
                                    taskInfo.topActivity.getPackageName());
                        }
                    } else if (newState == PipTransitionState.EXITED_PIP) {
                        mPipAppOpsListener.onActivityUnpinned();
                    }
                });
    }

    private ExternalInterfaceBinder createExternalInterface() {
@@ -446,14 +439,25 @@ public class PipController implements ConfigurationChangeListener,
                mPipTransitionState.setSwipePipToHomeState(overlay, appBounds);
                break;
            case PipTransitionState.ENTERED_PIP:
                final TaskInfo taskInfo = mPipTransitionState.getPipTaskInfo();
                if (taskInfo != null && taskInfo.topActivity != null) {
                    mPipAppOpsListener.onActivityPinned(taskInfo.topActivity.getPackageName());
                    mPipUiEventLogger.setTaskInfo(taskInfo);
                }
                if (mPipTransitionState.isInSwipePipToHomeTransition()) {
                    mPipUiEventLogger.log(
                            PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_AUTO_ENTER);
                    mPipTransitionState.resetSwipePipToHomeState();
                } else {
                    mPipUiEventLogger.log(PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_ENTER);
                }
                for (Consumer<Boolean> listener : mOnIsInPipStateChangedListeners) {
                    listener.accept(true /* inPip */);
                }
                break;
            case PipTransitionState.EXITED_PIP:
                mPipAppOpsListener.onActivityUnpinned();
                mPipUiEventLogger.setTaskInfo(null);
                for (Consumer<Boolean> listener : mOnIsInPipStateChangedListeners) {
                    listener.accept(false /* inPip */);
                }
+13 −11
Original line number Diff line number Diff line
@@ -43,20 +43,20 @@ import com.android.wm.shell.R;
import com.android.wm.shell.animation.FloatProperties;
import com.android.wm.shell.common.FloatingContentCoordinator;
import com.android.wm.shell.common.pip.PipAppOpsListener;
import com.android.wm.shell.common.pip.PipBoundsAlgorithm;
import com.android.wm.shell.common.pip.PipBoundsState;
import com.android.wm.shell.common.pip.PipPerfHintController;
import com.android.wm.shell.common.pip.PipSnapAlgorithm;
import com.android.wm.shell.common.pip.PipUiEventLogger;
import com.android.wm.shell.pip2.animation.PipResizeAnimator;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.shared.animation.PhysicsAnimator;
import com.android.wm.shell.shared.magnetictarget.MagnetizedObject;

import java.util.Optional;

import kotlin.Unit;
import kotlin.jvm.functions.Function0;

import java.util.Optional;

/**
 * A helper to animate and manipulate the PiP.
 */
@@ -80,12 +80,12 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,
    private static final float DISMISS_CIRCLE_PERCENT = 0.85f;

    private final Context mContext;
    private @NonNull PipBoundsState mPipBoundsState;
    private @NonNull PipBoundsAlgorithm mPipBoundsAlgorithm;
    private @NonNull PipScheduler mPipScheduler;
    private @NonNull PipTransitionState mPipTransitionState;
    private PhonePipMenuController mMenuController;
    private PipSnapAlgorithm mSnapAlgorithm;
    @NonNull private final PipBoundsState mPipBoundsState;
    @NonNull private final PipScheduler mPipScheduler;
    @NonNull private final PipTransitionState mPipTransitionState;
    @NonNull private final PipUiEventLogger mPipUiEventLogger;
    private final PhonePipMenuController mMenuController;
    private final PipSnapAlgorithm mSnapAlgorithm;

    /** The region that all of PIP must stay within. */
    private final Rect mFloatingAllowedArea = new Rect();
@@ -168,10 +168,9 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,
            PhonePipMenuController menuController, PipSnapAlgorithm snapAlgorithm,
            FloatingContentCoordinator floatingContentCoordinator, PipScheduler pipScheduler,
            Optional<PipPerfHintController> pipPerfHintControllerOptional,
            PipBoundsAlgorithm pipBoundsAlgorithm, PipTransitionState pipTransitionState) {
            PipTransitionState pipTransitionState, PipUiEventLogger pipUiEventLogger) {
        mContext = context;
        mPipBoundsState = pipBoundsState;
        mPipBoundsAlgorithm = pipBoundsAlgorithm;
        mPipScheduler = pipScheduler;
        mMenuController = menuController;
        mSnapAlgorithm = snapAlgorithm;
@@ -185,6 +184,7 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,
        };
        mPipTransitionState = pipTransitionState;
        mPipTransitionState.addPipTransitionStateChangedListener(this);
        mPipUiEventLogger = pipUiEventLogger;
    }

    void init() {
@@ -850,9 +850,11 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,
        if (mPipBoundsState.getBounds().left < 0
                && mPipBoundsState.getStashedState() != STASH_TYPE_LEFT) {
            mPipBoundsState.setStashed(STASH_TYPE_LEFT);
            mPipUiEventLogger.log(PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_STASH_LEFT);
        } else if (mPipBoundsState.getBounds().left >= 0
                && mPipBoundsState.getStashedState() != STASH_TYPE_RIGHT) {
            mPipBoundsState.setStashed(STASH_TYPE_RIGHT);
            mPipUiEventLogger.log(PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_STASH_RIGHT);
        }
        mMenuController.hideMenu();
    }