Android Open Source - TaskButler Edit Categories 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

/*
 * EditCategoriesActivity.java/*  ww  w. j  av 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.ArrayList;
import java.util.GregorianCalendar;

import yuku.ambilwarna.AmbilWarnaDialog;
import yuku.ambilwarna.AmbilWarnaDialog.OnAmbilWarnaListener;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockListActivity;
import com.actionbarsherlock.view.ActionMode;
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.database.DatabaseHandler;
import edu.worcester.cs499summer2012.database.TasksDataSource;
import edu.worcester.cs499summer2012.service.TaskButlerWidgetProvider;
import edu.worcester.cs499summer2012.task.Category;
import edu.worcester.cs499summer2012.task.Task;
import edu.worcester.cs499summer2012.task.ToastMaker;

public class EditCategoriesActivity extends SherlockListActivity implements ActionMode.Callback, OnClickListener {

  public static final int CREATE_DIALOG = 0;
  public static final int EDIT_DIALOG = 1;
  public static final int DELETE_DIALOG = 2;
  
  private Activity activity;
  private TasksDataSource data_source;
  private static CategoryListAdapter adapter;
  private ActionMode action_mode;
  private Category selected_category;
  private int selected_dialog;
  private EditText et_category_name;
  private String old_name;
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    activity = this;
    
    // Assign the layout to this activity
    setContentView(R.layout.activity_edit_categories);

    // Open the database
    data_source = TasksDataSource.getInstance(this);
    
    // Create an adapter for the category list
    ArrayList<Category> categories = data_source.getCategories();
    categories.remove(0);
    adapter = new CategoryListAdapter(this, R.layout.row_category, categories);
    setListAdapter(adapter);
    
    // Allow Action bar icon to act as a button
        ActionBar action_bar = getSupportActionBar();
        action_bar.setHomeButtonEnabled(true);
        action_bar.setDisplayHomeAsUpEnabled(true);
  }
  
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.activity_edit_categories, menu);
    return true;
  }
  
  @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
      finish();
        return true;
        
    case R.id.menu_add_category:
      selected_dialog = CREATE_DIALOG;
    
      LayoutInflater li = LayoutInflater.from(this);
      View category_name_view = li.inflate(R.layout.dialog_category_name, null);
      et_category_name = (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_name.setBackgroundColor(Color.parseColor("#F0F0F0"));
      }
      
      AlertDialog.Builder builder = new AlertDialog.Builder(this);
      builder.setView(category_name_view);
      builder.setTitle(R.string.dialog_new_category_title);
      builder.setPositiveButton(R.string.menu_next, this);
      builder.setNegativeButton(R.string.menu_cancel, this);
        builder.create().show();
      return true;
        
      default:
        return super.onOptionsItemSelected(item);
      }  
    }
  
  @Override
  public void onListItemClick(ListView list_view, View view, int position, 
      long id) {
    if (action_mode != null)
      return;

    selected_category = adapter.getItem(position);
    action_mode = startActionMode(this);
    view.setSelected(true);
  }

  /**************************************************************************
   * Methods implementing ActionMode.Callback interface                     *
   **************************************************************************/  
  
  @Override
  public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    MenuInflater inflater = mode.getMenuInflater();
    inflater.inflate(R.menu.context_modify_category, menu);
    return true;
  }

  @Override
  public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    // Not used
    return false;
  }

  @Override
  public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_edit_category:
      selected_dialog = EDIT_DIALOG;
      
      LayoutInflater li = LayoutInflater.from(this);
      View category_name_view = li.inflate(R.layout.dialog_category_name, null);
      et_category_name = (EditText) category_name_view.findViewById(R.id.edit_category_name);
      et_category_name.setText(selected_category.getName());
      old_name = selected_category.getName();
      
      AlertDialog.Builder builder = new AlertDialog.Builder(this);
      builder.setView(category_name_view);
      builder.setTitle(R.string.dialog_new_category_title);
      builder.setPositiveButton(R.string.menu_next, this);
      builder.setNegativeButton(R.string.menu_cancel, this);
        builder.create().show();
      mode.finish();
      return true;
      
    case R.id.menu_delete_category:
      selected_dialog = DELETE_DIALOG;
      AlertDialog.Builder builder2 = new AlertDialog.Builder(this);
        builder2.setMessage(R.string.dialog_category_delete);
        builder2.setCancelable(true);
        builder2.setPositiveButton(R.string.menu_delete_task, this);
        builder2.setNegativeButton(R.string.menu_cancel, this);
        builder2.create().show();
        mode.finish();
      return true;
      
    default:
      return false;
    }
  }

  @Override
  public void onDestroyActionMode(ActionMode mode) {
    action_mode = null;
  }
  
  /**************************************************************************
   * Methods implementing DialogInterface.OnClickListener interface         *
   **************************************************************************/

  @Override
  public void onClick(DialogInterface dialog, int which) {
    switch (selected_dialog) {
    case CREATE_DIALOG:
    case EDIT_DIALOG:
      switch (which) {
      case DialogInterface.BUTTON_POSITIVE:
        String name = et_category_name.getText().toString().trim();
        if (name.equals("")) {
          // No name, cancel dialog
          ToastMaker.toast(this, R.string.toast_category_no_name);
          dialog.cancel();
        } else if (data_source.getExistingCategory(name) != null &&
               (selected_dialog == CREATE_DIALOG || (selected_dialog == EDIT_DIALOG && !name.equals(old_name)))) {
          // Category name already exists:
          // If also is create dialog, cancel dialog
          // Or if also is edit dialog and the name is not its own name, cancel dialog
          
          ToastMaker.toast(this, R.string.toast_category_exists);
          dialog.cancel();
        } else {
          int color = selected_dialog == EDIT_DIALOG ? selected_category.getColor() : Color.RED;
          
          AmbilWarnaDialog color_dialog = new AmbilWarnaDialog(this, color, new OnAmbilWarnaListener() {
            
            @Override
            public void onCancel(AmbilWarnaDialog dialog) {
              // Do nothing
            }
  
            @Override
            public void onOk(AmbilWarnaDialog dialog, int color) {
              if (selected_dialog == CREATE_DIALOG) {
                Category new_category = new Category(et_category_name.getText().toString().trim(), 
                    color, 
                    GregorianCalendar.getInstance().getTimeInMillis());
                new_category.setID(data_source.getNextID(DatabaseHandler.TABLE_CATEGORIES));
                data_source.addCategory(new_category);
                adapter.add(new_category);
              } else {
                selected_category.setName(et_category_name.getText().toString().trim());
                selected_category.setColor(color);
                selected_category.setUpdated(GregorianCalendar.getInstance().getTimeInMillis());
                data_source.updateCategory(selected_category);
              }
              adapter.notifyDataSetChanged();
              
              // Update homescreen widget (after change has been saved to DB)
              TaskButlerWidgetProvider.updateWidget(activity);
            }
          });
          color_dialog.show();          
        }
        break;
        
      case DialogInterface.BUTTON_NEGATIVE:
      default:
        dialog.cancel();
        break;
      }
      break;
    
    case DELETE_DIALOG:
      switch (which) {
      case DialogInterface.BUTTON_POSITIVE:
        // Delete the category from the adapter and database
        adapter.remove(selected_category);
        adapter.notifyDataSetChanged();
        data_source.deleteCategory(selected_category);
        
        // Check prefs to see if the deleted category is the displayed 
        // category. If it is, set prefs to "display all categories".
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        if (prefs.getInt(SettingsActivity.DISPLAY_CATEGORY, MainActivity.DISPLAY_ALL_CATEGORIES) == selected_category.getID())
        {
          SharedPreferences.Editor prefs_editor = prefs.edit();
          prefs_editor.putInt(SettingsActivity.DISPLAY_CATEGORY, MainActivity.DISPLAY_ALL_CATEGORIES);
          prefs_editor.commit();
        }
        
        // Update any tasks that had this category
        ArrayList<Task> tasks = data_source.getTasks(true, selected_category);
        for (Task task : tasks) {
          task.setCategory(Category.NO_CATEGORY);
          data_source.updateTask(task);
        }
        
        // Update homescreen widget (after change has been saved to DB)
        TaskButlerWidgetProvider.updateWidget(activity);
        
        ToastMaker.toast(this, R.string.toast_category_deleted);
        
        dialog.dismiss();
        break;
        
      case DialogInterface.BUTTON_NEGATIVE:
      default:
        dialog.cancel();
        break;
      }
      break;
    }
  }
}




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