package org.jtb.nextvta;
import java.util.Calendar;
import java.util.List;
import org.json.JSONException;
import org.jtb.nextvta.Direction.DisplayDirection;
import org.jtb.nextvta.Period.DisplayPeriod;
import org.jtb.nextvta.Route.DisplayRoute;
import org.jtb.nextvta.donate.R;
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.Spinner;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
public class RouteActivity extends Activity {
private Route mRoute;
private List<Direction> mDirections;
private List<Period> mPeriods;
private List<Timepoint> mTimepoints;
private Integer mTrip = 0;
private Integer mMaxTrip = 0;
private Spinner mDirectionSpinner;
private Spinner mPeriodSpinner;
private Tdl mTdl;
private TdlManager mTdlManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.route_timepoints);
mRoute = savedInstanceState != null ? (Route) savedInstanceState
.get("org.jtb.nextvta.route") : null;
if (mRoute == null) {
Bundle extras = getIntent().getExtras();
mRoute = extras != null ? (Route) extras
.get("org.jtb.nextvta.route") : null;
}
if (mRoute == null) {
String routeString = savedInstanceState != null ? (String) savedInstanceState
.get("org.jtb.nextvta.route.string") : null;
if (routeString == null) {
Bundle extras = getIntent().getExtras();
routeString = extras != null ? (String) extras
.get("org.jtb.nextvta.route.string") : null;
}
if (routeString != null) {
try {
mRoute = new Route(routeString);
} catch (JSONException e) {
Log.e("nextvta", "could not process route string: "
+ routeString);
Toast.makeText(this,
"Could not process route string: " + routeString,
Toast.LENGTH_LONG).show();
finish();
}
}
if (mRoute == null) {
Log.e("nextvta", "no route found");
Toast.makeText(this,
"No route found",
Toast.LENGTH_LONG).show();
finish();
}
}
mTdlManager = TdlManager.getInstance(getResources().getAssets());
mTdl = new Tdl(mRoute);
// direction, period spinners
mDirections = mTdlManager.fetchDirections(mRoute);
mTdl.setDirection(mDirections.get(0));
mDirectionSpinner = (Spinner) findViewById(R.id.direction_spinner);
ArrayAdapter<DisplayDirection> daa = new ArrayAdapter<DisplayDirection>(
this, android.R.layout.simple_spinner_item,
Direction.getDisplayDirections(this, mDirections));
daa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mDirectionSpinner.setAdapter(daa);
mDirectionSpinner.setSelection(0);
mDirectionSpinner.setSelected(false);
mDirectionSpinner
.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView parent, View v,
int position, long id) {
DisplayDirection dd = (DisplayDirection) parent
.getSelectedItem();
if (mTdl.getDirection() != dd.getDirection()) {
mTdl.setDirection(dd.getDirection());
load(true);
layout();
}
}
public void onNothingSelected(AdapterView parent) {
}
});
mPeriodSpinner = (Spinner) findViewById(R.id.period_spinner);
load(true);
layout();
// TODO: localize
DisplayRoute dd = mTdl.getRoute().getDisplayRoute(this);
setTitle("NextVTA - " + dd + ": " + dd.getDescription());
}
private class CurrentClickListener implements View.OnClickListener {
private Timepoint nextTimepoint;
public CurrentClickListener(Timepoint nextTimepoint) {
this.nextTimepoint = nextTimepoint;
}
public void onClick(View v) {
mTrip = nextTimepoint.getTrip();
layout();
}
}
private void layout() {
TableLayout layout = (TableLayout) findViewById(R.id.route_table);
layout.setColumnStretchable(0, true);
layout.removeAllViews();
for (final Timepoint tp : mTimepoints) {
if (tp.getTrip() != mTrip) {
continue;
}
View.OnClickListener nextClick = new View.OnClickListener() {
public void onClick(View v) {
if (mTrip + 1 <= mMaxTrip) {
mTrip++;
layout();
}
}
};
View.OnClickListener previousClick = new View.OnClickListener() {
public void onClick(View v) {
if (mTrip - 1 >= 0) {
mTrip--;
layout();
}
}
};
TableRow row = new TableRow(this);
TextView textView = new TextView(this);
textView.setText(tp.getDescription());
textView.setGravity(Gravity.LEFT);
textView.setTextSize(16);
TableRow.LayoutParams rowParams = new TableRow.LayoutParams();
rowParams.height = 56;
rowParams.width = TableRow.LayoutParams.FILL_PARENT;
rowParams.weight = 1;
rowParams.column = 0;
row.addView(textView, rowParams);
textView = new TextView(this);
textView.setText(tp.getTime().toString());
textView.setGravity(Gravity.RIGHT);
textView.setTextSize(16);
textView.setPadding(2, 0, 0, 0);
rowParams = new TableRow.LayoutParams();
rowParams.height = TableRow.LayoutParams.WRAP_CONTENT;
rowParams.width = TableRow.LayoutParams.FILL_PARENT;
rowParams.weight = 1;
rowParams.column = 1;
row.addView(textView, rowParams);
ImageButton b = new ImageButton(this);
b.setImageResource(R.drawable.backward_24x24);
b.setOnClickListener(previousClick);
if (mTrip == 0) {
b.setEnabled(false);
}
rowParams = new TableRow.LayoutParams();
rowParams.height = TableRow.LayoutParams.WRAP_CONTENT;
rowParams.width = TableRow.LayoutParams.FILL_PARENT;
rowParams.weight = 1;
rowParams.column = 2;
row.addView(b, rowParams);
b = new ImageButton(this);
b.setImageResource(R.drawable.clock_24x24);
Timepoint nextTp = TdlManager.nextTimepoint(mTimepoints, tp);
if (nextTp != null) {
View.OnClickListener currentClick = new CurrentClickListener(
nextTp);
b.setOnClickListener(currentClick);
} else {
b.setEnabled(false);
}
rowParams = new TableRow.LayoutParams();
rowParams.height = TableRow.LayoutParams.WRAP_CONTENT;
rowParams.width = TableRow.LayoutParams.FILL_PARENT;
rowParams.weight = 1;
rowParams.column = 3;
row.addView(b, rowParams);
b = new ImageButton(this);
b.setImageResource(R.drawable.forward_24x24);
b.setOnClickListener(nextClick);
if (mTrip == mMaxTrip) {
b.setEnabled(false);
}
rowParams = new TableRow.LayoutParams();
rowParams.height = TableRow.LayoutParams.WRAP_CONTENT;
rowParams.width = TableRow.LayoutParams.FILL_PARENT;
rowParams.weight = 1;
rowParams.column = 4;
row.addView(b, rowParams);
layout.addView(row);
}
}
private void load(boolean directionChanged) {
if (directionChanged) {
updatePeriods();
}
mTimepoints = mTdlManager.fetchTimepoints(mTdl);
if (mTimepoints.size() == 0) {
return;
}
mMaxTrip = TdlManager.getMaxTrip(mTimepoints);
Timepoint nextTp = TdlManager.nextTimepoint(mTimepoints,
mTimepoints.get(0));
if (nextTp != null) {
mTrip = nextTp.getTrip();
} else {
mTrip = mMaxTrip;
}
}
private void updatePeriods() {
mPeriods = mTdlManager.fetchPeriods(mRoute,
((DisplayDirection) mDirectionSpinner.getSelectedItem())
.getDirection());
mTdl.setPeriod(getPeriod(mPeriods));
ArrayAdapter<DisplayPeriod> paa = new ArrayAdapter<DisplayPeriod>(this,
android.R.layout.simple_spinner_item, Period.getDisplayPeriods(
this, mPeriods));
paa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
int j = mPeriods.indexOf(mTdl.getPeriod());
mPeriodSpinner.setAdapter(paa);
mPeriodSpinner.setSelection(j);
mPeriodSpinner.setSelected(false);
mPeriodSpinner
.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView parent, View v,
int position, long id) {
DisplayPeriod dp = (DisplayPeriod) parent
.getSelectedItem();
if (mTdl.getPeriod() != dp.getPeriod()) {
mTdl.setPeriod(dp.getPeriod());
load(false);
layout();
}
}
public void onNothingSelected(AdapterView parent) {
}
});
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
}
return null;
}
private Period getPeriod(List<Period> periods) {
Calendar cal = Calendar.getInstance();
int dow = cal.get(Calendar.DAY_OF_WEEK);
switch (dow) {
case 2:
case 3:
case 4:
case 5:
case 6:
if (periods.contains(Period.WK)) {
return Period.WK;
}
case 1:
if (periods.contains(Period.SU)) {
return Period.SU;
}
case 7:
if (periods.contains(Period.SA)) {
return Period.SA;
}
}
return periods.get(0);
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.route_timepoints_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.view_route_item:
Intent i = new Intent(this, RouteViewActivity.class);
i.putExtra("org.jtb.nextvta.route", mRoute);
startActivity(i);
return true;
}
return false;
}
}
|