package mil.nga.dice.about;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.text.Html;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
import org.w3c.dom.Document;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import mil.nga.dice.R;
public class DisclaimerDialogFragment extends DialogFragment {
private CheckBox showDisclaimerCheckBox;
private View view;
public interface OnDisclaimerDialogDismissedListener {
public void onDisclaimerDialogAgree(DisclaimerDialogFragment disclaimerDialog);
public void onDisclaimerDialogDisagree(DisclaimerDialogFragment disclaimerDialog);
}
private OnDisclaimerDialogDismissedListener mOnDisclaimerDialogDismissedListener;
@Override
public void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
setStyle(STYLE_NORMAL, 0);
}
@Override
public Dialog onCreateDialog(Bundle savedInstance) {
view = getActivity().getLayoutInflater().inflate(R.layout.fragment_dialog, null);
view.setMinimumWidth((int) (500 * getResources().getDisplayMetrics().density));
view.setMinimumHeight((int) (400 * getResources().getDisplayMetrics().density));
String disclaimer = loadDisclaimer();
TextView disclaimerTextView = ((TextView)view.findViewById(R.id.disclaimer_dialog_textview));
disclaimerTextView.setText(Html.fromHtml(disclaimer));
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(view);
builder.setTitle(R.string.disclaimer_title_text);
builder.setPositiveButton(getString(R.string.disclaimer_agree_button_text), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
if (mOnDisclaimerDialogDismissedListener != null) {
mOnDisclaimerDialogDismissedListener.onDisclaimerDialogAgree(DisclaimerDialogFragment.this);
}
mOnDisclaimerDialogDismissedListener = null;
}
});
builder.setNegativeButton(getString(R.string.disclaimer_exit_button_text), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
if (mOnDisclaimerDialogDismissedListener != null) {
mOnDisclaimerDialogDismissedListener.onDisclaimerDialogDisagree(DisclaimerDialogFragment.this);
}
mOnDisclaimerDialogDismissedListener = null;
}
});
showDisclaimerCheckBox = (CheckBox)view.findViewById(R.id.show_disclaimer_checkbox);
return builder.create();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mOnDisclaimerDialogDismissedListener = (OnDisclaimerDialogDismissedListener) activity;
}
catch (ClassCastException caught) {
throw new Error(activity.toString() + " must implement OnDisclaimerDialogDismissedListener");
}
}
public boolean isShowDisclaimerChecked() {
return showDisclaimerCheckBox.isChecked();
}
private String loadDisclaimer() {
try {
TransformerFactory xf = TransformerFactory.newInstance();
StringBuilder xslt = new StringBuilder()
.append("<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">")
.append( "<xsl:template match=\"/\">")
.append( "<xsl:apply-templates select=\"//div[@id='disclaimer']\"/>")
.append( "</xsl:template>")
.append( "<xsl:template match=\"div[@id='disclaimer']\">")
.append( "<xsl:copy-of select=\"*[local-name() != 'h1']\"/>")
.append( "</xsl:template>")
.append("</xsl:stylesheet>");
Transformer extractDisclaimer = xf.newTransformer(new StreamSource(new ByteArrayInputStream(xslt.toString().getBytes("UTF-8"))));
extractDisclaimer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
extractDisclaimer.setOutputProperty(OutputKeys.STANDALONE, "no");
extractDisclaimer.setOutputProperty(OutputKeys.METHOD, "html");
InputStream in = getActivity().getAssets().open("legal/legal.html");
ByteArrayOutputStream resultBytes = new ByteArrayOutputStream();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
Document sourceDoc = dbf.newDocumentBuilder().parse(in);
extractDisclaimer.transform(new DOMSource(sourceDoc), new StreamResult(resultBytes));
String disclaimer = resultBytes.toString();
return disclaimer;
}
catch (Exception e) {
throw new Error("error loading legal disclaimer", e);
}
}
}