package ch.spherIC.recurvebowsight; import android.app.Activity; import android.app.Dialog; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.view.Gravity; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; import android.widget.ViewFlipper; import ch.spherIC.recurvebowsight.components.FontArrayAdapter; import ch.spherIC.recurvebowsight.components.RiserSpinner; import ch.spherIC.recurvebowsight.components.SightSpinner; import ch.spherIC.recurvebowsight.components.XSpinner; import ch.spherIC.recurvebowsight.components.XTextView; import ch.spherIC.recurvebowsight.database.RBSDatabaseHelper; import ch.spherIC.recurvebowsight.database.dao.RiserDao; import ch.spherIC.recurvebowsight.database.dao.SightDao; import ch.spherIC.recurvebowsight.dialog.ChooseArcherySetupDlg.ChooseArcherySetupDlgDismissListener; import ch.spherIC.recurvebowsight.model.IArcherySetup; import ch.spherIC.recurvebowsight.model.IRiser; import ch.spherIC.recurvebowsight.model.ISight; import ch.spherIC.recurvebowsight.model.Riser; import ch.spherIC.recurvebowsight.model.Sight; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.StringTokenizer; public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDismissListener { public static final DecimalFormat DF = new DecimalFormat("0.###"); public static final int DLG_CHOOSE_ARCHERYSETUP = 0; public static final int DLG_USERGUIDE_PARAMS = 1; public static final int DLG_USERGUIDE_SIGHT = 2; public static final int DLG_ABOUT = 3; private static final int MIN_DISTANCE = 50; private ViewFlipper viewFlipper; private ScrollView paramsScrollView; private ScrollView sightCfgScrollView; private float lastX; private ListView listView1; private XTextView txtViewParams; private XTextView txtViewResults; private XTextView txtViewSight; private TextView arrowDiameterTxtFld; private TextView arrowCwTxtFld; private TextView arrowWeightTxtFld; private TextView bowPulloutTxtFld; private TextView arrowV0TxtFld; private TextView airTemperatureTxtFld; private TextView airRelativeHumidityTxtFld; private TextView shootingDistanzTxtFld; private TextView arrowNockHeightTxtFld; private TextView targetCenterHeightTxtFld; private XSpinner calcTimeIntervalCboBox; private XSpinner calcAccuracyCboBox; private RiserSpinner scRiserSpinner; private TextView scVvisHTxtFld; private TextView scVvisVTxtFld; private SightSpinner scSightSpinner; private XSpinner scHeVSSpinner; private TextView scHeVSTxtFld; private TextView scaVTxtFld; private TextView scaHTxtFld; private TextView scVertScaleRngTxtFld; private TextView scVertScaleMiddleTxtFld; private TextView scEvSValue; private IArcherySetup selectedArcherySetup; private Activity riserSightConfigActivity; private boolean showInfoMenu; // private Menu optionsMenu; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.rbs_main); UnitConverter.setApplication(getApplication()); RBSDatabaseHelper.setContext(this); RBSDatabaseHelper.getInstance().initializeDB(); initializeComponents(); addTouchListeners(); xTextViewUp(this.txtViewParams); this.calcTimeIntervalCboBox.setAdapter(new FontArrayAdapter(this, R.layout.rbs_spinner, getResources().getStringArray(R.array.CalculationTimeIntervals), this.calcTimeIntervalCboBox)); this.calcAccuracyCboBox.setAdapter(new FontArrayAdapter(this, R.layout.rbs_spinner, getResources().getStringArray(R.array.CalculationAccuracies), this.calcAccuracyCboBox)); List risers = RiserDao.getInstance().loadAll(); risers.add(0, new Riser(-999, getResources().getString(R.string.caption_NoSelection), "", null, null, null)); this.scRiserSpinner.setAdapter(new FontArrayAdapter(this, R.layout.rbs_spinner, risers, this.scRiserSpinner)); List sights = SightDao.getInstance().loadAll(); sights.add(0, new Sight(-999, getResources().getString(R.string.caption_NoSelection), "", null, null, "", null, null)); this.scSightSpinner.setAdapter(new FontArrayAdapter(this, R.layout.rbs_spinner, sights, this.scSightSpinner)); addRiserAndSightSpinnerListeners(); // ************************************************************************ // ** TEST WEISE AB HIER*************************************************** // ************************************************************************ this.listView1 = (ListView) findViewById(R.id.listView1); String[] values = new String[] { "Riser", "Sight", "General Config" }; final ArrayList list = new ArrayList(Arrays.asList(values)); final ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, list); this.listView1.setAdapter(adapter); this.listView1.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(final AdapterView parent, final View view, final int position, final long id) { final String item = (String) parent.getItemAtPosition(position); if (item.equals("Riser")) { Intent intent = new Intent(RBSMainActivity.this, RiserSightConfigurationActivity.class); startActivity(intent); } } }); } private void initializeComponents() { this.viewFlipper = (ViewFlipper) findViewById(R.id.viewFlipper); this.paramsScrollView = (ScrollView) findViewById(R.id.paramsScrollView); this.sightCfgScrollView = (ScrollView) findViewById(R.id.sightCfgScrollView); this.txtViewParams = (XTextView) findViewById(R.id.viewParams); this.txtViewResults = (XTextView) findViewById(R.id.viewResults); this.txtViewSight = (XTextView) findViewById(R.id.viewSight); this.arrowDiameterTxtFld = (TextView) findViewById(R.id.arrowDiameterTxtFld); this.arrowCwTxtFld = (TextView) findViewById(R.id.arrowCwTxtFld); this.arrowWeightTxtFld = (TextView) findViewById(R.id.arrowWeightTxtFld); this.bowPulloutTxtFld = (TextView) findViewById(R.id.bowPulloutTxtFld); this.arrowV0TxtFld = (TextView) findViewById(R.id.arrowV0TxtFld); this.airTemperatureTxtFld = (TextView) findViewById(R.id.airTemperatureTxtFld); this.airRelativeHumidityTxtFld = (TextView) findViewById(R.id.airRelativeHumidityTxtFld); this.shootingDistanzTxtFld = (TextView) findViewById(R.id.shootingDistanzTxtFld); this.arrowNockHeightTxtFld = (TextView) findViewById(R.id.arrowNockHeightTxtFld); this.targetCenterHeightTxtFld = (TextView) findViewById(R.id.targetCenterHeightTxtFld); this.calcTimeIntervalCboBox = (XSpinner) findViewById(R.id.deltaTimeCboBox); this.calcAccuracyCboBox = (XSpinner) findViewById(R.id.calcPrecisionCboBox); this.scRiserSpinner = (RiserSpinner) findViewById(R.id.scRiserSpinner); this.scVvisHTxtFld = (TextView) findViewById(R.id.scVvisHTxtFld); this.scVvisVTxtFld = (TextView) findViewById(R.id.scVvisVTxtFld); this.scSightSpinner = (SightSpinner) findViewById(R.id.scSightSpinner); this.scHeVSSpinner = (XSpinner) findViewById(R.id.scHeVSSpinner); this.scHeVSTxtFld = (TextView) findViewById(R.id.scHeVSTxtFld); this.scaVTxtFld = (TextView) findViewById(R.id.scaVTxtFld); this.scaHTxtFld = (TextView) findViewById(R.id.scaHTxtFld); this.scVertScaleRngTxtFld = (TextView) findViewById(R.id.scVertScaleRngTxtFld); this.scVertScaleMiddleTxtFld = (TextView) findViewById(R.id.scVertSkalaMiddleTxtFld); this.scEvSValue = (TextView) findViewById(R.id.scEvSValue); } private void addRiserAndSightSpinnerListeners() { this.scRiserSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(final AdapterView parent, final View view, final int position, final long id) { IRiser riser = RBSMainActivity.this.scRiserSpinner.getSelectedRiser(); if (riser.getId() != -999) { RBSMainActivity.this.scVvisHTxtFld.setText(DF.format(riser.getVVisH())); RBSMainActivity.this.scVvisVTxtFld.setText(DF.format(riser.getVVisV())); } else { RBSMainActivity.this.scVvisHTxtFld.setText(""); RBSMainActivity.this.scVvisVTxtFld.setText(""); } RBSMainActivity.this.scVvisHTxtFld.setEnabled(riser.getId() == -999); RBSMainActivity.this.scVvisVTxtFld.setEnabled(riser.getId() == -999); } @Override public void onNothingSelected(final AdapterView parent) { } }); this.scSightSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(final AdapterView parent, final View view, final int position, final long id) { ISight sight = RBSMainActivity.this.scSightSpinner.getSelectedSight(); if (sight.getId() != -999) { List listHeVis = new ArrayList(); String heVis = sight.getHeVis(); StringTokenizer t = new StringTokenizer(heVis, ","); while (t.hasMoreTokens()) { listHeVis.add(t.nextToken()); } RBSMainActivity.this.scHeVSTxtFld.setVisibility(View.INVISIBLE); RBSMainActivity.this.scHeVSTxtFld.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSTxtFld.getLayoutParams().width, RBSMainActivity.this.scHeVSTxtFld.getLayoutParams().height, 0f)); RBSMainActivity.this.scHeVSSpinner.setVisibility(View.VISIBLE); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSSpinner.getLayoutParams().width, RBSMainActivity.this.scHeVSSpinner.getLayoutParams().height, 1f); params.gravity = Gravity.FILL_VERTICAL; RBSMainActivity.this.scHeVSSpinner.setLayoutParams(params); RBSMainActivity.this.scHeVSSpinner.setAdapter(new FontArrayAdapter(RBSMainActivity.this, R.layout.rbs_spinner, listHeVis, RBSMainActivity.this.scHeVSSpinner)); RBSMainActivity.this.scHeVSSpinner.setSelection(0); if (RBSMainActivity.this.selectedArcherySetup != null && RBSMainActivity.this.selectedArcherySetup.getSight().getId() == sight.getId()) { RBSMainActivity.this.scHeVSSpinner.setSelectionByVal(DF.format(RBSMainActivity.this.selectedArcherySetup.getSightHorSetting())); } RBSMainActivity.this.scaVTxtFld.setText(DF.format(sight.getAV())); RBSMainActivity.this.scaHTxtFld.setText(DF.format(sight.getAH())); RBSMainActivity.this.scVertScaleRngTxtFld.setText(DF.format(sight.getVertSkalaRangeMin()) + "-" + DF.format(sight.getVertSkalaRangeMax())); } else { RBSMainActivity.this.scHeVSSpinner.setVisibility(View.INVISIBLE); RBSMainActivity.this.scHeVSSpinner.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSSpinner.getLayoutParams().width, RBSMainActivity.this.scHeVSSpinner.getLayoutParams().height, 0f)); RBSMainActivity.this.scHeVSTxtFld.setVisibility(View.VISIBLE); RBSMainActivity.this.scHeVSTxtFld.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSTxtFld.getLayoutParams().width, RBSMainActivity.this.scHeVSTxtFld.getLayoutParams().height, 1f)); RBSMainActivity.this.scHeVSSpinner.setAdapter(new FontArrayAdapter(RBSMainActivity.this, R.layout.rbs_spinner, new ArrayList(), RBSMainActivity.this.scHeVSSpinner)); RBSMainActivity.this.scaVTxtFld.setText(""); RBSMainActivity.this.scaHTxtFld.setText(""); RBSMainActivity.this.scVertScaleRngTxtFld.setText(""); } RBSMainActivity.this.scaVTxtFld.setEnabled(sight.getId() == -999); RBSMainActivity.this.scaHTxtFld.setEnabled(sight.getId() == -999); RBSMainActivity.this.scVertScaleRngTxtFld.setEnabled(sight.getId() == -999); } @Override public void onNothingSelected(final AdapterView parent) { } }); } private void addTouchListeners() { // Scrollview muss den Swipe selbst handeln this.paramsScrollView.setOnTouchListener(new OnTouchListener() { private float downX, downY, upX, upY; @Override public boolean onTouch(final View v, final MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { this.downX = event.getX(); this.downY = event.getY(); } case MotionEvent.ACTION_UP: { this.upX = event.getX(); this.upY = event.getY(); float deltaX = this.upX - this.downX; float deltaY = this.upY - this.downY; // swipe from right to left ? if (deltaX < 0 && Math.abs(deltaX) > MIN_DISTANCE && Math.abs(deltaY) < MIN_DISTANCE) { // set the required Animation type to ViewFlipper // The Next screen will come in form Right and current Screen will go OUT to Left RBSMainActivity.this.viewFlipper.setInAnimation(RBSMainActivity.this, R.anim.in_from_right); RBSMainActivity.this.viewFlipper.setOutAnimation(RBSMainActivity.this, R.anim.out_to_left); // Show The Next Screen RBSMainActivity.this.viewFlipper.showNext(); deactivateXTextView(RBSMainActivity.this.txtViewParams); xTextViewUp(RBSMainActivity.this.txtViewResults); deactivateXTextView(RBSMainActivity.this.txtViewSight); } } } return false; } }); // Scrollview muss den Swipe selbst handeln this.sightCfgScrollView.setOnTouchListener(new OnTouchListener() { private float downX, downY, upX, upY; @Override public boolean onTouch(final View v, final MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { this.downX = event.getX(); this.downY = event.getY(); } case MotionEvent.ACTION_UP: { this.upX = event.getX(); this.upY = event.getY(); float deltaX = this.upX - this.downX; float deltaY = this.upY - this.downY; // swipe from left to right? if (deltaX > 0 && Math.abs(deltaX) > MIN_DISTANCE && Math.abs(deltaY) < MIN_DISTANCE) { // set the required Animation type to ViewFlipper // The Next screen will come in form Right and current Screen will go OUT to Left RBSMainActivity.this.viewFlipper.setInAnimation(RBSMainActivity.this, R.anim.in_from_left); RBSMainActivity.this.viewFlipper.setOutAnimation(RBSMainActivity.this, R.anim.out_to_right); // Show The Next Screen RBSMainActivity.this.viewFlipper.showPrevious(); deactivateXTextView(RBSMainActivity.this.txtViewSight); xTextViewUp(RBSMainActivity.this.txtViewResults); deactivateXTextView(RBSMainActivity.this.txtViewParams); } } } return false; } }); // Touchlistener für die oberen 3 Tabs OnTouchListener tabListener = new OnTouchListener() { @Override public boolean onTouch(final View v, final MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { deactivateXTextView(RBSMainActivity.this.txtViewParams); deactivateXTextView(RBSMainActivity.this.txtViewResults); deactivateXTextView(RBSMainActivity.this.txtViewSight); xTextViewDown((XTextView) v); return true; } case MotionEvent.ACTION_UP: { RBSMainActivity.this.viewFlipper.setInAnimation(RBSMainActivity.this, R.anim.in_from_right); RBSMainActivity.this.viewFlipper.setOutAnimation(RBSMainActivity.this, R.anim.out_to_left); if (v == RBSMainActivity.this.txtViewParams) { if (RBSMainActivity.this.viewFlipper.getDisplayedChild() != 0) { RBSMainActivity.this.viewFlipper.setDisplayedChild(0); } } else if (v == RBSMainActivity.this.txtViewResults) { if (RBSMainActivity.this.viewFlipper.getDisplayedChild() != 1) { RBSMainActivity.this.viewFlipper.setDisplayedChild(1); } } else { if (RBSMainActivity.this.viewFlipper.getDisplayedChild() != 2) { RBSMainActivity.this.viewFlipper.setDisplayedChild(2); } } xTextViewUp((XTextView) v); return true; } } return false; } }; // Touchlistener an Tabs anhängen this.txtViewParams.setOnTouchListener(tabListener); this.txtViewResults.setOnTouchListener(tabListener); this.txtViewSight.setOnTouchListener(tabListener); } @Override public boolean onPrepareOptionsMenu(final Menu menu) { int size = menu.size(); for (int i = size - 1; i >= 0; i--) { menu.removeItem(menu.getItem(i).getItemId()); } if (this.showInfoMenu) { this.showInfoMenu = false; getMenuInflater().inflate(R.menu.rbs_info_menu, menu); } else { getMenuInflater().inflate(R.menu.rbs_main, menu); } return true; } @Override public boolean onOptionsItemSelected(final MenuItem item) { // Handle item selection switch (item.getItemId()) { case R.id.chooseConfiguration: showDialog(DLG_CHOOSE_ARCHERYSETUP); return true; case R.id.doCalculation: calculate(); return true; case R.id.moreItems: this.showInfoMenu = true; closeOptionsMenu(); new Handler().post(new Runnable() { @Override public void run() { openOptionsMenu(); } }); return true; default: return super.onOptionsItemSelected(item); } } @Override public boolean onTouchEvent(final MotionEvent touchevent) { switch (touchevent.getAction()) { // when user first touches the screen to swap case MotionEvent.ACTION_DOWN: { this.lastX = touchevent.getX(); break; } case MotionEvent.ACTION_UP: { float currentX = touchevent.getX(); // if right to left swipe on screen if (this.lastX > currentX) { if (this.viewFlipper.getDisplayedChild() == 2) { break; } // set the required Animation type to ViewFlipper // The Next screen will come in form Right and current Screen will go OUT to Left this.viewFlipper.setInAnimation(this, R.anim.in_from_right); this.viewFlipper.setOutAnimation(this, R.anim.out_to_left); // Show The Next Screen this.viewFlipper.showNext(); } else if (this.lastX < currentX) { // if left to right swipe on screen // If no more View/Child to flip if (this.viewFlipper.getDisplayedChild() == 0) { break; } // set the required Animation type to ViewFlipper // The Next screen will come in form Left and current Screen will go OUT to Right this.viewFlipper.setInAnimation(this, R.anim.in_from_left); this.viewFlipper.setOutAnimation(this, R.anim.out_to_right); // Show the previous Screen this.viewFlipper.showPrevious(); } deactivateXTextView(RBSMainActivity.this.txtViewParams); deactivateXTextView(RBSMainActivity.this.txtViewResults); deactivateXTextView(RBSMainActivity.this.txtViewSight); switch (this.viewFlipper.getDisplayedChild()) { case 0: xTextViewUp(this.txtViewParams); break; case 1: xTextViewUp(this.txtViewResults); break; case 2: xTextViewUp(this.txtViewSight); break; default: break; } break; } } return false; } private void xTextViewDown(final XTextView view) { view.setDrawborderColor(getResources().getColor(R.color.android_blue_dark)); view.setTextColor(getResources().getColor(R.color.android_blue_dark)); } private void xTextViewUp(final XTextView view) { view.setDrawborderColor(getResources().getColor(R.color.android_blue)); view.setTextColor(getResources().getColor(R.color.android_blue)); } private void deactivateXTextView(final XTextView view) { view.setDrawborderColor(getResources().getColor(R.color.white)); view.setTextColor(getResources().getColor(R.color.white)); } @Override protected Dialog onCreateDialog(final int id) { return DialogFactory.createDialog(id, this); } @Override public void onArcherySetupDlgDismissed(final IArcherySetup archerySetup) { this.selectedArcherySetup = archerySetup; if (archerySetup != null) { if (archerySetup.getId() != -999) { this.arrowDiameterTxtFld.setText(archerySetup.getArrowDiameter().toString()); this.arrowCwTxtFld.setText(archerySetup.getArrowCw().toString()); this.arrowWeightTxtFld.setText(archerySetup.getArrowWeight().toString()); this.bowPulloutTxtFld.setText(archerySetup.getBowPullout().toString()); this.arrowV0TxtFld.setText(archerySetup.getArrowV0().toString()); this.arrowNockHeightTxtFld.setText(archerySetup.getArrowNockHeight().toString()); this.targetCenterHeightTxtFld.setText(archerySetup.getArrowCenterHeight().toString()); this.calcTimeIntervalCboBox.setSelectionByVal(archerySetup.getDeltaTime().toString()); this.calcAccuracyCboBox.setSelectionByVal(archerySetup.getCalcPrecision().toString()); this.scRiserSpinner.setSelectedRiser(archerySetup.getRiser()); this.scSightSpinner.setSelectedSight(archerySetup.getSight()); this.scVertScaleMiddleTxtFld.setText(archerySetup.getSightVertSkalaMiddle().toString()); } else { this.arrowDiameterTxtFld.setText(""); this.arrowDiameterTxtFld.setText(""); this.arrowCwTxtFld.setText(""); this.arrowWeightTxtFld.setText(""); this.bowPulloutTxtFld.setText(""); this.arrowV0TxtFld.setText(""); this.arrowNockHeightTxtFld.setText(""); this.targetCenterHeightTxtFld.setText(""); this.calcTimeIntervalCboBox.setSelectionByVal(""); this.calcAccuracyCboBox.setSelectionByVal(""); this.scRiserSpinner.setSelection(0); this.scSightSpinner.setSelection(0); this.scVertScaleMiddleTxtFld.setText(""); } } } private boolean allParamFieldsValid() { return !this.arrowDiameterTxtFld.getText().toString().isEmpty() && !this.arrowCwTxtFld.getText().toString().isEmpty() && !this.arrowWeightTxtFld.getText().toString().isEmpty() && !this.bowPulloutTxtFld.getText().toString().isEmpty() && !this.arrowV0TxtFld.getText().toString().isEmpty() && !this.airTemperatureTxtFld.getText().toString().isEmpty() && !this.airRelativeHumidityTxtFld.getText().toString().isEmpty() && !this.shootingDistanzTxtFld.getText().toString().isEmpty() && !this.arrowNockHeightTxtFld.getText().toString().isEmpty() && !this.targetCenterHeightTxtFld.getText().toString().isEmpty() && this.calcTimeIntervalCboBox.getSelectedItem() != null && this.calcAccuracyCboBox.getSelectedItem() != null && !this.scVvisHTxtFld.getText().toString().isEmpty() && !this.scVvisVTxtFld.getText().toString().isEmpty() && !this.scaHTxtFld.getText().toString().isEmpty() && !this.scaVTxtFld.getText().toString().isEmpty() && !this.scVertScaleRngTxtFld.getText().toString().isEmpty() && !this.scVertScaleMiddleTxtFld.getText().toString().isEmpty() && ((this.scHeVSSpinner.getVisibility() == View.VISIBLE && this.scHeVSSpinner.getSelectedItem() != null) || (this.scHeVSTxtFld.getVisibility() == View.VISIBLE && !this.scHeVSTxtFld.getText().toString().isEmpty())) && !this.scVertScaleMiddleTxtFld.getText().toString().isEmpty(); } /** * Startet die Berechnung wenn alle notwendigen Felder gefüllt sind. */ private void calculate() { if (allParamFieldsValid()) { // CALCULATION!! } else { Toast toast = Toast.makeText(this, getResources().getString(R.string.caption_FillAllMandatoryFields), Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } } }