Loading tests/FlickerTests/test-apps/flickerapp/res/layout/activity_pip.xml +2 −12 Original line number Diff line number Diff line Loading @@ -27,15 +27,6 @@ where things are arranged differently and to circle back up to the top once we reach the bottom. --> <!-- View used for testing sourceRectHint. --> <View android:id="@+id/source_rect" android:layout_width="320dp" android:layout_height="180dp" android:visibility="gone" android:background="@android:color/holo_green_light" /> <Button android:id="@+id/enter_pip" android:layout_width="wrap_content" Loading Loading @@ -122,12 +113,11 @@ android:onClick="onRatioSelected"/> </RadioGroup> <Button <CheckBox android:id="@+id/set_source_rect_hint" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Set SourceRectHint" android:onClick="setSourceRectHint"/> android:text="Set SourceRectHint"/> <TextView android:layout_width="wrap_content" Loading tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/PipActivity.java +53 −26 Original line number Diff line number Diff line Loading @@ -43,10 +43,10 @@ import android.media.MediaMetadata; import android.media.session.MediaSession; import android.media.session.PlaybackState; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.util.Rational; import android.view.View; import android.view.ViewTreeObserver; import android.view.Window; import android.view.WindowManager; import android.widget.CheckBox; Loading @@ -70,7 +70,7 @@ public class PipActivity extends Activity { */ private static final String TITLE_STATE_PAUSED = "TestApp media is paused"; private static final Rational RATIO_DEFAULT = null; private static final Rational RATIO_DEFAULT = new Rational(16, 9); private static final Rational RATIO_SQUARE = new Rational(1, 1); private static final Rational RATIO_WIDE = new Rational(2, 1); private static final Rational RATIO_TALL = new Rational(1, 2); Loading @@ -88,8 +88,7 @@ public class PipActivity extends Activity { "com.android.wm.shell.flicker.testapp.ASPECT_RATIO"; private final PictureInPictureParams.Builder mPipParamsBuilder = new PictureInPictureParams.Builder() .setAspectRatio(RATIO_DEFAULT); new PictureInPictureParams.Builder(); private MediaSession mMediaSession; private final PlaybackState.Builder mPlaybackStateBuilder = new PlaybackState.Builder() .setActions(ACTION_PLAY | ACTION_PAUSE | ACTION_STOP) Loading Loading @@ -139,6 +138,9 @@ public class PipActivity extends Activity { } }; private Rational mAspectRatio = RATIO_DEFAULT; private boolean mEnableSourceRectHint; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Loading @@ -156,6 +158,14 @@ public class PipActivity extends Activity { findViewById(R.id.media_session_stop) .setOnClickListener(v -> updateMediaSessionState(STATE_STOPPED)); final CheckBox setSourceRectHintCheckBox = findViewById(R.id.set_source_rect_hint); setSourceRectHintCheckBox.setOnCheckedChangeListener((v, isChecked) -> { if (mEnableSourceRectHint != isChecked) { mEnableSourceRectHint = isChecked; updateSourceRectHint(); } }); mMediaSession = new MediaSession(this, "WMShell_TestApp"); mMediaSession.setPlaybackState(mPlaybackStateBuilder.build()); mMediaSession.setCallback(new MediaSession.Callback() { Loading Loading @@ -250,47 +260,64 @@ public class PipActivity extends Activity { } } /** * Adds a temporary view used for testing sourceRectHint. * */ public void setSourceRectHint(View v) { View rectView = findViewById(R.id.source_rect); if (rectView != null) { rectView.setVisibility(View.VISIBLE); rectView.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect boundingRect = new Rect(); rectView.getGlobalVisibleRect(boundingRect); mPipParamsBuilder.setSourceRectHint(boundingRect); private void updateSourceRectHint() { if (!mEnableSourceRectHint) return; // Similar to PipUtils#getEnterPipWithOverlaySrcRectHint, crop the display bounds // as source rect hint based on the current aspect ratio. final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); final Rect displayBounds = new Rect(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels); final Rect sourceRectHint = getEnterPipWithOverlaySrcRectHint( displayBounds, mAspectRatio.floatValue()); mPipParamsBuilder .setAspectRatio(mAspectRatio) .setSourceRectHint(sourceRectHint); setPictureInPictureParams(mPipParamsBuilder.build()); rectView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } }); rectView.invalidate(); // changing the visibility, invalidating to redraw the view /** * Crop a Rect matches the aspect ratio and pivots at the center point. * This is a counterpart of {@link PipUtils#getEnterPipWithOverlaySrcRectHint} */ private Rect getEnterPipWithOverlaySrcRectHint(Rect appBounds, float aspectRatio) { final float appBoundsAspectRatio = appBounds.width() / (float) appBounds.height(); final int width, height; int left = appBounds.left; int top = appBounds.top; if (appBoundsAspectRatio < aspectRatio) { width = appBounds.width(); height = (int) (width / aspectRatio); top = appBounds.top + (appBounds.height() - height) / 2; } else { height = appBounds.height(); width = (int) (height * aspectRatio); left = appBounds.left + (appBounds.width() - width) / 2; } return new Rect(left, top, left + width, top + height); } public void onRatioSelected(View v) { switch (v.getId()) { case R.id.ratio_default: mPipParamsBuilder.setAspectRatio(RATIO_DEFAULT); mAspectRatio = RATIO_DEFAULT; break; case R.id.ratio_square: mPipParamsBuilder.setAspectRatio(RATIO_SQUARE); mAspectRatio = RATIO_SQUARE; break; case R.id.ratio_wide: mPipParamsBuilder.setAspectRatio(RATIO_WIDE); mAspectRatio = RATIO_WIDE; break; case R.id.ratio_tall: mPipParamsBuilder.setAspectRatio(RATIO_TALL); mAspectRatio = RATIO_TALL; break; } setPictureInPictureParams(mPipParamsBuilder.setAspectRatio(mAspectRatio).build()); if (mEnableSourceRectHint) { updateSourceRectHint(); } } private void updateMediaSessionState(int newState) { Loading Loading
tests/FlickerTests/test-apps/flickerapp/res/layout/activity_pip.xml +2 −12 Original line number Diff line number Diff line Loading @@ -27,15 +27,6 @@ where things are arranged differently and to circle back up to the top once we reach the bottom. --> <!-- View used for testing sourceRectHint. --> <View android:id="@+id/source_rect" android:layout_width="320dp" android:layout_height="180dp" android:visibility="gone" android:background="@android:color/holo_green_light" /> <Button android:id="@+id/enter_pip" android:layout_width="wrap_content" Loading Loading @@ -122,12 +113,11 @@ android:onClick="onRatioSelected"/> </RadioGroup> <Button <CheckBox android:id="@+id/set_source_rect_hint" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Set SourceRectHint" android:onClick="setSourceRectHint"/> android:text="Set SourceRectHint"/> <TextView android:layout_width="wrap_content" Loading
tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/PipActivity.java +53 −26 Original line number Diff line number Diff line Loading @@ -43,10 +43,10 @@ import android.media.MediaMetadata; import android.media.session.MediaSession; import android.media.session.PlaybackState; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.util.Rational; import android.view.View; import android.view.ViewTreeObserver; import android.view.Window; import android.view.WindowManager; import android.widget.CheckBox; Loading @@ -70,7 +70,7 @@ public class PipActivity extends Activity { */ private static final String TITLE_STATE_PAUSED = "TestApp media is paused"; private static final Rational RATIO_DEFAULT = null; private static final Rational RATIO_DEFAULT = new Rational(16, 9); private static final Rational RATIO_SQUARE = new Rational(1, 1); private static final Rational RATIO_WIDE = new Rational(2, 1); private static final Rational RATIO_TALL = new Rational(1, 2); Loading @@ -88,8 +88,7 @@ public class PipActivity extends Activity { "com.android.wm.shell.flicker.testapp.ASPECT_RATIO"; private final PictureInPictureParams.Builder mPipParamsBuilder = new PictureInPictureParams.Builder() .setAspectRatio(RATIO_DEFAULT); new PictureInPictureParams.Builder(); private MediaSession mMediaSession; private final PlaybackState.Builder mPlaybackStateBuilder = new PlaybackState.Builder() .setActions(ACTION_PLAY | ACTION_PAUSE | ACTION_STOP) Loading Loading @@ -139,6 +138,9 @@ public class PipActivity extends Activity { } }; private Rational mAspectRatio = RATIO_DEFAULT; private boolean mEnableSourceRectHint; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Loading @@ -156,6 +158,14 @@ public class PipActivity extends Activity { findViewById(R.id.media_session_stop) .setOnClickListener(v -> updateMediaSessionState(STATE_STOPPED)); final CheckBox setSourceRectHintCheckBox = findViewById(R.id.set_source_rect_hint); setSourceRectHintCheckBox.setOnCheckedChangeListener((v, isChecked) -> { if (mEnableSourceRectHint != isChecked) { mEnableSourceRectHint = isChecked; updateSourceRectHint(); } }); mMediaSession = new MediaSession(this, "WMShell_TestApp"); mMediaSession.setPlaybackState(mPlaybackStateBuilder.build()); mMediaSession.setCallback(new MediaSession.Callback() { Loading Loading @@ -250,47 +260,64 @@ public class PipActivity extends Activity { } } /** * Adds a temporary view used for testing sourceRectHint. * */ public void setSourceRectHint(View v) { View rectView = findViewById(R.id.source_rect); if (rectView != null) { rectView.setVisibility(View.VISIBLE); rectView.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect boundingRect = new Rect(); rectView.getGlobalVisibleRect(boundingRect); mPipParamsBuilder.setSourceRectHint(boundingRect); private void updateSourceRectHint() { if (!mEnableSourceRectHint) return; // Similar to PipUtils#getEnterPipWithOverlaySrcRectHint, crop the display bounds // as source rect hint based on the current aspect ratio. final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); final Rect displayBounds = new Rect(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels); final Rect sourceRectHint = getEnterPipWithOverlaySrcRectHint( displayBounds, mAspectRatio.floatValue()); mPipParamsBuilder .setAspectRatio(mAspectRatio) .setSourceRectHint(sourceRectHint); setPictureInPictureParams(mPipParamsBuilder.build()); rectView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } }); rectView.invalidate(); // changing the visibility, invalidating to redraw the view /** * Crop a Rect matches the aspect ratio and pivots at the center point. * This is a counterpart of {@link PipUtils#getEnterPipWithOverlaySrcRectHint} */ private Rect getEnterPipWithOverlaySrcRectHint(Rect appBounds, float aspectRatio) { final float appBoundsAspectRatio = appBounds.width() / (float) appBounds.height(); final int width, height; int left = appBounds.left; int top = appBounds.top; if (appBoundsAspectRatio < aspectRatio) { width = appBounds.width(); height = (int) (width / aspectRatio); top = appBounds.top + (appBounds.height() - height) / 2; } else { height = appBounds.height(); width = (int) (height * aspectRatio); left = appBounds.left + (appBounds.width() - width) / 2; } return new Rect(left, top, left + width, top + height); } public void onRatioSelected(View v) { switch (v.getId()) { case R.id.ratio_default: mPipParamsBuilder.setAspectRatio(RATIO_DEFAULT); mAspectRatio = RATIO_DEFAULT; break; case R.id.ratio_square: mPipParamsBuilder.setAspectRatio(RATIO_SQUARE); mAspectRatio = RATIO_SQUARE; break; case R.id.ratio_wide: mPipParamsBuilder.setAspectRatio(RATIO_WIDE); mAspectRatio = RATIO_WIDE; break; case R.id.ratio_tall: mPipParamsBuilder.setAspectRatio(RATIO_TALL); mAspectRatio = RATIO_TALL; break; } setPictureInPictureParams(mPipParamsBuilder.setAspectRatio(mAspectRatio).build()); if (mEnableSourceRectHint) { updateSourceRectHint(); } } private void updateMediaSessionState(int newState) { Loading