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