// MainActivity.java
package com.example.taskmanager;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private EditText taskNameEditText;
private DatePicker dueDatePicker;
private Spinner prioritySpinner;
private Button saveTaskButton;
private ListView tasksListView;
private SQLiteDatabase database;
private ArrayList> tasksList;
private SimpleAdapter adapter;
private static final String DATABASE_NAME = "TaskManager";
private static final String TABLE_TASKS = "tasks";
private static final String COLUMN_ID = "id";
private static final String COLUMN_NAME = "name";
private static final String COLUMN_DATE = "date";
private static final String COLUMN_PRIORITY = "priority";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize UI elements
taskNameEditText = findViewById(R.id.taskNameEditText);
dueDatePicker = findViewById(R.id.dueDatePicker);
prioritySpinner = findViewById(R.id.prioritySpinner);
saveTaskButton = findViewById(R.id.saveTaskButton);
tasksListView = findViewById(R.id.tasksListView);
// Set up priority spinner
ArrayAdapter priorityAdapter = ArrayAdapter.createFromResource(
this, R.array.priority_levels, android.R.layout.simple_spinner_item);
priorityAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
prioritySpinner.setAdapter(priorityAdapter);
// Create or open the database
database = openOrCreateDatabase(DATABASE_NAME, MODE_PRIVATE, null);
// Create the tasks table if it doesn't exist
database.execSQL(
"CREATE TABLE IF NOT EXISTS " + TABLE_TASKS + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_NAME + " TEXT, " +
COLUMN_DATE + " TEXT, " +
COLUMN_PRIORITY + " TEXT)");
// Initialize tasks list and adapter
tasksList = new ArrayList<>();
adapter = new SimpleAdapter(
this,
tasksList,
R.layout.task_item,
new String[]{"name", "date", "priority", "id"},
new int[]{R.id.taskNameTextView, R.id.taskDateTextView, R.id.taskPriorityTextView, R.id.taskIdTextView}
);
tasksListView.setAdapter(adapter);
loadTasks(); // Load existing tasks
// Save task button click listener
saveTaskButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveTask();
}
});
// Set item click listener for editing or deleting tasks
tasksListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
showTaskOptionsDialog(position);
}
});
}
private String getFormattedDate() {
int day = dueDatePicker.getDayOfMonth();
int month = dueDatePicker.getMonth();
int year = dueDatePicker.getYear();
Calendar calendar = Calendar.getInstance();
calendar.set(year, month, day);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
return dateFormat.format(calendar.getTime());
}
private void saveTask() {
String taskName = taskNameEditText.getText().toString().trim();
String dueDate = getFormattedDate();
String priority = prioritySpinner.getSelectedItem().toString();
if (taskName.isEmpty()) {
Toast.makeText(this, "Please enter a task name", Toast.LENGTH_SHORT).show();
return;
}
ContentValues values = new ContentValues();
values.put(COLUMN_NAME, taskName);
values.put(COLUMN_DATE, dueDate);
values.put(COLUMN_PRIORITY, priority);
long result = database.insert(TABLE_TASKS, null, values);
if (result != -1) {
Toast.makeText(this, "Task saved successfully", Toast.LENGTH_SHORT).show();
taskNameEditText.setText("");
loadTasks();
} else {
Toast.makeText(this, "Failed to save task", Toast.LENGTH_SHORT).show();
}
}
private void loadTasks() {
tasksList.clear();
Cursor cursor = database.rawQuery("SELECT * FROM " + TABLE_TASKS, null);
if (cursor.moveToFirst()) {
int idIndex = cursor.getColumnIndex(COLUMN_ID);
int nameIndex = cursor.getColumnIndex(COLUMN_NAME);
int dateIndex = cursor.getColumnIndex(COLUMN_DATE);
int priorityIndex = cursor.getColumnIndex(COLUMN_PRIORITY);
// Only proceed if all column indices are valid
if (idIndex >= 0 && nameIndex >= 0 && dateIndex >= 0 && priorityIndex >= 0) {
do {
int id = cursor.getInt(idIndex);
String name = cursor.getString(nameIndex);
String date = cursor.getString(dateIndex);
String priority = cursor.getString(priorityIndex);
Map task = new HashMap<>();
task.put("id", String.valueOf(id));
task.put("name", name);
task.put("date", "Due: " + date);
task.put("priority", "Priority: " + priority);
tasksList.add(task);
} while (cursor.moveToNext());
} else {
Toast.makeText(this, "Database schema error", Toast.LENGTH_SHORT).show();
}
}
cursor.close();
adapter.notifyDataSetChanged();
}
private void showTaskOptionsDialog(final int position) {
final String taskId = tasksList.get(position).get("id");
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Task Options")
.setItems(new CharSequence[]{"Edit", "Delete"}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == 0) {
// Edit option selected
showEditTaskDialog(Integer.parseInt(taskId));
} else {
// Delete option selected
deleteTask(Integer.parseInt(taskId));
}
}
})
.setNegativeButton("Cancel", null)
.show();
}
private void showEditTaskDialog(final int taskId) {
// Get the task details from database
Cursor cursor = database.rawQuery("SELECT * FROM " + TABLE_TASKS + " WHERE " + COLUMN_ID + " = ?",
new String[]{String.valueOf(taskId)});
if (cursor.moveToFirst()) {
int nameIndex = cursor.getColumnIndex(COLUMN_NAME);
int dateIndex = cursor.getColumnIndex(COLUMN_DATE);
int priorityIndex = cursor.getColumnIndex(COLUMN_PRIORITY);
// Check if all column indices are valid
if (nameIndex >= 0 && dateIndex >= 0 && priorityIndex >= 0) {
String name = cursor.getString(nameIndex);
String date = cursor.getString(dateIndex);
String priority = cursor.getString(priorityIndex);
// Inflate the edit task dialog layout
View dialogView = LayoutInflater.from(this).inflate(R.layout.edit_task_dialog, null);
final EditText editTaskName = dialogView.findViewById(R.id.editTaskNameEditText);
final DatePicker editDueDate = dialogView.findViewById(R.id.editDueDatePicker);
final Spinner editPrioritySpinner = dialogView.findViewById(R.id.editPrioritySpinner);
// Set current values
editTaskName.setText(name);
// Parse the date and set date picker
try {
String[] dateParts = date.split("-");
int year = Integer.parseInt(dateParts[0]);
int month = Integer.parseInt(dateParts[1]) - 1; // DatePicker months are 0-based
int day = Integer.parseInt(dateParts[2]);
editDueDate.updateDate(year, month, day);
} catch (Exception e) {
// Use current date if parsing fails
}
// Set up priority spinner
ArrayAdapter priorityAdapter = ArrayAdapter.createFromResource(
this, R.array.priority_levels, android.R.layout.simple_spinner_item);
priorityAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
editPrioritySpinner.setAdapter(priorityAdapter);
// Set selected priority
for (int i = 0; i < editPrioritySpinner.getCount(); i++) {
if (editPrioritySpinner.getItemAtPosition(i).toString().equals(priority)) {
editPrioritySpinner.setSelection(i);
break;
}
}
// Show dialog
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Edit Task")
.setView(dialogView)
.setPositiveButton("Save", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Get edited values
String updatedName = editTaskName.getText().toString().trim();
// Get formatted date
int day = editDueDate.getDayOfMonth();
int month = editDueDate.getMonth();
int year = editDueDate.getYear();
Calendar calendar = Calendar.getInstance();
calendar.set(year, month, day);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
String updatedDate = dateFormat.format(calendar.getTime());
String updatedPriority = editPrioritySpinner.getSelectedItem().toString();
// Update the task in database
updateTask(taskId, updatedName, updatedDate, updatedPriority);
}
})
.setNegativeButton("Cancel", null)
.show();
} else {
Toast.makeText(this, "Could not load task details", Toast.LENGTH_SHORT).show();
}
}
cursor.close();
}
private void updateTask(int taskId, String name, String date, String priority) {
ContentValues values = new ContentValues();
values.put(COLUMN_NAME, name);
values.put(COLUMN_DATE, date);
values.put(COLUMN_PRIORITY, priority);
int result = database.update(TABLE_TASKS, values, COLUMN_ID + " = ?",
new String[]{String.valueOf(taskId)});
if (result > 0) {
Toast.makeText(this, "Task updated successfully", Toast.LENGTH_SHORT).show();
loadTasks();
} else {
Toast.makeText(this, "Failed to update task", Toast.LENGTH_SHORT).show();
}
}
private void deleteTask(int taskId) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Confirm Delete")
.setMessage("Are you sure you want to delete this task?")
.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int result = database.delete(TABLE_TASKS, COLUMN_ID + " = ?",
new String[]{String.valueOf(taskId)});
if (result > 0) {
Toast.makeText(MainActivity.this, "Task deleted successfully", Toast.LENGTH_SHORT).show();
loadTasks();
} else {
Toast.makeText(MainActivity.this, "Failed to delete task", Toast.LENGTH_SHORT).show();
}
}
})
.setNegativeButton("Cancel", null)
.show();
}
@Override
protected void onDestroy() {
database.close();
super.onDestroy();
}
}
// activity_main.xml
//edit_task_dialog.xml
//task_item.xml
//strings.xml
Task Manager
High
Medium
Low