Switch from GPLv2 to GPLv2+
[fw/altos] / altosdroid / src / org / altusmetrum / AltosDroid / ManageFrequenciesActivity.java
1 /*
2  * Copyright © 2016 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17  */
18
19 package org.altusmetrum.AltosDroid;
20
21 import java.lang.ref.WeakReference;
22 import java.util.*;
23 import java.text.*;
24 import org.altusmetrum.AltosDroid.R;
25
26 import android.app.Activity;
27 import android.content.*;
28 import android.graphics.*;
29 import android.os.*;
30 import android.view.*;
31 import android.view.View.*;
32 import android.view.inputmethod.*;
33 import android.widget.*;
34 import android.widget.AdapterView.*;
35
36 import org.altusmetrum.altoslib_11.*;
37
38 class FrequencyItem {
39         public AltosFrequency frequency;
40         public LinearLayout frequency_view = null;
41         public TextView pretty_view = null;
42
43         private void update() {
44                 if (pretty_view != null && frequency != null)
45                         pretty_view.setText(frequency.toString());
46         }
47
48         public void realize(LinearLayout frequency_view,
49                             TextView pretty_view) {
50                 if (frequency_view != this.frequency_view ||
51                     pretty_view != this.pretty_view)
52                 {
53                         this.frequency_view = frequency_view;
54                         this.pretty_view = pretty_view;
55                         update();
56                 }
57         }
58
59         public void set_frequency(AltosFrequency frequency) {
60                 this.frequency = frequency;
61                 update();
62         }
63
64         public FrequencyItem(AltosFrequency frequency) {
65                 this.frequency = frequency;
66         }
67 }
68
69 class FrequencyAdapter extends ArrayAdapter<FrequencyItem> {
70         int resource;
71         int selected_item = -1;
72
73         public FrequencyAdapter(Context context, int in_resource) {
74                 super(context, in_resource);
75                 resource = in_resource;
76         }
77
78         public int count() {
79                 int     count;
80
81                 for (count = 0;; count++) {
82                         try {
83                                 getItem(count);
84                         } catch (IndexOutOfBoundsException ie) {
85                                 return count;
86                         }
87                 }
88         }
89
90         @Override
91         public View getView(int position, View convertView, ViewGroup parent) {
92                 FrequencyItem item = getItem(position);
93                 if (item.frequency_view == null) {
94                         LinearLayout frequency_view = new LinearLayout(getContext());
95                         String inflater = Context.LAYOUT_INFLATER_SERVICE;
96                         LayoutInflater li = (LayoutInflater) getContext().getSystemService(inflater);
97                         li.inflate(resource, frequency_view, true);
98
99                         item.realize(frequency_view,
100                                      (TextView) frequency_view.findViewById(R.id.frequency));
101                 }
102                 if (position == selected_item)
103                         item.frequency_view.setBackgroundColor(Color.RED);
104                 else
105                         item.frequency_view.setBackgroundColor(Color.BLACK);
106                 return item.frequency_view;
107         }
108 }
109
110 public class ManageFrequenciesActivity extends Activity {
111         private ListView frequencies_view;
112
113         private Button set;
114         private Button remove;
115         private Button done;
116
117         private EditText set_frequency;
118         private EditText set_description;
119
120         private HashMap<String,FrequencyItem> frequencies = new HashMap<String,FrequencyItem>();;
121
122         private FrequencyAdapter frequencies_adapter;
123
124         private boolean is_bound;
125         private boolean changed = false;
126
127         private void done() {
128
129                 set();
130
131                 if (changed) {
132                         AltosFrequency[] frequencies = new AltosFrequency[frequencies_adapter.count()];
133                         for (int i = 0; i < frequencies.length; i++)
134                                 frequencies[i] = frequencies_adapter.getItem(i).frequency;
135                         AltosPreferences.set_common_frequencies(frequencies);
136                 }
137
138                 Intent intent = new Intent();
139                 setResult(Activity.RESULT_OK, intent);
140                 finish();
141         }
142
143         private void load_item() {
144                 if (frequencies_adapter.selected_item >= 0) {
145                         FrequencyItem item = frequencies_adapter.getItem(frequencies_adapter.selected_item);
146
147                         set_frequency.setText(item.frequency.frequency_string());
148                         set_description.setText(item.frequency.description);
149                 } else {
150                         set_frequency.setText("");
151                         set_description.setText("");
152                 }
153         }
154
155         private void select_item(int position) {
156                 if (position != frequencies_adapter.selected_item) {
157                         if (frequencies_adapter.selected_item >= 0)
158                                 frequencies_view.setItemChecked(frequencies_adapter.selected_item, false);
159                         if (position >= 0)
160                                 frequencies_view.setItemChecked(position, true);
161                         frequencies_adapter.selected_item = position;
162                 } else {
163                         if (frequencies_adapter.selected_item >= 0)
164                                 frequencies_view.setItemChecked(frequencies_adapter.selected_item, false);
165                         frequencies_adapter.selected_item = -1;
166                 }
167                 load_item();
168         }
169
170         private int find(AltosFrequency frequency) {
171                 for (int pos = 0; pos < frequencies_adapter.getCount(); pos++) {
172                         FrequencyItem   item = frequencies_adapter.getItem(pos);
173                         if (item.frequency.frequency == frequency.frequency &&
174                             item.frequency.description.equals(frequency.description))
175                                 return pos;
176                 }
177                 return -1;
178         }
179
180         private int insert_item(AltosFrequency frequency) {
181                 FrequencyItem new_item = new FrequencyItem(frequency);
182                 int     pos;
183                 for (pos = 0; pos < frequencies_adapter.getCount(); pos++) {
184                         FrequencyItem   item = frequencies_adapter.getItem(pos);
185                         if (item.frequency.frequency == new_item.frequency.frequency) {
186                                 item.set_frequency(frequency);
187                                 return pos;
188                         }
189                         if (item.frequency.frequency > new_item.frequency.frequency)
190                                 break;
191                 }
192                 frequencies_adapter.insert(new_item, pos);
193                 return pos;
194         }
195
196         private class FrequencyItemClickListener implements ListView.OnItemClickListener {
197                 @Override
198                 public void onItemClick(AdapterView<?> av, View v, int position, long id) {
199                         select_item(position);
200                 }
201         }
202
203         private void hide_keyboard() {
204                 InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
205                 View view = getCurrentFocus();
206                 if (view != null)
207                         imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
208         }
209
210         private void set() {
211                 String  frequency_text = set_frequency.getEditableText().toString();
212                 String  description_text = set_description.getEditableText().toString();
213
214                 try {
215                         double  f = AltosParse.parse_double_locale(frequency_text);
216                         AltosFrequency frequency = new AltosFrequency(f, description_text);
217                         int pos;
218
219                         pos = find(frequency);
220                         if (pos < 0) {
221                                 pos = insert_item(frequency);
222                                 changed = true;
223                         }
224                         frequencies_adapter.selected_item = -1;
225                         select_item(pos);
226                 } catch (ParseException pe) {
227                 }
228                 hide_keyboard();
229         }
230
231         private void remove() {
232                 if (frequencies_adapter.selected_item >= 0) {
233                         frequencies_adapter.remove(frequencies_adapter.getItem(frequencies_adapter.selected_item));
234                         select_item(-1);
235                         frequencies_view.setAdapter(frequencies_adapter);
236                         changed = true;
237                 }
238         }
239
240         @Override
241         protected void onCreate(Bundle savedInstanceState) {
242                 super.onCreate(savedInstanceState);
243
244                 // Setup the window
245                 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
246                 setContentView(R.layout.manage_frequencies);
247
248                 frequencies_view = (ListView) findViewById(R.id.frequencies);
249                 frequencies_view.setClickable(true);
250
251                 frequencies_adapter = new FrequencyAdapter(this, R.layout.frequency);
252
253                 frequencies_view.setAdapter(frequencies_adapter);
254                 frequencies_view.setOnItemClickListener(new FrequencyItemClickListener());
255
256                 AltosFrequency[] frequencies = AltosPreferences.common_frequencies();
257                 for (AltosFrequency frequency : frequencies)
258                         insert_item(frequency);
259
260                 set_frequency = (EditText) findViewById(R.id.set_frequency);
261                 set_description = (EditText) findViewById(R.id.set_description);
262
263                 set = (Button) findViewById(R.id.set);
264                 set.setOnClickListener(new OnClickListener() {
265                                 public void onClick(View v) {
266                                         set();
267                                 }
268                         });
269
270                 remove = (Button) findViewById(R.id.remove);
271                 remove.setOnClickListener(new OnClickListener() {
272                                 public void onClick(View v) {
273                                         remove();
274                                 }
275                         });
276
277                 done = (Button) findViewById(R.id.done);
278                 done.setOnClickListener(new OnClickListener() {
279                                 public void onClick(View v) {
280                                         done();
281                                 }
282                         });
283
284                 // Set result CANCELED incase the user backs out
285                 setResult(Activity.RESULT_CANCELED);
286         }
287
288         @Override
289         protected void onStart() {
290                 super.onStart();
291         }
292
293         @Override
294         protected void onResume() {
295                 super.onResume();
296         }
297
298         @Override
299         protected void onPause() {
300                 super.onPause();
301         }
302
303         @Override
304         protected void onStop() {
305                 super.onStop();
306         }
307 }