Adding config file for sharing.
[iot2.git] / others / lede-gui / src / main / java / com / example / lede2 / RegisterDeviceAdding.java
1 package com.example.lede2;\r
2 \r
3 import android.content.ClipData;\r
4 import android.content.ClipboardManager;\r
5 import android.content.Context;\r
6 import android.content.Intent;\r
7 import android.net.ConnectivityManager;\r
8 import android.net.NetworkInfo;\r
9 import android.net.wifi.WifiConfiguration;\r
10 import android.net.wifi.WifiInfo;\r
11 import android.net.wifi.WifiManager;\r
12 import android.os.Bundle;\r
13 import android.support.design.widget.Snackbar;\r
14 import android.support.v7.app.AppCompatActivity;\r
15 import android.util.Log;\r
16 import android.view.View;\r
17 import android.widget.ArrayAdapter;\r
18 import android.widget.Button;\r
19 import android.widget.EditText;\r
20 import android.widget.Spinner;\r
21 import android.widget.Toast;\r
22 \r
23 import java.util.ArrayList;\r
24 import java.util.List;\r
25 import java.util.Scanner;\r
26 \r
27 /**\r
28  * Created by Brian on 4/3/2018.\r
29  */\r
30 \r
31 public class RegisterDeviceAdding extends AppCompatActivity implements View.OnClickListener {\r
32     private String devdat_macaddress_filename;\r
33     private String dhcp_macaddress_filename;\r
34     private Spinner macAddressSpinner;\r
35     private EditText name;\r
36     private String deviceName;\r
37     private Button wifi;//wifi button in UI\r
38     private SSH ssh;//Connection object between Android & Router\r
39     private Context context;\r
40     private String newpsk;\r
41     private WifiManager manager;\r
42 \r
43     private Button done;\r
44 \r
45     protected void onCreate(Bundle savedInstanceState) {\r
46         super.onCreate(savedInstanceState);\r
47         setContentView(R.layout.register_device_adding);\r
48         context = getApplicationContext();\r
49         manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);\r
50         Bundle extras  = getIntent().getExtras();\r
51         if(extras!= null){\r
52             newpsk = extras.getString("newpsk");\r
53         }\r
54         macAddressSpinner = (Spinner) findViewById(R.id.registerMACs);\r
55         wifi = (Button) findViewById(R.id.regAddWifi);\r
56         wifi.setOnClickListener(this);\r
57             devdat_macaddress_filename = this.getString(R.string.devices_dat_filename);\r
58         dhcp_macaddress_filename = "temp_DHCP.txt";\r
59         name = (EditText)findViewById(R.id.registerName);\r
60         done = (Button)findViewById(R.id.registerDone);\r
61         done.setOnClickListener(this);\r
62 \r
63         ArrayList<String> macAddressesdhcp = ConfigFileIO.getMACAddressesDHCP(dhcp_macaddress_filename, this);\r
64         ArrayList<String> macAddressesdevdat = ConfigFileIO.getMACAddressesDevDat(devdat_macaddress_filename, this);\r
65         ArrayList<String> macAddresses = new ArrayList<>();\r
66         for(int i = 0; i < macAddressesdhcp.size();i++){\r
67             if(!macAddressesdevdat.contains(macAddressesdhcp.get(i))){\r
68                 macAddresses.add(macAddressesdhcp.get(i));\r
69             }\r
70         }\r
71 \r
72         //sets value for macAddressesSpinner\r
73         ArrayAdapter typeAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, macAddresses);\r
74         typeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\r
75         macAddressSpinner.setAdapter(typeAdapter);\r
76 \r
77 \r
78 \r
79 \r
80     }\r
81 \r
82     @Override\r
83     public void onClick(View v) {\r
84         if (v == done) {\r
85             //Users try to execute shell scripts by pushing button,\r
86             //but problem could occur(application stop) if user push the button without wifi connection\r
87             //As a result, below function have to be implemented.\r
88             if (isNetworkAvailable() == false) {//without wifi connection\r
89                 Toast t = Toast.makeText(this, R.string.connect, Toast.LENGTH_SHORT);\r
90                 t.show();\r
91                 //choosing wifi connection\r
92                 Intent intent = new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK);\r
93                 intent.putExtra("only_access_points", true);\r
94                 intent.putExtra("extra_prefs_show_button_bar", true);\r
95                 intent.putExtra("wifi_enable_next_on_connect", true);\r
96                 startActivityForResult(intent,1);\r
97                 //startActivity(new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK));\r
98             } else {//with wifi connection\r
99                 deviceName = name.getText().toString();\r
100                 if(deviceName.equals("")){\r
101                     Toast t = Toast.makeText(this, R.string.empty_name,Toast.LENGTH_SHORT);\r
102                     t.show();\r
103                     return;\r
104                 }\r
105                 Scanner scanner = new Scanner(deviceName);\r
106                 scanner.next();\r
107                 if(scanner.hasNext()){\r
108                     Snackbar oneWordName = Snackbar.make(findViewById(R.id.oneWordName),\r
109                             "Please only use one word names", 2000);\r
110                     oneWordName.show();\r
111                     return;\r
112                 }\r
113                 String selectedMacAddress = macAddressSpinner.getSelectedItem().toString();\r
114                 context = getApplicationContext();\r
115                 if (getWifiName(context).equals("\""+ ConfigActivity.RSSID +"\"")) {//if wifi name is LEDE2\r
116                     ssh = new SSH();\r
117                     // execute shell script  (script's function -> Save contents(Mac,Ip,Key,Name) on hostapd-psk)\r
118                     List<String> results = new ArrayList<>();\r
119                     try {//To execute asyntask in ssh object, we have to sleep main thread\r
120                         ssh.execute("-co " + newpsk + " " + selectedMacAddress + " " +\r
121                                 deviceName + " " + ConfigActivity.RPWD );\r
122                         Thread.sleep(2000);\r
123 \r
124                         List<WifiConfiguration> list = manager.getConfiguredNetworks();\r
125                         for( WifiConfiguration i : list ) {\r
126                             if(i.SSID.equals("\"LEDE2\"")){\r
127                                 manager.removeNetwork(i.networkId);\r
128                                 manager.saveConfiguration();\r
129                                 System.out.println("deleted");\r
130                             }\r
131                         }\r
132                         WifiConfiguration wifiConfig = new WifiConfiguration();\r
133                         wifiConfig.SSID = String.format("\"%s\"", "LEDE2");\r
134                         wifiConfig.preSharedKey = String.format("\"%s\"", context.getResources().getString(R.string.default_rpwd));\r
135 \r
136                         int netId = manager.addNetwork(wifiConfig);\r
137                         manager.disconnect();\r
138                         manager.enableNetwork(netId, true);\r
139                         manager.reconnect();\r
140 \r
141 \r
142                         //To execute asyntask in ssh object, we have to sleep main thread\r
143 //                        results = ssh.getResultLines();\r
144 //                        while(results.size() == 0){\r
145 //                            Thread.sleep(500);\r
146 //                            results = ssh.getResultLines();\r
147 //                            System.out.println(results);\r
148 //                        }\r
149                     } catch (Exception e) {\r
150                         Log.d("SLEEP EXCEPTION", "SLEEP EXCEPTION occurs in onClick method of EnrollDeviceActivity");\r
151                     }\r
152                 } else { //if name of wifi is not LEDE -> go to wifi configuration screen to change wifi type\r
153                     Toast t = Toast.makeText(this, R.string.try_again, Toast.LENGTH_SHORT);\r
154                     t.show();\r
155                     //Choosing wifi connection\r
156                     Intent intent = new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK);\r
157                     intent.putExtra("only_access_points", true);\r
158                     intent.putExtra("extra_prefs_show_button_bar", true);\r
159                     intent.putExtra("wifi_enable_next_on_connect", true);\r
160                     startActivityForResult(intent,1);\r
161                     //startActivity(new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK));\r
162                 }\r
163             }\r
164             // Call activity that adds device - not doing this flow because we haven't found\r
165             // a way to change password without restarting WiFi\r
166             //startActivity(new Intent(this, AddDeviceActivity.class));\r
167             //finish();\r
168         } else if (v == wifi) {\r
169             Intent intent = new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK);\r
170             intent.putExtra("only_access_points", true);\r
171             intent.putExtra("extra_prefs_show_button_bar", true);\r
172             intent.putExtra("wifi_enable_next_on_connect", true);\r
173             startActivityForResult(intent,1);\r
174             //startActivity(new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK));\r
175         }\r
176 \r
177         ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);\r
178         ClipData clip = ClipData.newPlainText("old password", context.getResources().getString(R.string.default_rpwd));\r
179         clipboard.setPrimaryClip(clip);\r
180         finish();\r
181     }\r
182 \r
183 \r
184     /******************************************************************************************************************************************************************/\r
185     //Detect you are connected to a specific network.\r
186     /******************************************************************************************************************************************************************/\r
187     public String getWifiName(Context context) {\r
188         WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);\r
189         if (manager.isWifiEnabled()) {\r
190             WifiInfo wifiInfo = manager.getConnectionInfo();\r
191             if (wifiInfo != null) {\r
192                 NetworkInfo.DetailedState state = WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState());\r
193                 if (state == NetworkInfo.DetailedState.CONNECTED || state == NetworkInfo.DetailedState.OBTAINING_IPADDR) {\r
194                     return wifiInfo.getSSID();\r
195                 }\r
196             }\r
197         }\r
198         return null;\r
199     }\r
200 \r
201     boolean isNetworkAvailable() {//check whether wifi connection is or not\r
202         Context context = getApplicationContext();\r
203         ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);\r
204         NetworkInfo activeNetwork = cm.getActiveNetworkInfo();\r
205         boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();\r
206         return isConnected;\r
207     }\r
208 \r
209 \r
210 }\r