All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.openxc.enabler.SettingsActivity Maven / Gradle / Ivy

package com.openxc.enabler;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;

import android.annotation.TargetApi;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Build;
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.PreferenceFragment;
import android.preference.PreferenceManager;
import android.util.Log;
import android.widget.Toast;

import com.openxc.enabler.preferences.BluetoothPreferenceManager;
import com.openxc.sinks.UploaderSink;

/**
 * Initialize and display all preferences for the OpenXC Enabler application.
 *
 * In order to select a trace file to use as a data source, the device must have
 * a file manager application installed that responds to the GET_CONTENT intent,
 * e.g. OI File Manager.
 */
@TargetApi(12)
public class SettingsActivity extends PreferenceActivity {
    private static String TAG = "SettingsActivity";
    private final static String RECORDING_PREFERENCE =
            "com.openxc.enabler.preferences.RECORDING";
    private final static String DATA_SOURCE_PREFERENCE =
            "com.openxc.enabler.preferences.DATA_SOURCE";
    private final static String OUTPUT_PREFERENCE =
            "com.openxc.enabler.preferences.OUTPUT";
    private final static String ABOUT_PREFERENCE =
            "com.openxc.enabler.preferences.ABOUT";
    private final static int FILE_SELECTOR_RESULT = 100;

    private BluetoothAdapter mBluetoothAdapter;
    private ListPreference mBluetoothDeviceListPreference;
    private CheckBoxPreference mUploadingPreference;
    private Preference mTraceFilePreference;
    private CheckBoxPreference mTraceEnabledPreference;
    private CheckBoxPreference mNetworkSourcePreference;
    private EditTextPreference mNetworkHostPreference;
    private EditTextPreference mNetworkPortPreference;
    private Preference mAboutVersionPreference;
    private BroadcastReceiver mReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initializeLegacyLayout();
    }

    protected boolean isValidFragment(String fragmentName){
        if(RecordingPreferences.class.getName().equals(fragmentName)){
            return true;
        } else if(OutputPreferences.class.getName().equals(fragmentName)){
            return true;
        } else if(DataSourcePreferences.class.getName().equals(fragmentName)){
            return true;
        } else if(AboutPreferences.class.getName().equals(fragmentName)){
            return true;
        }
        return false;
    }

    @SuppressWarnings("deprecation")
    private void initializeLegacyLayout() {
        String action = getIntent().getAction();
        if(action != null) {
            if(action.equals(RECORDING_PREFERENCE)) {
                addPreferencesFromResource(R.xml.recording_preferences);

                initializeUploadingPreferences(
                    findPreference(getString(R.string.uploading_checkbox_key)),
                    findPreference(getString(R.string.uploading_path_key)));

            } else if(action.equals(DATA_SOURCE_PREFERENCE)) {
                addPreferencesFromResource(R.xml.data_source_preferences);

                initializeBluetoothPreferences(
                    findPreference(getString(R.string.bluetooth_mac_key)),
                    findPreference(getString(R.string.bluetooth_checkbox_key)));

                initializeNetwork(
                    findPreference(getString(R.string.network_host_key)),
                    findPreference(getString(R.string.network_port_key)),
                    findPreference(getString(R.string.network_checkbox_key)));

                initializeTracePreferences(
                    findPreference(getString(R.string.trace_source_checkbox_key)),
                    findPreference(getString(R.string.trace_source_file_key)));
            } else if(action.equals(OUTPUT_PREFERENCE)) {
                addPreferencesFromResource(R.xml.output_preferences);
            } else if(action.equals(ABOUT_PREFERENCE)) {
                addPreferencesFromResource(R.xml.about_preferences);

                initializeAboutPreferences(
                    findPreference(getString(R.string.application_version_key)));
            }
        } else if(Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
            addPreferencesFromResource(R.xml.preference_headers_legacy);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == FILE_SELECTOR_RESULT && resultCode == RESULT_OK) {
            String newValue = data.getData().getPath();
            SharedPreferences.Editor editor =
                    PreferenceManager.getDefaultSharedPreferences(this).edit();
            editor.putString(getString(R.string.trace_source_file_key), newValue);
            editor.commit();

            updateSummary(mTraceFilePreference, newValue);
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if(mReceiver != null) {
            unregisterReceiver(mReceiver);
            if(mBluetoothAdapter != null) {
                mBluetoothAdapter.cancelDiscovery();
            }
        }
    }

    @Override
    public void onBuildHeaders(List
target) { loadHeadersFromResource(R.xml.preference_headers, target); } public static class RecordingPreferences extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.recording_preferences); ((SettingsActivity)getActivity()).initializeUploadingPreferences( findPreference(getString(R.string.uploading_checkbox_key)), findPreference(getString(R.string.uploading_path_key))); } } public static class OutputPreferences extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.output_preferences); } } public static class DataSourcePreferences extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.data_source_preferences); ((SettingsActivity)getActivity()).initializeBluetoothPreferences( findPreference(getString(R.string.bluetooth_mac_key)), findPreference(getString(R.string.bluetooth_checkbox_key))); ((SettingsActivity) getActivity()).initializeNetwork( findPreference(getString(R.string.network_host_key)), findPreference(getString(R.string.network_port_key)), findPreference(getString(R.string.network_checkbox_key))); ((SettingsActivity)getActivity()).initializeTracePreferences( findPreference(getString(R.string.trace_source_checkbox_key)), findPreference(getString(R.string.trace_source_file_key))); } } public static class AboutPreferences extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.about_preferences); ((SettingsActivity)getActivity()).initializeAboutPreferences( findPreference(getString(R.string.application_version_key))); } } protected void initializeTracePreferences(Preference traceEnabledPreference, Preference traceFilePreference) { mTraceEnabledPreference = (CheckBoxPreference) traceEnabledPreference; mTraceFilePreference = traceFilePreference; mTraceFilePreference.setOnPreferenceClickListener( mTraceFileClickListener); mTraceFilePreference.setOnPreferenceChangeListener( mUpdateSummaryListener); mTraceEnabledPreference.setOnPreferenceChangeListener( mTraceCheckboxListener); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); mTraceFilePreference.setEnabled(preferences.getBoolean( getString(R.string.trace_source_checkbox_key), false)); updateSummary(mTraceFilePreference, preferences.getString( getString(R.string.trace_source_file_key), null)); } protected void initializeUploadingPreferences( Preference uploadingPreference, Preference uploadingPathPreference) { mUploadingPreference = (CheckBoxPreference) uploadingPreference; uploadingPathPreference.setOnPreferenceChangeListener( mUploadingPathPreferenceListener); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); updateSummary(uploadingPathPreference, preferences.getString( getString(R.string.uploading_path_key), null)); } protected void updateSummary(Preference preference, Object currentValue) { String summary = null; if(currentValue != null) { summary = currentValue.toString(); } else { summary = "No value set"; } preference.setSummary(summary); } protected void initializeBluetoothPreferences(Preference listPreference, Preference checkboxPreference) { mBluetoothDeviceListPreference = (ListPreference) listPreference; mBluetoothDeviceListPreference.setOnPreferenceChangeListener( mUpdateSummaryListener); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if(mBluetoothAdapter == null) { String message = "This device most likely does not have " + "a Bluetooth adapter -- skipping device search"; Log.w(TAG, message); } fillBluetoothDeviceList(mBluetoothDeviceListPreference); checkboxPreference.setOnPreferenceChangeListener( mBluetoothCheckboxListener); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); mBluetoothDeviceListPreference.setEnabled(preferences.getBoolean( getString(R.string.bluetooth_checkbox_key), false)); updateSummary(mBluetoothDeviceListPreference, preferences.getString(getString( R.string.bluetooth_mac_key), null)); } protected void initializeNetwork(Preference hostPreference, Preference portPreference, Preference checkboxPreference) { mNetworkSourcePreference = (CheckBoxPreference) checkboxPreference; mNetworkSourcePreference.setOnPreferenceChangeListener( mNetworkCheckboxListener); mNetworkHostPreference = (EditTextPreference) hostPreference; mNetworkHostPreference.setOnPreferenceChangeListener( mUpdateSummaryListener); mNetworkPortPreference = (EditTextPreference) portPreference; mNetworkPortPreference.setOnPreferenceChangeListener( mUpdateSummaryListener); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); mNetworkHostPreference.setEnabled(preferences.getBoolean( getString(R.string.network_checkbox_key), false)); mNetworkPortPreference.setEnabled(preferences.getBoolean( getString(R.string.network_checkbox_key), false)); updateSummary(mNetworkHostPreference, preferences.getString(getString( R.string.network_host_key), null)); updateSummary(mNetworkPortPreference, preferences.getString(getString( R.string.network_port_key), null)); } protected void initializeAboutPreferences( Preference aboutVersionPreference) { try { mAboutVersionPreference = aboutVersionPreference; String versionNumber = getPackageManager().getPackageInfo( getPackageName(), 0).versionName; updateSummary(mAboutVersionPreference, versionNumber); } catch (NameNotFoundException e) { Log.e(TAG, "Could not get application version.", e); } } private void fillBluetoothDeviceList(final ListPreference preference) { ArrayList entries = new ArrayList(); ArrayList values = new ArrayList(); entries.add("Automatically connect to paired OpenXC-VI device"); values.add(BluetoothPreferenceManager.AUTO_DEVICE_SELECTION_ENTRY); if(mBluetoothAdapter != null) { Log.d(TAG, "Starting paired device search"); Set pairedDevices = mBluetoothAdapter.getBondedDevices(); for(BluetoothDevice device : pairedDevices) { Log.d(TAG, "Found paired device: " + device); entries.add(device.getName() + " (" + device.getAddress() + ")"); values.add(device.getAddress()); } } CharSequence[] prototype = {}; preference.setEntries(entries.toArray(prototype)); preference.setEntryValues(values.toArray(prototype)); mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { if(BluetoothDevice.ACTION_FOUND.equals(intent.getAction())) { BluetoothDevice device = intent.getParcelableExtra( BluetoothDevice.EXTRA_DEVICE); if(device.getBondState() != BluetoothDevice.BOND_BONDED) { List entries = new ArrayList( Arrays.asList(preference.getEntries())); List values = new ArrayList( Arrays.asList(preference.getEntryValues())); entries.add(device.getName() + " (" + device.getAddress() + ")"); values.add(device.getAddress()); CharSequence[] prototype = {}; preference.setEntries(entries.toArray(prototype)); preference.setEntryValues(values.toArray(prototype)); } } } }; IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(mReceiver, filter); if(mBluetoothAdapter != null) { if(mBluetoothAdapter.isDiscovering()) { mBluetoothAdapter.cancelDiscovery(); } mBluetoothAdapter.startDiscovery(); } } private OnPreferenceChangeListener mNetworkCheckboxListener = new OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { mNetworkHostPreference.setEnabled((Boolean)newValue); mNetworkPortPreference.setEnabled((Boolean)newValue); return true; } }; private OnPreferenceChangeListener mUpdateSummaryListener = new OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { updateSummary(preference, newValue); return true; } }; private OnPreferenceChangeListener mBluetoothCheckboxListener = new OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { mBluetoothDeviceListPreference.setEnabled((Boolean)newValue); return true; } }; private OnPreferenceChangeListener mUploadingPathPreferenceListener = new OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { String path = (String) newValue; if(!UploaderSink.validatePath(path)) { String error = "Invalid target URL \"" + path + "\" -- must be an absolute URL " + "with http:// prefix"; Toast.makeText(getApplicationContext(), error, Toast.LENGTH_SHORT).show(); Log.w(TAG, error); mUploadingPreference.setChecked(false); } updateSummary(preference, newValue); return true; } }; private OnPreferenceChangeListener mTraceCheckboxListener = new OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { mTraceFilePreference.setEnabled((Boolean)newValue); return true; } }; private Preference.OnPreferenceClickListener mTraceFileClickListener = new Preference.OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("*/*"); startActivityForResult(intent, FILE_SELECTOR_RESULT); return true; } }; }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy