package com.qmusic.webdoengine;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Message;
import android.support.v4.app.FragmentActivity;
import android.util.Pair;
import android.webkit.ConsoleMessage;
import android.webkit.GeolocationPermissions.Callback;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.widget.EditText;
import com.qmusic.common.BConstants;
import com.qmusic.controls.dialogs.AlertDialogFragment;
import com.qmusic.controls.dialogs.SimpleFragmentDialogCallback;
import com.qmusic.uitls.BLog;
public class BWebChromeClient extends WebChromeClient {
static final String TAG = "BWebChromeClient";
BWebView webView;
public BWebChromeClient(BWebView webView) {
this.webView = webView;
}
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);
}
@Override
public void onCloseWindow(WebView window) {
super.onCloseWindow(window);
}
@Override
public void onGeolocationPermissionsShowPrompt(String origin, Callback callback) {
super.onGeolocationPermissionsShowPrompt(origin, callback);
}
@Override
public void onGeolocationPermissionsHidePrompt() {
super.onGeolocationPermissionsHidePrompt();
}
@Override
public boolean onJsAlert(final WebView view, final String url, final String message, final JsResult result) {
final BWebHost webHost = webView.getWebHost();
final FragmentActivity activity = webHost.getHost();
if (webHost == null || activity == null) {
return false;
}
AlertDialogFragment fragment = AlertDialogFragment.getInstance(null, message, android.R.string.ok);
fragment.setCallback(new SimpleFragmentDialogCallback() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
@Override
public void cancel() {
result.cancel();
}
});
fragment.show(activity.getSupportFragmentManager());
return true;
}
@Override
public boolean onJsBeforeUnload(final WebView view, final String url, final String message, final JsResult result) {
return super.onJsBeforeUnload(view, url, message, result);
}
@Override
public boolean onJsConfirm(final WebView view, final String url, final String message, final JsResult result) {
final BWebHost webHost = webView.getWebHost();
final FragmentActivity activity = webHost.getHost();
if (webHost == null || activity == null) {
return false;
}
AlertDialogFragment fragment = AlertDialogFragment.getInstance(null, message, android.R.string.ok, android.R.string.cancel);
fragment.setCallback(new SimpleFragmentDialogCallback() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
result.confirm();
} else {
result.cancel();
}
}
@Override
public void cancel() {
result.cancel();
}
});
fragment.show(activity.getSupportFragmentManager());
return true;
}
@Override
public boolean onJsPrompt(final WebView view, final String url, final String message, final String defaultValue, final JsPromptResult result) {
final BWebHost webHost = webView.getWebHost();
if (webHost != null) {
Pair<String, String> pair = new Pair<String, String>(message, defaultValue);
Object r = webHost.exec(BConstants.MSG_PAGE_JS_CALL, 0, pair);
if (r != null) {
result.confirm(r.toString());
return true;
}
}
final FragmentActivity activity = webHost.getHost();
if (activity != null) {
final JsPromptResult res = result;
AlertDialog.Builder dlg = new AlertDialog.Builder(activity);
dlg.setMessage(message);
final EditText input = new EditText(activity);
if (defaultValue != null) {
input.setText(defaultValue);
}
dlg.setView(input);
dlg.setCancelable(false);
dlg.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
String usertext = input.getText().toString();
res.confirm(usertext);
}
});
dlg.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
res.cancel();
}
});
dlg.show();
}
return true;
}
@Override
public void onProgressChanged(final WebView view, final int newProgress) {
super.onProgressChanged(view, newProgress);
BWebHost webHost = webView.getWebHost();
if (webHost != null) {
webHost.postMessage(BConstants.MSG_PAGE_UPDATE, 0, null);
}
}
@Override
public boolean onConsoleMessage(final ConsoleMessage consoleMessage) {
BLog.i(TAG, consoleMessage.sourceId() + "(" + consoleMessage.lineNumber() + "):" + consoleMessage.message());
return true;
// if open this, there will another log with the same output, one of
// which is from onConsoleMessage
// return super.onConsoleMessage(consoleMessage);
}
public void onConsoleMessage(final String message, final int lineNumber, final String sourceID) {
BLog.d(TAG, String.format("2-%s(%d):%s", sourceID, lineNumber, message));
}
}