package com.uc.webkit.test;
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.uc.webkit.WebChromeClient;
import com.uc.webkit.WebView;
import com.uc.webkit.WebViewClient;
import com.uc.webkit.utils.WebConfiguration;
import com.uc.webkit.utils.WebViewFPS;
public class BrowserActivity extends Activity {
public static final String LOG_TAG = "BrowserActivity";
public static final boolean DEBUG = false;
public static final boolean ENABLE_HW_ACCLERATION = true;
public static final boolean ENABLE_ADAPT_SCREEN = false;
public static final boolean ENABLE_AD_BLOCK = false;
public static String[] TEST_URLS = new String[] {
"Put your test urls in '/sdcard/test_urls.config'!!!",
"http://www.baidu.com",
"http://www.g.cn",
"http://www.hao123.com",
"http://info.3g.qq.com/",
"http://3g.sina.com",
"http://www.ifanr.com",
"http://www.cnbeta.com",
"http://www.163.com",
"http://www.sina.com.cn",
"http://www.craftymind.com/factory/guimark3/bitmap/GM3_JS_Bitmap.html",
"http://www.craftymind.com/factory/guimark3/compute/GM3_JS_Compute.html",
"http://www.craftymind.com/factory/guimark3/vector/GM3_JS_Vector.html",
"http://www.cocos2d-x.org/html5-samples/samples/games/MoonWarriors/index.html",
"http://ie.microsoft.com/testdrive/performance/fishietank/",
};
private MyWebViewClient mWebViewClient;
private MyWebChromeClient mWebViewChromeClient;
private WebView mWebView;
private final List<WebView> mWebViews = new ArrayList<WebView>();
private ListView mUrlListView;
private View mContentView;
private int mOrientation;
private boolean mFirstWebView = true;
private boolean mFullScreen;
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mWebView != null) {
mWebView.destroy();
mWebView = null;
}
if (mUrlListView != null) {
System.exit(0);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// Load the library first for native debugging
try {
System.loadLibrary("webviewuc");
System.loadLibrary("webviewuc_plat_support");
} catch (Exception e) {
Log.e(LOG_TAG, "Load libwebviewuc.so failed!");
}
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_PROGRESS);
mOrientation = getResources().getConfiguration().orientation;
// Remove background and set window as Opaque to avoid additional glClear in OpenGLRenderer
getWindow().setFormat(PixelFormat.OPAQUE);
getWindow().setBackgroundDrawable(null);
// Enable method trace
// TraceHelper.ENABLE = true;
// Setup hardware acceleration
if (ENABLE_HW_ACCLERATION) {
final int FLAG_HARDWARE_ACCELERATED = 0x01000000;
getWindow().setFlags(FLAG_HARDWARE_ACCELERATED, FLAG_HARDWARE_ACCELERATED);
}
String url = getUrlFromIntent(this.getIntent());
if (url == null || url.length() == 0) {
// Try to read test urls from sdcard/test_urls.config
final WebConfiguration testUrls = new WebConfiguration(WebConfiguration.TEST_URLS_CONFIG);
if (testUrls.isValid()) {
TEST_URLS = testUrls.getLines();
}
mUrlListView = new ListView(this);
mUrlListView.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, TEST_URLS));
mUrlListView.setTextFilterEnabled(true);
mUrlListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
final String url = TEST_URLS[position];
if (mFirstWebView) {
openFirstWebView(url);
} else {
openNewWebView(url);
}
}
});
setContentView(mUrlListView);
} else {
// Start by TestActivity
Toast.makeText(this, "intent - " + url, Toast.LENGTH_SHORT).show();
openFirstWebView(url);
}
}
private static String getUrlFromIntent(Intent intent) {
return intent != null ? intent.getDataString() : null;
}
private void openFirstWebView(String url) {
try {
mWebViewClient = new MyWebViewClient();
mWebViewChromeClient = new MyWebChromeClient();
openNewWebView(url);
} catch (Throwable t) {
t.printStackTrace();
}
}
private void openNewWebView(String url) {
openNewWebView(url, false);
}
@SuppressLint("SetJavaScriptEnabled")
private void openNewWebView(String url, boolean background) {
WebView webview = new WebView(this);
mWebViews.add(webview);
webview.setWebViewClient(mWebViewClient);
webview.setWebChromeClient(mWebViewChromeClient);
webview.getSettings().setJavaScriptEnabled(true);
// Context menu listener
webview.setOnCreateContextMenuListener(this);
if (url != null && url.length() > 0) {
Toast.makeText(this, "Load - " + url, Toast.LENGTH_SHORT).show();
webview.loadUrl(url);
}
if (!background) {
mWebView = webview;
setContentView(mWebView);
mWebView.requestFocus();
}
mFirstWebView = false;
}
private void closeCurrentWebView() {
closeWebView(mWebView);
}
private void closeWebView(WebView webView) {
if (mWebView == webView) {
WebView next = getNextOpenWebView(webView);
setContentView(next != null ? next : mUrlListView);
mWebView = next;
}
if (webView != null) {
webView.destroy();
mWebViews.remove(webView);
}
}
private void switchToWebView(int i) {
if (i >= 0 && i < mWebViews.size()) {
final WebView webView = mWebViews.get(i);
setContentView(webView);
mWebView = webView;
}
}
private void createEmptyWebView() {
if (mWebViews.size() == 1 && mContentView != mUrlListView) {
setContentView(mUrlListView);
mWebView = null;
return;
}
int i = 0;
String[] windowTitles = new String[mWebViews.size()];
for (WebView webView : mWebViews) {
final String title = webView.getTitle();
windowTitles[i++] = (title != null && title.length() > 0) ? title
: "No Title";
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("New Window");
builder.setItems(windowTitles, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dlg, int which) {
switchToWebView(which);
}
});
builder.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
setContentView(mUrlListView);
mWebView = null;
}
});
builder.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
AlertDialog dlgWindows = builder.create();
dlgWindows.show();
}
private WebView getNextOpenWebView(WebView webView) {
if (webView == null || mWebViews.size() == 1)
return null;
int idx = mWebViews.indexOf(webView);
int nextIdx = -1;
if (idx == 0)
nextIdx = 1;
else
nextIdx = idx - 1;
return mWebViews.get(nextIdx);
}
@SuppressWarnings("deprecation")
private void setTitleAndLogo(View view, Bitmap logo) {
if (view instanceof WebView) {
final WebView webview = (WebView) view;
final String title = webview.getTitle();
if (title != null && title.length() > 0)
BrowserActivity.this.setTitle(title);
else
BrowserActivity.this.setTitle(webview.getUrl());
if (logo == null)
logo = webview.getFavicon();
if (logo != null)
getActionBar().setLogo(new BitmapDrawable(logo));
else
getActionBar().setLogo(R.drawable.ic_launcher);
} else {
setTitle(R.string.app_name);
getActionBar().setLogo(R.drawable.ic_launcher);
}
}
@Override
public void setContentView(View view) {
if (mWebView != null)
mWebView.onPause();
setTitleAndLogo(view, null);
mContentView = view;
super.setContentView(view);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
if (mWebView != null && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
if (mContentView == mWebView && mUrlListView != null) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Close Window");
builder.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
closeCurrentWebView();
}
});
builder.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
AlertDialog dlgWindows = builder.create();
dlgWindows.show();
return true;
}
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (mFullScreen) {
this.getMenuInflater().inflate(R.menu.menu_fullscreen, menu);
} else {
this.getMenuInflater().inflate(R.menu.menu, menu);
}
return true;
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
menu.add(Menu.NONE, R.id.menu_id_fullscreen, 0, R.string.mi_fullscreen);
menu.add(Menu.NONE, R.id.menu_id_back, 0, R.string.mi_back);
menu.add(Menu.NONE, R.id.menu_id_forward, 0, R.string.mi_forward);
menu.add(Menu.NONE, R.id.menu_id_reload, 0, R.string.mi_reload);
menu.add(Menu.NONE, R.id.menu_id_new, 0, R.string.mi_new);
menu.add(Menu.NONE, R.id.menu_id_close, 0, R.string.mi_close);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
if (hasFocus)
fullscreen(mFullScreen);
super.onWindowFocusChanged(hasFocus);
}
private void fullscreen(boolean enable) {
final Window win = getWindow();
final WindowManager.LayoutParams winParams = win.getAttributes();
final int bits = WindowManager.LayoutParams.FLAG_FULLSCREEN;
final ActionBar ab = this.getActionBar();
if (enable) {
if (ab != null)
ab.hide();
winParams.flags |= bits;
} else {
if (ab != null)
ab.show();
winParams.flags &= ~bits;
}
win.setAttributes(winParams);
if (enable) {
final int SYSTEM_UI_FLAG_IMMERSIVE_STICKY = 0x00001000;
mContentView
.setSystemUiVisibility(Build.VERSION.SDK_INT >= 19 ? View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| SYSTEM_UI_FLAG_IMMERSIVE_STICKY
: View.SYSTEM_UI_FLAG_LOW_PROFILE);
}
mFullScreen = enable;
invalidateOptionsMenu();
}
@Override
public boolean onMenuItemSelected(int featureID, MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_id_back:
if (mWebView != null && mWebView.canGoBack())
mWebView.goBack();
return true;
case R.id.menu_id_forward:
if (mWebView != null && mWebView.canGoForward())
mWebView.goForward();
return true;
case R.id.menu_id_reload:
if (mWebView != null) {
mWebView.reload();
mWebView.requestFocus();
}
return true;
case R.id.menu_id_new:
if (mUrlListView != null && mWebViews.size() > 0) {
createEmptyWebView();
}
return true;
case R.id.menu_id_close:
if (mWebView != null) {
if (mUrlListView != null) {
closeCurrentWebView();
} else {
mWebView.destroy();
finish();
}
}
return true;
case R.id.menu_id_fullscreen:
fullscreen(!mFullScreen);
return true;
case R.id.menu_id_fps:
WebViewFPS.ENABLE = !WebViewFPS.ENABLE;
WebViewFPS.ENABLE_GL = WebViewFPS.ENABLE;
return true;
/*
* case R.id.menu_id_fontsize: if (mWebView != null)
* adjustFontSize(); return true; case R.id.menu_id_fps:
* WebViewFPS.ENABLE = !WebViewFPS.ENABLE; WebViewFPS.ENABLE_GL =
* WebViewFPS.ENABLE;
* UCMobileWebKit.setEnableGLFps(WebViewFPS.ENABLE_GL,
* WebViewFPS.ENABLE_GL_EX, WebViewFPS.ENABLE_GL_CANVAS,
* WebViewFPS.ENABLE_GL_AUTO_REDRAW); return true; case
* R.id.menu_id_fps_ex: WebViewFPS.ENABLE_GL_EX =
* !WebViewFPS.ENABLE_GL_EX;
* UCMobileWebKit.setEnableGLFps(WebViewFPS.ENABLE_GL,
* WebViewFPS.ENABLE_GL_EX, WebViewFPS.ENABLE_GL_CANVAS,
* WebViewFPS.ENABLE_GL_AUTO_REDRAW); return true; case
* R.id.menu_id_fps_canvas: WebViewFPS.ENABLE_GL_CANVAS =
* !WebViewFPS.ENABLE_GL_CANVAS;
* UCMobileWebKit.setEnableGLFps(WebViewFPS.ENABLE_GL,
* WebViewFPS.ENABLE_GL_EX, WebViewFPS.ENABLE_GL_CANVAS,
* WebViewFPS.ENABLE_GL_AUTO_REDRAW); return true; case
* R.id.menu_id_dump_tile_textures_base:
* UCMobileWebKit.dumpTileTextures(true); return true; case
* R.id.menu_id_dump_tile_textures_layer:
* UCMobileWebKit.dumpTileTextures(false); return true; case
* R.id.menu_id_set_draw_base: UCMobileWebKit.ENABLE_DRAW_BASE =
* !UCMobileWebKit.ENABLE_DRAW_BASE;
* UCMobileWebKit.setDrawLayer(UCMobileWebKit.ENABLE_DRAW_BASE,
* UCMobileWebKit.ENABLE_DRAW_LAYER); return true; case
* R.id.menu_id_set_draw_layer: UCMobileWebKit.ENABLE_DRAW_LAYER =
* !UCMobileWebKit.ENABLE_DRAW_LAYER;
* UCMobileWebKit.setDrawLayer(UCMobileWebKit.ENABLE_DRAW_BASE,
* UCMobileWebKit.ENABLE_DRAW_LAYER); return true; case
* R.id.menu_id_debug_missing_region:
* UCMobileWebKit.ENABLE_DEBUG_MISSING_REGION =
* !UCMobileWebKit.ENABLE_DEBUG_MISSING_REGION;
* UCMobileWebKit.setDebugMissingRegion
* (UCMobileWebKit.ENABLE_DEBUG_MISSING_REGION); return true; case
* R.id.menu_id_debug_pure_color:
* UCMobileWebKit.ENABLE_DEBUG_PURE_COLOR =
* !UCMobileWebKit.ENABLE_DEBUG_PURE_COLOR;
* UCMobileWebKit.setDebugPureColor
* (UCMobileWebKit.ENABLE_DEBUG_PURE_COLOR); return true; case
* R.id.menu_id_debug_graphic_buffer:
* UCMobileWebKit.ENABLE_DEBUG_GRAPHIC_BUFFER =
* !UCMobileWebKit.ENABLE_DEBUG_GRAPHIC_BUFFER;
* UCMobileWebKit.setDebugGraphicBuffer
* (UCMobileWebKit.ENABLE_DEBUG_GRAPHIC_BUFFER); return true; case
* R.id.menu_id_autodraw: WebViewFPS.ENABLE_GL_AUTO_REDRAW =
* !WebViewFPS.ENABLE_GL_AUTO_REDRAW;
* UCMobileWebKit.setEnableGLFps(WebViewFPS.ENABLE_GL,
* WebViewFPS.ENABLE_GL_EX, WebViewFPS.ENABLE_GL_CANVAS,
* WebViewFPS.ENABLE_GL_AUTO_REDRAW); Toast.makeText(this,
* "GL AUTO_REDRAW = " + WebViewFPS.ENABLE_GL_AUTO_REDRAW,
* Toast.LENGTH_LONG).show(); return true; case R.id.menu_id_trace:
* TraceHelper.ENABLE = !TraceHelper.ENABLE; Toast.makeText(this,
* "TRACE = " + TraceHelper.ENABLE, Toast.LENGTH_LONG).show();
* return true; case R.id.menu_id_displaytree: if (mWebView != null)
* mWebView.dumpDisplayTree(); return true; case
* R.id.menu_id_rendertree: if (mWebView != null)
* mWebView.dumpRenderTree(true); return true;
*/
}
return super.onMenuItemSelected(featureID, item);
}
public class MyWebViewClient extends WebViewClient {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
BrowserActivity.this.setTitleAndLogo(view, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
BrowserActivity.this.setTitleAndLogo(view, null);
}
}
public class MyWebChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
setProgress(newProgress * 100);
}
}
}