Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 1 | /* |
| 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 Calabrese | 5367fe9 | 2014-07-21 13:05:06 -0700 | [diff] [blame] | 16 | package android.uirendering.cts.testinfrastructure; |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 17 | |
Antonio Calabrese | 5840eaf | 2014-07-22 12:39:05 -0700 | [diff] [blame] | 18 | import android.annotation.Nullable; |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 19 | import android.app.Activity; |
ztenghui | d6b1d4e | 2015-06-11 15:00:25 -0700 | [diff] [blame] | 20 | import android.content.res.Configuration; |
Chris Craik | 2f7a2f9 | 2015-03-20 15:52:58 -0700 | [diff] [blame] | 21 | import android.graphics.Point; |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 22 | import android.os.Bundle; |
| 23 | import android.os.Handler; |
| 24 | import android.os.Message; |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 25 | import android.view.View; |
Chris Craik | 3e68f61 | 2015-01-21 17:49:27 -0800 | [diff] [blame] | 26 | import android.view.ViewStub; |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 27 | import android.view.ViewTreeObserver; |
Antonio Calabrese | 5933003 | 2014-07-15 15:49:39 -0700 | [diff] [blame] | 28 | import android.webkit.WebView; |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 29 | |
Chris Craik | 8302047 | 2014-12-05 15:02:15 -0800 | [diff] [blame] | 30 | import com.android.cts.uirendering.R; |
| 31 | |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 32 | /** |
| 33 | * A generic activity that uses a view specified by the user. |
| 34 | */ |
| 35 | public class DrawActivity extends Activity { |
Chris Craik | 2f7a2f9 | 2015-03-20 15:52:58 -0700 | [diff] [blame] | 36 | private final static long TIME_OUT_MS = 10000; |
| 37 | private final Point mLock = new Point(); |
George Mount | 4292ebc | 2014-09-10 15:52:58 -0700 | [diff] [blame] | 38 | public static final int MIN_NUMBER_OF_DRAWS = 20; |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 39 | |
| 40 | private Handler mHandler; |
| 41 | private View mView; |
Chris Craik | ab53a56 | 2015-06-12 15:13:50 -0700 | [diff] [blame] | 42 | private View mViewWrapper; |
ztenghui | d6b1d4e | 2015-06-11 15:00:25 -0700 | [diff] [blame] | 43 | private boolean mOnTv; |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 44 | |
| 45 | public void onCreate(Bundle bundle){ |
| 46 | super.onCreate(bundle); |
Chris Craik | 3e68f61 | 2015-01-21 17:49:27 -0800 | [diff] [blame] | 47 | getWindow().getDecorView().setSystemUiVisibility( |
| 48 | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN); |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 49 | mHandler = new RenderSpecHandler(); |
ztenghui | d6b1d4e | 2015-06-11 15:00:25 -0700 | [diff] [blame] | 50 | int uiMode = getResources().getConfiguration().uiMode; |
ztenghui | 302b28e | 2015-07-23 14:02:06 -0700 | [diff] [blame] | 51 | mOnTv = (uiMode & Configuration.UI_MODE_TYPE_MASK) == Configuration.UI_MODE_TYPE_TELEVISION; |
ztenghui | d6b1d4e | 2015-06-11 15:00:25 -0700 | [diff] [blame] | 52 | } |
| 53 | |
| 54 | public boolean getOnTv() { |
| 55 | return mOnTv; |
Chris Craik | 0fbdfcf | 2014-12-08 14:21:12 -0800 | [diff] [blame] | 56 | } |
| 57 | |
Chris Craik | 2f7a2f9 | 2015-03-20 15:52:58 -0700 | [diff] [blame] | 58 | public Point enqueueRenderSpecAndWait(int layoutId, CanvasClient canvasClient, String webViewUrl, |
Antonio Calabrese | 5840eaf | 2014-07-22 12:39:05 -0700 | [diff] [blame] | 59 | @Nullable ViewInitializer viewInitializer, boolean useHardware) { |
| 60 | ((RenderSpecHandler) mHandler).setViewInitializer(viewInitializer); |
Chris Craik | d88a1ba | 2014-12-03 23:58:42 +0000 | [diff] [blame] | 61 | int arg2 = (useHardware ? View.LAYER_TYPE_NONE : View.LAYER_TYPE_SOFTWARE); |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 62 | if (canvasClient != null) { |
| 63 | mHandler.obtainMessage(RenderSpecHandler.CANVAS_MSG, 0, arg2, canvasClient).sendToTarget(); |
Antonio Calabrese | 5933003 | 2014-07-15 15:49:39 -0700 | [diff] [blame] | 64 | } else if (webViewUrl != null) { |
| 65 | mHandler.obtainMessage(RenderSpecHandler.WEB_VIEW_MSG, 0, arg2, webViewUrl).sendToTarget(); |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 66 | } else { |
| 67 | mHandler.obtainMessage(RenderSpecHandler.LAYOUT_MSG, layoutId, arg2).sendToTarget(); |
| 68 | } |
| 69 | |
Chris Craik | 2f7a2f9 | 2015-03-20 15:52:58 -0700 | [diff] [blame] | 70 | Point point = new Point(); |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 71 | synchronized (mLock) { |
| 72 | try { |
Chris Craik | 2f7a2f9 | 2015-03-20 15:52:58 -0700 | [diff] [blame] | 73 | mLock.wait(TIME_OUT_MS); |
| 74 | point.set(mLock.x, mLock.y); |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 75 | } catch (InterruptedException e) { |
| 76 | e.printStackTrace(); |
| 77 | } |
| 78 | } |
Chris Craik | 2f7a2f9 | 2015-03-20 15:52:58 -0700 | [diff] [blame] | 79 | return point; |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 80 | } |
| 81 | |
| 82 | private class RenderSpecHandler extends Handler { |
| 83 | public static final int LAYOUT_MSG = 1; |
| 84 | public static final int CANVAS_MSG = 2; |
Antonio Calabrese | 5933003 | 2014-07-15 15:49:39 -0700 | [diff] [blame] | 85 | public static final int WEB_VIEW_MSG = 3; |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 86 | |
Antonio Calabrese | 5840eaf | 2014-07-22 12:39:05 -0700 | [diff] [blame] | 87 | private ViewInitializer mViewInitializer; |
| 88 | |
| 89 | public void setViewInitializer(ViewInitializer viewInitializer) { |
| 90 | mViewInitializer = viewInitializer; |
| 91 | } |
| 92 | |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 93 | public void handleMessage(Message message) { |
Chris Craik | 3e68f61 | 2015-01-21 17:49:27 -0800 | [diff] [blame] | 94 | int drawCountDelay = 0; |
| 95 | setContentView(R.layout.test_container); |
| 96 | ViewStub stub = (ViewStub) findViewById(R.id.test_content_stub); |
Chris Craik | ab53a56 | 2015-06-12 15:13:50 -0700 | [diff] [blame] | 97 | mViewWrapper = findViewById(R.id.test_content_wrapper); |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 98 | switch (message.what) { |
| 99 | case LAYOUT_MSG: { |
Chris Craik | 3e68f61 | 2015-01-21 17:49:27 -0800 | [diff] [blame] | 100 | stub.setLayoutResource(message.arg1); |
| 101 | mView = stub.inflate(); |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 102 | } break; |
| 103 | |
| 104 | case CANVAS_MSG: { |
Chris Craik | 3e68f61 | 2015-01-21 17:49:27 -0800 | [diff] [blame] | 105 | stub.setLayoutResource(R.layout.test_content_canvasclientview); |
| 106 | mView = stub.inflate(); |
| 107 | ((CanvasClientView) mView).setCanvasClient((CanvasClient) (message.obj)); |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 108 | } break; |
Antonio Calabrese | 5933003 | 2014-07-15 15:49:39 -0700 | [diff] [blame] | 109 | |
| 110 | case WEB_VIEW_MSG: { |
Chris Craik | 3e68f61 | 2015-01-21 17:49:27 -0800 | [diff] [blame] | 111 | stub.setLayoutResource(R.layout.test_content_webview); |
| 112 | mView = stub.inflate(); |
Antonio Calabrese | 5933003 | 2014-07-15 15:49:39 -0700 | [diff] [blame] | 113 | ((WebView) mView).loadUrl((String) message.obj); |
| 114 | ((WebView) mView).setInitialScale(100); |
Chris Craik | 3e68f61 | 2015-01-21 17:49:27 -0800 | [diff] [blame] | 115 | drawCountDelay = 10; |
Antonio Calabrese | 5933003 | 2014-07-15 15:49:39 -0700 | [diff] [blame] | 116 | } break; |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 117 | } |
Antonio Calabrese | 5840eaf | 2014-07-22 12:39:05 -0700 | [diff] [blame] | 118 | |
Chris Craik | 3e68f61 | 2015-01-21 17:49:27 -0800 | [diff] [blame] | 119 | if (mView == null) { |
| 120 | throw new IllegalStateException("failed to inflate test content"); |
| 121 | } |
| 122 | |
Antonio Calabrese | 5840eaf | 2014-07-22 12:39:05 -0700 | [diff] [blame] | 123 | if (mViewInitializer != null) { |
Chris Craik | ab53a56 | 2015-06-12 15:13:50 -0700 | [diff] [blame] | 124 | mViewInitializer.initializeView(mView); |
Antonio Calabrese | 5840eaf | 2014-07-22 12:39:05 -0700 | [diff] [blame] | 125 | } |
Chris Craik | ab53a56 | 2015-06-12 15:13:50 -0700 | [diff] [blame] | 126 | |
| 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 Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 130 | |
Chris Craik | 3e68f61 | 2015-01-21 17:49:27 -0800 | [diff] [blame] | 131 | DrawCounterListener onDrawListener = new DrawCounterListener(drawCountDelay); |
Antonio Calabrese | f2330d5 | 2014-06-24 15:30:49 -0700 | [diff] [blame] | 132 | |
| 133 | mView.getViewTreeObserver().addOnPreDrawListener(onDrawListener); |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 134 | |
| 135 | mView.postInvalidate(); |
| 136 | } |
| 137 | } |
| 138 | |
| 139 | private class DrawCounterListener implements ViewTreeObserver.OnPreDrawListener { |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 140 | private int mCurrentDraws = 0; |
Antonio Calabrese | 5933003 | 2014-07-15 15:49:39 -0700 | [diff] [blame] | 141 | private int mExtraDraws; |
| 142 | |
| 143 | public DrawCounterListener(int extraDraws) { |
| 144 | mExtraDraws = extraDraws; |
| 145 | } |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 146 | |
| 147 | @Override |
| 148 | public boolean onPreDraw() { |
Chris Craik | 2f7a2f9 | 2015-03-20 15:52:58 -0700 | [diff] [blame] | 149 | |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 150 | mCurrentDraws++; |
Antonio Calabrese | 5933003 | 2014-07-15 15:49:39 -0700 | [diff] [blame] | 151 | if (mCurrentDraws < MIN_NUMBER_OF_DRAWS + mExtraDraws) { |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 152 | mView.postInvalidate(); |
| 153 | } else { |
| 154 | synchronized (mLock) { |
Chris Craik | ab53a56 | 2015-06-12 15:13:50 -0700 | [diff] [blame] | 155 | mLock.set(mViewWrapper.getLeft(), mViewWrapper.getTop()); |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 156 | mLock.notify(); |
| 157 | } |
Antonio Calabrese | f2330d5 | 2014-06-24 15:30:49 -0700 | [diff] [blame] | 158 | mView.getViewTreeObserver().removeOnPreDrawListener(this); |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 159 | } |
| 160 | return true; |
| 161 | } |
Antonio Calabrese | 16ac3c8 | 2014-06-12 13:58:58 -0700 | [diff] [blame] | 162 | } |
| 163 | } |