package io.evercam.connect;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Locale;
import java.util.Random;
import java.util.TimeZone;
import io.evercam.CameraBuilder;
import io.evercam.CameraDetail;
import io.evercam.EvercamException;
import io.evercam.Model;
import io.evercam.connect.db.Camera;
import io.evercam.connect.db.CameraOperation;
import io.evercam.connect.helper.LocationReader;
import io.evercam.connect.helper.SharedPrefsManager;
import io.evercam.network.discovery.NetworkInfo;
import io.evercam.network.discovery.Port;
import io.evercam.network.discovery.PortScan;
public class AddToEvercamActivity extends Activity
{
private final String TAG = "evercamdiscover-AddToEvercamActivity";
private Camera camera;
private EditText nameEdit;
private EditText snapshotEdit;
private EditText usernameEdit;
private EditText passwordEdit;
private EditText exthttpEdit;
private EditText modelEdit;
private EditText vendorEdit;
private EditText macEdit;
private RadioButton publicRadioBtn;
private Button addBtn;
private CreateCameraTask createCameraTask;
private SharedPreferences sharedPrefs;
private String cameraName;
private String snapshotPath;
private boolean isPublic;
private int exthttp;
private String cameraUsername;
private String cameraPassword;
private String cameraModel;
private String cameraVendor;
private String cameraMac;
private ProgressDialog progressDialog;
private String externalIp = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_to_evercam);
sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
camera = (Camera) getIntent().getSerializableExtra("camera");
initPage();
fillPage();
addBtn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
if(isPassed())
{
if(detailsChecked())
{
if(createCameraTask != null)
{
createCameraTask = null;
}
createCameraTask = new CreateCameraTask();
createCameraTask.execute();
}
}
else
{
showShortToast(R.string.extPortNotOpen);
}
}
});
exthttpEdit.addTextChangedListener(new TextWatcher()
{
@Override
public void afterTextChanged(Editable arg0)
{
exthttpEdit.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
}
});
exthttpEdit.setOnFocusChangeListener(new OnFocusChangeListener()
{
@Override
public void onFocusChange(View v, boolean hasFocus)
{
if(!hasFocus)
{
if(extHttpChecked())
{
portCheck(exthttp);
}
}
}
});
}
private void initPage()
{
nameEdit = (EditText) findViewById(R.id.addCameraName_edit);
snapshotEdit = (EditText) findViewById(R.id.addCameraJpg_edit);
usernameEdit = (EditText) findViewById(R.id.addUsername_edit);
passwordEdit = (EditText) findViewById(R.id.addPassword_edit);
exthttpEdit = (EditText) findViewById(R.id.addExtHttp_edit);
modelEdit = (EditText) findViewById(R.id.addModel_value);
vendorEdit = (EditText) findViewById(R.id.addVendor_value);
macEdit = (EditText) findViewById(R.id.addMac_value);
publicRadioBtn = (RadioButton) findViewById(R.id.publicRadio);
addBtn = (Button) findViewById(R.id.button_creatCamera);
}
private void fillPage()
{
if(camera.getExthttp() > 0)
{
portCheck(camera.getExthttp());
exthttpEdit.setText(String.valueOf(camera.getExthttp()));
}
if(camera.hasJpgURL())
{
snapshotEdit.setText(camera.getJpg());
}
usernameEdit.setText(camera.getUsername());
passwordEdit.setText(camera.getPassword());
macEdit.setText(camera.getMAC().toLowerCase(Locale.UK));
macEdit.setEnabled(false);
macEdit.setTextColor(Color.parseColor("#808080"));
if(camera.hasModel())
{
if(camera.getModel().startsWith(camera.getVendor()))
{
camera.setModel(camera.getModel().substring(camera.getVendor().length() + 1).trim
());
}
modelEdit.setText(camera.getModel().toLowerCase());
}
if(camera.hasVendor())
{
vendorEdit.setText(camera.getVendor().toLowerCase());
vendorEdit.setEnabled(false);
vendorEdit.setTextColor(Color.parseColor("#808080"));
}
nameEdit.setText(R.string.myCamera);
}
private void showShortToast(int id)
{
Toast.makeText(this, id, Toast.LENGTH_SHORT).show();
}
private void showShortToast(String msg)
{
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
private boolean detailsChecked()
{
String nameStr = nameEdit.getText().toString();
String snapshotStr = snapshotEdit.getText().toString();
String exthttpStr = exthttpEdit.getText().toString();
String usernameStr = usernameEdit.getText().toString();
String passwordStr = passwordEdit.getText().toString();
if(extHttpChecked())
{
if(nameStr.length() == 0)
{
showShortToast(R.string.nameEmpty);
nameEdit.requestFocus();
}
else if(snapshotStr.length() == 0)
{
showShortToast(R.string.snapshotEmpty);
snapshotEdit.requestFocus();
}
else if(!snapshotStr.startsWith("/"))
{
showShortToast(R.string.snapshotInvalid);
}
else if(exthttpStr.length() == 0)
{
showShortToast(R.string.exthttpEmpty);
exthttpEdit.requestFocus();
}
else if(usernameStr.length() == 0)
{
showShortToast(R.string.usernameEmpty);
usernameEdit.requestFocus();
}
else if(passwordStr.length() == 0)
{
showShortToast(R.string.passwordEmpty);
passwordEdit.requestFocus();
}
else
{
cameraName = nameStr;
snapshotPath = snapshotStr;
isPublic = publicRadioBtn.isChecked();
cameraUsername = usernameStr;
cameraPassword = passwordStr;
cameraModel = modelEdit.getText().toString();
cameraVendor = vendorEdit.getText().toString();
cameraMac = macEdit.getText().toString();
return true;
}
}
return false;
}
private boolean extHttpChecked()
{
String exthttpStr = exthttpEdit.getText().toString();
try
{
exthttp = Integer.parseInt(exthttpStr);
if(!(exthttp > 0 && exthttp <= 65535))
{
showShortToast(R.string.portRangeMsg);
return false;
}
else
{
return true;
}
}
catch(NumberFormatException e)
{
showShortToast(R.string.portRangeMsg);
return false;
}
}
private void showTick()
{
Drawable tick = getResources().getDrawable(R.drawable.tick);
exthttpEdit.setCompoundDrawablesWithIntrinsicBounds(null, null, tick, null);
}
private void showCross()
{
Drawable cross = getResources().getDrawable(R.drawable.cross);
exthttpEdit.setCompoundDrawablesWithIntrinsicBounds(null, null, cross, null);
}
private boolean isPassed()
{
Drawable[] drawables = exthttpEdit.getCompoundDrawables();
for(Drawable drawable : drawables)
{
if(drawable != null)
{
if(drawable.equals(getResources().getDrawable(R.drawable.tick))) ;
return true;
}
}
return false;
}
private void portCheck(final int port)
{
new AsyncTask<Void, Void, Boolean>()
{
@Override
protected Boolean doInBackground(Void... params)
{
if(externalIp == null)
{
externalIp = NetworkInfo.getExternalIP();
}
if(externalIp != null)
{
try
{
if(Port.isReachable(externalIp, port))
{
return true;
}
else
{
return false;
}
}
catch(Exception e)
{
Log.e(TAG, e.toString());
}
}
return false;
}
@Override
protected void onPostExecute(Boolean active)
{
if(active)
{
showTick();
}
else
{
showCross();
}
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
private class CreateCameraTask extends AsyncTask<Void, Void, Boolean>
{
CameraDetail cameraDetail;
Location currentLocation;
String errorMsg = "Error, please try again later.";
@Override
protected void onPreExecute()
{
progressDialog = ProgressDialog.show(AddToEvercamActivity.this, "", getString(R
.string.creating_camera), true);
currentLocation = new LocationReader(AddToEvercamActivity.this).getLocation();
}
@Override
protected void onPostExecute(Boolean success)
{
if(progressDialog.isShowing())
{
progressDialog.dismiss();
}
if(success)
{
showShortToast(R.string.Success);
CameraOperation cameraOperation = new CameraOperation(AddToEvercamActivity.this);
cameraOperation.updateAttributeInt(camera.getIP(), camera.getSsid(), "evercam", 1);
AddToEvercamActivity.this.finish();
}
else
{
showShortToast(errorMsg);
}
}
@Override
protected Boolean doInBackground(Void... arg0)
{
initialDetailObject();
try
{
io.evercam.Camera camera = io.evercam.Camera.create(cameraDetail);
if(camera != null)
{
return true;
}
return false;
}
catch(EvercamException e)
{
errorMsg = e.getMessage();
return false;
}
}
private void initialDetailObject()
{
while(externalIp == null)
{
externalIp = NetworkInfo.getExternalIP();
}
try
{
ArrayList<Model> modelList = Model.getAll(cameraModel, cameraVendor);
if(modelList.size() > 0)
{
cameraModel = modelList.get(0).getId();
}
}
catch(EvercamException e1)
{
errorMsg = e1.getMessage();
}
CameraBuilder cameraBuilder;
try
{
cameraBuilder = new CameraBuilder(cameraName, isPublic).setExternalHost(externalIp).setExternalHttpPort(exthttp).setTimeZone(TimeZone.getDefault().getID()).setCameraUsername(cameraUsername).setCameraPassword(cameraPassword).setJpgUrl(snapshotPath);
if(camera.hasHTTP())
{
cameraBuilder.setInternalHost(camera.getIP()).setInternalHttpPort(camera.getHttp());
}
if(camera.hasRTSP())
{
cameraBuilder.setInternalHost(camera.getIP()).setInternalRtspPort(camera.getRtsp());
}
if(camera.hasExternalRtsp())
{
cameraBuilder.setExternalRtspPort(camera.getRtsp());
}
if(cameraVendor != null)
{
if(!cameraVendor.equals("Unknown Vendor") && cameraVendor.length() != 0)
{
cameraBuilder.setVendor(cameraVendor);
}
}
if(cameraModel != null)
{
if(cameraModel.length() != 0)
{
cameraBuilder.setModel(cameraModel);
}
}
if(cameraMac != null)
{
if(cameraMac.length() != 0)
{
cameraBuilder.setMacAddress(cameraMac);
}
}
// Add location data if exists.
if(currentLocation != null)
{
Float lat = (float) currentLocation.getLatitude();
Float lng = (float) currentLocation.getLongitude();
cameraBuilder.setLocation(lat, lng);
}
cameraDetail = cameraBuilder.build();
}
catch(EvercamException e)
{
e.printStackTrace();
}
}
}
public int random()
{
Random rand = new Random();
return rand.nextInt(100001);
}
}