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 | |
| parent | 02f47fa98536eb0ecd58cd8f063600ced60e0a8a (diff) | |
altosdroid: Add configurable frequency set
Signed-off-by: Keith Packard <keithp@keithp.com>
| -rw-r--r-- | altosdroid/AndroidManifest.xml.in | 7 | ||||
| -rw-r--r-- | altosdroid/res/layout/frequency.xml | 33 | ||||
| -rw-r--r-- | altosdroid/res/layout/manage_frequencies.xml | 96 | ||||
| -rw-r--r-- | altosdroid/res/layout/setup.xml | 5 | ||||
| -rw-r--r-- | altosdroid/res/values/strings.xml | 10 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java | 28 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java | 2 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/ManageFrequenciesActivity.java | 280 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/SetupActivity.java | 13 | ||||
| -rw-r--r-- | altoslib/AltosFrequency.java | 4 | 
10 files changed, 455 insertions, 23 deletions
| diff --git a/altosdroid/AndroidManifest.xml.in b/altosdroid/AndroidManifest.xml.in index 3409c9fe..2644d747 100644 --- a/altosdroid/AndroidManifest.xml.in +++ b/altosdroid/AndroidManifest.xml.in @@ -95,7 +95,12 @@  	<activity android:name=".SetupActivity"  		  android:label="@string/setup"                    android:theme="@android:style/Theme.Dialog" -                  android:configChanges="orientation|keyboardHidden" /> +                  android:configChanges="orientation" /> +		   +	<activity android:name=".ManageFrequenciesActivity" +		  android:label="@string/manage_frequencies" +                  android:theme="@android:style/Theme.Dialog" +                  android:configChanges="orientation|keyboard" />          <service android:name=".TelemetryService" /> diff --git a/altosdroid/res/layout/frequency.xml b/altosdroid/res/layout/frequency.xml new file mode 100644 index 00000000..7f8d4041 --- /dev/null +++ b/altosdroid/res/layout/frequency.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + + 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. + +--> +<LinearLayout +    xmlns:android="http://schemas.android.com/apk/res/android" +    android:layout_width="fill_parent" +    android:layout_height="fill_parent" +    android:orientation="horizontal" +    > +  <TextView +      android:id="@+id/frequency" +      android:layout_width="wrap_content" +      android:layout_height="fill_parent" +      android:padding="10dp" +      android:layout_weight="1" +      /> +</LinearLayout> diff --git a/altosdroid/res/layout/manage_frequencies.xml b/altosdroid/res/layout/manage_frequencies.xml new file mode 100644 index 00000000..77ded1d9 --- /dev/null +++ b/altosdroid/res/layout/manage_frequencies.xml @@ -0,0 +1,96 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + + 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. + +--> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" +    android:orientation="vertical" +    android:layout_width="match_parent" +    android:layout_height="match_parent" +    > + +    <LinearLayout +	xmlns:android="http://schemas.android.com/apk/res/android" +	android:id="@+id/set_layout" +	android:layout_width="fill_parent" +	android:layout_height="wrap_content" +	android:orientation="horizontal" +	> +      <EditText +	  android:id="@+id/set_frequency" +	  android:layout_width="wrap_content" +	  android:layout_height="fill_parent" +	  android:padding="10dp" +	  android:layout_weight="1" +	  android:hint="@string/frequency" +	  android:inputType="number|numberDecimal"/> +      /> +      <TextView +	  android:id="@+id/mhz" +	  android:layout_width="wrap_content" +	  android:layout_height="fill_parent" +	  android:padding="10dp" +	  android:layout_weight="0" +	  android:text="@string/mhz" +	  /> +      <EditText +	  android:id="@+id/set_description" +	  android:layout_width="wrap_content" +	  android:layout_height="fill_parent"   +	  android:padding="10dp" +	  android:layout_weight="2" +	  android:hint="@string/description" +	  /> +    </LinearLayout> +    <LinearLayout +	android:orientation="horizontal" +	android:layout_width="match_parent" +	android:layout_height="wrap_content" +	> +      <Button android:id="@+id/set" +              android:layout_width="wrap_content" +              android:layout_height="wrap_content" +              android:text="@string/set" +	      android:layout_weight="1" +	      /> +       +      <Button android:id="@+id/remove" +              android:layout_width="wrap_content" +              android:layout_height="wrap_content" +              android:text="@string/remove" +	      android:layout_weight="1" +	      /> +       +      <Button android:id="@+id/done" +              android:layout_width="wrap_content" +              android:layout_height="wrap_content" +              android:text="@string/done" +	      android:layout_weight="1" +	      /> +    </LinearLayout> + +    <ListView android:id="@+id/frequencies" +        android:layout_width="match_parent" +        android:layout_height="wrap_content" +        android:layout_weight="1" +	android:fadeScrollbars="false" +	android:scrollbars="vertical" +	android:choiceMode="singleChoice" +	/> + +     +</LinearLayout> diff --git a/altosdroid/res/layout/setup.xml b/altosdroid/res/layout/setup.xml index 73ba2ad1..630378a1 100644 --- a/altosdroid/res/layout/setup.xml +++ b/altosdroid/res/layout/setup.xml @@ -111,6 +111,11 @@            android:layout_height="wrap_content"  	  android:text="@string/preload_maps"  	  /> +  <Button android:id="@+id/manage_frequencies" +          android:layout_width="match_parent" +          android:layout_height="wrap_content" +	  android:text="@string/manage_frequencies" +	  />    <Button android:id="@+id/done"            android:layout_width="match_parent"            android:layout_height="wrap_content" diff --git a/altosdroid/res/values/strings.xml b/altosdroid/res/values/strings.xml index 7538f7b5..58057cac 100644 --- a/altosdroid/res/values/strings.xml +++ b/altosdroid/res/values/strings.xml @@ -133,6 +133,14 @@  	<string name="map_type">Map Type</string>  	<string name="map_source">Map Source</string>  	<string name="preload_maps">Preload Maps</string> -	<string name="done">Done</string> +	<string name="manage_frequencies">Manage Frequencies</string> +	<string name="done">OK</string> +	<!-- manage frequencies --> +	<string name="set">Set</string> +	<string name="mhz">MHz</string> +	<string name="remove">Remove</string> +	<string name="done">OK</string> +	<string name="frequency">Frequency</string> +	<string name="description">Description</string>  </resources> 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) { diff --git a/altoslib/AltosFrequency.java b/altoslib/AltosFrequency.java index 183d4551..80e0d724 100644 --- a/altoslib/AltosFrequency.java +++ b/altoslib/AltosFrequency.java @@ -44,6 +44,10 @@ public class AltosFrequency {  				     frequency, description);  	} +	public String frequency_string() { +		return String.format("%7.3f", frequency); +	} +  	public boolean close(double f) {  		double	diff = Math.abs(frequency - f); | 
