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