package de.fuberlin.osm2.gui.view.adapter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import de.fuberlin.osm2.R;
import de.fuberlin.osm2.data.DataBaseConnector;
import de.fuberlin.osm2.data.dao.TrackRecord;
import de.fuberlin.osm2.gui.activity.TrackActivity;
import de.fuberlin.osm2.gui.view.adapter.TrackListAdapter2.TrackListItem;
import de.fuberlin.osm2.log.Constants;
/**
* The TrackListAdapter obtains a list of all tracks from the database and
* provides the list for the list view in the StartActivity.
*
* @author johannes & micha
*
*/
public class TrackListAdapter2 extends ArrayAdapter<TrackListItem> {
private static final int TRACK_LIST_LAYOUT = R.layout.track_list_row;
private static final int TRACK_LIST_HEADER_LAYOUT = R.layout.track_list_header;
private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat(
"dd.MM.yy HH:mm:ss");
private final String datePrefix;
private DataBaseConnector dbConnector;
private LayoutInflater mInflater;
private static int nrCounter;
private TrackActivity trackActivity;
/**
* Constructor.
*
* @param context of the caller
*/
public TrackListAdapter2(TrackActivity context) {
super(context, TRACK_LIST_LAYOUT);
Log.d(Constants.TAG, "TrackListAdapter init");
trackActivity = context;
dbConnector = trackActivity.getDataBase();
// Cache the LayoutInflate, dbConnector and datePrefix to avoid asking
// for a new one each time.
mInflater = LayoutInflater.from(context);
datePrefix = context.getString(R.string.track_list__track_date_added);
nrCounter = 1;
addTracks();
}
private void addTracks() {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
long now = cal.getTimeInMillis();
// roll to start of today
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
long startToday = cal.getTimeInMillis();
// roll to yesterday
cal.add(Calendar.DAY_OF_YEAR, -1);
long startYesterday = cal.getTimeInMillis();
// roll two weeks into past
cal.add(Calendar.WEEK_OF_YEAR, -2);
long startTwoWeeksAgo = cal.getTimeInMillis();
// adds today's tracks
addTracksWithHeader(startToday, now - 1, R.string.track_list__today);
// adds yesterday's tracks
addTracksWithHeader(startYesterday, startToday - 1, R.string.track_list__yesterday);
// adds tracks of the last two weeks
addTracksWithHeader(startTwoWeeksAgo, startYesterday - 1,
R.string.track_list__last_two_weeks);
// adds all tracks which are older than two weeks
addTracksWithHeader(0, startTwoWeeksAgo - 1, R.string.track_list__long_time_ago);
}
private void addTracksWithHeader(long dateFrom, long dateTo, int stringRes) {
// DataBaseConnector dbConnector = trackActivity.getDataBase();
Collection<TrackRecord> trackCollection = dbConnector.getAllTracksInTimeWindow(
dateFrom, dateTo);
if (trackCollection.size() > 0) {
Log.d(Constants.TAG, "Collectionsize: " + trackCollection.size());
// add header to the array, the title of the header is in a dummy
// TrackRecorcd object
add(new TrackListItem(new TrackRecord(0L, trackActivity.getString(stringRes), 0L),
-1, true));
for (TrackRecord trR : trackCollection) {
add(new TrackListItem(trR, nrCounter++, false));
}
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolderTrack holderTrack;
ViewHolderHeader holderHeader;
TrackListItem trackListItem;
View convView = convertView;
trackListItem = this.getItem(position);
if (trackListItem.isHeader) {
// if conView is null or of the wrong type we have to inflate a new
// view
if (convView == null || convView.getTag() instanceof ViewHolderTrack) {
convView = mInflater.inflate(TRACK_LIST_HEADER_LAYOUT, null);
holderHeader = new ViewHolderHeader();
holderHeader.headerName = (TextView) convView.findViewById(R.id.label);
convView.setTag(holderHeader);
} else {
holderHeader = (ViewHolderHeader) convView.getTag();
}
holderHeader.headerName.setText(trackListItem.trackRecord.trackName);
return convView;
}
if (convView == null || convView.getTag() instanceof ViewHolderHeader) {
convView = mInflater.inflate(TRACK_LIST_LAYOUT, null);
holderTrack = new ViewHolderTrack();
holderTrack.trackName = (TextView) convView.findViewById(R.id.label);
holderTrack.trackAddedTime = (TextView) convView.findViewById(R.id.sublabel);
convView.setTag(holderTrack);
} else {
holderTrack = (ViewHolderTrack) convView.getTag();
}
holderTrack.trackName.setText(trackListItem.nr + ") "
+ trackListItem.trackRecord.trackName);
holderTrack.trackAddedTime.setText(String.format(datePrefix,
SIMPLE_DATE_FORMAT.format(new Long(trackListItem.trackRecord.dateTrackAdded))));
holderTrack.trackId = trackListItem.trackRecord.trackId;
return convView;
}
/**
* A ViewHolderClass which contains all Views of a list item to avoid
* findViewById() calls.
*
*/
public static class ViewHolderTrack {
/**
* id of the current track.
*/
public long trackId;
/**
* View which shows the name of the current track.
*/
public TextView trackName;
/**
* View which shows the time when the track was created.
*/
public TextView trackAddedTime;
}
/**
* A ViewHolderClass which contains all Views of a list header to avoid
* findViewById() calls.
*
*/
public static class ViewHolderHeader {
/**
* View which shows the name of the current header.
*/
TextView headerName;
}
/**
* contains basic information about a Track.
*
*/
static class TrackListItem {
/**
* the number of the item in the list.
*/
int nr;
/**
* shows whether the item is a header.
*/
boolean isHeader;
/**
* contains id, name and date of a track.
*/
TrackRecord trackRecord;
/**
* Constructor.
*
* @param trackRecord which belongs to the item
* @param nr of the item in the list
* @param isHeader true if the item is a header
*/
TrackListItem(TrackRecord trackRecord, int nr, boolean isHeader) {
this.trackRecord = trackRecord;
this.nr = nr;
this.isHeader = isHeader;
}
@Override
public String toString() {
if (!isHeader)
return trackRecord.trackName;
return "";
}
}
}
|