Merge "Use FixedAspectRatioImageView to demo auto-enter-pip" into sc-dev
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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,18 +76,22 @@ public class PictureInPictureAutoEnter extends Activity {
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfiguration) {
|
||||
super.onConfigurationChanged(newConfiguration);
|
||||
if (!isInPictureInPictureMode()) {
|
||||
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;
|
||||
if (isPictureInPicture) {
|
||||
layoutParams = new LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.MATCH_PARENT,
|
||||
LinearLayout.LayoutParams.MATCH_PARENT);
|
||||
layoutParams.gravity = Gravity.NO_GRAVITY;
|
||||
} else {
|
||||
// Toggle the fullscreen mode as well.
|
||||
// TODO(b/188001699) switch to use insets controller once the bug is fixed.
|
||||
final View decorView = getWindow().getDecorView();
|
||||
@@ -95,8 +99,9 @@ public class PictureInPictureAutoEnter extends Activity {
|
||||
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
|
||||
if (isLandscape) {
|
||||
layoutParams = new LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.MATCH_PARENT,
|
||||
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()
|
||||
@@ -105,14 +110,18 @@ public class PictureInPictureAutoEnter extends Activity {
|
||||
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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user