package com.geeksville.gaggle;
import java.util.Date;
import com.geeksville.info.FlightSummary;
import com.geeksville.info.Units;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
public class SummaryListActivity extends ListActivity {
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
displayData();
}
private void displayData() {
Bundle summaryBundle = getIntent().getExtras();
FlightSummary summary = new FlightSummary(summaryBundle);
Units units = Units.instance;
String altUnits = units.getAltitudeUnits();
String distUnits = units.getDistanceUnits();
String speedUnits = units.getSpeedUnits();
String startDate = summary.getStartDate().toLocaleString();
String endDate = summary.getEndDate().toLocaleString();
String duration = getFriendlyTimeDifference(summary.getStartDate(), summary.getEndDate());
String startAltitude = units.metersToAltitude(summary.getStartAltitude()) + altUnits;
String maxAltitudeAfterLaunch = units.metersToAltitude(summary.getMaxAltitudeAfterLaunch()) + altUnits;
String maxGroundSpeed = units.kilometerPerHourToSpeed(summary.getMaxGroundSpeed()) + speedUnits;
String averageGroundSpeed = units.kilometerPerHourToSpeed(summary.getAverageGroundSpeed()) + speedUnits;
String totalGroundDistance = units.metersToDistance(summary.getTotalGroundDistance()) + distUnits;
String totalVerticalDistance = units.metersToAltitude(summary.getTotalVerticalDistance()) + altUnits;
String maxDistanceFromLaunch = units.metersToDistance(summary.getMaxDistanceFromLaunch()) + distUnits;
String[] labels = new String[] {
getString(R.string.start),
getString(R.string.end),
getString(R.string.duration),
getString(R.string.start_altitude),
getString(R.string.max_altitude_after_launch),
getString(R.string.max_ground_speed),
getString(R.string.average_ground_speed),
getString(R.string.total_ground_distance_traveled),
getString(R.string.total_vertical_distance_traveled),
getString(R.string.max_distance_from_launch)
};
String[] values = new String[] {
startDate,
endDate,
duration,
startAltitude,
maxAltitudeAfterLaunch,
maxGroundSpeed,
averageGroundSpeed,
totalGroundDistance,
totalVerticalDistance,
maxDistanceFromLaunch
};
setListAdapter(new SummaryAdapter(this, labels, values));
}
private class SummaryAdapter extends ArrayAdapter<String> {
private final Activity context;
private final String[] labels;
private final String[] values;
public SummaryAdapter(Activity context, String[] labels, String[] values) {
super(context, R.layout.summary_main, labels);
this.context = context;
this.labels = labels;
this.values = values;
}
private class ViewHolder {
public TextView labelView;
public TextView valueView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.summary_main, null, true);
holder = new ViewHolder();
holder.labelView = (TextView) rowView.findViewById(R.id.dataLabel);
holder.valueView = (TextView) rowView.findViewById(R.id.dataValue);
rowView.setTag(holder);
} else {
holder = (ViewHolder) rowView.getTag();
}
holder.labelView.setText(labels[position] + ":");
holder.valueView.setText(values[position]);
return rowView;
}
}
private static String getFriendlyTimeDifference(Date startTime, Date endTime) {
StringBuffer sb = new StringBuffer();
long diffInSeconds = (endTime.getTime() - startTime.getTime()) / 1000;
long sec = (diffInSeconds >= 60 ? diffInSeconds % 60 : diffInSeconds);
long min = (diffInSeconds = (diffInSeconds / 60)) >= 60 ? diffInSeconds % 60 : diffInSeconds;
long hrs = (diffInSeconds = (diffInSeconds / 60)) >= 24 ? diffInSeconds % 24 : diffInSeconds;
long days = (diffInSeconds = (diffInSeconds / 24)) >= 30 ? diffInSeconds % 30 : diffInSeconds;
long months = (diffInSeconds = (diffInSeconds / 30)) >= 12 ? diffInSeconds % 12 : diffInSeconds;
long years = (diffInSeconds = (diffInSeconds / 12));
if (years > 0) {
if (years == 1) {
sb.append("a year");
} else {
sb.append(years + " years");
}
if (years <= 6 && months > 0) {
if (months == 1) {
sb.append(" and a month");
} else {
sb.append(" and " + months + " months");
}
}
} else if (months > 0) {
if (months == 1) {
sb.append("a month");
} else {
sb.append(months + " months");
}
if (months <= 6 && days > 0) {
if (days == 1) {
sb.append(" and a day");
} else {
sb.append(" and " + days + " days");
}
}
} else if (days > 0) {
if (days == 1) {
sb.append("a day");
} else {
sb.append(days + " days");
}
if (days <= 3 && hrs > 0) {
if (hrs == 1) {
sb.append(" and an hour");
} else {
sb.append(" and " + hrs + " hours");
}
}
} else if (hrs > 0) {
if (hrs == 1) {
sb.append("an hour");
} else {
sb.append(hrs + " hours");
}
if (min > 1) {
sb.append(" and " + min + " minutes");
}
} else if (min > 0) {
if (min == 1) {
sb.append("a minute");
} else {
sb.append(min + " minutes");
}
if (sec > 1) {
sb.append(" and " + sec + " seconds");
}
} else {
if (sec <= 1) {
sb.append("about a second");
} else {
sb.append("about " + sec + " seconds");
}
}
return sb.toString();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.shared_options, menu);
MenuItem menuItem = menu.findItem(R.id.preferences_menu);
menuItem.setIntent(new Intent(this, MyPreferences.class));
menuItem = menu.findItem(R.id.about_menu);
menuItem.setIntent(new Intent(this, AboutActivity.class));
return true;
}
@Override
protected void onResume() {
super.onResume();
Units.instance.setFromPrefs(this);
displayData();
}
}