From 31c5071a72e1840c802d5f6150571583197092b8 Mon Sep 17 00:00:00 2001 From: Hongwei Wang Date: Mon, 21 Jun 2021 15:40:19 -0700 Subject: [PATCH] Use FixedAspectRatioImageView to demo auto-enter-pip Video: http://recall/-/aaaaaabFQoRHlzixHdtY/bpKcGg1eoOo5Jz5U6IwBYK Bug: 191310680 Test: manually auto-enter-pip from landscape, see video Change-Id: I30a728331f0ffa48c537be7b2611dba0b2df053a --- .../layout/picture_in_picture_auto_enter.xml | 9 ++- samples/ApiDemos/res/values/attrs.xml | 4 ++ samples/ApiDemos/res/values/styles.xml | 2 + .../apis/app/PictureInPictureAutoEnter.java | 59 +++++++++-------- .../apis/view/FixedAspectRatioImageView.java | 64 +++++++++++++++++++ 5 files changed, 110 insertions(+), 28 deletions(-) create mode 100644 samples/ApiDemos/src/com/example/android/apis/view/FixedAspectRatioImageView.java diff --git a/samples/ApiDemos/res/layout/picture_in_picture_auto_enter.xml b/samples/ApiDemos/res/layout/picture_in_picture_auto_enter.xml index 09912b5cc..57f891e8e 100644 --- a/samples/ApiDemos/res/layout/picture_in_picture_auto_enter.xml +++ b/samples/ApiDemos/res/layout/picture_in_picture_auto_enter.xml @@ -15,18 +15,21 @@ --> - - + android:src="@drawable/sample_1" + app:aspectRatio="16/9" /> + + + + diff --git a/samples/ApiDemos/res/values/styles.xml b/samples/ApiDemos/res/values/styles.xml index 2da03f041..6c301cea3 100644 --- a/samples/ApiDemos/res/values/styles.xml +++ b/samples/ApiDemos/res/values/styles.xml @@ -133,6 +133,8 @@ diff --git a/samples/ApiDemos/src/com/example/android/apis/app/PictureInPictureAutoEnter.java b/samples/ApiDemos/src/com/example/android/apis/app/PictureInPictureAutoEnter.java index 05f455828..57ce6bbe7 100644 --- a/samples/ApiDemos/src/com/example/android/apis/app/PictureInPictureAutoEnter.java +++ b/samples/ApiDemos/src/com/example/android/apis/app/PictureInPictureAutoEnter.java @@ -23,6 +23,7 @@ import android.content.res.Configuration; import android.graphics.Rect; import android.os.Bundle; import android.util.Rational; +import android.view.Gravity; import android.view.View; import android.view.WindowManager; import android.widget.CompoundButton; @@ -43,7 +44,6 @@ public class PictureInPictureAutoEnter extends Activity { private View mImageView; private View mButtonView; private Switch mSwitchView; - private int mLastOrientation = -1; @Override protected void onCreate(Bundle savedInstanceState) { @@ -76,43 +76,52 @@ public class PictureInPictureAutoEnter extends Activity { @Override public void onConfigurationChanged(Configuration newConfiguration) { super.onConfigurationChanged(newConfiguration); - if (!isInPictureInPictureMode()) { - updateLayout(newConfiguration); - } + updateLayout(newConfiguration); } private void updateLayout(Configuration configuration) { - if (configuration.orientation == mLastOrientation) return; - mLastOrientation = configuration.orientation; - final boolean isLandscape = (mLastOrientation == Configuration.ORIENTATION_LANDSCAPE); - mButtonView.setVisibility(isLandscape ? View.GONE : View.VISIBLE); - mSwitchView.setVisibility(isLandscape ? View.GONE: View.VISIBLE); + final boolean isLandscape = + (configuration.orientation == Configuration.ORIENTATION_LANDSCAPE); + final boolean isPictureInPicture = isInPictureInPictureMode(); + mButtonView.setVisibility((isPictureInPicture || isLandscape) ? View.GONE : View.VISIBLE); + mSwitchView.setVisibility((isPictureInPicture || isLandscape) ? View.GONE: View.VISIBLE); final LinearLayout.LayoutParams layoutParams; - // Toggle the fullscreen mode as well. - // TODO(b/188001699) switch to use insets controller once the bug is fixed. - final View decorView = getWindow().getDecorView(); - final int systemUiNavigationBarFlags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; - if (isLandscape) { + if (isPictureInPicture) { layoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, - WindowManager.LayoutParams.FLAG_FULLSCREEN); - decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() - | systemUiNavigationBarFlags); + layoutParams.gravity = Gravity.NO_GRAVITY; } else { - layoutParams = new LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.WRAP_CONTENT); - getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() - & ~systemUiNavigationBarFlags); + // Toggle the fullscreen mode as well. + // TODO(b/188001699) switch to use insets controller once the bug is fixed. + final View decorView = getWindow().getDecorView(); + final int systemUiNavigationBarFlags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; + if (isLandscape) { + layoutParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.MATCH_PARENT); + layoutParams.gravity = Gravity.CENTER_HORIZONTAL; + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() + | systemUiNavigationBarFlags); + } else { + layoutParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT); + layoutParams.gravity = Gravity.NO_GRAVITY; + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() + & ~systemUiNavigationBarFlags); + } } + mImageView.addOnLayoutChangeListener(mOnLayoutChangeListener); mImageView.setLayoutParams(layoutParams); } private void updatePictureInPictureParams() { + mImageView.removeOnLayoutChangeListener(mOnLayoutChangeListener); // do not bother PictureInPictureParams update when it's already in pip mode. if (isInPictureInPictureMode()) return; final Rect imageViewRect = new Rect(); diff --git a/samples/ApiDemos/src/com/example/android/apis/view/FixedAspectRatioImageView.java b/samples/ApiDemos/src/com/example/android/apis/view/FixedAspectRatioImageView.java new file mode 100644 index 000000000..4c147ec97 --- /dev/null +++ b/samples/ApiDemos/src/com/example/android/apis/view/FixedAspectRatioImageView.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.apis.view; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.util.Rational; +import android.widget.ImageView; + +import com.example.android.apis.R; + +/** + * Extended {@link ImageView} that keeps fixed aspect ratio (specified in layout file) when + * one of the dimension is in exact while the other one in wrap_content size mode. + */ +public class FixedAspectRatioImageView extends ImageView { + private final Rational mAspectRatio; + + public FixedAspectRatioImageView(Context context, AttributeSet attrs) { + super(context, attrs); + final TypedArray a = context.getTheme().obtainStyledAttributes(attrs, + R.styleable.FixedAspectRatioImageView, 0, 0); + try { + mAspectRatio = Rational.parseRational( + a.getString(R.styleable.FixedAspectRatioImageView_aspectRatio)); + } finally { + a.recycle(); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + final int width, height; + if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY + && MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY) { + width = MeasureSpec.getSize(widthMeasureSpec); + height = MeasureSpec.getSize(heightMeasureSpec); + } else if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY) { + width = MeasureSpec.getSize(widthMeasureSpec); + height = (int) (width / mAspectRatio.floatValue()); + } else { + height = MeasureSpec.getSize(heightMeasureSpec); + width = (int) (height * mAspectRatio.floatValue()); + } + android.util.Log.d("DebugMe", "onMeasure w=" + width + " h=" + height); + setMeasuredDimension(width, height); + } +} \ No newline at end of file