/* * Copyright © 2016 Keith Packard * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ package org.altusmetrum.AltosDroid; import java.lang.ref.WeakReference; import java.util.*; import org.altusmetrum.AltosDroid.R; import android.app.Activity; import android.bluetooth.*; import android.content.*; import android.os.*; import android.view.*; import android.view.View.*; import android.widget.*; import android.widget.AdapterView.*; import org.altusmetrum.altoslib_13.*; public class SetupActivity extends Activity { private Spinner select_rate; private Spinner set_units; private Spinner map_type; private Spinner map_source; private Button manage_frequencies; private Button preload_maps; private Button done; private boolean is_bound; private Messenger service = null; public final static String EXTRA_SETUP_CHANGES = "setup_changes"; private ServiceConnection connection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder binder) { service = new Messenger(binder); } public void onServiceDisconnected(ComponentName className) { // This is called when the connection with the service has been unexpectedly disconnected - process crashed. service = null; } }; void doBindService() { bindService(new Intent(this, TelemetryService.class), connection, Context.BIND_AUTO_CREATE); is_bound = true; } void doUnbindService() { if (is_bound) { // If we have received the service, and hence registered with it, then now is the time to unregister. unbindService(connection); is_bound = false; } } static final String[] rates = { "38400", "9600", "2400", }; static final String[] map_types = { "Hybrid", "Satellite", "Roadmap", "Terrain" }; static final int[] map_type_values = { AltosMap.maptype_hybrid, AltosMap.maptype_satellite, AltosMap.maptype_roadmap, AltosMap.maptype_terrain, }; static final String[] map_sources = { "Online", "Offline" }; private int set_telemetry_rate; private int set_map_source; private int set_map_type; private boolean set_imperial_units; private int changes = 0; private void add_change(int change) { changes |= change; } private void done() { Intent intent = new Intent(); if ((changes & AltosDroid.SETUP_BAUD) != 0) AltosPreferences.set_telemetry_rate(1, set_telemetry_rate); if ((changes & AltosDroid.SETUP_UNITS) != 0) AltosPreferences.set_imperial_units(set_imperial_units); if ((changes & AltosDroid.SETUP_MAP_SOURCE) != 0) AltosDroidPreferences.set_map_source(set_map_source); if ((changes & AltosDroid.SETUP_MAP_TYPE) != 0) AltosPreferences.set_map_type(set_map_type); intent.putExtra(EXTRA_SETUP_CHANGES, changes); setResult(Activity.RESULT_OK, intent); finish(); } private void add_strings(Spinner spinner, String[] strings, int def) { ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item); for (int i = 0; i < strings.length; i++) adapter.add(strings[i]); spinner.setAdapter(adapter); if (def >= 0) spinner.setSelection(def); } private int default_rate_pos() { int default_rate = AltosPreferences.telemetry_rate(1); for (int pos = 0; pos < rates.length; pos++) { if (string_to_rate(rates[pos]) == default_rate) return pos; } return -1; } private void setBaud(int baud) { try { service.send(Message.obtain(null, TelemetryService.MSG_SETBAUD, baud)); set_telemetry_rate = baud; add_change(AltosDroid.SETUP_BAUD); } catch (RemoteException e) { } } private int string_to_rate(String baud) { int rate = AltosLib.ao_telemetry_rate_38400; try { int value = Integer.parseInt(baud); switch (value) { case 2400: rate = AltosLib.ao_telemetry_rate_2400; break; case 9600: rate = AltosLib.ao_telemetry_rate_9600; break; case 38400: rate = AltosLib.ao_telemetry_rate_38400; break; } } catch (NumberFormatException e) { } return rate; } private void setBaud(String baud) { setBaud(string_to_rate(baud)); } private void select_rate(int pos) { setBaud(rates[pos]); } static final String[] units = { "Metric", "Imperial" }; private int default_units_pos() { boolean imperial = AltosPreferences.imperial_units(); if (imperial) return 1; return 0; } private void set_units(int pos) { switch (pos) { default: set_imperial_units = false; break; case 1: set_imperial_units = true; break; } add_change(AltosDroid.SETUP_UNITS); } private int default_map_type_pos() { int default_map_type = AltosPreferences.map_type(); for (int pos = 0; pos < map_types.length; pos++) if (map_type_values[pos] == default_map_type) return pos; return 0; } private void select_map_type(int pos) { set_map_type = map_type_values[pos]; add_change(AltosDroid.SETUP_MAP_TYPE); } private int default_map_source_pos() { int default_source = AltosDroidPreferences.map_source(); switch (default_source) { case AltosDroidPreferences.MAP_SOURCE_OFFLINE: return 1; default: return 0; } } private void select_map_source(int pos) { switch (pos) { default: set_map_source = AltosDroidPreferences.MAP_SOURCE_ONLINE; break; case 1: set_map_source = AltosDroidPreferences.MAP_SOURCE_OFFLINE; break; } add_change(AltosDroid.SETUP_MAP_SOURCE); } private void manage_frequencies(){ Intent intent = new Intent(this, ManageFrequenciesActivity.class); startActivity(intent); } private void preload_maps(){ Intent intent = new Intent(this, PreloadMapActivity.class); startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AltosDebug.init(this); AltosDebug.debug("+++ ON CREATE +++"); // Initialise preferences AltosDroidPreferences.init(this); // Setup the window requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.setup); select_rate = (Spinner) findViewById(R.id.select_rate); add_strings(select_rate, rates, default_rate_pos()); select_rate.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int pos, long id) { select_rate(pos); } public void onNothingSelected(AdapterView parent) { } }); set_units = (Spinner) findViewById(R.id.set_units); add_strings(set_units, units, default_units_pos()); set_units.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int pos, long id) { set_units(pos); } public void onNothingSelected(AdapterView parent) { } }); map_type = (Spinner) findViewById(R.id.map_type); add_strings(map_type, map_types, default_map_type_pos()); map_type.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int pos, long id) { select_map_type(pos); } public void onNothingSelected(AdapterView parent) { } }); map_source = (Spinner) findViewById(R.id.map_source); add_strings(map_source, map_sources, default_map_source_pos()); map_source.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int pos, long id) { select_map_source(pos); } public void onNothingSelected(AdapterView parent) { } }); manage_frequencies = (Button) findViewById(R.id.manage_frequencies); manage_frequencies.setOnClickListener(new OnClickListener() { public void onClick(View v) { manage_frequencies(); } }); preload_maps = (Button) findViewById(R.id.preload_maps); preload_maps.setOnClickListener(new OnClickListener() { public void onClick(View v) { preload_maps(); } }); done = (Button) findViewById(R.id.done); done.setOnClickListener(new OnClickListener() { public void onClick(View v) { done(); } }); // Set result for when the user backs out setResult(Activity.RESULT_CANCELED); } @Override protected void onStart() { super.onStart(); doBindService(); } @Override protected void onStop() { super.onStop(); doUnbindService(); } }