PowerTestActivity.java revision 7c6efa13f129dbae5319f0981a430d4662f43354
17c6efa13f129dbae5319f0981a430d4662f43354Xia Wangpackage com.android.browserpowertest; 27c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 37c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.app.Activity; 47c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.app.ActivityThread; 57c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.graphics.Bitmap; 67c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.os.Bundle; 77c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.os.Handler; 87c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.os.Message; 97c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.util.Log; 107c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.view.ViewGroup; 117c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.webkit.WebChromeClient; 127c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.webkit.WebView; 137c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.webkit.WebViewClient; 147c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.webkit.WebSettings.LayoutAlgorithm; 157c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.widget.LinearLayout; 167c6efa13f129dbae5319f0981a430d4662f43354Xia Wangimport android.widget.LinearLayout.LayoutParams; 177c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 187c6efa13f129dbae5319f0981a430d4662f43354Xia Wangpublic class PowerTestActivity extends Activity { 197c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 207c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public static final String LOGTAG = "PowerTestActivity"; 217c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public static final String PARAM_URL = "URL"; 227c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public static final String PARAM_TIMEOUT = "Timeout"; 237c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public static final int RESULT_TIMEOUT = 0xDEAD; 247c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public static final int MSG_TIMEOUT = 0xC001; 257c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public static final int MSG_NAVIGATE = 0xC002; 267c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public static final String MSG_NAV_URL = "url"; 277c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public static final String MSG_NAV_LOGTIME = "logtime"; 287c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 297c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private WebView webView; 307c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private SimpleWebViewClient webViewClient; 317c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private SimpleChromeClient chromeClient; 327c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private Handler handler; 337c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private boolean timeoutFlag; 347c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private boolean logTime; 357c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private boolean pageDone; 367c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private Object pageDoneLock; 377c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private int pageStartCount; 387c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private int manualDelay; 397c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private long startTime; 407c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private long pageLoadTime; 417c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private PageDoneRunner pageDoneRunner = new PageDoneRunner(); 427c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 437c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public PowerTestActivity() { 447c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 457c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 467c6efa13f129dbae5319f0981a430d4662f43354Xia Wang @Override 477c6efa13f129dbae5319f0981a430d4662f43354Xia Wang protected void onCreate(Bundle savedInstanceState) { 487c6efa13f129dbae5319f0981a430d4662f43354Xia Wang super.onCreate(savedInstanceState); 497c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 507c6efa13f129dbae5319f0981a430d4662f43354Xia Wang Log.v(LOGTAG, "onCreate, inst=" + Integer.toHexString(hashCode())); 517c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 527c6efa13f129dbae5319f0981a430d4662f43354Xia Wang LinearLayout contentView = new LinearLayout(this); 537c6efa13f129dbae5319f0981a430d4662f43354Xia Wang contentView.setOrientation(LinearLayout.VERTICAL); 547c6efa13f129dbae5319f0981a430d4662f43354Xia Wang setContentView(contentView); 557c6efa13f129dbae5319f0981a430d4662f43354Xia Wang setTitle("Idle"); 567c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 577c6efa13f129dbae5319f0981a430d4662f43354Xia Wang webView = new WebView(this); 587c6efa13f129dbae5319f0981a430d4662f43354Xia Wang webView.getSettings().setJavaScriptEnabled(true); 597c6efa13f129dbae5319f0981a430d4662f43354Xia Wang webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false); 607c6efa13f129dbae5319f0981a430d4662f43354Xia Wang webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NORMAL); 617c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 627c6efa13f129dbae5319f0981a430d4662f43354Xia Wang webViewClient = new SimpleWebViewClient(); 637c6efa13f129dbae5319f0981a430d4662f43354Xia Wang chromeClient = new SimpleChromeClient(); 647c6efa13f129dbae5319f0981a430d4662f43354Xia Wang webView.setWebViewClient(webViewClient); 657c6efa13f129dbae5319f0981a430d4662f43354Xia Wang webView.setWebChromeClient(chromeClient); 667c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 677c6efa13f129dbae5319f0981a430d4662f43354Xia Wang contentView.addView(webView, new LayoutParams( 687c6efa13f129dbae5319f0981a430d4662f43354Xia Wang ViewGroup.LayoutParams.FILL_PARENT, 697c6efa13f129dbae5319f0981a430d4662f43354Xia Wang ViewGroup.LayoutParams.FILL_PARENT, 0.0f)); 707c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 717c6efa13f129dbae5319f0981a430d4662f43354Xia Wang handler = new Handler() { 727c6efa13f129dbae5319f0981a430d4662f43354Xia Wang @Override 737c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public void handleMessage(Message msg) { 747c6efa13f129dbae5319f0981a430d4662f43354Xia Wang switch (msg.what) { 757c6efa13f129dbae5319f0981a430d4662f43354Xia Wang case MSG_TIMEOUT: 767c6efa13f129dbae5319f0981a430d4662f43354Xia Wang handleTimeout(); 777c6efa13f129dbae5319f0981a430d4662f43354Xia Wang return; 787c6efa13f129dbae5319f0981a430d4662f43354Xia Wang case MSG_NAVIGATE: 797c6efa13f129dbae5319f0981a430d4662f43354Xia Wang manualDelay = msg.arg2; 807c6efa13f129dbae5319f0981a430d4662f43354Xia Wang navigate(msg.getData().getString(MSG_NAV_URL), msg.arg1); 817c6efa13f129dbae5319f0981a430d4662f43354Xia Wang logTime = msg.getData().getBoolean(MSG_NAV_LOGTIME); 827c6efa13f129dbae5319f0981a430d4662f43354Xia Wang return; 837c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 847c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 857c6efa13f129dbae5319f0981a430d4662f43354Xia Wang }; 867c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 877c6efa13f129dbae5319f0981a430d4662f43354Xia Wang pageDoneLock = new Object(); 887c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 897c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 907c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public void reset() { 917c6efa13f129dbae5319f0981a430d4662f43354Xia Wang synchronized (pageDoneLock) { 927c6efa13f129dbae5319f0981a430d4662f43354Xia Wang pageDone = false; 937c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 947c6efa13f129dbae5319f0981a430d4662f43354Xia Wang timeoutFlag = false; 957c6efa13f129dbae5319f0981a430d4662f43354Xia Wang pageStartCount = 0; 967c6efa13f129dbae5319f0981a430d4662f43354Xia Wang chromeClient.resetJsTimeout(); 977c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 987c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 997c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private void navigate(String url, int timeout) { 1007c6efa13f129dbae5319f0981a430d4662f43354Xia Wang if(url == null) { 1017c6efa13f129dbae5319f0981a430d4662f43354Xia Wang Log.v(LOGTAG, "URL is null, cancelling..."); 1027c6efa13f129dbae5319f0981a430d4662f43354Xia Wang finish(); 1037c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1047c6efa13f129dbae5319f0981a430d4662f43354Xia Wang webView.stopLoading(); 1057c6efa13f129dbae5319f0981a430d4662f43354Xia Wang if(logTime) { 1067c6efa13f129dbae5319f0981a430d4662f43354Xia Wang webView.clearCache(true); 1077c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1087c6efa13f129dbae5319f0981a430d4662f43354Xia Wang startTime = System.currentTimeMillis(); 1097c6efa13f129dbae5319f0981a430d4662f43354Xia Wang Log.v(LOGTAG, "Navigating to URL: " + url); 1107c6efa13f129dbae5319f0981a430d4662f43354Xia Wang webView.loadUrl(url); 1117c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 1127c6efa13f129dbae5319f0981a430d4662f43354Xia Wang if(timeout != 0) { 1137c6efa13f129dbae5319f0981a430d4662f43354Xia Wang //set a timer with specified timeout (in ms) 1147c6efa13f129dbae5319f0981a430d4662f43354Xia Wang handler.sendMessageDelayed(handler.obtainMessage(MSG_TIMEOUT), 1157c6efa13f129dbae5319f0981a430d4662f43354Xia Wang timeout); 1167c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1177c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1187c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 1197c6efa13f129dbae5319f0981a430d4662f43354Xia Wang @Override 1207c6efa13f129dbae5319f0981a430d4662f43354Xia Wang protected void onDestroy() { 1217c6efa13f129dbae5319f0981a430d4662f43354Xia Wang super.onDestroy(); 1227c6efa13f129dbae5319f0981a430d4662f43354Xia Wang Log.v(LOGTAG, "onDestroy, inst=" + Integer.toHexString(hashCode())); 1237c6efa13f129dbae5319f0981a430d4662f43354Xia Wang webView.clearCache(true); 1247c6efa13f129dbae5319f0981a430d4662f43354Xia Wang webView.destroy(); 1257c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1267c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 1277c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private boolean isPageDone() { 1287c6efa13f129dbae5319f0981a430d4662f43354Xia Wang synchronized (pageDoneLock) { 1297c6efa13f129dbae5319f0981a430d4662f43354Xia Wang return pageDone; 1307c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1317c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1327c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 1337c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private void setPageDone(boolean pageDone) { 1347c6efa13f129dbae5319f0981a430d4662f43354Xia Wang synchronized (pageDoneLock) { 1357c6efa13f129dbae5319f0981a430d4662f43354Xia Wang this.pageDone = pageDone; 1367c6efa13f129dbae5319f0981a430d4662f43354Xia Wang pageDoneLock.notifyAll(); 1377c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1387c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1397c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 1407c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private void handleTimeout() { 1417c6efa13f129dbae5319f0981a430d4662f43354Xia Wang int progress = webView.getProgress(); 1427c6efa13f129dbae5319f0981a430d4662f43354Xia Wang webView.stopLoading(); 1437c6efa13f129dbae5319f0981a430d4662f43354Xia Wang Log.v(LOGTAG, "Page timeout triggered, progress = " + progress); 1447c6efa13f129dbae5319f0981a430d4662f43354Xia Wang timeoutFlag = true; 1457c6efa13f129dbae5319f0981a430d4662f43354Xia Wang handler.postDelayed(pageDoneRunner, manualDelay); 1467c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1477c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 1487c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public boolean waitUntilDone() { 1497c6efa13f129dbae5319f0981a430d4662f43354Xia Wang validateNotAppThread(); 1507c6efa13f129dbae5319f0981a430d4662f43354Xia Wang synchronized (pageDoneLock) { 1517c6efa13f129dbae5319f0981a430d4662f43354Xia Wang while(!isPageDone()) { 1527c6efa13f129dbae5319f0981a430d4662f43354Xia Wang try { 1537c6efa13f129dbae5319f0981a430d4662f43354Xia Wang pageDoneLock.wait(); 1547c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } catch (InterruptedException ie) { 1557c6efa13f129dbae5319f0981a430d4662f43354Xia Wang //no-op 1567c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1577c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1587c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1597c6efa13f129dbae5319f0981a430d4662f43354Xia Wang return timeoutFlag; 1607c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1617c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 1627c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public Handler getHandler() { 1637c6efa13f129dbae5319f0981a430d4662f43354Xia Wang return handler; 1647c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1657c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 1667c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private final void validateNotAppThread() { 1677c6efa13f129dbae5319f0981a430d4662f43354Xia Wang if (ActivityThread.currentActivityThread() != null) { 1687c6efa13f129dbae5319f0981a430d4662f43354Xia Wang throw new RuntimeException( 1697c6efa13f129dbae5319f0981a430d4662f43354Xia Wang "This method can not be called from the main application thread"); 1707c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1717c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1727c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 1737c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public long getPageLoadTime() { 1747c6efa13f129dbae5319f0981a430d4662f43354Xia Wang return pageLoadTime; 1757c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1767c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 1777c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public boolean getPageError() { 1787c6efa13f129dbae5319f0981a430d4662f43354Xia Wang return webViewClient.getPageErrorFlag(); 1797c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1807c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 1817c6efa13f129dbae5319f0981a430d4662f43354Xia Wang class SimpleWebViewClient extends WebViewClient { 1827c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 1837c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private boolean pageErrorFlag = false; 1847c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 1857c6efa13f129dbae5319f0981a430d4662f43354Xia Wang @Override 1867c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public void onReceivedError(WebView view, int errorCode, String description, 1877c6efa13f129dbae5319f0981a430d4662f43354Xia Wang String failingUrl) { 1887c6efa13f129dbae5319f0981a430d4662f43354Xia Wang pageErrorFlag = true; 1897c6efa13f129dbae5319f0981a430d4662f43354Xia Wang Log.v(LOGTAG, "WebCore error: code=" + errorCode 1907c6efa13f129dbae5319f0981a430d4662f43354Xia Wang + ", description=" + description 1917c6efa13f129dbae5319f0981a430d4662f43354Xia Wang + ", url=" + failingUrl); 1927c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1937c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 1947c6efa13f129dbae5319f0981a430d4662f43354Xia Wang @Override 1957c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public void onPageStarted(WebView view, String url, Bitmap favicon) { 1967c6efa13f129dbae5319f0981a430d4662f43354Xia Wang pageStartCount++; 1977c6efa13f129dbae5319f0981a430d4662f43354Xia Wang Log.v(LOGTAG, "onPageStarted: " + url); 1987c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 1997c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 2007c6efa13f129dbae5319f0981a430d4662f43354Xia Wang @Override 2017c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public void onPageFinished(WebView view, String url) { 2027c6efa13f129dbae5319f0981a430d4662f43354Xia Wang Log.v(LOGTAG, "onPageFinished: " + url); 2037c6efa13f129dbae5319f0981a430d4662f43354Xia Wang // let handleTimeout take care of finishing the page 2047c6efa13f129dbae5319f0981a430d4662f43354Xia Wang if(!timeoutFlag) 2057c6efa13f129dbae5319f0981a430d4662f43354Xia Wang handler.postDelayed(new WebViewStatusChecker(), 500); 2067c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 2077c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 2087c6efa13f129dbae5319f0981a430d4662f43354Xia Wang // return true if the URL is not available or the page is down 2097c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public boolean getPageErrorFlag() { 2107c6efa13f129dbae5319f0981a430d4662f43354Xia Wang return pageErrorFlag; 2117c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 2127c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 2137c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 2147c6efa13f129dbae5319f0981a430d4662f43354Xia Wang class SimpleChromeClient extends WebChromeClient { 2157c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 2167c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private int timeoutCounter = 0; 2177c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 2187c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public void resetJsTimeout() { 2197c6efa13f129dbae5319f0981a430d4662f43354Xia Wang timeoutCounter = 0; 2207c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 2217c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 2227c6efa13f129dbae5319f0981a430d4662f43354Xia Wang @Override 2237c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public void onReceivedTitle(WebView view, String title) { 2247c6efa13f129dbae5319f0981a430d4662f43354Xia Wang PowerTestActivity.this.setTitle(title); 2257c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 2267c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 2277c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 2287c6efa13f129dbae5319f0981a430d4662f43354Xia Wang class WebViewStatusChecker implements Runnable { 2297c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 2307c6efa13f129dbae5319f0981a430d4662f43354Xia Wang private int initialStartCount; 2317c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 2327c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public WebViewStatusChecker() { 2337c6efa13f129dbae5319f0981a430d4662f43354Xia Wang initialStartCount = pageStartCount; 2347c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 2357c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 2367c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public void run() { 2377c6efa13f129dbae5319f0981a430d4662f43354Xia Wang if (initialStartCount == pageStartCount && !isPageDone()) { 2387c6efa13f129dbae5319f0981a430d4662f43354Xia Wang handler.removeMessages(MSG_TIMEOUT); 2397c6efa13f129dbae5319f0981a430d4662f43354Xia Wang webView.stopLoading(); 2407c6efa13f129dbae5319f0981a430d4662f43354Xia Wang handler.postDelayed(pageDoneRunner, manualDelay); 2417c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 2427c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 2437c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 2447c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 2457c6efa13f129dbae5319f0981a430d4662f43354Xia Wang class PageDoneRunner implements Runnable { 2467c6efa13f129dbae5319f0981a430d4662f43354Xia Wang 2477c6efa13f129dbae5319f0981a430d4662f43354Xia Wang public void run() { 2487c6efa13f129dbae5319f0981a430d4662f43354Xia Wang Log.v(LOGTAG, "Finishing URL: " + webView.getUrl()); 2497c6efa13f129dbae5319f0981a430d4662f43354Xia Wang pageLoadTime = System.currentTimeMillis() - startTime; 2507c6efa13f129dbae5319f0981a430d4662f43354Xia Wang setPageDone(true); 2517c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 2527c6efa13f129dbae5319f0981a430d4662f43354Xia Wang } 2537c6efa13f129dbae5319f0981a430d4662f43354Xia Wang} 254