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