package info.guardianproject.browser;
import info.guardianproject.browser.gecko.R;
import org.mozilla.gecko.GeckoView;
import org.mozilla.gecko.GeckoView.Browser;
import org.mozilla.gecko.GeckoView.PromptResult;
import org.mozilla.gecko.GeckoViewChrome;
import org.mozilla.gecko.GeckoViewContent;
import org.mozilla.gecko.PrefsHelper;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ClipData.Item;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.Toast;
public class MainActivity extends Activity {
private static final String LOGTAG = "GeckoBrowser";
GeckoView mGeckoView;
EditText mUrlBar;
private boolean mDoJavascript = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_main);
mGeckoView = (GeckoView) findViewById(R.id.gecko_view);
mGeckoView.setChromeDelegate(new MyGeckoViewChrome());
mGeckoView.setContentDelegate(new MyGeckoViewContent());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
MenuItem item = menu.findItem(R.id.actionViewLayout);
View view = item.getActionView();
mUrlBar = (EditText) view.findViewById(R.id.url_bar);
mUrlBar.setImeActionLabel("Go", KeyEvent.KEYCODE_ENTER);
mUrlBar.setOnEditorActionListener(new OnEditorActionListener(){
@Override
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
if (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)
{
String newUrl = OrwebUtil.smartUrlFilter(mUrlBar.getText().toString(), mDoJavascript);
mGeckoView.addBrowser(newUrl);
}
return false;
}
});
Button btnClear = (Button) view.findViewById(R.id.clear_button);
btnClear.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
mUrlBar.setText("");
}
});
/*
Button goButton = (Button) view.findViewById(R.id.go_button);
goButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
GeckoView.Browser browser = mGeckoView.getCurrentBrowser();
if (browser == null) {
browser = mGeckoView.addBrowser(mUrlBar.getText().toString());
} else {
browser.loadUrl(mUrlBar.getText().toString());
}
}
});*/
return true;
}
private void finishBrowser ()
{
for (Browser browser : mGeckoView.getBrowsers())
{
mGeckoView.removeBrowser(browser);
}
mGeckoView.destroy();
finish();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.action_exit:
finishBrowser();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onBackPressed() {
Browser selected = mGeckoView.getCurrentBrowser();
if (selected != null && selected.canGoBack()) {
selected.goBack();
} else {
moveTaskToBack(true);
}
}
private class MyGeckoViewChrome extends GeckoViewChrome {
@Override
public void onReady(GeckoView view) {
Log.i(LOGTAG, "Gecko is ready");
PrefsHelper.setPref("devtools.debugger.remote-enabled", false);
setProxyPrefs();
setPrivacyPrefs();
setCipherSuites();
setJavascriptEnabled(mDoJavascript);
setUserAgent("Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0","en-us,en;q=0.5");
// The Gecko libraries have finished loading and we can use the rendering engine.
// Let's add a browser (required) and load a page into it.
Browser b = mGeckoView.addBrowser("https://check.torproject.org");
}
private void setProxyPrefs ()
{
PrefsHelper.setPref("network.proxy.type",1); //manual proxy settings
PrefsHelper.setPref("network.proxy.http","localhost"); //manual proxy settings
PrefsHelper.setPref("network.proxy.http_port",8118); //manual proxy settings
PrefsHelper.setPref("network.proxy.socks","localhost"); //manual proxy settings
PrefsHelper.setPref("network.proxy.socks_port",9050); //manual proxy settings
PrefsHelper.setPref("network.proxy.socks_version",5); //manual proxy settings
}
private void setPrivacyPrefs ()
{
PrefsHelper.setPref("browser.cache.disk.enable",false);
PrefsHelper.setPref("browser.cache.memory.enable",true);
PrefsHelper.setPref("browser.cache.disk.capacity",0);
PrefsHelper.setPref("privacy.clearOnShutdown.cache",true);
PrefsHelper.setPref("privacy.clearOnShutdown.cookies",true);
PrefsHelper.setPref("privacy.clearOnShutdown.downloads",true);
PrefsHelper.setPref("privacy.clearOnShutdown.formdata",true);
PrefsHelper.setPref("privacy.clearOnShutdown.history",true);
PrefsHelper.setPref("privacy.clearOnShutdown.offlineApps",true);
PrefsHelper.setPref("privacy.clearOnShutdown.passwords",true);
PrefsHelper.setPref("privacy.clearOnShutdown.sessions",true);
PrefsHelper.setPref("privacy.clearOnShutdown.siteSettings",true);
PrefsHelper.setPref("privacy.donottrackheader.enabled",false);
PrefsHelper.setPref("privacy.donottrackheader.value",1);
PrefsHelper.setPref("network.cookie.cookieBehavior", 1);
PrefsHelper.setPref("network.http.sendRefererHeader", 0);
PrefsHelper.setPref("security.OCSP.require", true);
PrefsHelper.setPref("security.checkloaduri",true);
PrefsHelper.setPref("security.mixed_content.block_display_content", true);
PrefsHelper.setPref("media.peerconnection.enabled",false); //webrtc disabled
}
private void setCipherSuites ()
{
//disable rc4
PrefsHelper.setPref("security.ssl3.ecdh_ecdsa_rc4_128_sha",false);
PrefsHelper.setPref("security.ssl3.ecdh_rsa_rc4_128_sha",false);
PrefsHelper.setPref("security.ssl3.ecdhe_ecdsa_rc4_128_sha",false);
PrefsHelper.setPref("security.ssl3.ecdhe_rsa_rc4_128_sha",false);
PrefsHelper.setPref("security.ssl3.rsa_rc4_128_md5",false);
PrefsHelper.setPref("security.ssl3.rsa_rc4_128_sha",false);
}
private void setJavascriptEnabled (boolean enabled)
{
PrefsHelper.setPref("javascript.enabled", enabled);
}
private void setUserAgent (String userAgent, String locale)
{
PrefsHelper.setPref("general.useragent.override", userAgent);
PrefsHelper.setPref("general.useragent.locale", locale);
}
@Override
public void onAlert(GeckoView view, GeckoView.Browser browser, String message, GeckoView.PromptResult result) {
Log.i(LOGTAG, "Alert!");
result.confirm();
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
}
@Override
public void onConfirm(GeckoView view, GeckoView.Browser browser, String message, final GeckoView.PromptResult result) {
Log.i(LOGTAG, "Confirm!");
new AlertDialog.Builder(MainActivity.this)
.setTitle("javaScript dialog")
.setMessage(message)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
})
.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
result.cancel();
}
})
.create()
.show();
}
@Override
public void onDebugRequest(GeckoView view, GeckoView.PromptResult result) {
Log.i(LOGTAG, "Remote Debug!");
result.confirm();
}
@Override
public void onPrompt(GeckoView arg0, Browser arg1, String arg2,
String arg3, PromptResult arg4) {
// TODO Auto-generated method stub
super.onPrompt(arg0, arg1, arg2, arg3, arg4);
}
}
private class MyGeckoViewContent extends GeckoViewContent {
@Override
public void onReceivedTitle(GeckoView view, GeckoView.Browser browser, String title) {
Log.i(LOGTAG, "Received a title");
// Use the title returned from Gecko to update the UI
// TODO: Only if the browser is the selected browser
setTitle(title);
}
@Override
public void onPageShow(GeckoView arg0, Browser arg1) {
super.onPageShow(arg0, arg1);
setProgressBarIndeterminateVisibility(Boolean.FALSE);
}
@Override
public void onPageStart(GeckoView arg0, Browser arg1, String arg2) {
super.onPageStart(arg0, arg1, arg2);
mUrlBar.setText(arg2);
mUrlBar.setSelection(0, arg2.length());
setProgressBarIndeterminateVisibility(Boolean.TRUE);
}
@Override
public void onPageStop(GeckoView arg0, Browser arg1, boolean arg2) {
super.onPageStop(arg0, arg1, arg2);
setProgressBarIndeterminateVisibility(Boolean.FALSE);
}
@Override
public void onReceivedFavicon(GeckoView arg0, Browser arg1,
String arg2, int arg3) {
//ignore - we don't want to load favicons for now
}
}
}