package io.evercam.androidapp; import android.content.DialogInterface; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; import java.util.ArrayList; import java.util.Collection; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeMap; import io.evercam.Auth; import io.evercam.CameraBuilder; import io.evercam.Defaults; import io.evercam.EvercamException; import io.evercam.Model; import io.evercam.PatchCameraBuilder; import io.evercam.Vendor; import io.evercam.androidapp.custom.CustomToast; import io.evercam.androidapp.custom.CustomedDialog; import io.evercam.androidapp.dto.AppData; import io.evercam.androidapp.dto.EvercamCamera; import io.evercam.androidapp.tasks.AddCameraTask; import io.evercam.androidapp.tasks.PatchCameraTask; import io.evercam.androidapp.tasks.TestSnapshotTask; import io.evercam.androidapp.utils.Commons; import io.evercam.androidapp.utils.Constants; import io.evercam.androidapp.utils.DataCollector; import io.evercam.androidapp.video.VideoActivity; import io.evercam.network.discovery.DiscoveredCamera; public class AddEditCameraActivity extends ParentActivity { private final String TAG = "AddEditCameraActivity"; private LinearLayout cameraIdLayout; private TextView cameraIdTextView; private EditText cameraNameEdit; private Spinner vendorSpinner; private Spinner modelSpinner; private EditText usernameEdit; private EditText passwordEdit; private EditText externalHostEdit; private EditText externalHttpEdit; private EditText externalRtspEdit; private EditText jpgUrlEdit; private Button addEditButton; private TreeMap<String, String> vendorMap; private TreeMap<String, String> vendorMapIdAsKey; private TreeMap<String, String> modelMap; private DiscoveredCamera discoveredCamera; private EvercamCamera cameraEdit; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle bundle = getIntent().getExtras(); // Edit Camera if(bundle != null && bundle.containsKey(Constants.KEY_IS_EDIT)) { EvercamPlayApplication.sendScreenAnalytics(this, getString(R.string.screen_edit_camera)); cameraEdit = VideoActivity.evercamCamera; getActionBar().setTitle(R.string.title_edit_camera); } else // Add Camera { EvercamPlayApplication.sendScreenAnalytics(this, getString(R.string.screen_add_camera)); // Get camera object from video activity before initial screen discoveredCamera = (DiscoveredCamera) getIntent().getSerializableExtra("camera"); } setContentView(R.layout.activity_add_camera); if(this.getActionBar() != null) { this.getActionBar().setDisplayHomeAsUpEnabled(true); } // Initial UI elements initialScreen(); fillDiscoveredCameraDetails(discoveredCamera); if(cameraEdit == null) { //Populate name and IP only when adding camera autoPopulateCameraName(); autoPopulateExternalIP(); } fillEditCameraDetails(cameraEdit); } @Override public void onBackPressed() { showConfirmQuitIfAddingCamera(); } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { switch(item.getItemId()) { case android.R.id.home: showConfirmQuitIfAddingCamera(); return true; } return true; } private void showConfirmQuitIfAddingCamera() { //If edit camera if(addEditButton.getText().equals(getString(R.string.save_changes))) { setResult(Constants.RESULT_FALSE); super.onBackPressed(); } //If add camera else { String cameraName = cameraNameEdit.getText().toString(); String username = usernameEdit.getText().toString(); String password = passwordEdit.getText().toString(); String externalHost = externalHostEdit.getText().toString(); String externalHttp = externalHttpEdit.getText().toString(); String externalRtsp = externalRtspEdit.getText().toString(); String jpgUrl = jpgUrlEdit.getText().toString(); if(!(cameraName.isEmpty() && username.isEmpty() && password .isEmpty() && externalHost.isEmpty() && externalHttp.isEmpty() && externalRtsp.isEmpty() && jpgUrl.isEmpty())) { CustomedDialog.getConfirmCancelAddCameraDialog(this).show(); } else { setResult(Constants.RESULT_FALSE); super.onBackPressed(); } } } private void initialScreen() { cameraIdLayout = (LinearLayout) findViewById(R.id.add_camera_id_layout); cameraIdTextView = (TextView) findViewById(R.id.add_id_txt_view); cameraNameEdit = (EditText) findViewById(R.id.add_name_edit); vendorSpinner = (Spinner) findViewById(R.id.vendor_spinner); modelSpinner = (Spinner) findViewById(R.id.model_spinner); ImageView modelExplanationImageButton = (ImageView) findViewById(R.id.model_explanation_btn); usernameEdit = (EditText) findViewById(R.id.add_username_edit); passwordEdit = (EditText) findViewById(R.id.add_password_edit); externalHostEdit = (EditText) findViewById(R.id.add_external_host_edit); externalHttpEdit = (EditText) findViewById(R.id.add_external_http_edit); externalRtspEdit = (EditText) findViewById(R.id.add_external_rtsp_edit); jpgUrlEdit = (EditText) findViewById(R.id.add_jpg_edit); addEditButton = (Button) findViewById(R.id.button_add_edit_camera); Button testButton = (Button) findViewById(R.id.button_test_snapshot); if(cameraEdit != null) { addEditButton.setText(getString(R.string.save_changes)); cameraIdLayout.setVisibility(View.VISIBLE); } else { cameraIdLayout.setVisibility(View.GONE); addEditButton.setText(getString(R.string.finish_and_add)); } buildVendorSpinner(null, null); buildModelSpinner(null, null); new RequestVendorListTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); vendorSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { if(position == 0) { buildModelSpinner(new ArrayList<Model>(), null); } else { String vendorName = vendorSpinner.getSelectedItem().toString(); String vendorId = vendorMap.get(vendorName).toLowerCase(Locale.UK); if(!vendorName.equals(getString(R.string.vendor_other))) { new RequestModelListTask(vendorId).executeOnExecutor(AsyncTask .THREAD_POOL_EXECUTOR); } else { modelSpinner.setEnabled(false); } } } @Override public void onNothingSelected(AdapterView<?> parent) { } }); modelSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { // Do not update camera defaults in edit screen. if(cameraEdit == null) { if(position == 0) { clearDefaults(); } else { String vendorId = getVendorIdFromSpinner(); String modelName = getModelNameFromSpinner(); new RequestDefaultsTask(vendorId, modelName).executeOnExecutor(AsyncTask .THREAD_POOL_EXECUTOR); } } } @Override public void onNothingSelected(AdapterView<?> parent) { } }); modelExplanationImageButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { CustomedDialog.getMessageDialog(AddEditCameraActivity.this, R.string .msg_model_explanation).show(); } }); jpgUrlEdit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(!jpgUrlEdit.isFocusable()) { CustomedDialog.getMessageDialog(AddEditCameraActivity.this, R.string.msg_url_ending_not_editable).show(); } } }); addEditButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String externalHost = externalHostEdit.getText().toString(); if(Commons.isLocalIp(externalHost)) { CustomedDialog.getStandardAlertDialog(AddEditCameraActivity.this, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { performAddEdit(); } }, R.string.msg_local_ip_warning).show(); } else { performAddEdit(); } } }); testButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String externalHost = externalHostEdit.getText().toString(); if(Commons.isLocalIp(externalHost)) { CustomedDialog.getStandardAlertDialog(AddEditCameraActivity.this, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { launchTestSnapshot(); } }, R.string.msg_local_ip_warning).show(); } else { launchTestSnapshot(); } } }); } private void performAddEdit() { if(addEditButton.getText().equals(getString(R.string.save_changes))) { PatchCameraBuilder patchCameraBuilder = buildPatchCameraWithLocalCheck(); if(patchCameraBuilder != null) { new PatchCameraTask(patchCameraBuilder.build(), AddEditCameraActivity.this).executeOnExecutor(AsyncTask .THREAD_POOL_EXECUTOR); } else { Log.e(TAG, "Camera to patch is null"); } } else { CameraBuilder cameraBuilder = buildCameraWithLocalCheck(); if(cameraBuilder != null) { boolean isFromScan = discoveredCamera != null; new AddCameraTask(cameraBuilder.build(), AddEditCameraActivity.this, isFromScan).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else { Log.e(TAG, "Camera to add is null"); } } } private void fillDiscoveredCameraDetails(DiscoveredCamera camera) { if(camera != null) { // Log.d(TAG, camera.toString()); if(camera.hasExternalIp()) { externalHostEdit.setText(camera.getExternalIp()); } if(camera.hasExternalHttp()) { externalHttpEdit.setText(String.valueOf(camera.getExthttp())); } if(camera.hasExternalRtsp()) { externalRtspEdit.setText(String.valueOf(camera.getExtrtsp())); } if(camera.hasName()) { cameraNameEdit.setText(camera.getName()); } else { cameraNameEdit.setText((camera.getVendor() + " " + camera.getModel()).toUpperCase()); } } } /** * Auto populate camera name as 'Camera + number' */ private void autoPopulateCameraName() { if(cameraNameEdit.getText().toString().isEmpty()) { int number = 1; boolean matches = true; String cameraName; while(matches) { boolean duplicate = false; cameraName = "Camera " + number; for(EvercamCamera evercamCamera : AppData.evercamCameraList) { if(evercamCamera.getName().equals(cameraName)) { duplicate = true; break; } } if(duplicate) { number ++; } else { matches = false; } } cameraNameEdit.setText("Camera " + number); } } private void autoPopulateExternalIP() { /** * Auto populate IP as external IP address if on WiFi */ if(new DataCollector(this).isConnectedWifi()) { if(externalHostEdit.getText().toString().isEmpty()) { new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... params) { return io.evercam.network.discovery.NetworkInfo.getExternalIP(); } @Override protected void onPostExecute(String externalIp) { externalHostEdit.setText(externalIp); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } } } private void fillEditCameraDetails(EvercamCamera camera) { if(camera != null) { // Log.d(TAG, cameraEdit.toString()); cameraIdTextView.setText(camera.getCameraId()); cameraNameEdit.setText(camera.getName()); usernameEdit.setText(camera.getUsername()); passwordEdit.setText(camera.getPassword()); jpgUrlEdit.setText(camera.getJpgPath()); externalHostEdit.setText(camera.getExternalHost()); int externalHttp = camera.getExternalHttp(); int externalRtsp = camera.getExternalRtsp(); if(externalHttp != 0) { externalHttpEdit.setText(String.valueOf(externalHttp)); } if(externalRtsp != 0) { externalRtspEdit.setText(String.valueOf(externalRtsp)); } } } /** * Read and validate user input for add camera. */ private CameraBuilder buildCameraWithLocalCheck() { CameraBuilder cameraBuilder = null; String cameraName = cameraNameEdit.getText().toString(); if(cameraName.isEmpty()) { CustomToast.showInCenter(this, getString(R.string.name_required)); return null; } try { cameraBuilder = new CameraBuilder(cameraName, false); } catch(EvercamException e) { Log.e(TAG, e.toString()); } String vendorId = getVendorIdFromSpinner(); if(!vendorId.isEmpty()) { cameraBuilder.setVendor(vendorId); } String modelId = getModelIdFromSpinner(); if(!modelId.isEmpty()) { cameraBuilder.setModel(modelId); } String username = usernameEdit.getText().toString(); if(!username.isEmpty()) { cameraBuilder.setCameraUsername(username); } String password = passwordEdit.getText().toString(); if(!password.isEmpty()) { cameraBuilder.setCameraPassword(password); } String externalHost = externalHostEdit.getText().toString(); if(externalHost.isEmpty()) { CustomToast.showInCenter(this, getString(R.string.host_required)); return null; } else { cameraBuilder.setExternalHost(externalHost); String externalHttp = externalHttpEdit.getText().toString(); if(!externalHttp.isEmpty()) { int externalHttpInt = getPortIntByString(externalHttp); if(externalHttpInt != 0) { cameraBuilder.setExternalHttpPort(externalHttpInt); } else { return null; } } String externalRtsp = externalRtspEdit.getText().toString(); if(!externalRtsp.isEmpty()) { int externalRtspInt = getPortIntByString(externalRtsp); if(externalRtspInt != 0) { cameraBuilder.setExternalRtspPort(externalRtspInt); } else { return null; } } } String jpgUrl = buildJpgUrlWithSlash(jpgUrlEdit.getText().toString()); if(!jpgUrl.isEmpty()) { cameraBuilder.setJpgUrl(jpgUrl); } //Attach additional info for discovered camera as well if(discoveredCamera != null) { cameraBuilder.setInternalHost(discoveredCamera.getIP()); if(discoveredCamera.hasMac()) { cameraBuilder.setMacAddress(discoveredCamera.getMAC()); } if(discoveredCamera.hasHTTP()) { cameraBuilder.setInternalHttpPort(discoveredCamera.getHttp()); } if(discoveredCamera.hasRTSP()) { cameraBuilder.setInternalRtspPort(discoveredCamera.getRtsp()); } } return cameraBuilder; } /** * Convert port string to port int, show error toast if port number is not valid, * * @return int port number, if port is not valid, return 0. */ private int getPortIntByString(String portString) { try { int portInt = Integer.valueOf(portString); if(portInt > 0) { if(portInt <= 65535) { return portInt; } else { CustomToast.showInCenter(this, getString(R.string.msg_port_range_error)); return 0; } } else { CustomToast.showInCenter(this, getString(R.string.msg_port_range_error)); return 0; } } catch(NumberFormatException e) { CustomToast.showInCenter(this, getString(R.string.msg_port_range_error)); return 0; } } /** * Read and validate user input for edit camera. */ private PatchCameraBuilder buildPatchCameraWithLocalCheck() { PatchCameraBuilder patchCameraBuilder = null; try { patchCameraBuilder = new PatchCameraBuilder(cameraEdit.getCameraId()); } catch(EvercamException e) { Log.e(TAG, e.toString()); } String cameraName = cameraNameEdit.getText().toString(); if(cameraName.isEmpty()) { CustomToast.showInCenter(this, getString(R.string.name_required)); return null; } else if(!cameraName.equals(cameraEdit.getName())) { patchCameraBuilder.setName(cameraName); } String vendorId = getVendorIdFromSpinner(); patchCameraBuilder.setVendor(vendorId); String modelName = getModelIdFromSpinner(); patchCameraBuilder.setModel(modelName); String username = usernameEdit.getText().toString(); String password = passwordEdit.getText().toString(); if(!username.equals(cameraEdit.getUsername()) || !password.equals(cameraEdit.getPassword())) { patchCameraBuilder.setCameraUsername(username); patchCameraBuilder.setCameraPassword(password); } String externalHost = externalHostEdit.getText().toString(); if(externalHost.isEmpty()) { CustomToast.showInCenter(this, getString(R.string.host_required)); return null; } else { patchCameraBuilder.setExternalHost(externalHost); String externalHttp = externalHttpEdit.getText().toString(); if(!externalHttp.isEmpty()) { int externalHttpInt = getPortIntByString(externalHttp); if(externalHttpInt != 0) { patchCameraBuilder.setExternalHttpPort(externalHttpInt); } else { return null; } } String externalRtsp = externalRtspEdit.getText().toString(); if(!externalRtsp.isEmpty()) { int externalRtspInt = getPortIntByString(externalRtsp); if(externalRtspInt != 0) { patchCameraBuilder.setExternalRtspPort(externalRtspInt); } else { return null; } } } String jpgUrl = buildJpgUrlWithSlash(jpgUrlEdit.getText().toString()); if(jpgUrl.equals(cameraEdit.getJpgPath())) { patchCameraBuilder.setJpgUrl(jpgUrl); } return patchCameraBuilder; } private void buildVendorSpinner(ArrayList<Vendor> vendorList, String selectedVendor) { if(vendorMap == null) { vendorMap = new TreeMap<>(); } if(vendorMapIdAsKey == null) { vendorMapIdAsKey = new TreeMap<>(); } if(vendorList != null) { for(Vendor vendor : vendorList) { try { vendorMap.put(vendor.getName(), vendor.getId()); vendorMapIdAsKey.put(vendor.getId(), vendor.getName()); } catch(EvercamException e) { Log.e(TAG, e.toString()); } } } Set<String> set = vendorMap.keySet(); String[] vendorArray = Commons.joinStringArray(new String[]{getResources().getString(R .string.select_vendor)}, set.toArray(new String[0])); ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, vendorArray); spinnerArrayAdapter.setDropDownViewResource(R.layout.spinner); int selectedPosition = 0; if(discoveredCamera != null) { if(discoveredCamera.hasVendor()) { String vendorId = discoveredCamera.getVendor(); String vendorName = vendorMapIdAsKey.get(vendorId); selectedPosition = spinnerArrayAdapter.getPosition(vendorName); } } if(selectedVendor != null) { selectedPosition = spinnerArrayAdapter.getPosition(selectedVendor); } vendorSpinner.setAdapter(spinnerArrayAdapter); if(selectedPosition != 0) { vendorSpinner.setSelection(selectedPosition); } } private void buildModelSpinner(ArrayList<Model> modelList, String selectedModel) { if(selectedModel != null && !selectedModel.isEmpty()) { selectedModel = selectedModel.toLowerCase(Locale.UK); } if(modelMap == null) { modelMap = new TreeMap<>(); } modelMap.clear(); if(modelList == null) { modelSpinner.setEnabled(false); } else { if(modelList.size() == 0) { modelSpinner.setEnabled(false); } else { modelSpinner.setEnabled(true); for(Model model : modelList) { try { modelMap.put(model.getId(),model.getName()); } catch(EvercamException e) { Log.e(TAG, e.toString()); } } } } Collection<String> modelNameCollection = modelMap.values(); String[] fullModelArray = Commons.joinStringArray(new String[]{getResources().getString(R .string.select_model)}, modelNameCollection.toArray(new String[0])); ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, fullModelArray); spinnerArrayAdapter.setDropDownViewResource(R.layout.spinner); modelSpinner.setAdapter(spinnerArrayAdapter); int selectedPosition = 0; if(selectedModel != null) { if(modelMap.get(selectedModel) != null) { String selectedModelName = modelMap.get(selectedModel); selectedPosition = spinnerArrayAdapter.getPosition(selectedModelName); } } if(selectedPosition != 0) { modelSpinner.setSelection(selectedPosition); } else { modelSpinner.setSelection(spinnerArrayAdapter.getPosition(getString(R.string .model_default))); } } private void fillDefaults(Model model) { try { // FIXME: Sometimes vendor with no default model, contains default // jpg url. // TODO: Consider if no default values associated, clear defaults // that has been filled. Defaults defaults = model.getDefaults(); Auth basicAuth = defaults.getAuth(Auth.TYPE_BASIC); if(basicAuth != null) { usernameEdit.setText(basicAuth.getUsername()); passwordEdit.setText(basicAuth.getPassword()); } jpgUrlEdit.setText(defaults.getJpgURL()); if(!model.getName().equals(Model.DEFAULT_MODEL_NAME) && !jpgUrlEdit.getText().toString().isEmpty()) { //If user specified a specific model, make it not editable jpgUrlEdit.setFocusable(false); jpgUrlEdit.setClickable(true); } else { //For default model or jpgUrlEdit.setFocusable(true); jpgUrlEdit.setClickable(true); jpgUrlEdit.setFocusableInTouchMode(true); } } catch(EvercamException e) { Log.e(TAG, "Fill defaults: " + e.toString()); } } private void clearDefaults() { usernameEdit.setText(""); passwordEdit.setText(""); jpgUrlEdit.setText(""); //Make it editable when defaults are cleared jpgUrlEdit.setFocusable(true); jpgUrlEdit.setClickable(true); jpgUrlEdit.setFocusableInTouchMode(true); } private String getVendorIdFromSpinner() { String vendorName = vendorSpinner.getSelectedItem().toString(); if(vendorName.equals(getString(R.string.select_vendor))) { return ""; } else { return vendorMap.get(vendorName).toLowerCase(Locale.UK); } } private String getModelIdFromSpinner() { String modelName = modelSpinner.getSelectedItem().toString(); if(modelName.equals(getString(R.string.select_model))) { return ""; } else { for (Map.Entry<String, String> entry : modelMap.entrySet()) { if(entry.getValue().equals(modelName)) { return entry.getKey(); } } } return ""; } private String getModelNameFromSpinner() { String modelName = modelSpinner.getSelectedItem().toString(); if(modelName.equals(getString(R.string.select_model))) { return ""; } else { return modelName; } } public static String buildJpgUrlWithSlash(String originalJpgUrl) { String jpgUrl = ""; if(originalJpgUrl != null && !originalJpgUrl.equals("")) { if(!originalJpgUrl.startsWith("/")) { jpgUrl = "/" + originalJpgUrl; } else { jpgUrl = originalJpgUrl; } } return jpgUrl; } private void launchTestSnapshot() { String externalHost = externalHostEdit.getText().toString(); if(externalHost.isEmpty()) { CustomToast.showInCenter(this, getString(R.string.host_required)); } else { final String username = usernameEdit.getText().toString(); final String password = passwordEdit.getText().toString(); String jpgUrlString = jpgUrlEdit.getText().toString(); final String jpgUrl = buildJpgUrlWithSlash(jpgUrlString); String externalUrl = getExternalUrl(); if(externalUrl != null) { new TestSnapshotTask(externalUrl, jpgUrl, username, password, AddEditCameraActivity.this).executeOnExecutor(AsyncTask .THREAD_POOL_EXECUTOR); } } } /** * Check external HTTP port is filled or not and return external URL with * snapshot ending. */ private String getExternalUrl() { String externalHost = externalHostEdit.getText().toString(); String externalHttp = externalHttpEdit.getText().toString(); if(externalHttp.isEmpty()) { CustomToast.showInCenter(this, getString(R.string.external_http_required)); return null; } else { int externalHttpInt = getPortIntByString(externalHttp); if(externalHttpInt != 0) { return getString(R.string.prefix_http) + externalHost + ":" + externalHttp; } else { return null; } } } class RequestVendorListTask extends AsyncTask<Void, Void, ArrayList<Vendor>> { @Override protected void onPostExecute(ArrayList<Vendor> vendorList) { if(vendorList != null) { // If the camera has vendor, show as selected in spinner if(cameraEdit != null && !cameraEdit.getVendor().isEmpty()) { buildVendorSpinner(vendorList, cameraEdit.getVendor()); } else { buildVendorSpinner(vendorList, null); } } else { Log.e(TAG, "Vendor list is null"); } } @Override protected ArrayList<Vendor> doInBackground(Void... params) { try { return Vendor.getAll(); } catch(EvercamException e) { Log.e(TAG, e.toString()); } return null; } } class RequestModelListTask extends AsyncTask<Void, Void, ArrayList<Model>> { private String vendorId; public RequestModelListTask(String vendorId) { this.vendorId = vendorId; } @Override protected ArrayList<Model> doInBackground(Void... params) { try { return Model.getAllByVendorId(vendorId); } catch(EvercamException e) { EvercamPlayApplication.sendCaughtException(AddEditCameraActivity.this, e.toString() + " " + "with vendor id: " + vendorId); Log.e(TAG, e.toString()); } return null; } @Override protected void onPostExecute(ArrayList<Model> modelList) { if(modelList != null) { if(cameraEdit != null && !cameraEdit.getModel().isEmpty()) { buildModelSpinner(modelList, cameraEdit.getModel()); } else if(discoveredCamera != null && discoveredCamera.hasModel()) { buildModelSpinner(modelList, discoveredCamera.getModel()); } else { buildModelSpinner(modelList, null); } } } } class RequestDefaultsTask extends AsyncTask<Void, Void, Model> { private String vendorId; private String modelName; public RequestDefaultsTask(String vendorId, String modelName) { this.vendorId = vendorId; this.modelName = modelName; } @Override protected void onPreExecute() { clearDefaults(); } @Override protected Model doInBackground(Void... params) { try { ArrayList<Model> modelList = Model.getAll(modelName, vendorId); if(modelList.size() > 0) { return modelList.get(0); } } catch(EvercamException e) { Log.e(TAG, e.toString()); } return null; } @Override protected void onPostExecute(Model model) { if(model != null) { fillDefaults(model); } } } }