package org.androad.ui.map;
import java.util.ArrayList;
import java.util.List;
import org.androad.R;
import org.androad.adt.UnitSystem;
import org.androad.preferences.Preferences;
import org.androad.sys.ors.adt.rs.Route;
import org.androad.sys.ors.adt.rs.RouteInstruction;
import org.androad.ui.AndNavBaseActivity;
import org.androad.ui.common.OnClickOnFocusChangedListenerAdapter;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
public class RouteInstructions extends AndNavBaseActivity {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private Route mRoute;
private ListView mRouteInstructionsList;
private UnitSystem mUnitSystem;
// ===========================================================
// Constructors
// ===========================================================
/** Called when the activity is first created. */
@Override
public void onCreate(final Bundle icicle) {
super.onCreate(icicle);
this.setContentView(R.layout.map_routeinstructions_list);
this.mUnitSystem = Preferences.getUnitSystem(this);
final Intent intent = this.getIntent();
final Bundle b = intent.getBundleExtra(RouteInstructions.class.getName());
this.mRoute = b.getParcelable(RouteInstructions.class.getName());
this.mRouteInstructionsList = (ListView) this.findViewById(R.id.list_map_routeinstructions_list);
/* Set Listener for Close-Button. */
new OnClickOnFocusChangedListenerAdapter(this.findViewById(R.id.ibtn_map_routeinstructions_list_close)) {
@Override
public void onClicked(final View me) {
RouteInstructions.this.finish();
}
};
final RouteInstructionsListAdapter rla = new RouteInstructionsListAdapter(this, mUnitSystem);
for (RouteInstruction ri : this.mRoute.getRouteInstructions()) {
rla.addItem(new RouteInstructionItem(this, ri, mUnitSystem));
}
this.mRouteInstructionsList.setAdapter(rla);
}
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
private static class RouteInstructionItem implements Parcelable {
protected final String mDistance;
protected final String mTime;
protected final String mDescription;
protected final Bitmap mTurnAngle;
public RouteInstructionItem(final String aDistance, final String aTime, final String aDescription, final Bitmap aTurnAngle) {
this.mDistance = aDistance;
this.mTime = aTime;
this.mDescription = aDescription;
this.mTurnAngle = aTurnAngle;
}
public RouteInstructionItem(final Context context, final RouteInstruction ri, final UnitSystem mUnitSystem) {
final String[] distStringParts = mUnitSystem.getDistanceString(ri.getLengthMeters(), null);
final String distString = distStringParts[UnitSystem.DISTSTRINGS_DIST_ID] + distStringParts[UnitSystem.DISTSTRINGS_UNIT_ID];
this.mDistance = distString;
if (ri.getDurationSeconds() > 0) {
this.mTime = ri.getDurationSeconds() + "sec";
} else {
this.mTime = null;
}
this.mDescription = ri.getDescription();
final int turnAngle = (int)ri.getAngle();
if(turnAngle > 60) {
this.mTurnAngle = BitmapFactory.decodeResource(context.getResources(), R.drawable.turn_left_90_white);
} else if(turnAngle > 35) {
this.mTurnAngle = BitmapFactory.decodeResource(context.getResources(), R.drawable.turn_left_45_white);
} else if(turnAngle > 15) {
this.mTurnAngle = BitmapFactory.decodeResource(context.getResources(), R.drawable.turn_left_25_white);
} else if(turnAngle <= 15 && turnAngle >= -15) {
this.mTurnAngle = BitmapFactory.decodeResource(context.getResources(), R.drawable.turn_straight_white);
} else if(turnAngle > -35) {
this.mTurnAngle = BitmapFactory.decodeResource(context.getResources(), R.drawable.turn_right_25_white);
} else if(turnAngle > -60) {
this.mTurnAngle = BitmapFactory.decodeResource(context.getResources(), R.drawable.turn_right_45_white);
} else {
this.mTurnAngle = BitmapFactory.decodeResource(context.getResources(), R.drawable.turn_right_90_white);
}
}
public void recycle() {
this.mTurnAngle.recycle();
}
// ===========================================================
// Parcelable
// ===========================================================
public static final Parcelable.Creator<RouteInstructionItem> CREATOR = new Parcelable.Creator<RouteInstructionItem>() {
public RouteInstructionItem createFromParcel(final Parcel in) {
return readFromParcel(in);
}
public RouteInstructionItem[] newArray(final int size) {
return new RouteInstructionItem[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(final Parcel out, final int flags) {
out.writeString(this.mDistance);
out.writeString(this.mTime);
out.writeString(this.mDescription);
out.writeParcelable(this.mTurnAngle, 0);
}
private static RouteInstructionItem readFromParcel(final Parcel in){
final String mDistance = in.readString();
final String mTime = in.readString();
final String mDescription = in.readString();
final Bitmap mTurnAngle = in.readParcelable(null);
return new RouteInstructionItem(mDistance, mTime, mDescription, mTurnAngle);
}
}
private class RouteInstructionListItemView extends LinearLayout{
private final UnitSystem mUnitSystem;
private final ImageView mTVTurn;
private final TextView mTVDescription;
private final TextView mTVDistance;
private final TextView mTVTime;
public RouteInstructionListItemView(final Context context, final RouteInstructionItem aRI, final UnitSystem unitSystem) {
super(context);
this.mUnitSystem = unitSystem;
this.setOrientation(HORIZONTAL);
this.mTVTurn = new ImageView(context);
this.mTVTurn.setImageBitmap(aRI.mTurnAngle);
addView(this.mTVTurn, new LinearLayout.LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
this.mTVDistance = new TextView(context);
this.mTVDistance.setText(aRI.mDistance);
this.mTVDistance.setTextSize(TypedValue.COMPLEX_UNIT_PX, 16);
this.mTVDistance.setPadding(10,0,20,0);
addView(this.mTVDistance, new LinearLayout.LayoutParams(90, android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
this.mTVTime = new TextView(context);
this.mTVTime.setText(aRI.mTime);
this.mTVTime.setTextSize(TypedValue.COMPLEX_UNIT_PX, 16);
this.mTVTime.setPadding(10,0,20,0);
if (aRI.mTime != null) {
addView(this.mTVTime, new LinearLayout.LayoutParams(90, android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
}
this.mTVDescription = new TextView(context);
this.mTVDescription.setText(aRI.mDescription);
this.mTVDescription.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
addView(this.mTVDescription, new LinearLayout.LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
}
}
private class RouteInstructionsListAdapter extends BaseAdapter{
/** Remember our context so we can use it when constructing views. */
private final Context mContext;
private final UnitSystem mUnitSystem;
private List<RouteInstructionItem> mItems = new ArrayList<RouteInstructionItem>();
public RouteInstructionsListAdapter(final Context context, final UnitSystem unitSystem) {
this.mContext = context;
this.mUnitSystem = unitSystem;
}
public void addItem(final RouteInstructionItem it) {
this.mItems.add(it);
}
@Override
public boolean isEmpty() {
return this.mItems == null || this.mItems.size() == 0;
}
public void setListItems(final List<RouteInstructionItem> lit) {
this.mItems = lit;
}
/** @return The number of items in the */
public int getCount() { return this.mItems.size(); }
public Object getItem(final int position) { return this.mItems.get(position); }
@Override
public long getItemId(final int position) { return position; }
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
RouteInstructionListItemView btv;
if (convertView == null) {
btv = new RouteInstructionListItemView(this.mContext, this.mItems.get(position), mUnitSystem);
} else { // Reuse/Overwrite the View passed
// We are assuming(!) that it is castable!
btv = (RouteInstructionListItemView) convertView;
btv.mTVTurn.setImageBitmap(this.mItems.get(position).mTurnAngle);
btv.mTVDescription.setText(this.mItems.get(position).mDescription);
btv.mTVDistance.setText(this.mItems.get(position).mDistance);
btv.mTVTime.setText(this.mItems.get(position).mTime);
}
return btv;
}
}
}