• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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