The final version for lede-gui (the phone app for device registration)
[iot2.git] / others / lede-gui / src / main / java / com / example / lede2 / HomeSecurity.java
diff --git a/others/lede-gui/src/main/java/com/example/lede2/HomeSecurity.java b/others/lede-gui/src/main/java/com/example/lede2/HomeSecurity.java
new file mode 100644 (file)
index 0000000..513d70b
--- /dev/null
@@ -0,0 +1,232 @@
+package com.example.lede2;\r
+\r
+import android.content.Context;\r
+import android.os.Bundle;\r
+import android.util.Log;\r
+import android.util.Pair;\r
+import android.view.View;\r
+import android.widget.AdapterView;\r
+import android.widget.ArrayAdapter;\r
+import android.widget.Button;\r
+import android.widget.ListView;\r
+import android.widget.Spinner;\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Properties;\r
+import java.util.Set;\r
+\r
+/**\r
+ * Created by Brian on 4/16/2018.\r
+ */\r
+\r
+public class HomeSecurity extends ApplicationWithRelations{\r
+\r
+    private SSH_MySQL getSetsAndRelations;\r
+    private SSH_MySQL getSetList;\r
+    private String filename;\r
+    private ArrayList<String> relationNames; //relations in this application\r
+\r
+    Context context;\r
+    private HashMap<String, ArrayList<String>> availableSets; //all possible sets pulled from pi\r
+\r
+\r
+    @Override\r
+    protected void onCreate( Bundle savedInstanceState) {\r
+        super.onCreate(savedInstanceState);\r
+        setContentView(R.layout.home_security);\r
+        super.context = this;\r
+        context = super.context;\r
+        getSetsAndRelations = new SSH_MySQL();\r
+        getSetList = new SSH_MySQL();\r
+        String getSetsAndRelationsCommand = this.getString(R.string.getHomeSecuritySetsAndRelationsCommand);\r
+        String getSetListCommand = this.getString(R.string.getSetList);\r
+        List<String> results = new ArrayList<>();\r
+        final String controllerConfigFilename = this.getString(R.string.homeSecurityControllerConfigFile);\r
+        filename  = this.getString(R.string.setsAndRelationsFilename);\r
+        relations = new HashMap<>();\r
+        relationNames = new ArrayList<>();\r
+        relationNameSpinner = (Spinner) findViewById(R.id.selectedRelation);\r
+        relationLeftSpinner = (Spinner) findViewById(R.id.relationLeftSpinner);\r
+        relationRightSpinner = (Spinner) findViewById(R.id.relationRightSpinner);\r
+        addRelationButton = (Button) findViewById(R.id.addRelationButton);\r
+        doneRelationButton = (Button) findViewById(R.id.addRelationDoneButton);\r
+        deleteRelationButton = (Button) findViewById(R.id.addRelationDeleteButton);\r
+        setOrRelationSpinner = (Spinner) findViewById(R.id.setsOrRelations);\r
+        super.hasIndependentSets = true;\r
+        super.independentSetNames = new ArrayList<>();\r
+        super.independentSetList = new HashMap<>();\r
+        super.addedSetList = new HashMap<>();\r
+        super.addedIndependentSets = new HashMap<>();\r
+\r
+        addRelationButton.setOnClickListener(this);\r
+        doneRelationButton.setOnClickListener(this);\r
+        deleteRelationButton.setOnClickListener(this);\r
+        addRelationsListView = (ListView) findViewById(R.id.selectedRelationsList);\r
+        addRelationsListView.setFocusable(false);\r
+        super.addedRelations = new HashMap<> ();\r
+        HashSet<Pair<String, String>> addedrelationsSet = new HashSet<>();\r
+        //addedRelations.put("", addedrelationsSet);\r
+        super.applicationSetList = new HashSet<>();\r
+        setHashMap = new HashMap<>();\r
+        //pull data from config file on iotuser\r
+        try {\r
+            getSetsAndRelations.execute(getSetsAndRelationsCommand);\r
+            Thread.sleep(1000);//To execute asyntask in ssh object, we have to sleep main thread\r
+            results = getSetsAndRelations.getResultLines();\r
+            while(results.size() == 0){\r
+                Thread.sleep(500);\r
+                results = getSetsAndRelations.getResultLines();\r
+            }\r
+            System.out.println(results);\r
+        } catch (Exception e) {\r
+            Log.d("Sleep exception", "exception at getSetsAndRelations");\r
+        }\r
+\r
+        addSSHResultsToConfig(results, controllerConfigFilename);\r
+        System.out.println("read from file: " + ConfigFileIO.readFromFile(controllerConfigFilename, this));\r
+        super.prop = new Properties();\r
+        File file = new File(getApplicationContext().getFilesDir(), controllerConfigFilename);\r
+        FileInputStream fis = null;\r
+        try{\r
+            fis = new FileInputStream(file);\r
+            super.prop.load(fis);\r
+            fis.close();\r
+        }\r
+        catch (IOException ex){\r
+            System.out.println("Error when reading SpeakerController Config file ");\r
+            ex.printStackTrace();\r
+        }\r
+\r
+        //add sets relations to the relation hashmap\r
+        super.numFields = Integer.parseInt(super.prop.getProperty("FIELD_NUMBER"));\r
+        for(int i = 0; i < super.numFields; i++){\r
+            String name = (super.prop.getProperty("FIELD_" + i));\r
+            if(super.prop.getProperty("FIELD_TYPE_" + i).equals("IoTRelation")) {\r
+                String relationPair = super.prop.getProperty("FIELD_CLASS_0_" + i) + "," + super.prop.getProperty("FIELD_CLASS_1_" + i);\r
+                addPair(name, relationPair);\r
+                relationNames.add(name);\r
+            }\r
+            if(super.prop.getProperty("FIELD_TYPE_" + i).equals("IoTSet")) {\r
+                if(super.prop.getProperty("FIELD_INDEPENDENT_" + i).equals("TRUE")){\r
+                    independentSetList.put(name, super.prop.getProperty("FIELD_CLASS_" + i));\r
+                    independentSetNames.add(name);\r
+                }\r
+                else{\r
+                    setHashMap.put(name, super.prop.getProperty("FIELD_CLASS_" + i));\r
+\r
+                }\r
+            }\r
+        }\r
+        //pull availableSets file from iotuser\r
+        try {\r
+            getSetList.execute(getSetListCommand);\r
+            Thread.sleep(1000);//To execute asyntask in ssh object, we have to sleep main thread\r
+            results = getSetList.getResultLines();\r
+            while(results.size() == 0){\r
+                Thread.sleep(500);\r
+                results = getSetList.getResultLines();\r
+            }\r
+            System.out.println(results);\r
+        } catch (Exception e) {\r
+            Log.d("Sleep exception", "exception at getSetsAndRelations");\r
+        }\r
+        String setListFilename = this.getString(R.string.setListFilename);\r
+        addSSHResultsToConfig(results, setListFilename);\r
+        availableSets =  createSetList(setListFilename);\r
+        System.out.println();\r
+\r
+        ArrayList<String> setsOrRelationArrayList = new ArrayList<>();\r
+        setsOrRelationArrayList.add("SETS");\r
+        setsOrRelationArrayList.add("RELATIONS");\r
+        ArrayAdapter setsOrRelationsArrayAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, setsOrRelationArrayList);\r
+        setOrRelationSpinner.setAdapter(setsOrRelationsArrayAdapter);\r
+\r
+\r
+\r
+        setOrRelationSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\r
+            @Override\r
+            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {\r
+                //set array adapter values = listed relations\r
+                if(setOrRelationSpinner.getSelectedItem().toString().equals("RELATIONS")) {\r
+                    ArrayAdapter nameAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, relationNames);\r
+                    nameAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
+                    relationNameSpinner.setAdapter(nameAdapter);\r
+                }\r
+                else{\r
+                    ArrayAdapter nameAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, independentSetNames);\r
+                    nameAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
+                    relationNameSpinner.setAdapter(nameAdapter);\r
+                }\r
+            }\r
+\r
+            @Override\r
+            public void onNothingSelected(AdapterView<?> adapterView) {\r
+\r
+            }\r
+        });\r
+\r
+\r
+\r
+\r
+        //sets left and right possible values to registered devices in the sets\r
+        relationNameSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\r
+            @Override\r
+            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {\r
+\r
+\r
+                if(setOrRelationSpinner.getSelectedItem().toString().equals("RELATIONS")) {\r
+                    relationRightSpinner.setVisibility(View.VISIBLE);\r
+                    String selectedRelation = relationNameSpinner.getSelectedItem().toString();\r
+                    ArrayList availableDevicesLeft = availableSets.get(relations.get(selectedRelation).first);\r
+                    ArrayList availableDevicesRight = availableSets.get(relations.get(selectedRelation).second);\r
+\r
+                    ArrayAdapter leftAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, availableDevicesLeft);\r
+                    ArrayAdapter rightAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, availableDevicesRight);\r
+\r
+                    leftAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
+                    rightAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
+                    relationLeftSpinner.setAdapter(leftAdapter);\r
+                    relationRightSpinner.setAdapter(rightAdapter);\r
+                }\r
+                else{\r
+                    relationRightSpinner.setVisibility(View.GONE);\r
+\r
+                    String selectedSet = relationNameSpinner.getSelectedItem().toString();\r
+                    ArrayList availableDevicesLeft = availableSets.get(independentSetList.get(selectedSet));\r
+                    ArrayAdapter leftAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, availableDevicesLeft);\r
+                    leftAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
+                    relationLeftSpinner.setAdapter(leftAdapter);\r
+                }\r
+            }\r
+            @Override\r
+            public void onNothingSelected(AdapterView<?> adapterView) {\r
+            }\r
+        });\r
+\r
+        ArrayList<String> addedRelationsArrayList = new ArrayList<>();\r
+        Set<String> relationTypes = super.addedRelations.keySet();\r
+        for(String s: relationTypes) {\r
+            for (Pair<String, String> temp : super.addedRelations.get(s)) {\r
+                addedRelationsArrayList.add(temp.first + " " + temp.second);\r
+            }\r
+        }\r
+        adapter = new ArrayAdapter(context, android.R.layout.simple_list_item_multiple_choice, addedRelationsArrayList);\r
+        addRelationsListView.setAdapter(adapter);\r
+        addRelationsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {\r
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {\r
+            }});\r
+        for(int i= 0; i < relationNames.size(); i++){\r
+            Pair<String, String> tempPair =  relations.get(relationNames.get(i));\r
+            applicationSetList.add(tempPair.first);\r
+            applicationSetList.add(tempPair.second);\r
+        }\r
+    }\r
+\r
+\r
+\r
+}\r