/*
* 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.CheckBox;
import java.util.Observable;
import java.util.Observer;
import kiwi.root.an2linuxclient.R;
import kiwi.root.an2linuxclient.data.MobileServer;
import kiwi.root.an2linuxclient.data.Server;
import kiwi.root.an2linuxclient.network.PairingConnectionCallbackMessage;
import kiwi.root.an2linuxclient.network.PairingConnectionHandler;
import kiwi.root.an2linuxclient.utils.ConnectionHelper;
abstract class MobileDialog extends TcpServerDialog implements Observer {
CheckBox checkBoxRoaming;
@Override
void initViews(View v){
super.initViews(v);
checkBoxRoaming = (CheckBox) v.findViewById(R.id.checkBoxRoaming);
initiatePairingButton.setOnClickListener(new InitiatePairingOnClickListener());
}
@Override
void initViewsDialogEdit(View v, Server mobileServer, int serverListPosition) {
super.initViewsDialogEdit(v, mobileServer, serverListPosition);
checkBoxRoaming.setChecked(((MobileServer)mobileServer).isRoamingAllowed());
}
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.view_dialog_mobile, container);
initViews(v);
initViewsRetainedInstance(savedInstanceState);
return v;
}
abstract void saveMobileServerToDatabase(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 NOT_ALLOWED_TO_ROAM: // from handler
infoText = getString(R.string.you_are_roaming);
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() {
saveMobileServerToDatabase(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);
}
});
}
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());
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(MobileDialog.this);
connectionHandler.startMobilePairing(ipOrHostname,
portNumber, checkBoxRoaming.isChecked(),
getActivity().getApplicationContext());
}
}
}
}