From 36717d4399f1aa58e5d870092d33427878c58d56 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 15 Aug 2017 11:00:04 -0700 Subject: [PATCH] Compute aspect ratio properly Change-Id: Ic4e1f20f7354b9ab5f4e9c7564d16d06324ec23d Fixes: 64608152 Test: visual --- res/layout/video_preference.xml | 2 +- .../widget/AspectRatioFrameLayout.java | 24 ++++- .../widget/AspectRatioFrameLayoutTest.java | 100 ++++++++++++++++++ 3 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/widget/AspectRatioFrameLayoutTest.java diff --git a/res/layout/video_preference.xml b/res/layout/video_preference.xml index 8b0e6198083..9ab52ae46f3 100644 --- a/res/layout/video_preference.xml +++ b/res/layout/video_preference.xml @@ -28,7 +28,7 @@ 0) { + width = (int) (height * mAspectRatio); + } else { + height = (int) (width / mAspectRatio); + } + super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); } } diff --git a/tests/robotests/src/com/android/settings/widget/AspectRatioFrameLayoutTest.java b/tests/robotests/src/com/android/settings/widget/AspectRatioFrameLayoutTest.java new file mode 100644 index 00000000000..dd6138cea50 --- /dev/null +++ b/tests/robotests/src/com/android/settings/widget/AspectRatioFrameLayoutTest.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2017 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.android.settings.widget; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.view.View; + +import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class AspectRatioFrameLayoutTest { + + private Context mContext; + private AspectRatioFrameLayout mLayout; + + @Before + public void setup() { + mContext = RuntimeEnvironment.application; + } + + @Test + public void measure_squareAspectRatio_stretchHeight() { + mLayout = new AspectRatioFrameLayout(mContext); + + int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY); + int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(50, View.MeasureSpec.EXACTLY); + + mLayout.measure(widthMeasureSpec, heightMeasureSpec); + + assertThat(mLayout.getMeasuredWidth()).isEqualTo(100); + assertThat(mLayout.getMeasuredHeight()).isEqualTo(100); + } + + @Test + public void measure_squareAspectRatio_stretchWidth() { + mLayout = new AspectRatioFrameLayout(mContext); + + int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(50, View.MeasureSpec.EXACTLY); + int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY); + + mLayout.measure(widthMeasureSpec, heightMeasureSpec); + + assertThat(mLayout.getMeasuredWidth()).isEqualTo(100); + assertThat(mLayout.getMeasuredHeight()).isEqualTo(100); + } + + @Test + public void measure_squareAspectRatio_doNotStretch() { + mLayout = new AspectRatioFrameLayout(mContext); + + int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY); + int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY); + + mLayout.measure(widthMeasureSpec, heightMeasureSpec); + + assertThat(mLayout.getMeasuredWidth()).isEqualTo(100); + assertThat(mLayout.getMeasuredHeight()).isEqualTo(100); + } + + @Test + public void measure_rectangleAspectRatio_stretch() { + mLayout = new AspectRatioFrameLayout(mContext); + // Set aspect ratio to 2:1. + ReflectionHelpers.setField(mLayout, "mAspectRatio", 2f); + + int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY); + int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY); + + mLayout.measure(widthMeasureSpec, heightMeasureSpec); + + // Should stretch width/height to 2:1 ratio + assertThat(mLayout.getMeasuredWidth()).isEqualTo(200); + assertThat(mLayout.getMeasuredHeight()).isEqualTo(100); + } +}