Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2011 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 | |
| 17 | package com.test.tilebenchmark; |
| 18 | |
| 19 | import android.content.Context; |
Chris Craik | 55ad2ef | 2011-08-19 17:35:20 -0700 | [diff] [blame] | 20 | import android.os.CountDownTimer; |
Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 21 | import android.util.AttributeSet; |
Chris Craik | 555c55e | 2011-07-28 15:39:43 -0700 | [diff] [blame] | 22 | import android.util.Log; |
Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 23 | import android.webkit.WebView; |
| 24 | |
| 25 | import com.test.tilebenchmark.ProfileActivity.ProfileCallback; |
Chris Craik | 555c55e | 2011-07-28 15:39:43 -0700 | [diff] [blame] | 26 | import com.test.tilebenchmark.RunData.TileData; |
Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 27 | |
| 28 | public class ProfiledWebView extends WebView { |
| 29 | private int mSpeed; |
| 30 | |
Chris Craik | 55ad2ef | 2011-08-19 17:35:20 -0700 | [diff] [blame] | 31 | private boolean mIsTesting = false; |
| 32 | private boolean mIsScrolling = false; |
Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 33 | private ProfileCallback mCallback; |
Chris Craik | 555c55e | 2011-07-28 15:39:43 -0700 | [diff] [blame] | 34 | private long mContentInvalMillis; |
Chris Craik | 55ad2ef | 2011-08-19 17:35:20 -0700 | [diff] [blame] | 35 | private boolean mHadToBeForced = false; |
Chris Craik | 09a71e0 | 2011-12-12 18:03:29 -0800 | [diff] [blame] | 36 | private static final int LOAD_STALL_MILLIS = 2000; // nr of millis after load, |
Chris Craik | 55ad2ef | 2011-08-19 17:35:20 -0700 | [diff] [blame] | 37 | // before test is forced |
Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 38 | |
| 39 | public ProfiledWebView(Context context) { |
| 40 | super(context); |
| 41 | } |
| 42 | |
| 43 | public ProfiledWebView(Context context, AttributeSet attrs) { |
| 44 | super(context, attrs); |
| 45 | } |
| 46 | |
| 47 | public ProfiledWebView(Context context, AttributeSet attrs, int defStyle) { |
| 48 | super(context, attrs, defStyle); |
| 49 | } |
| 50 | |
| 51 | public ProfiledWebView(Context context, AttributeSet attrs, int defStyle, |
| 52 | boolean privateBrowsing) { |
| 53 | super(context, attrs, defStyle, privateBrowsing); |
| 54 | } |
| 55 | |
| 56 | @Override |
| 57 | protected void onDraw(android.graphics.Canvas canvas) { |
Chris Craik | 55ad2ef | 2011-08-19 17:35:20 -0700 | [diff] [blame] | 58 | if (mIsTesting && mIsScrolling) { |
Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 59 | if (canScrollVertically(1)) { |
| 60 | scrollBy(0, mSpeed); |
| 61 | } else { |
| 62 | stopScrollTest(); |
Chris Craik | 55ad2ef | 2011-08-19 17:35:20 -0700 | [diff] [blame] | 63 | mIsScrolling = false; |
Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 64 | } |
| 65 | } |
| 66 | super.onDraw(canvas); |
| 67 | } |
| 68 | |
| 69 | /* |
Chris Craik | 21555ab | 2011-07-21 11:52:19 -0700 | [diff] [blame] | 70 | * Called once the page is loaded to start scrolling for evaluating tiles. |
Chris Craik | 555c55e | 2011-07-28 15:39:43 -0700 | [diff] [blame] | 71 | * If autoScrolling isn't set, stop must be called manually. Before |
| 72 | * scrolling, invalidate all content and redraw it, measuring time taken. |
Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 73 | */ |
Chris Craik | 21555ab | 2011-07-21 11:52:19 -0700 | [diff] [blame] | 74 | public void startScrollTest(ProfileCallback callback, boolean autoScrolling) { |
Chris Craik | 55ad2ef | 2011-08-19 17:35:20 -0700 | [diff] [blame] | 75 | mIsScrolling = autoScrolling; |
Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 76 | mCallback = callback; |
Chris Craik | 55ad2ef | 2011-08-19 17:35:20 -0700 | [diff] [blame] | 77 | mIsTesting = false; |
Chris Craik | 55ad2ef | 2011-08-19 17:35:20 -0700 | [diff] [blame] | 78 | |
| 79 | if (autoScrolling) { |
| 80 | // after a while, force it to start even if the pages haven't swapped |
| 81 | new CountDownTimer(LOAD_STALL_MILLIS, LOAD_STALL_MILLIS) { |
| 82 | @Override |
| 83 | public void onTick(long millisUntilFinished) { |
| 84 | } |
| 85 | |
| 86 | @Override |
| 87 | public void onFinish() { |
Chris Craik | 09a71e0 | 2011-12-12 18:03:29 -0800 | [diff] [blame] | 88 | // invalidate all content, and kick off redraw |
| 89 | registerPageSwapCallback(); |
| 90 | discardAllTextures(); |
| 91 | invalidate(); |
| 92 | |
| 93 | mContentInvalMillis = System.currentTimeMillis(); |
Chris Craik | 55ad2ef | 2011-08-19 17:35:20 -0700 | [diff] [blame] | 94 | } |
| 95 | }.start(); |
| 96 | } |
Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 97 | } |
| 98 | |
| 99 | /* |
Chris Craik | 555c55e | 2011-07-28 15:39:43 -0700 | [diff] [blame] | 100 | * Called after the manual contentInvalidateAll, after the tiles have all |
| 101 | * been redrawn. |
| 102 | */ |
| 103 | @Override |
Chris Craik | d0051c0 | 2011-11-29 10:26:10 -0800 | [diff] [blame] | 104 | protected void pageSwapCallback(boolean startAnim) { |
Chris Craik | 555c55e | 2011-07-28 15:39:43 -0700 | [diff] [blame] | 105 | mContentInvalMillis = System.currentTimeMillis() - mContentInvalMillis; |
Chris Craik | d0051c0 | 2011-11-29 10:26:10 -0800 | [diff] [blame] | 106 | super.pageSwapCallback(startAnim); |
Chris Craik | 555c55e | 2011-07-28 15:39:43 -0700 | [diff] [blame] | 107 | Log.d("ProfiledWebView", "REDRAW TOOK " + mContentInvalMillis |
| 108 | + "millis"); |
Chris Craik | 55ad2ef | 2011-08-19 17:35:20 -0700 | [diff] [blame] | 109 | mIsTesting = true; |
Chris Craik | 555c55e | 2011-07-28 15:39:43 -0700 | [diff] [blame] | 110 | invalidate(); // ensure a redraw so that auto-scrolling can occur |
| 111 | tileProfilingStart(); |
| 112 | } |
| 113 | |
| 114 | /* |
Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 115 | * Called once the page has stopped scrolling |
| 116 | */ |
| 117 | public void stopScrollTest() { |
Chris Craik | 555c55e | 2011-07-28 15:39:43 -0700 | [diff] [blame] | 118 | tileProfilingStop(); |
Chris Craik | 55ad2ef | 2011-08-19 17:35:20 -0700 | [diff] [blame] | 119 | mIsTesting = false; |
Chris Craik | 21555ab | 2011-07-21 11:52:19 -0700 | [diff] [blame] | 120 | |
| 121 | if (mCallback == null) { |
| 122 | tileProfilingClear(); |
| 123 | return; |
| 124 | } |
Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 125 | |
Chris Craik | 555c55e | 2011-07-28 15:39:43 -0700 | [diff] [blame] | 126 | RunData data = new RunData(super.tileProfilingNumFrames()); |
Chris Craik | 55ad2ef | 2011-08-19 17:35:20 -0700 | [diff] [blame] | 127 | // record the time spent (before scrolling) rendering the page |
Chris Craik | 555c55e | 2011-07-28 15:39:43 -0700 | [diff] [blame] | 128 | data.singleStats.put(getResources().getString(R.string.render_millis), |
| 129 | (double)mContentInvalMillis); |
Chris Craik | 55ad2ef | 2011-08-19 17:35:20 -0700 | [diff] [blame] | 130 | // record if the page render timed out |
| 131 | Log.d("ProfiledWebView", "hadtobeforced = " + mHadToBeForced); |
| 132 | data.singleStats.put(getResources().getString(R.string.render_stalls), |
| 133 | mHadToBeForced ? 1.0 : 0.0); |
| 134 | mHadToBeForced = false; |
| 135 | |
Chris Craik | 555c55e | 2011-07-28 15:39:43 -0700 | [diff] [blame] | 136 | for (int frame = 0; frame < data.frames.length; frame++) { |
| 137 | data.frames[frame] = new TileData[ |
Chris Craik | 21555ab | 2011-07-21 11:52:19 -0700 | [diff] [blame] | 138 | tileProfilingNumTilesInFrame(frame)]; |
Chris Craik | 555c55e | 2011-07-28 15:39:43 -0700 | [diff] [blame] | 139 | for (int tile = 0; tile < data.frames[frame].length; tile++) { |
Chris Craik | 21555ab | 2011-07-21 11:52:19 -0700 | [diff] [blame] | 140 | int left = tileProfilingGetInt(frame, tile, "left"); |
| 141 | int top = tileProfilingGetInt(frame, tile, "top"); |
| 142 | int right = tileProfilingGetInt(frame, tile, "right"); |
| 143 | int bottom = tileProfilingGetInt(frame, tile, "bottom"); |
Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 144 | |
Chris Craik | 21555ab | 2011-07-21 11:52:19 -0700 | [diff] [blame] | 145 | boolean isReady = super.tileProfilingGetInt( |
| 146 | frame, tile, "isReady") == 1; |
| 147 | int level = tileProfilingGetInt(frame, tile, "level"); |
| 148 | |
| 149 | float scale = tileProfilingGetFloat(frame, tile, "scale"); |
| 150 | |
Chris Craik | 555c55e | 2011-07-28 15:39:43 -0700 | [diff] [blame] | 151 | data.frames[frame][tile] = data.new TileData(left, top, right, bottom, |
Chris Craik | 21555ab | 2011-07-21 11:52:19 -0700 | [diff] [blame] | 152 | isReady, level, scale); |
Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 153 | } |
| 154 | } |
Chris Craik | 555c55e | 2011-07-28 15:39:43 -0700 | [diff] [blame] | 155 | tileProfilingClear(); |
Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 156 | |
| 157 | mCallback.profileCallback(data); |
| 158 | } |
| 159 | |
| 160 | @Override |
| 161 | public void loadUrl(String url) { |
Chris Craik | 555c55e | 2011-07-28 15:39:43 -0700 | [diff] [blame] | 162 | if (!url.startsWith("http://") && !url.startsWith("file://")) { |
Chris Craik | 5888ec2 | 2011-07-15 16:24:37 -0700 | [diff] [blame] | 163 | url = "http://" + url; |
| 164 | } |
| 165 | super.loadUrl(url); |
| 166 | } |
| 167 | |
| 168 | public void setAutoScrollSpeed(int speedInt) { |
| 169 | mSpeed = speedInt; |
| 170 | } |
| 171 | } |