package org.schmivits.airball.phone; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.content.Intent; import android.hardware.SensorManager; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.MotionEvent; import android.view.View; import android.view.Window; import android.view.WindowManager; import org.schmivits.airball.airdata.AccelerometerFlightData; import org.schmivits.airball.airdata.Aircraft; import org.schmivits.airball.airdata.ConstantFlightData; import org.schmivits.airball.airdata.DynonSerialFlightData; import org.schmivits.airball.airdata.FlightData; import org.schmivits.airball.airdata.N42PEBluetoothFlightData; import org.schmivits.airball.airdata.N42PEUARTFlightData; import org.schmivits.airball.airdata.XPlaneNetworkFlightData; public abstract class AirballActivity extends Activity { private FlightData mFlightData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); PreferenceManager.setDefaultValues(this, R.xml.preferences, false); setContentView(R.layout.airball); final AirballView view = (AirballView) findViewById(R.id.airball_view); View.OnTouchListener onTouch = new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { view.setOnTouchListener(null); startActivity(new Intent(AirballActivity.this, PreferencesActivity.class)); AirballActivity.this.finish(); return true; } }; view.setOnTouchListener(onTouch); mFlightData = getFlightData(); view.setModel(mFlightData); } @Override protected void onDestroy() { super.onDestroy(); mFlightData.destroy(); } private final Aircraft mAircraft = new Aircraft() { private float p(int id) { return Prefs.getPrefFloat(AirballActivity.this, id); } @Override public float getVs0() { return p(R.string.pref_v_s0_key); } @Override public float getVs1() { return p(R.string.pref_v_s1_key); } @Override public float getVfe() { return p(R.string.pref_v_fe_key); } @Override public float getVno() { return p(R.string.pref_v_no_key); } @Override public float getVne() { return p(R.string.pref_v_ne_key); } @Override public float getAs() { return p(R.string.pref_alpha_s_key); } @Override public float getAmin() { return p(R.string.pref_alpha_min_key); } @Override public float getAx() { return p(R.string.pref_alpha_x_key); } @Override public float getAy() { return p(R.string.pref_alpha_y_key); } @Override public float getAref() { return p(R.string.pref_alpha_ref_key); } @Override public float getBfs() { return p(R.string.pref_beta_full_scale_key); } }; private FlightData getFlightData() { int prefKeyId = R.string.pref_data_source_key; if (Prefs.prefEq(this, prefKeyId, R.string.pref_data_source_value_constant_data)) { return new ConstantFlightData(mAircraft); } else if (Prefs.prefEq(this, prefKeyId, R.string.pref_data_source_value_dummy_data)) { return new AccelerometerFlightData( mAircraft, (SensorManager) getSystemService(SENSOR_SERVICE), isLandscape()); } else if (Prefs.prefEq(this, prefKeyId, R.string.pref_data_source_value_skyview_bluetooth)) { // TODO: Dynon Skyview data source is hard-coded for N42PE return new N42PEBluetoothFlightData(findBluetoothAdapter()); } else if (Prefs.prefEq(this, prefKeyId, R.string.pref_data_source_value_skyview_usb_serial)) { // TODO: Dynon Skyview data source is hard-coded for N42PE return new N42PEUARTFlightData(this); } else if (Prefs.prefEq(this, prefKeyId, R.string.pref_data_source_value_xplane_udp)) { boolean isUdp; if (Prefs.prefEq(this, R.string.pref_xplane_ip_protocol_key, R.string.pref_xplane_ip_protocol_value_udp)) { isUdp = true; } else if (Prefs.prefEq(this, R.string.pref_xplane_ip_protocol_key, R.string.pref_xplane_ip_protocol_value_tcp)) { isUdp = false; } else { throw new RuntimeException("Unrecognized X-Plane data protocol preference value"); } return new XPlaneNetworkFlightData( mAircraft, Prefs.getPrefInt(this, R.string.pref_xplane_ip_port_key), isUdp); } else { throw new RuntimeException("Unrecognized data source preference value"); } } protected abstract boolean isLandscape(); private BluetoothAdapter findBluetoothAdapter() { BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); if (adapter == null) { adapter = (BluetoothAdapter) getSystemService(Context.BLUETOOTH_SERVICE); } return adapter; } }