Version für alte Androidversionen der Visiereinstellung für Recurvebogen.
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

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. }