1e92b89fe586645cc2fb3419b1ea0975eb8cfd82
[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                 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 insert_item(AltosFrequency frequency) {
168                 FrequencyItem new_item = new FrequencyItem(frequency);
169                 int     pos;
170                 for (pos = 0; pos < frequencies_adapter.getCount(); pos++) {
171                         FrequencyItem   item = frequencies_adapter.getItem(pos);
172                         if (item.frequency.frequency == new_item.frequency.frequency) {
173                                 item.set_frequency(frequency);
174                                 return pos;
175                         }
176                         if (item.frequency.frequency > new_item.frequency.frequency)
177                                 break;
178                 }
179                 frequencies_adapter.insert(new_item, pos);
180                 return pos;
181         }
182
183         private class FrequencyItemClickListener implements ListView.OnItemClickListener {
184                 @Override
185                 public void onItemClick(AdapterView<?> av, View v, int position, long id) {
186                         select_item(position);
187                 }
188         }
189
190         private void hide_keyboard() {
191                 InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
192                 View view = getCurrentFocus();
193                 if (view != null)
194                         imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
195         }
196
197         private void set() {
198                 String  frequency_text = set_frequency.getEditableText().toString();
199                 String  description_text = set_description.getEditableText().toString();
200
201                 try {
202                         double  f = AltosParse.parse_double_locale(frequency_text);
203
204                         int pos = insert_item(new AltosFrequency(f, description_text));
205                         frequencies_adapter.selected_item = -1;
206                         select_item(pos);
207                         changed = true;
208                 } catch (ParseException pe) {
209                 }
210                 hide_keyboard();
211         }
212
213         private void remove() {
214                 if (frequencies_adapter.selected_item >= 0) {
215                         frequencies_adapter.remove(frequencies_adapter.getItem(frequencies_adapter.selected_item));
216                         select_item(-1);
217                         frequencies_view.setAdapter(frequencies_adapter);
218                         changed = true;
219                 }
220         }
221
222         @Override
223         protected void onCreate(Bundle savedInstanceState) {
224                 super.onCreate(savedInstanceState);
225
226                 // Setup the window
227                 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
228                 setContentView(R.layout.manage_frequencies);
229
230                 frequencies_view = (ListView) findViewById(R.id.frequencies);
231                 frequencies_view.setClickable(true);
232
233                 frequencies_adapter = new FrequencyAdapter(this, R.layout.frequency);
234
235                 frequencies_view.setAdapter(frequencies_adapter);
236                 frequencies_view.setOnItemClickListener(new FrequencyItemClickListener());
237
238                 AltosFrequency[] frequencies = AltosPreferences.common_frequencies();
239                 for (AltosFrequency frequency : frequencies)
240                         insert_item(frequency);
241
242                 set_frequency = (EditText) findViewById(R.id.set_frequency);
243                 set_description = (EditText) findViewById(R.id.set_description);
244
245                 set = (Button) findViewById(R.id.set);
246                 set.setOnClickListener(new OnClickListener() {
247                                 public void onClick(View v) {
248                                         set();
249                                 }
250                         });
251
252                 remove = (Button) findViewById(R.id.remove);
253                 remove.setOnClickListener(new OnClickListener() {
254                                 public void onClick(View v) {
255                                         remove();
256                                 }
257                         });
258
259                 done = (Button) findViewById(R.id.done);
260                 done.setOnClickListener(new OnClickListener() {
261                                 public void onClick(View v) {
262                                         done();
263                                 }
264                         });
265
266                 // Set result CANCELED incase the user backs out
267                 setResult(Activity.RESULT_CANCELED);
268         }
269
270         @Override
271         protected void onStart() {
272                 super.onStart();
273         }
274
275         @Override
276         protected void onResume() {
277                 super.onResume();
278         }
279
280         @Override
281         protected void onPause() {
282                 super.onPause();
283         }
284
285         @Override
286         protected void onStop() {
287                 super.onStop();
288         }
289 }