Implement color indicators (green, yellow, red) for the Simulation Status in the Simulations list. This makes the list more like that on OR desktop.

This commit is contained in:
Kevin Ruland 2012-06-26 18:26:06 +00:00
parent 45838387bc
commit 5ae62a2db2
8 changed files with 180 additions and 23 deletions

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:openrocket="http://schemas.android.com/apk/res/net.sf.openrocket"
android:constantSize="true" android:dither="true" android:variablePadding="false">
<item android:drawable="@drawable/simulation_state_red" openrocket:simulation_invalid="true"/>
<item android:drawable="@drawable/simulation_state_yellow" openrocket:simulation_stale="true"/>
<item android:drawable="@drawable/simulation_state_green"/>
</selector>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<corners android:radius="12dp"/>
<solid android:color="#CC00FF00"/>
<size android:width="24dp" android:height="24dp"/>
</shape>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<corners android:radius="12dp"/>
<solid android:color="#CCFF0000"/>
<size android:width="24dp" android:height="24dp"/>
</shape>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<corners android:radius="12dp"/>
<solid android:color="#CCFFFF00"/>
<size android:width="24dp" android:height="24dp"/>
</shape>

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >
<ImageView
android:id="@+id/simulation_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/simulation_state"
android:duplicateParentState="true"
android:paddingRight="5dp" />
<TwoLineListItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingTop="10px" >
<TextView
android:id="@android:id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@android:id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="30px"
android:text="TextView"
android:textAppearance="?android:attr/textAppearanceSmall" />
</TwoLineListItem>
</merge>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="SimulationState">
<attr name="simulation_invalid" format="boolean"/>
<attr name="simulation_stale" format="boolean"/>
</declare-styleable>
</resources>

View File

@ -2,12 +2,10 @@ package net.sf.openrocket.android.rocket;
import net.sf.openrocket.R;
import net.sf.openrocket.android.CurrentRocketHolder;
import net.sf.openrocket.android.simulation.SimulationListItem;
import net.sf.openrocket.android.util.AndroidLogWrapper;
import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.document.Simulation;
import net.sf.openrocket.simulation.FlightData;
import net.sf.openrocket.unit.Unit;
import net.sf.openrocket.unit.UnitGroup;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
@ -21,7 +19,6 @@ import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.view.Menu;
@ -124,26 +121,16 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if ( v == null ) {
LayoutInflater li = getActivity().getLayoutInflater();
v = li.inflate(android.R.layout.simple_list_item_2,null);
}
SimulationListItem listItemView = (SimulationListItem) convertView;
if (listItemView == null) {
listItemView = new SimulationListItem(parent.getContext());
}
Simulation sim = this.getItem(position);
((TextView)v.findViewById(android.R.id.text1)).setText( sim.getName() );
StringBuilder sb = new StringBuilder();
String motorConfig = sim.getOptions().getMotorConfigurationID();
sb.append("motors: ").append(rocketDocument.getRocket().getMotorConfigurationNameOrDescription(motorConfig));
Unit distanceUnit = UnitGroup.UNITS_DISTANCE.getDefaultUnit();
FlightData flightData = sim.getSimulatedData();
if ( flightData != null ) {
sb.append(" apogee: ").append( distanceUnit.toStringUnit(flightData.getMaxAltitude()));
sb.append(" time: ").append(flightData.getFlightTime()).append("s");
((TextView)v.findViewById(android.R.id.text2)).setText( sb.toString() );
} else {
((TextView)v.findViewById(android.R.id.text2)).setText("No simulation data");
}
return v;
listItemView.setSimulation(sim);
return listItemView;
}
};

View File

@ -0,0 +1,91 @@
package net.sf.openrocket.android.simulation;
import net.sf.openrocket.R;
import net.sf.openrocket.document.Simulation;
import net.sf.openrocket.document.Simulation.Status;
import net.sf.openrocket.simulation.FlightData;
import net.sf.openrocket.unit.Unit;
import net.sf.openrocket.unit.UnitGroup;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
import android.widget.TextView;
public class SimulationListItem extends LinearLayout {
private int[] SIMULATION_INVALID = { R.attr.simulation_invalid };
private int[] SIMULATION_STALE = { R.attr.simulation_stale };
private TextView text1;
private TextView text2;
private Status simStatus;
public SimulationListItem(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
loadViews();
}
public SimulationListItem(Context context, AttributeSet attrs) {
super(context, attrs);
loadViews();
}
public SimulationListItem(Context context) {
this(context, null);
}
public void setSimulation(Simulation sim) {
text1.setText( sim.getName() );
StringBuilder sb = new StringBuilder();
String motorConfig = sim.getOptions().getMotorConfigurationID();
sb.append("motors: ").append(sim.getRocket().getMotorConfigurationNameOrDescription(motorConfig));
Unit distanceUnit = UnitGroup.UNITS_DISTANCE.getDefaultUnit();
FlightData flightData = sim.getSimulatedData();
if ( flightData != null ) {
sb.append(" apogee: ").append( distanceUnit.toStringUnit(flightData.getMaxAltitude()));
sb.append(" time: ").append(flightData.getFlightTime()).append("s");
} else {
sb.append(" No simulation data");
}
text2.setText( sb.toString() );
simStatus = sim.getStatus();
// Refresh the drawable state so that it includes the status if required.
refreshDrawableState();
}
private void loadViews() {
this.setOrientation(LinearLayout.HORIZONTAL);
LayoutInflater layoutInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layoutInflater.inflate(R.layout.simulation_list_item, this, true);
// setPadding(fiveDPInPixels, fiveDPInPixels, fiveDPInPixels, fiveDPInPixels);
// setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, fiftyDPInPixels));
// setBackgroundResource(R.drawable.message_list_item_background);
text1 = (TextView) findViewById(android.R.id.text1);
text2 = (TextView) findViewById(android.R.id.text2);
}
@Override
protected int[] onCreateDrawableState(int extraSpace) {
// We are going to add extra state.
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if ( simStatus == Status.OUTDATED || simStatus == Status.NOT_SIMULATED ) {
return mergeDrawableStates(drawableState, SIMULATION_INVALID );
} else if ( simStatus == Status.LOADED || simStatus == Status.EXTERNAL ) {
return mergeDrawableStates(drawableState, SIMULATION_STALE);
} else {
return super.onCreateDrawableState(extraSpace);
}
}
}