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