Support aspect ratio change in PiP demo

For testing and demo purpose, currently support selecting from well
defined list of aspect ratio, include 21:9, 16:9, 1:1, 9:16 and 9:21

Video: http://recall/-/aaaaaabFQoRHlzixHdtY/gqFQI7mpeQ6EZZ5JibsV6R
Bug: 198643358
Test: Change aspect ratio within the app, see video
Change-Id: I0580dc45bf32e795fefd7d80f5183f268f810790
This commit is contained in:
Hongwei Wang
2022-12-06 14:51:01 -08:00
parent 0fd3d98a5e
commit 0373c0b168
5 changed files with 67 additions and 2 deletions

View File

@@ -102,6 +102,24 @@
</RadioGroup>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/label_aspect_ratio" />
<Spinner
android:id="@+id/aspect_ratio"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
<Button
android:id="@+id/enter_pip_button"
android:layout_width="wrap_content"

View File

@@ -14,6 +14,7 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<!-- Note that app:aspectRatio can be changed dynamically. -->
<com.example.android.apis.view.FixedAspectRatioImageView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"

View File

@@ -74,6 +74,15 @@
<string name="label_exit_position">Exit position</string>
<string name="label_position_start">Start</string>
<string name="label_position_end">End</string>
<string name="label_aspect_ratio">Aspect Ratio</string>
<!-- List of aspect ratio to demo, we use Rational.parseRational to parse what's inside () -->
<string-array name="aspect_ratio_list">
<item>Extreme wide (21/9)</item>
<item>Video (16/9)</item>
<item>Square (1/1)</item>
<item>Video call (9/16)</item>
<item>Extreme tall (9/21)</item>
</string-array>
<string name="activity_keep_clear">App/Activity/Keep Clear Rects</string>
<string name="keep_clear_property_set">

View File

@@ -39,14 +39,18 @@ import android.util.Rational;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.Switch;
import android.window.OnBackInvokedDispatcher;
import com.example.android.apis.R;
import com.example.android.apis.view.FixedAspectRatioImageView;
import java.util.ArrayList;
import java.util.List;
@@ -57,6 +61,7 @@ public class PictureInPicture extends Activity {
private static final String EXTRA_ENABLE_SEAMLESS_RESIZE = "seamless_resize";
private static final String EXTRA_ENTER_PIP_ON_BACK = "enter_pip_on_back";
private static final String EXTRA_CURRENT_POSITION = "current_position";
private static final String EXTRA_ASPECT_RATIO = "aspect_ratio";
private static final int TABLET_BREAK_POINT_DP = 700;
@@ -95,13 +100,14 @@ public class PictureInPicture extends Activity {
(v, id) -> updateContentPosition(id);
private LinearLayout mContainer;
private ImageView mImageView;
private FixedAspectRatioImageView mImageView;
private View mControlGroup;
private Switch mAutoPipToggle;
private Switch mSourceRectHintToggle;
private Switch mSeamlessResizeToggle;
private Switch mEnterPipOnBackToggle;
private RadioGroup mCurrentPositionGroup;
private Spinner mAspectRatioSpinner;
private List<RemoteAction> mPipActions;
private RemoteAction mCloseAction;
@@ -119,6 +125,13 @@ public class PictureInPicture extends Activity {
mSeamlessResizeToggle = findViewById(R.id.seamless_resize_toggle);
mEnterPipOnBackToggle = findViewById(R.id.enter_pip_on_back);
mCurrentPositionGroup = findViewById(R.id.current_position);
mAspectRatioSpinner = findViewById(R.id.aspect_ratio);
// Initiate views if applicable
final ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.aspect_ratio_list, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mAspectRatioSpinner.setAdapter(adapter);
// Attach listeners
mImageView.addOnLayoutChangeListener(mOnLayoutChangeListener);
@@ -135,6 +148,22 @@ public class PictureInPicture extends Activity {
}
});
mCurrentPositionGroup.setOnCheckedChangeListener(mOnPositionChangedListener);
mAspectRatioSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
final String rawText = parent.getItemAtPosition(position).toString();
final String textToParse = rawText.substring(
rawText.indexOf('(') + 1,
rawText.indexOf(')'));
mImageView.addOnLayoutChangeListener(mOnLayoutChangeListener);
mImageView.setAspectRatio(Rational.parseRational(textToParse));
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// Do nothing.
}
});
findViewById(R.id.enter_pip_button).setOnClickListener(v -> enterPictureInPictureMode());
findViewById(R.id.enter_content_pip_button).setOnClickListener(v -> enterContentPip());
@@ -152,6 +181,7 @@ public class PictureInPicture extends Activity {
? R.id.radio_current_end
: R.id.radio_current_start;
mCurrentPositionGroup.check(positionId);
mAspectRatioSpinner.setSelection(1);
updateLayout(getResources().getConfiguration());
}

View File

@@ -29,7 +29,7 @@ import com.example.android.apis.R;
* 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;
private Rational mAspectRatio;
public FixedAspectRatioImageView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -43,6 +43,13 @@ public class FixedAspectRatioImageView extends ImageView {
}
}
public void setAspectRatio(Rational aspectRatio) {
if (!mAspectRatio.equals(aspectRatio)) {
mAspectRatio = aspectRatio;
requestLayout();
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);