diff options
author | Keith Packard <keithp@keithp.com> | 2016-04-27 01:40:47 -0400 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2016-04-27 01:40:47 -0400 |
commit | 3c7b68b8a513b611500dfd734182e1a2e7bdd40c (patch) | |
tree | ab6a0512643d3704969216ccdb81f9a00872abff /altosdroid/src | |
parent | 02f47fa98536eb0ecd58cd8f063600ced60e0a8a (diff) |
altosdroid: Add configurable frequency set
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'altosdroid/src')
4 files changed, 302 insertions, 21 deletions
diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java index ea3bbae6..026e836d 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java @@ -109,9 +109,6 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, // field to display the version at the bottom of the screen private TextView mVersion; - private double frequency; - private int telemetry_rate; - private boolean idle_mode = false; public Location location = null; @@ -884,11 +881,8 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, } } - void setFrequency(String freq) { - try { - setFrequency (AltosParse.parse_double_net(freq.substring(11, 17))); - } catch (ParseException e) { - } + void setFrequency(AltosFrequency frequency) { + setFrequency (frequency.frequency); } void setBaud(int baud) { @@ -998,22 +992,14 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, case R.id.select_freq: // Set the TBT radio frequency - final String[] frequencies = { - "Channel 0 (434.550MHz)", - "Channel 1 (434.650MHz)", - "Channel 2 (434.750MHz)", - "Channel 3 (434.850MHz)", - "Channel 4 (434.950MHz)", - "Channel 5 (435.050MHz)", - "Channel 6 (435.150MHz)", - "Channel 7 (435.250MHz)", - "Channel 8 (435.350MHz)", - "Channel 9 (435.450MHz)" - }; + final AltosFrequency[] frequencies = AltosPreferences.common_frequencies(); + String[] frequency_strings = new String[frequencies.length]; + for (int i = 0; i < frequencies.length; i++) + frequency_strings[i] = frequencies[i].toString(); AlertDialog.Builder builder_freq = new AlertDialog.Builder(this); builder_freq.setTitle("Pick a frequency"); - builder_freq.setItems(frequencies, + builder_freq.setItems(frequency_strings, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { setFrequency(frequencies[item]); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java index fac523d1..c2db3774 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java @@ -53,6 +53,8 @@ public class AltosDroidPreferencesBackend implements AltosPreferencesBackend { } public AltosPreferencesBackend node(String key) { + if (!nodeExists(key)) + putBoolean(key, true); return new AltosDroidPreferencesBackend(context, key); } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/ManageFrequenciesActivity.java b/altosdroid/src/org/altusmetrum/AltosDroid/ManageFrequenciesActivity.java new file mode 100644 index 00000000..172c44fe --- /dev/null +++ b/altosdroid/src/org/altusmetrum/AltosDroid/ManageFrequenciesActivity.java @@ -0,0 +1,280 @@ +/* + * Copyright © 2016 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.AltosDroid; + +import java.lang.ref.WeakReference; +import java.util.*; +import java.text.*; +import org.altusmetrum.AltosDroid.R; + +import android.app.Activity; +import android.content.*; +import android.graphics.*; +import android.os.*; +import android.view.*; +import android.view.View.*; +import android.widget.*; +import android.widget.AdapterView.*; + +import org.altusmetrum.altoslib_10.*; + +class FrequencyItem { + public AltosFrequency frequency; + public LinearLayout frequency_view = null; + public TextView pretty_view = null; + + private void update() { + if (pretty_view != null && frequency != null) + pretty_view.setText(frequency.toString()); + } + + public void realize(LinearLayout frequency_view, + TextView pretty_view) { + if (frequency_view != this.frequency_view || + pretty_view != this.pretty_view) + { + this.frequency_view = frequency_view; + this.pretty_view = pretty_view; + update(); + } + } + + public void set_frequency(AltosFrequency frequency) { + this.frequency = frequency; + update(); + } + + public FrequencyItem(AltosFrequency frequency) { + this.frequency = frequency; + } +} + +class FrequencyAdapter extends ArrayAdapter<FrequencyItem> { + int resource; + int selected_item = -1; + + public FrequencyAdapter(Context context, int in_resource) { + super(context, in_resource); + resource = in_resource; + } + + public int count() { + int count; + + for (count = 0;; count++) { + try { + getItem(count); + } catch (IndexOutOfBoundsException ie) { + return count; + } + } + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + FrequencyItem item = getItem(position); + if (item.frequency_view == null) { + LinearLayout frequency_view = new LinearLayout(getContext()); + String inflater = Context.LAYOUT_INFLATER_SERVICE; + LayoutInflater li = (LayoutInflater) getContext().getSystemService(inflater); + li.inflate(resource, frequency_view, true); + + item.realize(frequency_view, + (TextView) frequency_view.findViewById(R.id.frequency)); + } + if (position == selected_item) + item.frequency_view.setBackgroundColor(Color.RED); + else + item.frequency_view.setBackgroundColor(Color.BLACK); + return item.frequency_view; + } +} + +public class ManageFrequenciesActivity extends Activity { + private ListView frequencies_view; + + private Button set; + private Button remove; + private Button done; + + private EditText set_frequency; + private EditText set_description; + + private HashMap<String,FrequencyItem> frequencies = new HashMap<String,FrequencyItem>();; + + private FrequencyAdapter frequencies_adapter; + + private boolean is_bound; + private boolean changed = false; + + private void done() { + + if (changed) { + AltosFrequency[] frequencies = new AltosFrequency[frequencies_adapter.count()]; + for (int i = 0; i < frequencies.length; i++) + frequencies[i] = frequencies_adapter.getItem(i).frequency; + AltosPreferences.set_common_frequencies(frequencies); + } + + Intent intent = new Intent(); + setResult(Activity.RESULT_OK, intent); + finish(); + } + + private void load_item() { + if (frequencies_adapter.selected_item >= 0) { + FrequencyItem item = frequencies_adapter.getItem(frequencies_adapter.selected_item); + + set_frequency.setText(item.frequency.frequency_string()); + set_description.setText(item.frequency.description); + } else { + set_frequency.setText(""); + set_description.setText(""); + } + } + + private void select_item(int position) { + if (position != frequencies_adapter.selected_item) { + if (frequencies_adapter.selected_item >= 0) + frequencies_view.setItemChecked(frequencies_adapter.selected_item, false); + if (position >= 0) + frequencies_view.setItemChecked(position, true); + frequencies_adapter.selected_item = position; + } else { + if (frequencies_adapter.selected_item >= 0) + frequencies_view.setItemChecked(frequencies_adapter.selected_item, false); + frequencies_adapter.selected_item = -1; + } + load_item(); + } + + private int insert_item(AltosFrequency frequency) { + FrequencyItem new_item = new FrequencyItem(frequency); + int pos; + for (pos = 0; pos < frequencies_adapter.getCount(); pos++) { + FrequencyItem item = frequencies_adapter.getItem(pos); + if (item.frequency.frequency == new_item.frequency.frequency) { + item.set_frequency(frequency); + return pos; + } + if (item.frequency.frequency > new_item.frequency.frequency) + break; + } + frequencies_adapter.insert(new_item, pos); + return pos; + } + + private class FrequencyItemClickListener implements ListView.OnItemClickListener { + @Override + public void onItemClick(AdapterView<?> av, View v, int position, long id) { + select_item(position); + } + } + + private void set() { + String frequency_text = set_frequency.getEditableText().toString(); + String description_text = set_description.getEditableText().toString(); + + try { + double f = AltosParse.parse_double_locale(frequency_text); + + int pos = insert_item(new AltosFrequency(f, description_text)); + frequencies_adapter.selected_item = -1; + select_item(pos); + changed = true; + } catch (ParseException pe) { + } + } + + private void remove() { + if (frequencies_adapter.selected_item >= 0) { + frequencies_adapter.remove(frequencies_adapter.getItem(frequencies_adapter.selected_item)); + select_item(-1); + frequencies_view.setAdapter(frequencies_adapter); + changed = true; + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Setup the window + requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); + setContentView(R.layout.manage_frequencies); + + frequencies_view = (ListView) findViewById(R.id.frequencies); + frequencies_view.setClickable(true); + + frequencies_adapter = new FrequencyAdapter(this, R.layout.frequency); + + frequencies_view.setAdapter(frequencies_adapter); + frequencies_view.setOnItemClickListener(new FrequencyItemClickListener()); + + AltosFrequency[] frequencies = AltosPreferences.common_frequencies(); + for (AltosFrequency frequency : frequencies) + insert_item(frequency); + + set_frequency = (EditText) findViewById(R.id.set_frequency); + set_description = (EditText) findViewById(R.id.set_description); + + set = (Button) findViewById(R.id.set); + set.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + set(); + } + }); + + remove = (Button) findViewById(R.id.remove); + remove.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + remove(); + } + }); + + done = (Button) findViewById(R.id.done); + done.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + done(); + } + }); + + // Set result CANCELED incase the user backs out + setResult(Activity.RESULT_CANCELED); + } + + @Override + protected void onStart() { + super.onStart(); + } + + @Override + protected void onResume() { + super.onResume(); + } + + @Override + protected void onPause() { + super.onPause(); + } + + @Override + protected void onStop() { + super.onStop(); + } +} diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/SetupActivity.java b/altosdroid/src/org/altusmetrum/AltosDroid/SetupActivity.java index ef802f0f..fdffc2b0 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/SetupActivity.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/SetupActivity.java @@ -37,6 +37,7 @@ public class SetupActivity extends Activity { private Spinner set_units; private Spinner map_type; private Spinner map_source; + private Button manage_frequencies; private Button preload_maps; private Button done; @@ -240,6 +241,11 @@ public class SetupActivity extends Activity { add_change(AltosDroid.SETUP_MAP_SOURCE); } + private void manage_frequencies(){ + Intent intent = new Intent(this, ManageFrequenciesActivity.class); + startActivity(intent); + } + private void preload_maps(){ Intent intent = new Intent(this, PreloadMapActivity.class); startActivity(intent); @@ -294,6 +300,13 @@ public class SetupActivity extends Activity { }); + manage_frequencies = (Button) findViewById(R.id.manage_frequencies); + manage_frequencies.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + manage_frequencies(); + } + }); + preload_maps = (Button) findViewById(R.id.preload_maps); preload_maps.setOnClickListener(new OnClickListener() { public void onClick(View v) { |