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}