-package com.example.lede2;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
-import android.util.Log;
-import android.view.Gravity;
-import android.view.View;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.TextView;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.sql.*;
-
-
-public class AddDeviceActivity extends AppCompatActivity implements View.OnClickListener,View.OnFocusChangeListener {
-
- Button doneButton;
- TextView databaseInfo;
- TextView databaseAddressInfo;
- private SSH_MySQL ssh;//Connection object between Android & Host
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_add_device);
-
- doneButton = (Button) findViewById(R.id.doneButton);
- databaseInfo = (EditText)findViewById(R.id.textInfo);
- databaseAddressInfo = (EditText)findViewById(R.id.textInfoAddress);
-
- doneButton.setOnClickListener(this);
- databaseInfo.setOnFocusChangeListener(this);
- databaseAddressInfo.setOnFocusChangeListener(this);
- ssh = new SSH_MySQL();
- // Set config text from file for device
- try {
- InputStream is = getAssets().open(MainActivity.DEF_ADD_DEVICE_FILE);
- int size = is.available();
- byte[] buffer = new byte[size];
- is.read(buffer);
- is.close();
- String text = new String(buffer);
- databaseInfo.setGravity(Gravity.LEFT);
- databaseInfo.setText(text);
- Log.d("LOADINGFILE", "Add device info file is already loaded!");
- } catch (IOException ex) {
- Log.d("LOADINGFILE", "Add device info file is NOT loaded!");
- ex.printStackTrace();
- }
- // Set config text from file for device address
- try {
- InputStream is = getAssets().open(MainActivity.DEF_ADD_DEVICE_ADDRESS_FILE);
- int size = is.available();
- byte[] buffer = new byte[size];
- is.read(buffer);
- is.close();
- String text = new String(buffer);
- databaseAddressInfo.setGravity(Gravity.LEFT);
- databaseAddressInfo.setText(text);
- Log.d("LOADINGFILE", "Add device address info file is already loaded!");
- } catch (IOException ex) {
- Log.d("LOADINGFILE", "Add device address info file is NOT loaded!");
- ex.printStackTrace();
- }
-
- }
-
- @Override
- public void onClick(View v) {
- if(v == doneButton){
- // 1) Create a new file and insert the configuration
- // 2) Run iotinstaller code for device installation
- // 3) Remove the existing config file
- // 4) Repeat 1, 2, and 3 for device address
- ssh.execute("echo \"" + databaseInfo.getText().toString() + "\" >> " +
- MainActivity.DEF_MYSQL_CONFIG_FILE + ";" +
- MainActivity.DEF_INSTALL_CMD + " " + MainActivity.DEF_MYSQL_CONFIG_FILE + ";" +
- "rm -rf " + MainActivity.DEF_MYSQL_CONFIG_FILE + ";" +
- // repeat process for device address
- "echo \"" + databaseAddressInfo.getText().toString() + "\" >> " +
- MainActivity.DEF_MYSQL_CONFIG_FILE + ";" +
- MainActivity.DEF_INSTALL_ADDRESS_CMD + " " + MainActivity.DEF_MYSQL_CONFIG_FILE + ";" +
- "rm -rf " + MainActivity.DEF_MYSQL_CONFIG_FILE);
- finish();
- }
- }
-
- @Override
- public void onFocusChange(View view, boolean hasFocus) {
- InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
- if (hasFocus) {
- imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
- } else {
- imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
- }
- }
-}
+package com.example.lede2;\r
+\r
+import android.app.ActivityManager;\r
+import android.app.ProgressDialog;\r
+import android.content.Context;\r
+import android.os.AsyncTask;\r
+import android.os.Bundle;\r
+import android.os.Handler;\r
+import android.support.design.widget.Snackbar;\r
+import android.support.v7.app.AppCompatActivity;\r
+import android.util.Log;\r
+import android.util.Pair;\r
+import android.view.View;\r
+import android.view.WindowManager;\r
+import android.view.inputmethod.InputMethodManager;\r
+import android.widget.AdapterView;\r
+import android.widget.ArrayAdapter;\r
+import android.widget.Button;\r
+import android.widget.EditText;\r
+import android.widget.ProgressBar;\r
+import android.widget.Spinner;\r
+import android.widget.TextView;\r
+import android.widget.Toast;\r
+\r
+import java.io.File;\r
+import java.nio.file.FileAlreadyExistsException;\r
+import java.text.CollationElementIterator;\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+\r
+public class AddDeviceActivity extends AppCompatActivity implements View.OnClickListener,View.OnFocusChangeListener {\r
+\r
+ DatabaseObject databaseObject;\r
+ //DatabaseSubtypeObject databaseSubtypeObject;\r
+ Button doneButton;\r
+ EditText databaseInfo;\r
+ Spinner spinner1;\r
+ Spinner spinner2;\r
+ Spinner spinner3;\r
+ Spinner spinner4;\r
+ ProgressBar progressBar;\r
+ private ArrayAdapter subtypeAdapter;\r
+ private ArrayAdapter paramAdapter;\r
+ private ArrayAdapter fieldAdapter;\r
+ String lastParamChosen;\r
+ TextView databaseAddressInfo;\r
+ protected String database_information_filename;\r
+ protected String id_information_filename;\r
+ Context context;\r
+ HashMap<String, String> userInputs;\r
+ ProgressDialog dialog;\r
+\r
+\r
+ private SSH_MySQL ssh;//Connection object between Android & Host\r
+\r
+ @Override\r
+ protected void onCreate(Bundle savedInstanceState) {\r
+ super.onCreate(savedInstanceState);\r
+ setContentView(R.layout.activity_add_device);\r
+\r
+\r
+ doneButton = (Button) findViewById(R.id.doneButton);\r
+ spinner1 = (Spinner) findViewById(R.id.spinner1);\r
+ spinner2 = (Spinner) findViewById(R.id.spinner2);\r
+ spinner3 = (Spinner) findViewById(R.id.spinner3);\r
+ spinner4 = (Spinner) findViewById(R.id.spinner4);\r
+ databaseInfo = (EditText)findViewById(R.id.textInfo);\r
+ progressBar = (ProgressBar)findViewById(R.id.progressBar);\r
+ progressBar.setVisibility(View.INVISIBLE);\r
+ progressBar.setMax(10);\r
+ //databaseAddressInfo = (EditText)findViewById(R.id.textInfoAddress);\r
+ database_information_filename = this.getString(R.string.device_param_config_filename);\r
+ id_information_filename = this.getString(R.string.device_id_config_filename);\r
+ userInputs = new HashMap<String, String>();\r
+ context = this;\r
+ lastParamChosen = "";\r
+\r
+ //looks through database to see possible subtypes for dropdown box 2\r
+ spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\r
+ //set spinner2 values = subtypes of type chosen for spinner 1\r
+ @Override\r
+ public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {\r
+\r
+ String selectedType = spinner1.getSelectedItem().toString();\r
+ Set<String> keysForSubType = (databaseObject.getTypeObject(selectedType)).getKeySet();\r
+ ArrayList<String> subtypes = new ArrayList<String>();\r
+ for(String key: keysForSubType){\r
+ subtypes.add(key);\r
+ }\r
+ Collections.sort(subtypes);\r
+ subtypeAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, subtypes);\r
+ subtypeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
+ spinner2.setAdapter(subtypeAdapter);\r
+\r
+ }\r
+\r
+ @Override\r
+ public void onNothingSelected(AdapterView<?> adapterView) {\r
+\r
+ }\r
+ });\r
+ spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\r
+ //set spinner 3 values based on if the selected subtype has params and/or addressparams\r
+ @Override\r
+ public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {\r
+ DatabaseSubtypeObject subtypeObject = getCurrentSubtypeObject();\r
+\r
+ ArrayList<String> paramType = new ArrayList<String>();\r
+ if(subtypeObject.getParams().size() > 0){\r
+ paramType.add("Device");\r
+ }\r
+ if(subtypeObject.getAddressParams().size() > 0){\r
+ paramType.add("Address");\r
+ }\r
+ if(subtypeObject.getZigbeeAddressParams().size()>0){\r
+ paramType.add("Zigbee");\r
+ }\r
+ //if both empty(example room)\r
+ if(subtypeObject.getAddressParams().size() == 0 && subtypeObject.getParams().size() == 0){\r
+ paramType.add("No Device or Address Parameters");\r
+ }\r
+ Collections.sort(paramType);\r
+ paramAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, paramType);\r
+ spinner3.setAdapter(paramAdapter);\r
+ }\r
+\r
+ @Override\r
+ public void onNothingSelected(AdapterView<?> adapterView) {\r
+\r
+ }\r
+ });\r
+ spinner3.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\r
+ //set spinner 4 value based on spinner1-3 values (actual params)\r
+ @Override\r
+ public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {\r
+ DatabaseSubtypeObject subtypeObject = getCurrentSubtypeObject();\r
+ List<String> keysForSubType = new ArrayList<>();\r
+ //for devices that have no fields ex Rooms\r
+ if(spinner3.getSelectedItem().toString().equals("No Device or Address Parameters")) {\r
+ keysForSubType.add("No Fields");\r
+\r
+ databaseInfo.setVisibility(View.GONE);\r
+ }\r
+ if(spinner3.getSelectedItem().toString().equals("Device")) {\r
+ databaseInfo.setVisibility(View.VISIBLE);\r
+ if(subtypeObject.getNumParams() > 0){\r
+ //add only params that have USER value\r
+ ArrayList<Pair<String, String>> tempList = subtypeObject.getParams();\r
+ for(int j = 0; j < tempList.size(); j++){\r
+ if(tempList.get(j).second.equals("USER")){\r
+ keysForSubType.add(tempList.get(j).first);\r
+ }\r
+ }\r
+\r
+ }\r
+ }\r
+ else if(spinner3.getSelectedItem().toString().equals("Zigbee")){\r
+ //setting field name for zigbee\r
+ databaseInfo.setVisibility(View.VISIBLE);\r
+ keysForSubType.add("DEVICEADDRESS");\r
+ }\r
+ else{\r
+ //if selected value is address\r
+ if(subtypeObject.getNumAddressParams() > 0){\r
+ databaseInfo.setVisibility(View.VISIBLE);\r
+ //add only params that have USER value\r
+ ArrayList<ArrayList<Pair<String, String>>> tempList = subtypeObject.getAddressParams();\r
+ for(int j = 0; j < tempList.size(); j++){\r
+ for(int k = 0; k < tempList.get(j).size(); k++){\r
+ if(tempList.get(j).get(k).second.equals("USER")){\r
+ if(!keysForSubType.contains(tempList.get(j).get(k).first)) {\r
+ keysForSubType.add(tempList.get(j).get(k).first);\r
+ }\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+ }\r
+ }\r
+ //List<String> keysForSubType = (databaseObject.getTypeObject(selectedType)).getSubtypeObject(selectedSubtype).getParams();\r
+\r
+ ArrayList<String> params = new ArrayList<String>();\r
+ for(String key: keysForSubType){\r
+ params.add(key);\r
+ }\r
+ Collections.sort(params);\r
+ fieldAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, params);\r
+ fieldAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
+ spinner4.setAdapter(fieldAdapter);\r
+ }\r
+\r
+ @Override\r
+ public void onNothingSelected(AdapterView<?> adapterView) {\r
+\r
+ }\r
+ });\r
+ spinner4.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\r
+ //saves user input into a hashmap that is used later to create ssh command\r
+ @Override\r
+ public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {\r
+\r
+ if(!spinner3.getSelectedItem().toString().equals("No Device or Address Parameters")) {\r
+ if (lastParamChosen.equals("")) {\r
+ lastParamChosen = spinner2.getSelectedItem().toString() + spinner3.getSelectedItem().toString() + spinner4.getSelectedItem().toString();\r
+\r
+ } else {\r
+ String enteredText = databaseInfo.getText().toString();\r
+ userInputs.put(lastParamChosen, enteredText);\r
+ String currentSelections = spinner2.getSelectedItem().toString() + spinner3.getSelectedItem().toString() + spinner4.getSelectedItem().toString();\r
+ if (!userInputs.containsKey(currentSelections)) {\r
+ userInputs.put(currentSelections, "");\r
+ }\r
+ databaseInfo.setText(userInputs.get(currentSelections));\r
+ lastParamChosen = currentSelections;\r
+ }\r
+ }\r
+ else{\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void onNothingSelected(AdapterView<?> adapterView) {\r
+\r
+ }\r
+ });\r
+ doneButton.setOnClickListener(this);\r
+ // Set config text from file for device\r
+ //pull information from config file and uses it to generate main database object\r
+\r
+ String idInformation = ConfigFileIO.readFromFile(id_information_filename, this);\r
+ databaseObject = ConfigFileIO.createDatabaseObject(this, idInformation );\r
+\r
+\r
+\r
+ //ConfigFileIO.printDatabaseObject(databaseObject);\r
+ Set<String> keysForType = databaseObject.getKeySet();\r
+ ArrayList<String> types = new ArrayList<String>();\r
+ for(String key: keysForType){\r
+ types.add(key);\r
+ }\r
+ //sets value for spinner 1\r
+ Collections.sort(types);\r
+ ArrayAdapter typeAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, types);\r
+ typeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
+ spinner1.setAdapter(typeAdapter);\r
+\r
+\r
+ }\r
+\r
+ @Override\r
+ public void onClick(View v) {\r
+ if(v == doneButton){\r
+ String enteredText = databaseInfo.getText().toString();\r
+ //combines user input into a command for the pi\r
+ String keyForUserInput = spinner2.getSelectedItem().toString() + spinner3.getSelectedItem().toString() + spinner4.getSelectedItem().toString();\r
+ userInputs.put(keyForUserInput, enteredText);\r
+ if(!sufficientEntries()) {\r
+ Snackbar done = Snackbar.make(findViewById(R.id.done),\r
+ "Please Enter all required fields for selected device type", 2000);\r
+ done.show();\r
+ }\r
+ else {\r
+ Snackbar done = Snackbar.make(findViewById(R.id.done), "Updating IoTDeviceAddress.config", 2000);\r
+ done.show();\r
+ progressBar.setVisibility(View.VISIBLE);\r
+ doneButton.setAlpha(.5f);\r
+ doneButton.setClickable(false);\r
+\r
+\r
+\r
+\r
+\r
+ String sqlCommand = generateSQLCommand();\r
+ System.out.println(sqlCommand);\r
+ Log.d("sqlcommand", sqlCommand);\r
+ System.out.println("");\r
+\r
+ ssh = new SSH_MySQL();\r
+ ssh.execute(sqlCommand);\r
+ try {\r
+ Thread.sleep(1000);\r
+ List<String> result = ssh.getResultLines();\r
+ for (int i = 0; i < result.size(); i++) {\r
+ System.out.println("result" + result.get(i));\r
+ }\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ updateDatabase();\r
+\r
+ updateIoTDeviceAddress();\r
+// done = Snackbar.make(findViewById(R.id.done),\r
+// "Updating SetList.config", 2000);\r
+// done.show();\r
+ updateSetList();\r
+ finish();\r
+ }\r
+ }\r
+ }\r
+ //determines if all fields have been entered\r
+ public boolean sufficientEntries(){\r
+ boolean sufficient = true;\r
+ DatabaseSubtypeObject subtypeObject = getCurrentSubtypeObject();\r
+ ArrayList<Pair<String, String>> params = subtypeObject.getParams();\r
+ ArrayList<ArrayList<Pair<String, String>>> addressParams = subtypeObject.getAddressParams();\r
+ ArrayList<ArrayList<Pair<String, String>>> zigbeeAddressParams = subtypeObject.getZigbeeAddressParams();\r
+ if(spinner3.getSelectedItem().toString().equals("No Device or Address Parameters")) {\r
+ return true;\r
+ }\r
+ if(params.size()>0){\r
+ for(int i = 0; i < params.size(); i++){\r
+ if(!params.get(i).second.equals("USER")){\r
+ continue;\r
+ }\r
+ if(!userInputs.containsKey(spinner2.getSelectedItem().toString() + "Device" + params.get(i).first) ||\r
+ userInputs.get(spinner2.getSelectedItem().toString() + "Device" + params.get(i).first).equals("")){\r
+ sufficient = false;\r
+ }\r
+ }\r
+ }\r
+ if(addressParams.size()>0){\r
+ for(int i = 0; i < addressParams.size(); i++){\r
+ for(int j = 0;j < addressParams.get(i).size(); j++) {\r
+ if(!addressParams.get(i).get(j).second.equals("USER")){\r
+ continue;\r
+ }\r
+ if (!userInputs.containsKey(spinner2.getSelectedItem().toString() + "Address" + addressParams.get(i).get(j).first) ||\r
+ userInputs.get(spinner2.getSelectedItem().toString() + "Address" + addressParams.get(i).get(j).first).equals("")) {\r
+ sufficient = false;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ if(zigbeeAddressParams.size()>0){\r
+ for(int i = 0; i < zigbeeAddressParams.size(); i++){\r
+ for(int j = 0;j < zigbeeAddressParams.get(i).size(); j++) {\r
+ if(!zigbeeAddressParams.get(i).get(j).second.equals("USER")){\r
+ continue;\r
+ }\r
+ if (!userInputs.containsKey(spinner2.getSelectedItem().toString() + "Zigbee" + zigbeeAddressParams.get(i).get(j).first) ||\r
+ userInputs.get(spinner2.getSelectedItem().toString() + "Zigbee" + zigbeeAddressParams.get(i).get(j).first).equals("")) {\r
+ sufficient = false;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return sufficient;\r
+ }\r
+\r
+ @Override\r
+ public void onFocusChange(View view, boolean hasFocus) {\r
+ InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);\r
+ if (hasFocus) {\r
+ imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);\r
+ } else {\r
+ imm.hideSoftInputFromWindow(view.getWindowToken(), 0);\r
+ }\r
+ }\r
+ //generates command for adding both device and address device. May need to expand for zigbee\r
+ public String generateSQLCommand(){\r
+ String command = "";\r
+ String paramInfo = "";\r
+ String addressParamInfo = "";\r
+ DatabaseSubtypeObject subtypeObject = getCurrentSubtypeObject();\r
+ int numAddresses = subtypeObject.getNumAddresses();\r
+ int numZigbeeAddresses = subtypeObject.getNumZigbeeAddresses();\r
+ // 1) Create a new file and insert the configuration\r
+ // 2) Run iotinstaller code for device installation\r
+ // 3) Remove the existing config file\r
+ // 4) Repeat 1, 2, and 3 for device address\r
+ command += "echo \"" + generateDevFields() + "\" >> " +\r
+ MainActivity.DEF_MYSQL_CONFIG_FILE + ";" +\r
+ MainActivity.DEF_INSTALL_CMD + " " + MainActivity.DEF_MYSQL_CONFIG_FILE + ";" +\r
+ "rm -rf " + MainActivity.DEF_MYSQL_CONFIG_FILE + ";";\r
+ // repeat process for device address\r
+ for(int i = 0; i <numAddresses; i++ ) {\r
+ boolean multiple = true;\r
+ if(numAddresses == 1){\r
+ multiple = false;\r
+ }\r
+ command += "echo \"" + generateAddressFields(i, multiple) + "\" >> " +\r
+ MainActivity.DEF_MYSQL_CONFIG_FILE + ";" +\r
+ MainActivity.DEF_INSTALL_ADDRESS_CMD + " " + MainActivity.DEF_MYSQL_CONFIG_FILE + ";"\r
+ + "rm -rf " + MainActivity.DEF_MYSQL_CONFIG_FILE + ";";\r
+ }\r
+ for(int i = 0; i < numZigbeeAddresses; i++){\r
+ boolean multiple = true;\r
+ if(numZigbeeAddresses == 1){\r
+ multiple = false;\r
+ }\r
+ command += "echo \"" + generateZigBeeAddressFields(i, multiple) + "\" >> " +\r
+ MainActivity.DEF_MYSQL_CONFIG_FILE + ";" +\r
+ MainActivity.DEF_INSTALL_ZBADDRESS_CMD + " " + MainActivity.DEF_MYSQL_CONFIG_FILE + ";"\r
+ + "rm -rf " + MainActivity.DEF_MYSQL_CONFIG_FILE + ";";\r
+ }\r
+\r
+ return command;\r
+\r
+ }\r
+ //specific device information to be inserted into the sql command. follows format seen in config file on pi\r
+ public String generateDevFields(){\r
+ String fields = "";\r
+ DatabaseSubtypeObject subtypeObject = getCurrentSubtypeObject();\r
+ //IotMain Table\r
+ fields += context.getResources().getString(R.string.database_name) + "\n"\r
+ + "ID " + subtypeObject.getNextID() + "\n"\r
+ + "TYPE " + spinner1.getSelectedItem().toString()+ "\n"\r
+ + "TYPESPECIFIC " + spinner2.getSelectedItem().toString()+ "\n"\r
+ + "END" + "\n\n";\r
+ //This sets up the param types and size. special case for devices with no params\r
+ if(subtypeObject.getNumParams() == 0){\r
+ fields += "Table 1" + "\n"\r
+ + "EMPTY VARCHAR 0 " + "\n";\r
+ }\r
+\r
+ //Case for when there are params\r
+ else {\r
+ fields += "Table " + subtypeObject.getNumParams() + "\n";\r
+ }\r
+ ArrayList<Pair<String,String>> params = subtypeObject.getParams();\r
+ for(int i = params.size()-1; i >= 0; i--){\r
+ fields += params.get(i).first + " VARCHAR 20 \n";\r
+ }\r
+ fields += "END\n\n";\r
+ //data for params\r
+ fields += "Data \n";\r
+ for(int i = params.size()-1; i >= 0; i--){\r
+ fields += userInputs.get(spinner2.getSelectedItem().toString() +\r
+ "Device" +\r
+ params.get(i).first) + "\n";\r
+ }\r
+ fields += "END\n\n";\r
+ return fields;\r
+ }\r
+\r
+\r
+ //refactor with string builder but works for now\r
+ public String generateAddressFields(int i, boolean multiple){\r
+ String fields = "";\r
+ String addressNumber = "";\r
+ if(multiple){\r
+ addressNumber = Integer.toString(i+1);\r
+ }\r
+ DatabaseSubtypeObject subtypeObject = getCurrentSubtypeObject();\r
+ fields += "ID=" + subtypeObject.getNextID() + "\n" ;\r
+ fields += "ADDRESSFOR=" + subtypeObject.getName()+ "Add"+ addressNumber + "\n" ;\r
+ ArrayList<ArrayList<Pair<String,String>>> addressParams = subtypeObject.getAddressParams();\r
+ String currentAddressParam = "";\r
+ for(int j = 0; j <addressParams.get(i).size(); j++) {\r
+ //if the value for current address parameter is user, use the input values\r
+ if(addressParams.get(i).get(j).second.equals("USER")){\r
+ currentAddressParam = addressParams.get(i).get(j).first;\r
+ fields += currentAddressParam + "=" + userInputs.get(spinner2.getSelectedItem().toString() + "Address" + currentAddressParam) + "\n";\r
+ }\r
+ //if the value for the current address is not user, use the predefined values\r
+ else{\r
+ currentAddressParam = addressParams.get(i).get(j).first;\r
+ fields += currentAddressParam + "=" + addressParams.get(i).get(j).second + "\n";\r
+ }\r
+ }\r
+ fields += "END\n\n";\r
+ return fields;\r
+ }\r
+ public String generateZigBeeAddressFields(int i , boolean multiple){\r
+ String fields = "";\r
+ String addressNumber = "";\r
+ if(multiple){\r
+ addressNumber = Integer.toString(i+1);\r
+ }\r
+ DatabaseSubtypeObject subtypeObject = getCurrentSubtypeObject();\r
+ fields += "ID=" + subtypeObject.getNextID() + "\n" ;\r
+ fields += "ADDRESSFOR=" + subtypeObject.getName()+ "ZBAdd"+ addressNumber + "\n" ;\r
+ ArrayList<ArrayList<Pair<String,String>>> zigbeeAddressParams = subtypeObject.getZigbeeAddressParams();\r
+ String currentAddressParam = "";\r
+ for(int j = 0; j < zigbeeAddressParams.get(i).size(); j++) {\r
+ //if the value for current address parameter is user, use the input values\r
+ if(zigbeeAddressParams.get(i).get(j).second.equals("USER")){\r
+ currentAddressParam = zigbeeAddressParams.get(i).get(j).first;\r
+ fields += currentAddressParam + "=" + userInputs.get(spinner2.getSelectedItem().toString() + "Zigbee" + currentAddressParam) + "\n";\r
+ }\r
+ //if the value for the current address is not user, use the predefined values\r
+ else{\r
+ currentAddressParam = zigbeeAddressParams.get(i).get(j).first;\r
+ fields += currentAddressParam + "=" + zigbeeAddressParams.get(i).get(j).second + "\n";\r
+ }\r
+ }\r
+ fields += "END\n\n";\r
+ return fields;\r
+ }\r
+\r
+ //update local database object and local database config file\r
+ public void updateDatabase(){\r
+ DatabaseSubtypeObject subtypeObject = getCurrentSubtypeObject();\r
+ String deviceID = subtypeObject.getName() + " " + subtypeObject.getNextID() + "\n";\r
+ ConfigFileIO.writeToFile(id_information_filename, deviceID, this);\r
+ subtypeObject.insertID();\r
+ }\r
+ private void updateSetList(){\r
+ SSH_MySQL ssh = new SSH_MySQL();\r
+ String command = this.getString(R.string.updateSetList);\r
+ List<String> results = new ArrayList<>();\r
+ String setListFilename = this.getString(R.string.setListFilename);\r
+ try {\r
+ ssh.execute(command);\r
+ Thread.sleep(1000);//To execute asyntask in ssh object, we have to sleep main thread\r
+ results = ssh.getResultLines();\r
+ while(results.size() == 0){\r
+ Thread.sleep(500);\r
+ results = ssh.getResultLines();\r
+ }\r
+ System.out.println(results);\r
+ } catch (Exception e) {\r
+ Log.d("Sleep exception", "exception at getSetsAndRelations");\r
+ }\r
+ }\r
+ private void updateIoTDeviceAddress(){\r
+ SSH_MySQL ssh = new SSH_MySQL();\r
+ String command = this.getString(R.string.updateIoTDeviceAddress);\r
+ List<String> results = new ArrayList<>();\r
+ String iotDeviceAddressFilename = this.getString(R.string.updateIoTDeviceAddress);\r
+ try {\r
+ ssh.execute(command);\r
+ Thread.sleep(1000);//To execute asyntask in ssh object, we have to sleep main thread\r
+ results = ssh.getResultLines();\r
+ while(results.size() == 0){\r
+ Thread.sleep(500);\r
+ results = ssh.getResultLines();\r
+ }\r
+ System.out.println(results);\r
+ } catch (Exception e) {\r
+ Log.d("Sleep exception", "exception at getSetsAndRelations");\r
+ }\r
+\r
+ }\r
+\r
+ protected void addSSHResultsToConfig(List<String> results, String filename) {\r
+ ConfigFileIO.writeToNewFile(filename,"", this );\r
+ File dir = getFilesDir();\r
+ File file = new File(dir, filename);\r
+ file.delete();\r
+ for (int i = 0; i < results.size(); i++) {\r
+ ConfigFileIO.writeToFile(filename, results.get(i), this);\r
+ }\r
+ }\r
+\r
+\r
+ public DatabaseSubtypeObject getCurrentSubtypeObject(){\r
+ return databaseObject.getTypeObject(spinner1.\r
+ getSelectedItem().toString()).getSubtypeObject(spinner2.getSelectedItem().toString());\r
+ }\r
+\r
+\r
+ public class Progress extends AsyncTask<Void, Integer, Void> {\r
+ boolean finished;\r
+\r
+\r
+ @Override\r
+ protected void onPreExecute() {\r
+ super.onPreExecute();\r
+\r
+ Log.d("progress", "after dialog.show");\r
+ }\r
+\r
+ @Override\r
+ protected Void doInBackground(Void... voids) {\r
+ for(int i = 0; i < 10; i++){\r
+ try {\r
+ Thread.sleep(100);\r
+ publishProgress(i);\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+\r
+ }\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ protected void onPostExecute(Void aVoid) {\r
+ super.onPostExecute(aVoid);\r
+\r
+ }\r
+\r
+ @Override\r
+ protected void onProgressUpdate(Integer... values) {\r
+ super.onProgressUpdate(values);\r
+ progressBar.setProgress(values[0]);\r
+ }\r
+\r
+\r
+\r
+\r
+ public void finished(){\r
+\r
+ }\r
+ }\r
+\r
+}\r