blob: df2c94c5e057ac4ddac0bcb1901f585dec60cc66 [file] [log] [blame]
/*
* Copyright (C) 2015 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 android.support.v17.leanback.graphics;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SdkSuppress;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.support.v17.leanback.graphics.BoundsRule.ValueRule;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Unit test for {@link CompositeDrawableTest}
*/
@RunWith(AndroidJUnit4.class)
@SmallTest
public class CompositeDrawableTest {
private static final int HEIGHT = 800;
private static final int WIDTH = 600;
Bitmap mBitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888);
@Test
public void updateBounds_noBoundsRule() {
CompositeDrawable parentDrawable = new CompositeDrawable();
FitWidthBitmapDrawable drawable = new FitWidthBitmapDrawable();
drawable.setBitmap(mBitmap);
Rect bounds = new Rect(0, 0, WIDTH, HEIGHT);
parentDrawable.addChildDrawable(drawable);
parentDrawable.updateBounds(bounds);
Rect adjustedBounds = drawable.getBounds();
assertEquals(bounds, adjustedBounds);
}
@Test
public void updateBounds_withBoundsRule() {
CompositeDrawable parentDrawable = new CompositeDrawable();
float fraction = 0.5f;
FitWidthBitmapDrawable drawable = new FitWidthBitmapDrawable();
drawable.setBitmap(mBitmap);
Rect bounds = new Rect(0, 0, WIDTH, HEIGHT);
assertEquals(HEIGHT, bounds.height());
assertEquals(WIDTH, bounds.width());
// inherit from parent
parentDrawable.addChildDrawable(drawable);
parentDrawable.getChildAt(0).getBoundsRule().bottom = ValueRule.inheritFromParent(
fraction);
parentDrawable.updateBounds(bounds);
Rect adjustedBounds = drawable.getBounds();
Rect expectedBounds = new Rect(bounds);
expectedBounds.bottom = bounds.top + (int) (HEIGHT * fraction);
assertEquals(expectedBounds, adjustedBounds);
// absolute value
drawable.setBounds(bounds);
parentDrawable.getChildAt(0).getBoundsRule().bottom = ValueRule.absoluteValue(200);
parentDrawable.updateBounds(bounds);
adjustedBounds = drawable.getBounds();
expectedBounds = new Rect(bounds);
expectedBounds.bottom = 200;
assertEquals(expectedBounds, adjustedBounds);
// inherit with offset
parentDrawable.getChildAt(0).getBoundsRule().bottom =
ValueRule.inheritFromParentWithOffset(fraction, 100);
parentDrawable.updateBounds(bounds);
adjustedBounds = drawable.getBounds();
expectedBounds = new Rect(bounds);
expectedBounds.bottom = bounds.top + (int) (HEIGHT * fraction + 100);
assertEquals(expectedBounds, adjustedBounds);
// inherit from parent 2
bounds = new Rect(100, 200, WIDTH, HEIGHT);
parentDrawable.getChildAt(0).getBoundsRule().bottom =
ValueRule.inheritFromParent(fraction);
parentDrawable.updateBounds(bounds);
adjustedBounds = drawable.getBounds();
expectedBounds = new Rect(bounds);
expectedBounds.bottom = bounds.top + (int) ((HEIGHT - 200) * fraction);
assertEquals(expectedBounds, adjustedBounds);
}
@Test
public void updateBounds_withOverride() {
CompositeDrawable parentDrawable = new CompositeDrawable();
float fraction = 0.5f;
FitWidthBitmapDrawable drawable = new FitWidthBitmapDrawable();
drawable.setBitmap(mBitmap);
Rect bounds = new Rect(0, 0, WIDTH, HEIGHT);
drawable.setBounds(bounds);
assertEquals(HEIGHT, drawable.getBounds().height());
assertEquals(WIDTH, drawable.getBounds().width());
parentDrawable.addChildDrawable(drawable);
// inherit from parent
BoundsRule boundsRule = parentDrawable.getChildAt(0).getBoundsRule();
boundsRule.top = ValueRule.absoluteValue(-200);
boundsRule.bottom = ValueRule.inheritFromParent(fraction);
parentDrawable.getChildAt(0).getBoundsRule().top.setAbsoluteValue(-100);
parentDrawable.updateBounds(bounds);
Rect adjustedBounds = drawable.getBounds();
Rect expectedBounds = new Rect(bounds);
expectedBounds.top = -100;
expectedBounds.bottom = (int) (HEIGHT * fraction);
assertEquals(expectedBounds, adjustedBounds);
// inherit from parent with offset
boundsRule.bottom = ValueRule.inheritFromParentWithOffset(1f, -100);
parentDrawable.updateBounds(bounds);
adjustedBounds = drawable.getBounds();
expectedBounds = new Rect(bounds);
expectedBounds.top = -100;
expectedBounds.bottom = HEIGHT - 100;
assertEquals(expectedBounds, adjustedBounds);
// using property would change type:
CompositeDrawable.ChildDrawable.BOTTOM_ABSOLUTE.set(parentDrawable.getChildAt(0), 0);
CompositeDrawable.ChildDrawable.BOTTOM_FRACTION.set(parentDrawable.getChildAt(0), 0.5f);
parentDrawable.updateBounds(bounds);
adjustedBounds = drawable.getBounds();
expectedBounds = new Rect(bounds);
expectedBounds.top = -100;
expectedBounds.bottom = (int) (0.5f * HEIGHT);
assertEquals(expectedBounds, adjustedBounds);
}
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.KITKAT)
@Test
public void constantState() {
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
CompositeDrawable parentDrawable = new CompositeDrawable();
BitmapDrawable childDrawable = new BitmapDrawable(context.getResources(), mBitmap);
parentDrawable.addChildDrawable(childDrawable);
// getConstantState().newDrawable() will create a new CompositeDrawable with shared states:
CompositeDrawable parentDrawble2 = (CompositeDrawable)
parentDrawable.getConstantState().newDrawable();
BitmapDrawable childDrawable2 = (BitmapDrawable) parentDrawble2.getChildAt(0).getDrawable();
parentDrawable.setAlpha(128);
assertEquals(128, parentDrawble2.getAlpha());
assertEquals(128, childDrawable2.getAlpha());
// after mutate(), parentDrawble2 will have its own state
parentDrawble2.mutate();
childDrawable2 = (BitmapDrawable) parentDrawble2.getChildAt(0).getDrawable();
parentDrawable.setAlpha(64);
assertEquals(64, parentDrawable.getAlpha());
assertEquals(64, childDrawable.getAlpha());
assertEquals(128, parentDrawble2.getAlpha());
assertEquals(128, childDrawable2.getAlpha());
childDrawable.setAlpha(100);
assertEquals(128, parentDrawble2.getAlpha());
assertEquals(128, childDrawable2.getAlpha());
}
@Test
public void copyChildDrawableTest() {
double delta = .005f;
CompositeDrawable parent = new CompositeDrawable();
FitWidthBitmapDrawable child = new FitWidthBitmapDrawable();
parent.addChildDrawable(child);
parent.getChildAt(0).getBoundsRule().bottom =
ValueRule.inheritFromParentWithOffset(.5f, 100);
CompositeDrawable.ChildDrawable newChild = new CompositeDrawable.ChildDrawable(
parent.getChildAt(0),
parent,
null);
assertEquals(100, newChild.getBoundsRule().bottom.getAbsoluteValue());
assertEquals(.5f, newChild.getBoundsRule().bottom.getFraction(), delta);
}
@Test
public void mutateTest() {
double delta = .005f;
CompositeDrawable parent = new CompositeDrawable();
FitWidthBitmapDrawable child = new FitWidthBitmapDrawable();
parent.addChildDrawable(child);
parent.getChildAt(0).getBoundsRule().bottom =
ValueRule.inheritFromParentWithOffset(.5f, 100);
CompositeDrawable newDrawable = (CompositeDrawable) parent.getConstantState().newDrawable();
parent.mutate();
assertTrue(parent.mMutated);
CompositeDrawable.ChildDrawable newChild = newDrawable.getChildAt(0);
assertNotSame(parent.getChildAt(0), newChild);
assertEquals(parent.getChildAt(0).getBoundsRule().bottom.getAbsoluteValue(),
newChild.getBoundsRule().bottom.getAbsoluteValue());
assertEquals(parent.getChildAt(0).getBoundsRule().bottom.getFraction(),
newChild.getBoundsRule().bottom.getFraction(), delta);
}
}