2 * Copyright © 2016 Keith Packard <keithp@keithp.com>
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.
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.
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.
19 package org.altusmetrum.AltosDroid;
21 import android.app.Activity;
22 import android.content.*;
24 import android.view.*;
25 import android.view.View.*;
26 import android.widget.*;
27 import android.widget.AdapterView.*;
29 import org.altusmetrum.altoslib_14.*;
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;
41 private boolean is_bound;
42 private Messenger service = null;
44 public final static String EXTRA_SETUP_CHANGES = "setup_changes";
46 private ServiceConnection connection = new ServiceConnection() {
47 public void onServiceConnected(ComponentName className, IBinder binder) {
48 service = new Messenger(binder);
51 public void onServiceDisconnected(ComponentName className) {
52 // This is called when the connection with the service has been unexpectedly disconnected - process crashed.
57 void doBindService() {
58 bindService(new Intent(this, TelemetryService.class), connection, Context.BIND_AUTO_CREATE);
62 void doUnbindService() {
64 // If we have received the service, and hence registered with it, then now is the time to unregister.
65 unbindService(connection);
70 static final String[] rates = {
76 static final String[] sizes = {
83 static final String[] map_types = {
90 static final int[] map_type_values = {
91 AltosMap.maptype_hybrid,
92 AltosMap.maptype_satellite,
93 AltosMap.maptype_roadmap,
94 AltosMap.maptype_terrain,
97 static final String[] map_sources = {
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;
108 private void done() {
110 Intent intent = new Intent();
112 if (set_telemetry_rate != AltosPreferences.telemetry_rate(1)) {
113 changes |= AltosDroid.SETUP_BAUD;
114 AltosPreferences.set_telemetry_rate(1, set_telemetry_rate);
116 if (set_imperial_units != AltosPreferences.imperial_units()) {
117 changes |= AltosDroid.SETUP_UNITS;
118 AltosPreferences.set_imperial_units(set_imperial_units);
120 if (set_map_source != AltosDroidPreferences.map_source()) {
121 changes |= AltosDroid.SETUP_MAP_SOURCE;
122 AltosDroidPreferences.set_map_source(set_map_source);
124 if (set_map_type != AltosPreferences.map_type()) {
125 changes |= AltosDroid.SETUP_MAP_TYPE;
126 AltosPreferences.set_map_type(set_map_type);
128 if (set_font_size != AltosDroidPreferences.font_size()) {
129 changes |= AltosDroid.SETUP_FONT_SIZE;
130 AltosDroidPreferences.set_font_size(set_font_size);
132 intent.putExtra(EXTRA_SETUP_CHANGES, changes);
133 setResult(Activity.RESULT_OK, intent);
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);
140 for (int i = 0; i < strings.length; i++)
141 adapter.add(strings[i]);
143 spinner.setAdapter(adapter);
145 spinner.setSelection(def);
148 private int default_rate_pos() {
149 int default_rate = AltosPreferences.telemetry_rate(1);
151 for (int pos = 0; pos < rates.length; pos++) {
152 if (string_to_rate(rates[pos]) == default_rate)
158 private void setBaud(int baud) {
159 set_telemetry_rate = baud;
162 private int string_to_rate(String baud) {
163 int rate = AltosLib.ao_telemetry_rate_38400;
165 int value = Integer.parseInt(baud);
168 rate = AltosLib.ao_telemetry_rate_2400;
171 rate = AltosLib.ao_telemetry_rate_9600;
174 rate = AltosLib.ao_telemetry_rate_38400;
177 } catch (NumberFormatException e) {
182 private void setBaud(String baud) {
183 setBaud(string_to_rate(baud));
186 private void select_rate(int pos) {
190 static final String[] units = {
195 private int default_units_pos() {
196 boolean imperial = AltosPreferences.imperial_units();
203 private void set_units(int pos) {
206 set_imperial_units = false;
209 set_imperial_units = true;
214 private void set_font_size(int pos) {
218 private int default_map_type_pos() {
219 int default_map_type = AltosPreferences.map_type();
221 for (int pos = 0; pos < map_types.length; pos++)
222 if (map_type_values[pos] == default_map_type)
227 private void select_map_type(int pos) {
228 set_map_type = map_type_values[pos];
231 private int default_map_source_pos() {
232 int default_source = AltosDroidPreferences.map_source();
234 switch (default_source) {
235 case AltosDroidPreferences.MAP_SOURCE_OFFLINE:
242 private void select_map_source(int pos) {
245 set_map_source = AltosDroidPreferences.MAP_SOURCE_ONLINE;
248 set_map_source = AltosDroidPreferences.MAP_SOURCE_OFFLINE;
253 private void manage_frequencies(){
254 Intent intent = new Intent(this, ManageFrequenciesActivity.class);
255 startActivity(intent);
258 private void preload_maps(){
259 Intent intent = new Intent(this, PreloadMapActivity.class);
260 startActivity(intent);
264 protected void onCreate(Bundle savedInstanceState) {
265 setTheme(AltosDroid.dialog_themes[AltosDroidPreferences.font_size()]);
266 super.onCreate(savedInstanceState);
268 AltosDebug.init(this);
269 AltosDebug.debug("+++ ON CREATE +++");
271 // Initialise preferences
272 AltosDroidPreferences.init(this);
275 setContentView(R.layout.setup);
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);
284 public void onNothingSelected(AdapterView<?> parent) {
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) {
294 public void onNothingSelected(AdapterView<?> parent) {
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) {
304 public void onNothingSelected(AdapterView<?> parent) {
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);
314 public void onNothingSelected(AdapterView<?> parent) {
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);
324 public void onNothingSelected(AdapterView<?> parent) {
329 manage_frequencies = (Button) findViewById(R.id.manage_frequencies);
330 manage_frequencies.setOnClickListener(new OnClickListener() {
331 public void onClick(View v) {
332 manage_frequencies();
336 preload_maps = (Button) findViewById(R.id.preload_maps);
337 preload_maps.setOnClickListener(new OnClickListener() {
338 public void onClick(View v) {
343 done = (Button) findViewById(R.id.done);
344 done.setOnClickListener(new OnClickListener() {
345 public void onClick(View v) {
350 // Set result for when the user backs out
351 setResult(Activity.RESULT_CANCELED);
355 protected void onStart() {
361 protected void onStop() {