1 package net.sf.openrocket.android.thrustcurve;
\r
3 import net.sf.openrocket.android.db.DbAdapter;
\r
4 import net.sf.openrocket.android.motor.ExtendedThrustCurveMotor;
\r
5 import android.app.Activity;
\r
6 import android.app.AlertDialog;
\r
7 import android.app.ProgressDialog;
\r
8 import android.content.DialogInterface;
\r
9 import android.os.Handler;
\r
10 import android.util.Log;
\r
13 * TCQueryAction is a class which provides all the functionality required
\r
14 * to download motor data from thrustcurve. It includes UI element for
\r
15 * progress and error reporting dialogs.
\r
17 * To use the class, instantiate a new instance of TCQueryAction passing in the
\r
20 * The Activity should implement TCQueryAction.OnComplete or provide an implementation of
\r
21 * TCQueryAction.OnComplete to be notified when the download process is complete.
\r
23 * A search and download is started with TCQueryActivity.start( SearchRequest ). The TCQueryActivity
\r
24 * produces and updates a progress dialog. When the process is complete, the TCQueryActivity will notify
\r
25 * the registered TCQueryAction.OnComplete handler.
\r
27 * When the parent Activity is dismissed, it must call TCQueryAction.dismiss() to free resources.
\r
30 public class TCQueryAction {
\r
32 public interface OnComplete {
\r
33 public void onComplete();
\r
36 private final static String TAG = "TCQueryAction";
\r
38 private DbAdapter mDbHelper;
\r
40 private ProgressDialog progress;
\r
41 private Thread downloadThread;
\r
42 private Handler handler;
\r
44 private final Activity parent;
\r
45 private OnComplete onCompleteListener;
\r
48 * Create a new TCQueryAction.
\r
50 * If the parent implements TCQueryAction.OnComplete, it will be used as the
\r
51 * onCompleteListener and notified when the process is finished.
\r
55 public TCQueryAction( Activity parent ) {
\r
56 this.parent = parent;
\r
58 mDbHelper = new DbAdapter(this.parent);
\r
61 if (parent instanceof OnComplete ) {
\r
62 this.onCompleteListener = (OnComplete) parent;
\r
66 public void setOnCompleteListener(OnComplete onCompleteListener) {
\r
67 this.onCompleteListener = onCompleteListener;
\r
70 public void start( SearchRequest request) {
\r
71 Downloader d = new Downloader(request);
\r
73 handler = new Handler();
\r
74 progress = ProgressDialog.show(parent, null, "");
\r
76 downloadThread = new Thread( d );
\r
77 downloadThread.start();
\r
81 public void dismiss() {
\r
82 // TODO - need to kill the thread.
\r
86 if ( progress.isShowing() ) {
\r
91 private class UpdateMessage implements Runnable {
\r
92 private String newMessage;
\r
93 UpdateMessage( String message ) {
\r
94 this.newMessage = message;
\r
98 progress.setMessage(newMessage);
\r
102 private class Dismiss implements Runnable {
\r
104 public void run() {
\r
105 progress.dismiss();
\r
106 if (onCompleteListener != null ) {
\r
107 onCompleteListener.onComplete();
\r
109 // TCQueryActivity.this.finish();
\r
113 private class Error implements Runnable {
\r
114 private String newMessage;
\r
115 Error( String message ) {
\r
116 this.newMessage = message;
\r
119 public void run() {
\r
120 progress.dismiss();
\r
121 final AlertDialog dialog = new AlertDialog.Builder(parent).create();
\r
122 dialog.setMessage(newMessage);
\r
123 dialog.setButton(DialogInterface.BUTTON_NEUTRAL,"Dismiss", new DialogInterface.OnClickListener() {
\r
126 public void onClick(DialogInterface arg0, int arg1) {
\r
135 private class Downloader implements Runnable {
\r
137 SearchRequest request;
\r
139 Downloader( SearchRequest request ) {
\r
140 this.request = request;
\r
144 public void run() {
\r
146 handler.post( new UpdateMessage("Quering Thrustcurve"));
\r
147 SearchResponse res = new ThrustCurveAPI().doSearch(request);
\r
149 int total = res.getResults().size();
\r
151 for( TCMotor mi : res.getResults() ) {
\r
152 handler.post(new UpdateMessage("Downloading details " + count + " of " + total));
\r
154 if ( mi.getData_files() == null || mi.getData_files().intValue() == 0 ) {
\r
158 MotorBurnFile b = new ThrustCurveAPI().downloadData(mi.getMotor_id());
\r
160 Log.d(TAG, mi.toString());
\r
162 ExtendedThrustCurveMotor m = new ExtendedThrustCurveMotor();
\r
164 m.setThrustCurveMotor( b.getThrustCurveMotor() );
\r
166 // Convert impulse class. ThrustCurve puts mmx, 1/4a and 1/2a as A.
\r
167 m.setImpulseClass(mi.getImpulse_class());
\r
168 if ( "a".equalsIgnoreCase(mi.getImpulse_class())) {
\r
169 if( mi.getCommon_name().startsWith("1/2A") ) {
\r
170 m.setImpulseClass("1/2A");
\r
171 } else if (mi.getCommon_name().startsWith("1/4A") ) {
\r
172 m.setImpulseClass("1/4A");
\r
173 } else if (mi.getCommon_name().startsWith("Micro") ) {
\r
174 m.setImpulseClass("1/8A");
\r
178 // Convert Case Info.
\r
179 if ( mi.getCase_info() == null
\r
180 || "single use".equalsIgnoreCase(mi.getCase_info())
\r
181 || "single-use".equalsIgnoreCase(mi.getCase_info())) {
\r
182 m.setCaseInfo(mi.getType()+ " " + mi.getDiameter() + "x" + mi.getLength());
\r
184 m.setCaseInfo(mi.getCase_info());
\r
187 Log.d(TAG,"adding motor " + m.toString());
\r
189 mDbHelper.getMotorDao().insertOrUpdateMotor(m);
\r
191 if ( total < res.getMatches() ) {
\r
192 handler.post( new Error( total + " motors downloaded, " + res.getMatches() + " matched. Try restricting the query more.") );
\r
194 handler.post( new Dismiss());
\r
197 catch( Exception ex){
\r
198 Log.d(TAG,ex.toString());
\r
199 handler.post( new Error(ex.toString()) );
\r