1 /*
2    Bookmark editing activity
3 
4    Copyright 2013 Thincast Technologies GmbH, Author: Martin Fleisz
5 
6    This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
7    If a copy of the MPL was not distributed with this file, You can obtain one at
8    http://mozilla.org/MPL/2.0/.
9  */
10 
11 package com.freerdp.freerdpcore.presentation;
12 
13 import android.app.AlertDialog;
14 import android.content.ComponentName;
15 import android.content.DialogInterface;
16 import android.content.SharedPreferences;
17 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
18 import android.os.Bundle;
19 import android.preference.ListPreference;
20 import android.preference.Preference;
21 import android.preference.PreferenceActivity;
22 import android.preference.PreferenceManager;
23 import android.preference.PreferenceScreen;
24 import android.util.Log;
25 import android.view.View;
26 
27 import com.freerdp.freerdpcore.R;
28 import com.freerdp.freerdpcore.application.GlobalApp;
29 import com.freerdp.freerdpcore.domain.BookmarkBase;
30 import com.freerdp.freerdpcore.domain.ConnectionReference;
31 import com.freerdp.freerdpcore.domain.ManualBookmark;
32 import com.freerdp.freerdpcore.services.BookmarkBaseGateway;
33 import com.freerdp.freerdpcore.services.LibFreeRDP;
34 import com.freerdp.freerdpcore.utils.RDPFileParser;
35 
36 import java.io.File;
37 import java.io.IOException;
38 import java.util.ArrayList;
39 
40 public class BookmarkActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener
41 {
42 	public static final String PARAM_CONNECTION_REFERENCE = "conRef";
43 
44 	private static final String TAG = "BookmarkActivity";
45 	private static final int PREFERENCES_BOOKMARK = 1;
46 	private static final int PREFERENCES_CREDENTIALS = 2;
47 	private static final int PREFERENCES_SCREEN = 3;
48 	private static final int PREFERENCES_PERFORMANCE = 4;
49 	private static final int PREFERENCES_ADVANCED = 5;
50 	private static final int PREFERENCES_SCREEN3G = 6;
51 	private static final int PREFERENCES_PERFORMANCE3G = 7;
52 	private static final int PREFERENCES_GATEWAY = 8;
53 	private static final int PREFERENCES_DEBUG = 9;
54 	// bookmark needs to be static because the activity is started for each
55 	// subview
56 	// (we have to do this because Android has a bug where the style for
57 	// Preferences
58 	// is only applied to the first PreferenceScreen but not to subsequent ones)
59 	private static BookmarkBase bookmark = null;
60 	private static boolean settings_changed = false;
61 	private static boolean new_bookmark = false;
62 	private int current_preferences;
63 
onCreate(Bundle savedInstanceState)64 	@Override public void onCreate(Bundle savedInstanceState)
65 	{
66 		super.onCreate(savedInstanceState);
67 
68 		PreferenceManager mgr = getPreferenceManager();
69 		// init shared preferences for activity
70 		mgr.setSharedPreferencesName("TEMP");
71 		mgr.setSharedPreferencesMode(MODE_PRIVATE);
72 
73 		if (bookmark == null)
74 		{
75 			// if we have a bookmark id set in the extras we are in edit mode
76 			Bundle bundle = getIntent().getExtras();
77 			if (bundle != null)
78 			{
79 				// See if we got a connection reference to a bookmark
80 				if (bundle.containsKey(PARAM_CONNECTION_REFERENCE))
81 				{
82 					String refStr = bundle.getString(PARAM_CONNECTION_REFERENCE);
83 					if (ConnectionReference.isManualBookmarkReference(refStr))
84 					{
85 						bookmark = GlobalApp.getManualBookmarkGateway().findById(
86 						    ConnectionReference.getManualBookmarkId(refStr));
87 						new_bookmark = false;
88 					}
89 					else if (ConnectionReference.isHostnameReference(refStr))
90 					{
91 						bookmark = new ManualBookmark();
92 						bookmark.<ManualBookmark>get().setLabel(
93 						    ConnectionReference.getHostname(refStr));
94 						bookmark.<ManualBookmark>get().setHostname(
95 						    ConnectionReference.getHostname(refStr));
96 						new_bookmark = true;
97 					}
98 					else if (ConnectionReference.isFileReference(refStr))
99 					{
100 						String file = ConnectionReference.getFile(refStr);
101 
102 						bookmark = new ManualBookmark();
103 						bookmark.setLabel(file);
104 
105 						try
106 						{
107 							RDPFileParser rdpFile = new RDPFileParser(file);
108 							updateBookmarkFromFile((ManualBookmark)bookmark, rdpFile);
109 
110 							bookmark.setLabel(new File(file).getName());
111 							new_bookmark = true;
112 						}
113 						catch (IOException e)
114 						{
115 							Log.e(TAG, "Failed reading RDP file", e);
116 						}
117 					}
118 				}
119 			}
120 
121 			// last chance - ensure we really have a valid bookmark
122 			if (bookmark == null)
123 				bookmark = new ManualBookmark();
124 
125 			// hide gateway settings if we edit a non-manual bookmark
126 			if (current_preferences == PREFERENCES_ADVANCED &&
127 			    bookmark.getType() != ManualBookmark.TYPE_MANUAL)
128 			{
129 				PreferenceScreen screen = getPreferenceScreen();
130 				screen.removePreference(findPreference("bookmark.enable_gateway"));
131 				screen.removePreference(findPreference("bookmark.gateway"));
132 			}
133 
134 			updateH264Preferences();
135 
136 			// update preferences from bookmark
137 			bookmark.writeToSharedPreferences(mgr.getSharedPreferences());
138 
139 			// no settings changed yet
140 			settings_changed = false;
141 		}
142 
143 		// load the requested settings resource
144 		if (getIntent() == null || getIntent().getData() == null)
145 		{
146 			addPreferencesFromResource(R.xml.bookmark_settings);
147 			current_preferences = PREFERENCES_BOOKMARK;
148 		}
149 		else if (getIntent().getData().toString().equals("preferences://screen_settings"))
150 		{
151 			addPreferencesFromResource(R.xml.screen_settings);
152 			current_preferences = PREFERENCES_SCREEN;
153 		}
154 		else if (getIntent().getData().toString().equals("preferences://performance_flags"))
155 		{
156 			addPreferencesFromResource(R.xml.performance_flags);
157 			current_preferences = PREFERENCES_PERFORMANCE;
158 		}
159 		else if (getIntent().getData().toString().equals("preferences://screen_settings_3g"))
160 		{
161 			addPreferencesFromResource(R.xml.screen_settings_3g);
162 			current_preferences = PREFERENCES_SCREEN3G;
163 		}
164 		else if (getIntent().getData().toString().equals("preferences://performance_flags_3g"))
165 		{
166 			addPreferencesFromResource(R.xml.performance_flags_3g);
167 			current_preferences = PREFERENCES_PERFORMANCE3G;
168 		}
169 		else if (getIntent().getData().toString().equals("preferences://advanced_settings"))
170 		{
171 			addPreferencesFromResource(R.xml.advanced_settings);
172 			current_preferences = PREFERENCES_ADVANCED;
173 		}
174 		else if (getIntent().getData().toString().equals("preferences://credentials_settings"))
175 		{
176 			addPreferencesFromResource(R.xml.credentials_settings);
177 			current_preferences = PREFERENCES_CREDENTIALS;
178 		}
179 		else if (getIntent().getData().toString().equals("preferences://gateway_settings"))
180 		{
181 			addPreferencesFromResource(R.xml.gateway_settings);
182 			current_preferences = PREFERENCES_GATEWAY;
183 		}
184 		else if (getIntent().getData().toString().equals("preferences://debug_settings"))
185 		{
186 			addPreferencesFromResource(R.xml.debug_settings);
187 			current_preferences = PREFERENCES_DEBUG;
188 		}
189 		else
190 		{
191 			addPreferencesFromResource(R.xml.bookmark_settings);
192 			current_preferences = PREFERENCES_BOOKMARK;
193 		}
194 
195 		// update UI with bookmark data
196 		SharedPreferences spref = mgr.getSharedPreferences();
197 		initSettings(spref);
198 
199 		// register for preferences changed notification
200 		mgr.getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
201 
202 		// set the correct component names in our preferencescreen settings
203 		setIntentComponentNames();
204 
205 		updateH264Preferences();
206 	}
207 
updateH264Preferences()208 	private void updateH264Preferences()
209 	{
210 		if (!LibFreeRDP.hasH264Support())
211 		{
212 			final int preferenceIdList[] = { R.string.preference_key_h264,
213 				                             R.string.preference_key_h264_3g };
214 
215 			PreferenceManager mgr = getPreferenceManager();
216 			for (int id : preferenceIdList)
217 			{
218 				final String key = getString(id);
219 				Preference preference = mgr.findPreference(key);
220 				if (preference != null)
221 				{
222 					preference.setEnabled(false);
223 				}
224 			}
225 		}
226 	}
227 
updateBookmarkFromFile(ManualBookmark bookmark, RDPFileParser rdpFile)228 	private void updateBookmarkFromFile(ManualBookmark bookmark, RDPFileParser rdpFile)
229 	{
230 		String s;
231 		Integer i;
232 
233 		s = rdpFile.getString("full address");
234 		if (s != null)
235 		{
236 			// this gets complicated as it can include port
237 			if (s.lastIndexOf(":") > s.lastIndexOf("]"))
238 			{
239 				try
240 				{
241 					String port = s.substring(s.lastIndexOf(":") + 1);
242 					bookmark.setPort(Integer.parseInt(port));
243 				}
244 				catch (NumberFormatException e)
245 				{
246 					Log.e(TAG, "Malformed address");
247 				}
248 
249 				s = s.substring(0, s.lastIndexOf(":"));
250 			}
251 
252 			// or even be an ipv6 address
253 			if (s.startsWith("[") && s.endsWith("]"))
254 				s = s.substring(1, s.length() - 1);
255 
256 			bookmark.setHostname(s);
257 		}
258 
259 		i = rdpFile.getInteger("server port");
260 		if (i != null)
261 			bookmark.setPort(i);
262 
263 		s = rdpFile.getString("username");
264 		if (s != null)
265 			bookmark.setUsername(s);
266 
267 		s = rdpFile.getString("domain");
268 		if (s != null)
269 			bookmark.setDomain(s);
270 
271 		i = rdpFile.getInteger("connect to console");
272 		if (i != null)
273 			bookmark.getAdvancedSettings().setConsoleMode(i == 1);
274 	}
275 
setIntentComponentNames()276 	private void setIntentComponentNames()
277 	{
278 		// we set the component name for our sub-activity calls here because we
279 		// don't know the package
280 		// name of the main app in our library project.
281 		ComponentName compName =
282 		    new ComponentName(getPackageName(), BookmarkActivity.class.getName());
283 		ArrayList<String> prefKeys = new ArrayList<String>();
284 
285 		prefKeys.add("bookmark.credentials");
286 		prefKeys.add("bookmark.screen");
287 		prefKeys.add("bookmark.performance");
288 		prefKeys.add("bookmark.advanced");
289 		prefKeys.add("bookmark.screen_3g");
290 		prefKeys.add("bookmark.performance_3g");
291 		prefKeys.add("bookmark.gateway_settings");
292 		prefKeys.add("bookmark.debug");
293 
294 		for (String p : prefKeys)
295 		{
296 			Preference pref = findPreference(p);
297 			if (pref != null)
298 				pref.getIntent().setComponent(compName);
299 		}
300 	}
301 
onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)302 	@Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
303 	{
304 		settings_changed = true;
305 		switch (current_preferences)
306 		{
307 			case PREFERENCES_DEBUG:
308 				debugSettingsChanged(sharedPreferences, key);
309 				break;
310 
311 			case PREFERENCES_BOOKMARK:
312 				bookmarkSettingsChanged(sharedPreferences, key);
313 				break;
314 
315 			case PREFERENCES_ADVANCED:
316 				advancedSettingsChanged(sharedPreferences, key);
317 				break;
318 
319 			case PREFERENCES_CREDENTIALS:
320 				credentialsSettingsChanged(sharedPreferences, key);
321 				break;
322 
323 			case PREFERENCES_SCREEN:
324 			case PREFERENCES_SCREEN3G:
325 				screenSettingsChanged(sharedPreferences, key);
326 				break;
327 
328 			case PREFERENCES_GATEWAY:
329 				gatewaySettingsChanged(sharedPreferences, key);
330 				break;
331 
332 			default:
333 				break;
334 		}
335 	}
336 
initSettings(SharedPreferences sharedPreferences)337 	private void initSettings(SharedPreferences sharedPreferences)
338 	{
339 		switch (current_preferences)
340 		{
341 			case PREFERENCES_BOOKMARK:
342 				initBookmarkSettings(sharedPreferences);
343 				break;
344 
345 			case PREFERENCES_ADVANCED:
346 				initAdvancedSettings(sharedPreferences);
347 				break;
348 
349 			case PREFERENCES_CREDENTIALS:
350 				initCredentialsSettings(sharedPreferences);
351 				break;
352 
353 			case PREFERENCES_SCREEN:
354 				initScreenSettings(sharedPreferences);
355 				break;
356 
357 			case PREFERENCES_SCREEN3G:
358 				initScreenSettings3G(sharedPreferences);
359 				break;
360 
361 			case PREFERENCES_GATEWAY:
362 				initGatewaySettings(sharedPreferences);
363 				break;
364 
365 			case PREFERENCES_DEBUG:
366 				initDebugSettings(sharedPreferences);
367 				break;
368 
369 			default:
370 				break;
371 		}
372 	}
373 
initBookmarkSettings(SharedPreferences sharedPreferences)374 	private void initBookmarkSettings(SharedPreferences sharedPreferences)
375 	{
376 		bookmarkSettingsChanged(sharedPreferences, "bookmark.label");
377 		bookmarkSettingsChanged(sharedPreferences, "bookmark.hostname");
378 		bookmarkSettingsChanged(sharedPreferences, "bookmark.port");
379 		bookmarkSettingsChanged(sharedPreferences, "bookmark.username");
380 		bookmarkSettingsChanged(sharedPreferences, "bookmark.resolution");
381 	}
382 
bookmarkSettingsChanged(SharedPreferences sharedPreferences, String key)383 	private void bookmarkSettingsChanged(SharedPreferences sharedPreferences, String key)
384 	{
385 		if (key.equals("bookmark.label") && findPreference(key) != null)
386 			findPreference(key).setSummary(sharedPreferences.getString(key, ""));
387 		else if (key.equals("bookmark.hostname") && findPreference(key) != null)
388 			findPreference(key).setSummary(sharedPreferences.getString(key, ""));
389 		else if (key.equals("bookmark.port") && findPreference(key) != null)
390 			findPreference(key).setSummary(String.valueOf(sharedPreferences.getInt(key, -1)));
391 		else if (key.equals("bookmark.username"))
392 		{
393 			String username = sharedPreferences.getString(key, "<none>");
394 			if (username.length() == 0)
395 				username = "<none>";
396 			findPreference("bookmark.credentials").setSummary(username);
397 		}
398 		else if (key.equals("bookmark.resolution") || key.equals("bookmark.colors") ||
399 		         key.equals("bookmark.width") || key.equals("bookmark.height"))
400 		{
401 			String resolution = sharedPreferences.getString("bookmark.resolution", "800x600");
402 			// compare english string from resolutions_values_array array,
403 			// decode to localized
404 			// text for display
405 			if (resolution.equals("automatic"))
406 			{
407 				resolution = getResources().getString(R.string.resolution_automatic);
408 			}
409 			if (resolution.equals("custom"))
410 			{
411 				resolution = getResources().getString(R.string.resolution_custom);
412 			}
413 			if (resolution.equals("fitscreen"))
414 			{
415 				resolution = getResources().getString(R.string.resolution_fit);
416 			}
417 			resolution += "@" + sharedPreferences.getInt("bookmark.colors", 16);
418 			findPreference("bookmark.screen").setSummary(resolution);
419 		}
420 	}
421 
initAdvancedSettings(SharedPreferences sharedPreferences)422 	private void initAdvancedSettings(SharedPreferences sharedPreferences)
423 	{
424 		advancedSettingsChanged(sharedPreferences, "bookmark.enable_gateway_settings");
425 		advancedSettingsChanged(sharedPreferences, "bookmark.enable_3g_settings");
426 		advancedSettingsChanged(sharedPreferences, "bookmark.security");
427 		advancedSettingsChanged(sharedPreferences, "bookmark.resolution_3g");
428 		advancedSettingsChanged(sharedPreferences, "bookmark.remote_program");
429 		advancedSettingsChanged(sharedPreferences, "bookmark.work_dir");
430 	}
431 
advancedSettingsChanged(SharedPreferences sharedPreferences, String key)432 	private void advancedSettingsChanged(SharedPreferences sharedPreferences, String key)
433 	{
434 		if (key.equals("bookmark.enable_gateway_settings"))
435 		{
436 			boolean enabled = sharedPreferences.getBoolean(key, false);
437 			findPreference("bookmark.gateway_settings").setEnabled(enabled);
438 		}
439 		else if (key.equals("bookmark.enable_3g_settings"))
440 		{
441 			boolean enabled = sharedPreferences.getBoolean(key, false);
442 			findPreference("bookmark.screen_3g").setEnabled(enabled);
443 			findPreference("bookmark.performance_3g").setEnabled(enabled);
444 		}
445 		else if (key.equals("bookmark.security"))
446 		{
447 			ListPreference listPreference = (ListPreference)findPreference(key);
448 			CharSequence security = listPreference.getEntries()[sharedPreferences.getInt(key, 0)];
449 			listPreference.setSummary(security);
450 		}
451 		else if (key.equals("bookmark.resolution_3g") || key.equals("bookmark.colors_3g") ||
452 		         key.equals("bookmark.width_3g") || key.equals("bookmark.height_3g"))
453 		{
454 			String resolution = sharedPreferences.getString("bookmark.resolution_3g", "800x600");
455 			if (resolution.equals("automatic"))
456 				resolution = getResources().getString(R.string.resolution_automatic);
457 			else if (resolution.equals("custom"))
458 				resolution = getResources().getString(R.string.resolution_custom);
459 			resolution += "@" + sharedPreferences.getInt("bookmark.colors_3g", 16);
460 			findPreference("bookmark.screen_3g").setSummary(resolution);
461 		}
462 		else if (key.equals("bookmark.remote_program"))
463 			findPreference(key).setSummary(sharedPreferences.getString(key, ""));
464 		else if (key.equals("bookmark.work_dir"))
465 			findPreference(key).setSummary(sharedPreferences.getString(key, ""));
466 	}
467 
initCredentialsSettings(SharedPreferences sharedPreferences)468 	private void initCredentialsSettings(SharedPreferences sharedPreferences)
469 	{
470 		credentialsSettingsChanged(sharedPreferences, "bookmark.username");
471 		credentialsSettingsChanged(sharedPreferences, "bookmark.password");
472 		credentialsSettingsChanged(sharedPreferences, "bookmark.domain");
473 	}
474 
credentialsSettingsChanged(SharedPreferences sharedPreferences, String key)475 	private void credentialsSettingsChanged(SharedPreferences sharedPreferences, String key)
476 	{
477 		if (key.equals("bookmark.username"))
478 			findPreference(key).setSummary(sharedPreferences.getString(key, ""));
479 		else if (key.equals("bookmark.password"))
480 		{
481 			if (sharedPreferences.getString(key, "").length() == 0)
482 				findPreference(key).setSummary(
483 				    getResources().getString(R.string.settings_password_empty));
484 			else
485 				findPreference(key).setSummary(
486 				    getResources().getString(R.string.settings_password_present));
487 		}
488 		else if (key.equals("bookmark.domain"))
489 			findPreference(key).setSummary(sharedPreferences.getString(key, ""));
490 	}
491 
initScreenSettings(SharedPreferences sharedPreferences)492 	private void initScreenSettings(SharedPreferences sharedPreferences)
493 	{
494 		screenSettingsChanged(sharedPreferences, "bookmark.colors");
495 		screenSettingsChanged(sharedPreferences, "bookmark.resolution");
496 		screenSettingsChanged(sharedPreferences, "bookmark.width");
497 		screenSettingsChanged(sharedPreferences, "bookmark.height");
498 	}
499 
initScreenSettings3G(SharedPreferences sharedPreferences)500 	private void initScreenSettings3G(SharedPreferences sharedPreferences)
501 	{
502 		screenSettingsChanged(sharedPreferences, "bookmark.colors_3g");
503 		screenSettingsChanged(sharedPreferences, "bookmark.resolution_3g");
504 		screenSettingsChanged(sharedPreferences, "bookmark.width_3g");
505 		screenSettingsChanged(sharedPreferences, "bookmark.height_3g");
506 	}
507 
screenSettingsChanged(SharedPreferences sharedPreferences, String key)508 	private void screenSettingsChanged(SharedPreferences sharedPreferences, String key)
509 	{
510 		// could happen during initialization because 3g and non-3g settings
511 		// share this routine - just skip
512 		if (findPreference(key) == null)
513 			return;
514 
515 		if (key.equals("bookmark.colors") || key.equals("bookmark.colors_3g"))
516 		{
517 			ListPreference listPreference = (ListPreference)findPreference(key);
518 			listPreference.setSummary(listPreference.getEntry());
519 		}
520 		else if (key.equals("bookmark.resolution") || key.equals("bookmark.resolution_3g"))
521 		{
522 			ListPreference listPreference = (ListPreference)findPreference(key);
523 			listPreference.setSummary(listPreference.getEntry());
524 
525 			String value = listPreference.getValue();
526 			boolean enabled = value.equalsIgnoreCase("custom");
527 			if (key.equals("bookmark.resolution"))
528 			{
529 				findPreference("bookmark.width").setEnabled(enabled);
530 				findPreference("bookmark.height").setEnabled(enabled);
531 			}
532 			else
533 			{
534 				findPreference("bookmark.width_3g").setEnabled(enabled);
535 				findPreference("bookmark.height_3g").setEnabled(enabled);
536 			}
537 		}
538 		else if (key.equals("bookmark.width") || key.equals("bookmark.width_3g"))
539 			findPreference(key).setSummary(String.valueOf(sharedPreferences.getInt(key, 800)));
540 		else if (key.equals("bookmark.height") || key.equals("bookmark.height_3g"))
541 			findPreference(key).setSummary(String.valueOf(sharedPreferences.getInt(key, 600)));
542 	}
543 
initDebugSettings(SharedPreferences sharedPreferences)544 	private void initDebugSettings(SharedPreferences sharedPreferences)
545 	{
546 		debugSettingsChanged(sharedPreferences, "bookmark.debug_level");
547 		debugSettingsChanged(sharedPreferences, "bookmark.async_channel");
548 		debugSettingsChanged(sharedPreferences, "bookmark.async_update");
549 		debugSettingsChanged(sharedPreferences, "bookmark.async_input");
550 	}
551 
initGatewaySettings(SharedPreferences sharedPreferences)552 	private void initGatewaySettings(SharedPreferences sharedPreferences)
553 	{
554 		gatewaySettingsChanged(sharedPreferences, "bookmark.gateway_hostname");
555 		gatewaySettingsChanged(sharedPreferences, "bookmark.gateway_port");
556 		gatewaySettingsChanged(sharedPreferences, "bookmark.gateway_username");
557 		gatewaySettingsChanged(sharedPreferences, "bookmark.gateway_password");
558 		gatewaySettingsChanged(sharedPreferences, "bookmark.gateway_domain");
559 	}
560 
debugSettingsChanged(SharedPreferences sharedPreferences, String key)561 	private void debugSettingsChanged(SharedPreferences sharedPreferences, String key)
562 	{
563 		if (key.equals("bookmark.debug_level"))
564 		{
565 			String level = sharedPreferences.getString(key, "INFO");
566 			Preference pref = findPreference("bookmark.debug_level");
567 			pref.setDefaultValue(level);
568 		}
569 		else if (key.equals("bookmark.async_channel"))
570 		{
571 			boolean enabled = sharedPreferences.getBoolean(key, false);
572 			Preference pref = findPreference("bookmark.async_channel");
573 			pref.setDefaultValue(enabled);
574 		}
575 		else if (key.equals("bookmark.async_update"))
576 		{
577 			boolean enabled = sharedPreferences.getBoolean(key, false);
578 			Preference pref = findPreference("bookmark.async_update");
579 			pref.setDefaultValue(enabled);
580 		}
581 		else if (key.equals("bookmark.async_input"))
582 		{
583 			boolean enabled = sharedPreferences.getBoolean(key, false);
584 			Preference pref = findPreference("bookmark.async_input");
585 			pref.setDefaultValue(enabled);
586 		}
587 	}
588 
gatewaySettingsChanged(SharedPreferences sharedPreferences, String key)589 	private void gatewaySettingsChanged(SharedPreferences sharedPreferences, String key)
590 	{
591 		if (key.equals("bookmark.gateway_hostname"))
592 		{
593 			findPreference(key).setSummary(sharedPreferences.getString(key, ""));
594 		}
595 		else if (key.equals("bookmark.gateway_port"))
596 		{
597 			findPreference(key).setSummary(String.valueOf(sharedPreferences.getInt(key, 443)));
598 		}
599 		else if (key.equals("bookmark.gateway_username"))
600 		{
601 			findPreference(key).setSummary(sharedPreferences.getString(key, ""));
602 		}
603 		else if (key.equals("bookmark.gateway_password"))
604 		{
605 			if (sharedPreferences.getString(key, "").length() == 0)
606 				findPreference(key).setSummary(
607 				    getResources().getString(R.string.settings_password_empty));
608 			else
609 				findPreference(key).setSummary(
610 				    getResources().getString(R.string.settings_password_present));
611 		}
612 		else if (key.equals("bookmark.gateway_domain"))
613 			findPreference(key).setSummary(sharedPreferences.getString(key, ""));
614 	}
615 
verifySettings(SharedPreferences sharedPreferences)616 	private boolean verifySettings(SharedPreferences sharedPreferences)
617 	{
618 
619 		boolean verifyFailed = false;
620 		// perform sanity checks on settings
621 		// Label set
622 		if (sharedPreferences.getString("bookmark.label", "").length() == 0)
623 			verifyFailed = true;
624 
625 		// Server and port specified
626 		if (!verifyFailed && sharedPreferences.getString("bookmark.hostname", "").length() == 0)
627 			verifyFailed = true;
628 
629 		// Server and port specified
630 		if (!verifyFailed && sharedPreferences.getInt("bookmark.port", -1) <= 0)
631 			verifyFailed = true;
632 
633 		// if an error occurred - display toast and return false
634 		return (!verifyFailed);
635 	}
636 
finishAndResetBookmark()637 	private void finishAndResetBookmark()
638 	{
639 		bookmark = null;
640 		getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(
641 		    this);
642 		finish();
643 	}
644 
onBackPressed()645 	@Override public void onBackPressed()
646 	{
647 		// only proceed if we are in the main preferences screen
648 		if (current_preferences != PREFERENCES_BOOKMARK)
649 		{
650 			super.onBackPressed();
651 			getPreferenceManager()
652 			    .getSharedPreferences()
653 			    .unregisterOnSharedPreferenceChangeListener(this);
654 			return;
655 		}
656 
657 		SharedPreferences sharedPreferences = getPreferenceManager().getSharedPreferences();
658 		if (!verifySettings(sharedPreferences))
659 		{
660 			// ask the user if he wants to cancel or continue editing
661 			AlertDialog.Builder builder = new AlertDialog.Builder(this);
662 			builder.setTitle(R.string.error_bookmark_incomplete_title)
663 			    .setMessage(R.string.error_bookmark_incomplete)
664 			    .setPositiveButton(R.string.cancel,
665 			                       new DialogInterface.OnClickListener() {
666 				                       @Override
667 				                       public void onClick(DialogInterface dialog, int which)
668 				                       {
669 					                       finishAndResetBookmark();
670 				                       }
671 			                       })
672 			    .setNegativeButton(R.string.cont,
673 			                       new DialogInterface.OnClickListener() {
674 				                       @Override
675 				                       public void onClick(DialogInterface dialog, int which)
676 				                       {
677 					                       dialog.cancel();
678 				                       }
679 			                       })
680 			    .show();
681 
682 			return;
683 		}
684 		else
685 		{
686 			// ask the user if he wants to save or cancel editing if a setting
687 			// has changed
688 			if (new_bookmark || settings_changed)
689 			{
690 				AlertDialog.Builder builder = new AlertDialog.Builder(this);
691 				builder.setTitle(R.string.dlg_title_save_bookmark)
692 				    .setMessage(R.string.dlg_save_bookmark)
693 				    .setPositiveButton(
694 				        R.string.yes,
695 				        new DialogInterface.OnClickListener() {
696 					        @Override public void onClick(DialogInterface dialog, int which)
697 					        {
698 						        // read shared prefs back to bookmark
699 						        bookmark.readFromSharedPreferences(
700 						            getPreferenceManager().getSharedPreferences());
701 
702 						        BookmarkBaseGateway bookmarkGateway;
703 						        if (bookmark.getType() == BookmarkBase.TYPE_MANUAL)
704 						        {
705 							        bookmarkGateway = GlobalApp.getManualBookmarkGateway();
706 							        // remove any history entry for this
707 							        // bookmark
708 							        GlobalApp.getQuickConnectHistoryGateway().removeHistoryItem(
709 							            bookmark.<ManualBookmark>get().getHostname());
710 						        }
711 						        else
712 						        {
713 							        assert false;
714 							        return;
715 						        }
716 
717 						        // insert or update bookmark and leave
718 						        // activity
719 						        if (bookmark.getId() > 0)
720 							        bookmarkGateway.update(bookmark);
721 						        else
722 							        bookmarkGateway.insert(bookmark);
723 
724 						        finishAndResetBookmark();
725 					        }
726 				        })
727 				    .setNegativeButton(R.string.no,
728 				                       new DialogInterface.OnClickListener() {
729 					                       @Override
730 					                       public void onClick(DialogInterface dialog, int which)
731 					                       {
732 						                       finishAndResetBookmark();
733 					                       }
734 				                       })
735 				    .show();
736 			}
737 			else
738 			{
739 				finishAndResetBookmark();
740 			}
741 		}
742 	}
743 }
744