The final version for lede-gui (the phone app for device registration)
[iot2.git] / others / lede-gui / src / main / java / com / example / lede2 / DeleteDeviceActivity.java
1 package com.example.lede2;\r
2 \r
3 import android.app.ProgressDialog;\r
4 import android.content.Context;\r
5 import android.os.Bundle;\r
6 import android.support.v7.app.AppCompatActivity;\r
7 import android.util.Log;\r
8 import android.view.View;\r
9 import android.view.inputmethod.InputMethodManager;\r
10 import android.widget.AdapterView;\r
11 import android.widget.ArrayAdapter;\r
12 import android.widget.Button;\r
13 import android.widget.EditText;\r
14 import android.widget.Spinner;\r
15 \r
16 import java.io.File;\r
17 import java.util.ArrayList;\r
18 import java.util.Collections;\r
19 import java.util.List;\r
20 import java.util.Scanner;\r
21 import java.util.Set;\r
22 \r
23 public class DeleteDeviceActivity extends AppCompatActivity implements View.OnClickListener, View.OnFocusChangeListener {\r
24 \r
25     DatabaseObject databaseObject;\r
26     protected String database_information_filename;\r
27     protected String id_information_filename;\r
28     protected String local_id_information_filename;\r
29     Button deleteButton;\r
30     Button doneButton;\r
31     Spinner spinner1;\r
32     Spinner spinner2;\r
33     Spinner spinner3;\r
34     Context context;\r
35     private SSH_MySQL ssh;//Connection object between Android & Host\r
36 \r
37     @Override\r
38     protected void onCreate(Bundle savedInstanceState) {\r
39         super.onCreate(savedInstanceState);\r
40         setContentView(R.layout.activity_delete_device);\r
41 \r
42         database_information_filename = this.getString(R.string.device_param_config_filename);\r
43         id_information_filename = this.getString(R.string.device_id_config_filename);\r
44         local_id_information_filename = this.getString(R.string.device_id_config_filename);\r
45         deleteButton = (Button) findViewById(R.id.delDoneButton);\r
46         spinner1 = (Spinner) findViewById(R.id.delspinner1);\r
47         spinner2 = (Spinner) findViewById(R.id.delspinner2);\r
48         spinner3 = (Spinner) findViewById(R.id.delspinner3);\r
49         context = this;\r
50 \r
51         //similar to install format. Sets the subtypes to appear based on type chosen\r
52         spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\r
53             @Override\r
54             public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {\r
55                 String selectedType = spinner1.getSelectedItem().toString();\r
56                 Set<String> keysForSubType = (databaseObject.getTypeObject(selectedType)).getKeySet();\r
57                 ArrayList<String> subtypes = new ArrayList<String>();\r
58                 for(String key: keysForSubType){\r
59                     subtypes.add(key);\r
60                 }\r
61                 Collections.sort(subtypes);\r
62                 ArrayAdapter subtypeAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, subtypes);\r
63                 subtypeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
64                 spinner2.setAdapter(subtypeAdapter);\r
65             }\r
66 \r
67 \r
68             @Override\r
69             public void onNothingSelected(AdapterView<?> adapterView) {\r
70 \r
71             }\r
72         });\r
73         //sets the instances of devices to appear based on selected subtype\r
74         spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\r
75             @Override\r
76             public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {\r
77                 DatabaseSubtypeObject subtypeObject = getCurrentSubtypeObject();\r
78                 List<String> deviceList = subtypeObject.getDevices();\r
79                 Collections.sort(deviceList);\r
80                 ArrayList<String> devices = new ArrayList<>();\r
81                 for(String device: deviceList){\r
82                     devices.add(device);\r
83                 }\r
84                 Collections.sort(devices);\r
85                 ArrayAdapter deviceAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, devices);\r
86                 deviceAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
87                 spinner3.setAdapter(deviceAdapter);\r
88             }\r
89 \r
90             @Override\r
91             public void onNothingSelected(AdapterView<?> adapterView) {\r
92 \r
93             }\r
94         });\r
95 \r
96 \r
97 \r
98 \r
99         deleteButton.setOnClickListener(this);\r
100         ssh = new SSH_MySQL();\r
101         String databaseInformation = ConfigFileIO.readFromFile(\r
102                 database_information_filename, this);\r
103         String idInformation = ConfigFileIO.readFromFile(local_id_information_filename, this);\r
104         databaseObject = ConfigFileIO.createDatabaseObject(context, idInformation );\r
105         Set<String> keysForType = databaseObject.getKeySet();\r
106         ArrayList<String> types = new ArrayList<String>();\r
107         for(String key: keysForType){\r
108             types.add(key);\r
109         }\r
110         Collections.sort(types);\r
111         ArrayAdapter typeAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, types);\r
112         typeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
113         spinner1.setAdapter(typeAdapter);\r
114     }\r
115 \r
116     @Override\r
117     public void onClick(View v) {\r
118         if(v == deleteButton){\r
119             DatabaseSubtypeObject subtypeObject = getSubtypeObject();\r
120             // Remove the entry based on ID, type, and subtype\r
121             String deleteCommand = MainActivity.DEF_DELETE_CMD + " " +\r
122                     spinner3.getSelectedItem().toString() + " " +\r
123                     spinner1.getSelectedItem().toString() + " " +\r
124                     spinner2.getSelectedItem().toString() + ";";\r
125 \r
126 \r
127             // Also remove the device address. Some need multiple address deletions such as ihome\r
128             if(subtypeObject.getNumAddresses() > 1) {\r
129                 for(int i = 1; i <= subtypeObject.getNumAddresses(); i++){\r
130                     deleteCommand += MainActivity.DEF_DELETE_ADDRESS_CMD + " " +\r
131                             spinner3.getSelectedItem().toString() + " " +\r
132                             spinner2.getSelectedItem().toString() + "Add" + i + ";";\r
133                 }\r
134             }\r
135             else{\r
136                 deleteCommand += MainActivity.DEF_DELETE_ADDRESS_CMD + " " +\r
137                         spinner3.getSelectedItem().toString() + " " +\r
138                         spinner2.getSelectedItem().toString() + "Add;";\r
139 \r
140             }\r
141 \r
142             deleteCommand += context.getResources().getString(R.string.delete_zb_cmd) + " " +\r
143                     spinner3.getSelectedItem().toString() + " " +\r
144                     spinner2.getSelectedItem().toString() + "ZBAdd;";\r
145             //need to add delete from zigbee\r
146 \r
147 \r
148 \r
149             ProgressDialog dialog = new ProgressDialog(this);\r
150             dialog.setMessage("Please Wait");\r
151             dialog.setCancelable(false);\r
152             dialog.setInverseBackgroundForced(false);\r
153             dialog.show();\r
154 \r
155 \r
156             System.out.println(deleteCommand);\r
157             ssh = new SSH_MySQL();\r
158             ssh.execute(deleteCommand);\r
159 \r
160             deleteDeviceFromDatabase();\r
161             updateIoTDeviceAddress();\r
162             updateSetList();\r
163 \r
164             dialog.dismiss();\r
165             finish();\r
166 \r
167         }\r
168 \r
169 \r
170     }\r
171 \r
172     @Override\r
173     public void onFocusChange(View view, boolean hasFocus) {\r
174         InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);\r
175         if (hasFocus) {\r
176             imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);\r
177         } else {\r
178             imm.hideSoftInputFromWindow(view.getWindowToken(), 0);\r
179         }\r
180     }\r
181     public DatabaseSubtypeObject getCurrentSubtypeObject(){\r
182         return databaseObject.getTypeObject(spinner1.\r
183                 getSelectedItem().toString()).getSubtypeObject(spinner2.getSelectedItem().toString());\r
184     }\r
185 \r
186     //rewrites the local config file to not contain the deleted instance\r
187     public void deleteDeviceFromDatabase(){\r
188         DatabaseSubtypeObject subtypeObject = getCurrentSubtypeObject();\r
189         String subtype = spinner2.getSelectedItem().toString();\r
190         String id = spinner3.getSelectedItem().toString();\r
191         subtypeObject.deleteDevice(id);\r
192         String deviceToDelete = subtype + " " + id;\r
193         //do it for the database file. also need\r
194         String databaseInformation = ConfigFileIO.readFromFile(local_id_information_filename, this );\r
195         Scanner scanner = new Scanner(databaseInformation);\r
196         ConfigFileIO.writeToNewFile(local_id_information_filename, "", this);\r
197         while (scanner.hasNextLine()){\r
198             String temp = scanner.nextLine();\r
199             if (!temp.equals(deviceToDelete)){\r
200                 ConfigFileIO.writeToFile(local_id_information_filename, temp, this);\r
201             }\r
202         }\r
203     }\r
204 \r
205 \r
206     private DatabaseSubtypeObject getSubtypeObject(){\r
207         DatabaseSubtypeObject subtypeObject = databaseObject.getTypeObject(\r
208                 spinner1.getSelectedItem().toString()).getSubtypeObject(\r
209                         spinner2.getSelectedItem().toString());\r
210         return subtypeObject;\r
211     }\r
212 \r
213     private  void addSSHResultsToConfig(List<String> results, String filename) {\r
214         File dir = getFilesDir();\r
215         File file = new File(dir, filename);\r
216         file.delete();\r
217         for (int i = 0; i < results.size(); i++) {\r
218             ConfigFileIO.writeToFile(filename, results.get(i), this);\r
219         }\r
220         finish();\r
221     }\r
222 \r
223     private void updateSetList(){\r
224         SSH_MySQL ssh = new SSH_MySQL();\r
225         String command = this.getString(R.string.updateSetList);\r
226         List<String> results = new ArrayList<>();\r
227         String setListFilename = this.getString(R.string.setListFilename);\r
228         try {\r
229             ssh.execute(command);\r
230             Thread.sleep(1000);//To execute asyntask in ssh object, we have to sleep main thread\r
231             results = ssh.getResultLines();\r
232             while(results.size() == 0){\r
233                 Thread.sleep(500);\r
234                 results = ssh.getResultLines();\r
235             }\r
236             System.out.println(results);\r
237         } catch (Exception e) {\r
238             Log.d("Sleep exception", "exception at getSetsAndRelations");\r
239         }\r
240 //        ssh = new SSH_MySQL();\r
241 //        command = this.getString(R.string.getSetList);\r
242 //        try {\r
243 //            ssh.execute(command);\r
244 //            Thread.sleep(1000);//To execute asyntask in ssh object, we have to sleep main thread\r
245 //            results = ssh.getResultLines();\r
246 //            while(results.size() == 0){\r
247 //                Thread.sleep(500);\r
248 //                results = ssh.getResultLines();\r
249 //            }\r
250 //            System.out.println(results);\r
251 //        } catch (Exception e) {\r
252 //            Log.d("Sleep exception", "exception at getSetsAndRelations");\r
253 //        }\r
254 //        addSSHResultsToConfig(results, setListFilename);\r
255 \r
256     }\r
257     private void updateIoTDeviceAddress(){\r
258         SSH_MySQL ssh = new SSH_MySQL();\r
259         String command = this.getString(R.string.updateIoTDeviceAddress);\r
260         List<String> results = new ArrayList<>();\r
261         String iotDeviceAddressFilename = this.getString(R.string.updateIoTDeviceAddress);\r
262         try {\r
263             ssh.execute(command);\r
264             Thread.sleep(1000);//To execute asyntask in ssh object, we have to sleep main thread\r
265             results = ssh.getResultLines();\r
266             while(results.size() == 0){\r
267                 Thread.sleep(500);\r
268                 results = ssh.getResultLines();\r
269             }\r
270             System.out.println(results);\r
271         } catch (Exception e) {\r
272             Log.d("Sleep exception", "exception at getSetsAndRelations");\r
273         }\r
274 //        ssh = new SSH_MySQL();\r
275 //        command = this.getString(R.string.getIoTDeviceAddress);\r
276 //        try {\r
277 //            ssh.execute(command);\r
278 //            Thread.sleep(1000);//To execute asyntask in ssh object, we have to sleep main thread\r
279 //            results = ssh.getResultLines();\r
280 //            while(results.size() == 0){\r
281 //                Thread.sleep(500);\r
282 //                results = ssh.getResultLines();\r
283 //            }\r
284 //            System.out.println(results);\r
285 //        } catch (Exception e) {\r
286 //            Log.d("Sleep exception", "exception at getSetsAndRelations");\r
287 //        }\r
288 //        addSSHResultsToConfig(results, iotDeviceAddressFilename);\r
289     }\r
290 \r
291 }\r