package st.alr.mqttitude.preferences; import st.alr.mqttitude.services.ServiceMqtt; import st.alr.mqttitude.services.ServiceMqtt.MQTT_CONNECTIVITY; import st.alr.mqttitude.support.Defaults; import st.alr.mqttitude.R; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.DialogPreference; import android.preference.PreferenceManager; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.EditText; import android.widget.Spinner; public class PreferencesBroker extends DialogPreference { private Context context; private EditText host; private EditText port; private EditText username; private EditText password; private Spinner brokerSecurity; private View brokerSecuritySSLOptions; private View brokerSecurityNoneOptions; private EditText brokerSecuritySSLCaCrtPath; private boolean hostOk = false; private boolean portOk = false; private int securityOptions = 0; public PreferencesBroker(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; setDialogLayoutResource(R.layout.preferences_broker); } @Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); } @Override protected View onCreateDialogView() { View root = super.onCreateDialogView(); host = (EditText) root.findViewById(R.id.brokerHost); port = (EditText) root.findViewById(R.id.brokerPort); username = (EditText) root.findViewById(R.id.brokerUsername); password = (EditText) root.findViewById(R.id.brokerPassword); brokerSecurity = (Spinner) root.findViewById(R.id.brokerSecurity); brokerSecurityNoneOptions = root.findViewById(R.id.brokerSecurityNoneOptions); brokerSecuritySSLOptions = root.findViewById(R.id.brokerSecuritySSLOptions); brokerSecuritySSLCaCrtPath = (EditText) root.findViewById(R.id.brokerSecuritySSLCaCrtPath); return root; } @Override protected void onBindDialogView(View view) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); host.setText(prefs.getString(Defaults.SETTINGS_KEY_BROKER_HOST, Defaults.VALUE_BROKER_HOST)); port.setText(prefs.getString(Defaults.SETTINGS_KEY_BROKER_PORT, Defaults.VALUE_BROKER_PORT)); username.setText(prefs.getString(Defaults.SETTINGS_KEY_BROKER_USERNAME, "")); password.setText(prefs.getString(Defaults.SETTINGS_KEY_BROKER_PASSWORD, "")); brokerSecurity.setSelection(PreferenceManager.getDefaultSharedPreferences(context).getInt(Defaults.SETTINGS_KEY_BROKER_SECURITY, Defaults.VALUE_BROKER_SECURITY_NONE)); brokerSecuritySSLCaCrtPath.setText(prefs.getString(Defaults.SETTINGS_KEY_BROKER_SECURITY_SSL_CA_PATH, "")); } @Override protected void showDialog(Bundle state) { super.showDialog(state); validateHost(PreferenceManager.getDefaultSharedPreferences(context).getString( Defaults.SETTINGS_KEY_BROKER_HOST, Defaults.VALUE_BROKER_HOST)); validatePort(PreferenceManager.getDefaultSharedPreferences(context).getString( Defaults.SETTINGS_KEY_BROKER_PORT, Defaults.VALUE_BROKER_PORT)); validateBrokerSecurity(PreferenceManager.getDefaultSharedPreferences(context).getInt(Defaults.SETTINGS_KEY_BROKER_SECURITY, Defaults.VALUE_BROKER_SECURITY_NONE)); conditionalyEnableConnectButton(); conditionallyEnableDisconnectButton(); conditionallyEnableBrokerSecurityOptions(); host.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { validateHost(s.toString()); conditionalyEnableConnectButton(); } }); port.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { validatePort(s.toString()); conditionalyEnableConnectButton(); } }); brokerSecurity.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { validateBrokerSecurity(brokerSecurity.getSelectedItemPosition()); conditionallyEnableBrokerSecurityOptions(); } @Override public void onNothingSelected(AdapterView<?> arg0) { brokerSecurity.setSelection(Defaults.VALUE_BROKER_SECURITY_NONE); } }); } @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case DialogInterface.BUTTON_POSITIVE: // Clicked connect SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor editor = prefs.edit(); editor.putString(Defaults.SETTINGS_KEY_BROKER_HOST, host.getText().toString()); editor.putString(Defaults.SETTINGS_KEY_BROKER_PORT, port.getText().toString()); editor.putString(Defaults.SETTINGS_KEY_BROKER_USERNAME, username.getText().toString()); editor.putString(Defaults.SETTINGS_KEY_BROKER_PASSWORD, password.getText().toString()); editor.putInt(Defaults.SETTINGS_KEY_BROKER_SECURITY, brokerSecurity.getSelectedItemPosition()); editor.putString(Defaults.SETTINGS_KEY_BROKER_SECURITY_SSL_CA_PATH, brokerSecuritySSLCaCrtPath.getText().toString()); editor.apply(); Runnable r = new Runnable() { @Override public void run() { ServiceMqtt.getInstance().reconnect(); } }; new Thread( r ).start(); break; case DialogInterface.BUTTON_NEGATIVE: Runnable s = new Runnable() { @Override public void run() { ServiceMqtt.getInstance().disconnect(true); } }; new Thread( s ).start(); } super.onClick(dialog, which); } private void validateHost(String s) { hostOk = s.length() > 0 ? true : false; } private void validatePort(String s) { Integer p = 0; try { p = Integer.parseInt(s.toString()); } catch (NumberFormatException e) { } portOk = (p > 0) && (p <= 65535) ? true : false; } private void conditionalyEnableConnectButton() { View v = getDialog().findViewById(android.R.id.button1); if (v == null) return; Log.v("hostOk", "" + hostOk); Log.v("portOk", "" + portOk); if (hostOk && portOk) v.setEnabled(true); else v.setEnabled(false); } private void validateBrokerSecurity(int val) { securityOptions = val; } private void conditionallyEnableDisconnectButton() { View v = getDialog().findViewById(android.R.id.button2); if (v == null) return; if (ServiceMqtt.getConnectivity() == MQTT_CONNECTIVITY.CONNECTING || ServiceMqtt.getConnectivity() == MQTT_CONNECTIVITY.CONNECTED) { v.setEnabled(true); } else { v.setEnabled(false); } } private void conditionallyEnableBrokerSecurityOptions() { switch (securityOptions) { case Defaults.VALUE_BROKER_SECURITY_NONE: brokerSecuritySSLOptions.setVisibility(View.GONE); brokerSecurityNoneOptions.setVisibility(View.VISIBLE); break; case Defaults.VALUE_BROKER_SECURITY_SSL: brokerSecuritySSLOptions.setVisibility(View.GONE); brokerSecurityNoneOptions.setVisibility(View.VISIBLE); break; case Defaults.VALUE_BROKER_SECURITY_SSL_CUSTOMCACRT: brokerSecuritySSLOptions.setVisibility(View.VISIBLE); brokerSecurityNoneOptions.setVisibility(View.GONE); break; default: } } }