package net.i2p.android.router.web;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.TextView;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import net.i2p.android.router.I2PFragmentBase;
import net.i2p.android.router.R;
public class WebFragment extends I2PFragmentBase {
private I2PWebViewClient _wvClient;
private String _uriStr;
public final static String HTML_URI = "html_url";
public final static String HTML_RESOURCE_ID = "html_resource_id";
private static final String WARNING = "Warning - " +
"any non-I2P links visited in this window are fetched over the regular internet and are " +
"not anonymous. I2P pages may not load images or CSS.";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View v = inflater.inflate(R.layout.web, container, false);
TextView tv = (TextView) v.findViewById(R.id.browser_status);
tv.setText(WARNING);
WebView wv = (WebView) v.findViewById(R.id.browser_webview);
_wvClient = new I2PWebViewClient();
wv.setWebViewClient(_wvClient);
wv.getSettings().setBuiltInZoomControls(true);
// http://stackoverflow.com/questions/2369310/webview-double-tap-zoom-not-working-on-a-motorola-droid-a855
wv.getSettings().setUseWideViewPort(true);
_uriStr = getArguments().getString(HTML_URI);
if (_uriStr != null) {
Uri uri = Uri.parse(_uriStr);
//wv.getSettings().setLoadsImagesAutomatically(true);
//wv.loadUrl(uri.toString());
// go thru the client so .i2p will work too
_wvClient.shouldOverrideUrlLoading(wv, uri.toString());
} else {
wv.getSettings().setLoadsImagesAutomatically(false);
int id = getArguments().getInt(HTML_RESOURCE_ID, 0);
// no default, so restart should keep previous view
if (id != 0)
loadResource(wv, id);
}
return v;
}
private void loadResource(WebView wv, int id) {
InputStream in = null;
ByteArrayOutputStream out = new ByteArrayOutputStream(32*1024);
byte buf[] = new byte[4096];
try {
in = getResources().openRawResource(id);
int read;
while ( (read = in.read(buf)) != -1)
out.write(buf, 0, read);
} catch (IOException ioe) {
System.err.println("resource error " + ioe);
} catch (Resources.NotFoundException nfe) {
} finally {
if (in != null) try { in.close(); } catch (IOException ioe) {}
}
try {
String page = out.toString("UTF-8");
wv.loadData(page, "text/html", "UTF-8");
} catch (UnsupportedEncodingException uee) {
}
}
public boolean onBackPressed() {
WebView wv = (WebView) getActivity().findViewById(R.id.browser_webview);
_wvClient.cancelAll();
wv.stopLoading();
if (wv.canGoBack()) {
// TODO go into history, get url and call shouldOverrideUrlLoading()
// so we have control ??? But then back won't work right
wv.goBack();
return true;
}
return false;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.fragment_web_actions, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
WebView wv = (WebView) getActivity().findViewById(R.id.browser_webview);
switch (item.getItemId()) {
case R.id.menu_reload:
_wvClient.cancelAll();
wv.stopLoading();
String url = wv.getUrl();
// If a resource, _uriStr == null but url != null (resource loads don't fail)
// If a URL, _uriStr != null and url might be null (if pageload failed)
if (url != null && (!url.equals(_uriStr)))
_uriStr = url;
Uri uri = Uri.parse(_uriStr);
if ("data".equals(uri.getScheme())) {
// welcome page... or just do nothing ?
wv.reload();
} else {
// wv.reload() doesn't call shouldOverrideUrlLoading(), so do it this way
_wvClient.deleteCurrentPageCache(wv, _uriStr);
_wvClient.shouldOverrideUrlLoading(wv, _uriStr);
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}