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 } else if (name.equals("use_tor")) {
164 reconnectAccounts();
165 }
166
167 }
168
169 private void displayToast(final String msg) {
170 runOnUiThread(new Runnable() {
171 @Override
172 public void run() {
173 Toast.makeText(SettingsActivity.this, msg, Toast.LENGTH_LONG).show();
174 }
175 });
176 }
177
178 private void reconnectAccounts() {
179 for (Account account : xmppConnectionService.getAccounts()) {
180 if (!account.isOptionSet(Account.OPTION_DISABLED)) {
181 xmppConnectionService.reconnectAccountInBackground(account);
182 }
183 }
184 }
185
186 public void refreshUiReal() {
187 //nothing to do. This Activity doesn't implement any listeners
188 }
189
190}