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 java.lang.ref.WeakReference;
23 import org.altusmetrum.AltosDroid.R;
25 import android.app.Activity;
26 import android.bluetooth.*;
27 import android.content.*;
29 import android.view.*;
30 import android.view.View.*;
31 import android.widget.*;
32 import android.widget.AdapterView.*;
34 import org.altusmetrum.altoslib_11.*;
36 public class SetupActivity extends Activity {
37 private Spinner select_rate;
38 private Spinner set_units;
39 private Spinner map_type;
40 private Spinner map_source;
41 private Button manage_frequencies;
42 private Button preload_maps;
45 private boolean is_bound;
46 private Messenger service = null;
48 public final static String EXTRA_SETUP_CHANGES = "setup_changes";
50 private ServiceConnection connection = new ServiceConnection() {
51 public void onServiceConnected(ComponentName className, IBinder binder) {
52 service = new Messenger(binder);
55 public void onServiceDisconnected(ComponentName className) {
56 // This is called when the connection with the service has been unexpectedly disconnected - process crashed.
61 void doBindService() {
62 bindService(new Intent(this, TelemetryService.class), connection, Context.BIND_AUTO_CREATE);
66 void doUnbindService() {
68 // If we have received the service, and hence registered with it, then now is the time to unregister.
69 unbindService(connection);
74 static final String[] rates = {
80 static final String[] map_types = {
87 static final int[] map_type_values = {
88 AltosMap.maptype_hybrid,
89 AltosMap.maptype_satellite,
90 AltosMap.maptype_roadmap,
91 AltosMap.maptype_terrain,
94 static final String[] map_sources = {
99 private int set_telemetry_rate;
100 private int set_map_source;
101 private int set_map_type;
102 private boolean set_imperial_units;
104 private int changes = 0;
106 private void add_change(int change) {
110 private void done() {
111 Intent intent = new Intent();
112 if ((changes & AltosDroid.SETUP_BAUD) != 0)
113 AltosPreferences.set_telemetry_rate(1, set_telemetry_rate);
114 if ((changes & AltosDroid.SETUP_UNITS) != 0)
115 AltosPreferences.set_imperial_units(set_imperial_units);
116 if ((changes & AltosDroid.SETUP_MAP_SOURCE) != 0)
117 AltosDroidPreferences.set_map_source(set_map_source);
118 if ((changes & AltosDroid.SETUP_MAP_TYPE) != 0)
119 AltosPreferences.set_map_type(set_map_type);
120 intent.putExtra(EXTRA_SETUP_CHANGES, changes);
121 setResult(Activity.RESULT_OK, intent);
125 private void add_strings(Spinner spinner, String[] strings, int def) {
126 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
128 for (int i = 0; i < strings.length; i++)
129 adapter.add(strings[i]);
131 spinner.setAdapter(adapter);
133 spinner.setSelection(def);
136 private int default_rate_pos() {
137 int default_rate = AltosPreferences.telemetry_rate(1);
139 for (int pos = 0; pos < rates.length; pos++) {
140 if (string_to_rate(rates[pos]) == default_rate)
146 private void setBaud(int baud) {
148 service.send(Message.obtain(null, TelemetryService.MSG_SETBAUD, baud));
149 set_telemetry_rate = baud;
150 add_change(AltosDroid.SETUP_BAUD);
151 } catch (RemoteException e) {
155 private int string_to_rate(String baud) {
156 int rate = AltosLib.ao_telemetry_rate_38400;
158 int value = Integer.parseInt(baud);
161 rate = AltosLib.ao_telemetry_rate_2400;
164 rate = AltosLib.ao_telemetry_rate_9600;
167 rate = AltosLib.ao_telemetry_rate_38400;
170 } catch (NumberFormatException e) {
175 private void setBaud(String baud) {
176 setBaud(string_to_rate(baud));
179 private void select_rate(int pos) {
183 static final String[] units = {
188 private int default_units_pos() {
189 boolean imperial = AltosPreferences.imperial_units();
196 private void set_units(int pos) {
199 set_imperial_units = false;
202 set_imperial_units = true;
205 add_change(AltosDroid.SETUP_UNITS);
208 private int default_map_type_pos() {
209 int default_map_type = AltosPreferences.map_type();
211 for (int pos = 0; pos < map_types.length; pos++)
212 if (map_type_values[pos] == default_map_type)
217 private void select_map_type(int pos) {
218 set_map_type = map_type_values[pos];
219 add_change(AltosDroid.SETUP_MAP_TYPE);
222 private int default_map_source_pos() {
223 int default_source = AltosDroidPreferences.map_source();
225 switch (default_source) {
226 case AltosDroidPreferences.MAP_SOURCE_OFFLINE:
233 private void select_map_source(int pos) {
236 set_map_source = AltosDroidPreferences.MAP_SOURCE_ONLINE;
239 set_map_source = AltosDroidPreferences.MAP_SOURCE_OFFLINE;
242 add_change(AltosDroid.SETUP_MAP_SOURCE);
245 private void manage_frequencies(){
246 Intent intent = new Intent(this, ManageFrequenciesActivity.class);
247 startActivity(intent);
250 private void preload_maps(){
251 Intent intent = new Intent(this, PreloadMapActivity.class);
252 startActivity(intent);
256 protected void onCreate(Bundle savedInstanceState) {
257 super.onCreate(savedInstanceState);
260 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
261 setContentView(R.layout.setup);
263 select_rate = (Spinner) findViewById(R.id.select_rate);
264 add_strings(select_rate, rates, default_rate_pos());
265 select_rate.setOnItemSelectedListener(new OnItemSelectedListener() {
266 public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
269 public void onNothingSelected(AdapterView<?> parent) {
273 set_units = (Spinner) findViewById(R.id.set_units);
274 add_strings(set_units, units, default_units_pos());
275 set_units.setOnItemSelectedListener(new OnItemSelectedListener() {
276 public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
279 public void onNothingSelected(AdapterView<?> parent) {
283 map_type = (Spinner) findViewById(R.id.map_type);
284 add_strings(map_type, map_types, default_map_type_pos());
285 map_type.setOnItemSelectedListener(new OnItemSelectedListener() {
286 public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
287 select_map_type(pos);
289 public void onNothingSelected(AdapterView<?> parent) {
293 map_source = (Spinner) findViewById(R.id.map_source);
294 add_strings(map_source, map_sources, default_map_source_pos());
295 map_source.setOnItemSelectedListener(new OnItemSelectedListener() {
296 public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
297 select_map_source(pos);
299 public void onNothingSelected(AdapterView<?> parent) {
304 manage_frequencies = (Button) findViewById(R.id.manage_frequencies);
305 manage_frequencies.setOnClickListener(new OnClickListener() {
306 public void onClick(View v) {
307 manage_frequencies();
311 preload_maps = (Button) findViewById(R.id.preload_maps);
312 preload_maps.setOnClickListener(new OnClickListener() {
313 public void onClick(View v) {
318 done = (Button) findViewById(R.id.done);
319 done.setOnClickListener(new OnClickListener() {
320 public void onClick(View v) {
325 // Set result for when the user backs out
326 setResult(Activity.RESULT_CANCELED);
330 protected void onStart() {
336 protected void onStop() {