/* * 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 android.widget.TextView; import java.util.Observable; import java.util.Observer; import kiwi.root.an2linuxclient.R; import kiwi.root.an2linuxclient.data.BluetoothServer; import kiwi.root.an2linuxclient.data.Server; import kiwi.root.an2linuxclient.network.PairingConnectionCallbackMessage; import kiwi.root.an2linuxclient.network.PairingConnectionHandler; public abstract class BluetoothDialog extends ServerDialog implements Observer { EditText btNameEditText; TextView btMacTextView; @Override void initViews(View v){ super.initViews(v); btNameEditText = (EditText) v.findViewById(R.id.btNameEditText); btMacTextView = (TextView) v.findViewById(R.id.btMacTextView); initiatePairingButton.setOnClickListener(new InitiatePairingOnClickListener()); } @Override void initViewsDialogEdit(View v, Server bluetoothServer, int serverListPosition) { super.initViewsDialogEdit(v, bluetoothServer, serverListPosition); btNameEditText.setText(((BluetoothServer)bluetoothServer).getBluetoothName()); btMacTextView.setText(((BluetoothServer)bluetoothServer).getBluetoothMacAddress()); } @Override public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.view_dialog_bluetooth, container); initViews(v); initViewsRetainedInstance(savedInstanceState); return v; } abstract void saveBluetoothServerToDatabase(boolean newCertificate); private void resetAfterFailedPairingConnection(){ getActivity().runOnUiThread(new Runnable() { @Override public void run() { initiatePairingButton.setVisibility(View.VISIBLE); initiatePairingButton.setText(R.string.try_again); if (certificateSpinner != null){ certificateSpinner.setVisibility(View.VISIBLE); } saveServerBtn.setEnabled(true); if (connectionHandler != null){ connectionHandler.cancel(); } } }); } @Override public void update(Observable observable, Object data) { PairingConnectionCallbackMessage callback = (PairingConnectionCallbackMessage) data; final String infoText; switch (callback.getType()) { case BLUETOOTH_NOT_ENABLED: // from handler infoText = getString(R.string.bluetooth_is_off); resetAfterFailedPairingConnection(); break; case FAILED_TO_CONNECT: // from 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() { saveBluetoothServerToDatabase(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); 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(BluetoothDialog.this); connectionHandler.startBluetoothPairing(btMacTextView.getText().toString(), getActivity().getApplicationContext()); } } }