Bump java lib versions in preparation for 1.9.2
[fw/altos] / altosdroid / app / src / main / java / org / altusmetrum / AltosDroid / SetupActivity.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 android.app.Activity;
22 import android.content.*;
23 import android.os.*;
24 import android.view.*;
25 import android.view.View.*;
26 import android.widget.*;
27 import android.widget.AdapterView.*;
28
29 import org.altusmetrum.altoslib_14.*;
30
31 public class SetupActivity extends Activity {
32         private Spinner select_rate;
33         private Spinner set_units;
34         private Spinner font_size;
35         private Spinner map_type;
36         private Spinner map_source;
37         private Button manage_frequencies;
38         private Button preload_maps;
39         private Button done;
40
41         private boolean is_bound;
42         private Messenger service = null;
43
44         public final static String EXTRA_SETUP_CHANGES = "setup_changes";
45
46         private ServiceConnection connection = new ServiceConnection() {
47                 public void onServiceConnected(ComponentName className, IBinder binder) {
48                         service = new Messenger(binder);
49                 }
50
51                 public void onServiceDisconnected(ComponentName className) {
52                         // This is called when the connection with the service has been unexpectedly disconnected - process crashed.
53                         service = null;
54                 }
55         };
56
57         void doBindService() {
58                 bindService(new Intent(this, TelemetryService.class), connection, Context.BIND_AUTO_CREATE);
59                 is_bound = true;
60         }
61
62         void doUnbindService() {
63                 if (is_bound) {
64                         // If we have received the service, and hence registered with it, then now is the time to unregister.
65                         unbindService(connection);
66                         is_bound = false;
67                 }
68         }
69
70         static final String[] rates = {
71                 "38400",
72                 "9600",
73                 "2400",
74         };
75
76         static final String[] sizes = {
77                 "Small",
78                 "Medium",
79                 "Large",
80                 "Extra"
81         };
82
83         static final String[] map_types = {
84                 "Hybrid",
85                 "Satellite",
86                 "Roadmap",
87                 "Terrain"
88         };
89
90         static final int[] map_type_values = {
91                 AltosMap.maptype_hybrid,
92                 AltosMap.maptype_satellite,
93                 AltosMap.maptype_roadmap,
94                 AltosMap.maptype_terrain,
95         };
96
97         static final String[] map_sources = {
98                 "Online",
99                 "Offline"
100         };
101
102         private int     set_telemetry_rate;
103         private int     set_map_source;
104         private int     set_map_type;
105         private boolean set_imperial_units;
106         private int     set_font_size;
107
108         private void done() {
109                 int     changes = 0;
110                 Intent intent = new Intent();
111
112                 if (set_telemetry_rate != AltosPreferences.telemetry_rate(1)) {
113                         changes |= AltosDroid.SETUP_BAUD;
114                         AltosPreferences.set_telemetry_rate(1, set_telemetry_rate);
115                 }
116                 if (set_imperial_units != AltosPreferences.imperial_units()) {
117                         changes |= AltosDroid.SETUP_UNITS;
118                         AltosPreferences.set_imperial_units(set_imperial_units);
119                 }
120                 if (set_map_source != AltosDroidPreferences.map_source()) {
121                         changes |= AltosDroid.SETUP_MAP_SOURCE;
122                         AltosDroidPreferences.set_map_source(set_map_source);
123                 }
124                 if (set_map_type != AltosPreferences.map_type()) {
125                         changes |= AltosDroid.SETUP_MAP_TYPE;
126                         AltosPreferences.set_map_type(set_map_type);
127                 }
128                 if (set_font_size != AltosDroidPreferences.font_size()) {
129                         changes |= AltosDroid.SETUP_FONT_SIZE;
130                         AltosDroidPreferences.set_font_size(set_font_size);
131                 }
132                 intent.putExtra(EXTRA_SETUP_CHANGES, changes);
133                 setResult(Activity.RESULT_OK, intent);
134                 finish();
135         }
136
137         private void add_strings(Spinner spinner, String[] strings, int def) {
138                 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item);
139
140                 for (int i = 0; i < strings.length; i++)
141                         adapter.add(strings[i]);
142
143                 spinner.setAdapter(adapter);
144                 if (def >= 0)
145                         spinner.setSelection(def);
146         }
147
148         private int default_rate_pos() {
149                 int     default_rate = AltosPreferences.telemetry_rate(1);
150
151                 for (int pos = 0; pos < rates.length; pos++) {
152                         if (string_to_rate(rates[pos]) == default_rate)
153                                 return pos;
154                 }
155                 return -1;
156         }
157
158         private void setBaud(int baud) {
159                 set_telemetry_rate = baud;
160         }
161
162         private int string_to_rate(String baud) {
163                 int     rate = AltosLib.ao_telemetry_rate_38400;
164                 try {
165                         int     value = Integer.parseInt(baud);
166                         switch (value) {
167                         case 2400:
168                                 rate = AltosLib.ao_telemetry_rate_2400;
169                                 break;
170                         case 9600:
171                                 rate = AltosLib.ao_telemetry_rate_9600;
172                                 break;
173                         case 38400:
174                                 rate = AltosLib.ao_telemetry_rate_38400;
175                                 break;
176                         }
177                 } catch (NumberFormatException e) {
178                 }
179                 return rate;
180         }
181
182         private void setBaud(String baud) {
183                 setBaud(string_to_rate(baud));
184         }
185
186         private void select_rate(int pos) {
187                 setBaud(rates[pos]);
188         }
189
190         static final String[] units = {
191                 "Metric",
192                 "Imperial"
193         };
194
195         private int default_units_pos() {
196                 boolean imperial = AltosPreferences.imperial_units();
197
198                 if (imperial)
199                         return 1;
200                 return 0;
201         }
202
203         private void set_units(int pos) {
204                 switch (pos) {
205                 default:
206                         set_imperial_units = false;
207                         break;
208                 case 1:
209                         set_imperial_units = true;
210                         break;
211                 }
212         }
213
214         private void set_font_size(int pos) {
215                 set_font_size = pos;
216         }
217
218         private int default_map_type_pos() {
219                 int     default_map_type = AltosPreferences.map_type();
220
221                 for (int pos = 0; pos < map_types.length; pos++)
222                         if (map_type_values[pos] == default_map_type)
223                                 return pos;
224                 return 0;
225         }
226
227         private void select_map_type(int pos) {
228                 set_map_type = map_type_values[pos];
229         }
230
231         private int default_map_source_pos() {
232                 int     default_source = AltosDroidPreferences.map_source();
233
234                 switch (default_source) {
235                 case AltosDroidPreferences.MAP_SOURCE_OFFLINE:
236                         return 1;
237                 default:
238                         return 0;
239                 }
240         }
241
242         private void select_map_source(int pos) {
243                 switch (pos) {
244                 default:
245                         set_map_source = AltosDroidPreferences.MAP_SOURCE_ONLINE;
246                         break;
247                 case 1:
248                         set_map_source = AltosDroidPreferences.MAP_SOURCE_OFFLINE;
249                         break;
250                 }
251         }
252
253         private void manage_frequencies(){
254                 Intent intent = new Intent(this, ManageFrequenciesActivity.class);
255                 startActivity(intent);
256         }
257
258         private void preload_maps(){
259                 Intent intent = new Intent(this, PreloadMapActivity.class);
260                 startActivity(intent);
261         }
262
263         @Override
264         protected void onCreate(Bundle savedInstanceState) {
265                 setTheme(AltosDroid.dialog_themes[AltosDroidPreferences.font_size()]);
266                 super.onCreate(savedInstanceState);
267
268                 AltosDebug.init(this);
269                 AltosDebug.debug("+++ ON CREATE +++");
270
271                 // Initialise preferences
272                 AltosDroidPreferences.init(this);
273
274                 // Setup the window
275                 setContentView(R.layout.setup);
276
277                 select_rate = (Spinner) findViewById(R.id.select_rate);
278                 add_strings(select_rate, rates, default_rate_pos());
279                 select_rate.setOnItemSelectedListener(new OnItemSelectedListener() {
280                                 public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
281                                         AltosDebug.debug("rate selected pos %d id %d", pos, id);
282                                         select_rate(pos);
283                                 }
284                                 public void onNothingSelected(AdapterView<?> parent) {
285                                 }
286                         });
287
288                 set_units = (Spinner) findViewById(R.id.set_units);
289                 add_strings(set_units, units, default_units_pos());
290                 set_units.setOnItemSelectedListener(new OnItemSelectedListener() {
291                                 public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
292                                         set_units(pos);
293                                 }
294                                 public void onNothingSelected(AdapterView<?> parent) {
295                                 }
296                         });
297
298                 font_size = (Spinner) findViewById(R.id.font_size);
299                 add_strings(font_size, sizes, AltosDroidPreferences.font_size());
300                 font_size.setOnItemSelectedListener(new OnItemSelectedListener() {
301                                 public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
302                                         set_font_size(pos);
303                                 }
304                                 public void onNothingSelected(AdapterView<?> parent) {
305                                 }
306                         });
307
308                 map_type = (Spinner) findViewById(R.id.map_type);
309                 add_strings(map_type, map_types, default_map_type_pos());
310                 map_type.setOnItemSelectedListener(new OnItemSelectedListener() {
311                                 public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
312                                         select_map_type(pos);
313                                 }
314                                 public void onNothingSelected(AdapterView<?> parent) {
315                                 }
316                         });
317
318                 map_source = (Spinner) findViewById(R.id.map_source);
319                 add_strings(map_source, map_sources, default_map_source_pos());
320                 map_source.setOnItemSelectedListener(new OnItemSelectedListener() {
321                                 public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
322                                         select_map_source(pos);
323                                 }
324                                 public void onNothingSelected(AdapterView<?> parent) {
325                                 }
326                         });
327
328
329                 manage_frequencies = (Button) findViewById(R.id.manage_frequencies);
330                 manage_frequencies.setOnClickListener(new OnClickListener() {
331                                 public void onClick(View v) {
332                                         manage_frequencies();
333                                 }
334                         });
335
336                 preload_maps = (Button) findViewById(R.id.preload_maps);
337                 preload_maps.setOnClickListener(new OnClickListener() {
338                                 public void onClick(View v) {
339                                         preload_maps();
340                                 }
341                         });
342
343                 done = (Button) findViewById(R.id.done);
344                 done.setOnClickListener(new OnClickListener() {
345                                 public void onClick(View v) {
346                                         done();
347                                 }
348                         });
349
350                 // Set result for when the user backs out
351                 setResult(Activity.RESULT_CANCELED);
352         }
353
354         @Override
355         protected void onStart() {
356                 super.onStart();
357                 doBindService();
358         }
359
360         @Override
361         protected void onStop() {
362                 super.onStop();
363                 doUnbindService();
364         }
365 }