package org.xbmc.android.remote.presentation.wizard.setupwizard;
import java.net.HttpURLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.http.HttpException;
import org.xbmc.android.remote.R;
import org.xbmc.android.remote.business.Command;
import org.xbmc.android.remote.business.ManagerFactory;
import org.xbmc.android.remote.presentation.wizard.Wizard;
import org.xbmc.android.remote.presentation.wizard.WizardPage;
import org.xbmc.android.util.ClientFactory;
import org.xbmc.android.util.HostFactory;
import org.xbmc.api.business.DataResponse;
import org.xbmc.api.business.IInfoManager;
import org.xbmc.api.business.INotifiableManager;
import org.xbmc.api.info.SystemInfo;
import org.xbmc.api.object.Host;
import org.xbmc.api.presentation.INotifiableController;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class SetupWizardPage1 extends WizardPage<Host> {
private EditText port;
private EditText ip;
private EditText name;
private TextView errorMsg;
private final Handler mHandler;
private boolean needsLogin = false;
private static final String validIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";
private static final String validHostnameRegex = "^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\\-]*[A-Za-z0-9])$";
private Pattern validHostPattern = Pattern.compile(validIpAddressRegex + "|" + validHostnameRegex);
public SetupWizardPage1(Context context, AttributeSet attrs, int defStyle,
Wizard<Host> wizard) {
super(context, attrs, defStyle, wizard);
mHandler = new Handler();
}
public SetupWizardPage1(Context context, AttributeSet attrs,
Wizard<Host> wizard) {
super(context, attrs, wizard);
mHandler = new Handler();
}
public SetupWizardPage1(Context context, Wizard<Host> wizard) {
super(context, wizard);
mHandler = new Handler();
}
protected void onInit() {
name = (EditText) findViewById(R.id.setup_wizard_name);
ip = (EditText) findViewById(R.id.setup_wizard_ip);
port = (EditText) findViewById(R.id.setup_wizard_port);
errorMsg = (TextView) findViewById(R.id.setup_wizard_host_msg);
// test = (Button) findViewById(R.id.setup_wizard_test_connection);
// test.setOnClickListener(new OnClickListener() {
// public void onClick(View v) {
// testConnection();
// }
// });
setCanFinish(true);
}
private void testConnection() {
showBusyMessage(getContext().getString(
R.string.setup_wizard_connecting_wait));
final Host currHost = HostFactory.host;
getInput().name = name.getText().toString().trim();
getInput().addr = ip.getText().toString().trim();
getInput().port = Integer.parseInt(port.getText().toString());
ClientFactory.resetClient(getInput());
final IInfoManager info = ManagerFactory
.getInfoManager(new INotifiableController() {
public void runOnUI(Runnable action) {
mHandler.post(action);
}
public void onWrongConnectionState(int state,
INotifiableManager manager, Command<?> source) {
}
public void onMessage(String message) {
}
public void onError(final Exception e) {
runOnUI(new Runnable() {
public void run() {
// setCanFinish(false);
e.printStackTrace();
if (e instanceof HttpException
&& e.getMessage()
.equals(HttpURLConnection.HTTP_UNAUTHORIZED)) {
needsLogin = true;
errorMsg.setText("");
showNextPage();
}
ClientFactory.resetClient(currHost);
removeBusyMessage();
errorMsg.setText(getContext().getString(
R.string.setup_wizard_cant_connect)
+ e.getMessage());
}
});
}
});
info.getSystemInfo(new DataResponse<String>() {
@Override
public void run() {
if (value != null && !value.equals("")) {
removeBusyMessage();
ClientFactory.resetClient(currHost);
errorMsg.setText("");
// setCanFinish(true);
showNextPage();
}
}
}, SystemInfo.SYSTEM_BUILD_VERSION, getContext());
}
@Override
public OnClickListener getNextClickListener() {
return new OnClickListener() {
public void onClick(View v) {
Matcher matcher = validHostPattern.matcher(ip.getText().toString().trim());
if(!matcher.matches()) {
errorMsg.setText("Please enter a valid hostname or IP");
}else {
errorMsg.setText("");
testConnection();
}
}
};
}
@Override
public WizardPage<Host> getNextPage() {
if (needsLogin) {
WizardPage<Host> page = new SetupWizardPageLogin(getContext(),
wizard);
page.init();
return page;
}
return null;
}
@Override
public int getLayoutId() {
return R.layout.setup_page_1;
}
}