/* * Copyright (C) 2012, Katy Hilgenberg. * Special acknowledgments to: Knowledge & Data Engineering Group, University of Kassel (http://www.kde.cs.uni-kassel.de). * Contact: sdcf@cs.uni-kassel.de * * This file is part of the SDCFramework (Sensor Data Collection Framework) project. * * The SDCFramework is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The SDCFramework is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the SDCFramework. If not, see <http://www.gnu.org/licenses/>. */ package de.unikassel.android.sdcframework.app; import java.util.List; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceActivity; import android.preference.PreferenceCategory; import android.preference.PreferenceScreen; import android.text.method.DigitsKeyListener; import de.unikassel.android.sdcframework.R; import de.unikassel.android.sdcframework.app.scheduler.SDCFSchedulerActivity; import de.unikassel.android.sdcframework.app.scheduler.ScheduleService; import de.unikassel.android.sdcframework.data.ConcreteDeviceInformation; import de.unikassel.android.sdcframework.data.independent.DeviceInformation; import de.unikassel.android.sdcframework.devices.SensorDeviceAvailabilityTester; import de.unikassel.android.sdcframework.devices.facade.SensorDeviceIdentifier; import de.unikassel.android.sdcframework.devices.facade.SensorDevicePriorities; import de.unikassel.android.sdcframework.persistence.facade.DBFullStrategyDescription; import de.unikassel.android.sdcframework.preferences.ApplicationPreferenceManagerImpl; import de.unikassel.android.sdcframework.preferences.SDCConfigurationManager; import de.unikassel.android.sdcframework.preferences.facade.ApplicationPreferenceManager; import de.unikassel.android.sdcframework.preferences.facade.LogLevelConfiguration; import de.unikassel.android.sdcframework.preferences.facade.SensorDevicePreferences; import de.unikassel.android.sdcframework.preferences.facade.ServicePreferences; import de.unikassel.android.sdcframework.preferences.facade.SinglePreference; import de.unikassel.android.sdcframework.preferences.facade.TimeProviderPreference; import de.unikassel.android.sdcframework.preferences.facade.TransmissionPreference; import de.unikassel.android.sdcframework.preferences.facade.TransmissionProtocolPreference; import de.unikassel.android.sdcframework.transmission.facade.ConnectionStrategyDescription; import de.unikassel.android.sdcframework.util.facade.ArchiveTypes; import de.unikassel.android.sdcframework.util.facade.LogLevel; import de.unikassel.android.sdcframework.util.facade.TimeProviderErrorStrategyDescription; /** * The activity for the preference screen. <br/> * <br/> * Does provide the device and service configuration screen. The service and * device preference screens will be created dynamically at runtime.<br/> * Any defaults configured in the service configuration file in the projects * asset folder can be overridden here.<br/> * The configured device types in the service configuration will limit the * available devices in the preference screen, in the same way as for the * service itself. * * @see ApplicationPreferenceManagerImpl * @see SDCConfigurationManager * @see SensorDeviceAvailabilityTester * @author Katy Hilgenberg * */ public final class SDCPreferenceActivity extends PreferenceActivity { /** * Scheduler update request code. */ private static final int SCHEDULE_UPDATE = 0; /** * The preference manager */ private final ApplicationPreferenceManager prefManager; /** * Constructor */ public SDCPreferenceActivity() { super(); this.prefManager = new ApplicationPreferenceManagerImpl(); } /* * (non-Javadoc) * * @see android.preference.PreferenceActivity#onCreate(android.os.Bundle) */ @Override protected void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); // update sensor device preferences and availability tester by configuration String configFile = getText( R.string.sdc_config_file_name ).toString(); SDCConfigurationManager serviceConfigurationManager = new SDCConfigurationManager( getApplicationContext(), configFile ); serviceConfigurationManager.updateDefaults( prefManager ); SensorDeviceAvailabilityTester.getInstance().configure( serviceConfigurationManager.getListDevices(), getApplicationContext() ); serviceConfigurationManager.onDestroy(); PreferenceScreen root = getPreferenceManager().createPreferenceScreen( this ); createDevicePreferences( root ); createServicePreferences( root ); createServiceSchedulerPreferences( root ); createDeviceInfoDisplayInfo( root ); PackageInfo pInfo; try { pInfo = getPackageManager().getPackageInfo( getPackageName(), 0 ); String sVersion = pInfo.versionName; PreferenceScreen prefScreen = getPreferenceManager().createPreferenceScreen( this ); prefScreen.setKey( getText( R.string.pref_key_version_screen ).toString() ); prefScreen.setTitle( R.string.title_version ); prefScreen.setSummary( sVersion ); root.addPreference( prefScreen ); } catch ( NameNotFoundException e ) {} setPreferenceScreen( root ); setPreferenceDependencies(); } /** * Does set preference dependencies after tree was created */ private void setPreferenceDependencies() { // add dependency of transfer enabled from persistent storage enabled Preference transmissionCheckBox = getPreferenceManager().findPreference( prefManager.getServicePreferences().getTransmissionEnabledPreference().getKey() ); if ( transmissionCheckBox != null ) { String parentKey = prefManager.getServicePreferences().getPersistentStorageEnabledPreference().getKey(); transmissionCheckBox.setDependency( parentKey ); } } /** * Does create the service scheduler section dynamically in the root screen. * * @param root * the root element to add preferences to */ private void createServiceSchedulerPreferences( PreferenceScreen root ) { PreferenceScreen schedulerPrefScreen = getPreferenceManager().createPreferenceScreen( this ); schedulerPrefScreen.setKey( getText( R.string.pref_key_scheduler ).toString() ); schedulerPrefScreen.setTitle( R.string.pref_category_scheduler ); schedulerPrefScreen.setSummary( R.string.sum_scheduler ); schedulerPrefScreen.setOnPreferenceClickListener( new OnPreferenceClickListener() { /* * (non-Javadoc) * * @see * android.preference.Preference.OnPreferenceClickListener#onPreferenceClick * (android.preference.Preference) */ @Override public boolean onPreferenceClick( Preference preference ) { return onSchedulerStart(); } } ); root.addPreference( schedulerPrefScreen ); } /** * Handler for scheduler preference selection. * * @return true if successful, false otherwise */ protected boolean onSchedulerStart() { Intent intent = new Intent( this, SDCFSchedulerActivity.class ); startActivityForResult( intent, SCHEDULE_UPDATE ); return true; } /* * (non-Javadoc) * * @see android.preference.PreferenceActivity#onActivityResult(int, int, * android.content.Intent) */ @Override protected void onActivityResult( int requestCode, int resultCode, Intent data ) { // Make sure the request was successful if ( resultCode == RESULT_OK ) { switch ( requestCode ) { case SCHEDULE_UPDATE: { Intent intent = ScheduleService.createIntent( getApplicationContext() ); startService( intent ); break; } } } } /** * Does create the device info display section dynamically in the root screen * * @param root * the root element to add preferences to */ private void createDeviceInfoDisplayInfo( PreferenceScreen root ) { // create the preference screen for service preferences PreferenceScreen infoPrefScreen = getPreferenceManager().createPreferenceScreen( this ); infoPrefScreen.setKey( getText( R.string.pref_key_device_info ).toString() ); infoPrefScreen.setTitle( R.string.pref_category_device_info ); infoPrefScreen.setSummary( R.string.sum_service_device_info ); root.addPreference( infoPrefScreen ); String sUuid = prefManager.getUUIDConfiguration( this ); PreferenceScreen prefScreen = getPreferenceManager().createPreferenceScreen( this ); prefScreen.setKey( getText( R.string.pref_key_uuid_screen ).toString() ); prefScreen.setTitle( R.string.title_uuid ); prefScreen.setSummary( sUuid ); infoPrefScreen.addPreference( prefScreen ); DeviceInformation deviceInfo = new ConcreteDeviceInformation( sUuid ); // device prefScreen = getPreferenceManager().createPreferenceScreen( this ); prefScreen.setTitle( R.string.title_device ); prefScreen.setSummary( deviceInfo.getDevice() ); infoPrefScreen.addPreference( prefScreen ); // manufacturer prefScreen = getPreferenceManager().createPreferenceScreen( this ); prefScreen.setTitle( R.string.title_manufacturer ); prefScreen.setSummary( deviceInfo.getManufacturer() ); infoPrefScreen.addPreference( prefScreen ); // model prefScreen = getPreferenceManager().createPreferenceScreen( this ); prefScreen.setTitle( R.string.title_model ); prefScreen.setSummary( deviceInfo.getModel() ); infoPrefScreen.addPreference( prefScreen ); // identifier prefScreen = getPreferenceManager().createPreferenceScreen( this ); prefScreen.setTitle( R.string.title_identifier ); prefScreen.setSummary( deviceInfo.getId() ); infoPrefScreen.addPreference( prefScreen ); // os version prefScreen = getPreferenceManager().createPreferenceScreen( this ); prefScreen.setTitle( R.string.title_os_version ); prefScreen.setSummary( deviceInfo.getRelease() ); infoPrefScreen.addPreference( prefScreen ); // fingerprint prefScreen = getPreferenceManager().createPreferenceScreen( this ); prefScreen.setTitle( R.string.title_fingerprint ); prefScreen.setSummary( deviceInfo.getFingerprint() ); infoPrefScreen.addPreference( prefScreen ); } /** * Does create the service preferences dynamically in the root screen * * @param root * the root element to add service preferences to */ private void createServicePreferences( PreferenceScreen root ) { // create the preference screen for service preferences PreferenceScreen servicePrefScreen = getPreferenceManager().createPreferenceScreen( this ); servicePrefScreen.setKey( getText( R.string.pref_key_service_config ).toString() ); servicePrefScreen.setTitle( R.string.pref_category_service_config ); servicePrefScreen.setSummary( R.string.sum_service_config ); root.addPreference( servicePrefScreen ); ServicePreferences servicePrefs = prefManager.getServicePreferences(); // create the preference entries for sample broadcast service part createSamplingRelatedPreferences( servicePrefScreen, servicePrefs ); // create the preference entries for sample broadcast service part createSampleBroadcastPreferences( servicePrefScreen, servicePrefs ); // create the preference entries for persistent storage service part createPersistentStoragePreferences( servicePrefScreen, servicePrefs ); // create the preference entries for transmission service part createTransmissionPreferences( servicePrefScreen, servicePrefs ); // create preference screen for log level createLoggingPreferences( servicePrefScreen, servicePrefs ); // create preference screen for time provider createTimeProviderPreferences( servicePrefScreen ); } /** * Does create the time provider preferences dynamically in the given root * screen * * @param root * the root element to add preferences to */ private void createTimeProviderPreferences( PreferenceScreen root ) { // create category entry PreferenceCategory categoryPref = new PreferenceCategory( this ); categoryPref.setTitle( R.string.pref_category_timeprovider_config ); root.addPreference( categoryPref ); TimeProviderPreference pref = prefManager.getTimeProviderPreference(); // create text edit screen for list of NTP servers EditTextPreference editNTPProviders = new EditTextPreference( this ); editNTPProviders.setKey( pref.getProvidersPreference().getKey() ); editNTPProviders.setTitle( R.string.titel_timeprovider_edit ); editNTPProviders.setSummary( R.string.sum_timeprovider_edit ); editNTPProviders.setDefaultValue( pref.getProvidersEntryFromList( pref.getDefault().getProviders() ) ); categoryPref.addPreference( editNTPProviders ); // create list for error strategy selection CharSequence[] entries = getTimeProviderErrorStrategyEntries(); CharSequence[] values = entries; ListPreference listLevels = new ListPreference( this ); listLevels.setEntries( entries ); listLevels.setEntryValues( values ); listLevels.setDialogTitle( R.string.sum_sync_err_strategy_list ); listLevels.setKey( pref.getErrorStrategyPreference().getKey() ); listLevels.setTitle( R.string.titel_sync_err_strategy_list ); listLevels.setSummary( R.string.sum_sync_err_strategy_list ); listLevels.setDefaultValue( pref.getErrorStrategyPreference().getDefault().name() ); categoryPref.addPreference( listLevels ); } /** * Does create the logging preferences dynamically in the given root screen * * @param root * the root element to add preferences to * @param servicePrefs * the service preference to create from */ private void createLoggingPreferences( PreferenceScreen root, ServicePreferences servicePrefs ) { SinglePreference< LogLevelConfiguration > loglevelPref = prefManager.getLogLevelPreference(); // create category entry PreferenceCategory categoryPref = new PreferenceCategory( this ); categoryPref.setTitle( R.string.pref_category_logging_config ); root.addPreference( categoryPref ); // create list for log level selection CharSequence[] logLevelEntries = getLogLevelEntries(); CharSequence[] logLevelEntryValues = getLogLevelEntryValues(); ListPreference listLevels = new ListPreference( this ); listLevels.setEntries( logLevelEntries ); listLevels.setEntryValues( logLevelEntryValues ); listLevels.setDialogTitle( R.string.sum_service_loglevel_list ); listLevels.setKey( loglevelPref.getKey() ); listLevels.setTitle( R.string.titel_service_loglevel_list ); listLevels.setSummary( R.string.sum_service_loglevel_list ); listLevels.setDefaultValue( loglevelPref.getDefault().getLogLevel().toString() ); categoryPref.addPreference( listLevels ); TransmissionProtocolPreference logTransferPreference = servicePrefs.getLogTransferPreference(); // add a preference screen for host configuration PreferenceScreen hostPrefScreen = getPreferenceManager().createPreferenceScreen( this ); hostPrefScreen.setKey( getText( R.string.pref_key_host_config ).toString() ); hostPrefScreen.setTitle( getText( R.string.title_host_config ).toString() ); hostPrefScreen.setSummary( getText( R.string.sum_host_config ).toString() ); root.addPreference( hostPrefScreen ); categoryPref = new PreferenceCategory( this ); categoryPref.setTitle( R.string.pref_category_host_config ); hostPrefScreen.addPreference( categoryPref ); // create text edit screen for URL EditTextPreference editHostIP = new EditTextPreference( this ); editHostIP.setKey( logTransferPreference.getURLPreference().getKey() ); editHostIP.setTitle( R.string.titel_url_edit ); editHostIP.setSummary( R.string.sum_url_edit ); editHostIP.setDefaultValue( logTransferPreference.getDefault().getURL() ); categoryPref.addPreference( editHostIP ); // create text edit screen for authentication user name EditTextPreference editUserName = new EditTextPreference( this ); editUserName.setKey( logTransferPreference.getAuthenticationUserPreference().getKey() ); editUserName.setTitle( R.string.title_username_edit ); editUserName.setSummary( R.string.sum_username_edit ); editUserName.setDefaultValue( logTransferPreference.getDefault().getUserName() ); categoryPref.addPreference( editUserName ); // create text edit screen for authentication user password EditTextPreference editPassword = new EditTextPreference( this ); editPassword.setKey( logTransferPreference.getAuthenticationPasswordPreference().getKey() ); editPassword.setTitle( R.string.title_password_edit ); editPassword.setSummary( R.string.sum_password_edit ); editPassword.setDefaultValue( logTransferPreference.getDefault().getAuthPassword() ); categoryPref.addPreference( editPassword ); } /** * Does create the preferences related to the sampling task dynamically in the * given root screen * * @param root * the root element to add preferences to * @param servicePrefs * the service preference to create from */ private void createSamplingRelatedPreferences( PreferenceScreen root, ServicePreferences servicePrefs ) { PreferenceCategory categoryPref; // create category entry categoryPref = new PreferenceCategory( this ); categoryPref.setTitle( R.string.pref_category_sample_related_config ); root.addPreference( categoryPref ); // create check box for broadcast service enabled state CheckBoxPreference samplingEnabledCheckBox = new CheckBoxPreference( this ); samplingEnabledCheckBox.setKey( servicePrefs.getSamplingEnabledPreference().getKey() ); samplingEnabledCheckBox.setTitle( getText( R.string.titel_sampling_enabled_checkbox ) ); samplingEnabledCheckBox.setSummary( R.string.sum_sampling_enabled_checkbox ); samplingEnabledCheckBox.setDefaultValue( servicePrefs.getDefault().isSamplingEnabled() ); categoryPref.addPreference( samplingEnabledCheckBox ); // create check box for location fix per sample enabled flag CheckBoxPreference checkBox = new CheckBoxPreference( this ); checkBox.setKey( servicePrefs.getSampleLocationFixEnabledPreference().getKey() ); checkBox.setTitle( getText( R.string.titel_sample_loc_fix_enabled_checkbox ) ); checkBox.setSummary( R.string.sum_sample_loc_fix_enabled_checkbox ); checkBox.setDefaultValue( servicePrefs.getDefault().isAddingSampleLocation() ); categoryPref.addPreference( checkBox ); } /** * Does create the sample broadcast service preferences dynamically in the * given root screen * * @param root * the root element to add preferences to * @param servicePrefs * the service preference to create from */ private void createSampleBroadcastPreferences( PreferenceScreen root, ServicePreferences servicePrefs ) { PreferenceCategory categoryPref; // create category entry for broadcast settings categoryPref = new PreferenceCategory( this ); categoryPref.setTitle( R.string.pref_category_broadcast_config ); root.addPreference( categoryPref ); // create check box for broadcast service enabled state CheckBoxPreference broadcastCheckBox = new CheckBoxPreference( this ); broadcastCheckBox.setKey( servicePrefs.getSampleBroadcastsEnabledPreference().getKey() ); broadcastCheckBox.setTitle( getText( R.string.titel_broadcast_enabled_checkbox ) ); broadcastCheckBox.setSummary( R.string.sum_broadcast_enabled_checkbox ); broadcastCheckBox.setDefaultValue( servicePrefs.getDefault().isBroadcastingSamples() ); categoryPref.addPreference( broadcastCheckBox ); // create text edit screen for maximum database size EditTextPreference editFrequency = new EditTextPreference( this ); editFrequency.setKey( servicePrefs.getBroadcastFrequencyPreference().getKey() ); editFrequency.setTitle( R.string.title_broadcast_frequency_edit ); editFrequency.setSummary( R.string.sum_broadcast_frequency_edit ); editFrequency.getEditText().setKeyListener( DigitsKeyListener.getInstance() ); editFrequency.setDefaultValue( Long.toString( servicePrefs.getDefault().getBroadcastFrequency() ) ); categoryPref.addPreference( editFrequency ); } /** * Does create the transmission service preferences dynamically in the given * root screen * * @param root * the root element to add preferences to * @param servicePrefs * the service preference to create from */ private void createTransmissionPreferences( PreferenceScreen root, ServicePreferences servicePrefs ) { // create category entry PreferenceCategory categoryPref = new PreferenceCategory( this ); categoryPref.setTitle( R.string.pref_category_transfer_config ); root.addPreference( categoryPref ); // create check box for transfer service enabled state CheckBoxPreference transmissionCheckBox = new CheckBoxPreference( this ); transmissionCheckBox.setKey( servicePrefs.getTransmissionEnabledPreference().getKey() ); transmissionCheckBox.setTitle( getText( R.string.titel_transfer_enabled_checkbox ) ); transmissionCheckBox.setSummary( R.string.sum_transfer_enabled_checkbox ); transmissionCheckBox.setDefaultValue( servicePrefs.getDefault().isTransmittingSamples() ); categoryPref.addPreference( transmissionCheckBox ); // create preference screen for transfer setting PreferenceScreen transferPrefScreen = getPreferenceManager().createPreferenceScreen( this ); transferPrefScreen.setKey( getText( R.string.pref_key_transfer_config ).toString() ); transferPrefScreen.setTitle( getText( R.string.title_transfer_config ).toString() ); transferPrefScreen.setSummary( getText( R.string.sum_transfer_config ).toString() ); categoryPref.addPreference( transferPrefScreen ); TransmissionPreference transmissionPreference = servicePrefs.getTransmissionPreference(); categoryPref = new PreferenceCategory( this ); categoryPref.setTitle( R.string.pref_category_transmission_config ); transferPrefScreen.addPreference( categoryPref ); // add other configuration entries // create text edit screen for minimum samples to transfer EditTextPreference editMinSamples = new EditTextPreference( this ); editMinSamples.setKey( transmissionPreference.getMinSampleTransferCountPreference().getKey() ); editMinSamples.setTitle( R.string.titel_min_samples_to_transfer_edit ); editMinSamples.setSummary( R.string.sum_min_samples_to_transfer_edit ); editMinSamples.getEditText().setKeyListener( DigitsKeyListener.getInstance() ); editMinSamples.setDefaultValue( Integer.toString( transmissionPreference.getDefault().getMinSampleTransferCount() ) ); categoryPref.addPreference( editMinSamples ); // create text edit screen for maximum samples to transfer EditTextPreference editMaxSamples = new EditTextPreference( this ); editMaxSamples.setKey( transmissionPreference.getMaxSampleTransferCountPreference().getKey() ); editMaxSamples.setTitle( R.string.titel_max_samples_to_transfer_edit ); editMaxSamples.setSummary( R.string.sum_max_samples_to_transfer_edit ); editMaxSamples.getEditText().setKeyListener( DigitsKeyListener.getInstance() ); editMaxSamples.setDefaultValue( Integer.toString( transmissionPreference.getDefault().getMaxSampleTransferCount() ) ); categoryPref.addPreference( editMaxSamples ); // create text edit screen for transfer frequency minimum EditTextPreference editTransferFrequency = new EditTextPreference( this ); editTransferFrequency.setKey( transmissionPreference.getMinTransferFrequencyPreference().getKey() ); editTransferFrequency.setTitle( R.string.titel_min_transfer_frequency_edit ); editTransferFrequency.setSummary( R.string.sum_min_transfer_frequency_edit ); editTransferFrequency.getEditText().setKeyListener( DigitsKeyListener.getInstance() ); editTransferFrequency.setDefaultValue( Long.toString( transmissionPreference.getDefault().getMinTransferFrequency() ) ); categoryPref.addPreference( editTransferFrequency ); // create selection for archive type ListPreference listTypes = new ListPreference( this ); CharSequence[] entries = new CharSequence[ ArchiveTypes.values().length ]; int i = 0; for ( ArchiveTypes type : ArchiveTypes.values() ) { entries[ i++ ] = type.toString(); } listTypes.setEntries( entries ); listTypes.setEntryValues( entries ); listTypes.setDialogTitle( R.string.titel_archive_type_selection ); listTypes.setKey( transmissionPreference.getArchiveTypePreference().getKey() ); listTypes.setTitle( R.string.titel_archive_type_selection ); listTypes.setSummary( R.string.sum_archive_type_selection ); listTypes.setDefaultValue( transmissionPreference.getDefault().getArchiveType().toString() ); categoryPref.addPreference( listTypes ); // create check box for encryption of transfer archive CheckBoxPreference encryptionCheckBox = new CheckBoxPreference( this ); encryptionCheckBox.setKey( transmissionPreference.getEncryptionEnabledPreference().getKey() ); encryptionCheckBox.setTitle( getText( R.string.titel_encryption_enabled_checkbox ) ); encryptionCheckBox.setSummary( R.string.sum_encryption_enabled_checkbox ); encryptionCheckBox.setDefaultValue( transmissionPreference.getDefault().isEncryptionEnabled() ); categoryPref.addPreference( encryptionCheckBox ); // create selection for transfer strategy type ListPreference listStrategies = new ListPreference( this ); CharSequence[] strategyEntries = new CharSequence[ ConnectionStrategyDescription.values().length ]; i = 0; for ( ConnectionStrategyDescription strategy : ConnectionStrategyDescription.values() ) { strategyEntries[ i++ ] = strategy.toString(); } listStrategies.setEntries( strategyEntries ); listStrategies.setEntryValues( strategyEntries ); listStrategies.setDialogTitle( R.string.titel_transfer_strategy_selection ); listStrategies.setKey( transmissionPreference.getProtocolPreference().getTransmissionStrategyPreference().getKey() ); listStrategies.setTitle( R.string.titel_transfer_strategy_selection ); listStrategies.setSummary( R.string.sum_transfer_strategy_selection ); listStrategies.setDefaultValue( transmissionPreference.getDefault().getProtocolConfiguration().getTransmissionStrategy().toString() ); categoryPref.addPreference( listStrategies ); createHostConfiguration( root, transmissionPreference ); } /** * Does create the host preferences dynamically in the given root screen * * @param root * the root element to add preferences to * @param transmissionPreference * the transmission preference to create from */ private void createHostConfiguration( PreferenceScreen root, TransmissionPreference transmissionPreference ) { PreferenceCategory categoryPref; // add a preference screen for host configuration PreferenceScreen hostPrefScreen = getPreferenceManager().createPreferenceScreen( this ); hostPrefScreen.setKey( getText( R.string.pref_key_host_config ).toString() ); hostPrefScreen.setTitle( getText( R.string.title_host_config ).toString() ); hostPrefScreen.setSummary( getText( R.string.sum_host_config ).toString() ); root.addPreference( hostPrefScreen ); categoryPref = new PreferenceCategory( this ); categoryPref.setTitle( R.string.pref_category_host_config ); hostPrefScreen.addPreference( categoryPref ); // create text edit screen for URL EditTextPreference editHostIP = new EditTextPreference( this ); editHostIP.setKey( transmissionPreference.getProtocolPreference().getURLPreference().getKey() ); editHostIP.setTitle( R.string.titel_url_edit ); editHostIP.setSummary( R.string.sum_url_edit ); editHostIP.setDefaultValue( transmissionPreference.getProtocolPreference().getDefault().getURL() ); categoryPref.addPreference( editHostIP ); // create text edit screen for authentication user name EditTextPreference editUserName = new EditTextPreference( this ); editUserName.setKey( transmissionPreference.getProtocolPreference().getAuthenticationUserPreference().getKey() ); editUserName.setTitle( R.string.title_username_edit ); editUserName.setSummary( R.string.sum_username_edit ); editUserName.setDefaultValue( transmissionPreference.getProtocolPreference().getDefault().getUserName() ); categoryPref.addPreference( editUserName ); // create text edit screen for authentication user password EditTextPreference editPassword = new EditTextPreference( this ); editPassword.setKey( transmissionPreference.getProtocolPreference().getAuthenticationPasswordPreference().getKey() ); editPassword.setTitle( R.string.title_password_edit ); editPassword.setSummary( R.string.sum_password_edit ); editPassword.setDefaultValue( transmissionPreference.getProtocolPreference().getDefault().getAuthPassword() ); categoryPref.addPreference( editPassword ); } /** * Does create the persistent storage preferences dynamically in the given * root screen * * @param root * the root element to add preferences to * @param servicePrefs * the service preference to create from */ private void createPersistentStoragePreferences( PreferenceScreen root, ServicePreferences servicePrefs ) { // create category entry for database configurations PreferenceCategory categoryPref = new PreferenceCategory( this ); categoryPref.setTitle( R.string.pref_category_db_config ); root.addPreference( categoryPref ); // create check box for storage service enabled state CheckBoxPreference storageCheckBox = new CheckBoxPreference( this ); storageCheckBox.setKey( servicePrefs.getPersistentStorageEnabledPreference().getKey() ); storageCheckBox.setTitle( getText( R.string.titel_storage_enabled_checkbox ) ); storageCheckBox.setSummary( R.string.sum_storage_enabled_checkbox ); storageCheckBox.setDefaultValue( servicePrefs.getDefault().isStoringSamples() ); categoryPref.addPreference( storageCheckBox ); // create preference screen for db setting PreferenceScreen dbPrefScreen = getPreferenceManager().createPreferenceScreen( this ); dbPrefScreen.setKey( getText( R.string.pref_key_db_config ).toString() ); dbPrefScreen.setTitle( getText( R.string.title_db_config ).toString() ); dbPrefScreen.setSummary( getText( R.string.sum_db_config ).toString() ); categoryPref.addPreference( dbPrefScreen ); categoryPref = new PreferenceCategory( this ); categoryPref.setTitle( R.string.pref_category_db_size ); dbPrefScreen.addPreference( categoryPref ); // create text edit screen for maximum database size EditTextPreference editDBSizeText = new EditTextPreference( this ); editDBSizeText.setKey( servicePrefs.getDBMaxSizePreference().getKey() ); editDBSizeText.setTitle( R.string.titel_db_size_edit ); editDBSizeText.setSummary( R.string.sum_db_size_edit ); editDBSizeText.getEditText().setKeyListener( DigitsKeyListener.getInstance() ); editDBSizeText.setDefaultValue( Long.toString( servicePrefs.getDefault().getMaximumDatabaseSize() ) ); categoryPref.addPreference( editDBSizeText ); categoryPref = new PreferenceCategory( this ); categoryPref.setTitle( R.string.pref_category_db_full_strategy ); dbPrefScreen.addPreference( categoryPref ); // create selection for strategy configuration ListPreference listStrategies = new ListPreference( this ); CharSequence[] entries = new CharSequence[ DBFullStrategyDescription.values().length ]; int i = 0; for ( DBFullStrategyDescription strategy : DBFullStrategyDescription.values() ) { entries[ i++ ] = strategy.toString(); } listStrategies.setEntries( entries ); listStrategies.setEntryValues( entries ); listStrategies.setDialogTitle( R.string.titel_db_full_strategy_selection ); listStrategies.setKey( servicePrefs.getDbFullStrategyPreference().getKey() ); listStrategies.setTitle( R.string.titel_db_full_strategy_selection ); listStrategies.setSummary( R.string.sum_db_full_strategy_selection ); listStrategies.setDefaultValue( servicePrefs.getDefault().getDBFullStrategy().toString() ); categoryPref.addPreference( listStrategies ); // create text edit screen for wait time in case of database full EditTextPreference editWaittimeText = new EditTextPreference( this ); editWaittimeText.setKey( servicePrefs.getDbFullWaitTimePreference().getKey() ); editWaittimeText.setTitle( R.string.titel_db_full_waittime_edit ); editWaittimeText.setSummary( R.string.sum_db_full_waittime_edit ); editWaittimeText.getEditText().setKeyListener( DigitsKeyListener.getInstance() ); editWaittimeText.setDefaultValue( Long.toString( servicePrefs.getDefault().getDBFullWaitTime() ) ); categoryPref.addPreference( editWaittimeText ); // create check box for sample priority recognition CheckBoxPreference checkBoxDeletePrioBased = new CheckBoxPreference( this ); checkBoxDeletePrioBased.setKey( servicePrefs.getDbFullDeletionIsPriorityBasedPreference().getKey() ); checkBoxDeletePrioBased.setTitle( getText( R.string.titel_db_full_delete_prio_flag ) ); checkBoxDeletePrioBased.setSummary( R.string.sum_db_full_delete_prio_flag ); checkBoxDeletePrioBased.setDefaultValue( servicePrefs.getDefault().isDBFullDeletionPriorityBased() ); categoryPref.addPreference( checkBoxDeletePrioBased ); // create text edit screen for record count to delete EditTextPreference ediRecordCounttText = new EditTextPreference( this ); ediRecordCounttText.setKey( servicePrefs.getDbFullDeletionRecordCountPreference().getKey() ); ediRecordCounttText.setTitle( R.string.titel_db_full_recordcount_edit ); ediRecordCounttText.setSummary( R.string.sum_db_full_recordcount_edit ); ediRecordCounttText.getEditText().setKeyListener( DigitsKeyListener.getInstance() ); ediRecordCounttText.setDefaultValue( Integer.toString( servicePrefs.getDefault().getDBFullDeletionRecordCount() ) ); categoryPref.addPreference( ediRecordCounttText ); } /** * Does create the sensor devices preferences dynamically in the root screen * * @param root * the root element to add device preferences to */ private void createDevicePreferences( PreferenceScreen root ) { CharSequence[] sensorPriorityLevelEntries = getSensorPriorityLevelEntries(); CharSequence[] sensorPriorityLevelEntryValues = getSensorPriorityLevelEntryValues(); // create the preference screen for sensor device preferences PreferenceScreen sensorPrefScreen = getPreferenceManager().createPreferenceScreen( this ); sensorPrefScreen.setKey( getText( R.string.pref_key_sensor_config ).toString() ); sensorPrefScreen.setTitle( R.string.pref_category_sensor_config ); sensorPrefScreen.setSummary( R.string.sum_sensor_config ); root.addPreference( sensorPrefScreen ); // get a list of configured sensor devices and create the preference sub // screens requesting device preferences from the preference manager List< SensorDeviceIdentifier > availableSensorDevices = SensorDeviceAvailabilityTester.getInstance().getAvailableSensorDevices(); for ( SensorDeviceIdentifier id : availableSensorDevices ) { SensorDevicePreferences devicePreferences = prefManager.getPreferencesForDevice( id ); String deviceName = devicePreferences.getDeviceIdentifier().toString(); // create preference screen for current device PreferenceScreen prefScreen = getPreferenceManager().createPreferenceScreen( this ); prefScreen.setKey( devicePreferences.getKey() ); prefScreen.setTitle( deviceName ); prefScreen.setSummary( getText( R.string.sum_single_sensor_config ) + " " + deviceName ); sensorPrefScreen.addPreference( prefScreen ); // create category entry PreferenceCategory categoryPref = new PreferenceCategory( this ); categoryPref.setTitle( getText( R.string.pref_category_single_sensor_config ) + " " + deviceName ); prefScreen.addPreference( categoryPref ); // create check box for enabled state CheckBoxPreference enabledCheckBox = new CheckBoxPreference( this ); enabledCheckBox.setKey( devicePreferences.getEnabledPreference().getKey() ); enabledCheckBox.setTitle( getText( R.string.titel_sensor_enabled_checkbox ) + " " + deviceName ); enabledCheckBox.setSummary( R.string.sum_sensor_enabled_checkbox ); enabledCheckBox.setDefaultValue( devicePreferences.getDefault().isEnabled() ); categoryPref.addPreference( enabledCheckBox ); // create list for priority level of scan samples ListPreference listLevels = new ListPreference( this ); listLevels.setEntries( sensorPriorityLevelEntries ); listLevels.setEntryValues( sensorPriorityLevelEntryValues ); listLevels.setDialogTitle( R.string.sum_sensor_sample_prio_list ); listLevels.setKey( devicePreferences.getPriorityPreference().getKey() ); listLevels.setTitle( R.string.titel_sensor_sample_prio_list ); listLevels.setSummary( R.string.sum_sensor_sample_prio_list ); listLevels.setDefaultValue( Integer.toString( devicePreferences.getDefault().getSamplePriority().ordinal() ) ); categoryPref.addPreference( listLevels ); // create text edit for frequency EditTextPreference editFrequency = new EditTextPreference( this ); editFrequency.setKey( devicePreferences.getFrequencyPreference().getKey() ); editFrequency.setTitle( R.string.titel_sensor_frequency_edit ); editFrequency.setSummary( R.string.sum_sensor_frequency_edit ); editFrequency.getEditText().setKeyListener( DigitsKeyListener.getInstance() ); editFrequency.setDefaultValue( Integer.toString( devicePreferences.getDefault().getFrequency() ) ); categoryPref.addPreference( editFrequency ); } } /** * Does create the sensor priority level entries for the list box * * @return the sensor priority level entries for the list box */ private CharSequence[] getSensorPriorityLevelEntries() { CharSequence[] entries = new CharSequence[ SensorDevicePriorities.values().length ]; int i = 0; for ( SensorDevicePriorities prio : SensorDevicePriorities.values() ) { entries[ i ] = prio.toString(); i++; } return entries; } /** * Does create the sensor priority level entry values for the list box * * @return the sensor priority level entry values for the list box */ private CharSequence[] getSensorPriorityLevelEntryValues() { CharSequence[] entries = new CharSequence[ SensorDevicePriorities.values().length ]; int i = 0; for ( SensorDevicePriorities prio : SensorDevicePriorities.values() ) { entries[ i ] = "" + prio.ordinal(); i++; } return entries; } /** * Does create the time provider error strategy entries for the list box * * @return the time provider error strategy entries for the list box */ private CharSequence[] getTimeProviderErrorStrategyEntries() { CharSequence[] entries = new CharSequence[ TimeProviderErrorStrategyDescription.values().length ]; int i = 0; for ( TimeProviderErrorStrategyDescription value : TimeProviderErrorStrategyDescription.values() ) { entries[ i ] = value.toString(); i++; } return entries; } /** * Does create the log level entries for the list box * * @return the log level entries for the list box */ private CharSequence[] getLogLevelEntries() { CharSequence[] entries = new CharSequence[ LogLevel.values().length ]; int i = 0; for ( LogLevel level : LogLevel.values() ) { entries[ i ] = level.toString(); i++; } return entries; } /** * Does create the log level entry values for the list box * * @return the log level entry values for the list box */ private CharSequence[] getLogLevelEntryValues() { return getLogLevelEntries(); } }