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}