1 package com.example.lede2;
\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
23 import java.util.ArrayList;
\r
24 import java.util.List;
\r
25 import java.util.Scanner;
\r
28 * Created by Brian on 4/3/2018.
\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
43 private Button done;
\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
52 newpsk = extras.getString("newpsk");
\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
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
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
83 public void onClick(View v) {
\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
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
105 Scanner scanner = new Scanner(deviceName);
\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
113 String selectedMacAddress = macAddressSpinner.getSelectedItem().toString();
\r
114 context = getApplicationContext();
\r
115 if (getWifiName(context).equals("\""+ ConfigActivity.RSSID +"\"")) {//if wifi name is LEDE2
\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
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
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
136 int netId = manager.addNetwork(wifiConfig);
\r
137 manager.disconnect();
\r
138 manager.enableNetwork(netId, true);
\r
139 manager.reconnect();
\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
149 } catch (Exception e) {
\r
150 Log.d("SLEEP EXCEPTION", "SLEEP EXCEPTION occurs in onClick method of EnrollDeviceActivity");
\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
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
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
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
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
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
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