15888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik/* 25888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik * Copyright (C) 2011 The Android Open Source Project 35888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik * 45888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 55888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik * you may not use this file except in compliance with the License. 65888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik * You may obtain a copy of the License at 75888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik * 85888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik * http://www.apache.org/licenses/LICENSE-2.0 95888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik * 105888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik * Unless required by applicable law or agreed to in writing, software 115888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 125888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik * See the License for the specific language governing permissions and 145888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik * limitations under the License. 155888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik */ 165888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 175888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craikpackage com.test.tilebenchmark; 185888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 195888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craikimport android.content.Context; 2055ad2efde9465a03271495ac9f21acd121c3744cChris Craikimport android.os.CountDownTimer; 215888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craikimport android.util.AttributeSet; 22555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craikimport android.util.Log; 233c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixonimport android.webkit.WebSettingsClassic; 245888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craikimport android.webkit.WebView; 253c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixonimport android.webkit.WebViewClassic; 26702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik 27702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craikimport java.util.ArrayList; 285888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 295888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craikimport com.test.tilebenchmark.ProfileActivity.ProfileCallback; 30555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craikimport com.test.tilebenchmark.RunData.TileData; 315888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 323c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixonpublic class ProfiledWebView extends WebView implements WebViewClassic.PageSwapDelegate { 33702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik private static final String LOGTAG = "ProfiledWebView"; 34702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik 355888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik private int mSpeed; 365888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 3755ad2efde9465a03271495ac9f21acd121c3744cChris Craik private boolean mIsTesting = false; 3855ad2efde9465a03271495ac9f21acd121c3744cChris Craik private boolean mIsScrolling = false; 395888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik private ProfileCallback mCallback; 40555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik private long mContentInvalMillis; 4109a71e073aaa8566d3ca5c4881a1411841189858Chris Craik private static final int LOAD_STALL_MILLIS = 2000; // nr of millis after load, 4255ad2efde9465a03271495ac9f21acd121c3744cChris Craik // before test is forced 434390c6b4a6b38b1c25fdf6b10b1310ff73c4f9ceChris Craik 444390c6b4a6b38b1c25fdf6b10b1310ff73c4f9ceChris Craik // ignore anim end events until this many millis after load 454390c6b4a6b38b1c25fdf6b10b1310ff73c4f9ceChris Craik private static final long ANIM_SAFETY_THRESHOLD = 200; 464390c6b4a6b38b1c25fdf6b10b1310ff73c4f9ceChris Craik private long mLoadTime; 474390c6b4a6b38b1c25fdf6b10b1310ff73c4f9ceChris Craik private long mAnimationTime; 485888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 495888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik public ProfiledWebView(Context context) { 505888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik super(context); 515888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik } 525888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 535888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik public ProfiledWebView(Context context, AttributeSet attrs) { 545888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik super(context, attrs); 555888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik } 565888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 575888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik public ProfiledWebView(Context context, AttributeSet attrs, int defStyle) { 585888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik super(context, attrs, defStyle); 595888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik } 605888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 615888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik public ProfiledWebView(Context context, AttributeSet attrs, int defStyle, 625888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik boolean privateBrowsing) { 635888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik super(context, attrs, defStyle, privateBrowsing); 645888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik } 655888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 66702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik private class JavaScriptInterface { 67702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik Context mContext; 68702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik 69702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik /** Instantiate the interface and set the context */ 70702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik JavaScriptInterface(Context c) { 71702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik mContext = c; 72702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik } 73702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik 74702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik public void animationComplete() { 75702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik mAnimationTime = System.currentTimeMillis(); 76702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik } 77702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik } 78702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik 79702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik public void init(Context c) { 803c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon WebSettingsClassic settings = getWebViewClassic().getSettings(); 81702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik settings.setJavaScriptEnabled(true); 82702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik settings.setSupportZoom(true); 83702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik settings.setEnableSmoothTransition(true); 84702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik settings.setBuiltInZoomControls(true); 85702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik settings.setLoadWithOverviewMode(true); 86702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik settings.setProperty("use_minimal_memory", "false"); // prefetch tiles, as browser does 87702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik addJavascriptInterface(new JavaScriptInterface(c), "Android"); 88702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik mAnimationTime = 0; 89702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik mLoadTime = 0; 90702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik } 91702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik 929e6fa17b475a537605f9673c3a065c28ea29bb91Chris Craik public void setUseMinimalMemory(boolean minimal) { 939e6fa17b475a537605f9673c3a065c28ea29bb91Chris Craik WebSettingsClassic settings = getWebViewClassic().getSettings(); 949e6fa17b475a537605f9673c3a065c28ea29bb91Chris Craik settings.setProperty("use_minimal_memory", minimal ? "true" : "false"); 959e6fa17b475a537605f9673c3a065c28ea29bb91Chris Craik } 969e6fa17b475a537605f9673c3a065c28ea29bb91Chris Craik 97702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik public void onPageFinished() { 98702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik mLoadTime = System.currentTimeMillis(); 99702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik } 100702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik 1015888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik @Override 1025888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik protected void onDraw(android.graphics.Canvas canvas) { 10355ad2efde9465a03271495ac9f21acd121c3744cChris Craik if (mIsTesting && mIsScrolling) { 1045888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik if (canScrollVertically(1)) { 1055888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik scrollBy(0, mSpeed); 1065888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik } else { 1075888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik stopScrollTest(); 10855ad2efde9465a03271495ac9f21acd121c3744cChris Craik mIsScrolling = false; 1095888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik } 1105888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik } 1115888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik super.onDraw(canvas); 1125888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik } 1135888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 1145888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik /* 11521555abad7ba5f5377052e2644974d3ce8c37869Chris Craik * Called once the page is loaded to start scrolling for evaluating tiles. 116555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik * If autoScrolling isn't set, stop must be called manually. Before 117555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik * scrolling, invalidate all content and redraw it, measuring time taken. 1185888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik */ 11921555abad7ba5f5377052e2644974d3ce8c37869Chris Craik public void startScrollTest(ProfileCallback callback, boolean autoScrolling) { 1205888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik mCallback = callback; 12155ad2efde9465a03271495ac9f21acd121c3744cChris Craik mIsTesting = false; 122702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik mIsScrolling = false; 1233c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon WebSettingsClassic settings = getWebViewClassic().getSettings(); 124702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik settings.setProperty("tree_updates", "0"); 125702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik 12655ad2efde9465a03271495ac9f21acd121c3744cChris Craik 12755ad2efde9465a03271495ac9f21acd121c3744cChris Craik if (autoScrolling) { 12855ad2efde9465a03271495ac9f21acd121c3744cChris Craik // after a while, force it to start even if the pages haven't swapped 12955ad2efde9465a03271495ac9f21acd121c3744cChris Craik new CountDownTimer(LOAD_STALL_MILLIS, LOAD_STALL_MILLIS) { 13055ad2efde9465a03271495ac9f21acd121c3744cChris Craik @Override 13155ad2efde9465a03271495ac9f21acd121c3744cChris Craik public void onTick(long millisUntilFinished) { 13255ad2efde9465a03271495ac9f21acd121c3744cChris Craik } 13355ad2efde9465a03271495ac9f21acd121c3744cChris Craik 13455ad2efde9465a03271495ac9f21acd121c3744cChris Craik @Override 13555ad2efde9465a03271495ac9f21acd121c3744cChris Craik public void onFinish() { 13609a71e073aaa8566d3ca5c4881a1411841189858Chris Craik // invalidate all content, and kick off redraw 137702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik Log.d("ProfiledWebView", 138702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik "kicking off test with callback registration, and tile discard..."); 1393c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon getWebViewClassic().discardAllTextures(); 14009a71e073aaa8566d3ca5c4881a1411841189858Chris Craik invalidate(); 141702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik mIsScrolling = true; 14209a71e073aaa8566d3ca5c4881a1411841189858Chris Craik mContentInvalMillis = System.currentTimeMillis(); 14355ad2efde9465a03271495ac9f21acd121c3744cChris Craik } 14455ad2efde9465a03271495ac9f21acd121c3744cChris Craik }.start(); 145702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik } else { 146702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik mIsTesting = true; 1473c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon getWebViewClassic().tileProfilingStart(); 14855ad2efde9465a03271495ac9f21acd121c3744cChris Craik } 1495888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik } 1505888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 1515888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik /* 152555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik * Called after the manual contentInvalidateAll, after the tiles have all 153555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik * been redrawn. 1543c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon * From PageSwapDelegate. 155555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik */ 156555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik @Override 1573c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon public void onPageSwapOccurred(boolean startAnim) { 158702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik if (!mIsTesting && mIsScrolling) { 159702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik // kick off testing 160702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik mContentInvalMillis = System.currentTimeMillis() - mContentInvalMillis; 161702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik Log.d("ProfiledWebView", "REDRAW TOOK " + mContentInvalMillis + "millis"); 162702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik mIsTesting = true; 163702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik invalidate(); // ensure a redraw so that auto-scrolling can occur 1643c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon getWebViewClassic().tileProfilingStart(); 165702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik } 166702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik } 167702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik 168702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik private double animFramerate() { 1693c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon WebSettingsClassic settings = getWebViewClassic().getSettings(); 170702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik String updatesString = settings.getProperty("tree_updates"); 171702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik int updates = (updatesString == null) ? -1 : Integer.parseInt(updatesString); 172702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik 1734390c6b4a6b38b1c25fdf6b10b1310ff73c4f9ceChris Craik long animationTime; 1744390c6b4a6b38b1c25fdf6b10b1310ff73c4f9ceChris Craik if (mAnimationTime == 0 || mAnimationTime - mLoadTime < ANIM_SAFETY_THRESHOLD) { 175702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik animationTime = System.currentTimeMillis() - mLoadTime; 176702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik } else { 177702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik animationTime = mAnimationTime - mLoadTime; 178702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik } 179702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik 1804390c6b4a6b38b1c25fdf6b10b1310ff73c4f9ceChris Craik return updates * 1000.0 / animationTime; 181702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik } 182702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik 183702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik public void setDoubleBuffering(boolean useDoubleBuffering) { 1843c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon WebSettingsClassic settings = getWebViewClassic().getSettings(); 185702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik settings.setProperty("use_double_buffering", useDoubleBuffering ? "true" : "false"); 186555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik } 187555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik 188555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik /* 1895888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik * Called once the page has stopped scrolling 1905888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik */ 1915888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik public void stopScrollTest() { 1923c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon getWebViewClassic().tileProfilingStop(); 19355ad2efde9465a03271495ac9f21acd121c3744cChris Craik mIsTesting = false; 19421555abad7ba5f5377052e2644974d3ce8c37869Chris Craik 19521555abad7ba5f5377052e2644974d3ce8c37869Chris Craik if (mCallback == null) { 1963c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon getWebViewClassic().tileProfilingClear(); 19721555abad7ba5f5377052e2644974d3ce8c37869Chris Craik return; 19821555abad7ba5f5377052e2644974d3ce8c37869Chris Craik } 1995888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 2003c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon RunData data = new RunData(getWebViewClassic().tileProfilingNumFrames()); 20155ad2efde9465a03271495ac9f21acd121c3744cChris Craik // record the time spent (before scrolling) rendering the page 202555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik data.singleStats.put(getResources().getString(R.string.render_millis), 203555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik (double)mContentInvalMillis); 204702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik 205702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik // record framerate 206702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik double framerate = animFramerate(); 207702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik Log.d(LOGTAG, "anim framerate was "+framerate); 208702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik data.singleStats.put(getResources().getString(R.string.animation_framerate), 209702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik framerate); 21055ad2efde9465a03271495ac9f21acd121c3744cChris Craik 211555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik for (int frame = 0; frame < data.frames.length; frame++) { 212555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik data.frames[frame] = new TileData[ 2133c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon getWebViewClassic().tileProfilingNumTilesInFrame(frame)]; 214555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik for (int tile = 0; tile < data.frames[frame].length; tile++) { 2153c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon int left = getWebViewClassic().tileProfilingGetInt(frame, tile, "left"); 2163c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon int top = getWebViewClassic().tileProfilingGetInt(frame, tile, "top"); 2173c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon int right = getWebViewClassic().tileProfilingGetInt(frame, tile, "right"); 2183c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon int bottom = getWebViewClassic().tileProfilingGetInt(frame, tile, "bottom"); 21921555abad7ba5f5377052e2644974d3ce8c37869Chris Craik 2203c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon boolean isReady = getWebViewClassic().tileProfilingGetInt( 22121555abad7ba5f5377052e2644974d3ce8c37869Chris Craik frame, tile, "isReady") == 1; 2223c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon int level = getWebViewClassic().tileProfilingGetInt(frame, tile, "level"); 22321555abad7ba5f5377052e2644974d3ce8c37869Chris Craik 2243c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon float scale = getWebViewClassic().tileProfilingGetFloat(frame, tile, "scale"); 2255888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 226555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik data.frames[frame][tile] = data.new TileData(left, top, right, bottom, 22721555abad7ba5f5377052e2644974d3ce8c37869Chris Craik isReady, level, scale); 2285888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik } 2295888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik } 2303c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon getWebViewClassic().tileProfilingClear(); 2315888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 2325888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik mCallback.profileCallback(data); 2335888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik } 2345888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 2355888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik @Override 2365888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik public void loadUrl(String url) { 237702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik mAnimationTime = 0; 238702c6fdc4799593c16eb0051703e3bd62086ff42Chris Craik mLoadTime = 0; 239555c55ed65056e2236430f92e81c1fb6acd05dcdChris Craik if (!url.startsWith("http://") && !url.startsWith("file://")) { 2405888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik url = "http://" + url; 2415888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik } 2425888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik super.loadUrl(url); 2435888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik } 2445888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik 2455888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik public void setAutoScrollSpeed(int speedInt) { 2465888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik mSpeed = speedInt; 2475888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik } 2483c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon 2493c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon public WebViewClassic getWebViewClassic() { 2503c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon return WebViewClassic.fromWebView(this); 2513c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon } 2525888ec2b30d2c76de84e3b840bf286fa371ccb4fChris Craik} 253