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