The final version for lede-gui (the phone app for device registration)
[iot2.git] / others / lede-gui / src / main / java / com / example / lede2 / Irrigation.java
1 package com.example.lede2;\r
2 \r
3 import android.content.Context;\r
4 import android.os.Bundle;\r
5 import android.util.Log;\r
6 import android.util.Pair;\r
7 import android.view.View;\r
8 import android.widget.AdapterView;\r
9 import android.widget.ArrayAdapter;\r
10 import android.widget.Button;\r
11 import android.widget.ListView;\r
12 import android.widget.Spinner;\r
13 import java.io.File;\r
14 import java.io.FileInputStream;\r
15 import java.io.IOException;\r
16 import java.util.ArrayList;\r
17 import java.util.HashMap;\r
18 import java.util.HashSet;\r
19 import java.util.List;\r
20 import java.util.Properties;\r
21 import java.util.Set;\r
22 \r
23 /**\r
24  * Created by Brian on 4/16/2018.\r
25  */\r
26 \r
27 public class Irrigation extends ApplicationWithRelations{\r
28 \r
29     private SSH_MySQL getSetsAndRelations;\r
30     private SSH_MySQL getSetList;\r
31     private String filename;\r
32     private ArrayList<String> relationNames; //relations in this application\r
33 \r
34     Context context;\r
35     private HashMap<String, ArrayList<String>> availableSets; //all possible sets pulled from pi\r
36 \r
37 \r
38     @Override\r
39     protected void onCreate( Bundle savedInstanceState) {\r
40         super.onCreate(savedInstanceState);\r
41         setContentView(R.layout.home_security);\r
42         super.context = this;\r
43         context = super.context;\r
44         getSetsAndRelations = new SSH_MySQL();\r
45         getSetList = new SSH_MySQL();\r
46         String getSetsAndRelationsCommand = this.getString(R.string.getIrrigationSetsAndRelationsCommand);\r
47         String getSetListCommand = this.getString(R.string.getSetList);\r
48         List<String> results = new ArrayList<>();\r
49         final String controllerConfigFilename = this.getString(R.string.irrigationControllerConfigFile);\r
50         filename  = this.getString(R.string.setsAndRelationsFilename);\r
51         relations = new HashMap<>();\r
52         relationNames = new ArrayList<>();\r
53         relationNameSpinner = (Spinner) findViewById(R.id.selectedRelation);\r
54         relationLeftSpinner = (Spinner) findViewById(R.id.relationLeftSpinner);\r
55         relationRightSpinner = (Spinner) findViewById(R.id.relationRightSpinner);\r
56         addRelationButton = (Button) findViewById(R.id.addRelationButton);\r
57         doneRelationButton = (Button) findViewById(R.id.addRelationDoneButton);\r
58         deleteRelationButton = (Button) findViewById(R.id.addRelationDeleteButton);\r
59         setOrRelationSpinner = (Spinner) findViewById(R.id.setsOrRelations);\r
60         super.hasIndependentSets = true;\r
61         super.independentSetNames = new ArrayList<>();\r
62         super.independentSetList = new HashMap<>();\r
63         super.addedSetList = new HashMap<>();\r
64         super.addedIndependentSets = new HashMap<>();\r
65 \r
66         addRelationButton.setOnClickListener(this);\r
67         doneRelationButton.setOnClickListener(this);\r
68         deleteRelationButton.setOnClickListener(this);\r
69         addRelationsListView = (ListView) findViewById(R.id.selectedRelationsList);\r
70         addRelationsListView.setFocusable(false);\r
71         super.addedRelations = new HashMap<> ();\r
72         HashSet<Pair<String, String>> addedrelationsSet = new HashSet<>();\r
73         //addedRelations.put("", addedrelationsSet);\r
74         super.applicationSetList = new HashSet<>();\r
75         setHashMap = new HashMap<>();\r
76         //pull data from config file on iotuser\r
77         try {\r
78             getSetsAndRelations.execute(getSetsAndRelationsCommand);\r
79             Thread.sleep(1000);//To execute asyntask in ssh object, we have to sleep main thread\r
80             results = getSetsAndRelations.getResultLines();\r
81             while(results.size() == 0){\r
82                 Thread.sleep(500);\r
83                 results = getSetsAndRelations.getResultLines();\r
84             }\r
85             System.out.println(results);\r
86         } catch (Exception e) {\r
87             Log.d("Sleep exception", "exception at getSetsAndRelations");\r
88         }\r
89 \r
90         addSSHResultsToConfig(results, controllerConfigFilename);\r
91         System.out.println("read from file: " + ConfigFileIO.readFromFile(controllerConfigFilename, this));\r
92         super.prop = new Properties();\r
93         File file = new File(getApplicationContext().getFilesDir(), controllerConfigFilename);\r
94         FileInputStream fis = null;\r
95         try{\r
96             fis = new FileInputStream(file);\r
97             super.prop.load(fis);\r
98             fis.close();\r
99         }\r
100         catch (IOException ex){\r
101             System.out.println("Error when reading SpeakerController Config file ");\r
102             ex.printStackTrace();\r
103         }\r
104 \r
105         //add sets relations to the relation hashmap\r
106         super.numFields = Integer.parseInt(super.prop.getProperty("FIELD_NUMBER"));\r
107         for(int i = 0; i < super.numFields; i++){\r
108             String name = (super.prop.getProperty("FIELD_" + i));\r
109             if(super.prop.getProperty("FIELD_TYPE_" + i).equals("IoTRelation")) {\r
110                 String relationPair = super.prop.getProperty("FIELD_CLASS_0_" + i) + "," + super.prop.getProperty("FIELD_CLASS_1_" + i);\r
111                 addPair(name, relationPair);\r
112                 relationNames.add(name);\r
113             }\r
114             if(super.prop.getProperty("FIELD_TYPE_" + i).equals("IoTSet")) {\r
115                 if(super.prop.getProperty("FIELD_INDEPENDENT_" + i).equals("TRUE")){\r
116                     independentSetList.put(name, super.prop.getProperty("FIELD_CLASS_" + i));\r
117                     independentSetNames.add(name);\r
118                 }\r
119                 else{\r
120                     setHashMap.put(name, super.prop.getProperty("FIELD_CLASS_" + i));\r
121 \r
122                 }\r
123             }\r
124         }\r
125         //pull availableSets file from iotuser\r
126         try {\r
127             getSetList.execute(getSetListCommand);\r
128             Thread.sleep(1000);//To execute asyntask in ssh object, we have to sleep main thread\r
129             results = getSetList.getResultLines();\r
130             while(results.size() == 0){\r
131                 Thread.sleep(500);\r
132                 results = getSetList.getResultLines();\r
133             }\r
134             System.out.println(results);\r
135         } catch (Exception e) {\r
136             Log.d("Sleep exception", "exception at getSetsAndRelations");\r
137         }\r
138         String setListFilename = this.getString(R.string.setListFilename);\r
139         addSSHResultsToConfig(results, setListFilename);\r
140         availableSets =  createSetList(setListFilename);\r
141         System.out.println();\r
142 \r
143         ArrayList<String> setsOrRelationArrayList = new ArrayList<>();\r
144         setsOrRelationArrayList.add("SETS");\r
145         setsOrRelationArrayList.add("RELATIONS");\r
146         ArrayAdapter setsOrRelationsArrayAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, setsOrRelationArrayList);\r
147         setOrRelationSpinner.setAdapter(setsOrRelationsArrayAdapter);\r
148 \r
149 \r
150 \r
151         setOrRelationSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\r
152             @Override\r
153             public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {\r
154                 //set array adapter values = listed relations\r
155                 if(setOrRelationSpinner.getSelectedItem().toString().equals("RELATIONS")) {\r
156                     ArrayAdapter nameAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, relationNames);\r
157                     nameAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
158                     relationNameSpinner.setAdapter(nameAdapter);\r
159                 }\r
160                 else{\r
161                     ArrayAdapter nameAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, independentSetNames);\r
162                     nameAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
163                     relationNameSpinner.setAdapter(nameAdapter);\r
164                 }\r
165             }\r
166 \r
167             @Override\r
168             public void onNothingSelected(AdapterView<?> adapterView) {\r
169 \r
170             }\r
171         });\r
172 \r
173 \r
174 \r
175 \r
176         //sets left and right possible values to registered devices in the sets\r
177         relationNameSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\r
178             @Override\r
179             public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {\r
180 \r
181 \r
182                 if(setOrRelationSpinner.getSelectedItem().toString().equals("RELATIONS")) {\r
183                     relationRightSpinner.setVisibility(View.VISIBLE);\r
184                     String selectedRelation = relationNameSpinner.getSelectedItem().toString();\r
185                     ArrayList availableDevicesLeft = availableSets.get(relations.get(selectedRelation).first);\r
186                     ArrayList availableDevicesRight = availableSets.get(relations.get(selectedRelation).second);\r
187 \r
188                     ArrayAdapter leftAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, availableDevicesLeft);\r
189                     ArrayAdapter rightAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, availableDevicesRight);\r
190 \r
191                     leftAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
192                     rightAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
193                     relationLeftSpinner.setAdapter(leftAdapter);\r
194                     relationRightSpinner.setAdapter(rightAdapter);\r
195                 }\r
196                 else{\r
197                     relationRightSpinner.setVisibility(View.GONE);\r
198 \r
199                     String selectedSet = relationNameSpinner.getSelectedItem().toString();\r
200                     ArrayList availableDevicesLeft = availableSets.get(independentSetList.get(selectedSet));\r
201                     ArrayAdapter leftAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, availableDevicesLeft);\r
202                     leftAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
203                     relationLeftSpinner.setAdapter(leftAdapter);\r
204                 }\r
205             }\r
206             @Override\r
207             public void onNothingSelected(AdapterView<?> adapterView) {\r
208             }\r
209         });\r
210 \r
211         ArrayList<String> addedRelationsArrayList = new ArrayList<>();\r
212         Set<String> relationTypes = super.addedRelations.keySet();\r
213         for(String s: relationTypes) {\r
214             for (Pair<String, String> temp : super.addedRelations.get(s)) {\r
215                 addedRelationsArrayList.add(temp.first + " " + temp.second);\r
216             }\r
217         }\r
218         adapter = new ArrayAdapter(context, android.R.layout.simple_list_item_multiple_choice, addedRelationsArrayList);\r
219         addRelationsListView.setAdapter(adapter);\r
220         addRelationsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {\r
221             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {\r
222             }});\r
223         for(int i= 0; i < relationNames.size(); i++){\r
224             Pair<String, String> tempPair =  relations.get(relationNames.get(i));\r
225             applicationSetList.add(tempPair.first);\r
226             applicationSetList.add(tempPair.second);\r
227         }\r
228     }\r
229 \r
230 \r
231 \r
232 }\r