dd7dc9670c9f1b43d5875e97643db2dce3ad9a86
[fw/altos] / altosdroid / app / src / main / java / 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.util.*;
22 import java.text.*;
23
24 import android.app.Activity;
25 import android.content.*;
26 import android.graphics.*;
27 import android.os.*;
28 import android.view.*;
29 import android.view.View.*;
30 import android.view.inputmethod.*;
31 import android.widget.*;
32
33 import org.altusmetrum.altoslib_13.*;
34
35 class FrequencyItem {
36         public AltosFrequency frequency;
37         public LinearLayout frequency_view = null;
38         public TextView pretty_view = null;
39
40         private void update() {
41                 if (pretty_view != null && frequency != null)
42                         pretty_view.setText(frequency.toString());
43         }
44
45         public void realize(LinearLayout frequency_view,
46                             TextView pretty_view) {
47                 if (frequency_view != this.frequency_view ||
48                     pretty_view != this.pretty_view)
49                 {
50                         this.frequency_view = frequency_view;
51                         this.pretty_view = pretty_view;
52                         update();
53                 }
54         }
55
56         public void set_frequency(AltosFrequency frequency) {
57                 this.frequency = frequency;
58                 update();
59         }
60
61         public FrequencyItem(AltosFrequency frequency) {
62                 this.frequency = frequency;
63         }
64 }
65
66 class FrequencyAdapter extends ArrayAdapter<FrequencyItem> {
67         int resource;
68         int selected_item = -1;
69
70         public FrequencyAdapter(Context context, int in_resource) {
71                 super(context, in_resource);
72                 resource = in_resource;
73         }
74
75         public int count() {
76                 int     count;
77
78                 for (count = 0;; count++) {
79                         try {
80                                 getItem(count);
81                         } catch (IndexOutOfBoundsException ie) {
82                                 return count;
83                         }
84                 }
85         }
86
87         @Override
88         public View getView(int position, View convertView, ViewGroup parent) {
89                 FrequencyItem item = getItem(position);
90                 if (item.frequency_view == null) {
91                         LinearLayout frequency_view = new LinearLayout(getContext());
92                         String inflater = Context.LAYOUT_INFLATER_SERVICE;
93                         LayoutInflater li = (LayoutInflater) getContext().getSystemService(inflater);
94                         li.inflate(resource, frequency_view, true);
95
96                         item.realize(frequency_view,
97                                      (TextView) frequency_view.findViewById(R.id.frequency));
98                 }
99                 if (position == selected_item)
100                         item.frequency_view.setBackgroundColor(Color.RED);
101                 else
102                         item.frequency_view.setBackgroundColor(Color.BLACK);
103                 return item.frequency_view;
104         }
105 }
106
107 public class ManageFrequenciesActivity extends Activity {
108         private ListView frequencies_view;
109
110         private Button set;
111         private Button remove;
112         private Button done;
113
114         private EditText set_frequency;
115         private EditText set_description;
116
117         private HashMap<String,FrequencyItem> frequencies = new HashMap<String,FrequencyItem>();;
118
119         private FrequencyAdapter frequencies_adapter;
120
121         private boolean is_bound;
122         private boolean changed = false;
123
124         private void done() {
125
126                 set();
127
128                 if (changed) {
129                         AltosFrequency[] frequencies = new AltosFrequency[frequencies_adapter.count()];
130                         for (int i = 0; i < frequencies.length; i++)
131                                 frequencies[i] = frequencies_adapter.getItem(i).frequency;
132                         AltosPreferences.set_common_frequencies(frequencies);
133                 }
134
135                 Intent intent = new Intent();
136                 setResult(Activity.RESULT_OK, intent);
137                 finish();
138         }
139
140         private void load_item() {
141                 if (frequencies_adapter.selected_item >= 0) {
142                         FrequencyItem item = frequencies_adapter.getItem(frequencies_adapter.selected_item);
143
144                         set_frequency.setText(item.frequency.frequency_string());
145                         set_description.setText(item.frequency.description);
146                 } else {
147                         set_frequency.setText("");
148                         set_description.setText("");
149                 }
150         }
151
152         private void select_item(int position) {
153                 if (position != frequencies_adapter.selected_item) {
154                         if (frequencies_adapter.selected_item >= 0)
155                                 frequencies_view.setItemChecked(frequencies_adapter.selected_item, false);
156                         if (position >= 0)
157                                 frequencies_view.setItemChecked(position, true);
158                         frequencies_adapter.selected_item = position;
159                 } else {
160                         if (frequencies_adapter.selected_item >= 0)
161                                 frequencies_view.setItemChecked(frequencies_adapter.selected_item, false);
162                         frequencies_adapter.selected_item = -1;
163                 }
164                 load_item();
165         }
166
167         private int find(AltosFrequency frequency) {
168                 for (int pos = 0; pos < frequencies_adapter.getCount(); pos++) {
169                         FrequencyItem   item = frequencies_adapter.getItem(pos);
170                         if (item.frequency.frequency == frequency.frequency &&
171                             item.frequency.description.equals(frequency.description))
172                                 return pos;
173                 }
174                 return -1;
175         }
176
177         private int insert_item(AltosFrequency frequency) {
178                 FrequencyItem new_item = new FrequencyItem(frequency);
179                 int     pos;
180                 for (pos = 0; pos < frequencies_adapter.getCount(); pos++) {
181                         FrequencyItem   item = frequencies_adapter.getItem(pos);
182                         if (item.frequency.frequency == new_item.frequency.frequency) {
183                                 item.set_frequency(frequency);
184                                 return pos;
185                         }
186                         if (item.frequency.frequency > new_item.frequency.frequency)
187                                 break;
188                 }
189                 frequencies_adapter.insert(new_item, pos);
190                 return pos;
191         }
192
193         private class FrequencyItemClickListener implements ListView.OnItemClickListener {
194                 @Override
195                 public void onItemClick(AdapterView<?> av, View v, int position, long id) {
196                         select_item(position);
197                 }
198         }
199
200         private void hide_keyboard() {
201                 InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
202                 View view = getCurrentFocus();
203                 if (view != null)
204                         imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
205         }
206
207         private void set() {
208                 String  frequency_text = set_frequency.getEditableText().toString();
209                 String  description_text = set_description.getEditableText().toString();
210
211                 try {
212                         double  f = AltosParse.parse_double_locale(frequency_text);
213                         AltosFrequency frequency = new AltosFrequency(f, description_text);
214                         int pos;
215
216                         pos = find(frequency);
217                         if (pos < 0) {
218                                 pos = insert_item(frequency);
219                                 changed = true;
220                         }
221                         frequencies_adapter.selected_item = -1;
222                         select_item(pos);
223                 } catch (ParseException pe) {
224                 }
225                 hide_keyboard();
226         }
227
228         private void remove() {
229                 if (frequencies_adapter.selected_item >= 0) {
230                         frequencies_adapter.remove(frequencies_adapter.getItem(frequencies_adapter.selected_item));
231                         select_item(-1);
232                         frequencies_view.setAdapter(frequencies_adapter);
233                         changed = true;
234                 }
235         }
236
237         @Override
238         protected void onCreate(Bundle savedInstanceState) {
239                 setTheme(AltosDroid.dialog_themes[AltosDroidPreferences.font_size()]);
240                 super.onCreate(savedInstanceState);
241
242                 // Setup the window
243                 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
244                 setContentView(R.layout.manage_frequencies);
245
246                 frequencies_view = (ListView) findViewById(R.id.frequencies);
247                 frequencies_view.setClickable(true);
248
249                 frequencies_adapter = new FrequencyAdapter(this, R.layout.frequency);
250
251                 frequencies_view.setAdapter(frequencies_adapter);
252                 frequencies_view.setOnItemClickListener(new FrequencyItemClickListener());
253
254                 AltosFrequency[] frequencies = AltosPreferences.common_frequencies();
255                 for (AltosFrequency frequency : frequencies)
256                         insert_item(frequency);
257
258                 set_frequency = (EditText) findViewById(R.id.set_frequency);
259                 set_description = (EditText) findViewById(R.id.set_description);
260
261                 set = (Button) findViewById(R.id.set);
262                 set.setOnClickListener(new OnClickListener() {
263                                 public void onClick(View v) {
264                                         set();
265                                 }
266                         });
267
268                 remove = (Button) findViewById(R.id.remove);
269                 remove.setOnClickListener(new OnClickListener() {
270                                 public void onClick(View v) {
271                                         remove();
272                                 }
273                         });
274
275                 done = (Button) findViewById(R.id.done);
276                 done.setOnClickListener(new OnClickListener() {
277                                 public void onClick(View v) {
278                                         done();
279                                 }
280                         });
281
282                 // Set result CANCELED incase the user backs out
283                 setResult(Activity.RESULT_CANCELED);
284         }
285
286         @Override
287         protected void onStart() {
288                 super.onStart();
289         }
290
291         @Override
292         protected void onResume() {
293                 super.onResume();
294         }
295
296         @Override
297         protected void onPause() {
298                 super.onPause();
299         }
300
301         @Override
302         protected void onStop() {
303                 super.onStop();
304         }
305 }