package com.openfeint.internal.ui;
import java.util.concurrent.atomic.AtomicBoolean;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.openfeint.api.R;
import com.openfeint.internal.Util;
public class NativeBrowser extends Activity {
public static final String INTENT_ARG_PREFIX = "com.openfeint.internal.ui.NativeBrowser.argument.";
private WebView mWebView;
private Handler mHandler;
private Runnable mTimeoutWatchdog;
private AtomicBoolean mFinished = new AtomicBoolean(false);
public final class JSInterface {
public void returnValue(final String returnValue) {
runOnUiThread(new Runnable() {
public void run() {
if (mFinished.compareAndSet(false, true)) {
Intent returnIntent = new Intent();
if (null != returnValue) { returnIntent.putExtra(INTENT_ARG_PREFIX + "result", returnValue); }
NativeBrowser.this.setResult(Activity.RESULT_OK, returnIntent);
NativeBrowser.this.finish();
}
}
});
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Util.setOrientation(this);
// cheat, and use the existing layout
setContentView(R.layout.of_nativebrowser);
final Bundle extras = this.getIntent().getExtras();
final String src = extras.getString(INTENT_ARG_PREFIX + "src");
final String timeout = extras.getString(INTENT_ARG_PREFIX + "timeout");
// Setup WebView
mWebView = (WebView) findViewById(R.id.nativebrowser);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JSInterface(), "NativeBrowser");
mWebView.setWebViewClient(new WebViewClient() {
private void clearTimeout() {
if (mHandler != null && mTimeoutWatchdog != null) {
mHandler.removeCallbacks(mTimeoutWatchdog);
mHandler = null;
mTimeoutWatchdog = null;
}
}
@Override public void onPageFinished(WebView view, String url) {
clearTimeout();
super.onPageFinished(view, url);
}
@Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
clearTimeout();
super.onReceivedError(view, errorCode, description, failingUrl);
Intent returnIntent = new Intent();
returnIntent.putExtra(INTENT_ARG_PREFIX + "failed", true);
returnIntent.putExtra(INTENT_ARG_PREFIX + "failure_code", errorCode);
returnIntent.putExtra(INTENT_ARG_PREFIX + "failure_desc", description);
NativeBrowser.this.setResult(Activity.RESULT_OK, returnIntent);
NativeBrowser.this.finish();
}
});
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.loadUrl(src);
if (timeout != null) {
mHandler = new Handler();
mTimeoutWatchdog = new Runnable() {
public void run() {
if (mFinished.compareAndSet(false, true)) {
Intent returnIntent = new Intent();
returnIntent.putExtra(INTENT_ARG_PREFIX + "failed", true);
returnIntent.putExtra(INTENT_ARG_PREFIX + "failure_code", 0);
returnIntent.putExtra(INTENT_ARG_PREFIX + "failure_desc", "Timeout");
NativeBrowser.this.setResult(Activity.RESULT_OK, returnIntent);
NativeBrowser.this.finish();
}
}
};
mHandler.postDelayed(mTimeoutWatchdog, Integer.parseInt(timeout));
}
}
}