Purpose: A todo list app that can be used to between a group of people to keep track of chores and assign chores to other group members.
- Category: Productivity / Social Media
- Mobile: This app would be primary developed for mobile but could be used across other platforms.
- Story: Allows users to join a group and create, assign, and keep track of tasks within that group.
- Market: Households, people who live together, or anyone who shares chores with a group.
- Habit: This app should be used daily or weekly in order to be useful so that chores don't get missed.
- Scope: The app is currently going to be built for small groups of household users. At a later time, it could be adapted for larger organizational use.
Required Must-have Stories
- As a user I want to see my list of tasks
- As a user I want to make a task
- As a user I want to add a due date for the tasks
- As a user I want to be able to create an account
- As a user I want to be able sign in and sign out
- As a user I want to see other user's tasks, filter task
- As a user I want to be able to edit a task
- As a user I want to be able to assign a task to a member
- As a user I want to see other members on my task list page
Optional Nice-to-have Stories
- As a user I want to be able to view items offline(optional)
- As a user I want to be able to view items in a calendar.
- As a user I want to be able to add an avatar to my profile image
- As a user I want to get notified of a task that's due
- As a user I want to see other user's tasks, filter task
- As a user I want to be able to edit a task.
- As a user I want to see other members on my task list page
- As a user I want to add a due date for the tasks
- Login / Create Account
- The user is prompted to login or create an account when they first open the app.
- List of Tasks
- A recycler view of the tasks assigned to the current user (or unassigned tasks that user can pick up - maybe?)
- Members Screen
- A recylcler view where the user can see the list of other users in their group
- Individual Members Screen
- A screen that shows another member's profile and tasks that are assigned to them.
- Add New Items
- A form that allows a user to create a new task, assign it to a user and add it to the task list.
Tab Navigation (Tab to Screen)
- List of Tasks
- Add a Task
- Members Screen
Flow Navigation (Screen to Screen)
- Login / Create Account
- Login redirects to create account if the user does not have an account.
- Once the user successfully logs in, they are redirected to List of Tasks screen
- List of Tasks screen
- Will be included on action navbar along with Add a Task and Members screen
- Click on a task to navigate to a more details screen
- Add a Task
- Will be included on action navbar along with List of Tasks and Members screen
- Once a user creates a task and clicks submit navigate to List of Tasks screen
- Members Screen
- Will be included on action navbar along with List of Tasks and Add a Task
- Click on a member to navigate to their profile and view their tasks
User
Property | Type | Description |
---|---|---|
userID | String | unique id for the user (default field) |
name | String | user's prefered name |
String | user's email for login | |
password | String | password for account |
image | File | user's profile image |
Group
Property | Type | Description |
---|---|---|
groupID | String | unique id for the group (default field) |
name | String | name for the group |
GroupsUsers (Many to Many joint table)
Property | Type | Description |
---|---|---|
groupuserID | String | unique id (default field) |
userID | String | unique id for the user |
groupID | String | unique id for the group |
Task
Property | Type | Description |
---|---|---|
taskID | String | unique id for the task (default field) |
name | String | name for the task |
description | String | description of the task |
groupID | String | unique ID for the group the task belongs to |
userID | String | unique ID of the user the task is assigned to |
- READ user
ParseUser.logInInBackground(username, password, new LogInCallback() {
@Override
public void done(ParseUser user, ParseException e) {
if (e != null) {
Log.e(TAG, "Login Error", e);
}
// Successful Login
goMainActivity();
}
});
- CREATE user
// Create the ParseUser
ParseUser user = new ParseUser();
user.setUsername(userName);
user.setPassword(password);
user.signUpInBackground(new SignUpCallback() {
@Override
public void done(ParseException e) {
// Successful signup
if (e == null) {
// Create new group
ParseObject group = new ParseObject("Group");
group.saveInBackground(new SaveCallback <ParseObject>() {
if (e == null) {
// Add name to group
group.put("name", "The Addams Family"); // Group name
// Add groupID and userID to groupUsers table.
ParseObject groupsUsers = new ParseObject("GroupsUsers");
groupsUsers.put("userID", ParseUser.getCurrentUser());
groupsUsers.put("groupID, group.getObjectId());
}
}
// TODO: Action after successful signup
}
// Unsuccessful signup
else {
Log.e(TAG, "Signup error", e);
return;
}
}
});
- UPDATE user
// Update user
ParseUser currentUser = ParseUser.getCurrentUser();
if (currentUser != null) {
// Update profile image
currentUser.put("profileImage", new ParseFile(photoFile));
// Save profile image
currentUser.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
// Profile image change successful
} else {
// Profile image change unsuccessful
}
}
});
}
- CREATE task
// As a sample, but Task can also be a class with setters/getters
ParseObject task = new ParseObject("Task");
task.put("name", "Buy Groceries");
task.put("dueDate", date); // Date object
task.put("description", "Buy milk, eggs, and butter");
task.put("userID", ParseUser.getCurrentUser()); // userID
task.put("groupID", groupID); // create option for user to pick a group function
task.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e != null) {
Log.e(TAG, "Task save error", e);
}
Log.i(TAG, "Saved task successfully");
}
});
}
- READ task
// As a sample with Task as a class
ParseQuery<Task> query = ParseQuery.getQuery(Task.class);
query.include(Task.objectId);
query.include(Task.dueDate);
query.include(Task.description);
query.include(Task.userID);
query.include(Task.groupID);
query.findInBackground(new FindCallback<Task>() {
@Override
public void done(List<Task> tasks, ParseException e) {
if (e != null) {
Log.e(TAG, "Issue with getting tasks", e);
return;
} else {
// Successfully retrieved tasks
// TODO: Action after getting tasks
}
}
});
- READ members
ParseQuery<ParseUser> query = ParseUser.getQuery();
// Find users that equal a particular list / membership
query.whereEqualTo("groupID", 123456);
query.findInBackground(new FindCallback<ParseUser>() {
public void done(List<ParseUser> users, ParseException e) {
if (e == null) {
// Found users that match the groupID
} else {
// Error retrieving users
}
}
});
- READ tasks of selected user
ParseQuery<Task> query = ParseQuery.getQuery(Task.class);
query.include(Task.KEY_NAME);
query.include(Task.KEY_DUEDATE);
query.include(Task.KEY_DESCRIPTION);
query.include(Task.KEY_CREATED_AT);
query.include(Task.KEY_USER, "KC3uBQkWOtKC3uBQkWOt");
query.findInBackground(new FindCallback<Task>() {
@Override
public void done(List<Task> tasks, ParseException e) {
if (e != null) {
Log.e(TAG, "Issue with getting tasks", e);
return;
} else {
// Successfully retrieved tasks
// TODO: Action after getting tasks
}
}
});
- READ members
ParseQuery<ParseUser> query = ParseUser.getQuery();
// Find users that equal a particular list / membership
query.whereEqualTo("groupID", 123456);
query.findInBackground(new FindCallback<ParseUser>() {
public void done(List<ParseUser> users, ParseException e) {
if (e == null) {
// Found users that match the groupID
} else {
// Error retrieving users
}
}
});