1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package android.uirendering.cts.testclasses; 17 18 import android.animation.ObjectAnimator; 19 import android.graphics.Canvas; 20 import android.graphics.Color; 21 import android.graphics.Rect; 22 import android.test.suitebuilder.annotation.MediumTest; 23 import android.uirendering.cts.bitmapverifiers.*; 24 import android.uirendering.cts.testinfrastructure.ActivityTestBase; 25 import android.uirendering.cts.testinfrastructure.CanvasClient; 26 import android.uirendering.cts.testinfrastructure.DrawActivity; 27 import android.uirendering.cts.testinfrastructure.ViewInitializer; 28 import android.view.Gravity; 29 import android.view.SurfaceHolder; 30 import android.view.SurfaceView; 31 import android.view.View; 32 import android.uirendering.cts.R; 33 import android.view.animation.LinearInterpolator; 34 import android.widget.FrameLayout; 35 import org.junit.Test; 36 37 import java.util.concurrent.CountDownLatch; 38 39 @MediumTest 40 public class SurfaceViewTests extends ActivityTestBase { 41 42 static final CanvasCallback sGreenCanvasCallback = 43 new CanvasCallback((canvas, width, height) -> canvas.drawColor(Color.GREEN)); 44 static final CanvasCallback sWhiteCanvasCallback = 45 new CanvasCallback((canvas, width, height) -> canvas.drawColor(Color.WHITE)); 46 static final CanvasCallback sRedCanvasCallback = 47 new CanvasCallback((canvas, width, height) -> canvas.drawColor(Color.RED)); 48 49 private static class CanvasCallback implements SurfaceHolder.Callback { 50 final CanvasClient mCanvasClient; 51 CanvasCallback(CanvasClient canvasClient)52 public CanvasCallback(CanvasClient canvasClient) { 53 mCanvasClient = canvasClient; 54 } 55 56 @Override surfaceCreated(SurfaceHolder holder)57 public void surfaceCreated(SurfaceHolder holder) { 58 } 59 60 @Override surfaceChanged(SurfaceHolder holder, int format, int width, int height)61 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 62 Canvas canvas = holder.lockCanvas(); 63 mCanvasClient.draw(canvas, width, height); 64 holder.unlockCanvasAndPost(canvas); 65 } 66 67 @Override surfaceDestroyed(SurfaceHolder holder)68 public void surfaceDestroyed(SurfaceHolder holder) { 69 } 70 } 71 createInfiniteAnimator(Object target, String prop, float start, float end)72 static ObjectAnimator createInfiniteAnimator(Object target, String prop, 73 float start, float end) { 74 ObjectAnimator a = ObjectAnimator.ofFloat(target, prop, start, end); 75 a.setRepeatMode(ObjectAnimator.REVERSE); 76 a.setRepeatCount(ObjectAnimator.INFINITE); 77 a.setDuration(200); 78 a.setInterpolator(new LinearInterpolator()); 79 a.start(); 80 return a; 81 } 82 83 @Test testMovingWhiteSurfaceView()84 public void testMovingWhiteSurfaceView() { 85 // A moving SurfaceViews with white content against a white background should be invisible 86 ViewInitializer initializer = new ViewInitializer() { 87 ObjectAnimator mAnimator; 88 @Override 89 public void initializeView(View view) { 90 FrameLayout root = (FrameLayout) view.findViewById(R.id.frame_layout); 91 mAnimator = createInfiniteAnimator(root, "translationY", 0, 50); 92 93 SurfaceView surfaceViewA = new SurfaceView(view.getContext()); 94 surfaceViewA.getHolder().addCallback(sWhiteCanvasCallback); 95 root.addView(surfaceViewA, new FrameLayout.LayoutParams( 96 90, 40, Gravity.START | Gravity.TOP)); 97 } 98 @Override 99 public void teardownView() { 100 mAnimator.cancel(); 101 } 102 }; 103 createTest() 104 .addLayout(R.layout.frame_layout, initializer, true) 105 .runWithAnimationVerifier(new ColorVerifier(Color.WHITE, 0 /* zero tolerance */)); 106 } 107 } 108