package org.itsnat.itsnatdroidtest.testact.remote;
import android.os.StrictMode;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import org.itsnat.droid.HttpRequestResult;
import org.itsnat.droid.ItsNatDroidBrowser;
import org.itsnat.droid.ItsNatDroidScriptException;
import org.itsnat.droid.ItsNatDroidServerResponseException;
import org.itsnat.droid.ItsNatSession;
import org.itsnat.droid.OnEventErrorListener;
import org.itsnat.droid.OnHttpRequestErrorListener;
import org.itsnat.droid.OnPageLoadErrorListener;
import org.itsnat.droid.OnPageLoadListener;
import org.itsnat.droid.OnScriptErrorListener;
import org.itsnat.droid.OnServerStateLostListener;
import org.itsnat.droid.Page;
import org.itsnat.droid.PageRequest;
import org.itsnat.droid.event.Event;
import org.itsnat.droid.event.NormalEvent;
import org.itsnat.itsnatdroidtest.R;
import org.itsnat.itsnatdroidtest.testact.TestActivity;
import org.itsnat.itsnatdroidtest.testact.TestActivityTabFragment;
import org.itsnat.itsnatdroidtest.testact.TestSetupBase;
import org.itsnat.itsnatdroidtest.testact.util.TestUtil;
import bsh.EvalError;
/**
* Created by jmarranz on 13/08/14.
*/
public abstract class TestSetupRemotePageBase extends TestSetupBase implements OnPageLoadListener,OnPageLoadErrorListener,OnScriptErrorListener,OnEventErrorListener
{
public static final boolean TEST_SYNC_REQUESTS = false;
protected final TestActivityTabFragment fragment;
protected final ItsNatDroidBrowser droidBrowser;
protected boolean useItsNatServer;
public TestSetupRemotePageBase(TestActivityTabFragment fragment, ItsNatDroidBrowser droidBrowser)
{
this(fragment,droidBrowser,true);
}
public TestSetupRemotePageBase(TestActivityTabFragment fragment, ItsNatDroidBrowser droidBrowser, boolean useItsNatServer)
{
this.fragment = fragment;
this.droidBrowser = droidBrowser;
this.useItsNatServer = useItsNatServer;
if (TEST_SYNC_REQUESTS)
{
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
}
protected TestActivity getTestActivity()
{
return fragment.getTestActivity();
}
public int getConnectionTimeout()
{
return 4000;
}
public int getReadTimeout()
{
return 10000;
}
protected void bindBackAndReloadButton(final Page page,View rootView)
{
View backButton = rootView.findViewById(R.id.back);
backButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
page.dispose();
fragment.gotoLayoutIndex();
}
});
View buttonReload = rootView.findViewById(R.id.buttonReload);
if (buttonReload == null) throw new RuntimeException("FAIL");
buttonReload.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
TestActivity act = getTestActivity();
Toast.makeText(act, "DOWNLOADING AGAIN", Toast.LENGTH_SHORT).show();
page.dispose();
page.reusePageRequest().execute();
//downloadLayoutRemote(act,droidBrowser);
}
});
}
public boolean isScriptingDisabled()
{
return false;
}
@Override
public void onPageLoad(final Page page)
{
final TestActivity act = getTestActivity();
if (!isScriptingDisabled() && useItsNatServer)
{
if (page.getId() == null)
{
TestUtil.alertDialog(act, "LAYOUT", "It seems page is not found or no ItsNat server used or scripting disabled");
View rootView = page.getItsNatDoc().getRootView();
changeLayout(rootView);
return;
}
ItsNatSession session = page.getItsNatSession();
if (session.getPageCount() > droidBrowser.getMaxPagesInSession()) throw new RuntimeException("FAIL");
}
String responseText = page.getHttpRequestResult().getResponseText();
// Log.v("TestActivity", "CONTENT:" + responseText);
boolean showContentInAlert = false;
if (showContentInAlert)
{
TestUtil.alertDialog(act, "LAYOUT", responseText);
}
View rootView = page.getItsNatDoc().getRootView();
changeLayout(rootView);
Toast.makeText(act, "OK LAYOUT REMOTE", Toast.LENGTH_SHORT).show();
bindBackAndReloadButton(page, rootView);
if (useItsNatServer)
{
page.setOnEventErrorListener(this); // Comentar para testear el sistema de errores built-in
}
page.setOnHttpRequestErrorListener(new OnHttpRequestErrorListener(){
@Override
public void onError(Page page, Exception ex, HttpRequestResult response)
{
ex.printStackTrace();
String responseText = response != null ? response.getResponseText() : null;
TestUtil.alertDialog(act, "User Msg: Failed HTTP request! \n" + responseText);
}
});
page.setOnServerStateLostListener(new OnServerStateLostListener()
{
@Override
public void onServerStateLost(Page page)
{
if (page.isDisposed())
TestUtil.alertDialog(act, "User Msg: SERVER STATE LOST!!");
}
});
}
@Override
public void onError(PageRequest pageRequest, Exception ex, HttpRequestResult response)
{
ex.printStackTrace();
TestActivity act = getTestActivity();
Toast.makeText(act, "ERROR:" + ex.getMessage(), Toast.LENGTH_SHORT).show();
//throw new RuntimeException(ex);
if (ex instanceof ItsNatDroidScriptException)
{
ItsNatDroidScriptException exScr = (ItsNatDroidScriptException) ex;
if (exScr.getCause() instanceof EvalError)
((EvalError) exScr.getCause()).printStackTrace();
Log.v("TestActivity", "CODE:" + exScr.getScript());
}
else if (ex instanceof ItsNatDroidServerResponseException)
{
ItsNatDroidServerResponseException ex2 = (ItsNatDroidServerResponseException)ex;
TestUtil.alertDialog(act, "User Msg: Server loaded content returned error: " + ex2.getMessage() + "\n" + ex2.getHttpRequestResult().getResponseText());
Log.v("TestActivity", "RESPONSE:" + ex2.getHttpRequestResult().getResponseText());
}
}
@Override
public void onError(Page page,String code, Exception ex, Object context)
{
ex.printStackTrace();
TestActivity act = getTestActivity();
TestUtil.alertDialog(act, "Error in Code: \n" + code + "\nContext:" + context);
}
@Override
public void onError(Page page,Event evt, Exception ex, HttpRequestResult response)
{
TestActivity act = getTestActivity();
ex.printStackTrace();
if (ex instanceof ItsNatDroidServerResponseException)
{
if (page.isDisposed())
TestUtil.alertDialog(act, "User Msg: received event in page disposed (this error usually should be hidden for end users) " + ((ItsNatDroidServerResponseException) ex).getHttpRequestResult().getResponseText());
else
TestUtil.alertDialog(act, "User Msg: Server loaded content returned error: " + ((ItsNatDroidServerResponseException) ex).getHttpRequestResult().getResponseText());
}
else if (ex instanceof ItsNatDroidScriptException)
{
ItsNatDroidScriptException exScr = (ItsNatDroidScriptException) ex;
StringBuilder msg = new StringBuilder();
msg.append("User Msg: Event processing error (executing script code)");
if (evt instanceof NormalEvent)
msg.append("\nType: " + ((NormalEvent)evt).getType());
msg.append("\nException Msg: " + exScr.getMessage());
msg.append("\nCode: " + exScr.getScript());
if (exScr.getCause() instanceof EvalError)
((EvalError) exScr.getCause()).printStackTrace();
Log.v("TestActivity", "CODE:" + exScr.getScript());
}
else
{
StringBuilder msg = new StringBuilder();
msg.append("User Msg: Event processing error");
if (evt instanceof NormalEvent)
msg.append("\nType: " + ((NormalEvent)evt).getType());
msg.append("\nException Msg: " + ex.getMessage());
TestUtil.alertDialog(act, msg.toString());
}
}
protected void changeLayout(View rootView)
{
fragment.setRootView(rootView);
fragment.updateFragmentLayout();
}
public void executePageRequest(String url)
{
TestActivity act = getTestActivity();
PageRequest pageRequest = droidBrowser.createPageRequest();
pageRequest.setContext(act)
.setSynchronous(TEST_SYNC_REQUESTS)
.setBitmapDensityReference(DisplayMetrics.DENSITY_XHIGH)
.setOnPageLoadListener(this)
.setOnPageLoadErrorListener(this)
.setOnScriptErrorListener(this) // Comentar para ver el modo de error built-in
.setAttrResourceInflaterListener(this)
.setConnectTimeout(getConnectionTimeout())
.setReadTimeout(getReadTimeout())
.setURL(url)
.execute();
}
}