Version für alte Androidversionen der Visiereinstellung für Recurvebogen.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

RBSMainActivity.java 48KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999
  1. package ch.spherIC.recurvebowsight;
  2. import android.app.Activity;
  3. import android.app.Dialog;
  4. import android.app.ProgressDialog;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.content.pm.ActivityInfo;
  8. import android.os.Bundle;
  9. import android.os.Handler;
  10. import android.text.Editable;
  11. import android.text.SpannableString;
  12. import android.text.Spanned;
  13. import android.text.TextWatcher;
  14. import android.text.style.TabStopSpan;
  15. import android.view.Gravity;
  16. import android.view.Menu;
  17. import android.view.MenuItem;
  18. import android.view.MotionEvent;
  19. import android.view.View;
  20. import android.view.View.OnClickListener;
  21. import android.view.View.OnTouchListener;
  22. import android.view.inputmethod.InputMethodManager;
  23. import android.widget.AdapterView;
  24. import android.widget.AdapterView.OnItemSelectedListener;
  25. import android.widget.Button;
  26. import android.widget.LinearLayout;
  27. import android.widget.LinearLayout.LayoutParams;
  28. import android.widget.ScrollView;
  29. import android.widget.TextView;
  30. import android.widget.Toast;
  31. import android.widget.ViewFlipper;
  32. import ch.spherIC.recurvebowsight.components.FlightCurveChart;
  33. import ch.spherIC.recurvebowsight.components.FontArrayAdapter;
  34. import ch.spherIC.recurvebowsight.components.FontTextView;
  35. import ch.spherIC.recurvebowsight.components.RiserSpinner;
  36. import ch.spherIC.recurvebowsight.components.SightSpinner;
  37. import ch.spherIC.recurvebowsight.components.XSpinner;
  38. import ch.spherIC.recurvebowsight.components.XTextView;
  39. import ch.spherIC.recurvebowsight.configuration.MainConfigurationActivity;
  40. import ch.spherIC.recurvebowsight.database.RBSDatabaseHelper;
  41. import ch.spherIC.recurvebowsight.database.dao.ArcherySetupDao;
  42. import ch.spherIC.recurvebowsight.database.dao.RiserDao;
  43. import ch.spherIC.recurvebowsight.database.dao.SightDao;
  44. import ch.spherIC.recurvebowsight.dialog.ChooseArcherySetupDlg.ChooseArcherySetupDlgDismissListener;
  45. import ch.spherIC.recurvebowsight.logic.CalculationTask;
  46. import ch.spherIC.recurvebowsight.logic.TrajectoryCalculator;
  47. import ch.spherIC.recurvebowsight.model.IArcherySetup;
  48. import ch.spherIC.recurvebowsight.model.IRiser;
  49. import ch.spherIC.recurvebowsight.model.ISight;
  50. import ch.spherIC.recurvebowsight.model.Riser;
  51. import ch.spherIC.recurvebowsight.model.Sight;
  52. import ch.spherIC.recurvebowsight.utilities.CompatibilityUtil;
  53. import ch.spherIC.recurvebowsight.utilities.PlatformUtils;
  54. import ch.spherIC.recurvebowsight.utilities.UnitConverter;
  55. import org.achartengine.GraphicalView;
  56. import org.achartengine.model.XYSeries;
  57. import java.text.DecimalFormat;
  58. import java.util.ArrayList;
  59. import java.util.List;
  60. import java.util.StringTokenizer;
  61. public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDismissListener, TrajectoryCalculation {
  62. public static final DecimalFormat DF = new DecimalFormat("0.##");
  63. public static final DecimalFormat DF_FC = new DecimalFormat("0.000");
  64. public static final DecimalFormat DF_1 = new DecimalFormat("0.00");
  65. public static final DecimalFormat DF_EVS = new DecimalFormat("0.#");
  66. public static final int DLG_CHOOSE_ARCHERYSETUP = 0;
  67. public static final int DLG_USERGUIDE_PARAMS = 1;
  68. public static final int DLG_USERGUIDE_SIGHT = 2;
  69. public static final int DLG_ABOUT = 3;
  70. private static final Double ANGLE_90 = 90d;
  71. private static final int MIN_DISTANCE = 50;
  72. private static final double CENTI = 0.01;
  73. private static final double MILLI = 0.001;
  74. private static final int MAX_TRAJ_POINTS = 200;
  75. private static final String DEF_TEMP = "23";
  76. private static final String DEF_HUMIDITY = "50";
  77. private static final String DEF_DISTANCE = "18";
  78. private ViewFlipper viewFlipper;
  79. private ScrollView paramsScrollView;
  80. private ScrollView sightCfgScrollView;
  81. private float lastX;
  82. private XTextView txtViewParams;
  83. private XTextView txtViewResults;
  84. private XTextView txtViewSight;
  85. private TextView arrowDiameterTxtFld;
  86. private TextView arrowCwTxtFld;
  87. private TextView arrowWeightTxtFld;
  88. private TextView bowPulloutTxtFld;
  89. private TextView arrowV0TxtFld;
  90. private TextView airTemperatureTxtFld;
  91. private TextView airRelativeHumidityTxtFld;
  92. private TextView shootingDistanzTxtFld;
  93. private TextView arrowNockHeightTxtFld;
  94. private TextView targetCenterHeightTxtFld;
  95. private XSpinner calcTimeIntervalCboBox;
  96. private XSpinner calcAccuracyCboBox;
  97. private RiserSpinner scRiserSpinner;
  98. private TextView scVvisHTxtFld;
  99. private TextView scVvisVTxtFld;
  100. private SightSpinner scSightSpinner;
  101. private XSpinner scHeVSSpinner;
  102. private TextView scHeVSTxtFld;
  103. private TextView scaVTxtFld;
  104. private TextView scaHTxtFld;
  105. private TextView scVertScaleRngTxtFld;
  106. private TextView scVertScaleMiddleTxtFld;
  107. private FontTextView scEvSValue;
  108. private Button calcSettingBtn;
  109. private XTextView flightCurveTxtFld;
  110. private boolean showInfoMenu;
  111. private IArcherySetup selectedArcherySetup;
  112. private Double startAngle;
  113. private String selectedHeVS;
  114. private ProgressDialog progressDialog;
  115. private FlightCurveChart flightCurveChart;
  116. @Override
  117. public void onCreate(final Bundle savedInstanceState) {
  118. super.onCreate(savedInstanceState);
  119. setContentView(R.layout.rbs_main);
  120. PlatformUtils.getPlatformSelectionColor(getApplicationContext());
  121. if (CompatibilityUtil.isTablet(getApplicationContext())) {
  122. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  123. } else {
  124. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  125. }
  126. UnitConverter.setApplication(getApplication());
  127. RBSDatabaseHelper.setContext(this);
  128. RBSDatabaseHelper.getInstance().initializeDB();
  129. initializeComponents();
  130. addTouchListeners();
  131. addValueChangeListeners();
  132. xTextViewUp(this.txtViewParams);
  133. this.calcTimeIntervalCboBox.setAdapter(new FontArrayAdapter<String>(this, R.layout.rbs_spinner,
  134. getResources().getStringArray(R.array.CalculationTimeIntervals),
  135. this.calcTimeIntervalCboBox));
  136. this.calcAccuracyCboBox.setAdapter(new FontArrayAdapter<String>(this, R.layout.rbs_spinner,
  137. getResources().getStringArray(R.array.CalculationAccuracies),
  138. this.calcAccuracyCboBox));
  139. List<IRiser> risers = RiserDao.getInstance().loadAll();
  140. risers.add(0, new Riser(-999, getResources().getString(R.string.caption_NoSelection), "", null, null, null));
  141. this.scRiserSpinner.setAdapter(new FontArrayAdapter<IRiser>(this, R.layout.rbs_spinner, risers, this.scRiserSpinner));
  142. List<ISight> sights = SightDao.getInstance().loadAll();
  143. sights.add(0, new Sight(-999, getResources().getString(R.string.caption_NoSelection), "", null, null, "", null, null));
  144. this.scSightSpinner.setAdapter(new FontArrayAdapter<ISight>(this, R.layout.rbs_spinner, sights, this.scSightSpinner));
  145. addRiserAndSightSpinnerListeners();
  146. GraphicalView flightCurveChartView;
  147. LinearLayout layout;
  148. this.flightCurveChart = new FlightCurveChart();
  149. flightCurveChartView = this.flightCurveChart.getView(this);
  150. layout = (LinearLayout) findViewById(R.id.ballisticResults);
  151. layout.addView(flightCurveChartView, 0, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0, 1f));
  152. }
  153. @Override
  154. protected void onSaveInstanceState(final Bundle outState) {
  155. super.onSaveInstanceState(outState);
  156. outState.putInt("ViewFlipper.SelectedView", this.viewFlipper.getDisplayedChild());
  157. if (this.selectedArcherySetup != null) {
  158. outState.putLong("SelectedArcherySetup", this.selectedArcherySetup.getId());
  159. }
  160. if (this.startAngle != null) {
  161. outState.putDouble("StartAngle", this.startAngle);
  162. }
  163. if (this.scHeVSSpinner.getSelectedItem() != null) {
  164. outState.putString("SelectedHeVS", this.scHeVSSpinner.getSelectedItem().toString());
  165. }
  166. }
  167. @Override
  168. protected void onRestoreInstanceState(final Bundle savedInstanceState) {
  169. super.onRestoreInstanceState(savedInstanceState);
  170. int selView = savedInstanceState.getInt("ViewFlipper.SelectedView", 0);
  171. this.viewFlipper.setDisplayedChild(selView);
  172. if (savedInstanceState.containsKey("SelectedArcherySetup")) {
  173. this.selectedArcherySetup = ArcherySetupDao.getInstance().loadById(savedInstanceState.getLong("SelectedArcherySetup"));
  174. }
  175. this.startAngle = savedInstanceState.getDouble("StartAngle");
  176. this.selectedHeVS = savedInstanceState.getString("SelectedHeVS");
  177. deactivateAllXTextView();
  178. switch (selView) {
  179. case 0:
  180. xTextViewUp(this.txtViewParams);
  181. break;
  182. case 1:
  183. xTextViewUp(this.txtViewResults);
  184. break;
  185. case 2:
  186. xTextViewUp(this.txtViewSight);
  187. break;
  188. default:
  189. break;
  190. }
  191. }
  192. private void initializeComponents() {
  193. this.viewFlipper = (ViewFlipper) findViewById(R.id.viewFlipper);
  194. this.paramsScrollView = (ScrollView) findViewById(R.id.paramsScrollView);
  195. this.sightCfgScrollView = (ScrollView) findViewById(R.id.sightCfgScrollView);
  196. this.txtViewParams = (XTextView) findViewById(R.id.viewParams);
  197. this.txtViewResults = (XTextView) findViewById(R.id.viewResults);
  198. this.txtViewSight = (XTextView) findViewById(R.id.viewSight);
  199. this.arrowDiameterTxtFld = (TextView) findViewById(R.id.arrowDiameterTxtFld);
  200. this.arrowCwTxtFld = (TextView) findViewById(R.id.arrowCwTxtFld);
  201. this.arrowWeightTxtFld = (TextView) findViewById(R.id.arrowWeightTxtFld);
  202. this.bowPulloutTxtFld = (TextView) findViewById(R.id.bowPulloutTxtFld);
  203. this.arrowV0TxtFld = (TextView) findViewById(R.id.arrowV0TxtFld);
  204. this.airTemperatureTxtFld = (TextView) findViewById(R.id.airTemperatureTxtFld);
  205. this.airRelativeHumidityTxtFld = (TextView) findViewById(R.id.airRelativeHumidityTxtFld);
  206. this.shootingDistanzTxtFld = (TextView) findViewById(R.id.shootingDistanzTxtFld);
  207. this.arrowNockHeightTxtFld = (TextView) findViewById(R.id.arrowNockHeightTxtFld);
  208. this.targetCenterHeightTxtFld = (TextView) findViewById(R.id.targetCenterHeightTxtFld);
  209. this.calcTimeIntervalCboBox = (XSpinner) findViewById(R.id.deltaTimeCboBox);
  210. this.calcAccuracyCboBox = (XSpinner) findViewById(R.id.calcPrecisionCboBox);
  211. this.scRiserSpinner = (RiserSpinner) findViewById(R.id.scRiserSpinner);
  212. this.scVvisHTxtFld = (TextView) findViewById(R.id.scVvisHTxtFld);
  213. this.scVvisVTxtFld = (TextView) findViewById(R.id.scVvisVTxtFld);
  214. this.scSightSpinner = (SightSpinner) findViewById(R.id.scSightSpinner);
  215. this.scHeVSSpinner = (XSpinner) findViewById(R.id.scHeVSSpinner);
  216. this.scHeVSTxtFld = (TextView) findViewById(R.id.scHeVSTxtFld);
  217. this.scaVTxtFld = (TextView) findViewById(R.id.scaVTxtFld);
  218. this.scaHTxtFld = (TextView) findViewById(R.id.scaHTxtFld);
  219. this.scVertScaleRngTxtFld = (TextView) findViewById(R.id.scVertScaleRngTxtFld);
  220. this.scVertScaleMiddleTxtFld = (TextView) findViewById(R.id.scVertSkalaMiddleTxtFld);
  221. this.scEvSValue = (FontTextView) findViewById(R.id.scEvSValue);
  222. this.flightCurveTxtFld = (XTextView) findViewById(R.id.flightCurveTxtFld);
  223. this.calcSettingBtn = (Button) findViewById(R.id.scBtnCalc);
  224. }
  225. private void addRiserAndSightSpinnerListeners() {
  226. this.scRiserSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
  227. @Override
  228. public void onItemSelected(final AdapterView<?> parent, final View view, final int position,
  229. final long id) {
  230. IRiser riser = RBSMainActivity.this.scRiserSpinner.getSelectedRiser();
  231. if (riser.getId() != -999) {
  232. RBSMainActivity.this.scVvisHTxtFld.setText(DF.format(riser.getVVisH()));
  233. RBSMainActivity.this.scVvisVTxtFld.setText(DF.format(riser.getVVisV()));
  234. } else {
  235. RBSMainActivity.this.scVvisHTxtFld.setText("");
  236. RBSMainActivity.this.scVvisVTxtFld.setText("");
  237. }
  238. RBSMainActivity.this.scVvisHTxtFld.setEnabled(riser.getId() == -999);
  239. RBSMainActivity.this.scVvisVTxtFld.setEnabled(riser.getId() == -999);
  240. }
  241. @Override
  242. public void onNothingSelected(final AdapterView<?> parent) { }
  243. });
  244. this.scSightSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
  245. @Override
  246. public void onItemSelected(final AdapterView<?> parent, final View view, final int position,
  247. final long id) {
  248. ISight sight = RBSMainActivity.this.scSightSpinner.getSelectedSight();
  249. if (sight.getId() != -999) {
  250. List<String> listHeVis = new ArrayList<String>();
  251. String heVis = sight.getHeVis();
  252. StringTokenizer t = new StringTokenizer(heVis, ",");
  253. while (t.hasMoreTokens()) {
  254. listHeVis.add(t.nextToken());
  255. }
  256. RBSMainActivity.this.scHeVSTxtFld.setVisibility(View.INVISIBLE);
  257. RBSMainActivity.this.scHeVSTxtFld.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSTxtFld
  258. .getLayoutParams().width,
  259. RBSMainActivity.this.scHeVSTxtFld
  260. .getLayoutParams().height, 0f));
  261. RBSMainActivity.this.scHeVSSpinner.setVisibility(View.VISIBLE);
  262. LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSSpinner.getLayoutParams().width,
  263. RBSMainActivity.this.scHeVSSpinner.getLayoutParams().height,
  264. 1f);
  265. params.gravity = Gravity.FILL_VERTICAL;
  266. RBSMainActivity.this.scHeVSSpinner.setLayoutParams(params);
  267. RBSMainActivity.this.scHeVSSpinner.setAdapter(new FontArrayAdapter<String>(RBSMainActivity.this, R.layout.rbs_spinner,
  268. listHeVis, RBSMainActivity.this.scHeVSSpinner));
  269. if (RBSMainActivity.this.selectedHeVS == null) {
  270. if (RBSMainActivity.this.selectedArcherySetup != null
  271. && RBSMainActivity.this.selectedArcherySetup.getSight().getId() == sight.getId()) {
  272. RBSMainActivity.this.scHeVSSpinner.setSelectionByVal(DF.format(RBSMainActivity.this.selectedArcherySetup
  273. .getSightHorSetting()));
  274. }
  275. } else {
  276. RBSMainActivity.this.scHeVSSpinner.setSelectionByVal(RBSMainActivity.this.selectedHeVS);
  277. }
  278. RBSMainActivity.this.scaVTxtFld.setText(DF.format(sight.getAV()));
  279. RBSMainActivity.this.scaHTxtFld.setText(DF.format(sight.getAH()));
  280. RBSMainActivity.this.scVertScaleRngTxtFld.setText(DF.format(sight.getVertSkalaRangeMin()) + "-"
  281. + DF.format(sight.getVertSkalaRangeMax()));
  282. } else {
  283. RBSMainActivity.this.scHeVSSpinner.setVisibility(View.INVISIBLE);
  284. RBSMainActivity.this.scHeVSSpinner.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSSpinner
  285. .getLayoutParams().width,
  286. RBSMainActivity.this.scHeVSSpinner
  287. .getLayoutParams().height, 0f));
  288. RBSMainActivity.this.scHeVSTxtFld.setVisibility(View.VISIBLE);
  289. RBSMainActivity.this.scHeVSTxtFld.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSTxtFld
  290. .getLayoutParams().width,
  291. RBSMainActivity.this.scHeVSTxtFld
  292. .getLayoutParams().height, 1f));
  293. RBSMainActivity.this.scHeVSSpinner.setAdapter(new FontArrayAdapter<String>(RBSMainActivity.this, R.layout.rbs_spinner,
  294. new ArrayList<String>(),
  295. RBSMainActivity.this.scHeVSSpinner));
  296. RBSMainActivity.this.scaVTxtFld.setText("");
  297. RBSMainActivity.this.scaHTxtFld.setText("");
  298. RBSMainActivity.this.scVertScaleRngTxtFld.setText("");
  299. }
  300. RBSMainActivity.this.scaVTxtFld.setEnabled(sight.getId() == -999);
  301. RBSMainActivity.this.scaHTxtFld.setEnabled(sight.getId() == -999);
  302. RBSMainActivity.this.scVertScaleRngTxtFld.setEnabled(sight.getId() == -999);
  303. }
  304. @Override
  305. public void onNothingSelected(final AdapterView<?> parent) { }
  306. });
  307. }
  308. private void addTouchListeners() {
  309. // Scrollview muss den Swipe selbst handeln
  310. this.paramsScrollView.setOnTouchListener(new OnTouchListener() {
  311. private float downX, downY, upX, upY;
  312. @Override
  313. public boolean onTouch(final View v, final MotionEvent event) {
  314. switch (event.getAction()) {
  315. case MotionEvent.ACTION_DOWN: {
  316. this.downX = event.getX();
  317. this.downY = event.getY();
  318. }
  319. case MotionEvent.ACTION_UP: {
  320. this.upX = event.getX();
  321. this.upY = event.getY();
  322. float deltaX = this.upX - this.downX;
  323. float deltaY = this.upY - this.downY;
  324. // swipe from right to left ?
  325. if (deltaX < 0 && Math.abs(deltaX) > MIN_DISTANCE && Math.abs(deltaY) < MIN_DISTANCE) {
  326. // set the required Animation type to ViewFlipper
  327. // The Next screen will come in form Right and current Screen will go OUT to Left
  328. RBSMainActivity.this.viewFlipper.setInAnimation(RBSMainActivity.this, R.anim.in_from_right);
  329. RBSMainActivity.this.viewFlipper.setOutAnimation(RBSMainActivity.this, R.anim.out_to_left);
  330. // Show The Next Screen
  331. RBSMainActivity.this.viewFlipper.showNext();
  332. deactivateXTextView(RBSMainActivity.this.txtViewParams);
  333. xTextViewUp(RBSMainActivity.this.txtViewResults);
  334. deactivateXTextView(RBSMainActivity.this.txtViewSight);
  335. }
  336. }
  337. }
  338. return false;
  339. }
  340. });
  341. // Scrollview muss den Swipe selbst handeln
  342. this.sightCfgScrollView.setOnTouchListener(new OnTouchListener() {
  343. private float downX, downY, upX, upY;
  344. @Override
  345. public boolean onTouch(final View v, final MotionEvent event) {
  346. switch (event.getAction()) {
  347. case MotionEvent.ACTION_DOWN: {
  348. this.downX = event.getX();
  349. this.downY = event.getY();
  350. }
  351. case MotionEvent.ACTION_UP: {
  352. this.upX = event.getX();
  353. this.upY = event.getY();
  354. float deltaX = this.upX - this.downX;
  355. float deltaY = this.upY - this.downY;
  356. // swipe from left to right?
  357. if (deltaX > 0 && Math.abs(deltaX) > MIN_DISTANCE && Math.abs(deltaY) < MIN_DISTANCE) {
  358. // set the required Animation type to ViewFlipper
  359. // The Next screen will come in form Right and current Screen will go OUT to Left
  360. RBSMainActivity.this.viewFlipper.setInAnimation(RBSMainActivity.this, R.anim.in_from_left);
  361. RBSMainActivity.this.viewFlipper.setOutAnimation(RBSMainActivity.this, R.anim.out_to_right);
  362. // Show The Next Screen
  363. RBSMainActivity.this.viewFlipper.showPrevious();
  364. deactivateXTextView(RBSMainActivity.this.txtViewSight);
  365. xTextViewUp(RBSMainActivity.this.txtViewResults);
  366. deactivateXTextView(RBSMainActivity.this.txtViewParams);
  367. }
  368. }
  369. }
  370. return false;
  371. }
  372. });
  373. // Touchlistener für die oberen 3 Tabs
  374. OnTouchListener tabListener = new OnTouchListener() {
  375. @Override
  376. public boolean onTouch(final View v, final MotionEvent event) {
  377. switch (event.getAction()) {
  378. case MotionEvent.ACTION_DOWN: {
  379. deactivateAllXTextView();
  380. xTextViewDown((XTextView) v);
  381. return true;
  382. }
  383. case MotionEvent.ACTION_UP: {
  384. RBSMainActivity.this.viewFlipper.setInAnimation(RBSMainActivity.this, R.anim.in_from_right);
  385. RBSMainActivity.this.viewFlipper.setOutAnimation(RBSMainActivity.this, R.anim.out_to_left);
  386. if (v == RBSMainActivity.this.txtViewParams) {
  387. if (RBSMainActivity.this.viewFlipper.getDisplayedChild() != 0) {
  388. RBSMainActivity.this.viewFlipper.setDisplayedChild(0);
  389. }
  390. } else if (v == RBSMainActivity.this.txtViewResults) {
  391. if (RBSMainActivity.this.viewFlipper.getDisplayedChild() != 1) {
  392. RBSMainActivity.this.viewFlipper.setDisplayedChild(1);
  393. }
  394. } else {
  395. if (RBSMainActivity.this.viewFlipper.getDisplayedChild() != 2) {
  396. RBSMainActivity.this.viewFlipper.setDisplayedChild(2);
  397. }
  398. }
  399. xTextViewUp((XTextView) v);
  400. return true;
  401. }
  402. }
  403. return false;
  404. }
  405. };
  406. // Touchlistener an Tabs anhängen
  407. this.txtViewParams.setOnTouchListener(tabListener);
  408. this.txtViewResults.setOnTouchListener(tabListener);
  409. this.txtViewSight.setOnTouchListener(tabListener);
  410. this.calcSettingBtn.setOnClickListener(new OnClickListener() {
  411. @Override
  412. public void onClick(final View v) {
  413. calculateSettings();
  414. }
  415. });
  416. }
  417. private void addValueChangeListeners() {
  418. this.arrowV0TxtFld.addTextChangedListener(new TextWatcher() {
  419. @Override
  420. public void onTextChanged(final CharSequence s, final int start, final int before, final int count) { }
  421. @Override
  422. public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) { }
  423. @Override
  424. public void afterTextChanged(final Editable s) {
  425. if (!RBSMainActivity.this.arrowV0TxtFld.getText().toString().isEmpty()
  426. && !RBSMainActivity.this.shootingDistanzTxtFld.getText().toString().isEmpty()) {
  427. calculateAndSetPerformantAccuracy(Double.valueOf(RBSMainActivity.this.arrowV0TxtFld.getText().toString()),
  428. Double.valueOf(RBSMainActivity.this.shootingDistanzTxtFld.getText().toString()));
  429. }
  430. }
  431. });
  432. this.shootingDistanzTxtFld.addTextChangedListener(new TextWatcher() {
  433. @Override
  434. public void onTextChanged(final CharSequence s, final int start, final int before, final int count) { }
  435. @Override
  436. public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) { }
  437. @Override
  438. public void afterTextChanged(final Editable s) {
  439. if (!RBSMainActivity.this.arrowV0TxtFld.getText().toString().isEmpty()
  440. && !RBSMainActivity.this.shootingDistanzTxtFld.getText().toString().isEmpty()) {
  441. calculateAndSetPerformantAccuracy(Double.valueOf(RBSMainActivity.this.arrowV0TxtFld.getText().toString()),
  442. Double.valueOf(RBSMainActivity.this.shootingDistanzTxtFld.getText().toString()));
  443. }
  444. }
  445. });
  446. }
  447. @Override
  448. public boolean onPrepareOptionsMenu(final Menu menu) {
  449. int size = menu.size();
  450. for (int i = size - 1; i >= 0; i--) {
  451. menu.removeItem(menu.getItem(i).getItemId());
  452. }
  453. if (this.showInfoMenu) {
  454. this.showInfoMenu = false;
  455. getMenuInflater().inflate(R.menu.rbs_info_menu, menu);
  456. } else {
  457. getMenuInflater().inflate(R.menu.rbs_main, menu);
  458. }
  459. return true;
  460. }
  461. @Override
  462. public boolean onOptionsItemSelected(final MenuItem item) {
  463. // Handle item selection
  464. switch (item.getItemId()) {
  465. case R.id.chooseConfiguration:
  466. showDialog(DLG_CHOOSE_ARCHERYSETUP);
  467. return true;
  468. case R.id.doCalculation:
  469. calculate();
  470. return true;
  471. case R.id.addConfiguration:
  472. Intent intent = new Intent(RBSMainActivity.this, MainConfigurationActivity.class);
  473. startActivity(intent);
  474. return true;
  475. case R.id.moreItems:
  476. this.showInfoMenu = true;
  477. closeOptionsMenu();
  478. new Handler().post(new Runnable() {
  479. @Override
  480. public void run() {
  481. openOptionsMenu();
  482. }
  483. });
  484. return true;
  485. default:
  486. return super.onOptionsItemSelected(item);
  487. }
  488. }
  489. @Override
  490. public boolean onTouchEvent(final MotionEvent touchevent) {
  491. switch (touchevent.getAction()) {
  492. // when user first touches the screen to swap
  493. case MotionEvent.ACTION_DOWN: {
  494. this.lastX = touchevent.getX();
  495. break;
  496. }
  497. case MotionEvent.ACTION_UP: {
  498. float currentX = touchevent.getX();
  499. // if right to left swipe on screen
  500. if (this.lastX > currentX) {
  501. if (this.viewFlipper.getDisplayedChild() == 2) {
  502. break;
  503. }
  504. // set the required Animation type to ViewFlipper
  505. // The Next screen will come in form Right and current Screen will go OUT to Left
  506. this.viewFlipper.setInAnimation(this, R.anim.in_from_right);
  507. this.viewFlipper.setOutAnimation(this, R.anim.out_to_left);
  508. // Show The Next Screen
  509. this.viewFlipper.showNext();
  510. } else if (this.lastX < currentX) { // if left to right swipe on screen
  511. // If no more View/Child to flip
  512. if (this.viewFlipper.getDisplayedChild() == 0) {
  513. break;
  514. }
  515. // set the required Animation type to ViewFlipper
  516. // The Next screen will come in form Left and current Screen will go OUT to Right
  517. this.viewFlipper.setInAnimation(this, R.anim.in_from_left);
  518. this.viewFlipper.setOutAnimation(this, R.anim.out_to_right);
  519. // Show the previous Screen
  520. this.viewFlipper.showPrevious();
  521. }
  522. deactivateAllXTextView();
  523. switch (this.viewFlipper.getDisplayedChild()) {
  524. case 0:
  525. xTextViewUp(this.txtViewParams);
  526. break;
  527. case 1:
  528. xTextViewUp(this.txtViewResults);
  529. break;
  530. case 2:
  531. xTextViewUp(this.txtViewSight);
  532. break;
  533. default:
  534. break;
  535. }
  536. break;
  537. }
  538. }
  539. return false;
  540. }
  541. private void xTextViewDown(final XTextView view) {
  542. view.setDrawborderColor(getResources().getColor(R.color.android_yellow_dark));
  543. view.setTextColor(getResources().getColor(R.color.android_yellow_dark));
  544. }
  545. private void xTextViewUp(final XTextView view) {
  546. view.setDrawborderColor(getResources().getColor(R.color.android_yellow));
  547. view.setTextColor(getResources().getColor(R.color.android_yellow));
  548. }
  549. private void deactivateXTextView(final XTextView view) {
  550. view.setDrawborderColor(getResources().getColor(R.color.white));
  551. view.setTextColor(getResources().getColor(R.color.white));
  552. }
  553. private void deactivateAllXTextView() {
  554. deactivateXTextView(this.txtViewParams);
  555. deactivateXTextView(this.txtViewResults);
  556. deactivateXTextView(this.txtViewSight);
  557. }
  558. @Override
  559. protected Dialog onCreateDialog(final int id) {
  560. return DialogFactory.createDialog(id, this);
  561. }
  562. @Override
  563. public void onArcherySetupDlgDismissed(final IArcherySetup archerySetup) {
  564. this.selectedArcherySetup = archerySetup;
  565. if (archerySetup != null && archerySetup.getId() != -999) {
  566. this.arrowDiameterTxtFld.setText(DF.format(archerySetup.getArrowDiameter()));
  567. this.arrowCwTxtFld.setText(DF.format(archerySetup.getArrowCw()));
  568. this.arrowWeightTxtFld.setText(DF.format(archerySetup.getArrowWeight()));
  569. this.bowPulloutTxtFld.setText(DF.format(archerySetup.getBowPullout()));
  570. this.arrowV0TxtFld.setText(DF.format(archerySetup.getArrowV0()));
  571. this.arrowNockHeightTxtFld.setText(DF_1.format(archerySetup.getArrowNockHeight()));
  572. this.targetCenterHeightTxtFld.setText(DF_1.format(archerySetup.getArrowCenterHeight()));
  573. this.calcTimeIntervalCboBox.setSelectionByVal(archerySetup.getDeltaTime().toString());
  574. this.calcAccuracyCboBox.setSelectionByVal(archerySetup.getCalcPrecision().toString());
  575. this.scRiserSpinner.setSelectedRiser(archerySetup.getRiser());
  576. this.scRiserSpinner.fireSelectionChangedEvent();
  577. this.scSightSpinner.setSelectedSight(archerySetup.getSight());
  578. this.scSightSpinner.fireSelectionChangedEvent();
  579. this.scVertScaleMiddleTxtFld.setText(DF.format(archerySetup.getSightVertSkalaMiddle()));
  580. this.airTemperatureTxtFld.setText(DEF_TEMP);
  581. this.airRelativeHumidityTxtFld.setText(DEF_HUMIDITY);
  582. this.shootingDistanzTxtFld.setText(DEF_DISTANCE);
  583. } else {
  584. this.arrowDiameterTxtFld.setText("");
  585. this.arrowDiameterTxtFld.setText("");
  586. this.arrowCwTxtFld.setText("");
  587. this.arrowWeightTxtFld.setText("");
  588. this.bowPulloutTxtFld.setText("");
  589. this.arrowV0TxtFld.setText("");
  590. this.arrowNockHeightTxtFld.setText("");
  591. this.targetCenterHeightTxtFld.setText("");
  592. this.calcTimeIntervalCboBox.setSelectionByVal("");
  593. this.calcAccuracyCboBox.setSelectionByVal("");
  594. this.scRiserSpinner.setSelection(0);
  595. this.scRiserSpinner.fireSelectionChangedEvent();
  596. this.scSightSpinner.setSelection(0);
  597. this.scSightSpinner.fireSelectionChangedEvent();
  598. this.scVertScaleMiddleTxtFld.setText("");
  599. }
  600. }
  601. private boolean allParamFieldsValid() {
  602. return !this.arrowDiameterTxtFld.getText().toString().isEmpty()
  603. && !this.arrowCwTxtFld.getText().toString().isEmpty()
  604. && !this.arrowWeightTxtFld.getText().toString().isEmpty()
  605. && !this.bowPulloutTxtFld.getText().toString().isEmpty()
  606. && !this.arrowV0TxtFld.getText().toString().isEmpty()
  607. && !this.airTemperatureTxtFld.getText().toString().isEmpty()
  608. && !this.airRelativeHumidityTxtFld.getText().toString().isEmpty()
  609. && !this.shootingDistanzTxtFld.getText().toString().isEmpty()
  610. && !this.arrowNockHeightTxtFld.getText().toString().isEmpty()
  611. && !this.targetCenterHeightTxtFld.getText().toString().isEmpty()
  612. && this.calcTimeIntervalCboBox.getSelectedItem() != null
  613. && this.calcAccuracyCboBox.getSelectedItem() != null
  614. && allSightParamFieldsValid();
  615. }
  616. private boolean allSightParamFieldsValid() {
  617. return !this.scVvisHTxtFld.getText().toString().isEmpty()
  618. && !this.scVvisVTxtFld.getText().toString().isEmpty()
  619. && !this.scaHTxtFld.getText().toString().isEmpty()
  620. && !this.scaVTxtFld.getText().toString().isEmpty()
  621. && !this.scVertScaleRngTxtFld.getText().toString().isEmpty()
  622. && ((this.scHeVSSpinner.getVisibility() == View.VISIBLE && this.scHeVSSpinner.getSelectedItem() != null)
  623. || (this.scHeVSTxtFld.getVisibility() == View.VISIBLE && !this.scHeVSTxtFld.getText().toString().isEmpty()))
  624. && !this.scVertScaleMiddleTxtFld.getText().toString().isEmpty();
  625. }
  626. /**
  627. * Startet die Berechnung wenn alle notwendigen Felder gefüllt sind.
  628. */
  629. private void calculate() {
  630. if (allParamFieldsValid()) {
  631. InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
  632. if (getCurrentFocus() != null) {
  633. imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
  634. }
  635. this.progressDialog = ProgressDialog.show(this, null, getResources().getString(R.string.caption_Calculating), true, false);
  636. CalculationTask calcTask = new CalculationTask();
  637. TrajectoryCalculator calculator = new TrajectoryCalculator(Double.valueOf(this.arrowDiameterTxtFld.getText().toString().trim()) * MILLI, //
  638. Double.valueOf(this.arrowCwTxtFld.getText().toString().trim()), //
  639. Double.valueOf(this.arrowWeightTxtFld.getText().toString().trim()) * MILLI, //
  640. Double.valueOf(this.arrowV0TxtFld.getText().toString().trim()), //
  641. Double.valueOf(this.shootingDistanzTxtFld.getText().toString().trim()), //
  642. Double.valueOf(this.targetCenterHeightTxtFld.getText().toString().trim())
  643. - Double.valueOf(this.arrowNockHeightTxtFld.getText().toString().trim()), //
  644. Double.valueOf(this.airTemperatureTxtFld.getText().toString().trim()), //
  645. Double.valueOf(this.airRelativeHumidityTxtFld.getText().toString().trim())
  646. * CENTI, //
  647. Double.valueOf(this.calcTimeIntervalCboBox.getSelectedItem().toString().trim()), //
  648. Double.valueOf(this.calcAccuracyCboBox.getSelectedItem().toString().trim())
  649. * CENTI, //
  650. this);
  651. calculator.setStartAngle(0d);
  652. calcTask.execute(calculator);
  653. } else {
  654. Toast toast = Toast.makeText(this, getResources().getString(R.string.caption_FillAllMandatoryFields), Toast.LENGTH_LONG);
  655. toast.setGravity(Gravity.CENTER, 0, 0);
  656. toast.show();
  657. }
  658. }
  659. @Override
  660. public void updateTrajectoryTxtFld(final Integer step, final Double[] flightCurveRow, final Double startAngle, final Double[] maxHCurve) {
  661. int width = this.flightCurveTxtFld.getMeasuredWidth();
  662. Double[] r1 = flightCurveRow;
  663. switch (step) {
  664. case 0:
  665. this.flightCurveTxtFld.setText("");
  666. this.flightCurveTxtFld.append(getResources().getString(R.string.fcChart_StartAngle) + DF_FC.format(startAngle) + " °\n\n");
  667. this.flightCurveTxtFld.append(getResources().getString(R.string.fcChart_MaxHeight) + DF_FC.format(maxHCurve[0])
  668. + " m / "
  669. + DF_FC.format(maxHCurve[0] + Double.valueOf(this.arrowNockHeightTxtFld.getText().toString().trim()))
  670. + " m, [t = " + DF_FC.format(maxHCurve[1]) + " s]\n\n");
  671. this.flightCurveTxtFld.append(getResources().getString(R.string.fcChart_FlightDuration)
  672. + DF_FC.format(r1[TrajectoryCalculator.IDX_T])
  673. + " sec\n\n");
  674. SpannableString line = new SpannableString("t [sec]\tVx [m/s]\tVy [m/s]\tx [m]\ty [m]\n\n");
  675. line.setSpan(new TabStopSpan.Standard(width / 5), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  676. line.setSpan(new TabStopSpan.Standard(width / 5 * 2), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  677. line.setSpan(new TabStopSpan.Standard(width / 5 * 3), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  678. line.setSpan(new TabStopSpan.Standard(width / 5 * 4), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  679. this.flightCurveTxtFld.append(line);
  680. break;
  681. case 1:
  682. line = new SpannableString(DF_FC.format(r1[TrajectoryCalculator.IDX_T]) + '\t'
  683. + DF_FC.format(r1[TrajectoryCalculator.IDX_VX]) + '\t'
  684. + DF_FC.format(r1[TrajectoryCalculator.IDX_VY]) + '\t'
  685. + DF_FC.format(r1[TrajectoryCalculator.IDX_X]) + '\t'
  686. + DF_FC.format(r1[TrajectoryCalculator.IDX_Y]) + "\n");
  687. line.setSpan(new TabStopSpan.Standard(width / 5), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  688. line.setSpan(new TabStopSpan.Standard(width / 5 * 2), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  689. line.setSpan(new TabStopSpan.Standard(width / 5 * 3), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  690. line.setSpan(new TabStopSpan.Standard(width / 5 * 4), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  691. this.flightCurveTxtFld.append(line);
  692. break;
  693. default:
  694. break;
  695. }
  696. }
  697. @Override
  698. public void onCalculationDone(final Double[][] flightCurve, final Double startAngle, final Double[] maxHCurve) {
  699. this.startAngle = startAngle;
  700. updateFlightCurveChart(flightCurve);
  701. calculateSettings();
  702. if (this.progressDialog != null) {
  703. this.progressDialog.dismiss();
  704. }
  705. this.txtViewSight.doSingleTouch();
  706. }
  707. /**
  708. * @param flightCurve
  709. */
  710. private void updateFlightCurveChart(final Double[][] flightCurve) {
  711. XYSeries serie = new XYSeries(getApplicationContext().getResources().getString(R.string.fcChart_TitleLable));
  712. for (int i = 0; i < flightCurve.length; i++) {
  713. serie.add(flightCurve[i][TrajectoryCalculator.IDX_X], flightCurve[i][TrajectoryCalculator.IDX_Y]);
  714. }
  715. this.flightCurveChart.getDataSet().removeSeries(0);
  716. this.flightCurveChart.getDataSet().addSeries(0, serie);
  717. this.flightCurveChart.updateRendererAfterCalculation(flightCurve[flightCurve.length - 1][TrajectoryCalculator.IDX_X], flightCurve);
  718. }
  719. /**
  720. * Berechnet die definitve Visiereinstellung anhand des berechneten Flugbahnwinkels.
  721. */
  722. private void calculateSettings() {
  723. if (allSightParamFieldsValid() && this.selectedArcherySetup != null && this.startAngle != null) {
  724. Double x0;
  725. Double y0;
  726. Double x1;
  727. Double y1;
  728. Double x2;
  729. Double y2;
  730. Double x3;
  731. Double y3;
  732. Double r;
  733. Double s;
  734. Double vVh = Double.valueOf(this.scVvisHTxtFld.getText().toString()) + Double.valueOf(this.scaHTxtFld.getText().toString());
  735. Double vVv = Double.valueOf(this.scVvisVTxtFld.getText().toString()) + Double.valueOf(this.scaVTxtFld.getText().toString());
  736. Double a = Double.valueOf(this.bowPulloutTxtFld.getText().toString()) * 10;
  737. Double heVs = this.scHeVSSpinner.getVisibility() == View.VISIBLE ? Double.valueOf(this.scHeVSSpinner.getSelectedItem().toString())
  738. : Double.valueOf(this.scHeVSTxtFld.getText().toString());
  739. Double lhNA = this.selectedArcherySetup.getHNA() * 10;
  740. Double dltH = (Double.valueOf(this.targetCenterHeightTxtFld.getText().toString())
  741. - Double.valueOf(this.arrowNockHeightTxtFld.getText().toString())) * Math.pow(10, 3);
  742. Double ldistH = Double.valueOf(this.shootingDistanzTxtFld.getText().toString()) * Math.pow(10, 3);
  743. Double minSkala = this.scVertScaleRngTxtFld.getText().toString().contains("-")
  744. ? Double.valueOf(this.scVertScaleRngTxtFld.getText().toString().substring(0,
  745. this.scVertScaleRngTxtFld.getText().toString()
  746. .indexOf('-'))) : 0d;
  747. Double maxSkala = this.scVertScaleRngTxtFld.getText().toString().contains("-")
  748. ? Double.valueOf(this.scVertScaleRngTxtFld.getText().toString().substring(this.scVertScaleRngTxtFld.getText().toString()
  749. .indexOf('-') + 1,
  750. this.scVertScaleRngTxtFld.getText().toString()
  751. .length())) : 0d;
  752. // PIN auf Höhe Pfeil
  753. x0 = (a + vVh + heVs) * Math.cos(Math.toRadians(this.startAngle));
  754. y0 = (a + vVh + heVs) * Math.sin(Math.toRadians(this.startAngle));
  755. // PIN auf Höhe Horizontalschlitten Visier
  756. x2 = x0 + vVv * Math.cos(Math.toRadians(ANGLE_90 + this.startAngle));
  757. y2 = y0 + vVv * Math.sin(Math.toRadians(ANGLE_90 + this.startAngle));
  758. // Schnittpunkt der Achse Horizontalschlitten Visier mit Achse Befestigungslöcher Visier
  759. x3 = (a + vVh) * Math.cos(Math.toRadians(this.startAngle)) + vVv * Math.cos(Math.toRadians(ANGLE_90 + this.startAngle));
  760. y3 = (a + vVh) * Math.sin(Math.toRadians(this.startAngle)) + vVv * Math.sin(Math.toRadians(ANGLE_90 + this.startAngle));
  761. // Unbekannte der Vektorgeradengleichung
  762. r = (lhNA * (x0 - x2) - x0 * y2 + x2 * y0) / (ldistH * (y0 - y2) + (dltH - lhNA) * (x2 - x0));
  763. s = -((ldistH * (lhNA - y0) + (dltH - lhNA) * x0) / (ldistH * (y0 - y2) + (dltH - lhNA) * (x2 - x0)));
  764. // Pin auf Visierlinie
  765. x1 = r * ldistH;
  766. y1 = lhNA + r * (dltH - lhNA);
  767. // Unten (+) oder oben (-) von (x2/y2) ?
  768. Double n = ((y2 - y3) * (x1 - x3) - (x2 - x3) * (y1 - y3)) < 0 ? -1.0 : 1.0;
  769. // Abstand P1 - P2
  770. Double d = Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) * n;
  771. // Einstellung auf vert. Skala
  772. Double sV = Double.valueOf(this.scVertScaleMiddleTxtFld.getText().toString()) + d;
  773. this.scEvSValue.setText(DF_EVS.format(sV));
  774. if (minSkala <= sV && sV <= maxSkala) {
  775. this.scEvSValue.setBackgroundDrawable(getResources().getDrawable(R.drawable.evs_ok_background));
  776. } else {
  777. this.scEvSValue.setBackgroundDrawable(getResources().getDrawable(R.drawable.evs_nok_background));
  778. }
  779. } else {
  780. this.scEvSValue.setText("");
  781. Toast toast = Toast.makeText(this, getResources().getString(R.string.caption_FillAllMandatoryFields), Toast.LENGTH_LONG);
  782. toast.setGravity(Gravity.CENTER, 0, 0);
  783. toast.show();
  784. }
  785. }
  786. private void calculateAndSetPerformantAccuracy(final Double v0, final Double shootingDistance) {
  787. String[] calcAccuracies = getResources().getStringArray(R.array.CalculationTimeIntervals);
  788. String calcAccuracyToSet = calcAccuracies[calcAccuracies.length - 1];
  789. Double approxFlightTime = shootingDistance / v0;
  790. Double approxIntervalTime = approxFlightTime / MAX_TRAJ_POINTS;
  791. for (int i = 0; i < calcAccuracies.length - 1; i++) {
  792. Double accLow = Double.valueOf(calcAccuracies[i]);
  793. Double accHigh = Double.valueOf(calcAccuracies[i + 1]);
  794. if (accHigh < approxIntervalTime && approxIntervalTime <= accLow) {
  795. calcAccuracyToSet = calcAccuracies[i];
  796. break;
  797. }
  798. }
  799. this.calcTimeIntervalCboBox.setSelectionByVal(calcAccuracyToSet);
  800. }
  801. }