Adding config file for sharing.
[iot2.git] / others / lede-gui / src / main / java / com / example / lede2 / RegisterDeviceLoading.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.WifiInfo;\r
10 import android.net.wifi.WifiManager;\r
11 import android.support.design.widget.Snackbar;\r
12 import android.support.v7.app.AppCompatActivity;\r
13 import android.os.Bundle;\r
14 import android.view.View;\r
15 import android.view.inputmethod.InputMethodManager;\r
16 import android.widget.Button;\r
17 import android.widget.EditText;\r
18 import android.widget.TextView;\r
19 import android.widget.Toast;\r
20 import android.util.Log;\r
21 \r
22 import java.util.ArrayList;\r
23 import java.util.List;\r
24 import java.util.Random;\r
25 \r
26 public class RegisterDeviceLoading extends AppCompatActivity implements View.OnClickListener, View.OnFocusChangeListener {\r
27 \r
28     private static final int REQUEST_RESULT = 1001;\r
29     Button done;//Done button in UI\r
30     Button wifi;//wifi button in UI\r
31     SSH ssh;//Connection object between Android & Router\r
32     Context context;\r
33     TextView psk;//red letter in UI\r
34     String newpsk;//same as psk (different data type)\r
35     EditText name;//device name newly registered in UI\r
36     String deviceName;//same as name(different data type)\r
37 \r
38     @Override\r
39     protected void onCreate(Bundle savedInstanceState) {\r
40         super.onCreate(savedInstanceState);\r
41         setContentView(R.layout.activity_enroll_device);\r
42 \r
43         ssh = new SSH();\r
44         psk = (TextView) findViewById(R.id.add_psk);\r
45         done = (Button) findViewById(R.id.done);\r
46         wifi = (Button) findViewById(R.id.wifi);\r
47         name = (EditText) findViewById(R.id.name);\r
48 \r
49         done.setOnClickListener(this);\r
50         wifi.setOnClickListener(this);\r
51         name.setOnFocusChangeListener(this);\r
52 \r
53         //Make random password and show the password through EditText\r
54         newpsk = generateRandomPassword();\r
55         psk.setText(newpsk);\r
56 \r
57         try {//To execute asyntask in ssh object, we have to sleep main thread\r
58             ssh.execute("-ch " + newpsk);\r
59             Thread.sleep(1000);\r
60         } catch (Exception e) {\r
61             Log.d("SLEEP EXCEPTION", "SLEEP EXCEPTION occurs in onCreate method of EnrollDeviceActivity");\r
62         }\r
63     }\r
64 \r
65     @Override\r
66     public void onFocusChange(View view, boolean hasFocus) {//function not to modify randomly generated password for newly registered device\r
67         InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);\r
68         if (hasFocus) {\r
69             imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);\r
70         } else {\r
71             imm.hideSoftInputFromWindow(view.getWindowToken(), 0);\r
72         }\r
73     }\r
74 \r
75     boolean isNetworkAvailable() {//check whether wifi connection is or not\r
76         Context context = getApplicationContext();\r
77         ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);\r
78         NetworkInfo activeNetwork = cm.getActiveNetworkInfo();\r
79         boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();\r
80         return isConnected;\r
81     }\r
82 \r
83     @Override\r
84     public void onClick(View v) {\r
85         if (v == done) {\r
86             //Users try to execute shell scripts by pushing button,\r
87             //but problem could occur(application stop) if user push the button without wifi connection\r
88             //As a result, below function have to be implemented.\r
89             if (isNetworkAvailable() == false) {//without wifi connection\r
90                 Toast t = Toast.makeText(this, R.string.connect, Toast.LENGTH_SHORT);\r
91                 t.show();\r
92                 //choosing wifi connection\r
93                 Intent intent = new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK);\r
94                 intent.putExtra("only_access_points", true);\r
95                 intent.putExtra("extra_prefs_show_button_bar", true);\r
96                 intent.putExtra("wifi_enable_next_on_connect", true);\r
97                 startActivityForResult(intent,1);\r
98                 //startActivity(new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK));\r
99             } else {//with wifi connection\r
100                 deviceName = name.getText().toString();\r
101                 if(deviceName.equals("")){\r
102                     Toast t = Toast.makeText(this, R.string.empty_name,Toast.LENGTH_SHORT);\r
103                     t.show();\r
104                     return;\r
105                 }\r
106                 context = getApplicationContext();\r
107                 if (getWifiName(context).equals("\""+ ConfigActivity.RSSID +"\"")) {//if wifi name is LEDE2\r
108                     String networkPass = psk.getText().toString();//random password\r
109                     ssh = new SSH();\r
110 \r
111                     // execute shell script  (script's function -> Save contents(Mac,Ip,Key,Name) on hostapd-psk)\r
112                     ssh.execute("-co " + networkPass + " " + deviceName + " " + ConfigActivity.RPWD);//review!!!!!!\r
113                     try {//To execute asyntask in ssh object, we have to sleep main thread\r
114                         Thread.sleep(1000);\r
115                     } catch (Exception e) {\r
116                         Log.d("SLEEP EXCEPTION", "SLEEP EXCEPTION occurs in onClick method of EnrollDeviceActivity");\r
117                     }\r
118                     finish();//Go back to the Main Activity\r
119                 } else { //if name of wifi is not LEDE -> go to wifi configuration screen to change wifi type\r
120                     Toast t = Toast.makeText(this, R.string.try_again, Toast.LENGTH_SHORT);\r
121                     t.show();\r
122                     //Choosing wifi connection\r
123                     Intent intent = new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK);\r
124                     intent.putExtra("only_access_points", true);\r
125                     intent.putExtra("extra_prefs_show_button_bar", true);\r
126                     intent.putExtra("wifi_enable_next_on_connect", true);\r
127                     startActivityForResult(intent,1);\r
128                     //startActivity(new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK));\r
129                 }\r
130             }\r
131             // Call activity that adds device - not doing this flow because we haven't found\r
132             // a way to change password without restarting WiFi\r
133             //startActivity(new Intent(this, AddDeviceActivity.class));\r
134             //finish();\r
135         } else if (v == wifi) {\r
136             Intent intent = new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK);\r
137             intent.putExtra("only_access_points", true);\r
138             intent.putExtra("extra_prefs_show_button_bar", true);\r
139             intent.putExtra("wifi_enable_next_on_connect", true);\r
140             startActivityForResult(intent,1);\r
141         }\r
142     }\r
143 \r
144     /******************************************************************************************************************************************************************/\r
145     //Detect you are connected to a specific network.\r
146     /******************************************************************************************************************************************************************/\r
147     public String getWifiName(Context context) {\r
148         WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);\r
149         if (manager.isWifiEnabled()) {\r
150             WifiInfo wifiInfo = manager.getConnectionInfo();\r
151             if (wifiInfo != null) {\r
152                 NetworkInfo.DetailedState state = WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState());\r
153                 if (state == NetworkInfo.DetailedState.CONNECTED || state == NetworkInfo.DetailedState.OBTAINING_IPADDR) {\r
154                     return wifiInfo.getSSID();\r
155                 }\r
156             }\r
157         }\r
158         return null;\r
159     }\r
160 \r
161     /******************************************************************************************************************************************************************/\r
162     // Generate a random password and return it\r
163     /******************************************************************************************************************************************************************/\r
164     public String generateRandomPassword() {\r
165         String password = new String();\r
166 \r
167         StringBuffer rndpassword = new StringBuffer();\r
168         Random rnd = new Random();\r
169         int digitnum = 20;\r
170         // Generate random 20digit password with upper / lower case alphabet + numbers\r
171         // There are 10 int nums, 26 lower alphabets, 26 upper alphabets. Total 62\r
172         // So 2/12 possiblity of int, 5/12 lower, 5/12 upper alphabets.\r
173         for (int i = 0; i < digitnum; i++) {\r
174             int rIndex = rnd.nextInt(12);\r
175             if (rIndex >= 0 && rIndex < 2) { // 0 - 9\r
176                 rndpassword.append((rnd.nextInt(10)));\r
177             } else if (rIndex >= 2 && rIndex < 7) { // a-z\r
178                 rndpassword.append((char) ((int) (rnd.nextInt(26)) + 97));\r
179             } else {    // A-Z\r
180                 rndpassword.append((char) ((int) (rnd.nextInt(26)) + 65));\r
181             }\r
182         }\r
183         password = rndpassword.toString();\r
184         return password;\r
185     }\r
186 }\r