Android Open Source - TaskButler Base Task Activity






From Project

Back to project page TaskButler.

License

The source code is released under:

GNU General Public License

If you think the Android project TaskButler listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/* 
 * BaseTaskActivity.java//  w  w w. ja v a  2s . c  o  m
 * 
 * Copyright 2012 Jonathan Hasenzahl, James Celona, Dhimitraq Jorgji
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package edu.worcester.cs499summer2012.activity;

import java.util.Calendar;
import java.util.GregorianCalendar;

import yuku.ambilwarna.AmbilWarnaDialog;
import yuku.ambilwarna.AmbilWarnaDialog.OnAmbilWarnaListener;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.TimePicker;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;

import edu.worcester.cs499summer2012.R;
import edu.worcester.cs499summer2012.adapter.CategoryListAdapter;
import edu.worcester.cs499summer2012.adapter.PriorityListAdapter;
import edu.worcester.cs499summer2012.database.DatabaseHandler;
import edu.worcester.cs499summer2012.database.TasksDataSource;
import edu.worcester.cs499summer2012.task.Category;
import edu.worcester.cs499summer2012.task.Task;
import edu.worcester.cs499summer2012.task.ToastMaker;

public abstract class BaseTaskActivity extends SherlockActivity implements 
  OnCheckedChangeListener, OnClickListener, DialogInterface.OnClickListener,
  OnItemSelectedListener, OnDateSetListener, OnTimeSetListener {
  
  /**************************************************************************
   * Static fields and methods                                              *
   **************************************************************************/

  private final static String DEFAULT_INTERVAL = "1";
  private final static String PREVENT_DUE_DATE = "prevent_due_date";
  private final static int NO_DIALOG = 0;
  private final static int CATEGORY_DIALOG = 1;
    
    /**************************************************************************
     * Private fields                                                         *
     **************************************************************************/
  
  // Intent to be returned
    protected Intent intent;
    
    // Database
    protected TasksDataSource data_source;
    
    // Prefs
    protected SharedPreferences prefs;
    
    // Category spinner array adapter
    protected CategoryListAdapter category_adapter;
    
    // Priority spinner array adapter
    protected PriorityListAdapter priority_adapter;
    
    // UI elements
    protected EditText et_name;
    protected EditText et_notes;
    protected CheckBox cb_due_date;
    protected TextView tv_due_date;
    protected TextView tv_due_time;
    protected CheckBox cb_final_due_date;
    protected CheckBox cb_repeating;   
    protected EditText et_repeat_interval;
    protected Spinner s_category;
    protected Spinner s_priority;
    protected Spinner s_repeat_type;
    protected DatePickerDialog date_dialog;
    protected TimePickerDialog time_dialog;
    protected AlertDialog category_dialog;
    AmbilWarnaDialog color_dialog;
    protected EditText et_category;
    protected TextView tv_at;
    
    // Task properties that are modified by UI elements
    protected Calendar due_date_cal;
    protected int selected_dialog;
    protected Category default_category;
    
    // Flag to prevent date picker dialog popping up immediately on    
    // entering EditTaskActivity
    protected boolean prevent_initial_due_date_popup = false;
    
    // Flag to kill new category dialog if screen is rotated
    protected boolean new_category_dialog_active = false;
    
    
    protected String repeat_interval_string = DEFAULT_INTERVAL;
    
    /**************************************************************************
   * Class methods                                                          *
   **************************************************************************/
    
    protected abstract boolean addTask();
    
  /**************************************************************************
   * Overridden parent methods                                              *
   **************************************************************************/
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_task);
        
        data_source = TasksDataSource.getInstance(this);
        prefs = PreferenceManager.getDefaultSharedPreferences(this);
        
        // Initialize calendar
    String hour = prefs.getString(SettingsActivity.DEFAULT_HOUR, SettingsActivity.DEFAULT_HOUR_VALUE);
        due_date_cal = GregorianCalendar.getInstance();
        due_date_cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(hour));
        due_date_cal.set(Calendar.MINUTE, 0);
        due_date_cal.set(Calendar.SECOND, 0);
        due_date_cal.set(Calendar.MILLISECOND, 0);
        if (due_date_cal.getTimeInMillis() < System.currentTimeMillis())
          due_date_cal.add(Calendar.DAY_OF_YEAR, 1);
        
        // Initialize the fields that can be enabled/disabled or listened to
        et_name = (EditText) findViewById(R.id.edit_add_task_name);
        et_notes = (EditText) findViewById(R.id.edit_add_task_notes);
        cb_due_date = (CheckBox) findViewById(R.id.checkbox_has_due_date);
        tv_due_date = (TextView) findViewById(R.id.text_add_task_due_date);
        tv_due_time = (TextView) findViewById(R.id.text_add_task_due_time);
        cb_final_due_date = (CheckBox) findViewById(R.id.checkbox_has_final_due_date);
        cb_repeating = (CheckBox) findViewById(R.id.checkbox_has_repetition);   
        et_repeat_interval = (EditText) findViewById(R.id.edit_add_task_repeat_interval);
        s_category = (Spinner) findViewById(R.id.spinner_add_task_category);
        s_priority = (Spinner) findViewById(R.id.spinner_add_task_priority);
        s_repeat_type = (Spinner) findViewById(R.id.spinner_add_task_repeat_type);
        tv_at = (TextView) findViewById(R.id.text_at);
        
        // Fix white line bug in Gingerbread
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.GINGERBREAD ||
        Build.VERSION.SDK_INT == Build.VERSION_CODES.GINGERBREAD_MR1) {
      et_name.setBackgroundColor(Color.parseColor("#F0F0F0"));
      et_notes.setBackgroundColor(Color.parseColor("#F0F0F0"));
      et_repeat_interval.setBackgroundColor(Color.parseColor("#F0F0F0"));
    }        
                
        // Set listeners
        cb_due_date.setOnCheckedChangeListener(this);
        cb_repeating.setOnCheckedChangeListener(this);
        tv_due_date.setOnClickListener(this);
        tv_due_time.setOnClickListener(this);
        
        // Allow Action bar icon to act as a button
        ActionBar action_bar = getSupportActionBar();
        action_bar.setHomeButtonEnabled(true);
        action_bar.setDisplayHomeAsUpEnabled(true);
        
        // Populate the category spinner
        category_adapter = new CategoryListAdapter(this, R.layout.row_category_small, data_source.getCategories());
        category_adapter.add(new Category(0, "New category...", Color.TRANSPARENT, Category.NEW_CATEGORY));
        s_category.setAdapter(category_adapter);
        s_category.setOnItemSelectedListener(this);
        
        // Populate the priority spinner
        priority_adapter = new PriorityListAdapter(this, R.layout.row_priority_small, Task.PRIORITY_LABELS);
        priority_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        s_priority.setAdapter(priority_adapter);
        
        // Populate the repeat type spinner
        ArrayAdapter<CharSequence> repeat_type_adapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, Task.REPEAT_LABELS);
        repeat_type_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        s_repeat_type.setAdapter(repeat_type_adapter);
        
        // Hide certain due date items to start
        tv_due_date.setVisibility(View.INVISIBLE);
        tv_due_time.setVisibility(View.INVISIBLE);
        cb_final_due_date.setVisibility(View.INVISIBLE);
        cb_repeating.setVisibility(View.INVISIBLE);
        et_repeat_interval.setVisibility(View.INVISIBLE);
        s_repeat_type.setVisibility(View.INVISIBLE);
        tv_at.setVisibility(View.INVISIBLE);
        
        // Check bundle for prevent popup flag
        if (savedInstanceState != null)
          prevent_initial_due_date_popup = savedInstanceState.getBoolean(PREVENT_DUE_DATE);
        
        
    }
    
    @Override
    protected void onSaveInstanceState(Bundle outState) {
      outState.putBoolean(PREVENT_DUE_DATE, cb_due_date.isChecked() ? true : false);
      
      if (new_category_dialog_active) {
        new_category_dialog_active = false;
        selected_dialog = NO_DIALOG;
        s_category.setSelection(category_adapter.getPosition(default_category));
      }
      
      super.onSaveInstanceState(outState);
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
      MenuInflater inflater = getSupportMenuInflater();
      inflater.inflate(R.menu.activity_add_task, menu);
      
      return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
      switch (item.getItemId()) {
      case android.R.id.home:
      case R.id.menu_add_task_cancel:
        setResult(RESULT_CANCELED);
        finish();
        return true;
      
      case R.id.menu_add_task_confirm:
        if (addTask()) {
            // Set the return result to OK and finish the activity
            setResult(RESULT_OK, intent);
            finish();
        }
        return true;
        
      case R.id.menu_add_task_help:
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(R.string.dialog_procrastinator_title);
        builder.setIcon(R.drawable.ic_help);
        builder.setMessage(R.string.dialog_procrastinator_help);
        builder.setCancelable(true);
        builder.setPositiveButton(R.string.menu_ok, new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int id) {
          dialog.dismiss();
        }
        
      });
        builder.create().show();
        return true;
        
      default:
        return super.onOptionsItemSelected(item);
      }
    }

  /**************************************************************************
   * Methods implementing OnCheckedChangedListener interface                *
   **************************************************************************/

  @Override
  public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    switch (buttonView.getId()) {
    case R.id.checkbox_has_due_date:
      if (isChecked) {
        // Make edit button, textview, and other checkboxes visible
        tv_due_date.setVisibility(View.VISIBLE);
        tv_at.setVisibility(View.VISIBLE);
        tv_due_time.setVisibility(View.VISIBLE);
        tv_due_date.setText(DateFormat.format("MM/dd/yy", due_date_cal));
        tv_due_time.setText(DateFormat.format("h:mm AA", due_date_cal));
        cb_final_due_date.setVisibility(View.VISIBLE);
        cb_repeating.setVisibility(View.VISIBLE);
        
        // Pop up date-time dialog as if user had clicked edit button
        if (prevent_initial_due_date_popup)
          prevent_initial_due_date_popup = false;
        else
          onClick(tv_due_date);
      } else {
        // Hide edit button, textview, and other checkboxes
        tv_due_date.setVisibility(View.INVISIBLE);
        tv_at.setVisibility(View.INVISIBLE);
        tv_due_time.setVisibility(View.INVISIBLE);
        cb_final_due_date.setVisibility(View.INVISIBLE);
        cb_repeating.setVisibility(View.INVISIBLE);
        
        // Uncheck final due date and repetition boxes
        if (cb_final_due_date.isChecked())
          cb_final_due_date.setChecked(false);
        if (cb_repeating.isChecked())
          cb_repeating.setChecked(false);
      }
      break;
      
    case R.id.checkbox_has_repetition:
      if (isChecked) {
        // Make textview, edittext, spinner, and checkbox visible
        et_repeat_interval.setVisibility(View.VISIBLE);
        et_repeat_interval.setText(repeat_interval_string);
        s_repeat_type.setVisibility(View.VISIBLE);
      } else {
        // Hide edittext, spinner
        et_repeat_interval.setVisibility(View.INVISIBLE);
        s_repeat_type.setVisibility(View.INVISIBLE);
      }
      break;
    }
  }

  /**************************************************************************
   * Methods implementing OnClickListener interface                         *
   **************************************************************************/
  
  @SuppressLint("NewApi")
  @Override
  public void onClick(View v) {  
        switch (v.getId()) {
        case R.id.text_add_task_due_date:
          // Initialize picker dialog
        date_dialog = new DatePickerDialog(this, this, 
            due_date_cal.get(Calendar.YEAR), 
            due_date_cal.get(Calendar.MONTH), 
            due_date_cal.get(Calendar.DAY_OF_MONTH)) {
          
          @Override
          public Bundle onSaveInstanceState() {
            if (date_dialog.isShowing())
              date_dialog.cancel();
            return super.onSaveInstanceState();
          }
          
        };
        
        // Show calendar view (only available for API 11+)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
          DatePicker date_picker = date_dialog.getDatePicker();
          date_picker.setCalendarViewShown(true);
          date_picker.setSpinnersShown(false);
        }
        
        date_dialog.show();
          break;
          
        case R.id.text_add_task_due_time:
          // Initialize picker dialog
        time_dialog = new TimePickerDialog(this, this, 
            due_date_cal.get(Calendar.HOUR_OF_DAY), 
            due_date_cal.get(Calendar.MINUTE), false) {
          
          @Override
          public Bundle onSaveInstanceState() {
            if (time_dialog.isShowing())
              time_dialog.cancel();
            return super.onSaveInstanceState();
          }
          
        };
        
        time_dialog.show();
          break;
        }
  }

  /**************************************************************************
   * Methods implementing DialogInterface.OnClickListener interface         *
   **************************************************************************/
  
  @Override
  public void onClick(DialogInterface dialog, int id) {
    if (selected_dialog == CATEGORY_DIALOG) {
      selected_dialog = NO_DIALOG;
      if (id == DialogInterface.BUTTON_POSITIVE) {
        String name = et_category.getText().toString().trim();
        if (name.equals("")) {
          // No name, cancel dialog
          ToastMaker.toast(this, R.string.toast_category_no_name);
          s_category.setSelection(category_adapter.getPosition(default_category));
          new_category_dialog_active = false;
          dialog.cancel();
          return;
        } 
        
        Category existing_category = data_source.getExistingCategory(name);
        
        if (existing_category != null) {
          // Category name already exists, cancel dialog
          ToastMaker.toast(this, R.string.toast_category_exists);
          s_category.setSelection(category_adapter.getPosition(existing_category));
          new_category_dialog_active = false;
          dialog.cancel();
        } else  {
           color_dialog = new AmbilWarnaDialog(this, Color.RED, new OnAmbilWarnaListener() {
  
            @Override
            public void onCancel(AmbilWarnaDialog dialog) {
              s_category.setSelection(category_adapter.getPosition(default_category));
              new_category_dialog_active = false;
            }
  
            @Override
            public void onOk(AmbilWarnaDialog dialog, int color) {
              Category new_category = new Category(et_category.getText().toString().trim(), 
                  color, 
                  GregorianCalendar.getInstance().getTimeInMillis());
              new_category.setID(data_source.getNextID(DatabaseHandler.TABLE_CATEGORIES));
              data_source.addCategory(new_category);
              category_adapter.insert(new_category, category_adapter.getCount() - 1);
              category_adapter.notifyDataSetChanged();
              new_category_dialog_active = false;
            }
          });
          color_dialog.show();
        }
      } else {
        s_category.setSelection(0);
        dialog.cancel();
      }
    }
  }
  
  /**************************************************************************
   * Methods implementing OnItemSelectedListener interface                  *
   **************************************************************************/

  @Override
  public void onItemSelected(AdapterView<?> parent, View view, int position,
      long id) {
    if (((Category) s_category.getItemAtPosition(position)).getID() == Category.NEW_CATEGORY) {
      selected_dialog = CATEGORY_DIALOG;
      
      LayoutInflater li = LayoutInflater.from(this);
      View category_name_view = li.inflate(R.layout.dialog_category_name, null);
      et_category = (EditText) category_name_view.findViewById(R.id.edit_category_name);
      
      // Fix white line bug in Gingerbread
      if (Build.VERSION.SDK_INT == Build.VERSION_CODES.GINGERBREAD ||
          Build.VERSION.SDK_INT == Build.VERSION_CODES.GINGERBREAD_MR1) {
        et_category.setBackgroundColor(Color.parseColor("#F0F0F0"));
      }
      
      AlertDialog.Builder new_category_builder = new AlertDialog.Builder(this);
      new_category_builder.setView(category_name_view);
      new_category_builder.setTitle(R.string.dialog_new_category_title);
      new_category_builder.setPositiveButton(R.string.menu_next, this);
      new_category_builder.setNegativeButton(R.string.menu_cancel, this);
      category_dialog = new_category_builder.create();
      new_category_dialog_active = true;
      category_dialog.show();
    }
  }

  @Override
  public void onNothingSelected(AdapterView<?> parent) {
    // Do nothing
  }
  
  /**************************************************************************
   * Methods implementing OnDateSetListener interface                       *
   **************************************************************************/
  
  @Override
  public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
    due_date_cal.set(year, monthOfYear, dayOfMonth);
    tv_due_date.setText(DateFormat.format("MM/dd/yy", due_date_cal));
  }
  
  /**************************************************************************
   * Methods implementing OnTimeSetListener interface                       *
   **************************************************************************/
  
  @Override
  public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
    due_date_cal.set(Calendar.HOUR_OF_DAY, hourOfDay);
    due_date_cal.set(Calendar.MINUTE, minute);
    tv_due_time.setText(DateFormat.format("h:mm AA", due_date_cal));
  }
}




Java Source Code List

edu.worcester.cs499summer2012.activity.AddTaskActivity.java
edu.worcester.cs499summer2012.activity.BaseTaskActivity.java
edu.worcester.cs499summer2012.activity.CustomSortActivity.java
edu.worcester.cs499summer2012.activity.EditCategoriesActivity.java
edu.worcester.cs499summer2012.activity.EditTaskActivity.java
edu.worcester.cs499summer2012.activity.MainActivity.java
edu.worcester.cs499summer2012.activity.SettingsActivity.java
edu.worcester.cs499summer2012.activity.ViewTaskActivity.java
edu.worcester.cs499summer2012.adapter.CategoryListAdapter.java
edu.worcester.cs499summer2012.adapter.ComparatorListAdapter.java
edu.worcester.cs499summer2012.adapter.PriorityListAdapter.java
edu.worcester.cs499summer2012.adapter.TaskListAdapter.java
edu.worcester.cs499summer2012.comparator.TaskAutoComparator.java
edu.worcester.cs499summer2012.comparator.TaskCategoryComparator.java
edu.worcester.cs499summer2012.comparator.TaskCompletionComparator.java
edu.worcester.cs499summer2012.comparator.TaskDateCreatedComparator.java
edu.worcester.cs499summer2012.comparator.TaskDateDueComparator.java
edu.worcester.cs499summer2012.comparator.TaskDateModifiedComparator.java
edu.worcester.cs499summer2012.comparator.TaskNameComparator.java
edu.worcester.cs499summer2012.comparator.TaskPriorityComparator.java
edu.worcester.cs499summer2012.database.DatabaseHandler.java
edu.worcester.cs499summer2012.database.TasksDataSource.java
edu.worcester.cs499summer2012.service.NotificationHelper.java
edu.worcester.cs499summer2012.service.OnAlarmReceiver.java
edu.worcester.cs499summer2012.service.OnBootReceiver.java
edu.worcester.cs499summer2012.service.TaskAlarm.java
edu.worcester.cs499summer2012.service.TaskButlerService.java
edu.worcester.cs499summer2012.service.TaskButlerWidgetProvider.java
edu.worcester.cs499summer2012.service.WakefulIntentService.java
edu.worcester.cs499summer2012.task.BackupManager.java
edu.worcester.cs499summer2012.task.Category.java
edu.worcester.cs499summer2012.task.Comparator.java
edu.worcester.cs499summer2012.task.Task.java
edu.worcester.cs499summer2012.task.ToastMaker.java