/*
* Copyright 2017 rootkiwi
*
* AN2Linux-client is licensed under GNU General Public License 3.
*
* See LICENSE for more details.
*/
package kiwi.root.an2linuxclient.views;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.EditText;
import java.util.Observable;
import java.util.Observer;
import kiwi.root.an2linuxclient.R;
import kiwi.root.an2linuxclient.data.Server;
import kiwi.root.an2linuxclient.data.WifiServer;
import kiwi.root.an2linuxclient.network.PairingConnectionCallbackMessage;
import kiwi.root.an2linuxclient.network.PairingConnectionHandler;
import kiwi.root.an2linuxclient.utils.ConnectionHelper;
abstract class WifiDialog extends TcpServerDialog implements Observer {
EditText ssidWhitelistEditText;
String ssidWhitelist;
@Override
void initViews(View v){
super.initViews(v);
ssidWhitelistEditText = (EditText) v.findViewById(R.id.ssidWhitelist);
initiatePairingButton.setOnClickListener(new InitiatePairingOnClickListener());
}
@Override
void initViewsDialogEdit(View v, Server wifiServer, int serverListPosition) {
super.initViewsDialogEdit(v, wifiServer, serverListPosition);
ssidWhitelistEditText.setText(((WifiServer)wifiServer).getSsidWhitelist());
}
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.view_dialog_wifi, container);
initViews(v);
initViewsRetainedInstance(savedInstanceState);
return v;
}
abstract void saveWifiServerToDatabase(boolean newCertificate);
@Override
public void update(Observable observable, Object data) {
PairingConnectionCallbackMessage callback = (PairingConnectionCallbackMessage) data;
final String infoText;
switch (callback.getType()) {
case NOT_CONNECTED: // from handler
infoText = getString(R.string.not_connected);
resetAfterFailedPairingConnection();
break;
case DISALLOWED_SSID: // from handler
infoText = getString(R.string.disallowed_ssid);
resetAfterFailedPairingConnection();
break;
case NOT_CONNECTED_TO_WIFI: // from handler
infoText = getString(R.string.not_connected_to_wifi);
resetAfterFailedPairingConnection();
break;
case UNKNOWN_HOST: // from tcp connection
infoText = getString(R.string.unknown_host);
resetAfterFailedPairingConnection();
break;
case TIMED_OUT: // from tcp connection
infoText = getString(R.string.connected_timed_out);
resetAfterFailedPairingConnection();
break;
case FAILED_TO_CONNECT: // from tcp connection
infoText = getString(R.string.failed_to_connect);
resetAfterFailedPairingConnection();
break;
case TLS_HANDSHAKE_COMPLETED:
infoText = getString(R.string.verify_hash) + callback.getVerifyHash();
serverCert = callback.getServerCert();
activePairingConnection = true;
break;
case SERVER_ACCEPTED_PAIR:
if (clientAcceptedPair){
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
saveWifiServerToDatabase(true);
}
});
return;
} else {
infoText = getString(R.string.server_accepted_pairing) + pairingInfoTextView.getText().toString();
serverAcceptedPair = true;
}
break;
case SERVER_DENIED_PAIR:
infoText = getString(R.string.server_denied_pairing);
activePairingConnection = false;
clientAcceptedPair = false;
resetAfterFailedPairingConnection();
break;
case SOCKET_CLOSED:
infoText = getString(R.string.connection_closed);
activePairingConnection = false;
clientAcceptedPair = false;
serverAcceptedPair = false;
resetAfterFailedPairingConnection();
break;
default:
return;
}
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
pairingInfoTextView.setText(infoText);
}
});
}
void setSsidWhitelist(){
if (ssidWhitelistEditText.getText().length() > 0 && !ssidWhitelistEditText.getText().toString().trim().equals("")) {
ssidWhitelist = ssidWhitelistEditText.getText().toString().trim();
} else {
ssidWhitelist = null;
}
}
private class InitiatePairingOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
if (ConnectionHelper.checkIfValidAddressAndPortInput(ipOrHostnameEditText,
portNumberEditText, getActivity().getApplicationContext())){
ipOrHostname = ipOrHostnameEditText.getText().toString().trim();
portNumber = Integer.parseInt(portNumberEditText.getText().toString());
setSsidWhitelist();
ipOrHostnameEditText.setEnabled(false);
portNumberEditText.setEnabled(false);
initiatePairingButton.setVisibility(View.GONE);
if (certificateSpinner != null) {
certificateSpinner.setVisibility(View.GONE);
}
pairingInfoTextView.setVisibility(View.VISIBLE);
pairingInfoTextView.setText(R.string.pairing_connecting);
if (connectionHandler == null){
connectionHandler = new PairingConnectionHandler();
}
connectionHandler.addObserver(WifiDialog.this);
connectionHandler.startWifiPairing(ipOrHostname,
portNumber, ssidWhitelist,
getActivity().getApplicationContext());
}
}
}
}