/* * Copyright 2011 Marcy Gordon * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package edu.usf.cutr.opentripplanner.android; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceActivity; import android.preference.PreferenceCategory; import android.preference.PreferenceManager; import android.preference.PreferenceScreen; import android.util.Log; import android.webkit.URLUtil; import android.widget.Toast; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import edu.usf.cutr.opentripplanner.android.listeners.ServerCheckerCompleteListener; import edu.usf.cutr.opentripplanner.android.model.Server; import edu.usf.cutr.opentripplanner.android.sqlite.ServersDataSource; import edu.usf.cutr.opentripplanner.android.tasks.ServerChecker; import edu.usf.cutr.opentripplanner.android.util.ConversionUtils; ; /* * Modified by Khoa Tran */ public class SettingsActivity extends PreferenceActivity implements ServerCheckerCompleteListener { private ListPreference mapTileProvider; private CheckBoxPreference autoDetectServer; private EditTextPreference customServerURL; private Preference providerFeedbackButton; private CheckBoxPreference wheelAccessible; private Preference serverRefreshButton; private Preference aboutButton; private CheckBoxPreference selectedCustomServer; private CheckBoxPreference liveUpdates; private PreferenceCategory liveUpdatesCategory; private PreferenceScreen preferenceScreen; private ListPreference geocoderProvider; private EditTextPreference maxWalkingDistance; private Intent returnIntent; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); returnIntent = new Intent(); if (savedInstanceState != null) { if ((returnIntent = savedInstanceState.getParcelable(OTPApp.BUNDLE_KEY_SETTINGS_INTENT)) != null) { setResult(RESULT_OK, returnIntent); } } addPreferencesFromResource(R.xml.preferences); mapTileProvider = (ListPreference) findPreference(OTPApp.PREFERENCE_KEY_MAP_TILE_SOURCE); geocoderProvider = (ListPreference) findPreference(OTPApp.PREFERENCE_KEY_GEOCODER_PROVIDER); autoDetectServer = (CheckBoxPreference) findPreference( OTPApp.PREFERENCE_KEY_AUTO_DETECT_SERVER); customServerURL = (EditTextPreference) findPreference( OTPApp.PREFERENCE_KEY_CUSTOM_SERVER_URL); selectedCustomServer = (CheckBoxPreference) findPreference( OTPApp.PREFERENCE_KEY_SELECTED_CUSTOM_SERVER); liveUpdates = (CheckBoxPreference) findPreference( OTPApp.PREFERENCE_KEY_LIVE_UPDATES); liveUpdatesCategory = (PreferenceCategory) findPreference( OTPApp.PREFERENCE_KEY_LIVE_UPDATES_CATEGORY); preferenceScreen = (PreferenceScreen) findPreference( OTPApp.PREFERENCE_KEY_PREFERENCE_SCREEN); maxWalkingDistance = (EditTextPreference) findPreference( OTPApp.PREFERENCE_KEY_MAX_WALKING_DISTANCE); wheelAccessible = (CheckBoxPreference) findPreference( OTPApp.PREFERENCE_KEY_WHEEL_ACCESSIBLE); aboutButton = findPreference( OTPApp.PREFERENCE_KEY_ABOUT); String[] entriesArray = getResources().getStringArray(R.array.map_tiles_servers_names); ArrayList<String> entries = new ArrayList<String>(Arrays.asList(entriesArray)); entries.add(OTPApp.MAP_TILE_GOOGLE_NORMAL); entries.add(OTPApp.MAP_TILE_GOOGLE_SATELLITE); entries.add(OTPApp.MAP_TILE_GOOGLE_HYBRID); entries.add(OTPApp.MAP_TILE_GOOGLE_TERRAIN); mapTileProvider.setEntries(entries.toArray(new CharSequence[entries.size()])); String[] entriesValuesArray = getResources().getStringArray(R.array.map_tiles_servers_urls); ArrayList<String> entriesValues = new ArrayList<String>(Arrays.asList(entriesValuesArray)); entriesValues.add(OTPApp.MAP_TILE_GOOGLE_NORMAL); entriesValues.add(OTPApp.MAP_TILE_GOOGLE_SATELLITE); entriesValues.add(OTPApp.MAP_TILE_GOOGLE_HYBRID); entriesValues.add(OTPApp.MAP_TILE_GOOGLE_TERRAIN); mapTileProvider .setEntryValues(entriesValues.toArray(new CharSequence[entriesValues.size()])); if (mapTileProvider.getValue() == null) { mapTileProvider.setValue(ConversionUtils.getOverlayString(this)); } CharSequence geocoders[] = {getResources().getString(R.string.geocoder_nominatim), getResources().getString(R.string.geocoder_google_places)}; geocoderProvider.setEntries(geocoders); geocoderProvider.setEntryValues(geocoders); if (geocoderProvider.getValue() == null) { geocoderProvider.setValue(getResources().getString(R.string.geocoder_nominatim)); } SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(getApplicationContext()); if (prefs.getString(OTPApp.PREFERENCE_KEY_GEOCODER_PROVIDER, getResources().getString(R.string.geocoder_nominatim)) .equals(getResources().getString(R.string.geocoder_nominatim))) { geocoderProvider.setSummary( getResources().getString(R.string.settings_menu_geocoder_preference_provider_nominatim)); } else { geocoderProvider.setSummary( getResources().getString(R.string.settings_menu_geocoder_preference_provider_google_places)); } geocoderProvider.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { String value = (String) newValue; if (value.equals(getResources().getString(R.string.geocoder_nominatim))) { geocoderProvider.setSummary(getResources() .getString(R.string.settings_menu_geocoder_preference_provider_nominatim)); } else { geocoderProvider.setSummary(getResources() .getString(R.string.settings_menu_geocoder_preference_provider_google_places)); } return true; } }); String actualMapTileProvider = prefs.getString(OTPApp.PREFERENCE_KEY_MAP_TILE_SOURCE, getResources().getString(R.string.map_tiles_default_server_low_res)); if (actualMapTileProvider.equals(getResources().getString(R.string.tiles_mapnik))) { mapTileProvider.setSummary(getResources().getString(R.string.mapnik)); } else if (actualMapTileProvider.equals(getResources().getString(R.string.tiles_maquest))) { mapTileProvider.setSummary(getResources().getString(R.string.maquest)); } else if (actualMapTileProvider .equals(getResources().getString(R.string.tiles_cyclemap))) { mapTileProvider.setSummary(getResources().getString(R.string.cyclemap)); } else if (actualMapTileProvider .equals(getResources().getString(R.string.tiles_lyrk))) { mapTileProvider.setSummary(getResources().getString(R.string.lyrk)); } else if (actualMapTileProvider .equals(getResources().getString(R.string.tiles_mapbox))) { mapTileProvider.setSummary(getResources().getString(R.string.mapbox)); } else if (actualMapTileProvider .equals(getResources().getString(R.string.tiles_mapbox_retina))) { mapTileProvider.setSummary(getResources().getString(R.string.mapboxretina)); } else if (actualMapTileProvider.equals(OTPApp.MAP_TILE_GOOGLE_NORMAL)) { mapTileProvider.setSummary(OTPApp.MAP_TILE_GOOGLE_NORMAL); } else if (actualMapTileProvider.equals(OTPApp.MAP_TILE_GOOGLE_HYBRID)) { mapTileProvider.setSummary(OTPApp.MAP_TILE_GOOGLE_HYBRID); } else if (actualMapTileProvider.equals(OTPApp.MAP_TILE_GOOGLE_SATELLITE)) { mapTileProvider.setSummary(OTPApp.MAP_TILE_GOOGLE_SATELLITE); } else if (actualMapTileProvider.equals(OTPApp.MAP_TILE_GOOGLE_TERRAIN)) { mapTileProvider.setSummary(OTPApp.MAP_TILE_GOOGLE_TERRAIN); } mapTileProvider.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { String value = (String) newValue; returnIntent.putExtra(OTPApp.CHANGED_MAP_TILE_PROVIDER_RETURN_KEY, true); setResult(RESULT_OK, returnIntent); if (value.equals(getResources().getString(R.string.tiles_mapnik))) { mapTileProvider.setSummary(getResources().getString(R.string.mapnik)); } else if (value.equals(getResources().getString(R.string.tiles_maquest))) { mapTileProvider.setSummary(getResources().getString(R.string.maquest)); } else if (value.equals(getResources().getString(R.string.tiles_cyclemap))) { mapTileProvider.setSummary(getResources().getString(R.string.cyclemap)); } else if (value.equals(getResources().getString(R.string.tiles_lyrk))) { mapTileProvider.setSummary(getResources().getString(R.string.lyrk)); } else if (value.equals(getResources().getString(R.string.tiles_mapbox))) { mapTileProvider.setSummary(getResources().getString(R.string.mapbox)); } else if (value.equals(getResources().getString(R.string.tiles_mapbox_retina))) { mapTileProvider.setSummary(getResources().getString(R.string.mapboxretina)); } else if (value.equals(OTPApp.MAP_TILE_GOOGLE_NORMAL)) { mapTileProvider.setSummary(OTPApp.MAP_TILE_GOOGLE_NORMAL); } else if (value.equals(OTPApp.MAP_TILE_GOOGLE_HYBRID)) { mapTileProvider.setSummary(OTPApp.MAP_TILE_GOOGLE_HYBRID); } else if (value.equals(OTPApp.MAP_TILE_GOOGLE_SATELLITE)) { mapTileProvider.setSummary(OTPApp.MAP_TILE_GOOGLE_SATELLITE); } else if (value.equals(OTPApp.MAP_TILE_GOOGLE_TERRAIN)) { mapTileProvider.setSummary(OTPApp.MAP_TILE_GOOGLE_TERRAIN); } return true; } }); maxWalkingDistance.setSummary(maxWalkingDistance.getText() + " " + getResources() .getString(R.string.settings_menu_maximum_walk_description)); maxWalkingDistance.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { String value = (String) newValue; maxWalkingDistance.setSummary( value + " " + getResources().getString(R.string.settings_menu_maximum_walk_description)); returnIntent.putExtra(OTPApp.CHANGED_PARAMETERS_MUST_REQUEST_TRIP_RETURN_KEY, true); setResult(RESULT_OK, returnIntent); return true; } }); wheelAccessible.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { returnIntent.putExtra(OTPApp.CHANGED_PARAMETERS_MUST_REQUEST_TRIP_RETURN_KEY, true); setResult(RESULT_OK, returnIntent); return true; } }); if (prefs.getBoolean(OTPApp.PREFERENCE_KEY_CUSTOM_SERVER_URL_IS_VALID, false)) { customServerURL .setSummary(getResources().getString(R.string.settings_menu_custom_server_url_description)); } else { selectedCustomServer.setEnabled(false); customServerURL.setSummary(getResources().getString(R.string.settings_menu_custom_server_url_description_error_url)); } if (selectedCustomServer.isEnabled() && selectedCustomServer.isChecked()) { autoDetectServer.setEnabled(false); } selectedCustomServer.setDependency(OTPApp.PREFERENCE_KEY_CUSTOM_SERVER_URL); customServerURL.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { String value = (String) newValue; if (URLUtil.isValidUrl(value)) { WeakReference<Activity> weakContext = new WeakReference<Activity>( SettingsActivity.this); ServerChecker serverChecker = new ServerChecker(weakContext, SettingsActivity.this.getApplicationContext(), SettingsActivity.this, true, true, false); serverChecker.execute( new Server(value, SettingsActivity.this.getApplicationContext())); return true; } Toast.makeText(SettingsActivity.this.getApplicationContext(), SettingsActivity.this.getApplicationContext().getResources() .getString(R.string.settings_menu_custom_server_url_description_error_url), Toast.LENGTH_SHORT ) .show(); customServerURL .setSummary(getResources().getString(R.string.settings_menu_custom_server_url_description_error_url)); setResult(RESULT_OK, returnIntent); return false; } }); selectedCustomServer.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { Boolean value = (Boolean) newValue; if (value) { autoDetectServer.setChecked(false); autoDetectServer.setEnabled(false); } else { autoDetectServer.setEnabled(true); } Log.d(OTPApp.TAG, "Custom server Button clicked"); returnIntent.putExtra(OTPApp.CHANGED_SELECTED_CUSTOM_SERVER_RETURN_KEY, true); setResult(RESULT_OK, returnIntent); return true; } }); autoDetectServer.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { Boolean value = (Boolean) newValue; SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(getApplicationContext()); if (value) { selectedCustomServer.setEnabled(false); } else { if (prefs.getBoolean(OTPApp.PREFERENCE_KEY_CUSTOM_SERVER_URL_IS_VALID, false)) { selectedCustomServer.setEnabled(true); } } return true; } }); if (prefs.getBoolean(OTPApp.PREFERENCE_KEY_REALTIME_AVAILABLE, false)) { liveUpdates.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { Boolean value = (Boolean) newValue; if (!value) { returnIntent.putExtra(OTPApp.LIVE_UPDATES_DISABLED_RETURN_KEY, true); setResult(RESULT_OK, returnIntent); } return true; } }); } else { liveUpdatesCategory.removePreference(liveUpdates); preferenceScreen.removePreference(liveUpdatesCategory); } aboutButton.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { Log.v(OTPApp.TAG, "About button clicked"); Intent intent = new Intent(SettingsActivity.this, AboutActivity.class); startActivity(intent); return true; } }); providerFeedbackButton = (Preference) findPreference( OTPApp.PREFERENCE_KEY_OTP_PROVIDER_FEEDBACK); providerFeedbackButton .setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference arg0) { Log.d(OTPApp.TAG, "Provider Feedback Button clicked"); String recipient = getString(R.string.feedback_email_android_developer); String uriText = "mailto:" + recipient; String subject = ""; subject += getResources().getString(R.string.menu_button_feedback_subject); Date d = Calendar.getInstance().getTime(); subject += "[" + d.toString() + "]"; uriText += "?subject=" + subject; Uri uri = Uri.parse(uriText); Intent sendIntent = new Intent(Intent.ACTION_SENDTO); sendIntent.setData(uri); startActivity(Intent.createChooser(sendIntent, getResources().getString(R.string.menu_button_feedback_send_email))); return true; } }); ServersDataSource datasource = ServersDataSource.getInstance(this); datasource.open(); Long mostRecentDate = datasource.getMostRecentDate(); serverRefreshButton = (Preference) findPreference( OTPApp.PREFERENCE_KEY_REFRESH_SERVER_LIST); if (mostRecentDate != null) { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(mostRecentDate); serverRefreshButton.setSummary( getResources().getString(R.string.settings_menu_server_list_download_date_description) + ConversionUtils.getTimeWithContext(this.getApplicationContext(), cal.getTimeZone().getOffset(cal.getTimeInMillis()), cal.getTimeInMillis(), true) ); } else { serverRefreshButton.setSummary( getResources().getString(R.string.settings_menu_server_list_download_date_unknown)); } serverRefreshButton .setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference arg0) { Log.d(OTPApp.TAG, "Server Refresh Button clicked"); returnIntent.putExtra(OTPApp.REFRESH_SERVER_RETURN_KEY, true); setResult(RESULT_OK, returnIntent); finish(); return true; } }); datasource.close(); } @Override public void onServerCheckerComplete(String result, boolean isCustomServer, boolean isAutodetected, boolean isWorking) { SharedPreferences.Editor prefsEditor = PreferenceManager .getDefaultSharedPreferences(getApplicationContext()).edit(); if (isWorking) { autoDetectServer.setChecked(false); autoDetectServer.setEnabled(false); selectedCustomServer.setEnabled(true); selectedCustomServer.setChecked(true); returnIntent.putExtra(OTPApp.CHANGED_SELECTED_CUSTOM_SERVER_RETURN_KEY, true); setResult(RESULT_OK, returnIntent); customServerURL .setSummary(getResources().getString(R.string.settings_menu_custom_server_url_description)); prefsEditor.putBoolean(OTPApp.PREFERENCE_KEY_CUSTOM_SERVER_URL_IS_VALID, true); } else { autoDetectServer.setEnabled(true); selectedCustomServer.setChecked(false); selectedCustomServer.setEnabled(false); customServerURL.setSummary(getResources().getString(R.string.settings_menu_custom_server_url_description_error_unreachable)); prefsEditor.putBoolean(OTPApp.PREFERENCE_KEY_CUSTOM_SERVER_URL_IS_VALID, false); prefsEditor.putBoolean(OTPApp.PREFERENCE_KEY_SELECTED_CUSTOM_SERVER, false); } prefsEditor.commit(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (returnIntent != null) { outState.putParcelable(OTPApp.BUNDLE_KEY_SETTINGS_INTENT, returnIntent); } } }