ListFutureEventsActivity.java :  » App » iraceplanner » com » nbn » android » irace » planner » Android Open Source

Android Open Source » App » iraceplanner 
iraceplanner » com » nbn » android » irace » planner » ListFutureEventsActivity.java
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;
  }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.