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