package com.nbn.android.irace.planner;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.nbn.android.irace.planner.database.PlannerConstants;
import com.nbn.android.irace.planner.database.PlannerDBAdapter;
import com.nbn.android.irace.planner.database.PlannerConstants.Series;
import com.nbn.android.irace.planner.database.bean.DateEventComparator;
import com.nbn.android.irace.planner.database.bean.Event;
import com.nbn.android.irace.planner.database.bean.PlannerNotification;
import com.nbn.android.irace.planner.preference.ListPreferenceSeriesMultiSelect;
import com.nbn.android.irace.planner.receiver.TimeTicked;
import com.nbn.android.irace.planner.util.DatesUtilsPlanner;
import com.nbn.android.irace.planner.util.PlannerNotificationManager;
/**
* List of all the future events for all the preferred series.
* @author Nicolas BIHAN
*
*/
public class ListFutureEventsActivity extends ListActivity {
private static ListView listView;
private FutureEventAdapter adapter;
private static List<PlannerNotification> listEvents;
//Receiver
private TimeTicked timeTicked;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listfutureevents);
listEvents= getFutureEvents(this);
adapter = new FutureEventAdapter(this, R.layout.list_future_events_entries, listEvents);
this.setListAdapter(adapter);
listView = (ListView) findViewById(android.R.id.list);
listView.setAdapter(adapter);
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
final PlannerNotification item = (PlannerNotification) parent.getItemAtPosition(position);
if(! item.isNotified()){
new AlertDialog.Builder(ListFutureEventsActivity.this)
.setIcon(android.R.drawable.ic_dialog_info)
.setTitle("Register ?")
.setMessage("Notify this "+item.getEvent().getName()+" "+getEventName(item.getEvent().getType())+" ?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
PlannerNotificationManager.setNotification(ListFutureEventsActivity.this, item);
item.setNotified(true);
adapter.notifyDataSetChanged();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//do something
}
})
.show();
}
else {
new AlertDialog.Builder(ListFutureEventsActivity.this)
.setIcon(android.R.drawable.ic_dialog_info)
.setTitle("Unregister ?")
.setMessage("Remove notification for this "+item.getEvent().getName()+" "+getEventName(item.getEvent().getType())+" ?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
PlannerNotificationManager.removeNotification(ListFutureEventsActivity.this, item);
item.setNotified(false);
adapter.notifyDataSetChanged();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//do something
}
})
.show();
}
return true;
}
});
}
private static List<PlannerNotification> getFutureEvents(Context context){
List<PlannerNotification> listEvents= new ArrayList<PlannerNotification>();
String prefSeries = PreferenceManager.getDefaultSharedPreferences(context).getString("series_pref", ""); //$NON-NLS-1$ //$NON-NLS-2$
String[] listPreferdSeries = ListPreferenceSeriesMultiSelect.parseStoredValue(prefSeries);
//if no series are set as preferred series
if(listPreferdSeries == null || listPreferdSeries.length<1) {
Toast toast = Toast.makeText(context, "No preferred series in the preferences", Toast.LENGTH_SHORT);
toast.show();
return listEvents;
}
PlannerDBAdapter calendarDBAdapter = new PlannerDBAdapter(context);
String prefNot_freq = PreferenceManager.getDefaultSharedPreferences(context).getString("notify_freq", "5");
String prefNot_before = PreferenceManager.getDefaultSharedPreferences(context).getString("notify_before", "5");
calendarDBAdapter.open();
Cursor seriesCursor = calendarDBAdapter.getAllSeries(new DateTime(DateTimeZone.UTC), listPreferdSeries);
if(seriesCursor != null){
seriesCursor.moveToFirst();
while(! seriesCursor.isAfterLast()){
String startHourMinutes;
String[] seriesDays = new String[7];
String seriesType = seriesCursor.getString(seriesCursor.getColumnIndex(Series.TYPE));
String seriesCode = seriesCursor.getString(seriesCursor.getColumnIndex(Series.CODE));
String seriesName = seriesCursor.getString(seriesCursor.getColumnIndex(Series.NAME));
String seriesClass = seriesCursor.getString(seriesCursor.getColumnIndex(Series.CLASS));
String trackName="";
int freq = seriesCursor.getInt(seriesCursor.getColumnIndex(Series.FREQUENCY));
startHourMinutes = seriesCursor.getString(seriesCursor.getColumnIndex(Series.START_HOUR));
seriesDays[0] = seriesCursor.getString(seriesCursor.getColumnIndex(Series.MONDAY));
seriesDays[1] = seriesCursor.getString(seriesCursor.getColumnIndex(Series.TUESDAY));
seriesDays[2] = seriesCursor.getString(seriesCursor.getColumnIndex(Series.WEDNESDAY));
seriesDays[3] = seriesCursor.getString(seriesCursor.getColumnIndex(Series.THURSDAY));
seriesDays[4] = seriesCursor.getString(seriesCursor.getColumnIndex(Series.FRIDAY));
seriesDays[5] = seriesCursor.getString(seriesCursor.getColumnIndex(Series.SATURDAY));
seriesDays[6] = seriesCursor.getString(seriesCursor.getColumnIndex(Series.SUNDAY));
DateTime dateUTC = new DateTime();
// some days there is no races
dateUTC = DatesUtilsPlanner.nextDayInSchedule(startHourMinutes, dateUTC, seriesDays);
long week = calendarDBAdapter.getCurrentWeek(dateUTC, seriesCode);
if(week == 13) {
return listEvents;
}
PlannerNotification notificationQual = new PlannerNotification();
DateTime dateFirstEventQualy = DatesUtilsPlanner.resetToFirstEvent(startHourMinutes, dateUTC, PlannerConstants.QUALY);
DateTime timeQualy = DatesUtilsPlanner.getNextQualyScheduleTime(dateUTC, dateFirstEventQualy, seriesType, seriesCode);
trackName = getTrackName(calendarDBAdapter, seriesCode, timeQualy);
Event nextQualEvent = new Event();
nextQualEvent.setTrack(trackName);
nextQualEvent.setName(seriesName);
nextQualEvent.setSeriesCode(seriesCode);
nextQualEvent.setType(PlannerConstants.QUALY);
nextQualEvent.setSeriesClass(seriesClass);
notificationQual.setEvent(nextQualEvent);
notificationQual.setNotify_freq(prefNot_freq);
notificationQual.setNotify_before(prefNot_before);
notificationQual.setNextDateEvent(timeQualy);
notificationQual.setNextDateNotification(timeQualy.minusMinutes(Integer.parseInt(prefNot_before)));
//is the event already scheduled ?
if(calendarDBAdapter.getScheduledNotificationId(seriesCode, notificationQual.getNextDateEvent(), notificationQual.getNextDateNotification(), PlannerConstants.QUALY)>0) {
notificationQual.setNotified(true);
} else {
notificationQual.setNotified(false);
}
listEvents.add(notificationQual);
PlannerNotification notificationRace = new PlannerNotification();
DateTime dateFirstEventRace = DatesUtilsPlanner.resetToFirstEvent(startHourMinutes, dateUTC, PlannerConstants.RACE);
DateTime timeRace = DatesUtilsPlanner.getNextRaceScheduleTime(dateUTC, dateFirstEventRace, freq);
trackName = getTrackName(calendarDBAdapter, seriesCode, timeRace);
Event nextRaceEvent = new Event();
nextRaceEvent.setTrack(trackName);
nextRaceEvent.setName(seriesName);
nextRaceEvent.setSeriesCode(seriesCode);
nextRaceEvent.setType(PlannerConstants.RACE);
nextRaceEvent.setSeriesClass(seriesClass);
notificationRace.setEvent(nextRaceEvent);
notificationRace.setNotify_freq(prefNot_freq);
notificationRace.setNotify_before(prefNot_before);
notificationRace.setNextDateEvent(timeRace);
notificationRace.setNextDateNotification(timeRace.minusMinutes(Integer.parseInt(prefNot_before)));
//is the event already scheduled ?
if(calendarDBAdapter.getScheduledNotificationId(seriesCode, notificationRace.getNextDateEvent(), notificationRace.getNextDateNotification(), PlannerConstants.RACE)>0) {
notificationRace.setNotified(true);
} else {
notificationRace.setNotified(false);
}
listEvents.add(notificationRace);
seriesCursor.moveToNext();
}
}
Collections.sort(listEvents, new DateEventComparator());
seriesCursor.close();
calendarDBAdapter.close();
return listEvents;
}
private static String getTrackName(PlannerDBAdapter calendarDBAdapter, String seriesCode, DateTime dateUTC) {
//Get schedule for track
//Query database for the schedule of the series
String trackName = "";
long week = calendarDBAdapter.getCurrentWeek(dateUTC, seriesCode);
Cursor schedule = calendarDBAdapter.getScheduleForSerie(week, seriesCode);
if(schedule.moveToNext()) {
schedule.moveToFirst(); //there is only one
trackName = schedule.getString(2)+ " " +schedule.getString(3); //name + layout
}
schedule.close();
return trackName;
}
/**
*
* @param context
*/
public static void updateListEvents(Context context){
listEvents.clear();
listEvents.addAll(getFutureEvents(context));
Log.w("liste des events", ""+listEvents.size());
((FutureEventAdapter)listView.getAdapter()).notifyDataSetChanged();
}
private class FutureEventAdapter extends ArrayAdapter<PlannerNotification> {
public FutureEventAdapter(Context context, int textViewResourceId, List<PlannerNotification> objects) {
super(context, textViewResourceId, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.list_future_events_entries, null);
}
Object it = getItem(position);
if (it != null) {
PlannerNotification notification = (PlannerNotification)it;
Event evenement = notification.getEvent();
CheckBox box = (CheckBox)v.findViewById(R.id.checkScheduled);
if(notification.isNotified()) {
box.setChecked(true);
}
else {
box.setChecked(false);
}
ImageView iv = (ImageView) v.findViewById(R.id.ImageViewClassFutureEvent);
if (iv != null) {
String classEvent = evenement.getSeriesClass();
if(PlannerConstants.ROOKIE.equalsIgnoreCase(classEvent)) {
iv.setImageResource(R.drawable.class_r_mini);
}
else if(PlannerConstants.CLASS_A.equalsIgnoreCase(classEvent)) {
iv.setImageResource(R.drawable.class_a_mini);
}
else if(PlannerConstants.CLASS_B.equalsIgnoreCase(classEvent)) {
iv.setImageResource(R.drawable.class_b_mini);
}
else if(PlannerConstants.CLASS_C.equalsIgnoreCase(classEvent)) {
iv.setImageResource(R.drawable.class_c_mini);
}
else if(PlannerConstants.CLASS_D.equalsIgnoreCase(classEvent)) {
iv.setImageResource(R.drawable.class_d_mini);
}
else if(PlannerConstants.FUN.equalsIgnoreCase(classEvent)) {
iv.setImageResource(R.drawable.class_r_mini);
}
else if(PlannerConstants.FUNOVAL.equalsIgnoreCase(classEvent)) {
iv.setImageResource(R.drawable.class_r_mini);
}
else {
iv.setImageResource(R.drawable.class_a_mini);
}
}
ImageView ivType = (ImageView) v.findViewById(R.id.ImageViewTypeFutureEvent);
if (ivType != null) {
String typeEvent = evenement.getType();
if(PlannerConstants.RACE.equalsIgnoreCase(typeEvent)) {
ivType.setImageResource(R.drawable.not_race);
}
else {
ivType.setImageResource(R.drawable.not_qualy);
}
}
String name = evenement.getName();
TextView nameView = (TextView) v.findViewById(R.id.name_future_event_entry);
nameView.setText(name);
String nameTrack = evenement.getTrack();
TextView trackView = (TextView) v.findViewById(R.id.track_future_event_entry);
trackView.setText(nameTrack);
DateTime dateTime = notification.getNextDateEvent();
TextView dateView = (TextView) v.findViewById(R.id.date_future_event_entry);
dateView.setText(DatesUtilsPlanner.formatDateTime(dateTime, ListFutureEventsActivity.this));
}
return v;
}
}
@Override
protected void onResume() {
super.onResume();
IntentFilter filter;
filter = new IntentFilter(Intent.ACTION_TIME_TICK);
timeTicked = new TimeTicked();
registerReceiver(timeTicked, filter);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
unregisterReceiver(timeTicked);
}
private String getEventName(String typeEvent) {
String typeEvenement = "Race";
if(PlannerConstants.QUALY.equals(typeEvent))
typeEvenement = "Qualification";
return typeEvenement;
}
}
|