SettingsActivity.java

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