Reimplement motor handling so the android application relies more heavily on the...
[debian/openrocket] / android / src / net / sf / openrocket / android / thrustcurve / TCQueryActivity.java
1 package net.sf.openrocket.android.thrustcurve;\r
2 \r
3 import net.sf.openrocket.R;\r
4 import net.sf.openrocket.android.db.DbAdapter;\r
5 import net.sf.openrocket.android.motor.ExtendedThrustCurveMotor;\r
6 import android.app.Activity;\r
7 import android.app.AlertDialog;\r
8 import android.app.ProgressDialog;\r
9 import android.content.DialogInterface;\r
10 import android.os.Bundle;\r
11 import android.os.Handler;\r
12 import android.util.Log;\r
13 import android.view.View;\r
14 import android.widget.Button;\r
15 import android.widget.EditText;\r
16 import android.widget.Spinner;\r
17 \r
18 public class TCQueryActivity extends Activity {\r
19 \r
20         private static final String TAG = "ThrustCurveQueryActivity";\r
21 \r
22         private DbAdapter mDbHelper;\r
23 \r
24         private ProgressDialog progress;\r
25         private Thread downloadThread;\r
26         private Handler handler;\r
27 \r
28         @Override\r
29         protected void onCreate(Bundle savedInstanceState) {\r
30                 super.onCreate(savedInstanceState);\r
31                 setContentView(R.layout.tcqueryform);\r
32 \r
33                 mDbHelper = new DbAdapter(this);\r
34                 mDbHelper.open();\r
35 \r
36                 final Spinner manufacturerField = (Spinner) findViewById(R.id.TCMotorSearchFormManufacturerField);\r
37                 final Spinner impulseField = (Spinner) findViewById(R.id.TCMotorSearchFormImpulseField);\r
38                 final Spinner diameterField = (Spinner) findViewById(R.id.TCMotorSearchFormDiameterField);\r
39                 final EditText commonNameField = (EditText) findViewById(R.id.TCMotorSearchFormCommonNameField);\r
40 \r
41                 Button submitButton = (Button) findViewById(R.id.TCMotorSearchFromSubmitButton);\r
42                 submitButton.setOnClickListener(\r
43                                 new View.OnClickListener() {\r
44                                         @Override\r
45                                         public void onClick( View v ) {\r
46                                                 Log.d(TAG,"submit button clicked");\r
47 \r
48                                                 String commonName = commonNameField.getText().toString();\r
49 \r
50                                                 SearchRequest r = new SearchRequest();\r
51                                                 if ( manufacturerField.getSelectedItemPosition() != 0) {\r
52                                                         String m = (String) manufacturerField.getSelectedItem();\r
53                                                         Log.d(TAG,"manufacturer = " + m);\r
54                                                         r.setManufacturer(m);\r
55                                                 }\r
56                                                 if ( impulseField.getSelectedItemPosition() != 0  ) {\r
57                                                         String impulse = (String) impulseField.getSelectedItem();\r
58                                                         Log.d(TAG,"impulse = " + impulse);\r
59                                                         r.setImpulse_class(impulse);\r
60                                                 }\r
61                                                 if ( diameterField.getSelectedItemPosition() != 0 ) {\r
62                                                         String diameter = (String)diameterField.getSelectedItem();\r
63                                                         Log.d(TAG,"diameter = " + diameter);\r
64                                                         r.setDiameter(diameter);\r
65                                                 }\r
66                                                 r.setCommon_name(commonName);\r
67 \r
68                                                 Downloader d = new Downloader(r);\r
69 \r
70                                                 handler = new Handler();\r
71                                                 progress = ProgressDialog.show(TCQueryActivity.this, null, "");\r
72 \r
73                                                 downloadThread = new Thread( d );\r
74                                                 downloadThread.start();\r
75                                         }\r
76                                 }\r
77                                 );\r
78         }\r
79 \r
80         @Override\r
81         public Object onRetainNonConfigurationInstance() {\r
82                 return downloadThread;\r
83         }\r
84 \r
85         @Override\r
86         protected void onDestroy() {\r
87                 mDbHelper.close();\r
88                 if ( progress != null ) {\r
89                         if ( progress.isShowing() ) {\r
90                                 progress.dismiss();\r
91                         }\r
92                         progress = null;\r
93                 }\r
94                 super.onDestroy();\r
95         }\r
96 \r
97         private class UpdateMessage implements Runnable {\r
98                 private String newMessage;\r
99                 UpdateMessage( String message ) {\r
100                         this.newMessage = message;\r
101                 }\r
102                 @Override\r
103                 public void run() {\r
104                         progress.setMessage(newMessage);\r
105                 }\r
106         }\r
107 \r
108         private class Dismiss implements Runnable {\r
109                 @Override\r
110                 public void run() {\r
111                         progress.dismiss();\r
112                         TCQueryActivity.this.finish();\r
113                 }\r
114         }\r
115 \r
116         private class Error implements Runnable {\r
117                 private String newMessage;\r
118                 Error( String message ) {\r
119                         this.newMessage = message;\r
120                 }\r
121                 @Override\r
122                 public void run() {\r
123                         progress.dismiss();\r
124                         final AlertDialog dialog = new AlertDialog.Builder(TCQueryActivity.this).create();\r
125                         dialog.setMessage(newMessage);\r
126                         dialog.setButton(DialogInterface.BUTTON_NEUTRAL,"Dismiss", new DialogInterface.OnClickListener() {\r
127 \r
128                                 @Override\r
129                                 public void onClick(DialogInterface arg0, int arg1) {\r
130                                         dialog.dismiss();\r
131                                 }\r
132 \r
133                         });\r
134                         dialog.show();\r
135                 }\r
136         }\r
137         private class Downloader implements Runnable {\r
138 \r
139                 SearchRequest request;\r
140 \r
141                 Downloader( SearchRequest request ) {\r
142                         this.request = request;\r
143                 }\r
144 \r
145                 @Override\r
146                 public void run() {\r
147                         try {\r
148                                 handler.post( new UpdateMessage("Quering Thrustcurve"));\r
149                                 SearchResponse res = new ThrustCurveAPI().doSearch(request);\r
150 \r
151                                 int total = res.getResults().size();\r
152                                 int count = 1;\r
153                                 for( TCMotor mi : res.getResults() ) {\r
154                                         handler.post(new UpdateMessage("Downloading details " + count + " of " + total));\r
155                                         count++;\r
156                                         if ( mi.getData_files() == null || mi.getData_files().intValue() == 0 ) {\r
157                                                 continue;\r
158                                         }\r
159 \r
160                                         MotorBurnFile b = new ThrustCurveAPI().downloadData(mi.getMotor_id());\r
161 \r
162                                         Log.d(TAG, mi.toString());\r
163 \r
164                                         ExtendedThrustCurveMotor m = new ExtendedThrustCurveMotor();\r
165                                         \r
166                                         m.setThrustCurveMotor( b.getThrustCurveMotor() );\r
167                                         \r
168                                         // Convert impulse class.  ThrustCurve puts mmx, 1/4a and 1/2a as A.\r
169                                         m.setImpulseClass(mi.getImpulse_class());\r
170                                         if ( "a".equalsIgnoreCase(mi.getImpulse_class())) {\r
171                                                 if( mi.getCommon_name().startsWith("1/2A") ) {\r
172                                                         m.setImpulseClass("1/2A");\r
173                                                 } else if (mi.getCommon_name().startsWith("1/4A") ) {\r
174                                                         m.setImpulseClass("1/4A");\r
175                                                 } else if (mi.getCommon_name().startsWith("Micro") ) {\r
176                                                         m.setImpulseClass("1/8A");\r
177                                                 }\r
178                                         }\r
179                                         \r
180                                         // Convert Case Info.\r
181                                         if ( mi.getCase_info() == null\r
182                                                         || "single use".equalsIgnoreCase(mi.getCase_info())\r
183                                                         || "single-use".equalsIgnoreCase(mi.getCase_info())) {\r
184                                                 m.setCaseInfo(mi.getType()+ " " + mi.getDiameter() + "x" + mi.getLength());\r
185                                         } else {\r
186                                                 m.setCaseInfo(mi.getCase_info());\r
187                                         }\r
188 \r
189                                         Log.d(TAG,"adding motor " + m.toString());\r
190                                         // Write motor.\r
191                                         mDbHelper.getMotorDao().insertOrUpdateMotor(m);\r
192                                 }\r
193                                 if ( total < res.getMatches() ) {\r
194                                         handler.post( new Error( total + " motors downloaded, " + res.getMatches() + " matched.  Try restricting the query more.") );\r
195                                 } else {\r
196                                         handler.post( new Dismiss());\r
197                                 }\r
198                         }\r
199                         catch( Exception ex){\r
200                                 Log.d(TAG,ex.toString());\r
201                                 handler.post( new Error(ex.toString()) );\r
202                         }\r
203 \r
204                 }\r
205         }\r
206 }\r
207 \r