X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosdroid%2Fapp%2Fsrc%2Fmain%2Fjava%2Forg%2Faltusmetrum%2FAltosDroid%2FManageFrequenciesActivity.java;fp=altosdroid%2Fapp%2Fsrc%2Fmain%2Fjava%2Forg%2Faltusmetrum%2FAltosDroid%2FManageFrequenciesActivity.java;h=d5101166e9524d6a512e09f17f63bf802d477ad5;hp=0000000000000000000000000000000000000000;hb=8b53f860eb3171cd43e4bd0e440f2889bd810662;hpb=4a257455b2dc57069c41e1845daf66239c5cbe1d diff --git a/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/ManageFrequenciesActivity.java b/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/ManageFrequenciesActivity.java new file mode 100644 index 00000000..d5101166 --- /dev/null +++ b/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/ManageFrequenciesActivity.java @@ -0,0 +1,307 @@ +/* + * Copyright © 2016 Keith Packard + * + * 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; either version 2 of the License, or + * (at your option) any later version. + * + * 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.view.inputmethod.*; +import android.widget.*; +import android.widget.AdapterView.*; + +import org.altusmetrum.altoslib_13.*; + +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 { + 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 frequencies = new HashMap();; + + private FrequencyAdapter frequencies_adapter; + + private boolean is_bound; + private boolean changed = false; + + private void done() { + + set(); + + 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 find(AltosFrequency frequency) { + for (int pos = 0; pos < frequencies_adapter.getCount(); pos++) { + FrequencyItem item = frequencies_adapter.getItem(pos); + if (item.frequency.frequency == frequency.frequency && + item.frequency.description.equals(frequency.description)) + return pos; + } + return -1; + } + + 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 hide_keyboard() { + InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); + View view = getCurrentFocus(); + if (view != null) + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + + 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); + AltosFrequency frequency = new AltosFrequency(f, description_text); + int pos; + + pos = find(frequency); + if (pos < 0) { + pos = insert_item(frequency); + changed = true; + } + frequencies_adapter.selected_item = -1; + select_item(pos); + } catch (ParseException pe) { + } + hide_keyboard(); + } + + 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(); + } +}