--- /dev/null
+package net.sf.openrocket.android.thrustcurve;\r
+\r
+import java.util.Set;\r
+\r
+import net.sf.openrocket.android.motor.ExtendedThrustCurveMotor;\r
+import net.sf.openrocket.android.util.AndroidLogWrapper;\r
+import net.sf.openrocket.motor.ThrustCurveMotorPlaceholder;\r
+import android.app.Activity;\r
+\r
+public class TCMissingMotorDownloadAction extends TCQueryAction {\r
+\r
+ private Set<ThrustCurveMotorPlaceholder> missingMotors;\r
+\r
+ public TCMissingMotorDownloadAction(Activity parent) {\r
+ super(parent);\r
+ }\r
+\r
+ public void setMissingMotors( Set<ThrustCurveMotorPlaceholder> missingMotors ) {\r
+ this.missingMotors = missingMotors;\r
+ }\r
+\r
+ protected Runnable getTask() {\r
+ return new Downloader();\r
+ }\r
+\r
+ private class Downloader implements Runnable {\r
+\r
+ private void downloadMissingMotor( ThrustCurveMotorPlaceholder motor ) {\r
+ try {\r
+ SearchRequest request = new SearchRequest();\r
+ request.setManufacturer(motor.getManufacturer());\r
+ request.setDesignation(motor.getDesignation());\r
+\r
+ handler.post( new UpdateMessage("Looking for " + motor.getManufacturer() + " " + motor.getDesignation()));\r
+\r
+ SearchResponse res = new ThrustCurveAPI().doSearch(request);\r
+\r
+ int total = res.getResults().size();\r
+ int count = 1;\r
+ for( TCMotor mi : res.getResults() ) {\r
+ StringBuilder message = new StringBuilder();\r
+ message.append("Downloading details ");\r
+ if ( total > 1 ) {\r
+ message.append(count);\r
+ message.append(" of " );\r
+ message.append(total);\r
+ message.append("\n");\r
+ }\r
+ message.append(mi.getManufacturer());\r
+ message.append(" ");\r
+ message.append(mi.getCommon_name());\r
+ handler.post(new UpdateMessage(message.toString()));\r
+ count++;\r
+ if ( mi.getData_files() == null || mi.getData_files().intValue() == 0 ) {\r
+ continue;\r
+ }\r
+\r
+ MotorBurnFile b = new ThrustCurveAPI().downloadData(mi.getMotor_id());\r
+\r
+ AndroidLogWrapper.d(TCQueryAction.class, mi.toString());\r
+\r
+ ExtendedThrustCurveMotor m = new ExtendedThrustCurveMotor();\r
+\r
+ m.setThrustCurveMotor( b.getThrustCurveMotor() );\r
+\r
+ // Convert impulse class. ThrustCurve puts mmx, 1/4a and 1/2a as A.\r
+ m.setImpulseClass(mi.getImpulse_class());\r
+ if ( "a".equalsIgnoreCase(mi.getImpulse_class())) {\r
+ if( mi.getCommon_name().startsWith("1/2A") ) {\r
+ m.setImpulseClass("1/2A");\r
+ } else if (mi.getCommon_name().startsWith("1/4A") ) {\r
+ m.setImpulseClass("1/4A");\r
+ } else if (mi.getCommon_name().startsWith("Micro") ) {\r
+ m.setImpulseClass("1/8A");\r
+ }\r
+ }\r
+\r
+ // Convert Case Info.\r
+ if ( mi.getCase_info() == null\r
+ || "single use".equalsIgnoreCase(mi.getCase_info())\r
+ || "single-use".equalsIgnoreCase(mi.getCase_info())) {\r
+ m.setCaseInfo(mi.getType()+ " " + mi.getDiameter() + "x" + mi.getLength());\r
+ } else {\r
+ m.setCaseInfo(mi.getCase_info());\r
+ }\r
+\r
+ AndroidLogWrapper.d(TCQueryAction.class,"adding motor " + m.toString());\r
+ // Write motor.\r
+ mDbHelper.getMotorDao().insertOrUpdateMotor(m);\r
+ }\r
+ }\r
+ catch( Exception ex){\r
+ AndroidLogWrapper.d(TCQueryAction.class,ex.toString());\r
+ handler.post( new Error(ex.toString()) );\r
+ }\r
+\r
+ }\r
+\r
+ @Override\r
+ public void run() {\r
+ for ( ThrustCurveMotorPlaceholder motor : missingMotors ) {\r
+ AndroidLogWrapper.d(TCMissingMotorDownloadAction.class, "Motor: {}", motor);\r
+ downloadMissingMotor(motor);\r
+ }\r
+ handler.post( new Dismiss() );\r
+ }\r
+}\r
+\r
+}\r
package net.sf.openrocket.android.thrustcurve;\r
\r
import net.sf.openrocket.android.db.DbAdapter;\r
-import net.sf.openrocket.android.motor.ExtendedThrustCurveMotor;\r
-import net.sf.openrocket.android.util.AndroidLogWrapper;\r
import android.app.Activity;\r
import android.app.AlertDialog;\r
import android.app.ProgressDialog;\r
* When the parent Activity is dismissed, it must call TCQueryAction.dismiss() to free resources.\r
* \r
*/\r
-public class TCQueryAction {\r
+public abstract class TCQueryAction {\r
\r
public interface OnComplete {\r
public void onComplete();\r
}\r
\r
- private DbAdapter mDbHelper;\r
+ protected DbAdapter mDbHelper;\r
\r
private ProgressDialog progress;\r
private Thread downloadThread;\r
- private Handler handler;\r
+ protected Handler handler;\r
\r
private final Activity parent;\r
private OnComplete onCompleteListener;\r
this.onCompleteListener = onCompleteListener;\r
}\r
\r
- public void start( SearchRequest request) {\r
- Downloader d = new Downloader(request);\r
-\r
+ protected abstract Runnable getTask();\r
+ \r
+ public void start() {\r
handler = new Handler();\r
progress = ProgressDialog.show(parent, null, "");\r
\r
- downloadThread = new Thread( d );\r
+ downloadThread = new Thread( getTask() );\r
downloadThread.start();\r
\r
}\r
\r
+\r
public void dismiss() {\r
// TODO - need to kill the thread.\r
\r
}\r
}\r
\r
- private class UpdateMessage implements Runnable {\r
+ protected class UpdateMessage implements Runnable {\r
private String newMessage;\r
UpdateMessage( String message ) {\r
this.newMessage = message;\r
}\r
}\r
\r
- private class Dismiss implements Runnable {\r
+ protected class Dismiss implements Runnable {\r
@Override\r
public void run() {\r
progress.dismiss();\r
}\r
}\r
\r
- private class Error implements Runnable {\r
+ protected class Error implements Runnable {\r
private String newMessage;\r
Error( String message ) {\r
this.newMessage = message;\r
}\r
}\r
\r
- private class Downloader implements Runnable {\r
-\r
- SearchRequest request;\r
-\r
- Downloader( SearchRequest request ) {\r
- this.request = request;\r
- }\r
-\r
- @Override\r
- public void run() {\r
- try {\r
- handler.post( new UpdateMessage("Quering Thrustcurve"));\r
- SearchResponse res = new ThrustCurveAPI().doSearch(request);\r
-\r
- int total = res.getResults().size();\r
- int count = 1;\r
- for( TCMotor mi : res.getResults() ) {\r
- StringBuilder message = new StringBuilder();\r
- message.append("Downloading details ");\r
- if ( total > 1 ) {\r
- message.append(count);\r
- message.append(" of " );\r
- message.append(total);\r
- message.append("\n");\r
- }\r
- message.append(mi.getManufacturer());\r
- message.append(" ");\r
- message.append(mi.getCommon_name());\r
- handler.post(new UpdateMessage(message.toString()));\r
- count++;\r
- if ( mi.getData_files() == null || mi.getData_files().intValue() == 0 ) {\r
- continue;\r
- }\r
-\r
- MotorBurnFile b = new ThrustCurveAPI().downloadData(mi.getMotor_id());\r
-\r
- AndroidLogWrapper.d(TCQueryAction.class, mi.toString());\r
-\r
- ExtendedThrustCurveMotor m = new ExtendedThrustCurveMotor();\r
-\r
- m.setThrustCurveMotor( b.getThrustCurveMotor() );\r
-\r
- // Convert impulse class. ThrustCurve puts mmx, 1/4a and 1/2a as A.\r
- m.setImpulseClass(mi.getImpulse_class());\r
- if ( "a".equalsIgnoreCase(mi.getImpulse_class())) {\r
- if( mi.getCommon_name().startsWith("1/2A") ) {\r
- m.setImpulseClass("1/2A");\r
- } else if (mi.getCommon_name().startsWith("1/4A") ) {\r
- m.setImpulseClass("1/4A");\r
- } else if (mi.getCommon_name().startsWith("Micro") ) {\r
- m.setImpulseClass("1/8A");\r
- }\r
- }\r
-\r
- // Convert Case Info.\r
- if ( mi.getCase_info() == null\r
- || "single use".equalsIgnoreCase(mi.getCase_info())\r
- || "single-use".equalsIgnoreCase(mi.getCase_info())) {\r
- m.setCaseInfo(mi.getType()+ " " + mi.getDiameter() + "x" + mi.getLength());\r
- } else {\r
- m.setCaseInfo(mi.getCase_info());\r
- }\r
-\r
- AndroidLogWrapper.d(TCQueryAction.class,"adding motor " + m.toString());\r
- // Write motor.\r
- mDbHelper.getMotorDao().insertOrUpdateMotor(m);\r
- }\r
- if ( total < res.getMatches() ) {\r
- handler.post( new Error( total + " motors downloaded, " + res.getMatches() + " matched. Try restricting the query more.") );\r
- } else {\r
- handler.post( new Dismiss());\r
- }\r
- }\r
- catch( Exception ex){\r
- AndroidLogWrapper.d(TCQueryAction.class,ex.toString());\r
- handler.post( new Error(ex.toString()) );\r
- }\r
-\r
- }\r
- }\r
-\r
}\r
implements TCQueryAction.OnComplete\r
{\r
\r
- private TCQueryAction queryAction;\r
+ private TCSearchAction queryAction;\r
\r
@Override\r
protected void onCreate(Bundle savedInstanceState) {\r
super.onCreate(savedInstanceState);\r
setContentView(R.layout.tcqueryform);\r
-\r
- queryAction = new TCQueryAction(this);\r
+ \r
+ queryAction = new TCSearchAction(this);\r
\r
final Spinner manufacturerField = (Spinner) findViewById(R.id.TCMotorSearchFormManufacturerField);\r
final Spinner impulseField = (Spinner) findViewById(R.id.TCMotorSearchFormImpulseField);\r
@Override\r
public void onClick( View v ) {\r
AndroidLogWrapper.d(TCQueryActivity.class,"submit button clicked");\r
-\r
+ \r
String commonName = commonNameField.getText().toString();\r
\r
SearchRequest r = new SearchRequest();\r
}\r
r.setCommon_name(commonName);\r
\r
- queryAction.start(r);\r
+ queryAction.setRequest(r);\r
+ queryAction.start();\r
}\r
}\r
);\r
--- /dev/null
+package net.sf.openrocket.android.thrustcurve;\r
+\r
+import net.sf.openrocket.android.motor.ExtendedThrustCurveMotor;\r
+import net.sf.openrocket.android.util.AndroidLogWrapper;\r
+import android.app.Activity;\r
+\r
+public class TCSearchAction extends TCQueryAction {\r
+\r
+ private SearchRequest request;\r
+ \r
+ public TCSearchAction(Activity parent) {\r
+ super(parent);\r
+ }\r
+ \r
+ public void setRequest( SearchRequest request ) {\r
+ this.request = request;\r
+ }\r
+\r
+ protected Runnable getTask() {\r
+ return new Downloader();\r
+ }\r
+ \r
+ private class Downloader implements Runnable {\r
+\r
+ @Override\r
+ public void run() {\r
+ try {\r
+ handler.post( new UpdateMessage("Quering Thrustcurve"));\r
+ SearchResponse res = new ThrustCurveAPI().doSearch(request);\r
+\r
+ int total = res.getResults().size();\r
+ int count = 1;\r
+ for( TCMotor mi : res.getResults() ) {\r
+ StringBuilder message = new StringBuilder();\r
+ message.append("Downloading details ");\r
+ if ( total > 1 ) {\r
+ message.append(count);\r
+ message.append(" of " );\r
+ message.append(total);\r
+ message.append("\n");\r
+ }\r
+ message.append(mi.getManufacturer());\r
+ message.append(" ");\r
+ message.append(mi.getCommon_name());\r
+ handler.post(new UpdateMessage(message.toString()));\r
+ count++;\r
+ if ( mi.getData_files() == null || mi.getData_files().intValue() == 0 ) {\r
+ continue;\r
+ }\r
+\r
+ MotorBurnFile b = new ThrustCurveAPI().downloadData(mi.getMotor_id());\r
+\r
+ AndroidLogWrapper.d(TCQueryAction.class, mi.toString());\r
+\r
+ ExtendedThrustCurveMotor m = new ExtendedThrustCurveMotor();\r
+\r
+ m.setThrustCurveMotor( b.getThrustCurveMotor() );\r
+\r
+ // Convert impulse class. ThrustCurve puts mmx, 1/4a and 1/2a as A.\r
+ m.setImpulseClass(mi.getImpulse_class());\r
+ if ( "a".equalsIgnoreCase(mi.getImpulse_class())) {\r
+ if( mi.getCommon_name().startsWith("1/2A") ) {\r
+ m.setImpulseClass("1/2A");\r
+ } else if (mi.getCommon_name().startsWith("1/4A") ) {\r
+ m.setImpulseClass("1/4A");\r
+ } else if (mi.getCommon_name().startsWith("Micro") ) {\r
+ m.setImpulseClass("1/8A");\r
+ }\r
+ }\r
+\r
+ // Convert Case Info.\r
+ if ( mi.getCase_info() == null\r
+ || "single use".equalsIgnoreCase(mi.getCase_info())\r
+ || "single-use".equalsIgnoreCase(mi.getCase_info())) {\r
+ m.setCaseInfo(mi.getType()+ " " + mi.getDiameter() + "x" + mi.getLength());\r
+ } else {\r
+ m.setCaseInfo(mi.getCase_info());\r
+ }\r
+\r
+ AndroidLogWrapper.d(TCQueryAction.class,"adding motor " + m.toString());\r
+ // Write motor.\r
+ mDbHelper.getMotorDao().insertOrUpdateMotor(m);\r
+ }\r
+ if ( total < res.getMatches() ) {\r
+ handler.post( new Error( total + " motors downloaded, " + res.getMatches() + " matched. Try restricting the query more.") );\r
+ } else {\r
+ handler.post( new Dismiss());\r
+ }\r
+ }\r
+ catch( Exception ex){\r
+ AndroidLogWrapper.d(TCQueryAction.class,ex.toString());\r
+ handler.post( new Error(ex.toString()) );\r
+ }\r
+\r
+ }\r
+ }\r
+\r
+}\r