The final version for lede-gui (the phone app for device registration)
[iot2.git] / others / lede-gui / src / main / java / com / example / lede2 / AddDeviceActivity.java
index fc4a0751bdb85383cac711aeecf166b4a228f6c9..8a83c4eb11fd712fbf60a97d660a6498939e881d 100644 (file)
-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