package io.evercam.connect; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; import io.evercam.connect.db.Camera; import io.evercam.connect.db.CameraOperation; public class ManuallyForwardingTab extends Fragment { private Camera camera; private CameraOperation cameraOperation; private String cameraIP; private String ssid; private LinearLayout titleLayout; private LinearLayout warningLayout; private RelativeLayout httpLayout; private RelativeLayout rtspLayout; private RelativeLayout httpsLayout; private RelativeLayout ftpLayout; private RelativeLayout sshLayout; private TextView internalHttpText; private TextView internalRtspText; private TextView internalHttpsText; private TextView internalFtpText; private TextView internalSshText; private EditText externalHttpEdit; private EditText externalRtspEdit; private EditText externalHttpsEdit; private EditText externalFtpEdit; private EditText externalSshEdit; private Button saveBtn; private Button addBtn; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { cameraIP = getActivity().getIntent().getExtras().get("IP").toString(); ssid = getActivity().getIntent().getExtras().get("SSID").toString(); cameraOperation = new CameraOperation(getActivity().getApplicationContext()); View view = inflater.inflate(R.layout.tab_two, container, false); warningLayout = (LinearLayout) view.findViewById(R.id.warningLayout); titleLayout = (LinearLayout) view.findViewById(R.id.titleLayout); httpLayout = (RelativeLayout) view.findViewById(R.id.httpLayout); rtspLayout = (RelativeLayout) view.findViewById(R.id.rtspLayout); httpsLayout = (RelativeLayout) view.findViewById(R.id.httpsLayout); ftpLayout = (RelativeLayout) view.findViewById(R.id.ftpLayout); sshLayout = (RelativeLayout) view.findViewById(R.id.sshLayout); internalHttpText = (TextView) view.findViewById(R.id.httpInternal); internalRtspText = (TextView) view.findViewById(R.id.rtspInternal); internalHttpsText = (TextView) view.findViewById(R.id.httpsInternal); internalFtpText = (TextView) view.findViewById(R.id.ftpInternal); internalSshText = (TextView) view.findViewById(R.id.sshInternal); externalHttpEdit = (EditText) view.findViewById(R.id.httpExternal); externalRtspEdit = (EditText) view.findViewById(R.id.rtspExternal); externalHttpsEdit = (EditText) view.findViewById(R.id.httpsExternal); externalFtpEdit = (EditText) view.findViewById(R.id.ftpExternal); externalSshEdit = (EditText) view.findViewById(R.id.sshExternal); saveBtn = (Button) view.findViewById(R.id.buttonSave); addBtn = (Button) view.findViewById(R.id.buttonAdd); setUpPage(); saveBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { saveDetails(); } }); addBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showAddBtnDialog(); } }); return view; } public void setUpPage() { camera = cameraOperation.getCamera(cameraIP, ssid); // If no internal port exists if(!camera.hasInternalPorts()) { saveBtn.setVisibility(View.GONE); titleLayout.setVisibility(View.GONE); warningLayout.setVisibility(View.VISIBLE); } else { saveBtn.setVisibility(View.VISIBLE); titleLayout.setVisibility(View.VISIBLE); warningLayout.setVisibility(View.GONE); // HTTP if(camera.hasHTTP()) { httpLayout.setVisibility(View.VISIBLE); internalHttpText.setText(String.valueOf(camera.getHttp())); if(camera.hasExternalHttp()) { externalHttpEdit.setText(String.valueOf(camera.getExthttp())); } else { externalHttpEdit.setText(null); } } else { httpLayout.setVisibility(View.GONE); } // RTSP if(camera.hasRTSP()) { rtspLayout.setVisibility(View.VISIBLE); internalRtspText.setText(String.valueOf(camera.getRtsp())); if(camera.hasExternalRtsp()) { externalRtspEdit.setText(String.valueOf(camera.getExtrtsp())); } else { externalRtspEdit.setText(null); } } else { rtspLayout.setVisibility(View.GONE); } // HTTPS if(camera.hasHTTPS()) { httpsLayout.setVisibility(View.VISIBLE); internalHttpsText.setText(String.valueOf(camera.getHttps())); if(camera.hasExternalHttps()) { externalHttpsEdit.setText(String.valueOf(camera.getExthttps())); } else { externalHttpsEdit.setText(null); } } else { httpsLayout.setVisibility(View.GONE); } // FTP if(camera.hasFTP()) { ftpLayout.setVisibility(View.VISIBLE); internalFtpText.setText(String.valueOf(camera.getFtp())); if(camera.hasExternalFtp()) { externalFtpEdit.setText(String.valueOf(camera.getExtftp())); } else { externalFtpEdit.setText(null); } } else { ftpLayout.setVisibility(View.GONE); } // SSH if(camera.hasSSH()) { sshLayout.setVisibility(View.VISIBLE); internalSshText.setText(String.valueOf(camera.getSsh())); if(camera.hasExternalSsh()) { externalSshEdit.setText(String.valueOf(camera.getExtssh())); } else { externalSshEdit.setText(null); } } else { sshLayout.setVisibility(View.GONE); } } } private void saveDetails() { String httpStr = externalHttpEdit.getText().toString(); String rtspStr = externalRtspEdit.getText().toString(); String httpsStr = externalHttpsEdit.getText().toString(); String ftpStr = externalFtpEdit.getText().toString(); String sshStr = externalSshEdit.getText().toString(); if(httpStr.length() == 0) { httpStr = "0"; } if(rtspStr.length() == 0) { rtspStr = "0"; } if(httpsStr.length() == 0) { httpsStr = "0"; } if(ftpStr.length() == 0) { ftpStr = "0"; } if(sshStr.length() == 0) { sshStr = "0"; } try { int newHttp = Integer.parseInt(httpStr); int newRtsp = Integer.parseInt(rtspStr); int newHttps = Integer.parseInt(httpsStr); int newFtp = Integer.parseInt(ftpStr); int newSsh = Integer.parseInt(sshStr); // If ports all in 0-65535 if(isInPortRange(newHttp) && isInPortRange(newRtsp) && isInPortRange(newHttps) && isInPortRange(newFtp) && isInPortRange(newSsh)) { cameraOperation.updateAttributeInt(camera.getIP(), camera.getSsid(), "exthttp", newHttp); cameraOperation.updateAttributeInt(camera.getIP(), camera.getSsid(), "extrtsp", newRtsp); cameraOperation.updateAttributeInt(camera.getIP(), camera.getSsid(), "exthttps", newHttps); cameraOperation.updateAttributeInt(camera.getIP(), camera.getSsid(), "extftp", newFtp); cameraOperation.updateAttributeInt(camera.getIP(), camera.getSsid(), "extssh", newSsh); Toast toast = Toast.makeText(getActivity().getApplicationContext(), "Success!", Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); getActivity().finish(); } else { showPortNotInRange(); } setUpPage(); } catch(NumberFormatException e) { showPortNotInRange(); } } private void showPortNotInRange() { Toast toast = Toast.makeText(getActivity().getApplicationContext(), R.string .portRangeMsg1, Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } private void showInternalCannotNull() { Toast toast = Toast.makeText(getActivity().getApplicationContext(), "Please fill in " + "internal port!", Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } private void showAddBtnDialog() { LayoutInflater mInflater = LayoutInflater.from(getActivity().getApplicationContext()); final View addPortView = mInflater.inflate(R.layout.manual_forward_add, null); final AlertDialog.Builder editBuilder = new AlertDialog.Builder(this.getActivity()); editBuilder.setView(addPortView); final Spinner spinnerChoosePortType = (Spinner) addPortView.findViewById(R.id .portType_spinner); ArrayAdapter<String> portTypeAdapter = new ArrayAdapter<String>(getActivity() .getApplicationContext(), R.layout.spinner_item, getPortTypesToAdd()); spinnerChoosePortType.setAdapter(portTypeAdapter); final EditText addInternalEdit = (EditText) addPortView.findViewById(R.id .internalPort_edit); final EditText addExternalEdit = (EditText) addPortView.findViewById(R.id .externalPort_edit); editBuilder.setPositiveButton(R.string.add, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String choosedPort = spinnerChoosePortType.getSelectedItem().toString(); String internalStr = addInternalEdit.getText().toString(); String externalStr = addExternalEdit.getText().toString(); if(internalStr.length() == 0) { internalStr = "0"; } if(externalStr.length() == 0) { externalStr = "0"; } try { int internalInt = Integer.parseInt(internalStr); int externalInt = Integer.parseInt(externalStr); if(isInPortRange(internalInt) && isInPortRange(externalInt)) { if(internalInt == 0 && externalInt != 0) { showInternalCannotNull(); CameraDetailActivity.keepDialog(dialog); } else { if(choosedPort.equals("HTTP")) { cameraOperation.updateAttributeInt(camera.getIP(), camera.getSsid (), "http", internalInt); cameraOperation.updateAttributeInt(camera.getIP(), camera.getSsid(), "exthttp", externalInt); } else if(choosedPort.equals("RTSP")) { cameraOperation.updateAttributeInt(camera.getIP(), camera.getSsid(), "rtsp", internalInt); cameraOperation.updateAttributeInt(camera.getIP(), camera.getSsid(), "extrtsp", externalInt); } if(choosedPort.equals("HTTPS")) { cameraOperation.updateAttributeInt(camera.getIP(), camera.getSsid(), "https", internalInt); cameraOperation.updateAttributeInt(camera.getIP(), camera.getSsid(), "exthttps", externalInt); } else if(choosedPort.equals("FTP")) { cameraOperation.updateAttributeInt(camera.getIP(), camera.getSsid(), "ftp", internalInt); cameraOperation.updateAttributeInt(camera.getIP(), camera.getSsid(), "extftp", externalInt); } else if(choosedPort.equals("SSH")) { cameraOperation.updateAttributeInt(camera.getIP(), camera.getSsid(), "ssh", internalInt); cameraOperation.updateAttributeInt(camera.getIP(), camera.getSsid(), "extssh", externalInt); } CameraDetailActivity.closeDialog(dialog); setUpPage(); } } else { showPortNotInRange(); CameraDetailActivity.keepDialog(dialog); } } catch(NumberFormatException e) { showPortNotInRange(); CameraDetailActivity.keepDialog(dialog); } } }); editBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { CameraDetailActivity.closeDialog(dialog); } }); editBuilder.setTitle("Add Forwarded Port (" + camera.getIP() + ")"); editBuilder.setCancelable(false); editBuilder.show(); } private boolean isInPortRange(int port) { if(port >= 0 && port <= 65535) { return true; } else { return false; } } private ArrayList<String> getPortTypesToAdd() { ArrayList<String> portTypes = new ArrayList<String>(); if(!camera.hasHTTP()) { portTypes.add("HTTP"); } if(!camera.hasRTSP()) { portTypes.add("RTSP"); } if(!camera.hasHTTPS()) { portTypes.add("HTTPS"); } if(!camera.hasFTP()) { portTypes.add("FTP"); } if(!camera.hasSSH()) { portTypes.add("SSH"); } return portTypes; } }