package de.tu.darmstadt.seemoo.ansian.gui.fragments.settings; import java.io.File; import android.app.Dialog; import android.content.ActivityNotFoundException; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.preference.EditTextPreference; import android.preference.Preference; import android.widget.Toast; import de.tu.darmstadt.seemoo.ansian.model.preferences.Preferences; import de.tu.darmstadt.seemoo.ansian.tools.FileUtils; /** * Fragment for miscellaneous preferences as source, frequency and FFT settings * */ public class MiscFragment extends MyPreferenceFragment { public MiscFragment() { super(Preferences.MISC_PREFERENCE); } private static final int FILESOURCE_RESULT_CODE = 1; @SuppressWarnings("unused") private static final String LOGTAG = "MiscFragment"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Add click listener to preferences which use external apps: Preference pref = findPreference("filesource_file_name"); pref.setOnPreferenceClickListener(this); } @Override public boolean onPreferenceClick(Preference preference) { super.onPreferenceClick(preference); // FileSource file: if (preference.getKey().equals("filesource_file_name")) { try { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("*/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(Intent.createChooser(intent, "Select a file (8-bit complex IQ samples)"), FILESOURCE_RESULT_CODE); // No error so far... let's dismiss the text input dialog: Dialog dialog = ((EditTextPreference) preference).getDialog(); if (dialog != null) dialog.dismiss(); return true; } catch (ActivityNotFoundException e) { Toast.makeText(MiscFragment.this.getActivity(), "No file browser is installed!", Toast.LENGTH_LONG) .show(); // Note that there is still the text dialog visible for the user // to input a file path... so no more error handling necessary } return false; } // Show Log: else if (preference.getKey().equals("show_log")) { try { String logfile = ((EditTextPreference) findPreference("logfile")).getText(); Uri uri = Uri.fromFile(new File(logfile)); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, "text/plain"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); this.startActivity(intent); return true; } catch (ActivityNotFoundException e) { Toast.makeText(MiscFragment.this.getActivity(), "No text viewer is installed!", Toast.LENGTH_LONG) .show(); } return false; } return false; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (data != null) { switch (requestCode) { case FILESOURCE_RESULT_CODE: Uri uri = data.getData(); if (uri != null) { String filepath = FileUtils.getPath(getActivity(), uri); if (filepath != null) { ((EditTextPreference) findPreference("filesource_file_name")).setText(filepath); updateFileSourcePrefs(filepath); } else { Toast.makeText(MiscFragment.this.getActivity(), "Can't resolve file path from: " + uri.toString(), Toast.LENGTH_LONG).show(); } } break; default: } } super.onActivityResult(requestCode, resultCode, data); } private void updateFileSourcePrefs(String filename) { // Format. Search for strings like hackrf, rtl-sdr, ... if (filename.matches(".*hackrf.*") || filename.matches(".*HackRF.*") || filename.matches(".*HACKRF.*") || filename.matches(".*hackrfone.*")) Preferences.MISC_PREFERENCE.setSourceFileFormat(0); if (filename.matches(".*rtlsdr.*") || filename.matches(".*rtl-sdr.*") || filename.matches(".*RTLSDR.*") || filename.matches(".*RTL-SDR.*")) Preferences.MISC_PREFERENCE.setSourceFileFormat(1); // Sampe Rate. Search for pattern XXXXXXXSps if (filename.matches(".*(_|-|\\s)([0-9]+)(sps|Sps|SPS).*")) Preferences.MISC_PREFERENCE.setFileSourceSampleRate( Integer.valueOf(filename.replaceFirst(".*(_|-|\\s)([0-9]+)(sps|Sps|SPS).*", "$2"))); if (filename.matches(".*(_|-|\\s)([0-9]+)(msps|Msps|MSps|MSPS).*")) Preferences.MISC_PREFERENCE.setSampleRate( Integer.valueOf(filename.replaceFirst(".*(_|-|\\s)([0-9]+)(msps|Msps|MSps|MSPS).*", "$2")) * 1000000); // Frequency. Search for pattern XXXXXXXHz if (filename.matches(".*(_|-|\\s)([0-9]+)(hz|Hz|HZ).*")) Preferences.MISC_PREFERENCE.setFileSourceFrequency( Integer.valueOf(filename.replaceFirst(".*(_|-|\\s)([0-9]+)(hz|Hz|HZ).*", "$2"))); if (filename.matches(".*(_|-|\\s)([0-9]+)(mhz|Mhz|MHz|MHZ).*")) Preferences.MISC_PREFERENCE.setFileSourceFrequency( Integer.valueOf(filename.replaceFirst(".*(_|-|\\s)([0-9]+)(mhz|Mhz|MHz|MHZ).*", "$2")) * 1000000); Preferences.MISC_PREFERENCE.savePreference(); } }