/todoApp

A todo app for Code Path's group project

Primary LanguageJava

Chore Wheel

Table of Contents

  1. Overview
  2. Product Spec
  3. Wireframes
  4. Schema

Overview

Description

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.

App Evaluation

  • 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.

Product Spec

1. User Stories (Required and Optional)

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

SPRINT 3 GIFS

  • 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.

SPRINT 2 GIFS

  • 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

SPRINT 1 GIFS

2. Screen Archetypes

  • 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.

3. Navigation

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

Wireframes

Note: we used a digital media to sketch the wireframes

[BONUS] Digital Wireframes & Mockups

[BONUS] Interactive Prototype

Schema

Models

User

Property Type Description
userID String unique id for the user (default field)
name String user's prefered name
email 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

Networking

Login Page:

  • 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 an Account Page

  • 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;
        }
    }
});

Edit Profile Page

  • 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
	}
      }
    });
}  

Task Page

  • 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
	    }
        }
});

Member List:

  • 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
      }
    }
});