Merge "Add ShellProtoLogGroup for Picture-In-Picture. Update the code for PIP and phone PIP to use ProtoLog instead of Log." into tm-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
a61c47ff37
@@ -29,14 +29,15 @@ import android.graphics.Point;
|
|||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
import android.util.Log;
|
|
||||||
import android.util.Size;
|
import android.util.Size;
|
||||||
import android.view.Display;
|
import android.view.Display;
|
||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
|
import com.android.internal.protolog.common.ProtoLog;
|
||||||
import com.android.internal.util.function.TriConsumer;
|
import com.android.internal.util.function.TriConsumer;
|
||||||
import com.android.wm.shell.R;
|
import com.android.wm.shell.R;
|
||||||
import com.android.wm.shell.common.DisplayLayout;
|
import com.android.wm.shell.common.DisplayLayout;
|
||||||
|
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
@@ -223,7 +224,8 @@ public class PipBoundsState {
|
|||||||
new PictureInPictureUiState(stashedState != STASH_TYPE_NONE /* isStashed */)
|
new PictureInPictureUiState(stashedState != STASH_TYPE_NONE /* isStashed */)
|
||||||
);
|
);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Log.e(TAG, "Unable to set alert PiP state change.");
|
ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Unable to set alert PiP state change.", TAG);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -63,7 +63,6 @@ import android.content.res.Configuration;
|
|||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.util.Log;
|
|
||||||
import android.util.Rational;
|
import android.util.Rational;
|
||||||
import android.view.Display;
|
import android.view.Display;
|
||||||
import android.view.Surface;
|
import android.view.Surface;
|
||||||
@@ -73,6 +72,7 @@ import android.window.WindowContainerToken;
|
|||||||
import android.window.WindowContainerTransaction;
|
import android.window.WindowContainerTransaction;
|
||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
|
import com.android.internal.protolog.common.ProtoLog;
|
||||||
import com.android.wm.shell.R;
|
import com.android.wm.shell.R;
|
||||||
import com.android.wm.shell.ShellTaskOrganizer;
|
import com.android.wm.shell.ShellTaskOrganizer;
|
||||||
import com.android.wm.shell.animation.Interpolators;
|
import com.android.wm.shell.animation.Interpolators;
|
||||||
@@ -83,6 +83,7 @@ import com.android.wm.shell.common.SyncTransactionQueue;
|
|||||||
import com.android.wm.shell.common.annotations.ShellMainThread;
|
import com.android.wm.shell.common.annotations.ShellMainThread;
|
||||||
import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController;
|
import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController;
|
||||||
import com.android.wm.shell.pip.phone.PipMotionHelper;
|
import com.android.wm.shell.pip.phone.PipMotionHelper;
|
||||||
|
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
||||||
import com.android.wm.shell.splitscreen.SplitScreenController;
|
import com.android.wm.shell.splitscreen.SplitScreenController;
|
||||||
import com.android.wm.shell.transition.Transitions;
|
import com.android.wm.shell.transition.Transitions;
|
||||||
|
|
||||||
@@ -395,8 +396,10 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
if (!mPipTransitionState.isInPip()
|
if (!mPipTransitionState.isInPip()
|
||||||
|| mPipTransitionState.getTransitionState() == PipTransitionState.EXITING_PIP
|
|| mPipTransitionState.getTransitionState() == PipTransitionState.EXITING_PIP
|
||||||
|| mToken == null) {
|
|| mToken == null) {
|
||||||
Log.wtf(TAG, "Not allowed to exitPip in current state"
|
ProtoLog.wtf(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
+ " mState=" + mPipTransitionState.getTransitionState() + " mToken=" + mToken);
|
"%s: Not allowed to exitPip in current state"
|
||||||
|
+ " mState=%d mToken=%s", TAG, mPipTransitionState.getTransitionState(),
|
||||||
|
mToken);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -500,9 +503,11 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
* Removes PiP immediately.
|
* Removes PiP immediately.
|
||||||
*/
|
*/
|
||||||
public void removePip() {
|
public void removePip() {
|
||||||
if (!mPipTransitionState.isInPip() || mToken == null) {
|
if (!mPipTransitionState.isInPip() || mToken == null) {
|
||||||
Log.wtf(TAG, "Not allowed to removePip in current state"
|
ProtoLog.wtf(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
+ " mState=" + mPipTransitionState.getTransitionState() + " mToken=" + mToken);
|
"%s: Not allowed to removePip in current state"
|
||||||
|
+ " mState=%d mToken=%s", TAG, mPipTransitionState.getTransitionState(),
|
||||||
|
mToken);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -539,7 +544,9 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
ActivityTaskManager.getService().removeRootTasksInWindowingModes(
|
ActivityTaskManager.getService().removeRootTasksInWindowingModes(
|
||||||
new int[]{ WINDOWING_MODE_PINNED });
|
new int[]{ WINDOWING_MODE_PINNED });
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Log.e(TAG, "Failed to remove PiP", e);
|
ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Failed to remove PiP, %s",
|
||||||
|
TAG, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -568,7 +575,9 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
if (!mWaitForFixedRotation) {
|
if (!mWaitForFixedRotation) {
|
||||||
onEndOfSwipePipToHomeTransition();
|
onEndOfSwipePipToHomeTransition();
|
||||||
} else {
|
} else {
|
||||||
Log.d(TAG, "Defer onTaskAppeared-SwipePipToHome until end of fixed rotation.");
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Defer onTaskAppeared-SwipePipToHome until end of fixed rotation.",
|
||||||
|
TAG);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -576,7 +585,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
if (mOneShotAnimationType == ANIM_TYPE_ALPHA
|
if (mOneShotAnimationType == ANIM_TYPE_ALPHA
|
||||||
&& SystemClock.uptimeMillis() - mLastOneShotAlphaAnimationTime
|
&& SystemClock.uptimeMillis() - mLastOneShotAlphaAnimationTime
|
||||||
> ONE_SHOT_ALPHA_ANIMATION_TIMEOUT_MS) {
|
> ONE_SHOT_ALPHA_ANIMATION_TIMEOUT_MS) {
|
||||||
Log.d(TAG, "Alpha animation is expired. Use bounds animation.");
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Alpha animation is expired. Use bounds animation.", TAG);
|
||||||
mOneShotAnimationType = ANIM_TYPE_BOUNDS;
|
mOneShotAnimationType = ANIM_TYPE_BOUNDS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -613,8 +623,9 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
|
|
||||||
private void onTaskAppearedWithFixedRotation() {
|
private void onTaskAppearedWithFixedRotation() {
|
||||||
if (mOneShotAnimationType == ANIM_TYPE_ALPHA) {
|
if (mOneShotAnimationType == ANIM_TYPE_ALPHA) {
|
||||||
Log.d(TAG, "Defer entering PiP alpha animation, fixed rotation is ongoing");
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
// If deferred, hide the surface till fixed rotation is completed.
|
"%s: Defer entering PiP alpha animation, fixed rotation is ongoing", TAG);
|
||||||
|
// If deferred, hside the surface till fixed rotation is completed.
|
||||||
final SurfaceControl.Transaction tx =
|
final SurfaceControl.Transaction tx =
|
||||||
mSurfaceControlTransactionFactory.getTransaction();
|
mSurfaceControlTransactionFactory.getTransaction();
|
||||||
tx.setAlpha(mLeash, 0f);
|
tx.setAlpha(mLeash, 0f);
|
||||||
@@ -763,7 +774,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
final WindowContainerToken token = info.token;
|
final WindowContainerToken token = info.token;
|
||||||
Objects.requireNonNull(token, "Requires valid WindowContainerToken");
|
Objects.requireNonNull(token, "Requires valid WindowContainerToken");
|
||||||
if (token.asBinder() != mToken.asBinder()) {
|
if (token.asBinder() != mToken.asBinder()) {
|
||||||
Log.wtf(TAG, "Unrecognized token: " + token);
|
ProtoLog.wtf(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Unrecognized token: %s", TAG, token);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
onExitPipFinished(info);
|
onExitPipFinished(info);
|
||||||
@@ -788,8 +800,9 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
Objects.requireNonNull(mToken, "onTaskInfoChanged requires valid existing mToken");
|
Objects.requireNonNull(mToken, "onTaskInfoChanged requires valid existing mToken");
|
||||||
if (mPipTransitionState.getTransitionState() != PipTransitionState.ENTERED_PIP
|
if (mPipTransitionState.getTransitionState() != PipTransitionState.ENTERED_PIP
|
||||||
&& mPipTransitionState.getTransitionState() != PipTransitionState.EXITING_PIP) {
|
&& mPipTransitionState.getTransitionState() != PipTransitionState.EXITING_PIP) {
|
||||||
Log.d(TAG, "Defer onTaskInfoChange in current state: "
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
+ mPipTransitionState.getTransitionState());
|
"%s: Defer onTaskInfoChange in current state: %d", TAG,
|
||||||
|
mPipTransitionState.getTransitionState());
|
||||||
// Defer applying PiP parameters if the task is entering PiP to avoid disturbing
|
// Defer applying PiP parameters if the task is entering PiP to avoid disturbing
|
||||||
// the animation.
|
// the animation.
|
||||||
mDeferredTaskInfo = info;
|
mDeferredTaskInfo = info;
|
||||||
@@ -800,7 +813,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
mPipBoundsAlgorithm.getMinimalSize(info.topActivityInfo));
|
mPipBoundsAlgorithm.getMinimalSize(info.topActivityInfo));
|
||||||
final PictureInPictureParams newParams = info.pictureInPictureParams;
|
final PictureInPictureParams newParams = info.pictureInPictureParams;
|
||||||
if (newParams == null || !applyPictureInPictureParams(newParams)) {
|
if (newParams == null || !applyPictureInPictureParams(newParams)) {
|
||||||
Log.d(TAG, "Ignored onTaskInfoChanged with PiP param: " + newParams);
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Ignored onTaskInfoChanged with PiP param: %s", TAG, newParams);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Aspect ratio changed, re-calculate bounds if valid.
|
// Aspect ratio changed, re-calculate bounds if valid.
|
||||||
@@ -895,7 +909,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
|
|
||||||
private void fadeExistingPip(boolean show) {
|
private void fadeExistingPip(boolean show) {
|
||||||
if (mLeash == null || !mLeash.isValid()) {
|
if (mLeash == null || !mLeash.isValid()) {
|
||||||
Log.w(TAG, "Invalid leash on fadeExistingPip: " + mLeash);
|
ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Invalid leash on fadeExistingPip: %s", TAG, mLeash);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final float alphaStart = show ? 0 : 1;
|
final float alphaStart = show ? 0 : 1;
|
||||||
@@ -942,11 +957,13 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
if ((mPipTransitionState.getInSwipePipToHomeTransition()
|
if ((mPipTransitionState.getInSwipePipToHomeTransition()
|
||||||
|| waitForFixedRotationOnEnteringPip) && fromRotation) {
|
|| waitForFixedRotationOnEnteringPip) && fromRotation) {
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "Skip onMovementBoundsChanged on rotation change"
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
+ " InSwipePipToHomeTransition="
|
"%s: Skip onMovementBoundsChanged on rotation change"
|
||||||
+ mPipTransitionState.getInSwipePipToHomeTransition()
|
+ " InSwipePipToHomeTransition=%b"
|
||||||
+ " mWaitForFixedRotation=" + mWaitForFixedRotation
|
+ " mWaitForFixedRotation=%b"
|
||||||
+ " getTransitionState=" + mPipTransitionState.getTransitionState());
|
+ " getTransitionState=%d", TAG,
|
||||||
|
mPipTransitionState.getInSwipePipToHomeTransition(), mWaitForFixedRotation,
|
||||||
|
mPipTransitionState.getTransitionState());
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1061,7 +1078,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
@PipAnimationController.TransitionDirection int direction,
|
@PipAnimationController.TransitionDirection int direction,
|
||||||
Consumer<Rect> updateBoundsCallback) {
|
Consumer<Rect> updateBoundsCallback) {
|
||||||
if (mWaitForFixedRotation) {
|
if (mWaitForFixedRotation) {
|
||||||
Log.d(TAG, "skip scheduleAnimateResizePip, entering pip deferred");
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: skip scheduleAnimateResizePip, entering pip deferred", TAG);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
scheduleAnimateResizePip(mPipBoundsState.getBounds(), toBounds, 0 /* startingAngle */,
|
scheduleAnimateResizePip(mPipBoundsState.getBounds(), toBounds, 0 /* startingAngle */,
|
||||||
@@ -1075,7 +1093,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
public void scheduleAnimateResizePip(Rect fromBounds, Rect toBounds, int duration,
|
public void scheduleAnimateResizePip(Rect fromBounds, Rect toBounds, int duration,
|
||||||
float startingAngle, Consumer<Rect> updateBoundsCallback) {
|
float startingAngle, Consumer<Rect> updateBoundsCallback) {
|
||||||
if (mWaitForFixedRotation) {
|
if (mWaitForFixedRotation) {
|
||||||
Log.d(TAG, "skip scheduleAnimateResizePip, entering pip deferred");
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: skip scheduleAnimateResizePip, entering pip deferred", TAG);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
scheduleAnimateResizePip(fromBounds, toBounds, startingAngle, null /* sourceHintRect */,
|
scheduleAnimateResizePip(fromBounds, toBounds, startingAngle, null /* sourceHintRect */,
|
||||||
@@ -1113,7 +1132,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
public void scheduleResizePip(Rect toBounds, Consumer<Rect> updateBoundsCallback) {
|
public void scheduleResizePip(Rect toBounds, Consumer<Rect> updateBoundsCallback) {
|
||||||
// Could happen when exitPip
|
// Could happen when exitPip
|
||||||
if (mToken == null || mLeash == null) {
|
if (mToken == null || mLeash == null) {
|
||||||
Log.w(TAG, "Abort animation, invalid leash");
|
ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Abort animation, invalid leash", TAG);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mPipBoundsState.setBounds(toBounds);
|
mPipBoundsState.setBounds(toBounds);
|
||||||
@@ -1148,12 +1168,14 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
Consumer<Rect> updateBoundsCallback) {
|
Consumer<Rect> updateBoundsCallback) {
|
||||||
// Could happen when exitPip
|
// Could happen when exitPip
|
||||||
if (mToken == null || mLeash == null) {
|
if (mToken == null || mLeash == null) {
|
||||||
Log.w(TAG, "Abort animation, invalid leash");
|
ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Abort animation, invalid leash", TAG);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (startBounds.isEmpty() || toBounds.isEmpty()) {
|
if (startBounds.isEmpty() || toBounds.isEmpty()) {
|
||||||
Log.w(TAG, "Attempted to user resize PIP to or from empty bounds, aborting.");
|
ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Attempted to user resize PIP to or from empty bounds, aborting.", TAG);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1228,7 +1250,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (mWaitForFixedRotation) {
|
if (mWaitForFixedRotation) {
|
||||||
Log.d(TAG, "skip scheduleOffsetPip, entering pip deferred");
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: skip scheduleOffsetPip, entering pip deferred", TAG);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
offsetPip(originalBounds, 0 /* xOffset */, offset, duration);
|
offsetPip(originalBounds, 0 /* xOffset */, offset, duration);
|
||||||
@@ -1241,7 +1264,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
|
|
||||||
private void offsetPip(Rect originalBounds, int xOffset, int yOffset, int durationMs) {
|
private void offsetPip(Rect originalBounds, int xOffset, int yOffset, int durationMs) {
|
||||||
if (mTaskInfo == null) {
|
if (mTaskInfo == null) {
|
||||||
Log.w(TAG, "mTaskInfo is not set");
|
ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, "%s: mTaskInfo is not set",
|
||||||
|
TAG);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final Rect destinationBounds = new Rect(originalBounds);
|
final Rect destinationBounds = new Rect(originalBounds);
|
||||||
@@ -1386,7 +1410,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
float startingAngle) {
|
float startingAngle) {
|
||||||
// Could happen when exitPip
|
// Could happen when exitPip
|
||||||
if (mToken == null || mLeash == null) {
|
if (mToken == null || mLeash == null) {
|
||||||
Log.w(TAG, "Abort animation, invalid leash");
|
ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Abort animation, invalid leash", TAG);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
final int rotationDelta = mWaitForFixedRotation
|
final int rotationDelta = mWaitForFixedRotation
|
||||||
@@ -1501,7 +1526,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
if (mPipTransitionState.getTransitionState() == PipTransitionState.UNDEFINED) {
|
if (mPipTransitionState.getTransitionState() == PipTransitionState.UNDEFINED) {
|
||||||
// Could happen if onTaskVanished happens during the animation since we may have
|
// Could happen if onTaskVanished happens during the animation since we may have
|
||||||
// set a start delay on this animation.
|
// set a start delay on this animation.
|
||||||
Log.d(TAG, "Task vanished, skip fadeOutAndRemoveOverlay");
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Task vanished, skip fadeOutAndRemoveOverlay", TAG);
|
||||||
animation.removeAllListeners();
|
animation.removeAllListeners();
|
||||||
animation.removeAllUpdateListeners();
|
animation.removeAllUpdateListeners();
|
||||||
animation.cancel();
|
animation.cancel();
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ import android.graphics.Matrix;
|
|||||||
import android.graphics.Point;
|
import android.graphics.Point;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Surface;
|
import android.view.Surface;
|
||||||
import android.view.SurfaceControl;
|
import android.view.SurfaceControl;
|
||||||
import android.window.TransitionInfo;
|
import android.window.TransitionInfo;
|
||||||
@@ -61,8 +60,10 @@ import android.window.WindowContainerTransaction;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.android.internal.protolog.common.ProtoLog;
|
||||||
import com.android.wm.shell.R;
|
import com.android.wm.shell.R;
|
||||||
import com.android.wm.shell.ShellTaskOrganizer;
|
import com.android.wm.shell.ShellTaskOrganizer;
|
||||||
|
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
||||||
import com.android.wm.shell.splitscreen.SplitScreenController;
|
import com.android.wm.shell.splitscreen.SplitScreenController;
|
||||||
import com.android.wm.shell.transition.CounterRotatorHelper;
|
import com.android.wm.shell.transition.CounterRotatorHelper;
|
||||||
import com.android.wm.shell.transition.Transitions;
|
import com.android.wm.shell.transition.Transitions;
|
||||||
@@ -757,7 +758,8 @@ public class PipTransition extends PipTransitionController {
|
|||||||
final SurfaceControl leash = mPipOrganizer.getSurfaceControl();
|
final SurfaceControl leash = mPipOrganizer.getSurfaceControl();
|
||||||
final TaskInfo taskInfo = mPipOrganizer.getTaskInfo();
|
final TaskInfo taskInfo = mPipOrganizer.getTaskInfo();
|
||||||
if (leash == null || !leash.isValid() || taskInfo == null) {
|
if (leash == null || !leash.isValid() || taskInfo == null) {
|
||||||
Log.w(TAG, "Invalid leash on fadeExistingPip: " + leash);
|
ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Invalid leash on fadeExistingPip: %s", TAG, leash);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final float alphaStart = show ? 0 : 1;
|
final float alphaStart = show ? 0 : 1;
|
||||||
|
|||||||
@@ -24,9 +24,11 @@ import android.app.ActivityTaskManager.RootTaskInfo;
|
|||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.util.Log;
|
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
|
|
||||||
|
import com.android.internal.protolog.common.ProtoLog;
|
||||||
|
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
||||||
|
|
||||||
/** A class that includes convenience methods. */
|
/** A class that includes convenience methods. */
|
||||||
public class PipUtils {
|
public class PipUtils {
|
||||||
private static final String TAG = "PipUtils";
|
private static final String TAG = "PipUtils";
|
||||||
@@ -51,7 +53,8 @@ public class PipUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Log.w(TAG, "Unable to get pinned stack.");
|
ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Unable to get pinned stack.", TAG);
|
||||||
}
|
}
|
||||||
return new Pair<>(null, 0);
|
return new Pair<>(null, 0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ import android.graphics.RectF;
|
|||||||
import android.os.Debug;
|
import android.os.Debug;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.util.Log;
|
|
||||||
import android.util.Size;
|
import android.util.Size;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.SurfaceControl;
|
import android.view.SurfaceControl;
|
||||||
@@ -37,6 +36,7 @@ import android.view.SyncRtSurfaceTransactionApplier;
|
|||||||
import android.view.SyncRtSurfaceTransactionApplier.SurfaceParams;
|
import android.view.SyncRtSurfaceTransactionApplier.SurfaceParams;
|
||||||
import android.view.WindowManagerGlobal;
|
import android.view.WindowManagerGlobal;
|
||||||
|
|
||||||
|
import com.android.internal.protolog.common.ProtoLog;
|
||||||
import com.android.wm.shell.common.ShellExecutor;
|
import com.android.wm.shell.common.ShellExecutor;
|
||||||
import com.android.wm.shell.common.SystemWindows;
|
import com.android.wm.shell.common.SystemWindows;
|
||||||
import com.android.wm.shell.pip.PipBoundsState;
|
import com.android.wm.shell.pip.PipBoundsState;
|
||||||
@@ -44,6 +44,7 @@ import com.android.wm.shell.pip.PipMediaController;
|
|||||||
import com.android.wm.shell.pip.PipMediaController.ActionListener;
|
import com.android.wm.shell.pip.PipMediaController.ActionListener;
|
||||||
import com.android.wm.shell.pip.PipMenuController;
|
import com.android.wm.shell.pip.PipMenuController;
|
||||||
import com.android.wm.shell.pip.PipUiEventLogger;
|
import com.android.wm.shell.pip.PipUiEventLogger;
|
||||||
|
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
||||||
import com.android.wm.shell.splitscreen.SplitScreenController;
|
import com.android.wm.shell.splitscreen.SplitScreenController;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
@@ -285,13 +286,15 @@ public class PhonePipMenuController implements PipMenuController {
|
|||||||
private void showMenuInternal(int menuState, Rect stackBounds, boolean allowMenuTimeout,
|
private void showMenuInternal(int menuState, Rect stackBounds, boolean allowMenuTimeout,
|
||||||
boolean willResizeMenu, boolean withDelay, boolean showResizeHandle) {
|
boolean willResizeMenu, boolean withDelay, boolean showResizeHandle) {
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "showMenu() state=" + menuState
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
+ " isMenuVisible=" + isMenuVisible()
|
"%s: showMenu() state=%s"
|
||||||
+ " allowMenuTimeout=" + allowMenuTimeout
|
+ " isMenuVisible=%s"
|
||||||
+ " willResizeMenu=" + willResizeMenu
|
+ " allowMenuTimeout=%s"
|
||||||
+ " withDelay=" + withDelay
|
+ " willResizeMenu=%s"
|
||||||
+ " showResizeHandle=" + showResizeHandle
|
+ " withDelay=%s"
|
||||||
+ " callers=\n" + Debug.getCallers(5, " "));
|
+ " showResizeHandle=%s"
|
||||||
|
+ " callers=\n%s", TAG, menuState, isMenuVisible(), allowMenuTimeout,
|
||||||
|
willResizeMenu, withDelay, showResizeHandle, Debug.getCallers(5, " "));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!maybeCreateSyncApplier()) {
|
if (!maybeCreateSyncApplier()) {
|
||||||
@@ -383,7 +386,8 @@ public class PhonePipMenuController implements PipMenuController {
|
|||||||
|
|
||||||
private boolean maybeCreateSyncApplier() {
|
private boolean maybeCreateSyncApplier() {
|
||||||
if (mPipMenuView == null || mPipMenuView.getViewRootImpl() == null) {
|
if (mPipMenuView == null || mPipMenuView.getViewRootImpl() == null) {
|
||||||
Log.v(TAG, "Not going to move PiP, either menu or its parent is not created.");
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Not going to move PiP, either menu or its parent is not created.", TAG);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -400,7 +404,8 @@ public class PhonePipMenuController implements PipMenuController {
|
|||||||
public void pokeMenu() {
|
public void pokeMenu() {
|
||||||
final boolean isMenuVisible = isMenuVisible();
|
final boolean isMenuVisible = isMenuVisible();
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "pokeMenu() isMenuVisible=" + isMenuVisible);
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: pokeMenu() isMenuVisible=%b", TAG, isMenuVisible);
|
||||||
}
|
}
|
||||||
if (isMenuVisible) {
|
if (isMenuVisible) {
|
||||||
mPipMenuView.pokeMenu();
|
mPipMenuView.pokeMenu();
|
||||||
@@ -410,7 +415,8 @@ public class PhonePipMenuController implements PipMenuController {
|
|||||||
private void fadeOutMenu() {
|
private void fadeOutMenu() {
|
||||||
final boolean isMenuVisible = isMenuVisible();
|
final boolean isMenuVisible = isMenuVisible();
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "fadeOutMenu() isMenuVisible=" + isMenuVisible);
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: fadeOutMenu() isMenuVisible=%b", TAG, isMenuVisible);
|
||||||
}
|
}
|
||||||
if (isMenuVisible) {
|
if (isMenuVisible) {
|
||||||
mPipMenuView.fadeOutMenu();
|
mPipMenuView.fadeOutMenu();
|
||||||
@@ -436,11 +442,14 @@ public class PhonePipMenuController implements PipMenuController {
|
|||||||
public void hideMenu(@PipMenuView.AnimationType int animationType, boolean resize) {
|
public void hideMenu(@PipMenuView.AnimationType int animationType, boolean resize) {
|
||||||
final boolean isMenuVisible = isMenuVisible();
|
final boolean isMenuVisible = isMenuVisible();
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "hideMenu() state=" + mMenuState
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
+ " isMenuVisible=" + isMenuVisible
|
"%s: hideMenu() state=%s"
|
||||||
+ " animationType=" + animationType
|
+ " isMenuVisible=%s"
|
||||||
+ " resize=" + resize
|
+ " animationType=%s"
|
||||||
+ " callers=\n" + Debug.getCallers(5, " "));
|
+ " resize=%s"
|
||||||
|
+ " callers=\n%s", TAG, mMenuState, isMenuVisible,
|
||||||
|
animationType, resize,
|
||||||
|
Debug.getCallers(5, " "));
|
||||||
}
|
}
|
||||||
if (isMenuVisible) {
|
if (isMenuVisible) {
|
||||||
mPipMenuView.hideMenu(resize, animationType);
|
mPipMenuView.hideMenu(resize, animationType);
|
||||||
@@ -516,9 +525,11 @@ public class PhonePipMenuController implements PipMenuController {
|
|||||||
*/
|
*/
|
||||||
void onMenuStateChangeStart(int menuState, boolean resize, Runnable callback) {
|
void onMenuStateChangeStart(int menuState, boolean resize, Runnable callback) {
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "onMenuStateChangeStart() mMenuState=" + mMenuState
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
+ " menuState=" + menuState + " resize=" + resize
|
"%s: onMenuStateChangeStart() mMenuState=%s"
|
||||||
+ " callers=\n" + Debug.getCallers(5, " "));
|
+ " menuState=%s resize=%s"
|
||||||
|
+ " callers=\n%s", TAG, mMenuState, menuState, resize,
|
||||||
|
Debug.getCallers(5, " "));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (menuState != mMenuState) {
|
if (menuState != mMenuState) {
|
||||||
@@ -538,7 +549,8 @@ public class PhonePipMenuController implements PipMenuController {
|
|||||||
mSystemWindows.getFocusGrantToken(mPipMenuView),
|
mSystemWindows.getFocusGrantToken(mPipMenuView),
|
||||||
menuState != MENU_STATE_NONE /* grantFocus */);
|
menuState != MENU_STATE_NONE /* grantFocus */);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Log.e(TAG, "Unable to update focus as menu appears/disappears", e);
|
ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Unable to update focus as menu appears/disappears, %s", TAG, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -584,9 +596,11 @@ public class PhonePipMenuController implements PipMenuController {
|
|||||||
public void updateMenuLayout(Rect bounds) {
|
public void updateMenuLayout(Rect bounds) {
|
||||||
final boolean isMenuVisible = isMenuVisible();
|
final boolean isMenuVisible = isMenuVisible();
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "updateMenuLayout() state=" + mMenuState
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
+ " isMenuVisible=" + isMenuVisible
|
"%s: updateMenuLayout() state=%s"
|
||||||
+ " callers=\n" + Debug.getCallers(5, " "));
|
+ " isMenuVisible=%s"
|
||||||
|
+ " callers=\n%s", TAG, mMenuState, isMenuVisible,
|
||||||
|
Debug.getCallers(5, " "));
|
||||||
}
|
}
|
||||||
if (isMenuVisible) {
|
if (isMenuVisible) {
|
||||||
mPipMenuView.updateMenuLayout(bounds);
|
mPipMenuView.updateMenuLayout(bounds);
|
||||||
|
|||||||
@@ -46,10 +46,8 @@ import android.graphics.Rect;
|
|||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
import android.util.Log;
|
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
import android.util.Size;
|
import android.util.Size;
|
||||||
import android.util.Slog;
|
|
||||||
import android.view.DisplayInfo;
|
import android.view.DisplayInfo;
|
||||||
import android.view.SurfaceControl;
|
import android.view.SurfaceControl;
|
||||||
import android.view.WindowManagerGlobal;
|
import android.view.WindowManagerGlobal;
|
||||||
@@ -61,6 +59,7 @@ import androidx.annotation.Nullable;
|
|||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.internal.jank.InteractionJankMonitor;
|
import com.android.internal.jank.InteractionJankMonitor;
|
||||||
|
import com.android.internal.protolog.common.ProtoLog;
|
||||||
import com.android.wm.shell.R;
|
import com.android.wm.shell.R;
|
||||||
import com.android.wm.shell.WindowManagerShellWrapper;
|
import com.android.wm.shell.WindowManagerShellWrapper;
|
||||||
import com.android.wm.shell.common.DisplayChangeController;
|
import com.android.wm.shell.common.DisplayChangeController;
|
||||||
@@ -85,6 +84,7 @@ import com.android.wm.shell.pip.PipSnapAlgorithm;
|
|||||||
import com.android.wm.shell.pip.PipTaskOrganizer;
|
import com.android.wm.shell.pip.PipTaskOrganizer;
|
||||||
import com.android.wm.shell.pip.PipTransitionController;
|
import com.android.wm.shell.pip.PipTransitionController;
|
||||||
import com.android.wm.shell.pip.PipUtils;
|
import com.android.wm.shell.pip.PipUtils;
|
||||||
|
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
||||||
import com.android.wm.shell.transition.Transitions;
|
import com.android.wm.shell.transition.Transitions;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
@@ -282,7 +282,8 @@ public class PipController implements PipTransitionController.PipTransitionCallb
|
|||||||
Optional<OneHandedController> oneHandedController,
|
Optional<OneHandedController> oneHandedController,
|
||||||
ShellExecutor mainExecutor) {
|
ShellExecutor mainExecutor) {
|
||||||
if (!context.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) {
|
if (!context.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) {
|
||||||
Slog.w(TAG, "Device doesn't support Pip feature");
|
ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Device doesn't support Pip feature", TAG);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -375,7 +376,8 @@ public class PipController implements PipTransitionController.PipTransitionCallb
|
|||||||
try {
|
try {
|
||||||
mWindowManagerShellWrapper.addPinnedStackListener(mPinnedTaskListener);
|
mWindowManagerShellWrapper.addPinnedStackListener(mPinnedTaskListener);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Slog.e(TAG, "Failed to register pinned stack listener", e);
|
ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Failed to register pinned stack listener, %s", TAG, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -387,7 +389,8 @@ public class PipController implements PipTransitionController.PipTransitionCallb
|
|||||||
mPipInputConsumer.registerInputConsumer();
|
mPipInputConsumer.registerInputConsumer();
|
||||||
}
|
}
|
||||||
} catch (RemoteException | UnsupportedOperationException e) {
|
} catch (RemoteException | UnsupportedOperationException e) {
|
||||||
Log.e(TAG, "Failed to register pinned stack listener", e);
|
ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Failed to register pinned stack listener, %s", TAG, e);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -724,7 +727,8 @@ public class PipController implements PipTransitionController.PipTransitionCallb
|
|||||||
.getRootTaskInfo(WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED);
|
.getRootTaskInfo(WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED);
|
||||||
if (pinnedTaskInfo == null) return false;
|
if (pinnedTaskInfo == null) return false;
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Log.e(TAG, "Failed to get RootTaskInfo for pinned task", e);
|
ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Failed to get RootTaskInfo for pinned task, %s", TAG, e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
final PipSnapAlgorithm pipSnapAlgorithm = mPipBoundsAlgorithm.getSnapAlgorithm();
|
final PipSnapAlgorithm pipSnapAlgorithm = mPipBoundsAlgorithm.getSnapAlgorithm();
|
||||||
@@ -870,7 +874,8 @@ public class PipController implements PipTransitionController.PipTransitionCallb
|
|||||||
PipController.this.dump(pw);
|
PipController.this.dump(pw);
|
||||||
});
|
});
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
Slog.e(TAG, "Failed to dump PipController in 2s");
|
ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Failed to dump PipController in 2s", TAG);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,14 +22,15 @@ import android.os.Binder;
|
|||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.util.Log;
|
|
||||||
import android.view.BatchedInputEventReceiver;
|
import android.view.BatchedInputEventReceiver;
|
||||||
import android.view.Choreographer;
|
import android.view.Choreographer;
|
||||||
import android.view.IWindowManager;
|
import android.view.IWindowManager;
|
||||||
import android.view.InputChannel;
|
import android.view.InputChannel;
|
||||||
import android.view.InputEvent;
|
import android.view.InputEvent;
|
||||||
|
|
||||||
|
import com.android.internal.protolog.common.ProtoLog;
|
||||||
import com.android.wm.shell.common.ShellExecutor;
|
import com.android.wm.shell.common.ShellExecutor;
|
||||||
|
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
@@ -141,7 +142,8 @@ public class PipInputConsumer {
|
|||||||
mWindowManager.destroyInputConsumer(mName, DEFAULT_DISPLAY);
|
mWindowManager.destroyInputConsumer(mName, DEFAULT_DISPLAY);
|
||||||
mWindowManager.createInputConsumer(mToken, mName, DEFAULT_DISPLAY, inputChannel);
|
mWindowManager.createInputConsumer(mToken, mName, DEFAULT_DISPLAY, inputChannel);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Log.e(TAG, "Failed to create input consumer", e);
|
ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Failed to create input consumer, %s", TAG, e);
|
||||||
}
|
}
|
||||||
mMainExecutor.execute(() -> {
|
mMainExecutor.execute(() -> {
|
||||||
// Choreographer.getSfInstance() must be called on the thread that the input event
|
// Choreographer.getSfInstance() must be called on the thread that the input event
|
||||||
@@ -165,7 +167,8 @@ public class PipInputConsumer {
|
|||||||
// TODO(b/113087003): Support Picture-in-picture in multi-display.
|
// TODO(b/113087003): Support Picture-in-picture in multi-display.
|
||||||
mWindowManager.destroyInputConsumer(mName, DEFAULT_DISPLAY);
|
mWindowManager.destroyInputConsumer(mName, DEFAULT_DISPLAY);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Log.e(TAG, "Failed to destroy input consumer", e);
|
ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Failed to destroy input consumer, %s", TAG, e);
|
||||||
}
|
}
|
||||||
mInputEventReceiver.dispose();
|
mInputEventReceiver.dispose();
|
||||||
mInputEventReceiver = null;
|
mInputEventReceiver = null;
|
||||||
|
|||||||
@@ -47,7 +47,6 @@ import android.net.Uri;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.util.Log;
|
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
import android.util.Size;
|
import android.util.Size;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
@@ -60,11 +59,13 @@ import android.view.accessibility.AccessibilityNodeInfo;
|
|||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
|
|
||||||
|
import com.android.internal.protolog.common.ProtoLog;
|
||||||
import com.android.wm.shell.R;
|
import com.android.wm.shell.R;
|
||||||
import com.android.wm.shell.animation.Interpolators;
|
import com.android.wm.shell.animation.Interpolators;
|
||||||
import com.android.wm.shell.common.ShellExecutor;
|
import com.android.wm.shell.common.ShellExecutor;
|
||||||
import com.android.wm.shell.pip.PipUiEventLogger;
|
import com.android.wm.shell.pip.PipUiEventLogger;
|
||||||
import com.android.wm.shell.pip.PipUtils;
|
import com.android.wm.shell.pip.PipUtils;
|
||||||
|
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
||||||
import com.android.wm.shell.splitscreen.SplitScreenController;
|
import com.android.wm.shell.splitscreen.SplitScreenController;
|
||||||
|
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
@@ -423,7 +424,7 @@ public class PipMenuView extends FrameLayout {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Estimated minimum {@link Size} to hold the actions.
|
* @return Estimated minimum {@link Size} to hold the actions.
|
||||||
* See also {@link #updateActionViews(Rect)}
|
* See also {@link #updateActionViews(Rect)}
|
||||||
*/
|
*/
|
||||||
Size getEstimatedMinMenuSize() {
|
Size getEstimatedMinMenuSize() {
|
||||||
final int pipActionSize = getResources().getDimensionPixelSize(R.dimen.pip_action_size);
|
final int pipActionSize = getResources().getDimensionPixelSize(R.dimen.pip_action_size);
|
||||||
@@ -505,7 +506,8 @@ public class PipMenuView extends FrameLayout {
|
|||||||
try {
|
try {
|
||||||
action.getActionIntent().send();
|
action.getActionIntent().send();
|
||||||
} catch (CanceledException e) {
|
} catch (CanceledException e) {
|
||||||
Log.w(TAG, "Failed to send action", e);
|
ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Failed to send action, %s", TAG, e);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,12 +34,12 @@ import android.graphics.PointF;
|
|||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.Debug;
|
import android.os.Debug;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Choreographer;
|
import android.view.Choreographer;
|
||||||
|
|
||||||
import androidx.dynamicanimation.animation.AnimationHandler;
|
import androidx.dynamicanimation.animation.AnimationHandler;
|
||||||
import androidx.dynamicanimation.animation.AnimationHandler.FrameCallbackScheduler;
|
import androidx.dynamicanimation.animation.AnimationHandler.FrameCallbackScheduler;
|
||||||
|
|
||||||
|
import com.android.internal.protolog.common.ProtoLog;
|
||||||
import com.android.wm.shell.R;
|
import com.android.wm.shell.R;
|
||||||
import com.android.wm.shell.animation.FloatProperties;
|
import com.android.wm.shell.animation.FloatProperties;
|
||||||
import com.android.wm.shell.animation.PhysicsAnimator;
|
import com.android.wm.shell.animation.PhysicsAnimator;
|
||||||
@@ -49,6 +49,7 @@ import com.android.wm.shell.pip.PipBoundsState;
|
|||||||
import com.android.wm.shell.pip.PipSnapAlgorithm;
|
import com.android.wm.shell.pip.PipSnapAlgorithm;
|
||||||
import com.android.wm.shell.pip.PipTaskOrganizer;
|
import com.android.wm.shell.pip.PipTaskOrganizer;
|
||||||
import com.android.wm.shell.pip.PipTransitionController;
|
import com.android.wm.shell.pip.PipTransitionController;
|
||||||
|
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
||||||
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
@@ -354,8 +355,9 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,
|
|||||||
*/
|
*/
|
||||||
private void expandLeavePip(boolean skipAnimation, boolean enterSplit) {
|
private void expandLeavePip(boolean skipAnimation, boolean enterSplit) {
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "exitPip: skipAnimation=" + skipAnimation
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
+ " callers=\n" + Debug.getCallers(5, " "));
|
"%s: exitPip: skipAnimation=%s"
|
||||||
|
+ " callers=\n%s", TAG, skipAnimation, Debug.getCallers(5, " "));
|
||||||
}
|
}
|
||||||
cancelPhysicsAnimation();
|
cancelPhysicsAnimation();
|
||||||
mMenuController.hideMenu(ANIM_TYPE_NONE, false /* resize */);
|
mMenuController.hideMenu(ANIM_TYPE_NONE, false /* resize */);
|
||||||
@@ -368,7 +370,8 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,
|
|||||||
@Override
|
@Override
|
||||||
public void dismissPip() {
|
public void dismissPip() {
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "removePip: callers=\n" + Debug.getCallers(5, " "));
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: removePip: callers=\n%s", TAG, Debug.getCallers(5, " "));
|
||||||
}
|
}
|
||||||
cancelPhysicsAnimation();
|
cancelPhysicsAnimation();
|
||||||
mMenuController.hideMenu(ANIM_TYPE_DISMISS, false /* resize */);
|
mMenuController.hideMenu(ANIM_TYPE_DISMISS, false /* resize */);
|
||||||
@@ -552,8 +555,10 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,
|
|||||||
*/
|
*/
|
||||||
void animateToOffset(Rect originalBounds, int offset) {
|
void animateToOffset(Rect originalBounds, int offset) {
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "animateToOffset: originalBounds=" + originalBounds + " offset=" + offset
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
+ " callers=\n" + Debug.getCallers(5, " "));
|
"%s: animateToOffset: originalBounds=%s offset=%s"
|
||||||
|
+ " callers=\n%s", TAG, originalBounds, offset,
|
||||||
|
Debug.getCallers(5, " "));
|
||||||
}
|
}
|
||||||
cancelPhysicsAnimation();
|
cancelPhysicsAnimation();
|
||||||
mPipTaskOrganizer.scheduleOffsetPip(originalBounds, offset, SHIFT_DURATION,
|
mPipTaskOrganizer.scheduleOffsetPip(originalBounds, offset, SHIFT_DURATION,
|
||||||
@@ -671,8 +676,9 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,
|
|||||||
*/
|
*/
|
||||||
private void resizePipUnchecked(Rect toBounds) {
|
private void resizePipUnchecked(Rect toBounds) {
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "resizePipUnchecked: toBounds=" + toBounds
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
+ " callers=\n" + Debug.getCallers(5, " "));
|
"%s: resizePipUnchecked: toBounds=%s"
|
||||||
|
+ " callers=\n%s", TAG, toBounds, Debug.getCallers(5, " "));
|
||||||
}
|
}
|
||||||
if (!toBounds.equals(getBounds())) {
|
if (!toBounds.equals(getBounds())) {
|
||||||
mPipTaskOrganizer.scheduleResizePip(toBounds, mUpdateBoundsCallback);
|
mPipTaskOrganizer.scheduleResizePip(toBounds, mUpdateBoundsCallback);
|
||||||
@@ -684,8 +690,10 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,
|
|||||||
*/
|
*/
|
||||||
private void resizeAndAnimatePipUnchecked(Rect toBounds, int duration) {
|
private void resizeAndAnimatePipUnchecked(Rect toBounds, int duration) {
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "resizeAndAnimatePipUnchecked: toBounds=" + toBounds
|
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
+ " duration=" + duration + " callers=\n" + Debug.getCallers(5, " "));
|
"%s: resizeAndAnimatePipUnchecked: toBounds=%s"
|
||||||
|
+ " duration=%s callers=\n%s", TAG, toBounds, duration,
|
||||||
|
Debug.getCallers(5, " "));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Intentionally resize here even if the current bounds match the destination bounds.
|
// Intentionally resize here even if the current bounds match the destination bounds.
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ import android.graphics.Point;
|
|||||||
import android.graphics.PointF;
|
import android.graphics.PointF;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.provider.DeviceConfig;
|
import android.provider.DeviceConfig;
|
||||||
import android.util.Log;
|
|
||||||
import android.util.Size;
|
import android.util.Size;
|
||||||
import android.view.InputEvent;
|
import android.view.InputEvent;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
@@ -46,6 +45,7 @@ import android.view.accessibility.AccessibilityNodeInfo;
|
|||||||
import android.view.accessibility.AccessibilityWindowInfo;
|
import android.view.accessibility.AccessibilityWindowInfo;
|
||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
|
import com.android.internal.protolog.common.ProtoLog;
|
||||||
import com.android.wm.shell.R;
|
import com.android.wm.shell.R;
|
||||||
import com.android.wm.shell.common.FloatingContentCoordinator;
|
import com.android.wm.shell.common.FloatingContentCoordinator;
|
||||||
import com.android.wm.shell.common.ShellExecutor;
|
import com.android.wm.shell.common.ShellExecutor;
|
||||||
@@ -54,6 +54,7 @@ import com.android.wm.shell.pip.PipBoundsAlgorithm;
|
|||||||
import com.android.wm.shell.pip.PipBoundsState;
|
import com.android.wm.shell.pip.PipBoundsState;
|
||||||
import com.android.wm.shell.pip.PipTaskOrganizer;
|
import com.android.wm.shell.pip.PipTaskOrganizer;
|
||||||
import com.android.wm.shell.pip.PipUiEventLogger;
|
import com.android.wm.shell.pip.PipUiEventLogger;
|
||||||
|
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
@@ -1010,7 +1011,8 @@ public class PipTouchHandler {
|
|||||||
}
|
}
|
||||||
final Size estimatedMinMenuSize = mMenuController.getEstimatedMinMenuSize();
|
final Size estimatedMinMenuSize = mMenuController.getEstimatedMinMenuSize();
|
||||||
if (estimatedMinMenuSize == null) {
|
if (estimatedMinMenuSize == null) {
|
||||||
Log.wtf(TAG, "Failed to get estimated menu size");
|
ProtoLog.wtf(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Failed to get estimated menu size", TAG);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
final Rect currentBounds = mPipBoundsState.getBounds();
|
final Rect currentBounds = mPipBoundsState.getBounds();
|
||||||
|
|||||||
@@ -17,15 +17,15 @@
|
|||||||
package com.android.wm.shell.pip.phone;
|
package com.android.wm.shell.pip.phone;
|
||||||
|
|
||||||
import android.graphics.PointF;
|
import android.graphics.PointF;
|
||||||
import android.os.Handler;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Display;
|
import android.view.Display;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.VelocityTracker;
|
import android.view.VelocityTracker;
|
||||||
import android.view.ViewConfiguration;
|
import android.view.ViewConfiguration;
|
||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
|
import com.android.internal.protolog.common.ProtoLog;
|
||||||
import com.android.wm.shell.common.ShellExecutor;
|
import com.android.wm.shell.common.ShellExecutor;
|
||||||
|
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
@@ -104,7 +104,8 @@ public class PipTouchState {
|
|||||||
|
|
||||||
mActivePointerId = ev.getPointerId(0);
|
mActivePointerId = ev.getPointerId(0);
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.e(TAG, "Setting active pointer id on DOWN: " + mActivePointerId);
|
ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Setting active pointer id on DOWN: %d", TAG, mActivePointerId);
|
||||||
}
|
}
|
||||||
mLastTouch.set(ev.getRawX(), ev.getRawY());
|
mLastTouch.set(ev.getRawX(), ev.getRawY());
|
||||||
mDownTouch.set(mLastTouch);
|
mDownTouch.set(mLastTouch);
|
||||||
@@ -131,7 +132,8 @@ public class PipTouchState {
|
|||||||
addMovementToVelocityTracker(ev);
|
addMovementToVelocityTracker(ev);
|
||||||
int pointerIndex = ev.findPointerIndex(mActivePointerId);
|
int pointerIndex = ev.findPointerIndex(mActivePointerId);
|
||||||
if (pointerIndex == -1) {
|
if (pointerIndex == -1) {
|
||||||
Log.e(TAG, "Invalid active pointer id on MOVE: " + mActivePointerId);
|
ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Invalid active pointer id on MOVE: %d", TAG, mActivePointerId);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,8 +170,9 @@ public class PipTouchState {
|
|||||||
final int newPointerIndex = (pointerIndex == 0) ? 1 : 0;
|
final int newPointerIndex = (pointerIndex == 0) ? 1 : 0;
|
||||||
mActivePointerId = ev.getPointerId(newPointerIndex);
|
mActivePointerId = ev.getPointerId(newPointerIndex);
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.e(TAG,
|
ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
"Relinquish active pointer id on POINTER_UP: " + mActivePointerId);
|
"%s: Relinquish active pointer id on POINTER_UP: %d",
|
||||||
|
TAG, mActivePointerId);
|
||||||
}
|
}
|
||||||
mLastTouch.set(ev.getRawX(newPointerIndex), ev.getRawY(newPointerIndex));
|
mLastTouch.set(ev.getRawX(newPointerIndex), ev.getRawY(newPointerIndex));
|
||||||
}
|
}
|
||||||
@@ -189,7 +192,8 @@ public class PipTouchState {
|
|||||||
|
|
||||||
int pointerIndex = ev.findPointerIndex(mActivePointerId);
|
int pointerIndex = ev.findPointerIndex(mActivePointerId);
|
||||||
if (pointerIndex == -1) {
|
if (pointerIndex == -1) {
|
||||||
Log.e(TAG, "Invalid active pointer id on UP: " + mActivePointerId);
|
ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||||
|
"%s: Invalid active pointer id on UP: %d", TAG, mActivePointerId);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ public enum ShellProtoLogGroup implements IProtoLogGroup {
|
|||||||
"ShellBackPreview"),
|
"ShellBackPreview"),
|
||||||
WM_SHELL_RECENT_TASKS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
|
WM_SHELL_RECENT_TASKS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
|
||||||
Consts.TAG_WM_SHELL),
|
Consts.TAG_WM_SHELL),
|
||||||
|
WM_SHELL_PICTURE_IN_PICTURE(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG,
|
||||||
|
false, Consts.TAG_WM_SHELL),
|
||||||
TEST_GROUP(true, true, false, "WindowManagerShellProtoLogTest");
|
TEST_GROUP(true, true, false, "WindowManagerShellProtoLogTest");
|
||||||
|
|
||||||
private final boolean mEnabled;
|
private final boolean mEnabled;
|
||||||
|
|||||||
Reference in New Issue
Block a user