diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-07-16 01:01:30 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-07-16 01:01:30 +0000 |
commit | 4632723c454ea6f9782ff798d86775c387dc1be1 (patch) | |
tree | 103043f570516392a5a85af0b08006f6680d29e1 | |
parent | 065da989f71dcbf974a56ed87c61c3e2d2b2a046 (diff) | |
parent | 0e4d25a19e3803ea85057c6ec9f290ad30dd3e32 (diff) | |
download | development-android12-release.tar.gz |
Snap for 7553867 from 0e4d25a19e3803ea85057c6ec9f290ad30dd3e32 to sc-releaseandroid-vts-12.0_r9android-vts-12.0_r8android-vts-12.0_r7android-vts-12.0_r6android-vts-12.0_r5android-vts-12.0_r4android-vts-12.0_r3android-vts-12.0_r2android-vts-12.0_r12android-vts-12.0_r11android-vts-12.0_r10android-vts-12.0_r1android-security-12.0.0_r59android-security-12.0.0_r58android-security-12.0.0_r57android-security-12.0.0_r56android-security-12.0.0_r55android-security-12.0.0_r54android-security-12.0.0_r53android-security-12.0.0_r52android-security-12.0.0_r51android-security-12.0.0_r50android-security-12.0.0_r49android-security-12.0.0_r48android-security-12.0.0_r47android-security-12.0.0_r46android-security-12.0.0_r45android-security-12.0.0_r44android-security-12.0.0_r43android-security-12.0.0_r42android-security-12.0.0_r41android-security-12.0.0_r40android-security-12.0.0_r39android-security-12.0.0_r38android-security-12.0.0_r37android-security-12.0.0_r36android-security-12.0.0_r35android-security-12.0.0_r34android-platform-12.0.0_r1android-cts-12.0_r9android-cts-12.0_r8android-cts-12.0_r7android-cts-12.0_r6android-cts-12.0_r5android-cts-12.0_r4android-cts-12.0_r3android-cts-12.0_r2android-cts-12.0_r12android-cts-12.0_r11android-cts-12.0_r10android-cts-12.0_r1android-12.0.0_r9android-12.0.0_r8android-12.0.0_r34android-12.0.0_r33android-12.0.0_r31android-12.0.0_r30android-12.0.0_r3android-12.0.0_r25android-12.0.0_r2android-12.0.0_r11android-12.0.0_r10android-12.0.0_r1android12-tests-releaseandroid12-security-releaseandroid12-s5-releaseandroid12-s4-releaseandroid12-s3-releaseandroid12-s2-releaseandroid12-s1-releaseandroid12-release
Change-Id: I0e15699a64b589eede66f2f042a14cfb6326ebb6
5 files changed, 110 insertions, 28 deletions
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 @@ --> <!-- Demonstrates Picture-In-Picture with auto enter enabled. --> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- layout params would be changed programmatically --> - <ImageView android:id="@+id/image" + <com.example.android.apis.view.FixedAspectRatioImageView + android:id="@+id/image" android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="fitXY" - android:src="@drawable/sample_1" /> + android:src="@drawable/sample_1" + app:aspectRatio="16/9" /> <Switch android:id="@+id/source_rect_hint_toggle" android:layout_width="wrap_content" diff --git a/samples/ApiDemos/res/values/attrs.xml b/samples/ApiDemos/res/values/attrs.xml index 1751ae26a..f06ebf1c0 100644 --- a/samples/ApiDemos/res/values/attrs.xml +++ b/samples/ApiDemos/res/values/attrs.xml @@ -53,4 +53,8 @@ <attr name="android:label" /> </declare-styleable> <!-- END_INCLUDE(fragment_arguments) --> + + <declare-styleable name="FixedAspectRatioImageView"> + <attr name="aspectRatio" format="string" /> + </declare-styleable> </resources> 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 @@ <style name="Theme.NoActionBar" parent="android:Theme.Material.Light"> <item name="windowActionBar">false</item> <item name="android:windowNoTitle">true</item> + <!-- toggle this flag to test letterbox behavior when auto-enter-pip from landscape --> + <!--item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item--> </style> </resources> 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 |