blob: 57c67bd312faa4228b22a195d31b8cbf0207d6f5 [file] [log] [blame]
Antonio Calabrese16ac3c82014-06-12 13:58:58 -07001/*
2 * Copyright (C) 2014 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 */
Antonio Calabrese5367fe92014-07-21 13:05:06 -070016package android.uirendering.cts.testinfrastructure;
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070017
Antonio Calabrese5840eaf2014-07-22 12:39:05 -070018import android.annotation.Nullable;
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070019import android.app.Activity;
ztenghuid6b1d4e2015-06-11 15:00:25 -070020import android.content.res.Configuration;
Chris Craik2f7a2f92015-03-20 15:52:58 -070021import android.graphics.Point;
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070022import android.os.Bundle;
23import android.os.Handler;
24import android.os.Message;
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070025import android.view.View;
Chris Craik3e68f612015-01-21 17:49:27 -080026import android.view.ViewStub;
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070027import android.view.ViewTreeObserver;
Antonio Calabrese59330032014-07-15 15:49:39 -070028import android.webkit.WebView;
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070029
Chris Craik83020472014-12-05 15:02:15 -080030import com.android.cts.uirendering.R;
31
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070032/**
33 * A generic activity that uses a view specified by the user.
34 */
35public class DrawActivity extends Activity {
Chris Craik2f7a2f92015-03-20 15:52:58 -070036 private final static long TIME_OUT_MS = 10000;
37 private final Point mLock = new Point();
George Mount4292ebc2014-09-10 15:52:58 -070038 public static final int MIN_NUMBER_OF_DRAWS = 20;
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070039
40 private Handler mHandler;
41 private View mView;
Chris Craikab53a562015-06-12 15:13:50 -070042 private View mViewWrapper;
ztenghuid6b1d4e2015-06-11 15:00:25 -070043 private boolean mOnTv;
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070044
45 public void onCreate(Bundle bundle){
46 super.onCreate(bundle);
Chris Craik3e68f612015-01-21 17:49:27 -080047 getWindow().getDecorView().setSystemUiVisibility(
48 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN);
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070049 mHandler = new RenderSpecHandler();
ztenghuid6b1d4e2015-06-11 15:00:25 -070050 int uiMode = getResources().getConfiguration().uiMode;
ztenghui302b28e2015-07-23 14:02:06 -070051 mOnTv = (uiMode & Configuration.UI_MODE_TYPE_MASK) == Configuration.UI_MODE_TYPE_TELEVISION;
ztenghuid6b1d4e2015-06-11 15:00:25 -070052 }
53
54 public boolean getOnTv() {
55 return mOnTv;
Chris Craik0fbdfcf2014-12-08 14:21:12 -080056 }
57
Chris Craik2f7a2f92015-03-20 15:52:58 -070058 public Point enqueueRenderSpecAndWait(int layoutId, CanvasClient canvasClient, String webViewUrl,
Antonio Calabrese5840eaf2014-07-22 12:39:05 -070059 @Nullable ViewInitializer viewInitializer, boolean useHardware) {
60 ((RenderSpecHandler) mHandler).setViewInitializer(viewInitializer);
Chris Craikd88a1ba2014-12-03 23:58:42 +000061 int arg2 = (useHardware ? View.LAYER_TYPE_NONE : View.LAYER_TYPE_SOFTWARE);
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070062 if (canvasClient != null) {
63 mHandler.obtainMessage(RenderSpecHandler.CANVAS_MSG, 0, arg2, canvasClient).sendToTarget();
Antonio Calabrese59330032014-07-15 15:49:39 -070064 } else if (webViewUrl != null) {
65 mHandler.obtainMessage(RenderSpecHandler.WEB_VIEW_MSG, 0, arg2, webViewUrl).sendToTarget();
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070066 } else {
67 mHandler.obtainMessage(RenderSpecHandler.LAYOUT_MSG, layoutId, arg2).sendToTarget();
68 }
69
Chris Craik2f7a2f92015-03-20 15:52:58 -070070 Point point = new Point();
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070071 synchronized (mLock) {
72 try {
Chris Craik2f7a2f92015-03-20 15:52:58 -070073 mLock.wait(TIME_OUT_MS);
74 point.set(mLock.x, mLock.y);
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070075 } catch (InterruptedException e) {
76 e.printStackTrace();
77 }
78 }
Chris Craik2f7a2f92015-03-20 15:52:58 -070079 return point;
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070080 }
81
82 private class RenderSpecHandler extends Handler {
83 public static final int LAYOUT_MSG = 1;
84 public static final int CANVAS_MSG = 2;
Antonio Calabrese59330032014-07-15 15:49:39 -070085 public static final int WEB_VIEW_MSG = 3;
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070086
Antonio Calabrese5840eaf2014-07-22 12:39:05 -070087 private ViewInitializer mViewInitializer;
88
89 public void setViewInitializer(ViewInitializer viewInitializer) {
90 mViewInitializer = viewInitializer;
91 }
92
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070093 public void handleMessage(Message message) {
Chris Craik3e68f612015-01-21 17:49:27 -080094 int drawCountDelay = 0;
95 setContentView(R.layout.test_container);
96 ViewStub stub = (ViewStub) findViewById(R.id.test_content_stub);
Chris Craikab53a562015-06-12 15:13:50 -070097 mViewWrapper = findViewById(R.id.test_content_wrapper);
Antonio Calabrese16ac3c82014-06-12 13:58:58 -070098 switch (message.what) {
99 case LAYOUT_MSG: {
Chris Craik3e68f612015-01-21 17:49:27 -0800100 stub.setLayoutResource(message.arg1);
101 mView = stub.inflate();
Antonio Calabrese16ac3c82014-06-12 13:58:58 -0700102 } break;
103
104 case CANVAS_MSG: {
Chris Craik3e68f612015-01-21 17:49:27 -0800105 stub.setLayoutResource(R.layout.test_content_canvasclientview);
106 mView = stub.inflate();
107 ((CanvasClientView) mView).setCanvasClient((CanvasClient) (message.obj));
Antonio Calabrese16ac3c82014-06-12 13:58:58 -0700108 } break;
Antonio Calabrese59330032014-07-15 15:49:39 -0700109
110 case WEB_VIEW_MSG: {
Chris Craik3e68f612015-01-21 17:49:27 -0800111 stub.setLayoutResource(R.layout.test_content_webview);
112 mView = stub.inflate();
Antonio Calabrese59330032014-07-15 15:49:39 -0700113 ((WebView) mView).loadUrl((String) message.obj);
114 ((WebView) mView).setInitialScale(100);
Chris Craik3e68f612015-01-21 17:49:27 -0800115 drawCountDelay = 10;
Antonio Calabrese59330032014-07-15 15:49:39 -0700116 } break;
Antonio Calabrese16ac3c82014-06-12 13:58:58 -0700117 }
Antonio Calabrese5840eaf2014-07-22 12:39:05 -0700118
Chris Craik3e68f612015-01-21 17:49:27 -0800119 if (mView == null) {
120 throw new IllegalStateException("failed to inflate test content");
121 }
122
Antonio Calabrese5840eaf2014-07-22 12:39:05 -0700123 if (mViewInitializer != null) {
Chris Craikab53a562015-06-12 15:13:50 -0700124 mViewInitializer.initializeView(mView);
Antonio Calabrese5840eaf2014-07-22 12:39:05 -0700125 }
Chris Craikab53a562015-06-12 15:13:50 -0700126
127 // set layer on wrapper parent of view, so view initializer
128 // can control layer type of View under test.
129 mViewWrapper.setLayerType(message.arg2, null);
Antonio Calabrese16ac3c82014-06-12 13:58:58 -0700130
Chris Craik3e68f612015-01-21 17:49:27 -0800131 DrawCounterListener onDrawListener = new DrawCounterListener(drawCountDelay);
Antonio Calabresef2330d52014-06-24 15:30:49 -0700132
133 mView.getViewTreeObserver().addOnPreDrawListener(onDrawListener);
Antonio Calabrese16ac3c82014-06-12 13:58:58 -0700134
135 mView.postInvalidate();
136 }
137 }
138
139 private class DrawCounterListener implements ViewTreeObserver.OnPreDrawListener {
Antonio Calabrese16ac3c82014-06-12 13:58:58 -0700140 private int mCurrentDraws = 0;
Antonio Calabrese59330032014-07-15 15:49:39 -0700141 private int mExtraDraws;
142
143 public DrawCounterListener(int extraDraws) {
144 mExtraDraws = extraDraws;
145 }
Antonio Calabrese16ac3c82014-06-12 13:58:58 -0700146
147 @Override
148 public boolean onPreDraw() {
Chris Craik2f7a2f92015-03-20 15:52:58 -0700149
Antonio Calabrese16ac3c82014-06-12 13:58:58 -0700150 mCurrentDraws++;
Antonio Calabrese59330032014-07-15 15:49:39 -0700151 if (mCurrentDraws < MIN_NUMBER_OF_DRAWS + mExtraDraws) {
Antonio Calabrese16ac3c82014-06-12 13:58:58 -0700152 mView.postInvalidate();
153 } else {
154 synchronized (mLock) {
Chris Craikab53a562015-06-12 15:13:50 -0700155 mLock.set(mViewWrapper.getLeft(), mViewWrapper.getTop());
Antonio Calabrese16ac3c82014-06-12 13:58:58 -0700156 mLock.notify();
157 }
Antonio Calabresef2330d52014-06-24 15:30:49 -0700158 mView.getViewTreeObserver().removeOnPreDrawListener(this);
Antonio Calabrese16ac3c82014-06-12 13:58:58 -0700159 }
160 return true;
161 }
Antonio Calabrese16ac3c82014-06-12 13:58:58 -0700162 }
163}