| /* |
| * Copyright (C) 2012 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.internal.widget; |
| |
| import com.android.frameworks.coretests.R; |
| |
| import android.content.Context; |
| import android.graphics.Color; |
| import android.graphics.drawable.ColorDrawable; |
| import android.test.AndroidTestCase; |
| import android.test.suitebuilder.annotation.SmallTest; |
| import android.view.LayoutInflater; |
| import android.view.View; |
| |
| import com.android.internal.widget.SizeAdaptiveLayout; |
| |
| |
| public class SizeAdaptiveLayoutTest extends AndroidTestCase { |
| |
| private LayoutInflater mInflater; |
| private int mOneU; |
| private int mFourU; |
| private SizeAdaptiveLayout mSizeAdaptiveLayout; |
| private View mSmallView; |
| private View mMediumView; |
| private View mLargeView; |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| |
| // inflate the layout |
| final Context context = getContext(); |
| mInflater = LayoutInflater.from(context); |
| mOneU = 64; |
| mFourU = 4 * mOneU; |
| } |
| |
| private void inflate(int resource){ |
| mSizeAdaptiveLayout = (SizeAdaptiveLayout) mInflater.inflate(resource, null); |
| mSizeAdaptiveLayout.onAttachedToWindow(); |
| |
| mSmallView = mSizeAdaptiveLayout.findViewById(R.id.one_u); |
| mMediumView = mSizeAdaptiveLayout.findViewById(R.id.two_u); |
| mLargeView = mSizeAdaptiveLayout.findViewById(R.id.four_u); |
| } |
| |
| /** |
| * The name 'test preconditions' is a convention to signal that if this |
| * test doesn't pass, the test case was not set up properly and it might |
| * explain any and all failures in other tests. This is not guaranteed |
| * to run before other tests, as junit uses reflection to find the tests. |
| */ |
| @SmallTest |
| public void testPreconditions() { |
| assertNotNull(mInflater); |
| |
| inflate(R.layout.size_adaptive); |
| assertNotNull(mSizeAdaptiveLayout); |
| assertNotNull(mSmallView); |
| assertNotNull(mLargeView); |
| } |
| |
| @SmallTest |
| public void testOpenLarge() { |
| inflate(R.layout.size_adaptive); |
| SizeAdaptiveLayout.LayoutParams lp = |
| (SizeAdaptiveLayout.LayoutParams) mLargeView.getLayoutParams(); |
| int height = (int) lp.minHeight + 10; |
| |
| measureAndLayout(height); |
| |
| assertEquals("4U should be visible", |
| View.VISIBLE, |
| mLargeView.getVisibility()); |
| assertEquals("1U should be gone", |
| View.GONE, |
| mSmallView.getVisibility()); |
| } |
| |
| @SmallTest |
| public void testOpenSmall() { |
| inflate(R.layout.size_adaptive); |
| SizeAdaptiveLayout.LayoutParams lp = |
| (SizeAdaptiveLayout.LayoutParams) mSmallView.getLayoutParams(); |
| int height = (int) lp.minHeight; |
| |
| measureAndLayout(height); |
| |
| assertEquals("1U should be visible", |
| View.VISIBLE, |
| mSmallView.getVisibility()); |
| assertEquals("4U should be gone", |
| View.GONE, |
| mLargeView.getVisibility()); |
| } |
| |
| @SmallTest |
| public void testOpenTooSmall() { |
| inflate(R.layout.size_adaptive); |
| SizeAdaptiveLayout.LayoutParams lp = |
| (SizeAdaptiveLayout.LayoutParams) mSmallView.getLayoutParams(); |
| int height = (int) lp.minHeight - 10; |
| |
| measureAndLayout(height); |
| |
| assertEquals("1U should be visible", |
| View.VISIBLE, |
| mSmallView.getVisibility()); |
| assertEquals("4U should be gone", |
| View.GONE, |
| mLargeView.getVisibility()); |
| } |
| |
| @SmallTest |
| public void testOpenTooBig() { |
| inflate(R.layout.size_adaptive); |
| SizeAdaptiveLayout.LayoutParams lp = |
| (SizeAdaptiveLayout.LayoutParams) mLargeView.getLayoutParams(); |
| lp.maxHeight = 500; |
| mLargeView.setLayoutParams(lp); |
| int height = (int) (lp.minHeight + 10); |
| |
| measureAndLayout(height); |
| |
| assertEquals("4U should be visible", |
| View.VISIBLE, |
| mLargeView.getVisibility()); |
| assertEquals("1U should be gone", |
| View.GONE, |
| mSmallView.getVisibility()); |
| } |
| |
| @SmallTest |
| public void testOpenWrapContent() { |
| inflate(R.layout.size_adaptive_text); |
| SizeAdaptiveLayout.LayoutParams lp = |
| (SizeAdaptiveLayout.LayoutParams) mLargeView.getLayoutParams(); |
| int height = (int) lp.minHeight + 10; |
| |
| // manually measure it, and lay it out |
| int measureSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.AT_MOST); |
| mSizeAdaptiveLayout.measure(500, measureSpec); |
| assertTrue("should not be forced to 4U", |
| mSizeAdaptiveLayout.getMeasuredHeight() < mFourU); |
| } |
| |
| @SmallTest |
| public void testOpenOneUOnlySmall() { |
| inflate(R.layout.size_adaptive_singleton); |
| assertNull("largeView should be NULL in the singleton layout", mLargeView); |
| |
| SizeAdaptiveLayout.LayoutParams lp = |
| (SizeAdaptiveLayout.LayoutParams) mSmallView.getLayoutParams(); |
| int height = (int) lp.minHeight - 10; |
| |
| measureAndLayout(height); |
| |
| assertEquals("1U should be visible", |
| View.VISIBLE, |
| mSmallView.getVisibility()); |
| } |
| |
| @SmallTest |
| public void testOpenOneUOnlyLarge() { |
| inflate(R.layout.size_adaptive_singleton); |
| assertNull("largeView should be NULL in the singleton layout", mLargeView); |
| |
| SizeAdaptiveLayout.LayoutParams lp = |
| (SizeAdaptiveLayout.LayoutParams) mSmallView.getLayoutParams(); |
| int height = (int) lp.maxHeight + 10; |
| |
| measureAndLayout(height); |
| |
| assertEquals("1U should be visible", |
| View.VISIBLE, |
| mSmallView.getVisibility()); |
| } |
| |
| @SmallTest |
| public void testOpenOneUOnlyJustRight() { |
| inflate(R.layout.size_adaptive_singleton); |
| assertNull("largeView should be NULL in the singleton layout", mLargeView); |
| |
| SizeAdaptiveLayout.LayoutParams lp = |
| (SizeAdaptiveLayout.LayoutParams) mSmallView.getLayoutParams(); |
| int height = (int) lp.minHeight; |
| |
| measureAndLayout(height); |
| |
| assertEquals("1U should be visible", |
| View.VISIBLE, |
| mSmallView.getVisibility()); |
| } |
| |
| @SmallTest |
| public void testOpenFourUOnlySmall() { |
| inflate(R.layout.size_adaptive_large_only); |
| assertNull("smallView should be NULL in the singleton layout", mSmallView); |
| |
| SizeAdaptiveLayout.LayoutParams lp = |
| (SizeAdaptiveLayout.LayoutParams) mLargeView.getLayoutParams(); |
| int height = (int) lp.minHeight - 10; |
| |
| measureAndLayout(height); |
| |
| assertEquals("4U should be visible", |
| View.VISIBLE, |
| mLargeView.getVisibility()); |
| } |
| |
| @SmallTest |
| public void testOpenFourUOnlyLarge() { |
| inflate(R.layout.size_adaptive_large_only); |
| assertNull("smallView should be NULL in the singleton layout", mSmallView); |
| |
| SizeAdaptiveLayout.LayoutParams lp = |
| (SizeAdaptiveLayout.LayoutParams) mLargeView.getLayoutParams(); |
| int height = (int) lp.maxHeight + 10; |
| |
| measureAndLayout(height); |
| |
| assertEquals("4U should be visible", |
| View.VISIBLE, |
| mLargeView.getVisibility()); |
| } |
| |
| @SmallTest |
| public void testOpenFourUOnlyJustRight() { |
| inflate(R.layout.size_adaptive_large_only); |
| assertNull("smallView should be NULL in the singleton layout", mSmallView); |
| |
| SizeAdaptiveLayout.LayoutParams lp = |
| (SizeAdaptiveLayout.LayoutParams) mLargeView.getLayoutParams(); |
| int height = (int) lp.minHeight; |
| |
| measureAndLayout(height); |
| |
| assertEquals("4U should be visible", |
| View.VISIBLE, |
| mLargeView.getVisibility()); |
| } |
| |
| @SmallTest |
| public void testOpenIntoAGap() { |
| inflate(R.layout.size_adaptive_gappy); |
| |
| SizeAdaptiveLayout.LayoutParams smallParams = |
| (SizeAdaptiveLayout.LayoutParams) mSmallView.getLayoutParams(); |
| SizeAdaptiveLayout.LayoutParams largeParams = |
| (SizeAdaptiveLayout.LayoutParams) mLargeView.getLayoutParams(); |
| assertTrue("gappy layout should have a gap", |
| smallParams.maxHeight + 10 < largeParams.minHeight); |
| int height = (int) smallParams.maxHeight + 10; |
| |
| measureAndLayout(height); |
| |
| assertTrue("one and only one view should be visible", |
| mLargeView.getVisibility() != mSmallView.getVisibility()); |
| // behavior is undefined in this case. |
| } |
| |
| @SmallTest |
| public void testOpenIntoAnOverlap() { |
| inflate(R.layout.size_adaptive_overlapping); |
| |
| SizeAdaptiveLayout.LayoutParams smallParams = |
| (SizeAdaptiveLayout.LayoutParams) mSmallView.getLayoutParams(); |
| SizeAdaptiveLayout.LayoutParams largeParams = |
| (SizeAdaptiveLayout.LayoutParams) mLargeView.getLayoutParams(); |
| assertEquals("overlapping layout should overlap", |
| smallParams.minHeight, |
| largeParams.minHeight); |
| int height = (int) smallParams.maxHeight; |
| |
| measureAndLayout(height); |
| |
| assertTrue("one and only one view should be visible", |
| mLargeView.getVisibility() != mSmallView.getVisibility()); |
| assertEquals("1U should get priority in an overlap because it is first", |
| View.VISIBLE, |
| mSmallView.getVisibility()); |
| } |
| |
| @SmallTest |
| public void testOpenThreeWayViewSmall() { |
| inflate(R.layout.size_adaptive_three_way); |
| assertNotNull("mMediumView should not be NULL in the three view layout", mMediumView); |
| |
| SizeAdaptiveLayout.LayoutParams lp = |
| (SizeAdaptiveLayout.LayoutParams) mSmallView.getLayoutParams(); |
| int height = (int) lp.minHeight; |
| |
| measureAndLayout(height); |
| |
| assertEquals("1U should be visible", |
| View.VISIBLE, |
| mSmallView.getVisibility()); |
| assertEquals("2U should be gone", |
| View.GONE, |
| mMediumView.getVisibility()); |
| assertEquals("4U should be gone", |
| View.GONE, |
| mLargeView.getVisibility()); |
| } |
| |
| @SmallTest |
| public void testOpenThreeWayViewMedium() { |
| inflate(R.layout.size_adaptive_three_way); |
| assertNotNull("mMediumView should not be NULL in the three view layout", mMediumView); |
| |
| SizeAdaptiveLayout.LayoutParams lp = |
| (SizeAdaptiveLayout.LayoutParams) mMediumView.getLayoutParams(); |
| int height = (int) lp.minHeight; |
| |
| measureAndLayout(height); |
| |
| assertEquals("1U should be gone", |
| View.GONE, |
| mSmallView.getVisibility()); |
| assertEquals("2U should be visible", |
| View.VISIBLE, |
| mMediumView.getVisibility()); |
| assertEquals("4U should be gone", |
| View.GONE, |
| mLargeView.getVisibility()); |
| } |
| |
| @SmallTest |
| public void testOpenThreeWayViewLarge() { |
| inflate(R.layout.size_adaptive_three_way); |
| assertNotNull("mMediumView should not be NULL in the three view layout", mMediumView); |
| |
| SizeAdaptiveLayout.LayoutParams lp = |
| (SizeAdaptiveLayout.LayoutParams) mLargeView.getLayoutParams(); |
| int height = (int) lp.minHeight; |
| |
| measureAndLayout(height); |
| |
| assertEquals("1U should be gone", |
| View.GONE, |
| mSmallView.getVisibility()); |
| assertEquals("2U should be gone", |
| View.GONE, |
| mMediumView.getVisibility()); |
| assertEquals("4U should be visible", |
| View.VISIBLE, |
| mLargeView.getVisibility()); |
| } |
| |
| @SmallTest |
| public void testResizeWithoutAnimation() { |
| inflate(R.layout.size_adaptive); |
| |
| SizeAdaptiveLayout.LayoutParams largeParams = |
| (SizeAdaptiveLayout.LayoutParams) mLargeView.getLayoutParams(); |
| int startHeight = (int) largeParams.minHeight + 10; |
| int endHeight = (int) largeParams.minHeight + 10; |
| |
| measureAndLayout(startHeight); |
| |
| assertEquals("4U should be visible", |
| View.VISIBLE, |
| mLargeView.getVisibility()); |
| assertFalse("There should be no animation on initial rendering.", |
| mSizeAdaptiveLayout.getTransitionAnimation().isRunning()); |
| |
| measureAndLayout(endHeight); |
| |
| assertEquals("4U should still be visible", |
| View.VISIBLE, |
| mLargeView.getVisibility()); |
| assertFalse("There should be no animation on scale within a view.", |
| mSizeAdaptiveLayout.getTransitionAnimation().isRunning()); |
| } |
| |
| @SmallTest |
| public void testResizeWithAnimation() { |
| inflate(R.layout.size_adaptive); |
| |
| SizeAdaptiveLayout.LayoutParams smallParams = |
| (SizeAdaptiveLayout.LayoutParams) mSmallView.getLayoutParams(); |
| SizeAdaptiveLayout.LayoutParams largeParams = |
| (SizeAdaptiveLayout.LayoutParams) mLargeView.getLayoutParams(); |
| int startHeight = (int) largeParams.minHeight + 10; |
| int endHeight = (int) smallParams.maxHeight; |
| |
| measureAndLayout(startHeight); |
| |
| assertEquals("4U should be visible", |
| View.VISIBLE, |
| mLargeView.getVisibility()); |
| assertFalse("There should be no animation on initial rendering.", |
| mSizeAdaptiveLayout.getTransitionAnimation().isRunning()); |
| |
| measureAndLayout(endHeight); |
| |
| assertEquals("1U should now be visible", |
| View.VISIBLE, |
| mSmallView.getVisibility()); |
| assertTrue("There should be an animation on scale between views.", |
| mSizeAdaptiveLayout.getTransitionAnimation().isRunning()); |
| } |
| |
| @SmallTest |
| public void testModestyPanelChangesColorWhite() { |
| inflate(R.layout.size_adaptive_color); |
| View panel = mSizeAdaptiveLayout.getModestyPanel(); |
| assertTrue("ModestyPanel should have a ColorDrawable background", |
| panel.getBackground() instanceof ColorDrawable); |
| ColorDrawable panelColor = (ColorDrawable) panel.getBackground(); |
| ColorDrawable salColor = (ColorDrawable) mSizeAdaptiveLayout.getBackground(); |
| assertEquals("ModestyPanel color should match the SizeAdaptiveLayout", |
| panelColor.getColor(), salColor.getColor()); |
| } |
| |
| @SmallTest |
| public void testModestyPanelTracksStateListColor() { |
| inflate(R.layout.size_adaptive_color_statelist); |
| View panel = mSizeAdaptiveLayout.getModestyPanel(); |
| assertEquals("ModestyPanel should have a ColorDrawable background" , |
| panel.getBackground().getClass(), ColorDrawable.class); |
| ColorDrawable panelColor = (ColorDrawable) panel.getBackground(); |
| assertEquals("ModestyPanel color should match the SizeAdaptiveLayout", |
| panelColor.getColor(), Color.RED); |
| } |
| |
| @SmallTest |
| public void testModestyPanelHasDefault() { |
| inflate(R.layout.size_adaptive); |
| View panel = mSizeAdaptiveLayout.getModestyPanel(); |
| assertNull("SizeAdaptiveLayout should have no background for this test", |
| mSizeAdaptiveLayout.getBackground()); |
| assertTrue("ModestyPanel should have a ColorDrawable background", |
| panel.getBackground() instanceof ColorDrawable); |
| } |
| |
| @SmallTest |
| public void testOpenSmallEvenWhenLargeIsActuallySmall() { |
| inflate(R.layout.size_adaptive_lies); |
| SizeAdaptiveLayout.LayoutParams lp = |
| (SizeAdaptiveLayout.LayoutParams) mSmallView.getLayoutParams(); |
| int height = (int) lp.minHeight; |
| |
| measureAndLayout(height); |
| |
| assertEquals("1U should be visible", |
| View.VISIBLE, |
| mSmallView.getVisibility()); |
| assertTrue("1U should also have been measured", |
| mSmallView.getMeasuredHeight() > 0); |
| } |
| |
| @SmallTest |
| public void testOpenLargeEvenWhenLargeIsActuallySmall() { |
| inflate(R.layout.size_adaptive_lies); |
| SizeAdaptiveLayout.LayoutParams lp = |
| (SizeAdaptiveLayout.LayoutParams) mLargeView.getLayoutParams(); |
| int height = (int) lp.minHeight; |
| |
| measureAndLayout(height); |
| |
| assertEquals("4U should be visible", |
| View.VISIBLE, |
| mLargeView.getVisibility()); |
| assertTrue("4U should also have been measured", |
| mLargeView.getMeasuredHeight() > 0); |
| } |
| |
| private void measureAndLayout(int height) { |
| // manually measure it, and lay it out |
| int measureSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.AT_MOST); |
| mSizeAdaptiveLayout.measure(500, measureSpec); |
| mSizeAdaptiveLayout.layout(0, 0, 500, mSizeAdaptiveLayout.getMeasuredHeight()); |
| } |
| } |