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_13.*;
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;
40 private boolean is_bound;
41 private Messenger service = null;
43 public final static String EXTRA_SETUP_CHANGES = "setup_changes";
45 private ServiceConnection connection = new ServiceConnection() {
46 public void onServiceConnected(ComponentName className, IBinder binder) {
47 service = new Messenger(binder);
50 public void onServiceDisconnected(ComponentName className) {
51 // This is called when the connection with the service has been unexpectedly disconnected - process crashed.
56 void doBindService() {
57 bindService(new Intent(this, TelemetryService.class), connection, Context.BIND_AUTO_CREATE);
61 void doUnbindService() {
63 // If we have received the service, and hence registered with it, then now is the time to unregister.
64 unbindService(connection);
69 static final String[] rates = {
75 static final String[] map_types = {
82 static final int[] map_type_values = {
83 AltosMap.maptype_hybrid,
84 AltosMap.maptype_satellite,
85 AltosMap.maptype_roadmap,
86 AltosMap.maptype_terrain,
89 static final String[] map_sources = {
94 private int set_telemetry_rate;
95 private int set_map_source;
96 private int set_map_type;
97 private boolean set_imperial_units;
99 private int changes = 0;
101 private void add_change(int change) {
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);
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);
123 for (int i = 0; i < strings.length; i++)
124 adapter.add(strings[i]);
126 spinner.setAdapter(adapter);
128 spinner.setSelection(def);
131 private int default_rate_pos() {
132 int default_rate = AltosPreferences.telemetry_rate(1);
134 for (int pos = 0; pos < rates.length; pos++) {
135 if (string_to_rate(rates[pos]) == default_rate)
141 private void setBaud(int baud) {
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) {
150 private int string_to_rate(String baud) {
151 int rate = AltosLib.ao_telemetry_rate_38400;
153 int value = Integer.parseInt(baud);
156 rate = AltosLib.ao_telemetry_rate_2400;
159 rate = AltosLib.ao_telemetry_rate_9600;
162 rate = AltosLib.ao_telemetry_rate_38400;
165 } catch (NumberFormatException e) {
170 private void setBaud(String baud) {
171 setBaud(string_to_rate(baud));
174 private void select_rate(int pos) {
178 static final String[] units = {
183 private int default_units_pos() {
184 boolean imperial = AltosPreferences.imperial_units();
191 private void set_units(int pos) {
194 set_imperial_units = false;
197 set_imperial_units = true;
200 add_change(AltosDroid.SETUP_UNITS);
203 private int default_map_type_pos() {
204 int default_map_type = AltosPreferences.map_type();
206 for (int pos = 0; pos < map_types.length; pos++)
207 if (map_type_values[pos] == default_map_type)
212 private void select_map_type(int pos) {
213 set_map_type = map_type_values[pos];
214 add_change(AltosDroid.SETUP_MAP_TYPE);
217 private int default_map_source_pos() {
218 int default_source = AltosDroidPreferences.map_source();
220 switch (default_source) {
221 case AltosDroidPreferences.MAP_SOURCE_OFFLINE:
228 private void select_map_source(int pos) {
231 set_map_source = AltosDroidPreferences.MAP_SOURCE_ONLINE;
234 set_map_source = AltosDroidPreferences.MAP_SOURCE_OFFLINE;
237 add_change(AltosDroid.SETUP_MAP_SOURCE);
240 private void manage_frequencies(){
241 Intent intent = new Intent(this, ManageFrequenciesActivity.class);
242 startActivity(intent);
245 private void preload_maps(){
246 Intent intent = new Intent(this, PreloadMapActivity.class);
247 startActivity(intent);
251 protected void onCreate(Bundle savedInstanceState) {
252 super.onCreate(savedInstanceState);
254 AltosDebug.init(this);
255 AltosDebug.debug("+++ ON CREATE +++");
257 // Initialise preferences
258 AltosDroidPreferences.init(this);
261 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
262 setContentView(R.layout.setup);
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) {
270 public void onNothingSelected(AdapterView<?> parent) {
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) {
280 public void onNothingSelected(AdapterView<?> parent) {
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);
290 public void onNothingSelected(AdapterView<?> parent) {
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);
300 public void onNothingSelected(AdapterView<?> parent) {
305 manage_frequencies = (Button) findViewById(R.id.manage_frequencies);
306 manage_frequencies.setOnClickListener(new OnClickListener() {
307 public void onClick(View v) {
308 manage_frequencies();
312 preload_maps = (Button) findViewById(R.id.preload_maps);
313 preload_maps.setOnClickListener(new OnClickListener() {
314 public void onClick(View v) {
319 done = (Button) findViewById(R.id.done);
320 done.setOnClickListener(new OnClickListener() {
321 public void onClick(View v) {
326 // Set result for when the user backs out
327 setResult(Activity.RESULT_CANCELED);
331 protected void onStart() {
337 protected void onStop() {