SettingsActivity.java

  1package eu.siacs.conversations.ui;
  2
  3import java.security.KeyStoreException;
  4import java.util.ArrayList;
  5import java.util.Arrays;
  6import java.util.Collections;
  7import java.util.Locale;
  8
  9import de.duenndns.ssl.MemorizingTrustManager;
 10
 11import eu.siacs.conversations.R;
 12import eu.siacs.conversations.entities.Account;
 13import eu.siacs.conversations.xmpp.XmppConnection;
 14
 15import android.app.AlertDialog;
 16import android.app.Fragment;
 17import android.app.FragmentManager;
 18import android.content.DialogInterface;
 19import android.content.SharedPreferences;
 20import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 21import android.os.Build;
 22import android.os.Bundle;
 23import android.preference.ListPreference;
 24import android.preference.Preference;
 25import android.preference.PreferenceManager;
 26import android.widget.Toast;
 27
 28public class SettingsActivity extends XmppActivity implements
 29		OnSharedPreferenceChangeListener {
 30	private SettingsFragment mSettingsFragment;
 31
 32	@Override
 33	protected void onCreate(Bundle savedInstanceState) {
 34		super.onCreate(savedInstanceState);
 35		FragmentManager fm = getFragmentManager();
 36		mSettingsFragment = (SettingsFragment) fm.findFragmentById(android.R.id.content);
 37		if (mSettingsFragment == null || !mSettingsFragment.getClass().equals(SettingsFragment.class)) {
 38			mSettingsFragment = new SettingsFragment();
 39			fm.beginTransaction().replace(android.R.id.content, mSettingsFragment).commit();
 40		}
 41	}
 42
 43	@Override
 44	void onBackendConnected() {
 45
 46	}
 47
 48	@Override
 49	public void onStart() {
 50		super.onStart();
 51		PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
 52		ListPreference resources = (ListPreference) mSettingsFragment.findPreference("resource");
 53		if (resources != null) {
 54			ArrayList<CharSequence> entries = new ArrayList<>(Arrays.asList(resources.getEntries()));
 55			if (!entries.contains(Build.MODEL)) {
 56				entries.add(0, Build.MODEL);
 57				resources.setEntries(entries.toArray(new CharSequence[entries.size()]));
 58				resources.setEntryValues(entries.toArray(new CharSequence[entries.size()]));
 59			}
 60		}
 61
 62		final Preference removeCertsPreference = mSettingsFragment.findPreference("remove_trusted_certificates");
 63		removeCertsPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
 64			@Override
 65			public boolean onPreferenceClick(Preference preference) {
 66				final MemorizingTrustManager mtm = xmppConnectionService.getMemorizingTrustManager();
 67				final ArrayList<String> aliases = Collections.list(mtm.getCertificates());
 68				if (aliases.size() == 0) {
 69					displayToast(getString(R.string.toast_no_trusted_certs));
 70					return true;
 71				}
 72				final ArrayList selectedItems = new ArrayList<Integer>();
 73				final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(SettingsActivity.this);
 74				dialogBuilder.setTitle(getResources().getString(R.string.dialog_manage_certs_title));
 75				dialogBuilder.setMultiChoiceItems(aliases.toArray(new CharSequence[aliases.size()]), null,
 76						new DialogInterface.OnMultiChoiceClickListener() {
 77							@Override
 78							public void onClick(DialogInterface dialog, int indexSelected,
 79												boolean isChecked) {
 80								if (isChecked) {
 81									selectedItems.add(indexSelected);
 82								} else if (selectedItems.contains(indexSelected)) {
 83									selectedItems.remove(Integer.valueOf(indexSelected));
 84								}
 85								if (selectedItems.size() > 0)
 86									((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(true);
 87								else {
 88									((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(false);
 89								}
 90							}
 91						});
 92
 93				dialogBuilder.setPositiveButton(
 94						getResources().getString(R.string.dialog_manage_certs_positivebutton), new DialogInterface.OnClickListener() {
 95							@Override
 96							public void onClick(DialogInterface dialog, int which) {
 97								int count = selectedItems.size();
 98								if (count > 0) {
 99									for (int i = 0; i < count; i++) {
100										try {
101											Integer item = Integer.valueOf(selectedItems.get(i).toString());
102											String alias = aliases.get(item);
103											mtm.deleteCertificate(alias);
104										} catch (KeyStoreException e) {
105											e.printStackTrace();
106											displayToast("Error: " + e.getLocalizedMessage());
107										}
108									}
109									if (xmppConnectionServiceBound) {
110										reconnectAccounts();
111									}
112									displayToast(getResources().getQuantityString(R.plurals.toast_delete_certificates, count, count));
113								}
114							}
115						});
116				dialogBuilder.setNegativeButton(getResources().getString(R.string.dialog_manage_certs_negativebutton), null);
117				AlertDialog removeCertsDialog = dialogBuilder.create();
118				removeCertsDialog.show();
119				removeCertsDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
120				return true;
121			}
122		});
123	}
124
125	@Override
126	public void onStop() {
127		super.onStop();
128		PreferenceManager.getDefaultSharedPreferences(this)
129				.unregisterOnSharedPreferenceChangeListener(this);
130	}
131
132	@Override
133	public void onSharedPreferenceChanged(SharedPreferences preferences,
134			String name) {
135		if (name.equals("resource")) {
136			String resource = preferences.getString("resource", "mobile")
137					.toLowerCase(Locale.US);
138			if (xmppConnectionServiceBound) {
139				for (Account account : xmppConnectionService.getAccounts()) {
140					if (account.setResource(resource)) {
141						if (!account.isOptionSet(Account.OPTION_DISABLED)) {
142							XmppConnection connection = account.getXmppConnection();
143							if (connection != null) {
144								connection.resetStreamId();
145							}
146							xmppConnectionService.reconnectAccountInBackground(account);
147						}
148					}
149				}
150			}
151		} else if (name.equals("keep_foreground_service")) {
152			xmppConnectionService.toggleForegroundService();
153		} else if (name.equals("confirm_messages")) {
154			if (xmppConnectionServiceBound) {
155				for (Account account : xmppConnectionService.getAccounts()) {
156					if (!account.isOptionSet(Account.OPTION_DISABLED)) {
157						xmppConnectionService.sendPresence(account);
158					}
159				}
160			}
161		} else if (name.equals("dont_trust_system_cas")) {
162			xmppConnectionService.updateMemorizingTrustmanager();
163			reconnectAccounts();
164		}
165
166	}
167
168	private void displayToast(final String msg) {
169		runOnUiThread(new Runnable() {
170			@Override
171			public void run() {
172				Toast.makeText(SettingsActivity.this, msg, Toast.LENGTH_LONG).show();
173			}
174		});
175	}
176
177	private void reconnectAccounts() {
178		for (Account account : xmppConnectionService.getAccounts()) {
179			if (!account.isOptionSet(Account.OPTION_DISABLED)) {
180				xmppConnectionService.reconnectAccountInBackground(account);
181			}
182		}
183	}
184
185}