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